USB: FHCI: upgrade the isochronous API
authorAlan Stern <stern@rowland.harvard.edu>
Wed, 29 May 2013 17:19:10 +0000 (13:19 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 May 2013 12:34:31 +0000 (21:34 +0900)
This patch attempts to fix the isochronous API in the fhci-hcd
driver.  There are two problems with the current code:

ed->last_iso is used but not set anywhere.  The patch changes
its name to ed->next_iso and uses it to store the frame number
of the next available slot in the isochronous stream.

urb->start_frame isn't set when the URB_ISO_ASAP flag is off.
The patch sets it to the next available slot if the stream is
in use, or the current frame otherwise.

This won't give the right behavior when an underrun occurs, but I
don't know enough about the driver to handle that case.

Unfortunately, I don't have any way to test these changes.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: Anton Vorontsov <avorontsov@ru.mvista.com>
CC: Li Yang <leoli@freescale.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/fhci-sched.c
drivers/usb/host/fhci.h

index 8f18538e0ff752ceef59e44381a5a00bc2e9ce6b..95ca5986e672dc90cfa97e685e2bdb6fce04a3a6 100644 (file)
@@ -739,9 +739,13 @@ void fhci_queue_urb(struct fhci_hcd *fhci, struct urb *urb)
        }
 
        /* for ISO transfer calculate start frame index */
-       if (ed->mode == FHCI_TF_ISO && urb->transfer_flags & URB_ISO_ASAP)
-               urb->start_frame = ed->td_head ? ed->last_iso + 1 :
+       if (ed->mode == FHCI_TF_ISO) {
+               /* Ignore the possibility of underruns */
+               urb->start_frame = ed->td_head ? ed->next_iso :
                                                 get_frame_num(fhci);
+               ed->next_iso = (urb->start_frame + urb->interval *
+                               urb->number_of_packets) & 0x07ff;
+       }
 
        /*
         * OHCI handles the DATA toggle itself,we just use the USB
index 7cc1c32dc36cdf2c2a05aa4a4a43aa875bb8a9dc..154e6a007727159498a3a5278aa51de69d9e34f0 100644 (file)
@@ -338,7 +338,7 @@ struct ed {
 
        /* read only parameters, should be cleared upon initialization */
        u8 toggle_carry;        /* toggle carry from the last TD submitted */
-       u32 last_iso;           /* time stamp of last queued ISO transfer */
+       u16 next_iso;           /* time stamp of next queued ISO transfer */
        struct td *td_head;     /* a pointer to the current TD handled */
 };