master/sdo_entry.c
changeset 849 4b712ec8929d
parent 847 92266462d411
child 852 ab439cbc7a81
equal deleted inserted replaced
848:ae0829882a72 849:4b712ec8929d
   262         char *buffer /**< Target buffer. */
   262         char *buffer /**< Target buffer. */
   263         )
   263         )
   264 {
   264 {
   265     ec_master_t *master = entry->sdo->slave->master;
   265     ec_master_t *master = entry->sdo->slave->master;
   266     off_t off = 0;
   266     off_t off = 0;
   267     ec_sdo_request_t request;
   267     ec_master_sdo_request_t request;
   268 
   268 
   269     ec_sdo_request_init(&request, entry->sdo->slave,
   269     request.slave = entry->sdo->slave;
   270             entry->sdo->index, entry->subindex);
   270     ec_sdo_request_init(&request.req, entry->sdo->index, entry->subindex);
   271 
   271 
   272     // schedule request.
   272     // schedule request.
   273     down(&master->sdo_sem);
   273     down(&master->sdo_sem);
   274     list_add_tail(&request.list, &master->sdo_requests);
   274     list_add_tail(&request.list, &master->slave_sdo_requests);
   275     up(&master->sdo_sem);
   275     up(&master->sdo_sem);
   276 
   276 
   277     // wait for processing through FSM
   277     // wait for processing through FSM
   278     if (wait_event_interruptible(master->sdo_queue,
   278     if (wait_event_interruptible(master->sdo_queue,
   279                 request.state != EC_REQUEST_QUEUED)) {
   279                 request.req.state != EC_REQUEST_QUEUED)) {
   280         // interrupted by signal
   280         // interrupted by signal
   281         down(&master->sdo_sem);
   281         down(&master->sdo_sem);
   282         if (request.state == EC_REQUEST_QUEUED) {
   282         if (request.req.state == EC_REQUEST_QUEUED) {
   283             list_del(&request.list);
   283             list_del(&request.req.list);
   284             up(&master->sdo_sem);
   284             up(&master->sdo_sem);
   285             return -EINTR;
   285             return -EINTR;
   286         }
   286         }
   287         // request already processing: interrupt not possible.
   287         // request already processing: interrupt not possible.
   288         up(&master->sdo_sem);
   288         up(&master->sdo_sem);
   289     }
   289     }
   290 
   290 
   291     // wait until master FSM has finished processing
   291     // wait until master FSM has finished processing
   292     wait_event(master->sdo_queue, request.state != EC_REQUEST_IN_PROGRESS);
   292     wait_event(master->sdo_queue, request.req.state != EC_REQUEST_IN_PROGRESS);
   293 
   293 
   294     if (request.state != EC_REQUEST_COMPLETE)
   294     if (request.req.state != EC_REQUEST_COMPLETE)
   295         return -EIO;
   295         return -EIO;
   296 
   296 
   297     off += ec_sdo_entry_format_data(entry, &request, buffer);
   297     off += ec_sdo_entry_format_data(entry, &request.req, buffer);
   298 
   298 
   299     ec_sdo_request_clear(&request);
   299     ec_sdo_request_clear(&request.req);
   300     return off;
   300     return off;
   301 }
   301 }
   302 
   302 
   303 /*****************************************************************************/
   303 /*****************************************************************************/
   304 
   304