282 int ec_fsm_master_action_process_eeprom( |
282 int ec_fsm_master_action_process_eeprom( |
283 ec_fsm_master_t *fsm /**< master state machine */ |
283 ec_fsm_master_t *fsm /**< master state machine */ |
284 ) |
284 ) |
285 { |
285 { |
286 ec_master_t *master = fsm->master; |
286 ec_master_t *master = fsm->master; |
287 ec_eeprom_write_request_t *request, *next; |
287 ec_eeprom_write_request_t *request; |
288 ec_slave_t *slave; |
288 ec_slave_t *slave; |
289 |
289 |
290 down(&master->eeprom_sem); |
290 // search the first request to be processed |
291 list_for_each_entry_safe(request, next, &master->eeprom_requests, list) { |
291 while (1) { |
|
292 down(&master->eeprom_sem); |
|
293 if (list_empty(&master->eeprom_requests)) { |
|
294 up(&master->eeprom_sem); |
|
295 break; |
|
296 } |
|
297 // get first request |
|
298 request = list_entry(master->eeprom_requests.next, |
|
299 ec_eeprom_write_request_t, list); |
292 list_del_init(&request->list); // dequeue |
300 list_del_init(&request->list); // dequeue |
293 up(&master->eeprom_sem); |
301 up(&master->eeprom_sem); |
294 |
302 |
295 slave = request->slave; |
303 slave = request->slave; |
296 if (!slave->online || slave->error_flag) { |
304 if (!slave->online || slave->error_flag) { |
297 EC_ERR("Discarding EEPROM data, slave %i not ready.\n", |
305 EC_ERR("Discarding EEPROM data, slave %i not ready.\n", |
298 slave->ring_position); |
306 slave->ring_position); |
299 request->state = EC_EEPROM_REQ_ERROR; |
307 request->state = EC_EEPROM_REQ_ERROR; |
300 wake_up_interruptible(&master->eeprom_queue); |
308 wake_up_interruptible(&master->eeprom_queue); |
301 down(&master->eeprom_sem); |
|
302 continue; |
309 continue; |
303 } |
310 } |
304 |
311 |
305 // found pending EEPROM write operation. execute it! |
312 // found pending EEPROM write operation. execute it! |
306 EC_INFO("Writing EEPROM of slave %i...\n", slave->ring_position); |
313 EC_INFO("Writing EEPROM of slave %i...\n", slave->ring_position); |