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 } |