455 int ec_fsm_slave_action_process_soe( |
455 int ec_fsm_slave_action_process_soe( |
456 ec_fsm_slave_t *fsm /**< Slave state machine. */ |
456 ec_fsm_slave_t *fsm /**< Slave state machine. */ |
457 ) |
457 ) |
458 { |
458 { |
459 ec_slave_t *slave = fsm->slave; |
459 ec_slave_t *slave = fsm->slave; |
460 ec_master_soe_request_t *req, *next; |
460 ec_soe_request_t *req; |
461 |
461 |
462 // search the first request to be processed |
462 if (list_empty(&slave->soe_requests)) { |
463 list_for_each_entry_safe(req, next, &slave->soe_requests, list) { |
463 return 0; |
464 |
464 } |
465 list_del_init(&req->list); // dequeue |
465 |
466 if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { |
466 // take the first request to be processed |
467 EC_SLAVE_WARN(slave, "Aborting SoE request," |
467 req = list_entry(slave->soe_requests.next, ec_soe_request_t, list); |
468 " slave has error flag set.\n"); |
468 list_del_init(&req->list); // dequeue |
469 req->req.state = EC_INT_REQUEST_FAILURE; |
469 |
470 wake_up(&slave->soe_queue); |
470 if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { |
471 fsm->state = ec_fsm_slave_state_idle; |
471 EC_SLAVE_WARN(slave, "Aborting SoE request," |
472 return 0; |
472 " slave has error flag set.\n"); |
473 } |
473 req->state = EC_INT_REQUEST_FAILURE; |
474 |
474 wake_up(&slave->soe_queue); |
475 if (slave->current_state == EC_SLAVE_STATE_INIT) { |
475 return 0; |
476 EC_SLAVE_WARN(slave, "Aborting SoE request, slave is in INIT.\n"); |
476 } |
477 req->req.state = EC_INT_REQUEST_FAILURE; |
477 |
478 wake_up(&slave->soe_queue); |
478 if (slave->current_state == EC_SLAVE_STATE_INIT) { |
479 fsm->state = ec_fsm_slave_state_idle; |
479 EC_SLAVE_WARN(slave, "Aborting SoE request, slave is in INIT.\n"); |
480 return 0; |
480 req->state = EC_INT_REQUEST_FAILURE; |
481 } |
481 wake_up(&slave->soe_queue); |
482 |
482 return 0; |
483 req->req.state = EC_INT_REQUEST_BUSY; |
483 } |
484 |
484 |
485 // Found pending request. Execute it! |
485 req->state = EC_INT_REQUEST_BUSY; |
486 EC_SLAVE_DBG(slave, 1, "Processing SoE request...\n"); |
486 |
487 |
487 // Found pending request. Execute it! |
488 // Start SoE transfer |
488 EC_SLAVE_DBG(slave, 1, "Processing SoE request...\n"); |
489 fsm->soe_request = &req->req; |
489 |
490 fsm->state = ec_fsm_slave_state_soe_request; |
490 // Start SoE transfer |
491 ec_fsm_soe_transfer(&fsm->fsm_soe, slave, &req->req); |
491 fsm->soe_request = req; |
492 ec_fsm_soe_exec(&fsm->fsm_soe); // execute immediately |
492 fsm->state = ec_fsm_slave_state_soe_request; |
493 ec_master_queue_external_datagram(fsm->slave->master, fsm->datagram); |
493 ec_fsm_soe_transfer(&fsm->fsm_soe, slave, req); |
494 return 1; |
494 ec_fsm_soe_exec(&fsm->fsm_soe); // execute immediately |
495 } |
495 ec_master_queue_external_datagram(fsm->slave->master, fsm->datagram); |
496 return 0; |
496 return 1; |
497 } |
497 } |
498 |
498 |
499 /*****************************************************************************/ |
499 /*****************************************************************************/ |
500 |
500 |
501 /** Slave state: SOE_REQUEST. |
501 /** Slave state: SOE_REQUEST. |