aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/core/hcd.c8
-rw-r--r--include/linux/usb.h1
2 files changed, 6 insertions, 3 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 2102c4deec1e..0cc14206920a 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1152,7 +1152,7 @@ doit:
1152 /* lower level hcd code should use *_dma exclusively, 1152 /* lower level hcd code should use *_dma exclusively,
1153 * unless it uses pio or talks to another transport. 1153 * unless it uses pio or talks to another transport.
1154 */ 1154 */
1155 if (hcd->self.controller->dma_mask) { 1155 if (hcd->self.uses_dma) {
1156 if (usb_pipecontrol (urb->pipe) 1156 if (usb_pipecontrol (urb->pipe)
1157 && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP)) 1157 && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP))
1158 urb->setup_dma = dma_map_single ( 1158 urb->setup_dma = dma_map_single (
@@ -1585,8 +1585,9 @@ void usb_hcd_giveback_urb (struct usb_hcd *hcd, struct urb *urb, struct pt_regs
1585 at_root_hub = (urb->dev == hcd->self.root_hub); 1585 at_root_hub = (urb->dev == hcd->self.root_hub);
1586 urb_unlink (urb); 1586 urb_unlink (urb);
1587 1587
1588 /* lower level hcd code should use *_dma exclusively */ 1588 /* lower level hcd code should use *_dma exclusively if the
1589 if (hcd->self.controller->dma_mask && !at_root_hub) { 1589 * host controller does DMA */
1590 if (hcd->self.uses_dma && !at_root_hub) {
1590 if (usb_pipecontrol (urb->pipe) 1591 if (usb_pipecontrol (urb->pipe)
1591 && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP)) 1592 && !(urb->transfer_flags & URB_NO_SETUP_DMA_MAP))
1592 dma_unmap_single (hcd->self.controller, urb->setup_dma, 1593 dma_unmap_single (hcd->self.controller, urb->setup_dma,
@@ -1710,6 +1711,7 @@ struct usb_hcd *usb_create_hcd (const struct hc_driver *driver,
1710 hcd->self.release = &hcd_release; 1711 hcd->self.release = &hcd_release;
1711 hcd->self.controller = dev; 1712 hcd->self.controller = dev;
1712 hcd->self.bus_name = bus_name; 1713 hcd->self.bus_name = bus_name;
1714 hcd->self.uses_dma = (dev->dma_mask != NULL);
1713 1715
1714 init_timer(&hcd->rh_timer); 1716 init_timer(&hcd->rh_timer);
1715 hcd->rh_timer.function = rh_timer_func; 1717 hcd->rh_timer.function = rh_timer_func;
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 4709033f8fa7..09661759621f 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -269,6 +269,7 @@ struct usb_bus {
269 struct device *controller; /* host/master side hardware */ 269 struct device *controller; /* host/master side hardware */
270 int busnum; /* Bus number (in order of reg) */ 270 int busnum; /* Bus number (in order of reg) */
271 char *bus_name; /* stable id (PCI slot_name etc) */ 271 char *bus_name; /* stable id (PCI slot_name etc) */
272 u8 uses_dma; /* Does the host controller use DMA? */
272 u8 otg_port; /* 0, or number of OTG/HNP port */ 273 u8 otg_port; /* 0, or number of OTG/HNP port */
273 unsigned is_b_host:1; /* true during some HNP roleswitches */ 274 unsigned is_b_host:1; /* true during some HNP roleswitches */
274 unsigned b_hnp_enable:1; /* OTG: did A-Host enable HNP? */ 275 unsigned b_hnp_enable:1; /* OTG: did A-Host enable HNP? */