master/master.c
changeset 2028 55854f070c4a
parent 2024 96e2ae6cce95
child 2030 2bd8ad8bf41f
equal deleted inserted replaced
2027:ac35f4d38a31 2028:55854f070c4a
   128     int ret;
   128     int ret;
   129 
   129 
   130     master->index = index;
   130     master->index = index;
   131     master->reserved = 0;
   131     master->reserved = 0;
   132 
   132 
   133     sema_init(&master->master_sem, 1);
   133     ec_mutex_init(&master->master_mutex);
   134 
   134 
   135     master->main_mac = main_mac;
   135     master->main_mac = main_mac;
   136     master->backup_mac = backup_mac;
   136     master->backup_mac = backup_mac;
   137 
   137 
   138     sema_init(&master->device_sem, 1);
   138     ec_mutex_init(&master->device_mutex);
   139 
   139 
   140     master->phase = EC_ORPHANED;
   140     master->phase = EC_ORPHANED;
   141     master->active = 0;
   141     master->active = 0;
   142     master->config_changed = 0;
   142     master->config_changed = 0;
   143     master->injection_seq_fsm = 0;
   143     master->injection_seq_fsm = 0;
   156     master->app_start_time = 0ULL;
   156     master->app_start_time = 0ULL;
   157     master->has_app_time = 0;
   157     master->has_app_time = 0;
   158 
   158 
   159     master->scan_busy = 0;
   159     master->scan_busy = 0;
   160     master->allow_scan = 1;
   160     master->allow_scan = 1;
   161     sema_init(&master->scan_sem, 1);
   161     ec_mutex_init(&master->scan_mutex);
   162     init_waitqueue_head(&master->scan_queue);
   162     init_waitqueue_head(&master->scan_queue);
   163 
   163 
   164     master->config_busy = 0;
   164     master->config_busy = 0;
   165     master->allow_config = 1;
   165     master->allow_config = 1;
   166     sema_init(&master->config_sem, 1);
   166     ec_mutex_init(&master->config_mutex);
   167     init_waitqueue_head(&master->config_queue);
   167     init_waitqueue_head(&master->config_queue);
   168     
   168     
   169     INIT_LIST_HEAD(&master->datagram_queue);
   169     INIT_LIST_HEAD(&master->datagram_queue);
   170     master->datagram_index = 0;
   170     master->datagram_index = 0;
   171 
   171 
   172     sema_init(&master->fsm_queue_sem, 1);
   172     ec_mutex_init(&master->fsm_queue_mutex);
   173     INIT_LIST_HEAD(&master->fsm_datagram_queue);
   173     INIT_LIST_HEAD(&master->fsm_datagram_queue);
   174     
   174     
   175     // send interval in IDLE phase
   175     // send interval in IDLE phase
   176     ec_master_set_send_interval(master, 1000000 / HZ);
   176     ec_master_set_send_interval(master, 1000000 / HZ);
   177 
   177 
   188 #ifdef EC_EOE
   188 #ifdef EC_EOE
   189     master->eoe_thread = NULL;
   189     master->eoe_thread = NULL;
   190     INIT_LIST_HEAD(&master->eoe_handlers);
   190     INIT_LIST_HEAD(&master->eoe_handlers);
   191 #endif
   191 #endif
   192 
   192 
   193     sema_init(&master->io_sem, 1);
   193     ec_mutex_init(&master->io_mutex);
   194     master->fsm_queue_lock_cb = NULL;
   194     master->fsm_queue_lock_cb = NULL;
   195     master->fsm_queue_unlock_cb = NULL;
   195     master->fsm_queue_unlock_cb = NULL;
   196     master->fsm_queue_locking_data = NULL;
   196     master->fsm_queue_locking_data = NULL;
   197     master->app_fsm_queue_lock_cb = NULL;
   197     master->app_fsm_queue_lock_cb = NULL;
   198     master->app_fsm_queue_unlock_cb = NULL;
   198     master->app_fsm_queue_unlock_cb = NULL;
   445  */
   445  */
   446 void ec_master_clear_config(
   446 void ec_master_clear_config(
   447         ec_master_t *master /**< EtherCAT master. */
   447         ec_master_t *master /**< EtherCAT master. */
   448         )
   448         )
   449 {
   449 {
   450     down(&master->master_sem);
   450     ec_mutex_lock(&master->master_mutex);
   451     ec_master_clear_domains(master);
   451     ec_master_clear_domains(master);
   452     ec_master_clear_slave_configs(master);
   452     ec_master_clear_slave_configs(master);
   453     up(&master->master_sem);
   453     ec_mutex_unlock(&master->master_mutex);
   454 }
   454 }
   455 
   455 
   456 /*****************************************************************************/
   456 /*****************************************************************************/
   457 
   457 
   458 /** Starts the master thread.
   458 /** Starts the master thread.
   543 
   543 
   544     master->phase = EC_ORPHANED;
   544     master->phase = EC_ORPHANED;
   545     
   545     
   546     ec_master_thread_stop(master);
   546     ec_master_thread_stop(master);
   547 
   547 
   548     down(&master->master_sem);
   548     ec_mutex_lock(&master->master_mutex);
   549     ec_master_clear_slaves(master);
   549     ec_master_clear_slaves(master);
   550     up(&master->master_sem);
   550     ec_mutex_unlock(&master->master_mutex);
   551 }
   551 }
   552 
   552 
   553 /*****************************************************************************/
   553 /*****************************************************************************/
   554 
   554 
   555 /** Transition function from IDLE to OPERATION phase.
   555 /** Transition function from IDLE to OPERATION phase.
   562     ec_eoe_t *eoe;
   562     ec_eoe_t *eoe;
   563 #endif
   563 #endif
   564 
   564 
   565     EC_MASTER_DBG(master, 1, "IDLE -> OPERATION.\n");
   565     EC_MASTER_DBG(master, 1, "IDLE -> OPERATION.\n");
   566 
   566 
   567     down(&master->config_sem);
   567     ec_mutex_lock(&master->config_mutex);
   568     master->allow_config = 0; // temporarily disable slave configuration
   568     master->allow_config = 0; // temporarily disable slave configuration
   569     if (master->config_busy) {
   569     if (master->config_busy) {
   570         up(&master->config_sem);
   570         ec_mutex_unlock(&master->config_mutex);
   571 
   571 
   572         // wait for slave configuration to complete
   572         // wait for slave configuration to complete
   573         ret = wait_event_interruptible(master->config_queue,
   573         ret = wait_event_interruptible(master->config_queue,
   574                     !master->config_busy);
   574                     !master->config_busy);
   575         if (ret) {
   575         if (ret) {
   579         }
   579         }
   580 
   580 
   581         EC_MASTER_DBG(master, 1, "Waiting for pending slave"
   581         EC_MASTER_DBG(master, 1, "Waiting for pending slave"
   582                 " configuration returned.\n");
   582                 " configuration returned.\n");
   583     } else {
   583     } else {
   584         up(&master->config_sem);
   584         ec_mutex_unlock(&master->config_mutex);
   585     }
   585     }
   586 
   586 
   587     down(&master->scan_sem);
   587     ec_mutex_lock(&master->scan_mutex);
   588     master->allow_scan = 0; // 'lock' the slave list
   588     master->allow_scan = 0; // 'lock' the slave list
   589     if (!master->scan_busy) {
   589     if (!master->scan_busy) {
   590         up(&master->scan_sem);
   590         ec_mutex_unlock(&master->scan_mutex);
   591     } else {
   591     } else {
   592         up(&master->scan_sem);
   592         ec_mutex_unlock(&master->scan_mutex);
   593 
   593 
   594         // wait for slave scan to complete
   594         // wait for slave scan to complete
   595         ret = wait_event_interruptible(master->scan_queue, !master->scan_busy);
   595         ret = wait_event_interruptible(master->scan_queue, !master->scan_busy);
   596         if (ret) {
   596         if (ret) {
   597             EC_MASTER_INFO(master, "Waiting for slave scan"
   597             EC_MASTER_INFO(master, "Waiting for slave scan"
   660     ec_datagram_t *datagram, *n;
   660     ec_datagram_t *datagram, *n;
   661     size_t queue_size = 0;
   661     size_t queue_size = 0;
   662 
   662 
   663     if (master->fsm_queue_lock_cb)
   663     if (master->fsm_queue_lock_cb)
   664         master->fsm_queue_lock_cb(master->fsm_queue_locking_data);
   664         master->fsm_queue_lock_cb(master->fsm_queue_locking_data);
   665     down(&master->fsm_queue_sem);
   665     if (ec_mutex_trylock(&master->fsm_queue_mutex) == 0)
       
   666         return;
   666     if (list_empty(&master->fsm_datagram_queue)) {
   667     if (list_empty(&master->fsm_datagram_queue)) {
   667         up(&master->fsm_queue_sem);
   668         ec_mutex_unlock(&master->fsm_queue_mutex);
   668         if (master->fsm_queue_unlock_cb)
   669         if (master->fsm_queue_unlock_cb)
   669             master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
   670             master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
   670         return;
   671         return;
   671     }
   672     }
   672     list_for_each_entry(datagram, &master->datagram_queue, queue) {
   673     list_for_each_entry(datagram, &master->datagram_queue, queue) {
   734                 }
   735                 }
   735 #endif
   736 #endif
   736             }
   737             }
   737         }
   738         }
   738     }
   739     }
   739     up(&master->fsm_queue_sem);
   740     ec_mutex_unlock(&master->fsm_queue_mutex);
   740     if (master->fsm_queue_unlock_cb)
   741     if (master->fsm_queue_unlock_cb)
   741         master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
   742         master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
   742 }
   743 }
   743 
   744 
   744 /*****************************************************************************/
   745 /*****************************************************************************/
   781 {
   782 {
   782     ec_datagram_t *queued_datagram;
   783     ec_datagram_t *queued_datagram;
   783 
   784 
   784     if (master->fsm_queue_lock_cb)
   785     if (master->fsm_queue_lock_cb)
   785         master->fsm_queue_lock_cb(master->fsm_queue_locking_data);
   786         master->fsm_queue_lock_cb(master->fsm_queue_locking_data);
   786     down(&master->fsm_queue_sem);
   787     ec_mutex_lock(&master->fsm_queue_mutex);
   787 
   788 
   788     // check, if the datagram is already queued
   789     // check, if the datagram is already queued
   789     list_for_each_entry(queued_datagram, &master->fsm_datagram_queue,
   790     list_for_each_entry(queued_datagram, &master->fsm_datagram_queue,
   790             queue) {
   791             queue) {
   791         if (queued_datagram == datagram) {
   792         if (queued_datagram == datagram) {
   792             datagram->state = EC_DATAGRAM_QUEUED;
   793             datagram->state = EC_DATAGRAM_QUEUED;
   793             up(&master->fsm_queue_sem);
   794             ec_mutex_unlock(&master->fsm_queue_mutex);
   794             if (master->fsm_queue_unlock_cb)
   795             if (master->fsm_queue_unlock_cb)
   795                 master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
   796                 master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
   796             return;
   797             return;
   797         }
   798         }
   798     }
   799     }
   807 #ifdef EC_HAVE_CYCLES
   808 #ifdef EC_HAVE_CYCLES
   808     datagram->cycles_sent = get_cycles();
   809     datagram->cycles_sent = get_cycles();
   809 #endif
   810 #endif
   810     datagram->jiffies_sent = jiffies;
   811     datagram->jiffies_sent = jiffies;
   811 
   812 
   812     up(&master->fsm_queue_sem);
   813     ec_mutex_unlock(&master->fsm_queue_mutex);
   813     if (master->fsm_queue_unlock_cb)
   814     if (master->fsm_queue_unlock_cb)
   814         master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
   815         master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
   815 }
   816 }
   816 
   817 
   817 /*****************************************************************************/
   818 /*****************************************************************************/
  1250 
  1251 
  1251     while (!kthread_should_stop()) {
  1252     while (!kthread_should_stop()) {
  1252         ec_datagram_output_stats(&master->fsm_datagram);
  1253         ec_datagram_output_stats(&master->fsm_datagram);
  1253 
  1254 
  1254         // receive
  1255         // receive
  1255         down(&master->io_sem);
  1256         ec_mutex_lock(&master->io_mutex);
  1256         ecrt_master_receive(master);
  1257         ecrt_master_receive(master);
  1257         up(&master->io_sem);
  1258         ec_mutex_unlock(&master->io_mutex);
  1258 
  1259 
  1259         // execute master & slave state machines
  1260         // execute master & slave state machines
  1260         if (down_interruptible(&master->master_sem))
  1261         if (ec_mutex_lock_interruptible(&master->master_mutex))
  1261             break;
  1262             break;
  1262         if (ec_fsm_master_exec(&master->fsm)) {
  1263         if (ec_fsm_master_exec(&master->fsm)) {
  1263             ec_master_queue_fsm_datagram(master, &master->fsm_datagram);
  1264             ec_master_queue_fsm_datagram(master, &master->fsm_datagram);
  1264         }
  1265         }
  1265         for (slave = master->slaves;
  1266         for (slave = master->slaves;
  1269         }
  1270         }
  1270 #if defined(EC_EOE)
  1271 #if defined(EC_EOE)
  1271         if (!ec_master_eoe_processing(master))
  1272         if (!ec_master_eoe_processing(master))
  1272             master->fsm.idle = 0;  // pump the bus as fast as possible
  1273             master->fsm.idle = 0;  // pump the bus as fast as possible
  1273 #endif
  1274 #endif
  1274         up(&master->master_sem);
  1275         ec_mutex_unlock(&master->master_mutex);
  1275 
  1276 
  1276         // queue and send
  1277         // queue and send
  1277         down(&master->io_sem);
  1278         ec_mutex_lock(&master->io_mutex);
  1278         ecrt_master_send(master);
  1279         ecrt_master_send(master);
  1279         sent_bytes = master->main_device.tx_skb[
  1280         sent_bytes = master->main_device.tx_skb[
  1280             master->main_device.tx_ring_index]->len;
  1281             master->main_device.tx_ring_index]->len;
  1281         up(&master->io_sem);
  1282         ec_mutex_unlock(&master->io_mutex);
  1282 
  1283 
  1283         if (ec_fsm_master_idle(&master->fsm)) {
  1284         if (ec_fsm_master_idle(&master->fsm)) {
  1284 #ifdef EC_USE_HRTIMER
  1285 #ifdef EC_USE_HRTIMER
  1285             ec_master_nanosleep(master->send_interval * 1000);
  1286             ec_master_nanosleep(master->send_interval * 1000);
  1286 #else
  1287 #else
  1319 
  1320 
  1320         // output statistics
  1321         // output statistics
  1321         ec_master_output_stats(master);
  1322         ec_master_output_stats(master);
  1322 
  1323 
  1323         // execute master & slave state machines
  1324         // execute master & slave state machines
  1324         if (down_interruptible(&master->master_sem))
  1325         if (ec_mutex_lock_interruptible(&master->master_mutex))
  1325             break;
  1326             break;
  1326         if (ec_fsm_master_exec(&master->fsm))
  1327         if (ec_fsm_master_exec(&master->fsm))
  1327             ec_master_queue_fsm_datagram(master, &master->fsm_datagram);
  1328             ec_master_queue_fsm_datagram(master, &master->fsm_datagram);
  1328         for (slave = master->slaves;
  1329         for (slave = master->slaves;
  1329                 slave < master->slaves + master->slave_count;
  1330                 slave < master->slaves + master->slave_count;
  1331             ec_fsm_slave_exec(&slave->fsm); // may queue datagram in external queue
  1332             ec_fsm_slave_exec(&slave->fsm); // may queue datagram in external queue
  1332         }
  1333         }
  1333 #if defined(EC_EOE)
  1334 #if defined(EC_EOE)
  1334         ec_master_eoe_processing(master);
  1335         ec_master_eoe_processing(master);
  1335 #endif
  1336 #endif
  1336         up(&master->master_sem);
  1337         ec_mutex_unlock(&master->master_mutex);
  1337 
  1338 
  1338 #ifdef EC_USE_HRTIMER
  1339 #ifdef EC_USE_HRTIMER
  1339         // the op thread should not work faster than the sending RT thread
  1340         // the op thread should not work faster than the sending RT thread
  1340         ec_master_nanosleep(master->send_interval * 1000);
  1341         ec_master_nanosleep(master->send_interval * 1000);
  1341 #else
  1342 #else
  1856     if (!(domain = (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) {
  1857     if (!(domain = (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) {
  1857         EC_MASTER_ERR(master, "Error allocating domain memory!\n");
  1858         EC_MASTER_ERR(master, "Error allocating domain memory!\n");
  1858         return ERR_PTR(-ENOMEM);
  1859         return ERR_PTR(-ENOMEM);
  1859     }
  1860     }
  1860 
  1861 
  1861     down(&master->master_sem);
  1862     ec_mutex_lock(&master->master_mutex);
  1862 
  1863 
  1863     if (list_empty(&master->domains)) {
  1864     if (list_empty(&master->domains)) {
  1864         index = 0;
  1865         index = 0;
  1865     } else {
  1866     } else {
  1866         last_domain = list_entry(master->domains.prev, ec_domain_t, list);
  1867         last_domain = list_entry(master->domains.prev, ec_domain_t, list);
  1868     }
  1869     }
  1869 
  1870 
  1870     ec_domain_init(domain, master, index);
  1871     ec_domain_init(domain, master, index);
  1871     list_add_tail(&domain->list, &master->domains);
  1872     list_add_tail(&domain->list, &master->domains);
  1872 
  1873 
  1873     up(&master->master_sem);
  1874     ec_mutex_unlock(&master->master_mutex);
  1874 
  1875 
  1875     EC_MASTER_DBG(master, 1, "Created domain %u.\n", domain->index);
  1876     EC_MASTER_DBG(master, 1, "Created domain %u.\n", domain->index);
  1876 
  1877 
  1877     return domain;
  1878     return domain;
  1878 }
  1879 }
  1900     if (master->active) {
  1901     if (master->active) {
  1901         EC_MASTER_WARN(master, "%s: Master already active!\n", __func__);
  1902         EC_MASTER_WARN(master, "%s: Master already active!\n", __func__);
  1902         return 0;
  1903         return 0;
  1903     }
  1904     }
  1904 
  1905 
  1905     down(&master->master_sem);
  1906     ec_mutex_lock(&master->master_mutex);
  1906 
  1907 
  1907     // finish all domains
  1908     // finish all domains
  1908     domain_offset = 0;
  1909     domain_offset = 0;
  1909     list_for_each_entry(domain, &master->domains, list) {
  1910     list_for_each_entry(domain, &master->domains, list) {
  1910         ret = ec_domain_finish(domain, domain_offset);
  1911         ret = ec_domain_finish(domain, domain_offset);
  1911         if (ret < 0) {
  1912         if (ret < 0) {
  1912             up(&master->master_sem);
  1913             ec_mutex_unlock(&master->master_mutex);
  1913             EC_MASTER_ERR(master, "Failed to finish domain 0x%p!\n", domain);
  1914             EC_MASTER_ERR(master, "Failed to finish domain 0x%p!\n", domain);
  1914             return ret;
  1915             return ret;
  1915         }
  1916         }
  1916         domain_offset += domain->data_size;
  1917         domain_offset += domain->data_size;
  1917     }
  1918     }
  1918     
  1919     
  1919     up(&master->master_sem);
  1920     ec_mutex_unlock(&master->master_mutex);
  1920 
  1921 
  1921     // restart EoE process and master thread with new locking
  1922     // restart EoE process and master thread with new locking
  1922 
  1923 
  1923     ec_master_thread_stop(master);
  1924     ec_master_thread_stop(master);
  1924 
  1925 
  2126         }
  2127         }
  2127 
  2128 
  2128         ec_slave_config_init(sc, master,
  2129         ec_slave_config_init(sc, master,
  2129                 alias, position, vendor_id, product_code);
  2130                 alias, position, vendor_id, product_code);
  2130 
  2131 
  2131         down(&master->master_sem);
  2132         ec_mutex_lock(&master->master_mutex);
  2132 
  2133 
  2133         // try to find the addressed slave
  2134         // try to find the addressed slave
  2134         ec_slave_config_attach(sc);
  2135         ec_slave_config_attach(sc);
  2135         ec_slave_config_load_default_sync_config(sc);
  2136         ec_slave_config_load_default_sync_config(sc);
  2136         list_add_tail(&sc->list, &master->configs);
  2137         list_add_tail(&sc->list, &master->configs);
  2137 
  2138 
  2138         up(&master->master_sem);
  2139         ec_mutex_unlock(&master->master_mutex);
  2139     }
  2140     }
  2140 
  2141 
  2141     return sc;
  2142     return sc;
  2142 }
  2143 }
  2143 
  2144 
  2171 int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position,
  2172 int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position,
  2172         ec_slave_info_t *slave_info)
  2173         ec_slave_info_t *slave_info)
  2173 {
  2174 {
  2174     const ec_slave_t *slave;
  2175     const ec_slave_t *slave;
  2175 
  2176 
  2176     if (down_interruptible(&master->master_sem)) {
  2177     if (ec_mutex_lock_interruptible(&master->master_mutex)) {
  2177         return -EINTR;
  2178         return -EINTR;
  2178     }
  2179     }
  2179 
  2180 
  2180     slave = ec_master_find_slave_const(master, 0, slave_position);
  2181     slave = ec_master_find_slave_const(master, 0, slave_position);
  2181 
  2182 
  2194         strncpy(slave_info->name, slave->sii.name, EC_MAX_STRING_LENGTH);
  2195         strncpy(slave_info->name, slave->sii.name, EC_MAX_STRING_LENGTH);
  2195     } else {
  2196     } else {
  2196         slave_info->name[0] = 0;
  2197         slave_info->name[0] = 0;
  2197     }
  2198     }
  2198 
  2199 
  2199     up(&master->master_sem);
  2200     ec_mutex_unlock(&master->master_mutex);
  2200 
  2201 
  2201     return 0;
  2202     return 0;
  2202 }
  2203 }
  2203 
  2204 
  2204 /*****************************************************************************/
  2205 /*****************************************************************************/
  2323 
  2324 
  2324     memcpy(request.req.data, data, data_size);
  2325     memcpy(request.req.data, data, data_size);
  2325     request.req.data_size = data_size;
  2326     request.req.data_size = data_size;
  2326     ec_soe_request_write(&request.req);
  2327     ec_soe_request_write(&request.req);
  2327 
  2328 
  2328     if (down_interruptible(&master->master_sem))
  2329     if (ec_mutex_lock_interruptible(&master->master_mutex))
  2329         return -EINTR;
  2330         return -EINTR;
  2330 
  2331 
  2331     if (!(request.slave = ec_master_find_slave(
  2332     if (!(request.slave = ec_master_find_slave(
  2332                     master, 0, slave_position))) {
  2333                     master, 0, slave_position))) {
  2333         up(&master->master_sem);
  2334         ec_mutex_unlock(&master->master_mutex);
  2334         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
  2335         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
  2335                 slave_position);
  2336                 slave_position);
  2336         ec_soe_request_clear(&request.req);
  2337         ec_soe_request_clear(&request.req);
  2337         return -EINVAL;
  2338         return -EINVAL;
  2338     }
  2339     }
  2340     EC_SLAVE_DBG(request.slave, 1, "Scheduling SoE write request.\n");
  2341     EC_SLAVE_DBG(request.slave, 1, "Scheduling SoE write request.\n");
  2341 
  2342 
  2342     // schedule SoE write request.
  2343     // schedule SoE write request.
  2343     list_add_tail(&request.list, &request.slave->soe_requests);
  2344     list_add_tail(&request.list, &request.slave->soe_requests);
  2344 
  2345 
  2345     up(&master->master_sem);
  2346     ec_mutex_unlock(&master->master_mutex);
  2346 
  2347 
  2347     // wait for processing through FSM
  2348     // wait for processing through FSM
  2348     if (wait_event_interruptible(request.slave->soe_queue,
  2349     if (wait_event_interruptible(request.slave->soe_queue,
  2349                 request.req.state != EC_INT_REQUEST_QUEUED)) {
  2350                 request.req.state != EC_INT_REQUEST_QUEUED)) {
  2350         // interrupted by signal
  2351         // interrupted by signal
  2351         down(&master->master_sem);
  2352         ec_mutex_lock(&master->master_mutex);
  2352         if (request.req.state == EC_INT_REQUEST_QUEUED) {
  2353         if (request.req.state == EC_INT_REQUEST_QUEUED) {
  2353             // abort request
  2354             // abort request
  2354             list_del(&request.list);
  2355             list_del(&request.list);
  2355             up(&master->master_sem);
  2356             ec_mutex_unlock(&master->master_mutex);
  2356             ec_soe_request_clear(&request.req);
  2357             ec_soe_request_clear(&request.req);
  2357             return -EINTR;
  2358             return -EINTR;
  2358         }
  2359         }
  2359         up(&master->master_sem);
  2360         ec_mutex_unlock(&master->master_mutex);
  2360     }
  2361     }
  2361 
  2362 
  2362     // wait until master FSM has finished processing
  2363     // wait until master FSM has finished processing
  2363     wait_event(request.slave->soe_queue,
  2364     wait_event(request.slave->soe_queue,
  2364             request.req.state != EC_INT_REQUEST_BUSY);
  2365             request.req.state != EC_INT_REQUEST_BUSY);
  2389     ec_soe_request_init(&request.req);
  2390     ec_soe_request_init(&request.req);
  2390     ec_soe_request_set_drive_no(&request.req, drive_no);
  2391     ec_soe_request_set_drive_no(&request.req, drive_no);
  2391     ec_soe_request_set_idn(&request.req, idn);
  2392     ec_soe_request_set_idn(&request.req, idn);
  2392     ec_soe_request_read(&request.req);
  2393     ec_soe_request_read(&request.req);
  2393 
  2394 
  2394     if (down_interruptible(&master->master_sem))
  2395     if (ec_mutex_lock_interruptible(&master->master_mutex))
  2395         return -EINTR;
  2396         return -EINTR;
  2396 
  2397 
  2397     if (!(request.slave = ec_master_find_slave(master, 0, slave_position))) {
  2398     if (!(request.slave = ec_master_find_slave(master, 0, slave_position))) {
  2398         up(&master->master_sem);
  2399         ec_mutex_unlock(&master->master_mutex);
  2399         ec_soe_request_clear(&request.req);
  2400         ec_soe_request_clear(&request.req);
  2400         EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
  2401         EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
  2401         return -EINVAL;
  2402         return -EINVAL;
  2402     }
  2403     }
  2403 
  2404 
  2404     // schedule request.
  2405     // schedule request.
  2405     list_add_tail(&request.list, &request.slave->soe_requests);
  2406     list_add_tail(&request.list, &request.slave->soe_requests);
  2406 
  2407 
  2407     up(&master->master_sem);
  2408     ec_mutex_unlock(&master->master_mutex);
  2408 
  2409 
  2409     EC_SLAVE_DBG(request.slave, 1, "Scheduled SoE read request.\n");
  2410     EC_SLAVE_DBG(request.slave, 1, "Scheduled SoE read request.\n");
  2410 
  2411 
  2411     // wait for processing through FSM
  2412     // wait for processing through FSM
  2412     if (wait_event_interruptible(request.slave->soe_queue,
  2413     if (wait_event_interruptible(request.slave->soe_queue,
  2413                 request.req.state != EC_INT_REQUEST_QUEUED)) {
  2414                 request.req.state != EC_INT_REQUEST_QUEUED)) {
  2414         // interrupted by signal
  2415         // interrupted by signal
  2415         down(&master->master_sem);
  2416         ec_mutex_lock(&master->master_mutex);
  2416         if (request.req.state == EC_INT_REQUEST_QUEUED) {
  2417         if (request.req.state == EC_INT_REQUEST_QUEUED) {
  2417             list_del(&request.list);
  2418             list_del(&request.list);
  2418             up(&master->master_sem);
  2419             ec_mutex_unlock(&master->master_mutex);
  2419             ec_soe_request_clear(&request.req);
  2420             ec_soe_request_clear(&request.req);
  2420             return -EINTR;
  2421             return -EINTR;
  2421         }
  2422         }
  2422         // request already processing: interrupt not possible.
  2423         // request already processing: interrupt not possible.
  2423         up(&master->master_sem);
  2424         ec_mutex_unlock(&master->master_mutex);
  2424     }
  2425     }
  2425 
  2426 
  2426     // wait until master FSM has finished processing
  2427     // wait until master FSM has finished processing
  2427     wait_event(request.slave->soe_queue,
  2428     wait_event(request.slave->soe_queue,
  2428             request.req.state != EC_INT_REQUEST_BUSY);
  2429             request.req.state != EC_INT_REQUEST_BUSY);