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) { |
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; |
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); |
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 |
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); |