<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<p>Hi,</p>
<p><br>
</p>
<p>I recently upgraded ethercat master to Gavin Patchset 20160804, adding to that, patch 0061.</p>
<p><br>
</p>
<p>EoE seems to be working fine while the master is idle, with heavy SDO traffic in parallel.</p>
<p><br>
</p>
<p></p>
<p style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
<span style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">When the master is active</span> our realtime application invokes  ecrt_master_receive(master);
  and  ecrt_master_send(master);  from interrupt context, and NOT from </p>
<p style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
ec_master_operation_thread() thread context.<br>
</p>
<div><br>
</div>
<p></p>
<p>The problem comes up when the master is active.</p>
<p><br>
</p>
<p>Just as I issue</p>
<p><br>
</p>
<p>ifconfig eoe0a1 up</p>
<p><br>
</p>
<p>I get a bunch of UNMATCHED DATAGRAMS in the kernel log, and the <span style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">master
 is released.</span></p>
<p><br>
</p>
<p></p>
<div></div>
<div>[   73.324525] EtherCAT DEBUG 0: UNMATCHED datagram:</div>
<div>[   73.324528] EtherCAT DEBUG: 0D 83 01 00 10 09 08 80 00 00 68 5A 4A 84 9C 9B </div>
<div>[   73.324539] EtherCAT DEBUG: 84 11 01 00 </div>
<div>[   73.324544] EtherCAT DEBUG 0: UNMATCHED datagram:</div>
<div>[   73.324547] EtherCAT DEBUG: 04 84 01 00 90 09 08 80 00 00 B0 3D 4C 84 9C 9B </div>
<div>[   73.324557] EtherCAT DEBUG: 84 11 01 00 </div>
<div>[   73.324562] EtherCAT DEBUG 0: UNMATCHED datagram:</div>
<div>[   73.324565] EtherCAT DEBUG: 0C 85 00 00 00 00 10 80 00 00 00 00 70 FF FF FF </div>
<div>[   73.324575] EtherCAT DEBUG: 50 52 70 FF FF FF 00 00 31 00 03 00 </div>
<div>[   73.324584] EtherCAT DEBUG 0: UNMATCHED datagram:</div>
<div>[   73.324587] EtherCAT DEBUG: 07 86 01 00 30 01 02 00 00 00 08 00 01 00 </div>
<div>[   73.324838] EtherCAT 0: fsm->slaves_responding[fsm->dev_idx]=1</div>
<div>[   73.324843] EtherCAT 0: 0 slave(s) responding on main device.</div>
<div>[   73.324846] EtherCAT 0: datagram->working_counter=0     <-------------------------  In wireshark capture WC is 1 !!!!</div>
<div>[   73.324850] EtherCAT 0: datagram->state=4</div>
<div>[   73.324853] EtherCAT 0: datagram->device_index=0</div>
<div>[   73.324856] EtherCAT 0: datagram->device_origin=0</div>
<div>[   73.324860] EtherCAT 0: datagram->index=134</div>
<div>[   73.324863] EtherCAT 0: datagram->type=7</div>
<div>[   73.324866] EtherCAT DEBUG 0: Rescanning the bus</div>
<div><br>
</div>
<div><br>
</div>
<p></p>
<p><span style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">This happens due to a timeout. When the EoE thread invokes</span><br>
</p>
<p><span style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><br>
</span></p>
<p><span style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><span>master->receive_cb(master->cb_data); which leads to invoke of <span>ecrt_master_receive(master);
 it somehow messes up </span></span><br>
</span></p>
<p><span style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><span><span><br>
</span></span></span></p>
<p>master->devices[EC_DEVICE_MAIN].cycles_poll<br>
</p>
<p><br>
</p>
<p>which leads to a negative time delta in the calculation <span>master->devices[EC_DEVICE_MAIN].cycles_poll - datagram->cycles_sent.</span><br>
</p>
<p><span><br>
</span></p>
<p><span>Attempting to bypass that i</span><span style="font-size: 12pt;">n the EoE thread, </span><span style="font-size: 12pt;">I commented out  </span><span style="font-size: 12pt;">master->receive_cb(master->cb_data);  and  master->send_cb(master->cb_data);</span></p>
<p><span></span></p>
<p><span><span>and once I invoke</span></span></p>
<p><span><span>ifconfig eoe0a1 up</span></span></p>
<p><span><span><br>
</span></span></p>
<p><span><span>I get an explosion of</span></span></p>
<p><span><span><br>
</span></span></p>
<p><span><span></p>
<div>[  123.529911] EtherCAT WARNING 0-main-0: Failed to receive mbox check datagram for eoe0a1.</div>
<div>[  123.529918] EtherCAT WARNING 0-main-0: Failed to receive mbox check datagram for eoe0a1.</div>
<div>[  123.529925] EtherCAT WARNING 0-main-0: Failed to receive mbox check datagram for eoe0a1.</div>
<div>[  123.529932] EtherCAT WARNING 0-main-0: Failed to receive mbox check datagram for eoe0a1.</div>
<br>
</span></span>
<p></p>
<p><span><span><br>
</span></span></p>
<p><span><span>If I comment out only <span>master->receive_cb(master->cb_data);</span></span></span></p>
<p><span><span><span><br>
</span></span></span></p>
<p><span><span>I get no errors in dmesg, but then of course, EoE is not functional, and EoE thread starts gathering more and more CPU usage.</span></span></p>
<p><span><span><br>
</span></span></p>
<p><span><span>I understand that an invoke of <span>master->send_cb(master->cb_data); leads to </span></span></span></p>
<p><span><span><span>ec_master_internal_send_cb     -->     <span>ecrt_master_send_ext(master);  </span></span><br>
</span></span></p>
<p><span><span><span><span><br>
</span></span></span></span></p>
<p><span><span><span><span>which pulls datagrams from <span>master->ext_datagram_queue and pushes them forward with <span>ec_master_queue_datagram(), and then</span></span></span></span></span></span></p>
<p><span><span><span><span><span><span>invokes <span>ecrt_master_send(master); which will lead to a collision with <span>ecrt_master_send() in the interrupt context.</span></span></span></span></span></span></span></span></p>
<p><span><span><span><span><span><span><span><br>
</span></span></span></span></span></span></span></p>
<p><span><span><span><span><span><span><span>So instead of invoking <span>master->send_cb(master->cb_data); i tried only to pass datagrams <span>from master->ext_datagram_queue,</span></span></span></span></span></span></span></span></span></p>
<p><span><span><span><span><span><span><span><span><span>but it caused a kernel panic.</span></span></span></span></span></span></span></span></span></p>
<p><span><span><span><span><span><span><span><span><span><br>
</span></span></span></span></span></span></span></span></span></p>
<p><span><span><span><span><span><span><span><span><span><br>
</span></span></span></span></span></span></span></span></span></p>
<p><span><span><span><span><span><span><span><span><span>So, if I want EoE to work when the master is active, how should I pass datagrams from EoE thread to the master?</span></span></span></span></span></span></span></span></span></p>
<p><span><span><span><span><span><span><span><span><span>Should I change the ethernet.c state machine?</span></span></span></span></span></span></span></span></span></p>
<p><span><span><span><span><span><span><span><span><span><br>
</span></span></span></span></span></span></span></span></span></p>
<p>Thanks a lot,</p>
<p><br>
</p>
<p>Nir.</p>
<p><br>
</p>
</div>
</body>
</html>