Hi,
On 10/09/2012 03:31 PM, Gerd Hoffmann wrote:
<snip>
The core can and should do that for packets it owns (USBPacketState ==
USB_PACKET_QUEUED) because they are not (yet) passed to the USBDevice.
Packets owned by USBDevice (USBPacketState == USB_PACKET_ASYNC) must be
handled by the USBDevice itself.
Getting offtopic a bit here, but this not how we currently handle
things, currently the hcd code cancels packets after a queue halt,
Ah, right. Well, that should continue to work. USB_RET_NOT_USED would
make the hcd code just free the packet, and anything not-yet freed will
be zapped by the queue halt handling.
Right.
<snip>
2) If you agree with 1, then I assume you agree we will want to share
the combining code between host-linux.c (or host-* for that matter) and
redirect.c ?
I'm not sure there is that much to share.
It is not much, but you rightly called it "magic" before, as it is somewhat
tricky code, so better to write (and debug) it once :)
A helper function which takes a USBEndpoint and returns an iovec for all
USBPackets lined up there would probably be useful. Likewise for one
for completing the packets (takes xfer length + status, then fill
USBPacket->result & call usb_packet_complete for each packet).
That is more or less what I had in mind yes :)
But beyond that?
3) If you agree with 2, then all we need is a place for the shared logic
to live, we could put it in a new file called input-pipeline.c ?
Just stick the helpers into hw/usb/core.c?
I think core.c is getting a bit crowded, so I'll go with a new file for
the next revision, if you don't like that moving the functions someplace
else is easy :)
I'll start working on a new reworked version of the patchset which hopefully
will be more to your liking :)
Regards,
Hans