master/fsm_master.c
changeset 861 6e3de145421a
parent 859 233e32f428e1
child 872 d4e0380d63b3
equal deleted inserted replaced
860:ba5c38f0bb30 861:6e3de145421a
   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);