378 int ec_fsm_slave_action_process_foe( |
378 int ec_fsm_slave_action_process_foe( |
379 ec_fsm_slave_t *fsm /**< Slave state machine. */ |
379 ec_fsm_slave_t *fsm /**< Slave state machine. */ |
380 ) |
380 ) |
381 { |
381 { |
382 ec_slave_t *slave = fsm->slave; |
382 ec_slave_t *slave = fsm->slave; |
383 ec_master_foe_request_t *request, *next; |
383 ec_foe_request_t *request; |
384 |
384 |
385 // search the first request to be processed |
385 if (list_empty(&slave->foe_requests)) { |
386 list_for_each_entry_safe(request, next, &slave->foe_requests, list) { |
386 return 0; |
387 if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { |
387 } |
388 EC_SLAVE_WARN(slave, "Aborting FoE request," |
388 |
389 " slave has error flag set.\n"); |
389 // take the first request to be processed |
390 request->req.state = EC_INT_REQUEST_FAILURE; |
390 request = list_entry(slave->foe_requests.next, ec_foe_request_t, list); |
391 wake_up(&slave->sdo_queue); |
391 list_del_init(&request->list); // dequeue |
392 fsm->sdo_request = NULL; |
392 |
393 fsm->state = ec_fsm_slave_state_idle; |
393 if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { |
394 return 0; |
394 EC_SLAVE_WARN(slave, "Aborting FoE request," |
395 } |
395 " slave has error flag set.\n"); |
396 list_del_init(&request->list); // dequeue |
396 request->state = EC_INT_REQUEST_FAILURE; |
397 request->req.state = EC_INT_REQUEST_BUSY; |
397 wake_up(&slave->sdo_queue); |
398 |
398 return 0; |
399 EC_SLAVE_DBG(slave, 1, "Processing FoE request.\n"); |
399 } |
400 |
400 |
401 fsm->foe_request = &request->req; |
401 request->state = EC_INT_REQUEST_BUSY; |
402 fsm->state = ec_fsm_slave_state_foe_request; |
402 |
403 ec_fsm_foe_transfer(&fsm->fsm_foe, slave, &request->req); |
403 EC_SLAVE_DBG(slave, 1, "Processing FoE request.\n"); |
404 ec_fsm_foe_exec(&fsm->fsm_foe); |
404 |
405 ec_master_queue_external_datagram(fsm->slave->master, fsm->datagram); |
405 fsm->foe_request = request; |
406 return 1; |
406 fsm->state = ec_fsm_slave_state_foe_request; |
407 } |
407 ec_fsm_foe_transfer(&fsm->fsm_foe, slave, request); |
408 return 0; |
408 ec_fsm_foe_exec(&fsm->fsm_foe); |
|
409 ec_master_queue_external_datagram(fsm->slave->master, fsm->datagram); |
|
410 return 1; |
409 } |
411 } |
410 |
412 |
411 /*****************************************************************************/ |
413 /*****************************************************************************/ |
412 |
414 |
413 /** Slave state: FOE REQUEST. |
415 /** Slave state: FOE REQUEST. |