337 { |
337 { |
338 ec_master_t *master = fsm->master; |
338 ec_master_t *master = fsm->master; |
339 ec_phy_request_t *request; |
339 ec_phy_request_t *request; |
340 |
340 |
341 // search the first request to be processed |
341 // search the first request to be processed |
342 while (1) { |
342 while (!list_empty(&master->phy_requests)) { |
343 if (list_empty(&master->phy_requests)) |
|
344 break; |
|
345 |
343 |
346 // get first request |
344 // get first request |
347 request = list_entry(master->phy_requests.next, |
345 request = list_entry(master->phy_requests.next, |
348 ec_phy_request_t, list); |
346 ec_phy_request_t, list); |
349 list_del_init(&request->list); // dequeue |
347 list_del_init(&request->list); // dequeue |
350 request->state = EC_INT_REQUEST_BUSY; |
348 request->state = EC_INT_REQUEST_BUSY; |
351 |
349 |
352 // found pending request; process it! |
350 // found pending request; process it! |
353 if (master->debug_level) |
351 if (master->debug_level) |
354 EC_DBG("Processing phy request for slave %u...\n", |
352 EC_DBG("Processing phy request for slave %u, " |
355 request->slave->ring_position); |
353 "offset 0x%04x, length %u...\n", |
|
354 request->slave->ring_position, |
|
355 request->offset, request->length); |
356 fsm->phy_request = request; |
356 fsm->phy_request = request; |
357 |
357 |
358 if (request->dir == EC_DIR_INPUT) { |
358 if (request->dir == EC_DIR_INPUT) { |
359 ec_datagram_fprd(fsm->datagram, request->slave->station_address, |
359 ec_datagram_fprd(fsm->datagram, request->slave->station_address, |
360 request->offset, request->length); |
360 request->offset, request->length); |
361 ec_datagram_zero(fsm->datagram); |
361 ec_datagram_zero(fsm->datagram); |
362 } else { |
362 } else { |
363 if (request->length > fsm->datagram->mem_size) { |
363 if (request->length > fsm->datagram->mem_size) { |
364 EC_ERR("Request length (%u) exceeds maximum datagram size (%u)!\n", |
364 EC_ERR("Request length (%u) exceeds maximum " |
365 request->length, fsm->datagram->mem_size); |
365 "datagram size (%u)!\n", request->length, |
|
366 fsm->datagram->mem_size); |
366 request->state = EC_INT_REQUEST_FAILURE; |
367 request->state = EC_INT_REQUEST_FAILURE; |
367 wake_up(&master->phy_queue); |
368 wake_up(&master->phy_queue); |
368 continue; |
369 continue; |
369 } |
370 } |
370 ec_datagram_fpwr(fsm->datagram, request->slave->station_address, |
371 ec_datagram_fpwr(fsm->datagram, request->slave->station_address, |