[PATCH] powerpc/usb: fix bug of kernel hang when initializing usb

Pan Jiafei-B37022 B37022 at freescale.com
Fri Feb 17 14:20:18 EST 2012


FYI, I once fixed this issue when backport P5020 BSP for WR Linux, The following is the patch which I have submitted to linuxbj-internal.


From: linuxbj-internal-bounces at linux.freescale.net [mailto:linuxbj-internal-bounces at linux.freescale.net] On Behalf Of Pan Jiafei-B37022
Sent: Friday, December 16, 2011 12:49 PM
To: linuxbj-internal at linux.freescale.net
Cc: Pan Jiafei-B37022
Subject: [Linuxbj-internal] [PATCH] USB: ehci-fsl: Turn on cache snooping on MPC8xxx

If a MPC8xxx was being used, 'have_sysif_regs' should be set and
it should setup cache snooping for all the 4GB space on both PPC32
and PPC64.

Signed-off-by: Pan Jiafei <Jiafei.Pan at freescale.com>
---
drivers/usb/host/ehci-fsl.c |   23 ++++++++++-------------
1 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
index 90534cc..ee14fa7 100644
--- a/drivers/usb/host/ehci-fsl.c
+++ b/drivers/usb/host/ehci-fsl.c
@@ -260,21 +260,18 @@ static void ehci_fsl_usb_setup(struct ehci_hcd *ehci)
    if (pdata->have_sysif_regs) {
          temp = in_be32(non_ehci + FSL_SOC_USB_CTRL);
          out_be32(non_ehci + FSL_SOC_USB_CTRL, temp | 0x00000004);
-          out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0000001b);
-    }

-#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
-    /*
-    * Turn on cache snooping hardware, since some PowerPC platforms
-    * wholly rely on hardware to deal with cache coherent
-    */
+          /*
+          * Turn on cache snooping hardware, since some PowerPC platforms
+          * wholly rely on hardware to deal with cache coherent
+          */

-    /* Setup Snooping for all the 4GB space */
-    /* SNOOP1 starts from 0x0, size 2G */
-    out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB);
-    /* SNOOP2 starts from 0x80000000, size 2G */
-    out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 | SNOOP_SIZE_2GB);
-#endif
+          /* Setup Snooping for all the 4GB space */
+          /* SNOOP1 starts from 0x0, size 2G */
+          out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB);
+          /* SNOOP2 starts from 0x80000000, size 2G */
+          out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 | SNOOP_SIZE_2GB);
+    }

     if ((pdata->operating_mode == FSL_USB2_DR_HOST) ||
               (pdata->operating_mode == FSL_USB2_DR_OTG))
-- 
1.7.5.1

> -----Original Message-----
> From: linuxppc-dev-bounces+jiafei.pan=freescale.com at lists.ozlabs.org
> [mailto:linuxppc-dev-bounces+jiafei.pan=freescale.com at lists.ozlabs.org]
> On Behalf Of Liu Shengzhou-B36685
> Sent: Friday, February 17, 2012 10:33 AM
> To: Benjamin Herrenschmidt
> Cc: linux-usb at vger.kernel.org; linuxppc-dev at lists.ozlabs.org
> Subject: RE: [PATCH] powerpc/usb: fix bug of kernel hang when
> initializing usb
> 
> 
> > -----Original Message-----
> > From: Benjamin Herrenschmidt [mailto:benh at kernel.crashing.org]
> > Sent: Friday, February 17, 2012 8:03 AM
> > To: Liu Shengzhou-B36685
> > Cc: linux-usb at vger.kernel.org; linuxppc-dev at lists.ozlabs.org
> > Subject: Re: [PATCH] powerpc/usb: fix bug of kernel hang when
> > initializing usb
> >
> > On Fri, 2012-02-17 at 09:58 +1100, Benjamin Herrenschmidt wrote:
> > > On Thu, 2012-02-16 at 18:02 +0800, Shengzhou Liu wrote:
> > > > If USB UTMI PHY is not enable, writing to portsc register will
> > > > lead to kernel hang during boot up.
> > > >
> > > > Signed-off-by: Shengzhou Liu <Shengzhou.Liu at freescale.com>
> > > > ---
> > > > Apply for master branch of
> > > > git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-
> > 2.6.git
> > > > Tested on P5020DS, the issue was reported by Benjamin Herrenschmidt.
> > >
> > > This fixes the hang, but sadly doesn't make USB work. I now get:
> >
> >  .../...
> >
> > Ok, found the problem.
> >
> > First, the SDK kernel had a delay after setting that bit, I added that
> > back in. This is not what fixed it but it looks like the right thing
> > to do, though please, use msleep rather than udelay here if possible
> > (not in atomic context).
> >
> > Then, the real culprit is (CC'ing Kumar and Scott to figure out why)
> > this statement:
> >
> > #if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
> > 	/*
> > 	 * Turn on cache snooping hardware, since some PowerPC platforms
> > 	 * wholly rely on hardware to deal with cache coherent
> > 	 */
> >
> > 	/* Setup Snooping for all the 4GB space */
> > 	/* SNOOP1 starts from 0x0, size 2G */
> > 	out_be32(non_ehci + FSL_SOC_USB_SNOOP1, 0x0 | SNOOP_SIZE_2GB);
> > 	/* SNOOP2 starts from 0x80000000, size 2G */
> > 	out_be32(non_ehci + FSL_SOC_USB_SNOOP2, 0x80000000 |
> SNOOP_SIZE_2GB);
> > #endif
> >
> > I'm building a 64-bit kernel so this isn't compiled and it looks like
> > the EHCI is thus not snooping.
> >
> > By removing the defined(CONFIG_PPC32) part of the statement, my
> > problem goes away.
> >
> > Cheers,
> > Ben.
> >
> >
> 
> [Shengzhou] I tested the patch with 32bit P5020DS, USB worked well. Not
> tested with 64-bit kernel.
> Glad to you had found the problem in case of 64-bit, thanks!
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev




More information about the Linuxppc-dev mailing list