svn commit: r234961 - in head/sys/dev/usb: . controller
Hans Petter Selasky
hselasky at FreeBSD.org
Thu May 3 16:06:23 UTC 2012
Author: hselasky
Date: Thu May 3 16:06:22 2012
New Revision: 234961
URL: http://svn.freebsd.org/changeset/base/234961
Log:
Make sure the EHCI bandwidth allocation algorithm
for FULL speed SPLIT transactions works fully.
MFC after: 1 week
Modified:
head/sys/dev/usb/controller/ehci.c
head/sys/dev/usb/usb_transfer.c
Modified: head/sys/dev/usb/controller/ehci.c
==============================================================================
--- head/sys/dev/usb/controller/ehci.c Thu May 3 16:05:34 2012 (r234960)
+++ head/sys/dev/usb/controller/ehci.c Thu May 3 16:06:22 2012 (r234961)
@@ -2638,11 +2638,29 @@ ehci_device_isoc_fs_enter(struct usb_xfe
/* update isoc_next */
xfer->endpoint->isoc_next = (pp_last - &sc->sc_isoc_fs_p_last[0]) &
(EHCI_VIRTUAL_FRAMELIST_COUNT - 1);
+
+ /*
+ * We don't allow cancelling of the SPLIT transaction USB FULL
+ * speed transfer, because it disturbs the bandwidth
+ * computation algorithm.
+ */
+ xfer->flags_int.can_cancel_immed = 0;
}
static void
ehci_device_isoc_fs_start(struct usb_xfer *xfer)
{
+ /*
+ * We don't allow cancelling of the SPLIT transaction USB FULL
+ * speed transfer, because it disturbs the bandwidth
+ * computation algorithm.
+ */
+ xfer->flags_int.can_cancel_immed = 0;
+
+ /* set a default timeout */
+ if (xfer->timeout == 0)
+ xfer->timeout = 500; /* ms */
+
/* put transfer on interrupt queue */
ehci_transfer_intr_enqueue(xfer);
}
Modified: head/sys/dev/usb/usb_transfer.c
==============================================================================
--- head/sys/dev/usb/usb_transfer.c Thu May 3 16:05:34 2012 (r234960)
+++ head/sys/dev/usb/usb_transfer.c Thu May 3 16:06:22 2012 (r234961)
@@ -1681,11 +1681,12 @@ usbd_pipe_enter(struct usb_xfer *xfer)
DPRINTF("enter\n");
+ /* the transfer can now be cancelled */
+ xfer->flags_int.can_cancel_immed = 1;
+
/* enter the transfer */
(ep->methods->enter) (xfer);
- xfer->flags_int.can_cancel_immed = 1;
-
/* check for transfer error */
if (xfer->error) {
/* some error has happened */
@@ -2418,13 +2419,15 @@ usbd_transfer_start_cb(void *arg)
#if USB_HAVE_PF
usbpf_xfertap(xfer, USBPF_XFERTAP_SUBMIT);
#endif
+
+ /* the transfer can now be cancelled */
+ xfer->flags_int.can_cancel_immed = 1;
+
/* start USB transfer, if no error */
if (xfer->error == 0)
(ep->methods->start) (xfer);
- xfer->flags_int.can_cancel_immed = 1;
-
- /* check for error */
+ /* check for transfer error */
if (xfer->error) {
/* some error has happened */
usbd_transfer_done(xfer, 0);
@@ -2599,13 +2602,14 @@ usbd_pipe_start(struct usb_xfer_queue *p
#if USB_HAVE_PF
usbpf_xfertap(xfer, USBPF_XFERTAP_SUBMIT);
#endif
+ /* the transfer can now be cancelled */
+ xfer->flags_int.can_cancel_immed = 1;
+
/* start USB transfer, if no error */
if (xfer->error == 0)
(ep->methods->start) (xfer);
- xfer->flags_int.can_cancel_immed = 1;
-
- /* check for error */
+ /* check for transfer error */
if (xfer->error) {
/* some error has happened */
usbd_transfer_done(xfer, 0);
More information about the svn-src-all
mailing list