master/fsm_slave.c
branchstable-1.5
changeset 2464 e6cc33cac6a2
parent 2462 5fc035788a3a
child 2465 35611452b785
equal deleted inserted replaced
2463:71d38ff288b3 2464:e6cc33cac6a2
   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.