master/fsm_master.c
changeset 649 a4d3fffdaed7
parent 646 fbbd4e54e031
child 650 c68995623e94
equal deleted inserted replaced
648:0a6d38ec463f 649:a4d3fffdaed7
   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);