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);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to