master/fsm_master.c
changeset 661 bc1de1362efb
parent 656 370aa8c2d1b1
child 713 ae41cadd25b6
equal deleted inserted replaced
660:582a90a34303 661:bc1de1362efb
    39 /*****************************************************************************/
    39 /*****************************************************************************/
    40 
    40 
    41 #include "globals.h"
    41 #include "globals.h"
    42 #include "master.h"
    42 #include "master.h"
    43 #include "mailbox.h"
    43 #include "mailbox.h"
       
    44 #include "ethernet.h"
    44 #include "fsm_master.h"
    45 #include "fsm_master.h"
    45 
    46 
    46 /*****************************************************************************/
    47 /*****************************************************************************/
    47 
    48 
    48 void ec_fsm_master_state_start(ec_fsm_master_t *);
    49 void ec_fsm_master_state_start(ec_fsm_master_t *);
   236             fsm->tainted = 0;
   237             fsm->tainted = 0;
   237             fsm->idle = 0;
   238             fsm->idle = 0;
   238             fsm->scan_jiffies = jiffies;
   239             fsm->scan_jiffies = jiffies;
   239 
   240 
   240             ec_master_eoe_stop(master);
   241             ec_master_eoe_stop(master);
       
   242             ec_master_clear_eoe_handlers(master);
   241             ec_master_destroy_slaves(master);
   243             ec_master_destroy_slaves(master);
   242 
   244 
   243             master->slave_count = datagram->working_counter;
   245             master->slave_count = datagram->working_counter;
   244 
   246 
   245             if (!master->slave_count) {
   247             if (!master->slave_count) {
   481         // check for pending slave configurations
   483         // check for pending slave configurations
   482         if (ec_fsm_master_action_configure(fsm))
   484         if (ec_fsm_master_action_configure(fsm))
   483             return;
   485             return;
   484     }
   486     }
   485 
   487 
   486     // Check, if EoE processing has to be started
       
   487     ec_master_eoe_start(master);
       
   488 
       
   489     // Check for a pending SDO request
   488     // Check for a pending SDO request
   490     if (ec_fsm_master_action_process_sdo(fsm))
   489     if (ec_fsm_master_action_process_sdo(fsm))
   491         return;
   490         return;
   492 
   491 
   493     if (master->mode == EC_MASTER_MODE_IDLE) {
   492     if (master->mode == EC_MASTER_MODE_IDLE) {
   807     ec_slave_t *slave = fsm->slave;
   806     ec_slave_t *slave = fsm->slave;
   808 
   807 
   809     if (ec_fsm_slave_exec(&fsm->fsm_slave)) // execute slave state machine
   808     if (ec_fsm_slave_exec(&fsm->fsm_slave)) // execute slave state machine
   810         return;
   809         return;
   811 
   810 
       
   811     if (slave->sii_mailbox_protocols & EC_MBOX_EOE) {
       
   812         // create EoE handler for this slave
       
   813         ec_eoe_t *eoe;
       
   814         if (!(eoe = kmalloc(sizeof(ec_eoe_t), GFP_KERNEL))) {
       
   815             EC_ERR("Failed to allocate EoE handler memory for slave %u!\n",
       
   816                     slave->ring_position);
       
   817         }
       
   818         else if (ec_eoe_init(eoe, slave)) {
       
   819             EC_ERR("Failed to init EoE handler for slave %u!\n",
       
   820                     slave->ring_position);
       
   821             kfree(eoe);
       
   822         }
       
   823         else {
       
   824             list_add_tail(&eoe->list, &master->eoe_handlers);
       
   825         }
       
   826     }
       
   827 
   812     // another slave to fetch?
   828     // another slave to fetch?
   813     if (slave->list.next != &master->slaves) {
   829     if (slave->list.next != &master->slaves) {
   814         fsm->slave = list_entry(slave->list.next, ec_slave_t, list);
   830         fsm->slave = list_entry(slave->list.next, ec_slave_t, list);
   815         ec_fsm_slave_start_scan(&fsm->fsm_slave, fsm->slave);
   831         ec_fsm_slave_start_scan(&fsm->fsm_slave, fsm->slave);
   816         ec_fsm_slave_exec(&fsm->fsm_slave); // execute immediately
   832         ec_fsm_slave_exec(&fsm->fsm_slave); // execute immediately
   817         return;
   833         return;
   818     }
   834     }
   819 
   835 
   820     EC_INFO("Bus scanning completed in %u ms.\n",
   836     EC_INFO("Bus scanning completed in %u ms.\n",
   821             (u32) (jiffies - fsm->scan_jiffies) * 1000 / HZ);
   837             (u32) (jiffies - fsm->scan_jiffies) * 1000 / HZ);
       
   838 
       
   839     // check if EoE processing has to be started
       
   840     ec_master_eoe_start(master);
       
   841 
   822     master->scan_state = EC_REQUEST_COMPLETE;
   842     master->scan_state = EC_REQUEST_COMPLETE;
   823     wake_up_interruptible(&master->scan_queue);
   843     wake_up_interruptible(&master->scan_queue);
   824 
   844 
   825     fsm->state = ec_fsm_master_state_end;
   845     fsm->state = ec_fsm_master_state_end;
   826 }
   846 }