368 int ec_fsm_master_action_process_sdo( |
369 int ec_fsm_master_action_process_sdo( |
369 ec_fsm_master_t *fsm /**< master state machine */ |
370 ec_fsm_master_t *fsm /**< master state machine */ |
370 ) |
371 ) |
371 { |
372 { |
372 ec_master_t *master = fsm->master; |
373 ec_master_t *master = fsm->master; |
373 ec_sdo_request_t *request; |
374 ec_master_sdo_request_t *request; |
374 ec_slave_t *slave; |
375 ec_slave_t *slave; |
375 |
376 |
376 // search the first request to be processed |
377 // search the first request to be processed |
377 while (1) { |
378 while (1) { |
378 down(&master->sdo_sem); |
379 down(&master->sdo_sem); |
379 if (list_empty(&master->sdo_requests)) { |
380 if (list_empty(&master->slave_sdo_requests)) { |
380 up(&master->sdo_sem); |
381 up(&master->sdo_sem); |
381 break; |
382 break; |
382 } |
383 } |
383 // get first request |
384 // get first request |
384 request = |
385 request = list_entry(master->slave_sdo_requests.next, |
385 list_entry(master->sdo_requests.next, ec_sdo_request_t, list); |
386 ec_master_sdo_request_t, list); |
386 list_del_init(&request->list); // dequeue |
387 list_del_init(&request->list); // dequeue |
387 request->state = EC_REQUEST_IN_PROGRESS; |
388 request->req.state = EC_REQUEST_IN_PROGRESS; |
388 up(&master->sdo_sem); |
389 up(&master->sdo_sem); |
389 |
390 |
390 slave = request->slave; |
391 slave = request->slave; |
391 if (slave->current_state == EC_SLAVE_STATE_INIT || |
392 if (slave->current_state == EC_SLAVE_STATE_INIT || |
392 slave->online_state == EC_SLAVE_OFFLINE || |
393 slave->online_state == EC_SLAVE_OFFLINE || |
393 slave->error_flag) { |
394 slave->error_flag) { |
394 EC_ERR("Discarding Sdo request, slave %i not ready.\n", |
395 EC_ERR("Discarding Sdo request, slave %u not ready.\n", |
395 slave->ring_position); |
396 slave->ring_position); |
396 request->state = EC_REQUEST_FAILURE; |
397 request->req.state = EC_REQUEST_FAILURE; |
397 wake_up(&master->sdo_queue); |
398 wake_up(&master->sdo_queue); |
398 continue; |
399 continue; |
399 } |
400 } |
400 |
401 |
401 // found pending Sdo request. execute it! |
402 // Found pending Sdo request. Execute it! |
402 if (master->debug_level) |
403 if (master->debug_level) |
403 EC_DBG("Processing Sdo request for slave %i...\n", |
404 EC_DBG("Processing Sdo request for slave %i...\n", |
404 slave->ring_position); |
405 slave->ring_position); |
405 |
406 |
406 // start uploading Sdo |
407 // Start uploading Sdo |
407 fsm->idle = 0; |
408 fsm->idle = 0; |
408 fsm->slave = slave; |
|
409 fsm->sdo_request = request; |
409 fsm->sdo_request = request; |
410 fsm->state = ec_fsm_master_state_sdo_request; |
410 fsm->state = ec_fsm_master_state_sdo_request; |
411 ec_fsm_coe_upload(&fsm->fsm_coe, slave, fsm->sdo_request); |
411 ec_fsm_coe_upload(&fsm->fsm_coe, slave, &request->req); |
412 ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately |
412 ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately |
413 return 1; |
413 return 1; |
414 } |
414 } |
415 |
415 |
416 return 0; |
416 return 0; |
1020 */ |
1020 */ |
1021 |
1021 |
1022 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */) |
1022 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *fsm /**< master state machine */) |
1023 { |
1023 { |
1024 ec_master_t *master = fsm->master; |
1024 ec_master_t *master = fsm->master; |
1025 ec_sdo_request_t *request = fsm->sdo_request; |
1025 ec_master_sdo_request_t *request = fsm->sdo_request; |
1026 |
1026 |
1027 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
1027 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
1028 |
1028 |
1029 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
1029 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
1030 EC_DBG("Failed to process Sdo request for slave %i.\n", |
1030 EC_DBG("Failed to process Sdo request for slave %i.\n", |
1031 fsm->slave->ring_position); |
1031 fsm->slave->ring_position); |
1032 request->state = EC_REQUEST_FAILURE; |
1032 request->req.state = EC_REQUEST_FAILURE; |
1033 wake_up(&master->sdo_queue); |
1033 wake_up(&master->sdo_queue); |
1034 fsm->state = ec_fsm_master_state_error; |
1034 fsm->state = ec_fsm_master_state_error; |
1035 return; |
1035 return; |
1036 } |
1036 } |
1037 |
1037 |
1038 // Sdo request finished |
1038 // Sdo request finished |
1039 request->state = EC_REQUEST_COMPLETE; |
1039 request->req.state = EC_REQUEST_COMPLETE; |
1040 wake_up(&master->sdo_queue); |
1040 wake_up(&master->sdo_queue); |
1041 |
1041 |
1042 if (master->debug_level) |
1042 if (master->debug_level) |
1043 EC_DBG("Finished Sdo request for slave %i.\n", |
1043 EC_DBG("Finished Sdo request for slave %i.\n", |
1044 fsm->slave->ring_position); |
1044 fsm->slave->ring_position); |