aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2013-05-29 13:19:10 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-05-30 08:34:31 -0400
commitf467ff4c7dd736b4a3c7e715efed763c0b021838 (patch)
treed597b12f26bbdcc6c8e94f0ef3cd0c266c7ca10a /drivers/usb
parent9db33f317432d1a9e22116092c6455ae71bf73fc (diff)
USB: FHCI: upgrade the isochronous API
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>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/host/fhci-sched.c8
-rw-r--r--drivers/usb/host/fhci.h2
2 files changed, 7 insertions, 3 deletions
diff --git a/drivers/usb/host/fhci-sched.c b/drivers/usb/host/fhci-sched.c
index 8f18538e0ff7..95ca5986e672 100644
--- a/drivers/usb/host/fhci-sched.c
+++ b/drivers/usb/host/fhci-sched.c
@@ -739,9 +739,13 @@ void fhci_queue_urb(struct fhci_hcd *fhci, struct urb *urb)
739 } 739 }
740 740
741 /* for ISO transfer calculate start frame index */ 741 /* for ISO transfer calculate start frame index */
742 if (ed->mode == FHCI_TF_ISO && urb->transfer_flags & URB_ISO_ASAP) 742 if (ed->mode == FHCI_TF_ISO) {
743 urb->start_frame = ed->td_head ? ed->last_iso + 1 : 743 /* Ignore the possibility of underruns */
744 urb->start_frame = ed->td_head ? ed->next_iso :
744 get_frame_num(fhci); 745 get_frame_num(fhci);
746 ed->next_iso = (urb->start_frame + urb->interval *
747 urb->number_of_packets) & 0x07ff;
748 }
745 749
746 /* 750 /*
747 * OHCI handles the DATA toggle itself,we just use the USB 751 * OHCI handles the DATA toggle itself,we just use the USB
diff --git a/drivers/usb/host/fhci.h b/drivers/usb/host/fhci.h
index 7cc1c32dc36c..154e6a007727 100644
--- a/drivers/usb/host/fhci.h
+++ b/drivers/usb/host/fhci.h
@@ -338,7 +338,7 @@ struct ed {
338 338
339 /* read only parameters, should be cleared upon initialization */ 339 /* read only parameters, should be cleared upon initialization */
340 u8 toggle_carry; /* toggle carry from the last TD submitted */ 340 u8 toggle_carry; /* toggle carry from the last TD submitted */
341 u32 last_iso; /* time stamp of last queued ISO transfer */ 341 u16 next_iso; /* time stamp of next queued ISO transfer */
342 struct td *td_head; /* a pointer to the current TD handled */ 342 struct td *td_head; /* a pointer to the current TD handled */
343}; 343};
344 344