283 } |
283 } |
284 // get first request |
284 // get first request |
285 request = list_entry(master->eeprom_requests.next, |
285 request = list_entry(master->eeprom_requests.next, |
286 ec_eeprom_write_request_t, list); |
286 ec_eeprom_write_request_t, list); |
287 list_del_init(&request->list); // dequeue |
287 list_del_init(&request->list); // dequeue |
288 request->state = EC_REQ_BUSY; |
288 request->state = EC_REQUEST_IN_PROGRESS; |
289 up(&master->eeprom_sem); |
289 up(&master->eeprom_sem); |
290 |
290 |
291 slave = request->slave; |
291 slave = request->slave; |
292 if (slave->online_state == EC_SLAVE_OFFLINE || slave->error_flag) { |
292 if (slave->online_state == EC_SLAVE_OFFLINE || slave->error_flag) { |
293 EC_ERR("Discarding EEPROM data, slave %i not ready.\n", |
293 EC_ERR("Discarding EEPROM data, slave %i not ready.\n", |
294 slave->ring_position); |
294 slave->ring_position); |
295 request->state = EC_REQ_ERROR; |
295 request->state = EC_REQUEST_FAILURE; |
296 wake_up(&master->eeprom_queue); |
296 wake_up(&master->eeprom_queue); |
297 continue; |
297 continue; |
298 } |
298 } |
299 |
299 |
300 // found pending EEPROM write operation. execute it! |
300 // found pending EEPROM write operation. execute it! |
337 } |
337 } |
338 // get first request |
338 // get first request |
339 request = |
339 request = |
340 list_entry(master->sdo_requests.next, ec_sdo_request_t, list); |
340 list_entry(master->sdo_requests.next, ec_sdo_request_t, list); |
341 list_del_init(&request->list); // dequeue |
341 list_del_init(&request->list); // dequeue |
342 request->state = EC_REQ_BUSY; |
342 request->state = EC_REQUEST_IN_PROGRESS; |
343 up(&master->sdo_sem); |
343 up(&master->sdo_sem); |
344 |
344 |
345 slave = request->sdo->slave; |
345 slave = request->sdo->slave; |
346 if (slave->current_state == EC_SLAVE_STATE_INIT || |
346 if (slave->current_state == EC_SLAVE_STATE_INIT || |
347 slave->online_state == EC_SLAVE_OFFLINE || |
347 slave->online_state == EC_SLAVE_OFFLINE || |
348 slave->error_flag) { |
348 slave->error_flag) { |
349 EC_ERR("Discarding SDO request, slave %i not ready.\n", |
349 EC_ERR("Discarding SDO request, slave %i not ready.\n", |
350 slave->ring_position); |
350 slave->ring_position); |
351 request->state = EC_REQ_ERROR; |
351 request->state = EC_REQUEST_FAILURE; |
352 wake_up(&master->sdo_queue); |
352 wake_up(&master->sdo_queue); |
353 continue; |
353 continue; |
354 } |
354 } |
355 |
355 |
356 // found pending SDO request. execute it! |
356 // found pending SDO request. execute it! |
787 |
787 |
788 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
788 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
789 slave->error_flag = 1; |
789 slave->error_flag = 1; |
790 EC_ERR("Failed to write EEPROM data to slave %i.\n", |
790 EC_ERR("Failed to write EEPROM data to slave %i.\n", |
791 slave->ring_position); |
791 slave->ring_position); |
792 request->state = EC_REQ_ERROR; |
792 request->state = EC_REQUEST_FAILURE; |
793 wake_up(&master->eeprom_queue); |
793 wake_up(&master->eeprom_queue); |
794 fsm->state = ec_fsm_master_state_error; |
794 fsm->state = ec_fsm_master_state_error; |
795 return; |
795 return; |
796 } |
796 } |
797 |
797 |
807 |
807 |
808 // finished writing EEPROM |
808 // finished writing EEPROM |
809 if (master->debug_level) |
809 if (master->debug_level) |
810 EC_DBG("Finished writing EEPROM data to slave %i.\n", |
810 EC_DBG("Finished writing EEPROM data to slave %i.\n", |
811 slave->ring_position); |
811 slave->ring_position); |
812 request->state = EC_REQ_COMPLETED; |
812 request->state = EC_REQUEST_COMPLETE; |
813 wake_up(&master->eeprom_queue); |
813 wake_up(&master->eeprom_queue); |
814 |
814 |
815 // TODO: Evaluate new EEPROM contents! |
815 // TODO: Evaluate new EEPROM contents! |
816 |
816 |
817 // check for another EEPROM write request |
817 // check for another EEPROM write request |
865 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
865 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
866 |
866 |
867 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
867 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
868 EC_DBG("Failed to process SDO request for slave %i.\n", |
868 EC_DBG("Failed to process SDO request for slave %i.\n", |
869 fsm->slave->ring_position); |
869 fsm->slave->ring_position); |
870 request->state = EC_REQ_ERROR; |
870 request->state = EC_REQUEST_FAILURE; |
871 wake_up(&master->sdo_queue); |
871 wake_up(&master->sdo_queue); |
872 fsm->state = ec_fsm_master_state_error; |
872 fsm->state = ec_fsm_master_state_error; |
873 return; |
873 return; |
874 } |
874 } |
875 |
875 |
876 // SDO request finished |
876 // SDO request finished |
877 request->state = EC_REQ_COMPLETED; |
877 request->state = EC_REQUEST_COMPLETE; |
878 wake_up(&master->sdo_queue); |
878 wake_up(&master->sdo_queue); |
879 |
879 |
880 if (master->debug_level) |
880 if (master->debug_level) |
881 EC_DBG("Finished SDO request for slave %i.\n", |
881 EC_DBG("Finished SDO request for slave %i.\n", |
882 fsm->slave->ring_position); |
882 fsm->slave->ring_position); |