master/master.c
changeset 1579 326d47aa986c
parent 1507 68e89abadd19
child 1580 1baac79a40cf
--- 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++) {