master/fsm_slave.c
changeset 2029 5ef6507fc77a
parent 2027 ac35f4d38a31
child 2032 57c618557912
equal deleted inserted replaced
2028:55854f070c4a 2029:5ef6507fc77a
   265     ec_master_foe_request_t *request, *next;
   265     ec_master_foe_request_t *request, *next;
   266 
   266 
   267     // search the first request to be processed
   267     // search the first request to be processed
   268     list_for_each_entry_safe(request, next, &slave->foe_requests, list) {
   268     list_for_each_entry_safe(request, next, &slave->foe_requests, list) {
   269         if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) {
   269         if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) {
   270             EC_SLAVE_WARN(slave, "Aborting FOE request,"
   270             EC_SLAVE_WARN(slave, "Aborting FOE request %p,"
   271                     " slave has error flag set.\n");
   271                     " slave has error flag set.\n",request);
   272             request->req.state = EC_INT_REQUEST_FAILURE;
   272             request->req.state = EC_INT_REQUEST_FAILURE;
       
   273             kref_put(&request->refcount,ec_master_foe_request_release);
   273             wake_up(&slave->foe_queue);
   274             wake_up(&slave->foe_queue);
   274             fsm->sdo_request = NULL;
   275             fsm->sdo_request = NULL;
   275             fsm->state = ec_fsm_slave_state_idle;
   276             fsm->state = ec_fsm_slave_state_idle;
   276             return 0;
   277             return 0;
   277         }
   278         }
   278         list_del_init(&request->list); // dequeue
   279         list_del_init(&request->list); // dequeue
   279         request->req.state = EC_INT_REQUEST_BUSY;
   280         request->req.state = EC_INT_REQUEST_BUSY;
   280 
   281 
   281         EC_SLAVE_DBG(slave, 1, "Processing FoE request.\n");
   282         EC_SLAVE_DBG(slave, 1, "Processing FoE request %p.\n",request);
   282 
   283 
   283         fsm->foe_request = &request->req;
   284         fsm->foe_request = request;
   284         fsm->state = ec_fsm_slave_state_foe_request;
   285         fsm->state = ec_fsm_slave_state_foe_request;
   285         ec_fsm_foe_transfer(&fsm->fsm_foe, slave, &request->req);
   286         ec_fsm_foe_transfer(&fsm->fsm_foe, slave, &request->req);
   286         ec_fsm_foe_exec(&fsm->fsm_foe);
   287         ec_fsm_foe_exec(&fsm->fsm_foe);
   287         ec_master_queue_request_fsm_datagram(fsm->slave->master,fsm->datagram);
   288         ec_master_queue_request_fsm_datagram(fsm->slave->master,fsm->datagram);
   288         return 1;
   289         return 1;
   297 void ec_fsm_slave_state_foe_request(
   298 void ec_fsm_slave_state_foe_request(
   298         ec_fsm_slave_t *fsm /**< Slave state machine. */
   299         ec_fsm_slave_t *fsm /**< Slave state machine. */
   299         )
   300         )
   300 {
   301 {
   301     ec_slave_t *slave = fsm->slave;
   302     ec_slave_t *slave = fsm->slave;
   302     ec_foe_request_t *request = fsm->foe_request;
   303     ec_master_foe_request_t *request = fsm->foe_request;
   303 
   304 
   304     if (ec_fsm_foe_exec(&fsm->fsm_foe))
   305     if (ec_fsm_foe_exec(&fsm->fsm_foe))
   305     {
   306     {
   306         ec_master_queue_request_fsm_datagram(fsm->slave->master,fsm->datagram);
   307         ec_master_queue_request_fsm_datagram(fsm->slave->master,fsm->datagram);
   307         return;
   308         return;
   308     }
   309     }
   309 
   310 
   310     if (!ec_fsm_foe_success(&fsm->fsm_foe)) {
   311     if (!ec_fsm_foe_success(&fsm->fsm_foe)) {
   311         EC_SLAVE_ERR(slave, "Failed to handle FoE request.\n");
   312         EC_SLAVE_ERR(slave, "Failed to handle FoE request %p.\n",request);
   312         request->state = EC_INT_REQUEST_FAILURE;
   313         request->req.state = EC_INT_REQUEST_FAILURE;
       
   314         kref_put(&request->refcount,ec_master_foe_request_release);
   313         wake_up(&slave->foe_queue);
   315         wake_up(&slave->foe_queue);
   314         fsm->foe_request = NULL;
   316         fsm->foe_request = NULL;
   315         fsm->state = ec_fsm_slave_state_idle;
   317         fsm->state = ec_fsm_slave_state_idle;
   316         return;
   318         return;
   317     }
   319     }
   318 
   320 
   319     // finished transferring FoE
   321     // finished transferring FoE
   320     EC_SLAVE_DBG(slave, 1, "Successfully transferred %zu bytes of FoE"
   322     EC_SLAVE_DBG(slave, 1, "FoE request %p successfully transferred %zu bytes.\n",
   321             " data.\n", request->data_size);
   323             request,request->req.data_size);
   322 
   324 
   323     request->state = EC_INT_REQUEST_SUCCESS;
   325     request->req.state = EC_INT_REQUEST_SUCCESS;
       
   326     kref_put(&request->refcount,ec_master_foe_request_release);
   324     wake_up(&slave->foe_queue);
   327     wake_up(&slave->foe_queue);
   325 
   328 
   326     fsm->foe_request = NULL;
   329     fsm->foe_request = NULL;
   327     fsm->state = ec_fsm_slave_state_ready;
   330     fsm->state = ec_fsm_slave_state_ready;
   328 }
   331 }