master/fsm_master.c
changeset 604 74ceacf42710
parent 603 7f281d7372c6
child 605 96a894895999
equal deleted inserted replaced
603:7f281d7372c6 604:74ceacf42710
   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);
   311         fsm->state = ec_fsm_master_state_write_eeprom;
   318         fsm->state = ec_fsm_master_state_write_eeprom;
   312         fsm->state(fsm); // execute immediately
   319         fsm->state(fsm); // execute immediately
   313         return 1;
   320         return 1;
   314     }
   321     }
   315 
   322 
   316     up(&master->eeprom_sem);
       
   317     return 0;
   323     return 0;
   318 }
   324 }
   319 
   325 
   320 /*****************************************************************************/
   326 /*****************************************************************************/
   321 
   327