# HG changeset patch # User Florian Pose # Date 1250840789 -7200 # Node ID 4844a843391551c0da3c045d2ae6417e31af2545 # Parent bd150d066ea21ab771be2c8c76983d283a7cc46d# Parent b1d1317f1c7ad0c0403eaa415b251f28230c984e Merge diff -r b1d1317f1c7a -r 4844a8433915 NEWS --- a/NEWS Thu Aug 20 17:41:45 2009 +0200 +++ b/NEWS Fri Aug 21 09:46:29 2009 +0200 @@ -45,6 +45,8 @@ methods to let an application transfer SDOs before activating the master (thanks to Stefan Weiser). * Fixed SDO upload segment response (thanks to Christoph Peter). +* Fixed SDO upload segment response for 10 bytes mailbox length (thanks to + Joerg Mohre). * SDO entry access rights are shown in 'ethercat sdos'. * Added 64-bit data access macros to application header. * Added debug level for all masters as a module parameter. Thanks to Erwin diff -r b1d1317f1c7a -r 4844a8433915 master/fsm_coe.c --- a/master/fsm_coe.c Thu Aug 20 17:41:45 2009 +0200 +++ b/master/fsm_coe.c Fri Aug 21 09:46:29 2009 +0200 @@ -1821,7 +1821,6 @@ uint8_t *data, mbox_prot; size_t rec_size, data_size; ec_sdo_request_t *request = fsm->request; - uint32_t seg_size; unsigned int last_segment; if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) @@ -1899,14 +1898,11 @@ return; } - last_segment = EC_READ_U8(data + 2) & 0x01; - seg_size = (EC_READ_U8(data + 2) & 0xE) >> 1; - if (rec_size > 10) { - data_size = rec_size - 3; /* Header of segment upload is smaller than - normal upload */ - } else { // == 10 - /* seg_size contains the number of trailing bytes to ignore. */ - data_size = rec_size - seg_size; + data_size = rec_size - 3; /* Header of segment upload is smaller than + normal upload */ + if (rec_size == 10) { + uint8_t seg_size = (EC_READ_U8(data + 2) & 0xE) >> 1; + data_size -= seg_size; } if (request->data_size + data_size > fsm->complete_size) { @@ -1920,6 +1916,7 @@ memcpy(request->data + request->data_size, data + 3, data_size); request->data_size += data_size; + last_segment = EC_READ_U8(data + 2) & 0x01; if (!last_segment) { fsm->toggle = !fsm->toggle; ec_fsm_coe_up_prepare_segment_request(fsm);