Revision eb5e680a
b/hw/usb-msd.c | ||
---|---|---|
315 | 315 |
return ret; |
316 | 316 |
} |
317 | 317 |
|
318 |
static void usb_msd_cancel_io(USBPacket *p, void *opaque)
|
|
318 |
static void usb_msd_cancel_io(USBDevice *dev, USBPacket *p)
|
|
319 | 319 |
{ |
320 |
MSDState *s = opaque;
|
|
320 |
MSDState *s = DO_UPCAST(MSDState, dev, dev);
|
|
321 | 321 |
s->scsi_dev->info->cancel_io(s->scsi_dev, s->tag); |
322 | 322 |
s->packet = NULL; |
323 | 323 |
s->scsi_len = 0; |
... | ... | |
398 | 398 |
} |
399 | 399 |
if (s->usb_len) { |
400 | 400 |
DPRINTF("Deferring packet %p\n", p); |
401 |
usb_defer_packet(p, usb_msd_cancel_io, s); |
|
402 | 401 |
s->packet = p; |
403 | 402 |
ret = USB_RET_ASYNC; |
404 | 403 |
} else { |
... | ... | |
421 | 420 |
if (s->data_len != 0 || len < 13) |
422 | 421 |
goto fail; |
423 | 422 |
/* Waiting for SCSI write to complete. */ |
424 |
usb_defer_packet(p, usb_msd_cancel_io, s); |
|
425 | 423 |
s->packet = p; |
426 | 424 |
ret = USB_RET_ASYNC; |
427 | 425 |
break; |
... | ... | |
455 | 453 |
} |
456 | 454 |
if (s->usb_len) { |
457 | 455 |
DPRINTF("Deferring packet %p\n", p); |
458 |
usb_defer_packet(p, usb_msd_cancel_io, s); |
|
459 | 456 |
s->packet = p; |
460 | 457 |
ret = USB_RET_ASYNC; |
461 | 458 |
} else { |
... | ... | |
604 | 601 |
.usb_desc = &desc, |
605 | 602 |
.init = usb_msd_initfn, |
606 | 603 |
.handle_packet = usb_generic_handle_packet, |
604 |
.cancel_packet = usb_msd_cancel_io, |
|
607 | 605 |
.handle_attach = usb_desc_attach, |
608 | 606 |
.handle_reset = usb_msd_handle_reset, |
609 | 607 |
.handle_control = usb_msd_handle_control, |
b/hw/usb.c | ||
---|---|---|
345 | 345 |
void usb_cancel_packet(USBPacket * p) |
346 | 346 |
{ |
347 | 347 |
assert(p->owner != NULL); |
348 |
p->cancel_cb(p, p->cancel_opaque);
|
|
348 |
p->owner->info->cancel_packet(p->owner, p);
|
|
349 | 349 |
p->owner = NULL; |
350 | 350 |
} |
b/hw/usb.h | ||
---|---|---|
194 | 194 |
int (*handle_packet)(USBDevice *dev, USBPacket *p); |
195 | 195 |
|
196 | 196 |
/* |
197 |
* Called when a packet is canceled. |
|
198 |
*/ |
|
199 |
void (*cancel_packet)(USBDevice *dev, USBPacket *p); |
|
200 |
|
|
201 |
/* |
|
197 | 202 |
* Called when device is destroyed. |
198 | 203 |
*/ |
199 | 204 |
void (*handle_destroy)(USBDevice *dev); |
... | ... | |
263 | 268 |
int len; |
264 | 269 |
/* Internal use by the USB layer. */ |
265 | 270 |
USBDevice *owner; |
266 |
USBCallback *cancel_cb; |
|
267 |
void *cancel_opaque; |
|
268 | 271 |
}; |
269 | 272 |
|
270 | 273 |
int usb_handle_packet(USBDevice *dev, USBPacket *p); |
271 | 274 |
void usb_packet_complete(USBDevice *dev, USBPacket *p); |
272 | 275 |
void usb_cancel_packet(USBPacket * p); |
273 | 276 |
|
274 |
/* Defer completion of a USB packet. The hadle_packet routine should then |
|
275 |
return USB_RET_ASYNC. Packets that complete immediately (before |
|
276 |
handle_packet returns) should not call this method. */ |
|
277 |
static inline void usb_defer_packet(USBPacket *p, USBCallback *cancel, |
|
278 |
void * opaque) |
|
279 |
{ |
|
280 |
p->cancel_cb = cancel; |
|
281 |
p->cancel_opaque = opaque; |
|
282 |
} |
|
283 |
|
|
284 | 277 |
void usb_attach(USBPort *port, USBDevice *dev); |
285 | 278 |
void usb_wakeup(USBDevice *dev); |
286 | 279 |
int usb_generic_handle_packet(USBDevice *s, USBPacket *p); |
b/usb-linux.c | ||
---|---|---|
335 | 335 |
} |
336 | 336 |
} |
337 | 337 |
|
338 |
static void async_cancel(USBPacket *p, void *opaque)
|
|
338 |
static void usb_host_async_cancel(USBDevice *dev, USBPacket *p)
|
|
339 | 339 |
{ |
340 |
USBHostDevice *s = opaque;
|
|
340 |
USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev);
|
|
341 | 341 |
AsyncURB *aurb; |
342 | 342 |
|
343 | 343 |
QLIST_FOREACH(aurb, &s->aurbs, next) { |
... | ... | |
736 | 736 |
} |
737 | 737 |
} |
738 | 738 |
|
739 |
usb_defer_packet(p, async_cancel, s); |
|
740 | 739 |
return USB_RET_ASYNC; |
741 | 740 |
} |
742 | 741 |
|
... | ... | |
868 | 867 |
} |
869 | 868 |
} |
870 | 869 |
|
871 |
usb_defer_packet(p, async_cancel, s); |
|
872 | 870 |
return USB_RET_ASYNC; |
873 | 871 |
} |
874 | 872 |
|
... | ... | |
1197 | 1195 |
.qdev.size = sizeof(USBHostDevice), |
1198 | 1196 |
.init = usb_host_initfn, |
1199 | 1197 |
.handle_packet = usb_generic_handle_packet, |
1198 |
.cancel_packet = usb_host_async_cancel, |
|
1200 | 1199 |
.handle_data = usb_host_handle_data, |
1201 | 1200 |
.handle_control = usb_host_handle_control, |
1202 | 1201 |
.handle_reset = usb_host_handle_reset, |
Also available in: Unified diff