Author: thompsa
Date: Thu Sep  2 04:01:18 2010
New Revision: 212134
URL: http://svn.freebsd.org/changeset/base/212134

Log:
  Change argument for usbd_get_dma_delay() from USB bus to USB device, some
  embedded hardware needs to know exactly which device is in question before it
  exactly can decide the required delay.
  
  Submitted by: Hans Petter Selasky

Modified:
  head/sys/dev/usb/controller/ehci.c
  head/sys/dev/usb/controller/ohci.c
  head/sys/dev/usb/controller/uhci.c
  head/sys/dev/usb/usb_controller.h
  head/sys/dev/usb/usb_hub.c
  head/sys/dev/usb/usb_transfer.c
  head/sys/dev/usb/usb_transfer.h

Modified: head/sys/dev/usb/controller/ehci.c
==============================================================================
--- head/sys/dev/usb/controller/ehci.c  Thu Sep  2 03:55:08 2010        
(r212133)
+++ head/sys/dev/usb/controller/ehci.c  Thu Sep  2 04:01:18 2010        
(r212134)
@@ -3804,7 +3804,7 @@ done:
 }
 
 static void
-ehci_get_dma_delay(struct usb_bus *bus, uint32_t *pus)
+ehci_get_dma_delay(struct usb_device *udev, uint32_t *pus)
 {
        /*
         * Wait until the hardware has finished any possible use of

Modified: head/sys/dev/usb/controller/ohci.c
==============================================================================
--- head/sys/dev/usb/controller/ohci.c  Thu Sep  2 03:55:08 2010        
(r212133)
+++ head/sys/dev/usb/controller/ohci.c  Thu Sep  2 04:01:18 2010        
(r212134)
@@ -2630,7 +2630,7 @@ ohci_xfer_unsetup(struct usb_xfer *xfer)
 }
 
 static void
-ohci_get_dma_delay(struct usb_bus *bus, uint32_t *pus)
+ohci_get_dma_delay(struct usb_device *udev, uint32_t *pus)
 {
        /*
         * Wait until hardware has finished any possible use of the

Modified: head/sys/dev/usb/controller/uhci.c
==============================================================================
--- head/sys/dev/usb/controller/uhci.c  Thu Sep  2 03:55:08 2010        
(r212133)
+++ head/sys/dev/usb/controller/uhci.c  Thu Sep  2 04:01:18 2010        
(r212134)
@@ -3084,7 +3084,7 @@ uhci_xfer_unsetup(struct usb_xfer *xfer)
 }
 
 static void
-uhci_get_dma_delay(struct usb_bus *bus, uint32_t *pus)
+uhci_get_dma_delay(struct usb_device *udev, uint32_t *pus)
 {
        /*
         * Wait until hardware has finished any possible use of the

Modified: head/sys/dev/usb/usb_controller.h
==============================================================================
--- head/sys/dev/usb/usb_controller.h   Thu Sep  2 03:55:08 2010        
(r212133)
+++ head/sys/dev/usb/usb_controller.h   Thu Sep  2 04:01:18 2010        
(r212134)
@@ -62,7 +62,7 @@ struct usb_bus_methods {
                    struct usb_endpoint_descriptor *, struct usb_endpoint *);
        void    (*xfer_setup) (struct usb_setup_params *);
        void    (*xfer_unsetup) (struct usb_xfer *);
-       void    (*get_dma_delay) (struct usb_bus *, uint32_t *);
+       void    (*get_dma_delay) (struct usb_device *, uint32_t *);
        void    (*device_suspend) (struct usb_device *);
        void    (*device_resume) (struct usb_device *);
        void    (*set_hw_power) (struct usb_bus *);

Modified: head/sys/dev/usb/usb_hub.c
==============================================================================
--- head/sys/dev/usb/usb_hub.c  Thu Sep  2 03:55:08 2010        (r212133)
+++ head/sys/dev/usb/usb_hub.c  Thu Sep  2 04:01:18 2010        (r212134)
@@ -2105,8 +2105,9 @@ repeat:
                (udev->bus->methods->device_suspend) (udev);
 
                /* do DMA delay */
-               temp = usbd_get_dma_delay(udev->bus);
-               usb_pause_mtx(NULL, USB_MS_TO_TICKS(temp));
+               temp = usbd_get_dma_delay(udev);
+               if (temp != 0)
+                       usb_pause_mtx(NULL, USB_MS_TO_TICKS(temp));
 
        }
        /* suspend current port */

Modified: head/sys/dev/usb/usb_transfer.c
==============================================================================
--- head/sys/dev/usb/usb_transfer.c     Thu Sep  2 03:55:08 2010        
(r212133)
+++ head/sys/dev/usb/usb_transfer.c     Thu Sep  2 04:01:18 2010        
(r212134)
@@ -158,12 +158,16 @@ usbd_update_max_frame_size(struct usb_xf
  * Else: milliseconds of DMA delay
  *------------------------------------------------------------------------*/
 usb_timeout_t
-usbd_get_dma_delay(struct usb_bus *bus)
+usbd_get_dma_delay(struct usb_device *udev)
 {
-       uint32_t temp = 0;
+       struct usb_bus_methods *mtod;
+       uint32_t temp;
 
-       if (bus->methods->get_dma_delay) {
-               (bus->methods->get_dma_delay) (bus, &temp);
+       mtod = udev->bus->methods;
+       temp = 0;
+
+       if (mtod->get_dma_delay) {
+               (mtod->get_dma_delay) (udev, &temp);
                /*
                 * Round up and convert to milliseconds. Note that we use
                 * 1024 milliseconds per second. to save a division.
@@ -1094,9 +1098,11 @@ usbd_transfer_unsetup_sub(struct usb_xfe
 
        if (needs_delay) {
                usb_timeout_t temp;
-               temp = usbd_get_dma_delay(info->bus);
-               usb_pause_mtx(&info->bus->bus_mtx,
-                   USB_MS_TO_TICKS(temp));
+               temp = usbd_get_dma_delay(info->udev);
+               if (temp != 0) {
+                       usb_pause_mtx(&info->bus->bus_mtx,
+                           USB_MS_TO_TICKS(temp));
+               }
        }
 
        /* make sure that our done messages are not queued anywhere */
@@ -2577,7 +2583,7 @@ usbd_callback_wrapper_sub(struct usb_xfe
                /* we can not cancel this delay */
                xfer->flags_int.can_cancel_immed = 0;
 
-               temp = usbd_get_dma_delay(xfer->xroot->bus);
+               temp = usbd_get_dma_delay(xfer->xroot->udev);
 
                DPRINTFN(3, "DMA delay, %u ms, "
                    "on %p\n", temp, xfer);

Modified: head/sys/dev/usb/usb_transfer.h
==============================================================================
--- head/sys/dev/usb/usb_transfer.h     Thu Sep  2 03:55:08 2010        
(r212133)
+++ head/sys/dev/usb/usb_transfer.h     Thu Sep  2 04:01:18 2010        
(r212134)
@@ -131,7 +131,7 @@ usb_callback_t usb_handle_request_callba
 usb_callback_t usb_do_clear_stall_callback;
 void   usbd_transfer_timeout_ms(struct usb_xfer *xfer,
            void (*cb) (void *arg), usb_timeout_t ms);
-usb_timeout_t usbd_get_dma_delay(struct usb_bus *bus);
+usb_timeout_t usbd_get_dma_delay(struct usb_device *udev);
 void   usbd_transfer_power_ref(struct usb_xfer *xfer, int val);
 
 #endif                                 /* _USB_TRANSFER_H_ */
_______________________________________________
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