330 { |
330 { |
331 ec_mailbox_t *mbox = fsm->mbox; |
331 ec_mailbox_t *mbox = fsm->mbox; |
332 ec_datagram_t *datagram = mbox->datagram; |
332 ec_datagram_t *datagram = mbox->datagram; |
333 ec_slave_t *slave = fsm->slave; |
333 ec_slave_t *slave = fsm->slave; |
334 |
334 |
335 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
335 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
336 && fsm->retries--) { |
336 return; // FIXME: request again? |
337 return; // FIXME: request again? |
337 |
338 } |
338 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
339 |
|
340 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
339 fsm->state = ec_fsm_coe_error; |
341 fsm->state = ec_fsm_coe_error; |
340 EC_SLAVE_ERR(slave, "Failed to receive CoE dictionary" |
342 EC_SLAVE_ERR(slave, "Failed to receive CoE dictionary" |
341 " request datagram: "); |
343 " request datagram: "); |
342 ec_datagram_print_state(datagram); |
344 ec_datagram_print_state(datagram); |
343 return; |
345 return; |
344 } |
346 } |
345 |
347 |
346 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
348 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
347 fsm->state = ec_fsm_coe_error; |
349 fsm->state = ec_fsm_coe_error; |
348 EC_SLAVE_ERR(slave, "Reception of CoE dictionary request failed: "); |
350 EC_SLAVE_ERR(slave, "Reception of CoE dictionary request failed: "); |
349 ec_datagram_print_wc_error(datagram); |
351 ec_datagram_print_wc_error(datagram); |
350 return; |
352 return; |
351 } |
353 } |
367 { |
369 { |
368 ec_mailbox_t *mbox = fsm->mbox; |
370 ec_mailbox_t *mbox = fsm->mbox; |
369 ec_datagram_t *datagram = mbox->datagram; |
371 ec_datagram_t *datagram = mbox->datagram; |
370 ec_slave_t *slave = fsm->slave; |
372 ec_slave_t *slave = fsm->slave; |
371 |
373 |
372 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
374 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
373 return; |
375 && fsm->retries--) { |
374 |
376 return; |
375 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
377 } |
|
378 |
|
379 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
376 fsm->state = ec_fsm_coe_error; |
380 fsm->state = ec_fsm_coe_error; |
377 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
381 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
378 ec_datagram_print_state(datagram); |
382 ec_datagram_print_state(datagram); |
379 return; |
383 return; |
380 } |
384 } |
381 |
385 |
382 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
386 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
383 fsm->state = ec_fsm_coe_error; |
387 fsm->state = ec_fsm_coe_error; |
384 EC_SLAVE_ERR(slave,"Reception of CoE mailbox check" |
388 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
385 " datagram failed: "); |
389 " datagram failed: "); |
386 ec_datagram_print_wc_error(datagram); |
390 ec_datagram_print_wc_error(datagram); |
387 return; |
391 return; |
388 } |
392 } |
389 |
393 |
426 uint16_t sdo_index, fragments_left; |
430 uint16_t sdo_index, fragments_left; |
427 ec_sdo_t *sdo; |
431 ec_sdo_t *sdo; |
428 bool first_segment; |
432 bool first_segment; |
429 size_t index_list_offset; |
433 size_t index_list_offset; |
430 |
434 |
431 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
435 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
436 && fsm->retries--) { |
432 return; // FIXME: request again? |
437 return; // FIXME: request again? |
433 |
438 } |
434 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
439 |
|
440 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
435 fsm->state = ec_fsm_coe_error; |
441 fsm->state = ec_fsm_coe_error; |
436 EC_SLAVE_ERR(slave, "Failed to receive CoE dictionary" |
442 EC_SLAVE_ERR(slave, "Failed to receive CoE dictionary" |
437 " response datagram: "); |
443 " response datagram: "); |
438 ec_datagram_print_state(datagram); |
444 ec_datagram_print_state(datagram); |
439 return; |
445 return; |
440 } |
446 } |
441 |
447 |
442 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
448 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
443 fsm->state = ec_fsm_coe_error; |
449 fsm->state = ec_fsm_coe_error; |
444 EC_SLAVE_ERR(slave, "Reception of CoE dictionary response failed: "); |
450 EC_SLAVE_ERR(slave, "Reception of CoE dictionary response failed: "); |
445 ec_datagram_print_wc_error(datagram); |
451 ec_datagram_print_wc_error(datagram); |
446 return; |
452 return; |
447 } |
453 } |
581 { |
587 { |
582 ec_mailbox_t *mbox = fsm->mbox; |
588 ec_mailbox_t *mbox = fsm->mbox; |
583 ec_datagram_t *datagram = mbox->datagram; |
589 ec_datagram_t *datagram = mbox->datagram; |
584 ec_slave_t *slave = fsm->slave; |
590 ec_slave_t *slave = fsm->slave; |
585 |
591 |
586 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
592 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
593 && fsm->retries--) |
587 return; // FIXME: check for response first? |
594 return; // FIXME: check for response first? |
588 |
595 |
589 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
596 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
590 fsm->state = ec_fsm_coe_error; |
597 fsm->state = ec_fsm_coe_error; |
591 EC_SLAVE_ERR(slave, "Failed to receive CoE SDO" |
598 EC_SLAVE_ERR(slave, "Failed to receive CoE SDO" |
592 " description request datagram: "); |
599 " description request datagram: "); |
593 ec_datagram_print_state(datagram); |
600 ec_datagram_print_state(datagram); |
594 return; |
601 return; |
595 } |
602 } |
596 |
603 |
597 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
604 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
598 fsm->state = ec_fsm_coe_error; |
605 fsm->state = ec_fsm_coe_error; |
599 EC_SLAVE_ERR(slave, "Reception of CoE SDO description" |
606 EC_SLAVE_ERR(slave, "Reception of CoE SDO description" |
600 " request failed: "); |
607 " request failed: "); |
601 ec_datagram_print_wc_error(datagram); |
608 ec_datagram_print_wc_error(datagram); |
602 return; |
609 return; |
619 { |
626 { |
620 ec_mailbox_t *mbox = fsm->mbox; |
627 ec_mailbox_t *mbox = fsm->mbox; |
621 ec_datagram_t *datagram = mbox->datagram; |
628 ec_datagram_t *datagram = mbox->datagram; |
622 ec_slave_t *slave = fsm->slave; |
629 ec_slave_t *slave = fsm->slave; |
623 |
630 |
624 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
631 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
625 return; |
632 && fsm->retries--) { |
626 |
633 return; |
627 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
634 } |
|
635 |
|
636 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
628 fsm->state = ec_fsm_coe_error; |
637 fsm->state = ec_fsm_coe_error; |
629 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
638 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
630 ec_datagram_print_state(datagram); |
639 ec_datagram_print_state(datagram); |
631 return; |
640 return; |
632 } |
641 } |
633 |
642 |
634 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
643 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
635 fsm->state = ec_fsm_coe_error; |
644 fsm->state = ec_fsm_coe_error; |
636 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
645 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
637 " datagram failed: "); |
646 " datagram failed: "); |
638 ec_datagram_print_wc_error(datagram); |
647 ec_datagram_print_wc_error(datagram); |
639 return; |
648 return; |
676 ec_slave_t *slave = fsm->slave; |
685 ec_slave_t *slave = fsm->slave; |
677 ec_sdo_t *sdo = fsm->sdo; |
686 ec_sdo_t *sdo = fsm->sdo; |
678 uint8_t *data, mbox_prot; |
687 uint8_t *data, mbox_prot; |
679 size_t rec_size, name_size; |
688 size_t rec_size, name_size; |
680 |
689 |
681 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
690 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
691 && fsm->retries--) { |
682 return; // FIXME: request again? |
692 return; // FIXME: request again? |
683 |
693 } |
684 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
694 |
|
695 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
685 fsm->state = ec_fsm_coe_error; |
696 fsm->state = ec_fsm_coe_error; |
686 EC_SLAVE_ERR(slave, "Failed to receive CoE SDO description" |
697 EC_SLAVE_ERR(slave, "Failed to receive CoE SDO description" |
687 " response datagram: "); |
698 " response datagram: "); |
688 ec_datagram_print_state(datagram); |
699 ec_datagram_print_state(datagram); |
689 return; |
700 return; |
690 } |
701 } |
691 |
702 |
692 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
703 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
693 fsm->state = ec_fsm_coe_error; |
704 fsm->state = ec_fsm_coe_error; |
694 EC_SLAVE_ERR(slave, "Reception of CoE SDO description" |
705 EC_SLAVE_ERR(slave, "Reception of CoE SDO description" |
695 " response failed: "); |
706 " response failed: "); |
696 ec_datagram_print_wc_error(datagram); |
707 ec_datagram_print_wc_error(datagram); |
697 return; |
708 return; |
818 { |
829 { |
819 ec_mailbox_t *mbox = fsm->mbox; |
830 ec_mailbox_t *mbox = fsm->mbox; |
820 ec_datagram_t *datagram = mbox->datagram; |
831 ec_datagram_t *datagram = mbox->datagram; |
821 ec_slave_t *slave = fsm->slave; |
832 ec_slave_t *slave = fsm->slave; |
822 |
833 |
823 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
834 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
835 && fsm->retries--) { |
824 return; // FIXME: check for response first? |
836 return; // FIXME: check for response first? |
825 |
837 } |
826 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
838 |
|
839 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
827 fsm->state = ec_fsm_coe_error; |
840 fsm->state = ec_fsm_coe_error; |
828 EC_SLAVE_ERR(slave, "Failed to receive CoE SDO entry" |
841 EC_SLAVE_ERR(slave, "Failed to receive CoE SDO entry" |
829 " request datagram: "); |
842 " request datagram: "); |
830 ec_datagram_print_state(datagram); |
843 ec_datagram_print_state(datagram); |
831 return; |
844 return; |
832 } |
845 } |
833 |
846 |
834 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
847 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
835 fsm->state = ec_fsm_coe_error; |
848 fsm->state = ec_fsm_coe_error; |
836 EC_SLAVE_ERR(slave, "Reception of CoE SDO entry request failed: "); |
849 EC_SLAVE_ERR(slave, "Reception of CoE SDO entry request failed: "); |
837 ec_datagram_print_wc_error(datagram); |
850 ec_datagram_print_wc_error(datagram); |
838 return; |
851 return; |
839 } |
852 } |
856 { |
869 { |
857 ec_mailbox_t *mbox = fsm->mbox; |
870 ec_mailbox_t *mbox = fsm->mbox; |
858 ec_datagram_t *datagram = mbox->datagram; |
871 ec_datagram_t *datagram = mbox->datagram; |
859 ec_slave_t *slave = fsm->slave; |
872 ec_slave_t *slave = fsm->slave; |
860 |
873 |
861 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
874 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
862 return; |
875 && fsm->retries--) { |
863 |
876 return; |
864 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
877 } |
|
878 |
|
879 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
865 fsm->state = ec_fsm_coe_error; |
880 fsm->state = ec_fsm_coe_error; |
866 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
881 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
867 ec_datagram_print_state(datagram); |
882 ec_datagram_print_state(datagram); |
868 return; |
883 return; |
869 } |
884 } |
870 |
885 |
871 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
886 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
872 fsm->state = ec_fsm_coe_error; |
887 fsm->state = ec_fsm_coe_error; |
873 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
888 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
874 " datagram failed: "); |
889 " datagram failed: "); |
875 ec_datagram_print_wc_error(datagram); |
890 ec_datagram_print_wc_error(datagram); |
876 return; |
891 return; |
915 uint8_t *data, mbox_prot; |
930 uint8_t *data, mbox_prot; |
916 size_t rec_size, data_size; |
931 size_t rec_size, data_size; |
917 ec_sdo_entry_t *entry; |
932 ec_sdo_entry_t *entry; |
918 u16 word; |
933 u16 word; |
919 |
934 |
920 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
935 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
936 && fsm->retries--) { |
921 return; // FIXME: request again? |
937 return; // FIXME: request again? |
922 |
938 } |
923 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
939 |
|
940 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
924 fsm->state = ec_fsm_coe_error; |
941 fsm->state = ec_fsm_coe_error; |
925 EC_SLAVE_ERR(slave, "Failed to receive CoE SDO" |
942 EC_SLAVE_ERR(slave, "Failed to receive CoE SDO" |
926 " description response datagram: "); |
943 " description response datagram: "); |
927 ec_datagram_print_state(datagram); |
944 ec_datagram_print_state(datagram); |
928 return; |
945 return; |
929 } |
946 } |
930 |
947 |
931 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
948 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
932 fsm->state = ec_fsm_coe_error; |
949 fsm->state = ec_fsm_coe_error; |
933 EC_SLAVE_ERR(slave, "Reception of CoE SDO description" |
950 EC_SLAVE_ERR(slave, "Reception of CoE SDO description" |
934 " response failed: "); |
951 " response failed: "); |
935 ec_datagram_print_wc_error(datagram); |
952 ec_datagram_print_wc_error(datagram); |
936 return; |
953 return; |
1225 ec_mailbox_t *mbox = fsm->mbox; |
1242 ec_mailbox_t *mbox = fsm->mbox; |
1226 ec_datagram_t *datagram = mbox->datagram; |
1243 ec_datagram_t *datagram = mbox->datagram; |
1227 ec_slave_t *slave = fsm->slave; |
1244 ec_slave_t *slave = fsm->slave; |
1228 unsigned long diff_ms; |
1245 unsigned long diff_ms; |
1229 |
1246 |
1230 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
1247 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
1248 && fsm->retries--) { |
1231 return; // FIXME: check for response first? |
1249 return; // FIXME: check for response first? |
1232 |
1250 } |
1233 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
1251 |
|
1252 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
1234 fsm->request->errno = EIO; |
1253 fsm->request->errno = EIO; |
1235 fsm->state = ec_fsm_coe_error; |
1254 fsm->state = ec_fsm_coe_error; |
1236 EC_SLAVE_ERR(slave, "Failed to receive CoE download" |
1255 EC_SLAVE_ERR(slave, "Failed to receive CoE download" |
1237 " request datagram: "); |
1256 " request datagram: "); |
1238 ec_datagram_print_state(datagram); |
1257 ec_datagram_print_state(datagram); |
1239 return; |
1258 return; |
1240 } |
1259 } |
1241 |
1260 |
1242 diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
1261 diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
1243 |
1262 |
1244 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
1263 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
1245 if (ec_mbox_is_datagram_wc(mbox,0)) { |
1264 if (ec_mbox_is_datagram_wc(mbox, 0)) { |
1246 if (diff_ms < fsm->request->response_timeout) { |
1265 if (diff_ms < fsm->request->response_timeout) { |
1247 #if DEBUG_RETRIES |
1266 #if DEBUG_RETRIES |
1248 EC_SLAVE_DBG(slave, 1, "Slave did not respond to SDO" |
1267 EC_SLAVE_DBG(slave, 1, "Slave did not respond to SDO" |
1249 " download request. Retrying after %lu ms...\n", |
1268 " download request. Retrying after %lu ms...\n", |
1250 diff_ms); |
1269 diff_ms); |
1284 { |
1303 { |
1285 ec_mailbox_t *mbox = fsm->mbox; |
1304 ec_mailbox_t *mbox = fsm->mbox; |
1286 ec_datagram_t *datagram = mbox->datagram; |
1305 ec_datagram_t *datagram = mbox->datagram; |
1287 ec_slave_t *slave = fsm->slave; |
1306 ec_slave_t *slave = fsm->slave; |
1288 |
1307 |
1289 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
1308 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
1290 return; |
1309 && fsm->retries--) { |
1291 |
1310 return; |
1292 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
1311 } |
|
1312 |
|
1313 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
1293 fsm->request->errno = EIO; |
1314 fsm->request->errno = EIO; |
1294 fsm->state = ec_fsm_coe_error; |
1315 fsm->state = ec_fsm_coe_error; |
1295 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check" |
1316 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check" |
1296 " datagram: "); |
1317 " datagram: "); |
1297 ec_datagram_print_state(datagram); |
1318 ec_datagram_print_state(datagram); |
1298 return; |
1319 return; |
1299 } |
1320 } |
1300 |
1321 |
1301 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
1322 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
1302 fsm->request->errno = EIO; |
1323 fsm->request->errno = EIO; |
1303 fsm->state = ec_fsm_coe_error; |
1324 fsm->state = ec_fsm_coe_error; |
1304 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
1325 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
1305 " datagram failed: "); |
1326 " datagram failed: "); |
1306 ec_datagram_print_wc_error(datagram); |
1327 ec_datagram_print_wc_error(datagram); |
1410 ec_slave_t *slave = fsm->slave; |
1431 ec_slave_t *slave = fsm->slave; |
1411 uint8_t *data, mbox_prot; |
1432 uint8_t *data, mbox_prot; |
1412 size_t rec_size; |
1433 size_t rec_size; |
1413 ec_sdo_request_t *request = fsm->request; |
1434 ec_sdo_request_t *request = fsm->request; |
1414 |
1435 |
1415 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
1436 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
1437 && fsm->retries--) { |
1416 return; // FIXME: request again? |
1438 return; // FIXME: request again? |
1417 |
1439 } |
1418 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
1440 |
|
1441 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
1419 request->errno = EIO; |
1442 request->errno = EIO; |
1420 fsm->state = ec_fsm_coe_error; |
1443 fsm->state = ec_fsm_coe_error; |
1421 EC_SLAVE_ERR(slave, "Failed to receive CoE download" |
1444 EC_SLAVE_ERR(slave, "Failed to receive CoE download" |
1422 " response datagram: "); |
1445 " response datagram: "); |
1423 ec_datagram_print_state(datagram); |
1446 ec_datagram_print_state(datagram); |
1424 return; |
1447 return; |
1425 } |
1448 } |
1426 |
1449 |
1427 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
1450 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
1428 request->errno = EIO; |
1451 request->errno = EIO; |
1429 fsm->state = ec_fsm_coe_error; |
1452 fsm->state = ec_fsm_coe_error; |
1430 EC_SLAVE_ERR(slave, "Reception of CoE download response failed: "); |
1453 EC_SLAVE_ERR(slave, "Reception of CoE download response failed: "); |
1431 ec_datagram_print_wc_error(datagram); |
1454 ec_datagram_print_wc_error(datagram); |
1432 return; |
1455 return; |
1525 { |
1548 { |
1526 ec_mailbox_t *mbox = fsm->mbox; |
1549 ec_mailbox_t *mbox = fsm->mbox; |
1527 ec_datagram_t *datagram = mbox->datagram; |
1550 ec_datagram_t *datagram = mbox->datagram; |
1528 ec_slave_t *slave = fsm->slave; |
1551 ec_slave_t *slave = fsm->slave; |
1529 |
1552 |
1530 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
1553 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
1531 return; |
1554 && fsm->retries--) { |
1532 |
1555 return; |
1533 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
1556 } |
|
1557 |
|
1558 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
1534 fsm->request->errno = EIO; |
1559 fsm->request->errno = EIO; |
1535 fsm->state = ec_fsm_coe_error; |
1560 fsm->state = ec_fsm_coe_error; |
1536 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
1561 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
1537 ec_datagram_print_state(datagram); |
1562 ec_datagram_print_state(datagram); |
1538 return; |
1563 return; |
1539 } |
1564 } |
1540 |
1565 |
1541 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
1566 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
1542 fsm->request->errno = EIO; |
1567 fsm->request->errno = EIO; |
1543 fsm->state = ec_fsm_coe_error; |
1568 fsm->state = ec_fsm_coe_error; |
1544 EC_SLAVE_ERR(slave, "Reception of CoE mailbox segment check" |
1569 EC_SLAVE_ERR(slave, "Reception of CoE mailbox segment check" |
1545 " datagram failed: "); |
1570 " datagram failed: "); |
1546 ec_datagram_print_wc_error(datagram); |
1571 ec_datagram_print_wc_error(datagram); |
1585 ec_slave_t *slave = fsm->slave; |
1610 ec_slave_t *slave = fsm->slave; |
1586 uint8_t *data, mbox_prot; |
1611 uint8_t *data, mbox_prot; |
1587 size_t rec_size; |
1612 size_t rec_size; |
1588 ec_sdo_request_t *request = fsm->request; |
1613 ec_sdo_request_t *request = fsm->request; |
1589 |
1614 |
1590 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
1615 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
1616 && fsm->retries--) { |
1591 return; // FIXME: request again? |
1617 return; // FIXME: request again? |
1592 |
1618 } |
1593 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
1619 |
|
1620 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
1594 request->errno = EIO; |
1621 request->errno = EIO; |
1595 fsm->state = ec_fsm_coe_error; |
1622 fsm->state = ec_fsm_coe_error; |
1596 EC_SLAVE_ERR(slave, "Failed to receive CoE download response" |
1623 EC_SLAVE_ERR(slave, "Failed to receive CoE download response" |
1597 " datagram: "); |
1624 " datagram: "); |
1598 ec_datagram_print_state(datagram); |
1625 ec_datagram_print_state(datagram); |
1599 return; |
1626 return; |
1600 } |
1627 } |
1601 |
1628 |
1602 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
1629 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
1603 request->errno = EIO; |
1630 request->errno = EIO; |
1604 fsm->state = ec_fsm_coe_error; |
1631 fsm->state = ec_fsm_coe_error; |
1605 EC_SLAVE_ERR(slave, "Reception of CoE download response failed: "); |
1632 EC_SLAVE_ERR(slave, "Reception of CoE download response failed: "); |
1606 ec_datagram_print_wc_error(datagram); |
1633 ec_datagram_print_wc_error(datagram); |
1607 return; |
1634 return; |
1756 ec_mailbox_t *mbox = fsm->mbox; |
1783 ec_mailbox_t *mbox = fsm->mbox; |
1757 ec_datagram_t *datagram = mbox->datagram; |
1784 ec_datagram_t *datagram = mbox->datagram; |
1758 ec_slave_t *slave = fsm->slave; |
1785 ec_slave_t *slave = fsm->slave; |
1759 unsigned long diff_ms; |
1786 unsigned long diff_ms; |
1760 |
1787 |
1761 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
1788 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
1789 && fsm->retries--) { |
1762 return; // FIXME: check for response first? |
1790 return; // FIXME: check for response first? |
1763 |
1791 } |
1764 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
1792 |
|
1793 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
1765 fsm->request->errno = EIO; |
1794 fsm->request->errno = EIO; |
1766 fsm->state = ec_fsm_coe_error; |
1795 fsm->state = ec_fsm_coe_error; |
1767 EC_SLAVE_ERR(slave, "Failed to receive CoE upload request: "); |
1796 EC_SLAVE_ERR(slave, "Failed to receive CoE upload request: "); |
1768 ec_datagram_print_state(datagram); |
1797 ec_datagram_print_state(datagram); |
1769 return; |
1798 return; |
1770 } |
1799 } |
1771 |
1800 |
1772 diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
1801 diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
1773 |
1802 |
1774 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
1803 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
1775 if (ec_mbox_is_datagram_wc(mbox,0)) { |
1804 if (ec_mbox_is_datagram_wc(mbox, 0)) { |
1776 if (diff_ms < fsm->request->response_timeout) { |
1805 if (diff_ms < fsm->request->response_timeout) { |
1777 #if DEBUG_RETRIES |
1806 #if DEBUG_RETRIES |
1778 EC_SLAVE_DBG(slave, 1, "Slave did not respond to" |
1807 EC_SLAVE_DBG(slave, 1, "Slave did not respond to" |
1779 " SDO upload request. Retrying after %lu ms...\n", |
1808 " SDO upload request. Retrying after %lu ms...\n", |
1780 diff_ms); |
1809 diff_ms); |
1816 { |
1845 { |
1817 ec_mailbox_t *mbox = fsm->mbox; |
1846 ec_mailbox_t *mbox = fsm->mbox; |
1818 ec_datagram_t *datagram = mbox->datagram; |
1847 ec_datagram_t *datagram = mbox->datagram; |
1819 ec_slave_t *slave = fsm->slave; |
1848 ec_slave_t *slave = fsm->slave; |
1820 |
1849 |
1821 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
1850 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
1822 return; |
1851 && fsm->retries--) { |
1823 |
1852 return; |
1824 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
1853 } |
|
1854 |
|
1855 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
1825 fsm->request->errno = EIO; |
1856 fsm->request->errno = EIO; |
1826 fsm->state = ec_fsm_coe_error; |
1857 fsm->state = ec_fsm_coe_error; |
1827 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
1858 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check datagram: "); |
1828 ec_datagram_print_state(datagram); |
1859 ec_datagram_print_state(datagram); |
1829 return; |
1860 return; |
1830 } |
1861 } |
1831 |
1862 |
1832 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
1863 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
1833 fsm->request->errno = EIO; |
1864 fsm->request->errno = EIO; |
1834 fsm->state = ec_fsm_coe_error; |
1865 fsm->state = ec_fsm_coe_error; |
1835 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
1866 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check" |
1836 " datagram failed: "); |
1867 " datagram failed: "); |
1837 ec_datagram_print_wc_error(datagram); |
1868 ec_datagram_print_wc_error(datagram); |
1906 size_t rec_size, data_size; |
1937 size_t rec_size, data_size; |
1907 ec_sdo_request_t *request = fsm->request; |
1938 ec_sdo_request_t *request = fsm->request; |
1908 unsigned int expedited, size_specified; |
1939 unsigned int expedited, size_specified; |
1909 int ret; |
1940 int ret; |
1910 |
1941 |
1911 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
1942 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
1943 && fsm->retries--) { |
1912 return; // FIXME: request again? |
1944 return; // FIXME: request again? |
1913 |
1945 } |
1914 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
1946 |
|
1947 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
1915 request->errno = EIO; |
1948 request->errno = EIO; |
1916 fsm->state = ec_fsm_coe_error; |
1949 fsm->state = ec_fsm_coe_error; |
1917 EC_SLAVE_ERR(slave, "Failed to receive CoE upload response" |
1950 EC_SLAVE_ERR(slave, "Failed to receive CoE upload response" |
1918 " datagram: "); |
1951 " datagram: "); |
1919 ec_datagram_print_state(datagram); |
1952 ec_datagram_print_state(datagram); |
1920 return; |
1953 return; |
1921 } |
1954 } |
1922 |
1955 |
1923 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
1956 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
1924 request->errno = EIO; |
1957 request->errno = EIO; |
1925 fsm->state = ec_fsm_coe_error; |
1958 fsm->state = ec_fsm_coe_error; |
1926 EC_SLAVE_ERR(slave, "Reception of CoE upload response failed: "); |
1959 EC_SLAVE_ERR(slave, "Reception of CoE upload response failed: "); |
1927 ec_datagram_print_wc_error(datagram); |
1960 ec_datagram_print_wc_error(datagram); |
1928 return; |
1961 return; |
2099 { |
2132 { |
2100 ec_mailbox_t *mbox = fsm->mbox; |
2133 ec_mailbox_t *mbox = fsm->mbox; |
2101 ec_datagram_t *datagram = mbox->datagram; |
2134 ec_datagram_t *datagram = mbox->datagram; |
2102 ec_slave_t *slave = fsm->slave; |
2135 ec_slave_t *slave = fsm->slave; |
2103 |
2136 |
2104 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
2137 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
2138 && fsm->retries--) { |
2105 return; // FIXME: check for response first? |
2139 return; // FIXME: check for response first? |
2106 |
2140 } |
2107 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
2141 |
|
2142 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
2108 fsm->request->errno = EIO; |
2143 fsm->request->errno = EIO; |
2109 fsm->state = ec_fsm_coe_error; |
2144 fsm->state = ec_fsm_coe_error; |
2110 EC_SLAVE_ERR(slave, "Failed to receive CoE upload segment" |
2145 EC_SLAVE_ERR(slave, "Failed to receive CoE upload segment" |
2111 " request datagram: "); |
2146 " request datagram: "); |
2112 ec_datagram_print_state(datagram); |
2147 ec_datagram_print_state(datagram); |
2113 return; |
2148 return; |
2114 } |
2149 } |
2115 |
2150 |
2116 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
2151 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
2117 fsm->request->errno = EIO; |
2152 fsm->request->errno = EIO; |
2118 fsm->state = ec_fsm_coe_error; |
2153 fsm->state = ec_fsm_coe_error; |
2119 EC_SLAVE_ERR(slave, "Reception of CoE upload segment" |
2154 EC_SLAVE_ERR(slave, "Reception of CoE upload segment" |
2120 " request failed: "); |
2155 " request failed: "); |
2121 ec_datagram_print_wc_error(datagram); |
2156 ec_datagram_print_wc_error(datagram); |
2139 { |
2174 { |
2140 ec_mailbox_t *mbox = fsm->mbox; |
2175 ec_mailbox_t *mbox = fsm->mbox; |
2141 ec_datagram_t *datagram = mbox->datagram; |
2176 ec_datagram_t *datagram = mbox->datagram; |
2142 ec_slave_t *slave = fsm->slave; |
2177 ec_slave_t *slave = fsm->slave; |
2143 |
2178 |
2144 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
2179 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
2145 return; |
2180 && fsm->retries--) { |
2146 |
2181 return; |
2147 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
2182 } |
|
2183 |
|
2184 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
2148 fsm->request->errno = EIO; |
2185 fsm->request->errno = EIO; |
2149 fsm->state = ec_fsm_coe_error; |
2186 fsm->state = ec_fsm_coe_error; |
2150 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check" |
2187 EC_SLAVE_ERR(slave, "Failed to receive CoE mailbox check" |
2151 " datagram: "); |
2188 " datagram: "); |
2152 ec_datagram_print_state(datagram); |
2189 ec_datagram_print_state(datagram); |
2153 return; |
2190 return; |
2154 } |
2191 } |
2155 |
2192 |
2156 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
2193 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
2157 fsm->request->errno = EIO; |
2194 fsm->request->errno = EIO; |
2158 fsm->state = ec_fsm_coe_error; |
2195 fsm->state = ec_fsm_coe_error; |
2159 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check datagram" |
2196 EC_SLAVE_ERR(slave, "Reception of CoE mailbox check datagram" |
2160 " failed: "); |
2197 " failed: "); |
2161 ec_datagram_print_wc_error(datagram); |
2198 ec_datagram_print_wc_error(datagram); |
2200 uint8_t *data, mbox_prot; |
2237 uint8_t *data, mbox_prot; |
2201 size_t rec_size, data_size; |
2238 size_t rec_size, data_size; |
2202 ec_sdo_request_t *request = fsm->request; |
2239 ec_sdo_request_t *request = fsm->request; |
2203 unsigned int last_segment; |
2240 unsigned int last_segment; |
2204 |
2241 |
2205 if (ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_TIMED_OUT) && fsm->retries--) |
2242 if (ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_TIMED_OUT) |
|
2243 && fsm->retries--) { |
2206 return; // FIXME: request again? |
2244 return; // FIXME: request again? |
2207 |
2245 } |
2208 if (!ec_mbox_is_datagram_state(mbox,EC_DATAGRAM_RECEIVED)) { |
2246 |
|
2247 if (!ec_mbox_is_datagram_state(mbox, EC_DATAGRAM_RECEIVED)) { |
2209 request->errno = EIO; |
2248 request->errno = EIO; |
2210 fsm->state = ec_fsm_coe_error; |
2249 fsm->state = ec_fsm_coe_error; |
2211 EC_SLAVE_ERR(slave, "Failed to receive CoE upload segment" |
2250 EC_SLAVE_ERR(slave, "Failed to receive CoE upload segment" |
2212 " response datagram: "); |
2251 " response datagram: "); |
2213 ec_datagram_print_state(datagram); |
2252 ec_datagram_print_state(datagram); |
2214 return; |
2253 return; |
2215 } |
2254 } |
2216 |
2255 |
2217 if (!ec_mbox_is_datagram_wc(mbox,1)) { |
2256 if (!ec_mbox_is_datagram_wc(mbox, 1)) { |
2218 request->errno = EIO; |
2257 request->errno = EIO; |
2219 fsm->state = ec_fsm_coe_error; |
2258 fsm->state = ec_fsm_coe_error; |
2220 EC_SLAVE_ERR(slave, "Reception of CoE upload segment" |
2259 EC_SLAVE_ERR(slave, "Reception of CoE upload segment" |
2221 " response failed: "); |
2260 " response failed: "); |
2222 ec_datagram_print_wc_error(datagram); |
2261 ec_datagram_print_wc_error(datagram); |