master/master.c
changeset 1596 ea8d2b4ee742
parent 1585 1f640e321ee4
child 1597 491dea6f4fd7
equal deleted inserted replaced
1585:1f640e321ee4 1596:ea8d2b4ee742
   181     master->app_receive_cb = NULL;
   181     master->app_receive_cb = NULL;
   182     master->app_cb_data = NULL;
   182     master->app_cb_data = NULL;
   183 
   183 
   184     INIT_LIST_HEAD(&master->sii_requests);
   184     INIT_LIST_HEAD(&master->sii_requests);
   185     init_waitqueue_head(&master->sii_queue);
   185     init_waitqueue_head(&master->sii_queue);
   186 
       
   187     INIT_LIST_HEAD(&master->slave_sdo_requests);
       
   188     init_waitqueue_head(&master->sdo_queue);
       
   189 
   186 
   190     INIT_LIST_HEAD(&master->reg_requests);
   187     INIT_LIST_HEAD(&master->reg_requests);
   191     init_waitqueue_head(&master->reg_queue);
   188     init_waitqueue_head(&master->reg_queue);
   192 
   189 
   193     INIT_LIST_HEAD(&master->foe_requests);
   190     INIT_LIST_HEAD(&master->foe_requests);
   403 				request->slave->ring_position);
   400 				request->slave->ring_position);
   404 		request->state = EC_INT_REQUEST_FAILURE;
   401 		request->state = EC_INT_REQUEST_FAILURE;
   405 		wake_up(&master->reg_queue);
   402 		wake_up(&master->reg_queue);
   406 	}
   403 	}
   407 
   404 
   408 	// SDO requests
       
   409 	while (1) {
       
   410 		ec_master_sdo_request_t *request;
       
   411 		if (list_empty(&master->slave_sdo_requests))
       
   412 			break;
       
   413 		// get first request
       
   414 		request = list_entry(master->slave_sdo_requests.next,
       
   415 				ec_master_sdo_request_t, list);
       
   416 		list_del_init(&request->list); // dequeue
       
   417 		EC_INFO("Discarding SDO request, slave %u does not exist anymore.\n",
       
   418 				request->slave->ring_position);
       
   419 		request->req.state = EC_INT_REQUEST_FAILURE;
       
   420 		wake_up(&master->sdo_queue);
       
   421 	}
       
   422 
       
   423 	// FoE requests
   405 	// FoE requests
   424 	while (1) {
   406 	while (1) {
   425 		ec_master_foe_request_t *request;
   407 		ec_master_foe_request_t *request;
   426 		if (list_empty(&master->foe_requests))
   408 		if (list_empty(&master->foe_requests))
   427 			break;
   409 			break;
   436 	}
   418 	}
   437 
   419 
   438     for (slave = master->slaves;
   420     for (slave = master->slaves;
   439             slave < master->slaves + master->slave_count;
   421             slave < master->slaves + master->slave_count;
   440             slave++) {
   422             slave++) {
       
   423         // SDO requests
       
   424         while (1) {
       
   425             ec_master_sdo_request_t *request;
       
   426             if (list_empty(&slave->slave_sdo_requests))
       
   427                 break;
       
   428             // get first request
       
   429             request = list_entry(slave->slave_sdo_requests.next,
       
   430                     ec_master_sdo_request_t, list);
       
   431             list_del_init(&request->list); // dequeue
       
   432             EC_INFO("Discarding SDO request, slave %u does not exist anymore.\n",
       
   433                     request->slave->ring_position);
       
   434             request->req.state = EC_INT_REQUEST_FAILURE;
       
   435             wake_up(&slave->sdo_queue);
       
   436         }
   441         ec_slave_clear(slave);
   437         ec_slave_clear(slave);
   442     }
   438     }
   443 
   439 
   444     if (master->slaves) {
   440     if (master->slaves) {
   445         kfree(master->slaves);
   441         kfree(master->slaves);
   767     datagram->state = EC_DATAGRAM_QUEUED;
   763     datagram->state = EC_DATAGRAM_QUEUED;
   768 #ifdef EC_HAVE_CYCLES
   764 #ifdef EC_HAVE_CYCLES
   769     datagram->cycles_sent = get_cycles();
   765     datagram->cycles_sent = get_cycles();
   770 #endif
   766 #endif
   771     datagram->jiffies_sent = jiffies;
   767     datagram->jiffies_sent = jiffies;
       
   768 
       
   769     master->fsm.idle = 0;
   772 
   770 
   773     down(&master->io_sem);
   771     down(&master->io_sem);
   774     list_add_tail(&datagram->queue, &master->sdo_datagram_queue);
   772     list_add_tail(&datagram->queue, &master->sdo_datagram_queue);
   775     up(&master->io_sem);
   773     up(&master->io_sem);
   776 }
   774 }