master/master.c
changeset 1579 326d47aa986c
parent 1507 68e89abadd19
child 1580 1baac79a40cf
equal deleted inserted replaced
1511:53bf35f7b6ea 1579:326d47aa986c
   112     int ret;
   112     int ret;
   113 
   113 
   114     master->index = index;
   114     master->index = index;
   115     master->reserved = 0;
   115     master->reserved = 0;
   116 
   116 
   117     init_MUTEX(&master->master_sem);
   117     sema_init(&master->master_sem, 1);
   118 
   118 
   119     master->main_mac = main_mac;
   119     master->main_mac = main_mac;
   120     master->backup_mac = backup_mac;
   120     master->backup_mac = backup_mac;
   121     init_MUTEX(&master->device_sem);
   121 
       
   122     sema_init(&master->device_sem, 1);
   122 
   123 
   123     master->phase = EC_ORPHANED;
   124     master->phase = EC_ORPHANED;
   124     master->injection_seq_fsm = 0;
   125     master->injection_seq_fsm = 0;
   125     master->injection_seq_rt = 0;
   126     master->injection_seq_rt = 0;
   126 
   127 
   133     master->app_start_time = 0ULL;
   134     master->app_start_time = 0ULL;
   134     master->has_start_time = 0;
   135     master->has_start_time = 0;
   135 
   136 
   136     master->scan_busy = 0;
   137     master->scan_busy = 0;
   137     master->allow_scan = 1;
   138     master->allow_scan = 1;
   138     init_MUTEX(&master->scan_sem);
   139     sema_init(&master->scan_sem, 1);
   139     init_waitqueue_head(&master->scan_queue);
   140     init_waitqueue_head(&master->scan_queue);
   140 
   141 
   141     master->config_busy = 0;
   142     master->config_busy = 0;
   142     master->allow_config = 1;
   143     master->allow_config = 1;
   143     init_MUTEX(&master->config_sem);
   144     sema_init(&master->config_sem, 1);
   144     init_waitqueue_head(&master->config_queue);
   145     init_waitqueue_head(&master->config_queue);
   145     
   146     
   146     INIT_LIST_HEAD(&master->datagram_queue);
   147     INIT_LIST_HEAD(&master->datagram_queue);
   147     master->datagram_index = 0;
   148     master->datagram_index = 0;
   148 
   149 
   149     INIT_LIST_HEAD(&master->ext_datagram_queue);
   150     INIT_LIST_HEAD(&master->ext_datagram_queue);
   150     init_MUTEX(&master->ext_queue_sem);
   151     sema_init(&master->ext_queue_sem, 1);
   151 
   152 
   152     INIT_LIST_HEAD(&master->domains);
   153     INIT_LIST_HEAD(&master->domains);
   153 
   154 
   154     master->debug_level = debug_level;
   155     master->debug_level = debug_level;
   155     master->stats.timeouts = 0;
   156     master->stats.timeouts = 0;
   163 #ifdef EC_EOE
   164 #ifdef EC_EOE
   164     master->eoe_thread = NULL;
   165     master->eoe_thread = NULL;
   165     INIT_LIST_HEAD(&master->eoe_handlers);
   166     INIT_LIST_HEAD(&master->eoe_handlers);
   166 #endif
   167 #endif
   167 
   168 
   168     init_MUTEX(&master->io_sem);
   169     sema_init(&master->io_sem, 1);
   169     master->send_cb = NULL;
   170     master->send_cb = NULL;
   170     master->receive_cb = NULL;
   171     master->receive_cb = NULL;
   171     master->app_send_cb = NULL;
   172     master->app_send_cb = NULL;
   172     master->app_receive_cb = NULL;
   173     master->app_receive_cb = NULL;
   173 
   174 
   346 {
   347 {
   347     ec_slave_t *slave;
   348     ec_slave_t *slave;
   348 
   349 
   349     master->dc_ref_clock = NULL;
   350     master->dc_ref_clock = NULL;
   350 
   351 
       
   352 	// external requests are obsolete, so we wake pending waiters and remove them from the list
       
   353 	// SII
       
   354 	while (1) {
       
   355 		ec_sii_write_request_t *request;
       
   356 		if (list_empty(&master->sii_requests))
       
   357 			break;
       
   358 		// get first request
       
   359 		request = list_entry(master->sii_requests.next, ec_sii_write_request_t,
       
   360 				list);
       
   361 		list_del_init(&request->list); // dequeue
       
   362 		EC_INFO("Discarding SII request, slave %u does not exist anymore.\n",
       
   363 				request->slave->ring_position);
       
   364 		request->state = EC_INT_REQUEST_FAILURE;
       
   365 		wake_up(&master->sii_queue);
       
   366 	}
       
   367 	// Reg
       
   368 	while (1) {
       
   369 	    ec_reg_request_t *request;
       
   370 		if (list_empty(&master->reg_requests))
       
   371 			break;
       
   372 		// get first request
       
   373 		request = list_entry(master->reg_requests.next,
       
   374 				ec_reg_request_t, list);
       
   375 		list_del_init(&request->list); // dequeue
       
   376 		EC_INFO("Discarding Reg request, slave %u does not exist anymore.\n",
       
   377 				request->slave->ring_position);
       
   378 		request->state = EC_INT_REQUEST_FAILURE;
       
   379 		wake_up(&master->reg_queue);
       
   380 	}
       
   381 	// SDO
       
   382 	while (1) {
       
   383 		ec_master_sdo_request_t *request;
       
   384 		if (list_empty(&master->slave_sdo_requests))
       
   385 			break;
       
   386 		// get first request
       
   387 		request = list_entry(master->slave_sdo_requests.next,
       
   388 				ec_master_sdo_request_t, list);
       
   389 		list_del_init(&request->list); // dequeue
       
   390 		EC_INFO("Discarding SDO request, slave %u does not exist anymore.\n",
       
   391 				request->slave->ring_position);
       
   392 		request->req.state = EC_INT_REQUEST_FAILURE;
       
   393 		wake_up(&master->sdo_queue);
       
   394 	}
       
   395 	// FOE
       
   396 	while (1) {
       
   397 		ec_master_foe_request_t *request;
       
   398 		if (list_empty(&master->foe_requests))
       
   399 			break;
       
   400 		// get first request
       
   401 		request = list_entry(master->foe_requests.next,
       
   402 				ec_master_foe_request_t, list);
       
   403 		list_del_init(&request->list); // dequeue
       
   404 		EC_INFO("Discarding FOE request, slave %u does not exist anymore.\n",
       
   405 				request->slave->ring_position);
       
   406 		request->req.state = EC_INT_REQUEST_FAILURE;
       
   407 		wake_up(&master->foe_queue);
       
   408 	}
       
   409 
   351     for (slave = master->slaves;
   410     for (slave = master->slaves;
   352             slave < master->slaves + master->slave_count;
   411             slave < master->slaves + master->slave_count;
   353             slave++) {
   412             slave++) {
   354         ec_slave_clear(slave);
   413         ec_slave_clear(slave);
   355     }
   414     }