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 |