svn commit: r212134 - in head/sys/dev/usb: . controller

Andrew Thompson thompsa at FreeBSD.org
Thu Sep 2 04:01:19 UTC 2010


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_ */


More information about the svn-src-all mailing list