master/fsm_master.c
changeset 2589 2b9c78543663
parent 2414 f35c7c8e6591
child 2600 1a969896d52e
equal deleted inserted replaced
2415:af21f0bdc7c9 2589:2b9c78543663
     1 /******************************************************************************
     1 /******************************************************************************
     2  *
     2  *
     3  *  $Id$
     3  *  $Id$
     4  *
     4  *
     5  *  Copyright (C) 2006-2008  Florian Pose, Ingenieurgemeinschaft IgH
     5  *  Copyright (C) 2006-2012  Florian Pose, Ingenieurgemeinschaft IgH
     6  *
     6  *
     7  *  This file is part of the IgH EtherCAT Master.
     7  *  This file is part of the IgH EtherCAT Master.
     8  *
     8  *
     9  *  The IgH EtherCAT Master is free software; you can redistribute it and/or
     9  *  The IgH EtherCAT Master is free software; you can redistribute it and/or
    10  *  modify it under the terms of the GNU General Public License version 2, as
    10  *  modify it under the terms of the GNU General Public License version 2, as
    46 
    46 
    47 /*****************************************************************************/
    47 /*****************************************************************************/
    48 
    48 
    49 /** Time difference [ns] to tolerate without setting a new system time offset.
    49 /** Time difference [ns] to tolerate without setting a new system time offset.
    50  */
    50  */
    51 #ifdef EC_HAVE_CYCLES
    51 #define EC_SYSTEM_TIME_TOLERANCE_NS 1000000
    52 #define EC_SYSTEM_TIME_TOLERANCE_NS 10000
       
    53 #else
       
    54 #define EC_SYSTEM_TIME_TOLERANCE_NS 100000000
       
    55 #endif
       
    56 
    52 
    57 /*****************************************************************************/
    53 /*****************************************************************************/
    58 
    54 
    59 void ec_fsm_master_state_start(ec_fsm_master_t *);
    55 void ec_fsm_master_state_start(ec_fsm_master_t *);
    60 void ec_fsm_master_state_broadcast(ec_fsm_master_t *);
    56 void ec_fsm_master_state_broadcast(ec_fsm_master_t *);
    67 void ec_fsm_master_state_dc_read_offset(ec_fsm_master_t *);
    63 void ec_fsm_master_state_dc_read_offset(ec_fsm_master_t *);
    68 void ec_fsm_master_state_dc_write_offset(ec_fsm_master_t *);
    64 void ec_fsm_master_state_dc_write_offset(ec_fsm_master_t *);
    69 void ec_fsm_master_state_write_sii(ec_fsm_master_t *);
    65 void ec_fsm_master_state_write_sii(ec_fsm_master_t *);
    70 void ec_fsm_master_state_sdo_dictionary(ec_fsm_master_t *);
    66 void ec_fsm_master_state_sdo_dictionary(ec_fsm_master_t *);
    71 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *);
    67 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *);
    72 void ec_fsm_master_state_reg_request(ec_fsm_master_t *);
    68 
    73 
    69 void ec_fsm_master_enter_clear_addresses(ec_fsm_master_t *);
    74 void ec_fsm_master_enter_write_system_times(ec_fsm_master_t *);
    70 void ec_fsm_master_enter_write_system_times(ec_fsm_master_t *);
    75 
    71 
    76 /*****************************************************************************/
    72 /*****************************************************************************/
    77 
    73 
    78 /** Constructor.
    74 /** Constructor.
    83         ec_datagram_t *datagram /**< Datagram object to use. */
    79         ec_datagram_t *datagram /**< Datagram object to use. */
    84         )
    80         )
    85 {
    81 {
    86     fsm->master = master;
    82     fsm->master = master;
    87     fsm->datagram = datagram;
    83     fsm->datagram = datagram;
    88     fsm->mbox = &master->fsm_mbox;
    84 
    89     fsm->state = ec_fsm_master_state_start;
    85     ec_fsm_master_reset(fsm);
    90     fsm->idle = 0;
       
    91     fsm->link_state = 0;
       
    92     fsm->slaves_responding = 0;
       
    93     fsm->rescan_required = 0;
       
    94     fsm->slave_states = EC_SLAVE_STATE_UNKNOWN;
       
    95 
    86 
    96     // init sub-state-machines
    87     // init sub-state-machines
    97     ec_fsm_coe_init(&fsm->fsm_coe, fsm->mbox);
    88     ec_fsm_coe_init(&fsm->fsm_coe);
       
    89     ec_fsm_soe_init(&fsm->fsm_soe);
    98     ec_fsm_pdo_init(&fsm->fsm_pdo, &fsm->fsm_coe);
    90     ec_fsm_pdo_init(&fsm->fsm_pdo, &fsm->fsm_coe);
    99     ec_fsm_change_init(&fsm->fsm_change, fsm->datagram);
    91     ec_fsm_change_init(&fsm->fsm_change, fsm->datagram);
   100     ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram,
    92     ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram,
   101             &fsm->fsm_change, &fsm->fsm_coe, &fsm->fsm_pdo);
    93             &fsm->fsm_change, &fsm->fsm_coe, &fsm->fsm_soe, &fsm->fsm_pdo);
   102     ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram,
    94     ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram,
   103             &fsm->fsm_slave_config, &fsm->fsm_pdo);
    95             &fsm->fsm_slave_config, &fsm->fsm_pdo);
   104     ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram);
    96     ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram);
   105 }
    97 }
   106 
    98 
   112         ec_fsm_master_t *fsm /**< Master state machine. */
   104         ec_fsm_master_t *fsm /**< Master state machine. */
   113         )
   105         )
   114 {
   106 {
   115     // clear sub-state machines
   107     // clear sub-state machines
   116     ec_fsm_coe_clear(&fsm->fsm_coe);
   108     ec_fsm_coe_clear(&fsm->fsm_coe);
       
   109     ec_fsm_soe_clear(&fsm->fsm_soe);
   117     ec_fsm_pdo_clear(&fsm->fsm_pdo);
   110     ec_fsm_pdo_clear(&fsm->fsm_pdo);
   118     ec_fsm_change_clear(&fsm->fsm_change);
   111     ec_fsm_change_clear(&fsm->fsm_change);
   119     ec_fsm_slave_config_clear(&fsm->fsm_slave_config);
   112     ec_fsm_slave_config_clear(&fsm->fsm_slave_config);
   120     ec_fsm_slave_scan_clear(&fsm->fsm_slave_scan);
   113     ec_fsm_slave_scan_clear(&fsm->fsm_slave_scan);
   121     ec_fsm_sii_clear(&fsm->fsm_sii);
   114     ec_fsm_sii_clear(&fsm->fsm_sii);
   122 }
   115 }
   123 
   116 
   124 /*****************************************************************************/
   117 /*****************************************************************************/
   125 
   118 
       
   119 /** Reset state machine.
       
   120  */
       
   121 void ec_fsm_master_reset(
       
   122         ec_fsm_master_t *fsm /**< Master state machine. */
       
   123         )
       
   124 {
       
   125     ec_device_index_t dev_idx;
       
   126 
       
   127     fsm->state = ec_fsm_master_state_start;
       
   128     fsm->idle = 0;
       
   129     fsm->dev_idx = EC_DEVICE_MAIN;
       
   130 
       
   131     for (dev_idx = EC_DEVICE_MAIN;
       
   132             dev_idx < ec_master_num_devices(fsm->master); dev_idx++) {
       
   133         fsm->link_state[dev_idx] = 0;
       
   134         fsm->slaves_responding[dev_idx] = 0;
       
   135         fsm->slave_states[dev_idx] = EC_SLAVE_STATE_UNKNOWN;
       
   136     }
       
   137 
       
   138     fsm->rescan_required = 0;
       
   139 }
       
   140 
       
   141 /*****************************************************************************/
       
   142 
   126 /** Executes the current state of the state machine.
   143 /** Executes the current state of the state machine.
   127  *
   144  *
   128  * If the state machine's datagram is not sent or received yet, the execution
   145  * If the state machine's datagram is not sent or received yet, the execution
   129  * of the state machine is delayed to the next cycle.
   146  * of the state machine is delayed to the next cycle.
   130  *
   147  *
   132  */
   149  */
   133 int ec_fsm_master_exec(
   150 int ec_fsm_master_exec(
   134         ec_fsm_master_t *fsm /**< Master state machine. */
   151         ec_fsm_master_t *fsm /**< Master state machine. */
   135         )
   152         )
   136 {
   153 {
   137     if (ec_mbox_is_datagram_state(fsm->mbox, EC_DATAGRAM_QUEUED)
   154     if (fsm->datagram->state == EC_DATAGRAM_SENT
   138         || ec_mbox_is_datagram_state(fsm->mbox, EC_DATAGRAM_SENT)) {
   155         || fsm->datagram->state == EC_DATAGRAM_QUEUED) {
   139         // datagram was not sent or received yet.
   156         // datagram was not sent or received yet.
   140         return 0;
   157         return 0;
   141     }
   158     }
   142 
   159 
   143     fsm->state(fsm);
   160     fsm->state(fsm);
   162  */
   179  */
   163 void ec_fsm_master_restart(
   180 void ec_fsm_master_restart(
   164         ec_fsm_master_t *fsm /**< Master state machine. */
   181         ec_fsm_master_t *fsm /**< Master state machine. */
   165         )
   182         )
   166 {
   183 {
       
   184     fsm->dev_idx = EC_DEVICE_MAIN;
   167     fsm->state = ec_fsm_master_state_start;
   185     fsm->state = ec_fsm_master_state_start;
   168     fsm->state(fsm); // execute immediately
   186     fsm->state(fsm); // execute immediately
   169 }
   187 }
   170 
   188 
   171 /******************************************************************************
   189 /******************************************************************************
   178  */
   196  */
   179 void ec_fsm_master_state_start(
   197 void ec_fsm_master_state_start(
   180         ec_fsm_master_t *fsm /**< Master state machine. */
   198         ec_fsm_master_t *fsm /**< Master state machine. */
   181         )
   199         )
   182 {
   200 {
       
   201     ec_master_t *master = fsm->master;
       
   202 
   183     fsm->idle = 1;
   203     fsm->idle = 1;
       
   204 
       
   205     // check for emergency requests
       
   206     if (!list_empty(&master->emerg_reg_requests)) {
       
   207         ec_reg_request_t *request;
       
   208 
       
   209         // get first request
       
   210         request = list_entry(master->emerg_reg_requests.next,
       
   211                 ec_reg_request_t, list);
       
   212         list_del_init(&request->list); // dequeue
       
   213         request->state = EC_INT_REQUEST_BUSY;
       
   214 
       
   215         if (request->transfer_size > fsm->datagram->mem_size) {
       
   216             EC_MASTER_ERR(master, "Emergency request data too large!\n");
       
   217             request->state = EC_INT_REQUEST_FAILURE;
       
   218             wake_up_all(&master->request_queue);
       
   219             fsm->state(fsm); // continue
       
   220             return;
       
   221         }
       
   222 
       
   223         if (request->dir != EC_DIR_OUTPUT) {
       
   224             EC_MASTER_ERR(master, "Emergency requests must be"
       
   225                     " write requests!\n");
       
   226             request->state = EC_INT_REQUEST_FAILURE;
       
   227             wake_up_all(&master->request_queue);
       
   228             fsm->state(fsm); // continue
       
   229             return;
       
   230         }
       
   231 
       
   232         EC_MASTER_DBG(master, 1, "Writing emergency register request...\n");
       
   233         ec_datagram_apwr(fsm->datagram, request->ring_position,
       
   234                 request->address, request->transfer_size);
       
   235         memcpy(fsm->datagram->data, request->data, request->transfer_size);
       
   236         fsm->datagram->device_index = EC_DEVICE_MAIN;
       
   237         request->state = EC_INT_REQUEST_SUCCESS;
       
   238         wake_up_all(&master->request_queue);
       
   239         return;
       
   240     }
       
   241 
   184     ec_datagram_brd(fsm->datagram, 0x0130, 2);
   242     ec_datagram_brd(fsm->datagram, 0x0130, 2);
   185     ec_datagram_zero(fsm->datagram);
   243     ec_datagram_zero(fsm->datagram);
       
   244     fsm->datagram->device_index = fsm->dev_idx;
   186     fsm->state = ec_fsm_master_state_broadcast;
   245     fsm->state = ec_fsm_master_state_broadcast;
   187 }
   246 }
   188 
   247 
   189 /*****************************************************************************/
   248 /*****************************************************************************/
   190 
   249 
   199     ec_datagram_t *datagram = fsm->datagram;
   258     ec_datagram_t *datagram = fsm->datagram;
   200     unsigned int i, size;
   259     unsigned int i, size;
   201     ec_slave_t *slave;
   260     ec_slave_t *slave;
   202     ec_master_t *master = fsm->master;
   261     ec_master_t *master = fsm->master;
   203 
   262 
   204     if (datagram->state == EC_DATAGRAM_TIMED_OUT)
       
   205         return; // always retry
       
   206 
       
   207     // bus topology change?
   263     // bus topology change?
   208     if (datagram->working_counter != fsm->slaves_responding) {
   264     if (datagram->working_counter != fsm->slaves_responding[fsm->dev_idx]) {
   209         fsm->rescan_required = 1;
   265         fsm->rescan_required = 1;
   210         fsm->slaves_responding = datagram->working_counter;
   266         fsm->slaves_responding[fsm->dev_idx] = datagram->working_counter;
   211         EC_MASTER_INFO(master, "%u slave(s) responding.\n",
   267         EC_MASTER_INFO(master, "%u slave(s) responding on %s device.\n",
   212                 fsm->slaves_responding);
   268                 fsm->slaves_responding[fsm->dev_idx],
   213     }
   269                 ec_device_names[fsm->dev_idx != 0]);
   214 
   270     }
   215     if (fsm->link_state && !master->main_device.link_state) {
   271 
   216         // link went down
   272     if (fsm->link_state[fsm->dev_idx] &&
       
   273             !master->devices[fsm->dev_idx].link_state) {
       
   274         ec_device_index_t dev_idx;
       
   275 
   217         EC_MASTER_DBG(master, 1, "Master state machine detected "
   276         EC_MASTER_DBG(master, 1, "Master state machine detected "
   218                 "link down. Clearing slave list.\n");
   277                 "link down on %s device. Clearing slave list.\n",
   219 
   278                 ec_device_names[fsm->dev_idx != 0]);
       
   279 
       
   280 #ifdef EC_EOE
       
   281         ec_master_eoe_stop(master);
       
   282         ec_master_clear_eoe_handlers(master);
       
   283 #endif
   220         ec_master_clear_slaves(master);
   284         ec_master_clear_slaves(master);
   221         fsm->slave_states = 0x00;
   285 
   222         fsm->slaves_responding = 0; /* reset to trigger rescan on next link
   286         for (dev_idx = EC_DEVICE_MAIN;
   223                                        up. */
   287                 dev_idx < ec_master_num_devices(master); dev_idx++) {
   224     }
   288             fsm->slave_states[dev_idx] = 0x00;
   225     fsm->link_state = master->main_device.link_state;
   289             fsm->slaves_responding[dev_idx] = 0; /* Reset to trigger rescan on
   226 
   290                                                     next link up. */
   227     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   291         }
   228         ec_fsm_master_restart(fsm);
   292     }
   229         return;
   293     fsm->link_state[fsm->dev_idx] = master->devices[fsm->dev_idx].link_state;
   230     }
   294 
   231 
   295     if (datagram->state == EC_DATAGRAM_RECEIVED &&
   232     if (fsm->slaves_responding) {
   296             fsm->slaves_responding[fsm->dev_idx]) {
   233         uint8_t states = EC_READ_U8(datagram->data);
   297         uint8_t states = EC_READ_U8(datagram->data);
   234         if (states != fsm->slave_states) { // slave states changed?
   298         if (states != fsm->slave_states[fsm->dev_idx]) {
       
   299             // slave states changed
   235             char state_str[EC_STATE_STRING_SIZE];
   300             char state_str[EC_STATE_STRING_SIZE];
   236             fsm->slave_states = states;
   301             fsm->slave_states[fsm->dev_idx] = states;
   237             ec_state_string(fsm->slave_states, state_str, 1);
   302             ec_state_string(states, state_str, 1);
   238             EC_MASTER_INFO(master, "Slave states: %s.\n", state_str);
   303             EC_MASTER_INFO(master, "Slave states on %s device: %s.\n",
       
   304                     ec_device_names[fsm->dev_idx != 0], state_str);
   239         }
   305         }
   240     } else {
   306     } else {
   241         fsm->slave_states = 0x00;
   307         fsm->slave_states[fsm->dev_idx] = 0x00;
       
   308     }
       
   309 
       
   310     fsm->dev_idx++;
       
   311     if (fsm->dev_idx < ec_master_num_devices(master)) {
       
   312         // check number of responding slaves on next device
       
   313         fsm->state = ec_fsm_master_state_start;
       
   314         fsm->state(fsm); // execute immediately
       
   315         return;
   242     }
   316     }
   243 
   317 
   244     if (fsm->rescan_required) {
   318     if (fsm->rescan_required) {
   245         ec_mutex_lock(&master->scan_mutex);
   319         down(&master->scan_sem);
   246         if (!master->allow_scan) {
   320         if (!master->allow_scan) {
   247             ec_mutex_unlock(&master->scan_mutex);
   321             up(&master->scan_sem);
   248         } else {
   322         } else {
       
   323             unsigned int count = 0, next_dev_slave, ring_position;
       
   324             ec_device_index_t dev_idx;
       
   325 
   249             master->scan_busy = 1;
   326             master->scan_busy = 1;
   250             ec_mutex_unlock(&master->scan_mutex);
   327             up(&master->scan_sem);
   251 
   328 
   252             // clear all slaves and scan the bus
   329             // clear all slaves and scan the bus
   253             fsm->rescan_required = 0;
   330             fsm->rescan_required = 0;
   254             fsm->idle = 0;
   331             fsm->idle = 0;
   255             fsm->scan_jiffies = jiffies;
   332             fsm->scan_jiffies = jiffies;
   256 
   333 
   257 #ifdef EC_EOE
   334 #ifdef EC_EOE
       
   335             ec_master_eoe_stop(master);
   258             ec_master_clear_eoe_handlers(master);
   336             ec_master_clear_eoe_handlers(master);
   259 #endif
   337 #endif
   260             ec_master_clear_slaves(master);
   338             ec_master_clear_slaves(master);
   261 
   339 
   262             master->slave_count = fsm->slaves_responding;
   340             for (dev_idx = EC_DEVICE_MAIN;
   263 
   341                     dev_idx < ec_master_num_devices(master); dev_idx++) {
   264             if (!master->slave_count) {
   342                 count += fsm->slaves_responding[dev_idx];
       
   343             }
       
   344 
       
   345             if (!count) {
   265                 // no slaves present -> finish state machine.
   346                 // no slaves present -> finish state machine.
   266                 master->scan_busy = 0;
   347                 master->scan_busy = 0;
   267                 wake_up_interruptible(&master->scan_queue);
   348                 wake_up_interruptible(&master->scan_queue);
   268                 ec_fsm_master_restart(fsm);
   349                 ec_fsm_master_restart(fsm);
   269                 return;
   350                 return;
   270             }
   351             }
   271 
   352 
   272             size = sizeof(ec_slave_t) * master->slave_count;
   353             size = sizeof(ec_slave_t) * count;
   273             if (!(master->slaves =
   354             if (!(master->slaves =
   274                         (ec_slave_t *) kmalloc(size, GFP_KERNEL))) {
   355                         (ec_slave_t *) kmalloc(size, GFP_KERNEL))) {
   275                 EC_MASTER_ERR(master, "Failed to allocate %u bytes"
   356                 EC_MASTER_ERR(master, "Failed to allocate %u bytes"
   276                         " of slave memory!\n", size);
   357                         " of slave memory!\n", size);
   277                 master->slave_count = 0; // TODO avoid retrying scan!
       
   278                 master->scan_busy = 0;
   358                 master->scan_busy = 0;
   279                 wake_up_interruptible(&master->scan_queue);
   359                 wake_up_interruptible(&master->scan_queue);
   280                 ec_fsm_master_restart(fsm);
   360                 ec_fsm_master_restart(fsm);
   281                 return;
   361                 return;
   282             }
   362             }
   283 
   363 
   284             // init slaves
   364             // init slaves
   285             for (i = 0; i < master->slave_count; i++) {
   365             dev_idx = EC_DEVICE_MAIN;
       
   366             next_dev_slave = fsm->slaves_responding[dev_idx];
       
   367             ring_position = 0;
       
   368             for (i = 0; i < count; i++, ring_position++) {
   286                 slave = master->slaves + i;
   369                 slave = master->slaves + i;
   287                 ec_slave_init(slave, master, i, i + 1);
   370                 while (i >= next_dev_slave) {
       
   371                     dev_idx++;
       
   372                     next_dev_slave += fsm->slaves_responding[dev_idx];
       
   373                     ring_position = 0;
       
   374                 }
       
   375 
       
   376                 ec_slave_init(slave, master, dev_idx, ring_position, i + 1);
   288 
   377 
   289                 // do not force reconfiguration in operation phase to avoid
   378                 // do not force reconfiguration in operation phase to avoid
   290                 // unnecesssary process data interruptions
   379                 // unnecesssary process data interruptions
   291                 if (master->phase != EC_OPERATION)
   380                 if (master->phase != EC_OPERATION) {
   292                     slave->force_config = 1;
   381                     slave->force_config = 1;
       
   382                 }
   293             }
   383             }
   294 
   384             master->slave_count = count;
   295             // broadcast clear all station addresses
   385             master->fsm_slave = master->slaves;
   296             ec_datagram_bwr(datagram, 0x0010, 2);
   386 
   297             EC_WRITE_U16(datagram->data, 0x0000);
   387             /* start with first device with slaves responding; at least one
   298             fsm->retries = EC_FSM_RETRIES;
   388              * has responding slaves, otherwise count would be zero. */
   299             fsm->state = ec_fsm_master_state_clear_addresses;
   389             fsm->dev_idx = EC_DEVICE_MAIN;
       
   390             while (!fsm->slaves_responding[fsm->dev_idx]) {
       
   391                 fsm->dev_idx++;
       
   392             }
       
   393 
       
   394             ec_fsm_master_enter_clear_addresses(fsm);
   300             return;
   395             return;
   301         }
   396         }
   302     }
   397     }
   303 
   398 
   304     if (master->slave_count) {
   399     if (master->slave_count) {
   316             // fetch state from first slave
   411             // fetch state from first slave
   317             fsm->slave = master->slaves;
   412             fsm->slave = master->slaves;
   318             ec_datagram_fprd(fsm->datagram, fsm->slave->station_address,
   413             ec_datagram_fprd(fsm->datagram, fsm->slave->station_address,
   319                     0x0130, 2);
   414                     0x0130, 2);
   320             ec_datagram_zero(datagram);
   415             ec_datagram_zero(datagram);
       
   416             fsm->datagram->device_index = fsm->slave->device_index;
   321             fsm->retries = EC_FSM_RETRIES;
   417             fsm->retries = EC_FSM_RETRIES;
   322             fsm->state = ec_fsm_master_state_read_state;
   418             fsm->state = ec_fsm_master_state_read_state;
   323         }
   419         }
   324     } else {
   420     } else {
   325         ec_fsm_master_restart(fsm);
   421         ec_fsm_master_restart(fsm);
   364     return 0;
   460     return 0;
   365 }
   461 }
   366 
   462 
   367 /*****************************************************************************/
   463 /*****************************************************************************/
   368 
   464 
   369 /** Check for pending register requests and process one.
       
   370  *
       
   371  * \return non-zero, if a register request is processed.
       
   372  */
       
   373 int ec_fsm_master_action_process_register(
       
   374         ec_fsm_master_t *fsm /**< Master state machine. */
       
   375         )
       
   376 {
       
   377     ec_master_t *master = fsm->master;
       
   378     ec_reg_request_t *request;
       
   379 
       
   380     // search the first request to be processed
       
   381     while (!list_empty(&master->reg_requests)) {
       
   382 
       
   383         // get first request
       
   384         request = list_entry(master->reg_requests.next,
       
   385                 ec_reg_request_t, list);
       
   386         list_del_init(&request->list); // dequeue
       
   387         request->state = EC_INT_REQUEST_BUSY;
       
   388 
       
   389         // found pending request; process it!
       
   390         EC_SLAVE_DBG(request->slave, 1, "Processing register request, "
       
   391                 "offset 0x%04x, length %zu...\n",
       
   392                 request->offset, request->length);
       
   393 
       
   394         if (request->length > fsm->datagram->mem_size) {
       
   395             EC_MASTER_ERR(master, "Request length (%zu) exceeds maximum "
       
   396                     "datagram size (%zu)!\n", request->length,
       
   397                     fsm->datagram->mem_size);
       
   398             request->state = EC_INT_REQUEST_FAILURE;
       
   399             kref_put(&request->refcount, ec_master_reg_request_release);
       
   400             wake_up(&master->reg_queue);
       
   401             continue;
       
   402         }
       
   403 
       
   404         fsm->reg_request = request;
       
   405 
       
   406         if (request->dir == EC_DIR_INPUT) {
       
   407             ec_datagram_fprd(fsm->datagram, request->slave->station_address,
       
   408                     request->offset, request->length);
       
   409             ec_datagram_zero(fsm->datagram);
       
   410         } else {
       
   411             ec_datagram_fpwr(fsm->datagram, request->slave->station_address,
       
   412                     request->offset, request->length);
       
   413             memcpy(fsm->datagram->data, request->data, request->length);
       
   414         }
       
   415         fsm->retries = EC_FSM_RETRIES;
       
   416         fsm->state = ec_fsm_master_state_reg_request;
       
   417         return 1;
       
   418     }
       
   419 
       
   420     return 0;
       
   421 }
       
   422 
       
   423 /*****************************************************************************/
       
   424 
       
   425 /** Check for pending SDO requests and process one.
   465 /** Check for pending SDO requests and process one.
   426  *
   466  *
   427  * \return non-zero, if an SDO request is processed.
   467  * \return non-zero, if an SDO request is processed.
   428  */
   468  */
   429 int ec_fsm_master_action_process_sdo(
   469 int ec_fsm_master_action_process_sdo(
   436 
   476 
   437     // search for internal requests to be processed
   477     // search for internal requests to be processed
   438     for (slave = master->slaves;
   478     for (slave = master->slaves;
   439             slave < master->slaves + master->slave_count;
   479             slave < master->slaves + master->slave_count;
   440             slave++) {
   480             slave++) {
   441         if (!slave->config)
   481 
       
   482         if (!slave->config) {
   442             continue;
   483             continue;
       
   484         }
       
   485 
   443         list_for_each_entry(req, &slave->config->sdo_requests, list) {
   486         list_for_each_entry(req, &slave->config->sdo_requests, list) {
   444             if (req->state == EC_INT_REQUEST_QUEUED) {
   487             if (req->state == EC_INT_REQUEST_QUEUED) {
   445 
   488 
   446                 if (ec_sdo_request_timed_out(req)) {
   489                 if (ec_sdo_request_timed_out(req)) {
   447                     req->state = EC_INT_REQUEST_FAILURE;
   490                     req->state = EC_INT_REQUEST_FAILURE;
   461                 fsm->idle = 0;
   504                 fsm->idle = 0;
   462                 fsm->sdo_request = req;
   505                 fsm->sdo_request = req;
   463                 fsm->slave = slave;
   506                 fsm->slave = slave;
   464                 fsm->state = ec_fsm_master_state_sdo_request;
   507                 fsm->state = ec_fsm_master_state_sdo_request;
   465                 ec_fsm_coe_transfer(&fsm->fsm_coe, slave, req);
   508                 ec_fsm_coe_transfer(&fsm->fsm_coe, slave, req);
   466                 ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
   509                 ec_fsm_coe_exec(&fsm->fsm_coe, fsm->datagram);
   467                 return 1;
   510                 return 1;
   468             }
   511             }
   469         }
   512         }
   470     }
   513     }
   471     return 0;
   514     return 0;
   472 }
   515 }
   473 
   516 
   474 
       
   475 /*****************************************************************************/
   517 /*****************************************************************************/
   476 
   518 
   477 /** Master action: IDLE.
   519 /** Master action: IDLE.
   478  *
   520  *
   479  * Does secondary work.
   521  * Does secondary work.
   484 {
   526 {
   485     ec_master_t *master = fsm->master;
   527     ec_master_t *master = fsm->master;
   486     ec_slave_t *slave;
   528     ec_slave_t *slave;
   487 
   529 
   488     // Check for pending internal SDO requests
   530     // Check for pending internal SDO requests
   489     if (ec_fsm_master_action_process_sdo(fsm))
   531     if (ec_fsm_master_action_process_sdo(fsm)) {
   490         return;
   532         return;
       
   533     }
   491 
   534 
   492     // enable processing of requests
   535     // enable processing of requests
   493     for (slave = master->slaves;
   536     for (slave = master->slaves;
   494             slave < master->slaves + master->slave_count;
   537             slave < master->slaves + master->slave_count;
   495             slave++) {
   538             slave++) {
   496         ec_fsm_slave_ready(&slave->fsm);
   539         ec_fsm_slave_set_ready(&slave->fsm);
   497     }
   540     }
   498 
   541 
   499     // check, if slaves have an SDO dictionary to read out.
   542     // check, if slaves have an SDO dictionary to read out.
   500     for (slave = master->slaves;
   543     for (slave = master->slaves;
   501             slave < master->slaves + master->slave_count;
   544             slave < master->slaves + master->slave_count;
   516         // start fetching SDO dictionary
   559         // start fetching SDO dictionary
   517         fsm->idle = 0;
   560         fsm->idle = 0;
   518         fsm->slave = slave;
   561         fsm->slave = slave;
   519         fsm->state = ec_fsm_master_state_sdo_dictionary;
   562         fsm->state = ec_fsm_master_state_sdo_dictionary;
   520         ec_fsm_coe_dictionary(&fsm->fsm_coe, slave);
   563         ec_fsm_coe_dictionary(&fsm->fsm_coe, slave);
   521         ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
   564         ec_fsm_coe_exec(&fsm->fsm_coe, fsm->datagram); // execute immediately
       
   565         fsm->datagram->device_index = fsm->slave->device_index;
   522         return;
   566         return;
   523     }
   567     }
   524 
   568 
   525     // check for pending SII write operations.
   569     // check for pending SII write operations.
   526     if (ec_fsm_master_action_process_sii(fsm))
   570     if (ec_fsm_master_action_process_sii(fsm)) {
   527         return; // SII write request found
   571         return; // SII write request found
   528 
   572 	}
   529     // check for pending register requests.
       
   530     if (ec_fsm_master_action_process_register(fsm))
       
   531         return; // register request processing
       
   532 
   573 
   533     ec_fsm_master_restart(fsm);
   574     ec_fsm_master_restart(fsm);
   534 }
   575 }
   535 
   576 
   536 /*****************************************************************************/
   577 /*****************************************************************************/
   549         // fetch state from next slave
   590         // fetch state from next slave
   550         fsm->idle = 1;
   591         fsm->idle = 1;
   551         ec_datagram_fprd(fsm->datagram,
   592         ec_datagram_fprd(fsm->datagram,
   552                 fsm->slave->station_address, 0x0130, 2);
   593                 fsm->slave->station_address, 0x0130, 2);
   553         ec_datagram_zero(fsm->datagram);
   594         ec_datagram_zero(fsm->datagram);
       
   595         fsm->datagram->device_index = fsm->slave->device_index;
   554         fsm->retries = EC_FSM_RETRIES;
   596         fsm->retries = EC_FSM_RETRIES;
   555         fsm->state = ec_fsm_master_state_read_state;
   597         fsm->state = ec_fsm_master_state_read_state;
   556         return;
   598         return;
   557     }
   599     }
   558 
   600 
   587 
   629 
   588     // Does the slave have to be configured?
   630     // Does the slave have to be configured?
   589     if ((slave->current_state != slave->requested_state
   631     if ((slave->current_state != slave->requested_state
   590                 || slave->force_config) && !slave->error_flag) {
   632                 || slave->force_config) && !slave->error_flag) {
   591 
   633 
   592         // Start slave configuration, if it is allowed.
   634         // Start slave configuration
   593         ec_mutex_lock(&master->config_mutex);
   635         down(&master->config_sem);
   594         master->config_busy = 1;
   636         master->config_busy = 1;
   595         ec_mutex_unlock(&master->config_mutex);
   637         up(&master->config_sem);
   596 
   638 
   597         if (master->debug_level) {
   639         if (master->debug_level) {
   598             char old_state[EC_STATE_STRING_SIZE],
   640             char old_state[EC_STATE_STRING_SIZE],
   599                  new_state[EC_STATE_STRING_SIZE];
   641                  new_state[EC_STATE_STRING_SIZE];
   600             ec_state_string(slave->current_state, old_state, 0);
   642             ec_state_string(slave->current_state, old_state, 0);
   606 
   648 
   607         fsm->idle = 0;
   649         fsm->idle = 0;
   608         fsm->state = ec_fsm_master_state_configure_slave;
   650         fsm->state = ec_fsm_master_state_configure_slave;
   609         ec_fsm_slave_config_start(&fsm->fsm_slave_config, slave);
   651         ec_fsm_slave_config_start(&fsm->fsm_slave_config, slave);
   610         fsm->state(fsm); // execute immediately
   652         fsm->state(fsm); // execute immediately
   611         return;
   653         fsm->datagram->device_index = fsm->slave->device_index;
   612     }
   654         return;
   613 
   655     }
   614     // slave has error flag set; process next one
   656 
       
   657     // process next slave
   615     ec_fsm_master_action_next_slave_state(fsm);
   658     ec_fsm_master_action_next_slave_state(fsm);
   616 }
   659 }
   617 
   660 
   618 /*****************************************************************************/
   661 /*****************************************************************************/
   619 
   662 
   626         )
   669         )
   627 {
   670 {
   628     ec_slave_t *slave = fsm->slave;
   671     ec_slave_t *slave = fsm->slave;
   629     ec_datagram_t *datagram = fsm->datagram;
   672     ec_datagram_t *datagram = fsm->datagram;
   630 
   673 
   631     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   674     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) {
   632         return;
   675         return;
       
   676     }
   633 
   677 
   634     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   678     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   635         EC_SLAVE_ERR(slave, "Failed to receive AL state datagram: ");
   679         EC_SLAVE_ERR(slave, "Failed to receive AL state datagram: ");
   636         ec_datagram_print_state(datagram);
   680         ec_datagram_print_state(datagram);
   637         ec_fsm_master_restart(fsm);
   681         ec_fsm_master_restart(fsm);
   679         ec_fsm_master_t *fsm /**< Master state machine. */
   723         ec_fsm_master_t *fsm /**< Master state machine. */
   680         )
   724         )
   681 {
   725 {
   682     ec_slave_t *slave = fsm->slave;
   726     ec_slave_t *slave = fsm->slave;
   683 
   727 
   684     if (ec_fsm_change_exec(&fsm->fsm_change))
   728     if (ec_fsm_change_exec(&fsm->fsm_change)) {
   685         return;
   729         return;
       
   730     }
   686 
   731 
   687     if (!ec_fsm_change_success(&fsm->fsm_change)) {
   732     if (!ec_fsm_change_success(&fsm->fsm_change)) {
   688         fsm->slave->error_flag = 1;
   733         fsm->slave->error_flag = 1;
   689         EC_SLAVE_ERR(slave, "Failed to acknowledge state change.\n");
   734         EC_SLAVE_ERR(slave, "Failed to acknowledge state change.\n");
   690     }
   735     }
   692     ec_fsm_master_action_configure(fsm);
   737     ec_fsm_master_action_configure(fsm);
   693 }
   738 }
   694 
   739 
   695 /*****************************************************************************/
   740 /*****************************************************************************/
   696 
   741 
       
   742 /** Start clearing slave addresses.
       
   743  */
       
   744 void ec_fsm_master_enter_clear_addresses(
       
   745         ec_fsm_master_t *fsm /**< Master state machine. */
       
   746         )
       
   747 {
       
   748     // broadcast clear all station addresses
       
   749     ec_datagram_bwr(fsm->datagram, 0x0010, 2);
       
   750     EC_WRITE_U16(fsm->datagram->data, 0x0000);
       
   751     fsm->datagram->device_index = fsm->dev_idx;
       
   752     fsm->retries = EC_FSM_RETRIES;
       
   753     fsm->state = ec_fsm_master_state_clear_addresses;
       
   754 }
       
   755 
       
   756 /*****************************************************************************/
       
   757 
   697 /** Master state: CLEAR ADDRESSES.
   758 /** Master state: CLEAR ADDRESSES.
   698  */
   759  */
   699 void ec_fsm_master_state_clear_addresses(
   760 void ec_fsm_master_state_clear_addresses(
   700         ec_fsm_master_t *fsm /**< Master state machine. */
   761         ec_fsm_master_t *fsm /**< Master state machine. */
   701         )
   762         )
   702 {
   763 {
   703     ec_master_t *master = fsm->master;
   764     ec_master_t *master = fsm->master;
   704     ec_datagram_t *datagram = fsm->datagram;
   765     ec_datagram_t *datagram = fsm->datagram;
   705 
   766 
   706     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   767     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) {
   707         return;
   768         return;
       
   769     }
   708 
   770 
   709     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   771     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   710         EC_MASTER_ERR(master, "Failed to receive address"
   772         EC_MASTER_ERR(master, "Failed to receive address"
   711                 " clearing datagram: ");
   773                 " clearing datagram on %s link: ",
       
   774                 ec_device_names[fsm->dev_idx != 0]);
   712         ec_datagram_print_state(datagram);
   775         ec_datagram_print_state(datagram);
   713         master->scan_busy = 0;
   776         master->scan_busy = 0;
   714         wake_up_interruptible(&master->scan_queue);
   777         wake_up_interruptible(&master->scan_queue);
   715         ec_fsm_master_restart(fsm);
   778         ec_fsm_master_restart(fsm);
   716         return;
   779         return;
   717     }
   780     }
   718 
   781 
   719     if (datagram->working_counter != master->slave_count) {
   782     if (datagram->working_counter != fsm->slaves_responding[fsm->dev_idx]) {
   720         EC_MASTER_WARN(master, "Failed to clear all station addresses:"
   783         EC_MASTER_WARN(master, "Failed to clear station addresses on %s link:"
   721                 " Cleared %u of %u",
   784                 " Cleared %u of %u",
   722                 datagram->working_counter, master->slave_count);
   785                 ec_device_names[fsm->dev_idx != 0], datagram->working_counter,
       
   786                 fsm->slaves_responding[fsm->dev_idx]);
   723     }
   787     }
   724 
   788 
   725     EC_MASTER_DBG(master, 1, "Sending broadcast-write"
   789     EC_MASTER_DBG(master, 1, "Sending broadcast-write"
   726             " to measure transmission delays.\n");
   790             " to measure transmission delays on %s link.\n",
       
   791             ec_device_names[fsm->dev_idx != 0]);
   727 
   792 
   728     ec_datagram_bwr(datagram, 0x0900, 1);
   793     ec_datagram_bwr(datagram, 0x0900, 1);
   729     ec_datagram_zero(datagram);
   794     ec_datagram_zero(datagram);
       
   795     fsm->datagram->device_index = fsm->dev_idx;
   730     fsm->retries = EC_FSM_RETRIES;
   796     fsm->retries = EC_FSM_RETRIES;
   731     fsm->state = ec_fsm_master_state_dc_measure_delays;
   797     fsm->state = ec_fsm_master_state_dc_measure_delays;
   732 }
   798 }
   733 
   799 
   734 /*****************************************************************************/
   800 /*****************************************************************************/
   740         )
   806         )
   741 {
   807 {
   742     ec_master_t *master = fsm->master;
   808     ec_master_t *master = fsm->master;
   743     ec_datagram_t *datagram = fsm->datagram;
   809     ec_datagram_t *datagram = fsm->datagram;
   744 
   810 
   745     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   811     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) {
   746         return;
   812         return;
       
   813     }
   747 
   814 
   748     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   815     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   749         EC_MASTER_ERR(master, "Failed to receive delay measuring datagram: ");
   816         EC_MASTER_ERR(master, "Failed to receive delay measuring datagram"
       
   817                 " on %s link: ", ec_device_names[fsm->dev_idx != 0]);
   750         ec_datagram_print_state(datagram);
   818         ec_datagram_print_state(datagram);
   751         master->scan_busy = 0;
   819         master->scan_busy = 0;
   752         wake_up_interruptible(&master->scan_queue);
   820         wake_up_interruptible(&master->scan_queue);
   753         ec_fsm_master_restart(fsm);
   821         ec_fsm_master_restart(fsm);
   754         return;
   822         return;
   755     }
   823     }
   756 
   824 
   757     EC_MASTER_DBG(master, 1, "%u slaves responded to delay measuring.\n",
   825     EC_MASTER_DBG(master, 1, "%u slaves responded to delay measuring"
   758             datagram->working_counter);
   826             " on %s link.\n",
       
   827             datagram->working_counter, ec_device_names[fsm->dev_idx != 0]);
       
   828 
       
   829     do {
       
   830         fsm->dev_idx++;
       
   831     } while (fsm->dev_idx < ec_master_num_devices(master) &&
       
   832             !fsm->slaves_responding[fsm->dev_idx]);
       
   833     if (fsm->dev_idx < ec_master_num_devices(master)) {
       
   834         ec_fsm_master_enter_clear_addresses(fsm);
       
   835         return;
       
   836     }
   759 
   837 
   760     EC_MASTER_INFO(master, "Scanning bus.\n");
   838     EC_MASTER_INFO(master, "Scanning bus.\n");
   761 
   839 
   762     // begin scanning of slaves
   840     // begin scanning of slaves
   763     fsm->slave = master->slaves;
   841     fsm->slave = master->slaves;
       
   842     EC_MASTER_DBG(master, 1, "Scanning slave %u on %s link.\n",
       
   843             fsm->slave->ring_position,
       
   844             ec_device_names[fsm->slave->device_index != 0]);
   764     fsm->state = ec_fsm_master_state_scan_slave;
   845     fsm->state = ec_fsm_master_state_scan_slave;
   765     ec_fsm_slave_scan_start(&fsm->fsm_slave_scan, fsm->slave);
   846     ec_fsm_slave_scan_start(&fsm->fsm_slave_scan, fsm->slave);
   766     ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan); // execute immediately
   847     ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan); // execute immediately
       
   848     fsm->datagram->device_index = fsm->slave->device_index;
   767 }
   849 }
   768 
   850 
   769 /*****************************************************************************/
   851 /*****************************************************************************/
   770 
   852 
   771 /** Master state: SCAN SLAVE.
   853 /** Master state: SCAN SLAVE.
   778 {
   860 {
   779     ec_master_t *master = fsm->master;
   861     ec_master_t *master = fsm->master;
   780 #ifdef EC_EOE
   862 #ifdef EC_EOE
   781     ec_slave_t *slave = fsm->slave;
   863     ec_slave_t *slave = fsm->slave;
   782 #endif
   864 #endif
   783     if (ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan))
   865 
   784         return;
   866     if (ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan)) {
       
   867         return;
       
   868     }
   785 
   869 
   786 #ifdef EC_EOE
   870 #ifdef EC_EOE
   787     if (slave->sii.mailbox_protocols & EC_MBOX_EOE) {
   871     if (slave->sii.mailbox_protocols & EC_MBOX_EOE) {
   788         // create EoE handler for this slave
   872         // create EoE handler for this slave
   789         ec_eoe_t *eoe;
   873         ec_eoe_t *eoe;
   799 #endif
   883 #endif
   800 
   884 
   801     // another slave to fetch?
   885     // another slave to fetch?
   802     fsm->slave++;
   886     fsm->slave++;
   803     if (fsm->slave < master->slaves + master->slave_count) {
   887     if (fsm->slave < master->slaves + master->slave_count) {
       
   888         EC_MASTER_DBG(master, 1, "Scanning slave %u on %s link.\n",
       
   889                 fsm->slave->ring_position,
       
   890                 ec_device_names[fsm->slave->device_index != 0]);
   804         ec_fsm_slave_scan_start(&fsm->fsm_slave_scan, fsm->slave);
   891         ec_fsm_slave_scan_start(&fsm->fsm_slave_scan, fsm->slave);
   805         ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan); // execute immediately
   892         ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan); // execute immediately
       
   893         fsm->datagram->device_index = fsm->slave->device_index;
   806         return;
   894         return;
   807     }
   895     }
   808 
   896 
   809     EC_MASTER_INFO(master, "Bus scanning completed in %lu ms.\n",
   897     EC_MASTER_INFO(master, "Bus scanning completed in %lu ms.\n",
   810             (jiffies - fsm->scan_jiffies) * 1000 / HZ);
   898             (jiffies - fsm->scan_jiffies) * 1000 / HZ);
   814 
   902 
   815     ec_master_calc_dc(master);
   903     ec_master_calc_dc(master);
   816 
   904 
   817     // Attach slave configurations
   905     // Attach slave configurations
   818     ec_master_attach_slave_configs(master);
   906     ec_master_attach_slave_configs(master);
       
   907 
       
   908 #ifdef EC_EOE
       
   909     // check if EoE processing has to be started
       
   910     ec_master_eoe_start(master);
       
   911 #endif
   819 
   912 
   820     if (master->slave_count) {
   913     if (master->slave_count) {
   821         master->config_changed = 0;
   914         master->config_changed = 0;
   822 
   915 
   823         fsm->slave = master->slaves; // begin with first slave
   916         fsm->slave = master->slaves; // begin with first slave
   837         ec_fsm_master_t *fsm /**< Master state machine. */
   930         ec_fsm_master_t *fsm /**< Master state machine. */
   838         )
   931         )
   839 {
   932 {
   840     ec_master_t *master = fsm->master;
   933     ec_master_t *master = fsm->master;
   841 
   934 
   842     if (ec_fsm_slave_config_exec(&fsm->fsm_slave_config))
   935     if (ec_fsm_slave_config_exec(&fsm->fsm_slave_config)) {
   843         return;
   936         return;
       
   937     }
   844 
   938 
   845     fsm->slave->force_config = 0;
   939     fsm->slave->force_config = 0;
   846 
   940 
   847     // configuration finished
   941     // configuration finished
   848     master->config_busy = 0;
   942     master->config_busy = 0;
   863 void ec_fsm_master_enter_write_system_times(
   957 void ec_fsm_master_enter_write_system_times(
   864         ec_fsm_master_t *fsm /**< Master state machine. */
   958         ec_fsm_master_t *fsm /**< Master state machine. */
   865         )
   959         )
   866 {
   960 {
   867     ec_master_t *master = fsm->master;
   961     ec_master_t *master = fsm->master;
   868 
       
   869     EC_MASTER_DBG(master, 1, "Writing system time offsets...\n");
       
   870 
   962 
   871     if (master->has_app_time) {
   963     if (master->has_app_time) {
   872 
   964 
   873         while (fsm->slave < master->slaves + master->slave_count) {
   965         while (fsm->slave < master->slaves + master->slave_count) {
   874             if (!fsm->slave->base_dc_supported
   966             if (!fsm->slave->base_dc_supported
   875                     || !fsm->slave->has_dc_system_time) {
   967                     || !fsm->slave->has_dc_system_time) {
   876                 fsm->slave++;
   968                 fsm->slave++;
   877                 continue;
   969                 continue;
   878             }
   970             }
   879 
   971 
       
   972             EC_SLAVE_DBG(fsm->slave, 1, "Checking system time offset.\n");
       
   973 
   880             // read DC system time (0x0910, 64 bit)
   974             // read DC system time (0x0910, 64 bit)
   881             //                         gap (64 bit)
   975             //                         gap (64 bit)
   882             //     and time offset (0x0920, 64 bit)
   976             //     and time offset (0x0920, 64 bit)
   883             ec_datagram_fprd(fsm->datagram, fsm->slave->station_address,
   977             ec_datagram_fprd(fsm->datagram, fsm->slave->station_address,
   884                     0x0910, 24);
   978                     0x0910, 24);
       
   979             fsm->datagram->device_index = fsm->slave->device_index;
   885             fsm->retries = EC_FSM_RETRIES;
   980             fsm->retries = EC_FSM_RETRIES;
   886             fsm->state = ec_fsm_master_state_dc_read_offset;
   981             fsm->state = ec_fsm_master_state_dc_read_offset;
   887             return;
   982             return;
   888         }
   983         }
   889 
   984 
   890     } else {
   985     } else {
   891         if (master->active) {
   986         if (master->active) {
   892             EC_MASTER_ERR(master, "No app_time received up to now,"
   987             EC_MASTER_WARN(master, "No app_time received up to now,"
   893                     " but master already active.\n");
   988                     " but master already active.\n");
   894         } else {
   989         } else {
   895             EC_MASTER_DBG(master, 1, "No app_time received up to now.\n");
   990             EC_MASTER_DBG(master, 1, "No app_time received up to now.\n");
   896         }
   991         }
   897     }
   992     }
   902 }
   997 }
   903 
   998 
   904 /*****************************************************************************/
   999 /*****************************************************************************/
   905 
  1000 
   906 /** Configure 32 bit time offset.
  1001 /** Configure 32 bit time offset.
       
  1002  *
       
  1003  * \return New offset.
   907  */
  1004  */
   908 u64 ec_fsm_master_dc_offset32(
  1005 u64 ec_fsm_master_dc_offset32(
   909         ec_fsm_master_t *fsm, /**< Master state machine. */
  1006         ec_fsm_master_t *fsm, /**< Master state machine. */
   910         u64 system_time, /**< System time register. */
  1007         u64 system_time, /**< System time register. */
   911         u64 old_offset, /**< Time offset register. */
  1008         u64 old_offset, /**< Time offset register. */
   912 		u64 correction /**< Correction. */
  1009         unsigned long jiffies_since_read /**< Jiffies for correction. */
   913         )
  1010         )
   914 {
  1011 {
   915     ec_slave_t *slave = fsm->slave;
  1012     ec_slave_t *slave = fsm->slave;
   916 	u32 correction32, system_time32, old_offset32, new_offset;
  1013     u32 correction, system_time32, old_offset32, new_offset;
   917     s32 time_diff;
  1014     s32 time_diff;
   918 
  1015 
   919 	system_time32 = (u32) system_time;
  1016     system_time32 = (u32) system_time;
   920 	// correct read system time by elapsed time between read operation
  1017     old_offset32 = (u32) old_offset;
   921 	// and app_time set time
  1018 
   922 	correction32 = (u32)correction;
  1019     // correct read system time by elapsed time since read operation
   923 	system_time32 -= correction32;
  1020     correction = jiffies_since_read * 1000 / HZ * 1000000;
   924 	old_offset32 = (u32) old_offset;
  1021     system_time32 += correction;
   925 
  1022     time_diff = (u32) slave->master->app_time - system_time32;
   926     time_diff = (u32) slave->master->app_start_time - system_time32;
  1023 
   927 
  1024     EC_SLAVE_DBG(slave, 1, "DC 32 bit system time offset calculation:"
   928     EC_SLAVE_DBG(slave, 1, "DC system time offset calculation:"
       
   929             " system_time=%u (corrected with %u),"
  1025             " system_time=%u (corrected with %u),"
   930             " app_start_time=%llu, diff=%i\n",
  1026             " app_time=%llu, diff=%i\n",
   931 			system_time32, correction32,
  1027             system_time32, correction,
   932             slave->master->app_start_time, time_diff);
  1028             slave->master->app_time, time_diff);
   933 
  1029 
   934     if (EC_ABS(time_diff) > EC_SYSTEM_TIME_TOLERANCE_NS) {
  1030     if (EC_ABS(time_diff) > EC_SYSTEM_TIME_TOLERANCE_NS) {
   935         new_offset = time_diff + old_offset32;
  1031         new_offset = time_diff + old_offset32;
   936         EC_SLAVE_DBG(slave, 1, "Setting time offset to %u (was %u)\n",
  1032         EC_SLAVE_DBG(slave, 1, "Setting time offset to %u (was %u)\n",
   937                 new_offset, old_offset32);
  1033                 new_offset, old_offset32);
   943 }
  1039 }
   944 
  1040 
   945 /*****************************************************************************/
  1041 /*****************************************************************************/
   946 
  1042 
   947 /** Configure 64 bit time offset.
  1043 /** Configure 64 bit time offset.
       
  1044  *
       
  1045  * \return New offset.
   948  */
  1046  */
   949 u64 ec_fsm_master_dc_offset64(
  1047 u64 ec_fsm_master_dc_offset64(
   950         ec_fsm_master_t *fsm, /**< Master state machine. */
  1048         ec_fsm_master_t *fsm, /**< Master state machine. */
   951         u64 system_time, /**< System time register. */
  1049         u64 system_time, /**< System time register. */
   952         u64 old_offset, /**< Time offset register. */
  1050         u64 old_offset, /**< Time offset register. */
   953 		u64 correction /**< Correction. */
  1051         unsigned long jiffies_since_read /**< Jiffies for correction. */
   954         )
  1052         )
   955 {
  1053 {
   956     ec_slave_t *slave = fsm->slave;
  1054     ec_slave_t *slave = fsm->slave;
   957 	u64 new_offset;
  1055     u64 new_offset, correction;
   958     s64 time_diff;
  1056     s64 time_diff;
   959 
  1057 
   960 	// correct read system time by elapsed time between read operation
  1058     // correct read system time by elapsed time since read operation
   961 	// and app_time set time
  1059     correction = (u64) (jiffies_since_read * 1000 / HZ) * 1000000;
   962 	system_time -= correction;
  1060     system_time += correction;
   963     time_diff = fsm->slave->master->app_start_time - system_time;
  1061     time_diff = fsm->slave->master->app_time - system_time;
   964 
  1062 
   965     EC_SLAVE_DBG(slave, 1, "DC system time offset calculation:"
  1063     EC_SLAVE_DBG(slave, 1, "DC 64 bit system time offset calculation:"
   966             " system_time=%llu (corrected with %llu),"
  1064             " system_time=%llu (corrected with %llu),"
   967             " app_start_time=%llu, diff=%lli\n",
  1065             " app_time=%llu, diff=%lli\n",
   968             system_time, correction,
  1066             system_time, correction,
   969             slave->master->app_start_time, time_diff);
  1067             slave->master->app_time, time_diff);
   970 
  1068 
   971     if (EC_ABS(time_diff) > EC_SYSTEM_TIME_TOLERANCE_NS) {
  1069     if (EC_ABS(time_diff) > EC_SYSTEM_TIME_TOLERANCE_NS) {
   972         new_offset = time_diff + old_offset;
  1070         new_offset = time_diff + old_offset;
   973         EC_SLAVE_DBG(slave, 1, "Setting time offset to %llu (was %llu)\n",
  1071         EC_SLAVE_DBG(slave, 1, "Setting time offset to %llu (was %llu)\n",
   974                 new_offset, old_offset);
  1072                 new_offset, old_offset);
   988         ec_fsm_master_t *fsm /**< Master state machine. */
  1086         ec_fsm_master_t *fsm /**< Master state machine. */
   989         )
  1087         )
   990 {
  1088 {
   991     ec_datagram_t *datagram = fsm->datagram;
  1089     ec_datagram_t *datagram = fsm->datagram;
   992     ec_slave_t *slave = fsm->slave;
  1090     ec_slave_t *slave = fsm->slave;
   993 	u64 system_time, old_offset, new_offset, correction;
  1091     u64 system_time, old_offset, new_offset;
       
  1092     unsigned long jiffies_since_read;
   994 
  1093 
   995     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
  1094     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   996         return;
  1095         return;
   997 
  1096 
   998     if (datagram->state != EC_DATAGRAM_RECEIVED) {
  1097     if (datagram->state != EC_DATAGRAM_RECEIVED) {
  1011         return;
  1110         return;
  1012     }
  1111     }
  1013 
  1112 
  1014     system_time = EC_READ_U64(datagram->data);     // 0x0910
  1113     system_time = EC_READ_U64(datagram->data);     // 0x0910
  1015     old_offset = EC_READ_U64(datagram->data + 16); // 0x0920
  1114     old_offset = EC_READ_U64(datagram->data + 16); // 0x0920
  1016 	/* correct read system time by elapsed time since read operation
  1115     jiffies_since_read = jiffies - datagram->jiffies_sent;
  1017 	   and the app_time set time */
       
  1018 #ifdef EC_HAVE_CYCLES
       
  1019 	correction =
       
  1020             (datagram->cycles_sent - slave->master->dc_cycles_app_start_time)
       
  1021 			* 1000000LL;
       
  1022 	do_div(correction, cpu_khz);
       
  1023 #else
       
  1024 	correction =
       
  1025 			(u64) ((datagram->jiffies_sent-slave->master->dc_jiffies_app_start_time) * 1000 / HZ)
       
  1026 			* 1000000;
       
  1027 #endif
       
  1028 
  1116 
  1029     if (slave->base_dc_range == EC_DC_32) {
  1117     if (slave->base_dc_range == EC_DC_32) {
  1030         new_offset = ec_fsm_master_dc_offset32(fsm,
  1118         new_offset = ec_fsm_master_dc_offset32(fsm,
  1031 				system_time, old_offset, correction);
  1119                 system_time, old_offset, jiffies_since_read);
  1032     } else {
  1120     } else {
  1033         new_offset = ec_fsm_master_dc_offset64(fsm,
  1121         new_offset = ec_fsm_master_dc_offset64(fsm,
  1034 				system_time, old_offset, correction);
  1122                 system_time, old_offset, jiffies_since_read);
  1035     }
  1123     }
  1036 
  1124 
  1037     // set DC system time offset and transmission delay
  1125     // set DC system time offset and transmission delay
  1038     ec_datagram_fpwr(datagram, slave->station_address, 0x0920, 12);
  1126     ec_datagram_fpwr(datagram, slave->station_address, 0x0920, 12);
  1039     EC_WRITE_U64(datagram->data, new_offset);
  1127     EC_WRITE_U64(datagram->data, new_offset);
  1040     EC_WRITE_U32(datagram->data + 8, slave->transmission_delay);
  1128     EC_WRITE_U32(datagram->data + 8, slave->transmission_delay);
       
  1129     fsm->datagram->device_index = slave->device_index;
  1041     fsm->retries = EC_FSM_RETRIES;
  1130     fsm->retries = EC_FSM_RETRIES;
  1042     fsm->state = ec_fsm_master_state_dc_write_offset;
  1131     fsm->state = ec_fsm_master_state_dc_write_offset;
  1043 }
  1132 }
  1044 
  1133 
  1045 /*****************************************************************************/
  1134 /*****************************************************************************/
  1092     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
  1181     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
  1093 
  1182 
  1094     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
  1183     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
  1095         EC_SLAVE_ERR(slave, "Failed to write SII data.\n");
  1184         EC_SLAVE_ERR(slave, "Failed to write SII data.\n");
  1096         request->state = EC_INT_REQUEST_FAILURE;
  1185         request->state = EC_INT_REQUEST_FAILURE;
  1097         kref_put(&request->refcount, ec_master_sii_write_request_release);
  1186         wake_up_all(&master->request_queue);
  1098         wake_up(&master->sii_queue);
       
  1099         ec_fsm_master_restart(fsm);
  1187         ec_fsm_master_restart(fsm);
  1100         return;
  1188         return;
  1101     }
  1189     }
  1102 
  1190 
  1103     fsm->sii_index++;
  1191     fsm->sii_index++;
  1121         slave->effective_alias = slave->sii.alias;
  1209         slave->effective_alias = slave->sii.alias;
  1122     }
  1210     }
  1123     // TODO: Evaluate other SII contents!
  1211     // TODO: Evaluate other SII contents!
  1124 
  1212 
  1125     request->state = EC_INT_REQUEST_SUCCESS;
  1213     request->state = EC_INT_REQUEST_SUCCESS;
  1126     kref_put(&request->refcount, ec_master_sii_write_request_release);
  1214     wake_up_all(&master->request_queue);
  1127     wake_up(&master->sii_queue);
       
  1128 
  1215 
  1129     // check for another SII write request
  1216     // check for another SII write request
  1130     if (ec_fsm_master_action_process_sii(fsm))
  1217     if (ec_fsm_master_action_process_sii(fsm))
  1131         return; // processing another request
  1218         return; // processing another request
  1132 
  1219 
  1142         )
  1229         )
  1143 {
  1230 {
  1144     ec_slave_t *slave = fsm->slave;
  1231     ec_slave_t *slave = fsm->slave;
  1145     ec_master_t *master = fsm->master;
  1232     ec_master_t *master = fsm->master;
  1146 
  1233 
  1147     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
  1234     if (ec_fsm_coe_exec(&fsm->fsm_coe, fsm->datagram)) {
       
  1235         return;
       
  1236     }
  1148 
  1237 
  1149     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
  1238     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
  1150         ec_fsm_master_restart(fsm);
  1239         ec_fsm_master_restart(fsm);
  1151         return;
  1240         return;
  1152     }
  1241     }
  1174         ec_fsm_master_t *fsm /**< Master state machine. */
  1263         ec_fsm_master_t *fsm /**< Master state machine. */
  1175         )
  1264         )
  1176 {
  1265 {
  1177     ec_sdo_request_t *request = fsm->sdo_request;
  1266     ec_sdo_request_t *request = fsm->sdo_request;
  1178 
  1267 
  1179     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
  1268     if (!request) {
       
  1269         // configuration was cleared in the meantime
       
  1270         ec_fsm_master_restart(fsm);
       
  1271         return;
       
  1272     }
       
  1273 
       
  1274     if (ec_fsm_coe_exec(&fsm->fsm_coe, fsm->datagram)) {
       
  1275         return;
       
  1276     }
  1180 
  1277 
  1181     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
  1278     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
  1182         EC_SLAVE_DBG(fsm->slave, 1,
  1279         EC_SLAVE_DBG(fsm->slave, 1,
  1183                 "Failed to process internal SDO request.\n");
  1280                 "Failed to process internal SDO request.\n");
  1184         request->state = EC_INT_REQUEST_FAILURE;
  1281         request->state = EC_INT_REQUEST_FAILURE;
  1185         wake_up(&fsm->slave->sdo_queue);
  1282         wake_up_all(&fsm->master->request_queue);
  1186         ec_fsm_master_restart(fsm);
  1283         ec_fsm_master_restart(fsm);
  1187         return;
  1284         return;
  1188     }
  1285     }
  1189 
  1286 
  1190     // SDO request finished
  1287     // SDO request finished
  1191     request->state = EC_INT_REQUEST_SUCCESS;
  1288     request->state = EC_INT_REQUEST_SUCCESS;
  1192     wake_up(&fsm->slave->sdo_queue);
  1289     wake_up_all(&fsm->master->request_queue);
  1193 
  1290 
  1194     EC_SLAVE_DBG(fsm->slave, 1, "Finished internal SDO request.\n");
  1291     EC_SLAVE_DBG(fsm->slave, 1, "Finished internal SDO request.\n");
  1195 
  1292 
  1196     // check for another SDO request
  1293     // check for another SDO request
  1197     if (ec_fsm_master_action_process_sdo(fsm))
  1294     if (ec_fsm_master_action_process_sdo(fsm)) {
  1198         return; // processing another request
  1295         return; // processing another request
       
  1296     }
  1199 
  1297 
  1200     ec_fsm_master_restart(fsm);
  1298     ec_fsm_master_restart(fsm);
  1201 }
  1299 }
  1202 
  1300 
  1203 /*****************************************************************************/
  1301 /*****************************************************************************/
  1204 
       
  1205 /** Master state: REG REQUEST.
       
  1206  */
       
  1207 void ec_fsm_master_state_reg_request(
       
  1208         ec_fsm_master_t *fsm /**< Master state machine. */
       
  1209         )
       
  1210 {
       
  1211     ec_master_t *master = fsm->master;
       
  1212     ec_datagram_t *datagram = fsm->datagram;
       
  1213     ec_reg_request_t *request = fsm->reg_request;
       
  1214 
       
  1215     if (datagram->state != EC_DATAGRAM_RECEIVED) {
       
  1216         EC_MASTER_ERR(master, "Failed to receive register"
       
  1217                 " request datagram: ");
       
  1218         ec_datagram_print_state(datagram);
       
  1219         request->state = EC_INT_REQUEST_FAILURE;
       
  1220         kref_put(&request->refcount, ec_master_reg_request_release);
       
  1221         wake_up(&master->reg_queue);
       
  1222         ec_fsm_master_restart(fsm);
       
  1223         return;
       
  1224     }
       
  1225 
       
  1226     if (datagram->working_counter == 1) {
       
  1227         if (request->dir == EC_DIR_INPUT) { // read request
       
  1228             if (request->data)
       
  1229                 kfree(request->data);
       
  1230             request->data = kmalloc(request->length, GFP_KERNEL);
       
  1231             if (!request->data) {
       
  1232                 EC_MASTER_ERR(master, "Failed to allocate %zu bytes"
       
  1233                         " of memory for register data.\n", request->length);
       
  1234                 request->state = EC_INT_REQUEST_FAILURE;
       
  1235                 kref_put(&request->refcount, ec_master_reg_request_release);
       
  1236                 wake_up(&master->reg_queue);
       
  1237                 ec_fsm_master_restart(fsm);
       
  1238                 return;
       
  1239             }
       
  1240             memcpy(request->data, datagram->data, request->length);
       
  1241         }
       
  1242 
       
  1243         request->state = EC_INT_REQUEST_SUCCESS;
       
  1244         EC_SLAVE_DBG(request->slave, 1, "Register request successful.\n");
       
  1245     } else {
       
  1246         request->state = EC_INT_REQUEST_FAILURE;
       
  1247         EC_MASTER_ERR(master, "Register request failed.\n");
       
  1248     }
       
  1249 
       
  1250     kref_put(&request->refcount, ec_master_reg_request_release);
       
  1251     wake_up(&master->reg_queue);
       
  1252 
       
  1253     // check for another register request
       
  1254     if (ec_fsm_master_action_process_register(fsm))
       
  1255         return; // processing another request
       
  1256 
       
  1257     ec_fsm_master_restart(fsm);
       
  1258 }
       
  1259 
       
  1260 /*****************************************************************************/
       
  1261 
       
  1262 /** called by kref_put if the SII write request's refcount becomes zero.
       
  1263  *
       
  1264  */
       
  1265 void ec_master_sii_write_request_release(struct kref *ref)
       
  1266 {
       
  1267     ec_sii_write_request_t *request = container_of(ref, ec_sii_write_request_t, refcount);
       
  1268     if (request->slave)
       
  1269         EC_SLAVE_DBG(request->slave, 1, "Releasing SII write request %p.\n",
       
  1270                 request);
       
  1271     kfree(request->words);
       
  1272     kfree(request);
       
  1273 }
       
  1274 
       
  1275 /*****************************************************************************/
       
  1276 
       
  1277 /** called by kref_put if the reg request's refcount becomes zero.
       
  1278  *
       
  1279  */
       
  1280 void ec_master_reg_request_release(struct kref *ref)
       
  1281 {
       
  1282     ec_reg_request_t *request = container_of(ref, ec_reg_request_t, refcount);
       
  1283     if (request->slave)
       
  1284         EC_SLAVE_DBG(request->slave, 1, "Releasing reg request %p.\n",
       
  1285                 request);
       
  1286     if (request->data)
       
  1287         kfree(request->data);
       
  1288     kfree(request);
       
  1289 }
       
  1290 
       
  1291 /*****************************************************************************/
       
  1292 
       
  1293 /** called by kref_put if the SDO request's refcount becomes zero.
       
  1294  *
       
  1295  */
       
  1296 void ec_master_sdo_request_release(struct kref *ref)
       
  1297 {
       
  1298     ec_master_sdo_request_t *request = container_of(ref, ec_master_sdo_request_t, refcount);
       
  1299     if (request->slave)
       
  1300         EC_SLAVE_DBG(request->slave, 1, "Releasing SDO request %p.\n",
       
  1301                 request);
       
  1302     ec_sdo_request_clear(&request->req);
       
  1303     kfree(request);
       
  1304 }
       
  1305 
       
  1306 /*****************************************************************************/
       
  1307 
       
  1308 /** called by kref_put if the FoE request's refcount becomes zero.
       
  1309  *
       
  1310  */
       
  1311 void ec_master_foe_request_release(struct kref *ref)
       
  1312 {
       
  1313     ec_master_foe_request_t *request = container_of(ref, ec_master_foe_request_t, refcount);
       
  1314     if (request->slave)
       
  1315         EC_SLAVE_DBG(request->slave, 1, "Releasing FoE request %p.\n",
       
  1316                 request);
       
  1317     ec_foe_request_clear(&request->req);
       
  1318     kfree(request);
       
  1319 }
       
  1320 
       
  1321 /*****************************************************************************/
       
  1322 
       
  1323 /** called by kref_put if the SoE request's refcount becomes zero.
       
  1324  *
       
  1325  */
       
  1326 void ec_master_soe_request_release(struct kref *ref)
       
  1327 {
       
  1328     ec_master_soe_request_t *request = container_of(ref, ec_master_soe_request_t, refcount);
       
  1329     if (request->slave)
       
  1330         EC_SLAVE_DBG(request->slave, 1, "Releasing SoE request %p.\n",
       
  1331                 request);
       
  1332     ec_soe_request_clear(&request->req);
       
  1333     kfree(request);
       
  1334 }