Message ID | 1486372421-29073-7-git-send-email-peter.chen@nxp.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, On Mon, Feb 6, 2017 at 2:43 PM, Peter Chen <peter.chen@nxp.com> wrote: > From: Arnd Bergmann <arnd@arndb.de> > > For xhci-hcd platform device, all the DMA parameters are not > configured properly, notably dma ops for dwc3 devices. So, set > the dma for xhci from sysdev. sysdev is pointing to device that > is known to the system firmware or hardware. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > Signed-off-by: Sriram Dash <sriram.dash@nxp.com> > Tested-by: Baolin Wang <baolin.wang@linaro.org> > Tested-by: Vivek Gautam <vivek.gautam@codeaurora.org> > Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> > Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> > --- This patch doesn't work for me anymore on db820c target [1]. While the same kernel with reverts of patches [2] [3] and an older patch [4] by Grygorii Strashko works [5]. [1] https://github.com/vivekgautam1/linux/tree/linux-v4.10-rc7-usb-db820c-nonworking [2] 8c9f2de459c7 usb: dwc3: Do not set dma coherent mask [3] d64ff406e51e usb: dwc3: use bus->sysdev for DMA configuration [4] https://lkml.org/lkml/2016/4/25/813 [5] https://github.com/vivekgautam1/linux/tree/linux-v4.10-rc7-usb-db820c regards Vivek
Hi Peter, Sriram, Arnd, On Mon, Feb 06, 2017 at 05:13:38PM +0800, Peter Chen wrote: > From: Arnd Bergmann <arnd@arndb.de> > > For xhci-hcd platform device, all the DMA parameters are not > configured properly, notably dma ops for dwc3 devices. So, set > the dma for xhci from sysdev. sysdev is pointing to device that > is known to the system firmware or hardware. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > Signed-off-by: Sriram Dash <sriram.dash@nxp.com> > Tested-by: Baolin Wang <baolin.wang@linaro.org> > Tested-by: Vivek Gautam <vivek.gautam@codeaurora.org> > Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> > Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> > --- > diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c > index 6d33b42..7a9c860 100644 > --- a/drivers/usb/host/xhci-plat.c > +++ b/drivers/usb/host/xhci-plat.c > - hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); > + hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, > + dev_name(&pdev->dev), NULL); As mentioned already in [1], usb_create_shared_hcd() is called to create the second bus, however it also needs to be converted. Not exactly as Roger's suggestion but this worked for me: - xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev, + xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, dev_name(&pdev->dev), hcd); if (!xhci->shared_hcd) { ret = -ENOMEM; Without this, SuperSpeed devices fail to enumerate: usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd usb 2-1: device descriptor read/8, error -11 usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd usb 2-1: device descriptor read/8, error -11 usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd usb 2-1: device descriptor read/8, error -11 usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd usb 2-1: device descriptor read/8, error -11 <and continues...> Thanks, Jack [1] https://lkml.org/lkml/2016/12/9/240
On Wed, Feb 08, 2017 at 12:43:00PM -0800, Jack Pham wrote: > Hi Peter, Sriram, Arnd, > > On Mon, Feb 06, 2017 at 05:13:38PM +0800, Peter Chen wrote: > > From: Arnd Bergmann <arnd@arndb.de> > > > > For xhci-hcd platform device, all the DMA parameters are not > > configured properly, notably dma ops for dwc3 devices. So, set > > the dma for xhci from sysdev. sysdev is pointing to device that > > is known to the system firmware or hardware. > > > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > > Signed-off-by: Sriram Dash <sriram.dash@nxp.com> > > Tested-by: Baolin Wang <baolin.wang@linaro.org> > > Tested-by: Vivek Gautam <vivek.gautam@codeaurora.org> > > Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> > > Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> > > --- > > diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c > > index 6d33b42..7a9c860 100644 > > --- a/drivers/usb/host/xhci-plat.c > > +++ b/drivers/usb/host/xhci-plat.c > > > - hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); > > + hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, > > + dev_name(&pdev->dev), NULL); > > As mentioned already in [1], usb_create_shared_hcd() is called to create > the second bus, however it also needs to be converted. > > Not exactly as Roger's suggestion but this worked for me: > > - xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev, > + xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, > dev_name(&pdev->dev), hcd); > if (!xhci->shared_hcd) { > ret = -ENOMEM; > > Without this, SuperSpeed devices fail to enumerate: > > usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd > usb 2-1: device descriptor read/8, error -11 > usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd > usb 2-1: device descriptor read/8, error -11 > usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd > usb 2-1: device descriptor read/8, error -11 > usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd > usb 2-1: device descriptor read/8, error -11 > <and continues...> > > Thanks, > Jack > Do you work at same platform with Vivek Gautam? I see his tested-by tag in this patch. I have no dwc3 platform to test, I only got patches from [1], and rebase to Greg's usb-next, the rebase has a conflict, and I made a change which is similar to revert below patch, but it is definitely not your problem. commit 488dc164914ff5ce5e913abd32048d28fc0d06b8 Author: Mathias Nyman <mathias.nyman@linux.intel.com> Date: Fri Jan 20 15:38:24 2017 +0200 xhci: remove WARN_ON if dma mask is not set for platform devices [1] http://www.spinics.net/lists/linux-usb/msg152375.html
On Wed, Feb 08, 2017 at 05:27:31PM +0530, Vivek Gautam wrote: > Hi, > > > On Mon, Feb 6, 2017 at 2:43 PM, Peter Chen <peter.chen@nxp.com> wrote: > > From: Arnd Bergmann <arnd@arndb.de> > > > > For xhci-hcd platform device, all the DMA parameters are not > > configured properly, notably dma ops for dwc3 devices. So, set > > the dma for xhci from sysdev. sysdev is pointing to device that > > is known to the system firmware or hardware. > > > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > > Signed-off-by: Sriram Dash <sriram.dash@nxp.com> > > Tested-by: Baolin Wang <baolin.wang@linaro.org> > > Tested-by: Vivek Gautam <vivek.gautam@codeaurora.org> > > Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> > > Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> > > --- > > This patch doesn't work for me anymore on db820c target [1]. > While the same kernel with reverts of patches [2] [3] and an older > patch [4] by Grygorii Strashko works [5]. > > [1] https://github.com/vivekgautam1/linux/tree/linux-v4.10-rc7-usb-db820c-nonworking > [2] 8c9f2de459c7 usb: dwc3: Do not set dma coherent mask > [3] d64ff406e51e usb: dwc3: use bus->sysdev for DMA configuration > [4] https://lkml.org/lkml/2016/4/25/813 > [5] https://github.com/vivekgautam1/linux/tree/linux-v4.10-rc7-usb-db820c > > The [2] and [3] have already at mainline, you may talk with Felipe about it.
On Thu, Feb 9, 2017 at 7:11 AM, Peter Chen <hzpeterchen@gmail.com> wrote: > On Wed, Feb 08, 2017 at 12:43:00PM -0800, Jack Pham wrote: >> Hi Peter, Sriram, Arnd, >> >> On Mon, Feb 06, 2017 at 05:13:38PM +0800, Peter Chen wrote: >> > From: Arnd Bergmann <arnd@arndb.de> >> > >> > For xhci-hcd platform device, all the DMA parameters are not >> > configured properly, notably dma ops for dwc3 devices. So, set >> > the dma for xhci from sysdev. sysdev is pointing to device that >> > is known to the system firmware or hardware. >> > >> > Signed-off-by: Arnd Bergmann <arnd@arndb.de> >> > Signed-off-by: Sriram Dash <sriram.dash@nxp.com> >> > Tested-by: Baolin Wang <baolin.wang@linaro.org> >> > Tested-by: Vivek Gautam <vivek.gautam@codeaurora.org> >> > Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> >> > Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> >> > --- >> > diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c >> > index 6d33b42..7a9c860 100644 >> > --- a/drivers/usb/host/xhci-plat.c >> > +++ b/drivers/usb/host/xhci-plat.c >> >> > - hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); >> > + hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, >> > + dev_name(&pdev->dev), NULL); >> >> As mentioned already in [1], usb_create_shared_hcd() is called to create >> the second bus, however it also needs to be converted. >> >> Not exactly as Roger's suggestion but this worked for me: >> >> - xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev, >> + xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, >> dev_name(&pdev->dev), hcd); >> if (!xhci->shared_hcd) { >> ret = -ENOMEM; >> >> Without this, SuperSpeed devices fail to enumerate: >> >> usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> <and continues...> >> >> Thanks, >> Jack >> > > Do you work at same platform with Vivek Gautam? I see his tested-by > tag in this patch. The patches [1] had worked for me on 4.9-rc4. But with (a) usb-next merged on 4.10-rc7 (b) this patch and [PATCH 3/9] in this series: [PATCH v12 3/9] usb: separate out sysdev pointer from usb_bus and, (c) phy patches for msm8996 [2] along with necessary device tree patches I get a hang when SuperSpeed device is being enumerated on db820c. The change above suggested by Jack works for me too, and i hope that's the right way to do things. I can give a Tested-by again with the changes for shared_hcd in the next version. [1] https://lkml.org/lkml/2016/11/17/339 [2] https://lkml.org/lkml/2017/1/10/225 > > I have no dwc3 platform to test, I only got patches from [1], and rebase to > Greg's usb-next, the rebase has a conflict, and I made a > change which is similar to revert below patch, but it is definitely > not your problem. > > commit 488dc164914ff5ce5e913abd32048d28fc0d06b8 > Author: Mathias Nyman <mathias.nyman@linux.intel.com> > Date: Fri Jan 20 15:38:24 2017 +0200 > > xhci: remove WARN_ON if dma mask is not set for platform devices > > > [1] http://www.spinics.net/lists/linux-usb/msg152375.html > > -- > > Best Regards, > Peter Chen > -- > To unsubscribe from this list: send the line "unsubscribe linux-usb" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
On 08/02/17 22:43, Jack Pham wrote: > Hi Peter, Sriram, Arnd, > > On Mon, Feb 06, 2017 at 05:13:38PM +0800, Peter Chen wrote: >> From: Arnd Bergmann <arnd@arndb.de> >> >> For xhci-hcd platform device, all the DMA parameters are not >> configured properly, notably dma ops for dwc3 devices. So, set >> the dma for xhci from sysdev. sysdev is pointing to device that >> is known to the system firmware or hardware. >> >> Signed-off-by: Arnd Bergmann <arnd@arndb.de> >> Signed-off-by: Sriram Dash <sriram.dash@nxp.com> >> Tested-by: Baolin Wang <baolin.wang@linaro.org> >> Tested-by: Vivek Gautam <vivek.gautam@codeaurora.org> >> Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> >> Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> >> --- >> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c >> index 6d33b42..7a9c860 100644 >> --- a/drivers/usb/host/xhci-plat.c >> +++ b/drivers/usb/host/xhci-plat.c > >> - hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); >> + hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, >> + dev_name(&pdev->dev), NULL); > > As mentioned already in [1], usb_create_shared_hcd() is called to create > the second bus, however it also needs to be converted. > > Not exactly as Roger's suggestion but this worked for me: > > - xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev, > + xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, > dev_name(&pdev->dev), hcd); But we're creating a shared_hcd and there is an API for that so why not use it instead of calling __usb_create_hcd()? > if (!xhci->shared_hcd) { > ret = -ENOMEM; > > Without this, SuperSpeed devices fail to enumerate: > > usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd > usb 2-1: device descriptor read/8, error -11 > usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd > usb 2-1: device descriptor read/8, error -11 > usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd > usb 2-1: device descriptor read/8, error -11 > usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd > usb 2-1: device descriptor read/8, error -11 > <and continues...> > > Thanks, > Jack > > [1] https://lkml.org/lkml/2016/12/9/240 >
On 09/02/17 13:53, Roger Quadros wrote: > > > On 08/02/17 22:43, Jack Pham wrote: >> Hi Peter, Sriram, Arnd, >> >> On Mon, Feb 06, 2017 at 05:13:38PM +0800, Peter Chen wrote: >>> From: Arnd Bergmann <arnd@arndb.de> >>> >>> For xhci-hcd platform device, all the DMA parameters are not >>> configured properly, notably dma ops for dwc3 devices. So, set >>> the dma for xhci from sysdev. sysdev is pointing to device that >>> is known to the system firmware or hardware. >>> >>> Signed-off-by: Arnd Bergmann <arnd@arndb.de> >>> Signed-off-by: Sriram Dash <sriram.dash@nxp.com> >>> Tested-by: Baolin Wang <baolin.wang@linaro.org> >>> Tested-by: Vivek Gautam <vivek.gautam@codeaurora.org> >>> Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> >>> Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> >>> --- >>> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c >>> index 6d33b42..7a9c860 100644 >>> --- a/drivers/usb/host/xhci-plat.c >>> +++ b/drivers/usb/host/xhci-plat.c >> >>> - hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); >>> + hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, >>> + dev_name(&pdev->dev), NULL); >> >> As mentioned already in [1], usb_create_shared_hcd() is called to create >> the second bus, however it also needs to be converted. >> >> Not exactly as Roger's suggestion but this worked for me: >> >> - xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev, >> + xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, >> dev_name(&pdev->dev), hcd); > > But we're creating a shared_hcd and there is an API for that so why not use it > instead of calling __usb_create_hcd()? > Just realized after I pressed send that there is no sysdev parameter for create_shared_hcd(). >> if (!xhci->shared_hcd) { >> ret = -ENOMEM; >> >> Without this, SuperSpeed devices fail to enumerate: >> >> usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> <and continues...> >> >> Thanks, >> Jack >> >> [1] https://lkml.org/lkml/2016/12/9/240 >> >
On Thu, Feb 9, 2017 at 5:23 PM, Roger Quadros <rogerq@ti.com> wrote: > > > On 08/02/17 22:43, Jack Pham wrote: >> Hi Peter, Sriram, Arnd, >> >> On Mon, Feb 06, 2017 at 05:13:38PM +0800, Peter Chen wrote: >>> From: Arnd Bergmann <arnd@arndb.de> >>> >>> For xhci-hcd platform device, all the DMA parameters are not >>> configured properly, notably dma ops for dwc3 devices. So, set >>> the dma for xhci from sysdev. sysdev is pointing to device that >>> is known to the system firmware or hardware. >>> >>> Signed-off-by: Arnd Bergmann <arnd@arndb.de> >>> Signed-off-by: Sriram Dash <sriram.dash@nxp.com> >>> Tested-by: Baolin Wang <baolin.wang@linaro.org> >>> Tested-by: Vivek Gautam <vivek.gautam@codeaurora.org> >>> Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> >>> Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> >>> --- >>> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c >>> index 6d33b42..7a9c860 100644 >>> --- a/drivers/usb/host/xhci-plat.c >>> +++ b/drivers/usb/host/xhci-plat.c >> >>> - hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); >>> + hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, >>> + dev_name(&pdev->dev), NULL); >> >> As mentioned already in [1], usb_create_shared_hcd() is called to create >> the second bus, however it also needs to be converted. >> >> Not exactly as Roger's suggestion but this worked for me: >> >> - xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev, >> + xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, >> dev_name(&pdev->dev), hcd); > > But we're creating a shared_hcd and there is an API for that so why not use it > instead of calling __usb_create_hcd()? Do we not want to pass on the DMA configuration from sysdev to shared_hcd as well? > >> if (!xhci->shared_hcd) { >> ret = -ENOMEM; >> >> Without this, SuperSpeed devices fail to enumerate: >> >> usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd >> usb 2-1: device descriptor read/8, error -11 >> <and continues...> >> >> Thanks, >> Jack >> >> [1] https://lkml.org/lkml/2016/12/9/240 >> > > -- > cheers, > -roger > -- > To unsubscribe from this list: send the line "unsubscribe linux-usb" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Feb 9, 2017 at 5:24 PM, Roger Quadros <rogerq@ti.com> wrote: > > > On 09/02/17 13:53, Roger Quadros wrote: >> >> >> On 08/02/17 22:43, Jack Pham wrote: >>> Hi Peter, Sriram, Arnd, >>> >>> On Mon, Feb 06, 2017 at 05:13:38PM +0800, Peter Chen wrote: >>>> From: Arnd Bergmann <arnd@arndb.de> >>>> >>>> For xhci-hcd platform device, all the DMA parameters are not >>>> configured properly, notably dma ops for dwc3 devices. So, set >>>> the dma for xhci from sysdev. sysdev is pointing to device that >>>> is known to the system firmware or hardware. >>>> >>>> Signed-off-by: Arnd Bergmann <arnd@arndb.de> >>>> Signed-off-by: Sriram Dash <sriram.dash@nxp.com> >>>> Tested-by: Baolin Wang <baolin.wang@linaro.org> >>>> Tested-by: Vivek Gautam <vivek.gautam@codeaurora.org> >>>> Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> >>>> Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> >>>> --- >>>> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c >>>> index 6d33b42..7a9c860 100644 >>>> --- a/drivers/usb/host/xhci-plat.c >>>> +++ b/drivers/usb/host/xhci-plat.c >>> >>>> - hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); >>>> + hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, >>>> + dev_name(&pdev->dev), NULL); >>> >>> As mentioned already in [1], usb_create_shared_hcd() is called to create >>> the second bus, however it also needs to be converted. >>> >>> Not exactly as Roger's suggestion but this worked for me: >>> >>> - xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev, >>> + xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, >>> dev_name(&pdev->dev), hcd); >> >> But we're creating a shared_hcd and there is an API for that so why not use it >> instead of calling __usb_create_hcd()? >> > > Just realized after I pressed send that there is no sysdev parameter > for create_shared_hcd(). That's right. The create_shared_hcd() makes use of only pdev->dev, and we need to configure dma for shared_hcd as well though sysdev. Sorry my mail client didn't show this mail in time. Please ignore my earlier comment. > >>> if (!xhci->shared_hcd) { >>> ret = -ENOMEM; >>> >>> Without this, SuperSpeed devices fail to enumerate: >>> >>> usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd >>> usb 2-1: device descriptor read/8, error -11 >>> usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd >>> usb 2-1: device descriptor read/8, error -11 >>> usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd >>> usb 2-1: device descriptor read/8, error -11 >>> usb 2-1: new SuperSpeed USB device number 3 using xhci-hcd >>> usb 2-1: device descriptor read/8, error -11 >>> <and continues...> >>> >>> Thanks, >>> Jack >>> >>> [1] https://lkml.org/lkml/2016/12/9/240 >>> >> > > -- > cheers, > -roger > -- > To unsubscribe from this list: send the line "unsubscribe linux-usb" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Feb 09, 2017 at 05:40:50PM +0530, Vivek Gautam wrote: > On Thu, Feb 9, 2017 at 5:24 PM, Roger Quadros <rogerq@ti.com> wrote: > > > > > > On 09/02/17 13:53, Roger Quadros wrote: > >> > >> > >> On 08/02/17 22:43, Jack Pham wrote: > >>> Hi Peter, Sriram, Arnd, > >>> > >>> On Mon, Feb 06, 2017 at 05:13:38PM +0800, Peter Chen wrote: > >>>> From: Arnd Bergmann <arnd@arndb.de> > >>>> > >>>> For xhci-hcd platform device, all the DMA parameters are not > >>>> configured properly, notably dma ops for dwc3 devices. So, set > >>>> the dma for xhci from sysdev. sysdev is pointing to device that > >>>> is known to the system firmware or hardware. > >>>> > >>>> Signed-off-by: Arnd Bergmann <arnd@arndb.de> > >>>> Signed-off-by: Sriram Dash <sriram.dash@nxp.com> > >>>> Tested-by: Baolin Wang <baolin.wang@linaro.org> > >>>> Tested-by: Vivek Gautam <vivek.gautam@codeaurora.org> > >>>> Tested-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> > >>>> Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> > >>>> --- > >>>> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c > >>>> index 6d33b42..7a9c860 100644 > >>>> --- a/drivers/usb/host/xhci-plat.c > >>>> +++ b/drivers/usb/host/xhci-plat.c > >>> > >>>> - hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); > >>>> + hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, > >>>> + dev_name(&pdev->dev), NULL); > >>> > >>> As mentioned already in [1], usb_create_shared_hcd() is called to create > >>> the second bus, however it also needs to be converted. > >>> > >>> Not exactly as Roger's suggestion but this worked for me: > >>> > >>> - xhci->shared_hcd = usb_create_shared_hcd(driver, &pdev->dev, > >>> + xhci->shared_hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, > >>> dev_name(&pdev->dev), hcd); > >> > >> But we're creating a shared_hcd and there is an API for that so why not use it > >> instead of calling __usb_create_hcd()? > >> > > > > Just realized after I pressed send that there is no sysdev parameter > > for create_shared_hcd(). Roger, does this change also work for you? If it is, please add a tested-by tag for my v13 patch set.
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index ba1853f4..032a702 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -586,7 +586,7 @@ static void xhci_free_stream_ctx(struct xhci_hcd *xhci, unsigned int num_stream_ctxs, struct xhci_stream_ctx *stream_ctx, dma_addr_t dma) { - struct device *dev = xhci_to_hcd(xhci)->self.controller; + struct device *dev = xhci_to_hcd(xhci)->self.sysdev; size_t size = sizeof(struct xhci_stream_ctx) * num_stream_ctxs; if (size > MEDIUM_STREAM_ARRAY_SIZE) @@ -614,7 +614,7 @@ static struct xhci_stream_ctx *xhci_alloc_stream_ctx(struct xhci_hcd *xhci, unsigned int num_stream_ctxs, dma_addr_t *dma, gfp_t mem_flags) { - struct device *dev = xhci_to_hcd(xhci)->self.controller; + struct device *dev = xhci_to_hcd(xhci)->self.sysdev; size_t size = sizeof(struct xhci_stream_ctx) * num_stream_ctxs; if (size > MEDIUM_STREAM_ARRAY_SIZE) @@ -1686,7 +1686,7 @@ void xhci_slot_copy(struct xhci_hcd *xhci, static int scratchpad_alloc(struct xhci_hcd *xhci, gfp_t flags) { int i; - struct device *dev = xhci_to_hcd(xhci)->self.controller; + struct device *dev = xhci_to_hcd(xhci)->self.sysdev; int num_sp = HCS_MAX_SCRATCHPAD(xhci->hcs_params2); xhci_dbg_trace(xhci, trace_xhci_dbg_init, @@ -1758,7 +1758,7 @@ static void scratchpad_free(struct xhci_hcd *xhci) { int num_sp; int i; - struct device *dev = xhci_to_hcd(xhci)->self.controller; + struct device *dev = xhci_to_hcd(xhci)->self.sysdev; if (!xhci->scratchpad) return; @@ -1831,7 +1831,7 @@ void xhci_free_command(struct xhci_hcd *xhci, void xhci_mem_cleanup(struct xhci_hcd *xhci) { - struct device *dev = xhci_to_hcd(xhci)->self.controller; + struct device *dev = xhci_to_hcd(xhci)->self.sysdev; int size; int i, j, num_ports; @@ -2373,7 +2373,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) { dma_addr_t dma; - struct device *dev = xhci_to_hcd(xhci)->self.controller; + struct device *dev = xhci_to_hcd(xhci)->self.sysdev; unsigned int val, val2; u64 val_64; struct xhci_segment *seg; diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 6d33b42..7a9c860 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -14,6 +14,7 @@ #include <linux/clk.h> #include <linux/dma-mapping.h> #include <linux/module.h> +#include <linux/pci.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/usb/phy.h> @@ -148,6 +149,7 @@ static int xhci_plat_probe(struct platform_device *pdev) { const struct of_device_id *match; const struct hc_driver *driver; + struct device *sysdev; struct xhci_hcd *xhci; struct resource *res; struct usb_hcd *hcd; @@ -164,22 +166,39 @@ static int xhci_plat_probe(struct platform_device *pdev) if (irq < 0) return -ENODEV; + /* + * sysdev must point to a device that is known to the system firmware + * or PCI hardware. We handle these three cases here: + * 1. xhci_plat comes from firmware + * 2. xhci_plat is child of a device from firmware (dwc3-plat) + * 3. xhci_plat is grandchild of a pci device (dwc3-pci) + */ + sysdev = &pdev->dev; + if (sysdev->parent && !sysdev->of_node && sysdev->parent->of_node) + sysdev = sysdev->parent; +#ifdef CONFIG_PCI + else if (sysdev->parent && sysdev->parent->parent && + sysdev->parent->parent->bus == &pci_bus_type) + sysdev = sysdev->parent->parent; +#endif + /* Try to set 64-bit DMA first */ - if (!pdev->dev.dma_mask) + if (WARN_ON(!sysdev->dma_mask)) /* Platform did not initialize dma_mask */ - ret = dma_coerce_mask_and_coherent(&pdev->dev, + ret = dma_coerce_mask_and_coherent(sysdev, DMA_BIT_MASK(64)); else - ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); + ret = dma_set_mask_and_coherent(sysdev, DMA_BIT_MASK(64)); /* If seting 64-bit DMA mask fails, fall back to 32-bit DMA mask */ if (ret) { - ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); + ret = dma_set_mask_and_coherent(sysdev, DMA_BIT_MASK(32)); if (ret) return ret; } - hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); + hcd = __usb_create_hcd(driver, sysdev, &pdev->dev, + dev_name(&pdev->dev), NULL); if (!hcd) return -ENOMEM; @@ -229,13 +248,13 @@ static int xhci_plat_probe(struct platform_device *pdev) goto disable_clk; } - if (device_property_read_bool(&pdev->dev, "usb3-lpm-capable")) + if (device_property_read_bool(sysdev, "usb3-lpm-capable")) xhci->quirks |= XHCI_LPM_SUPPORT; if (device_property_read_bool(&pdev->dev, "quirk-broken-port-ped")) xhci->quirks |= XHCI_BROKEN_PORT_PED; - hcd->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0); + hcd->usb_phy = devm_usb_get_phy_by_phandle(sysdev, "usb-phy", 0); if (IS_ERR(hcd->usb_phy)) { ret = PTR_ERR(hcd->usb_phy); if (ret == -EPROBE_DEFER) diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 6d6c460..ab0839c 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -237,6 +237,9 @@ static int xhci_free_msi(struct xhci_hcd *xhci) static int xhci_setup_msi(struct xhci_hcd *xhci) { int ret; + /* + * TODO:Check with MSI Soc for sysdev + */ struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); ret = pci_enable_msi(pdev); @@ -263,7 +266,7 @@ static int xhci_setup_msi(struct xhci_hcd *xhci) */ static void xhci_free_irq(struct xhci_hcd *xhci) { - struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); + struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.sysdev); int ret; /* return if using legacy interrupt */ @@ -748,7 +751,7 @@ void xhci_shutdown(struct usb_hcd *hcd) struct xhci_hcd *xhci = hcd_to_xhci(hcd); if (xhci->quirks & XHCI_SPURIOUS_REBOOT) - usb_disable_xhci_ports(to_pci_dev(hcd->self.controller)); + usb_disable_xhci_ports(to_pci_dev(hcd->self.sysdev)); spin_lock_irq(&xhci->lock); xhci_halt(xhci); @@ -765,7 +768,7 @@ void xhci_shutdown(struct usb_hcd *hcd) /* Yet another workaround for spurious wakeups at shutdown with HSW */ if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) - pci_set_power_state(to_pci_dev(hcd->self.controller), PCI_D3hot); + pci_set_power_state(to_pci_dev(hcd->self.sysdev), PCI_D3hot); } #ifdef CONFIG_PM @@ -4801,7 +4804,11 @@ int xhci_get_frame(struct usb_hcd *hcd) int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) { struct xhci_hcd *xhci; - struct device *dev = hcd->self.controller; + /* + * TODO: Check with DWC3 clients for sysdev according to + * quirks + */ + struct device *dev = hcd->self.sysdev; int retval; /* Accept arbitrarily long scatter-gather lists */