491 ec_master_foe_request_t, list); |
491 ec_master_foe_request_t, list); |
492 list_del_init(&request->list); // dequeue |
492 list_del_init(&request->list); // dequeue |
493 request->req.state = EC_REQUEST_BUSY; |
493 request->req.state = EC_REQUEST_BUSY; |
494 slave = request->slave; |
494 slave = request->slave; |
495 |
495 |
496 EC_DBG("---- Master read command from queue ----\n"); |
|
497 // found pending FOE write operation. execute it! |
|
498 if (master->debug_level) |
496 if (master->debug_level) |
499 EC_DBG("Writing FOE data to slave %u...\n", |
497 EC_DBG("Processing FoE request for slave %u.\n", |
500 request->slave->ring_position); |
498 slave->ring_position); |
501 |
499 |
502 fsm->foe_request = &request->req; |
500 fsm->foe_request = &request->req; |
503 fsm->slave = slave; |
501 fsm->slave = slave; |
504 fsm->state = ec_fsm_master_state_foe_request; |
502 fsm->state = ec_fsm_master_state_foe_request; |
505 ec_fsm_foe_transfer(&fsm->fsm_foe, slave, &request->req); |
503 ec_fsm_foe_transfer(&fsm->fsm_foe, slave, &request->req); |
506 //(&fsm->fsm_foe, request->slave, request->offset, request->words); |
|
507 ec_fsm_foe_exec(&fsm->fsm_foe); |
504 ec_fsm_foe_exec(&fsm->fsm_foe); |
508 return 1; |
505 return 1; |
509 } |
506 } |
510 |
507 |
511 return 0; |
508 return 0; |
524 ec_master_t *master = fsm->master; |
521 ec_master_t *master = fsm->master; |
525 ec_slave_t *slave; |
522 ec_slave_t *slave; |
526 |
523 |
527 // Check for pending SDO requests |
524 // Check for pending SDO requests |
528 if (ec_fsm_master_action_process_sdo(fsm)) |
525 if (ec_fsm_master_action_process_sdo(fsm)) |
|
526 return; |
|
527 |
|
528 // Check for pending FoE requests |
|
529 if (ec_fsm_master_action_process_foe(fsm)) |
529 return; |
530 return; |
530 |
531 |
531 // check, if slaves have an SDO dictionary to read out. |
532 // check, if slaves have an SDO dictionary to read out. |
532 for (slave = master->slaves; |
533 for (slave = master->slaves; |
533 slave < master->slaves + master->slave_count; |
534 slave < master->slaves + master->slave_count; |
910 { |
911 { |
911 ec_master_t *master = fsm->master; |
912 ec_master_t *master = fsm->master; |
912 ec_foe_request_t *request = fsm->foe_request; |
913 ec_foe_request_t *request = fsm->foe_request; |
913 ec_slave_t *slave = fsm->slave; |
914 ec_slave_t *slave = fsm->slave; |
914 |
915 |
915 if (ec_fsm_foe_exec(&fsm->fsm_foe)) return; |
916 if (ec_fsm_foe_exec(&fsm->fsm_foe)) |
|
917 return; |
916 |
918 |
917 if (!ec_fsm_foe_success(&fsm->fsm_foe)) { |
919 if (!ec_fsm_foe_success(&fsm->fsm_foe)) { |
918 EC_ERR("Failed to handle FOE request to slave %u.\n", |
920 EC_ERR("Failed to handle FoE request to slave %u.\n", |
919 slave->ring_position); |
921 slave->ring_position); |
920 request->state = EC_INT_REQUEST_FAILURE; |
922 request->state = EC_INT_REQUEST_FAILURE; |
921 wake_up(&master->foe_queue); |
923 wake_up(&master->foe_queue); |
922 ec_fsm_master_restart(fsm); |
924 ec_fsm_master_restart(fsm); |
923 return; |
925 return; |
924 } |
926 } |
925 |
927 |
926 // finished writing FOE |
928 // finished transferring FoE |
927 if (master->debug_level) |
929 if (master->debug_level) |
928 EC_DBG("Finished writing %u words of FOE data to slave %u.\n", |
930 EC_DBG("Successfully transferred %u bytes of FoE data from/to" |
929 request->data_size, slave->ring_position); |
931 " slave %u.\n", request->data_size, slave->ring_position); |
930 |
932 |
931 request->state = EC_INT_REQUEST_SUCCESS; |
933 request->state = EC_INT_REQUEST_SUCCESS; |
932 wake_up(&master->foe_queue); |
934 wake_up(&master->foe_queue); |
933 |
935 |
934 ec_fsm_master_restart(fsm); |
936 ec_fsm_master_restart(fsm); |