diff -r 53bf35f7b6ea -r 326d47aa986c master/master.c --- a/master/master.c Tue Jul 28 15:42:43 2009 +0000 +++ b/master/master.c Thu Nov 19 14:39:10 2009 +0100 @@ -114,11 +114,12 @@ master->index = index; master->reserved = 0; - init_MUTEX(&master->master_sem); + sema_init(&master->master_sem, 1); master->main_mac = main_mac; master->backup_mac = backup_mac; - init_MUTEX(&master->device_sem); + + sema_init(&master->device_sem, 1); master->phase = EC_ORPHANED; master->injection_seq_fsm = 0; @@ -135,19 +136,19 @@ master->scan_busy = 0; master->allow_scan = 1; - init_MUTEX(&master->scan_sem); + sema_init(&master->scan_sem, 1); init_waitqueue_head(&master->scan_queue); master->config_busy = 0; master->allow_config = 1; - init_MUTEX(&master->config_sem); + sema_init(&master->config_sem, 1); init_waitqueue_head(&master->config_queue); INIT_LIST_HEAD(&master->datagram_queue); master->datagram_index = 0; INIT_LIST_HEAD(&master->ext_datagram_queue); - init_MUTEX(&master->ext_queue_sem); + sema_init(&master->ext_queue_sem, 1); INIT_LIST_HEAD(&master->domains); @@ -165,7 +166,7 @@ INIT_LIST_HEAD(&master->eoe_handlers); #endif - init_MUTEX(&master->io_sem); + sema_init(&master->io_sem, 1); master->send_cb = NULL; master->receive_cb = NULL; master->app_send_cb = NULL; @@ -348,6 +349,64 @@ master->dc_ref_clock = NULL; + // external requests are obsolete, so we wake pending waiters and remove them from the list + // SII + while (1) { + ec_sii_write_request_t *request; + if (list_empty(&master->sii_requests)) + break; + // get first request + request = list_entry(master->sii_requests.next, ec_sii_write_request_t, + list); + list_del_init(&request->list); // dequeue + EC_INFO("Discarding SII request, slave %u does not exist anymore.\n", + request->slave->ring_position); + request->state = EC_INT_REQUEST_FAILURE; + wake_up(&master->sii_queue); + } + // Reg + while (1) { + ec_reg_request_t *request; + if (list_empty(&master->reg_requests)) + break; + // get first request + request = list_entry(master->reg_requests.next, + ec_reg_request_t, list); + list_del_init(&request->list); // dequeue + EC_INFO("Discarding Reg request, slave %u does not exist anymore.\n", + request->slave->ring_position); + request->state = EC_INT_REQUEST_FAILURE; + wake_up(&master->reg_queue); + } + // SDO + while (1) { + ec_master_sdo_request_t *request; + if (list_empty(&master->slave_sdo_requests)) + break; + // get first request + request = list_entry(master->slave_sdo_requests.next, + ec_master_sdo_request_t, list); + list_del_init(&request->list); // dequeue + EC_INFO("Discarding SDO request, slave %u does not exist anymore.\n", + request->slave->ring_position); + request->req.state = EC_INT_REQUEST_FAILURE; + wake_up(&master->sdo_queue); + } + // FOE + while (1) { + ec_master_foe_request_t *request; + if (list_empty(&master->foe_requests)) + break; + // get first request + request = list_entry(master->foe_requests.next, + ec_master_foe_request_t, list); + list_del_init(&request->list); // dequeue + EC_INFO("Discarding FOE request, slave %u does not exist anymore.\n", + request->slave->ring_position); + request->req.state = EC_INT_REQUEST_FAILURE; + wake_up(&master->foe_queue); + } + for (slave = master->slaves; slave < master->slaves + master->slave_count; slave++) {