master/fsm_slave.c
branchstable-1.5
changeset 2465 35611452b785
parent 2464 e6cc33cac6a2
child 2467 74ede087bc85
equal deleted inserted replaced
2464:e6cc33cac6a2 2465:35611452b785
   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.