equal
deleted
inserted
replaced
236 down(&master->scan_sem); |
236 down(&master->scan_sem); |
237 if (!master->allow_scan) { |
237 if (!master->allow_scan) { |
238 up(&master->scan_sem); |
238 up(&master->scan_sem); |
239 } |
239 } |
240 else { |
240 else { |
241 master->scan_state = EC_REQUEST_IN_PROGRESS; |
241 master->scan_state = EC_REQUEST_BUSY; |
242 up(&master->scan_sem); |
242 up(&master->scan_sem); |
243 |
243 |
244 // topology change when scan is allowed: |
244 // topology change when scan is allowed: |
245 // clear all slaves and scan the bus |
245 // clear all slaves and scan the bus |
246 fsm->topology_change_pending = 0; |
246 fsm->topology_change_pending = 0; |
256 |
256 |
257 master->slave_count = datagram->working_counter; |
257 master->slave_count = datagram->working_counter; |
258 |
258 |
259 if (!master->slave_count) { |
259 if (!master->slave_count) { |
260 // no slaves present -> finish state machine. |
260 // no slaves present -> finish state machine. |
261 master->scan_state = EC_REQUEST_COMPLETE; |
261 master->scan_state = EC_REQUEST_SUCCESS; |
262 wake_up_interruptible(&master->scan_queue); |
262 wake_up_interruptible(&master->scan_queue); |
263 fsm->state = ec_fsm_master_state_end; |
263 fsm->state = ec_fsm_master_state_end; |
264 return; |
264 return; |
265 } |
265 } |
266 |
266 |
334 } |
334 } |
335 // get first request |
335 // get first request |
336 request = list_entry(master->eeprom_requests.next, |
336 request = list_entry(master->eeprom_requests.next, |
337 ec_eeprom_write_request_t, list); |
337 ec_eeprom_write_request_t, list); |
338 list_del_init(&request->list); // dequeue |
338 list_del_init(&request->list); // dequeue |
339 request->state = EC_REQUEST_IN_PROGRESS; |
339 request->state = EC_REQUEST_BUSY; |
340 up(&master->eeprom_sem); |
340 up(&master->eeprom_sem); |
341 |
341 |
342 slave = request->slave; |
342 slave = request->slave; |
343 if (slave->online_state == EC_SLAVE_OFFLINE) { |
343 if (slave->online_state == EC_SLAVE_OFFLINE) { |
344 EC_ERR("Discarding EEPROM data, slave %i offline.\n", |
344 EC_ERR("Discarding EEPROM data, slave %i offline.\n", |
384 list_for_each_entry(slave, &master->slaves, list) { |
384 list_for_each_entry(slave, &master->slaves, list) { |
385 if (!slave->config) |
385 if (!slave->config) |
386 continue; |
386 continue; |
387 list_for_each_entry(req, &slave->config->sdo_requests, list) { |
387 list_for_each_entry(req, &slave->config->sdo_requests, list) { |
388 if (req->state == EC_REQUEST_QUEUED) { |
388 if (req->state == EC_REQUEST_QUEUED) { |
389 req->state = EC_REQUEST_IN_PROGRESS; |
389 req->state = EC_REQUEST_BUSY; |
390 |
390 |
391 if (slave->current_state == EC_SLAVE_STATE_INIT || |
391 if (slave->current_state == EC_SLAVE_STATE_INIT || |
392 slave->error_flag) { |
392 slave->error_flag) { |
393 req->state = EC_REQUEST_FAILURE; |
393 req->state = EC_REQUEST_FAILURE; |
394 continue; |
394 continue; |
418 } |
418 } |
419 // get first request |
419 // get first request |
420 request = list_entry(master->slave_sdo_requests.next, |
420 request = list_entry(master->slave_sdo_requests.next, |
421 ec_master_sdo_request_t, list); |
421 ec_master_sdo_request_t, list); |
422 list_del_init(&request->list); // dequeue |
422 list_del_init(&request->list); // dequeue |
423 request->req.state = EC_REQUEST_IN_PROGRESS; |
423 request->req.state = EC_REQUEST_BUSY; |
424 up(&master->sdo_sem); |
424 up(&master->sdo_sem); |
425 |
425 |
426 slave = request->slave; |
426 slave = request->slave; |
427 if (slave->current_state == EC_SLAVE_STATE_INIT || |
427 if (slave->current_state == EC_SLAVE_STATE_INIT || |
428 slave->online_state == EC_SLAVE_OFFLINE || |
428 slave->online_state == EC_SLAVE_OFFLINE || |
497 } |
497 } |
498 |
498 |
499 if (fsm->config_error) |
499 if (fsm->config_error) |
500 master->config_state = EC_REQUEST_FAILURE; |
500 master->config_state = EC_REQUEST_FAILURE; |
501 else |
501 else |
502 master->config_state = EC_REQUEST_COMPLETE; |
502 master->config_state = EC_REQUEST_SUCCESS; |
503 wake_up_interruptible(&master->config_queue); |
503 wake_up_interruptible(&master->config_queue); |
504 return 0; |
504 return 0; |
505 } |
505 } |
506 |
506 |
507 /*****************************************************************************/ |
507 /*****************************************************************************/ |
520 |
520 |
521 down(&master->config_sem); |
521 down(&master->config_sem); |
522 if (!master->allow_config) { |
522 if (!master->allow_config) { |
523 up(&master->config_sem); |
523 up(&master->config_sem); |
524 } else { |
524 } else { |
525 master->config_state = EC_REQUEST_IN_PROGRESS; |
525 master->config_state = EC_REQUEST_BUSY; |
526 fsm->config_error = 0; |
526 fsm->config_error = 0; |
527 up(&master->config_sem); |
527 up(&master->config_sem); |
528 |
528 |
529 // check for pending slave configurations |
529 // check for pending slave configurations |
530 if (ec_fsm_master_action_configure(fsm)) |
530 if (ec_fsm_master_action_configure(fsm)) |
936 #ifdef EC_EOE |
936 #ifdef EC_EOE |
937 // check if EoE processing has to be started |
937 // check if EoE processing has to be started |
938 ec_master_eoe_start(master); |
938 ec_master_eoe_start(master); |
939 #endif |
939 #endif |
940 |
940 |
941 master->scan_state = EC_REQUEST_COMPLETE; |
941 master->scan_state = EC_REQUEST_SUCCESS; |
942 wake_up_interruptible(&master->scan_queue); |
942 wake_up_interruptible(&master->scan_queue); |
943 |
943 |
944 fsm->state = ec_fsm_master_state_end; |
944 fsm->state = ec_fsm_master_state_end; |
945 } |
945 } |
946 |
946 |
1005 |
1005 |
1006 // finished writing EEPROM |
1006 // finished writing EEPROM |
1007 if (master->debug_level) |
1007 if (master->debug_level) |
1008 EC_DBG("Finished writing %u words of EEPROM data to slave %u.\n", |
1008 EC_DBG("Finished writing %u words of EEPROM data to slave %u.\n", |
1009 request->word_size, slave->ring_position); |
1009 request->word_size, slave->ring_position); |
1010 request->state = EC_REQUEST_COMPLETE; |
1010 request->state = EC_REQUEST_SUCCESS; |
1011 wake_up(&master->eeprom_queue); |
1011 wake_up(&master->eeprom_queue); |
1012 |
1012 |
1013 // TODO: Evaluate new EEPROM contents! |
1013 // TODO: Evaluate new EEPROM contents! |
1014 |
1014 |
1015 // check for another EEPROM write request |
1015 // check for another EEPROM write request |
1070 fsm->state = ec_fsm_master_state_error; |
1070 fsm->state = ec_fsm_master_state_error; |
1071 return; |
1071 return; |
1072 } |
1072 } |
1073 |
1073 |
1074 // Sdo request finished |
1074 // Sdo request finished |
1075 request->state = EC_REQUEST_COMPLETE; |
1075 request->state = EC_REQUEST_SUCCESS; |
1076 wake_up(&master->sdo_queue); |
1076 wake_up(&master->sdo_queue); |
1077 |
1077 |
1078 if (master->debug_level) |
1078 if (master->debug_level) |
1079 EC_DBG("Finished Sdo request for slave %u.\n", |
1079 EC_DBG("Finished Sdo request for slave %u.\n", |
1080 fsm->slave->ring_position); |
1080 fsm->slave->ring_position); |