From: Gadiyar, Anand > > The Inventra DMA engine used with the MUSB controller in many > SoCs cannot use DMA for control transfers on EP0, but can use > DMA for all other transfers. > > The USB core maps urbs for DMA if hcd->self.uses_dma is true. > (hcd->self.uses_dma is true for MUSB as well). > > Split the uses_dma flag into two - one that says if the > controller needs to use PIO for control transfers, and > another which says if the controller uses DMA (for all > other transfers). > > Also, populate this flag for all MUSB by default. > > (Tested on OMAP3 and OMAP4 boards, with EHCI and MUSB HCDs > simultaneously in use). > > Signed-off-by: Anand Gadiyar <gadiyar@xxxxxx> > Cc: Oliver Neukum <oliver@xxxxxxxxxx> > Cc: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> > Cc: Praveena NADAHALLY <praveen.nadahally@xxxxxxxxxxxxxx> > Cc: Felipe Balbi <felipe.balbi@xxxxxxxxx> > Cc: Ajay Kumar Gupta <ajay.gupta@xxxxxx> Explicitly CC'ing Santosh and Maulik who originally reported the issue and came up with the initial patch. > --- > v2: > - Updated patch addressing Alan's comments > - Remove RFC tag > - Cc Felipe and Ajay for the MUSB parts > > - I've populated the uses_pio_for_control flag for all > MUSB HCDs. Even though some DMA engines used with MUSB may > be able to carry out control transfers using DMA, there may > not be much to be gained. If someone disagrees, I'll respin > the patch to populate this flag for the Inventra engine alone. > > drivers/usb/core/hcd.c | 4 +++- > drivers/usb/musb/musb_core.c | 3 +++ > drivers/usb/musb/musb_gadget.c | 4 ++++ > include/linux/usb.h | 4 ++++ > 4 files changed, 14 insertions(+), 1 deletion(-) > > Index: kernel-omap4-base/drivers/usb/core/hcd.c > =================================================================== > --- kernel-omap4-base.orig/drivers/usb/core/hcd.c 2010-08-04 14:57:04.129928076 +0530 > +++ kernel-omap4-base/drivers/usb/core/hcd.c 2010-08-04 15:02:18.577938877 +0530 > @@ -1321,7 +1321,9 @@ > */ > > if (usb_endpoint_xfer_control(&urb->ep->desc)) { > - if (hcd->self.uses_dma) { > + if (hcd->self.uses_pio_for_control) { > + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; > + } else if (hcd->self.uses_dma) { > urb->setup_dma = dma_map_single( > hcd->self.controller, > urb->setup_packet, > Index: kernel-omap4-base/include/linux/usb.h > =================================================================== > --- kernel-omap4-base.orig/include/linux/usb.h 2010-08-04 14:57:04.109948812 +0530 > +++ kernel-omap4-base/include/linux/usb.h 2010-08-04 14:58:20.817938610 +0530 > @@ -311,6 +311,10 @@ > int busnum; /* Bus number (in order of reg) */ > const char *bus_name; /* stable id (PCI slot_name etc) */ > u8 uses_dma; /* Does the host controller use DMA? */ > + u8 uses_pio_for_control; /* > + * Does the host controller use PIO > + * for control transfers? > + */ > u8 otg_port; /* 0, or number of OTG/HNP port */ > unsigned is_b_host:1; /* true during some HNP roleswitches */ > unsigned b_hnp_enable:1; /* OTG: did A-Host enable HNP? */ > Index: kernel-omap4-base/drivers/usb/musb/musb_core.c > =================================================================== > --- kernel-omap4-base.orig/drivers/usb/musb/musb_core.c 2010-08-04 14:57:04.121928264 +0530 > +++ kernel-omap4-base/drivers/usb/musb/musb_core.c 2010-08-04 14:57:26.642178087 +0530 > @@ -2107,12 +2107,15 @@ > * Otherwise, wait till the gadget driver hooks up. > */ > if (!is_otg_enabled(musb) && is_host_enabled(musb)) { > + struct usb_hcd *hcd = musb_to_hcd(musb); > + > MUSB_HST_MODE(musb); > musb->xceiv->default_a = 1; > musb->xceiv->state = OTG_STATE_A_IDLE; > > status = usb_add_hcd(musb_to_hcd(musb), -1, 0); > > + hcd->self.uses_pio_for_control = 1; > DBG(1, "%s mode, status %d, devctl %02x %c\n", > "HOST", status, > musb_readb(musb->mregs, MUSB_DEVCTL), > Index: kernel-omap4-base/drivers/usb/musb/musb_gadget.c > =================================================================== > --- kernel-omap4-base.orig/drivers/usb/musb/musb_gadget.c 2010-08-04 14:57:04.113928462 +0530 > +++ kernel-omap4-base/drivers/usb/musb/musb_gadget.c 2010-08-04 14:57:26.642178087 +0530 > @@ -1763,6 +1763,8 @@ > spin_unlock_irqrestore(&musb->lock, flags); > > if (is_otg_enabled(musb)) { > + struct usb_hcd *hcd = musb_to_hcd(musb); > + > DBG(3, "OTG startup...\n"); > > /* REVISIT: funcall to other code, which also > @@ -1832,6 +1834,8 @@ > musb->gadget_driver = NULL; > musb->g.dev.driver = NULL; > spin_unlock_irqrestore(&musb->lock, flags); > + } else { > + hcd->self.uses_pio_for_control = 1; > } > } > } > -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html