Re: [PATCH v6 1/2] usb: dwc3: xilinx: Fix PIPE clock selection for USB2.0 mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2022-01-25 at 05:36 +0000, Manish Narani wrote:
> Hi Robert,
> 
> > -----Original Message-----
> > From: Robert Hancock <robert.hancock@xxxxxxxxxx>
> > Sent: Tuesday, January 25, 2022 12:31 AM
> > To: Manish Narani <MNARANI@xxxxxxxxxx>; linux-usb@xxxxxxxxxxxxxxx
> > Cc: Michal Simek <michals@xxxxxxxxxx>; sean.anderson@xxxxxxxx;
> > gregkh@xxxxxxxxxxxxxxxxxxx; balbi@xxxxxxxxxx
> > Subject: Re: [PATCH v6 1/2] usb: dwc3: xilinx: Fix PIPE clock selection for
> > USB2.0 mode
> > 
> > On Mon, 2022-01-24 at 06:55 +0000, Manish Narani wrote:
> > > Hi Robert,
> > > 
> > > Thanks for the patch! Please see my comments below inline!
> > > 
> > > > -----Original Message-----
> > > > From: Robert Hancock <robert.hancock@xxxxxxxxxx>
> > > > Sent: Friday, January 21, 2022 11:49 PM
> > > > To: linux-usb@xxxxxxxxxxxxxxx
> > > > Cc: balbi@xxxxxxxxxx; gregkh@xxxxxxxxxxxxxxxxxxx; Michal Simek
> > > > <michals@xxxxxxxxxx>; Manish Narani <MNARANI@xxxxxxxxxx>;
> > > > sean.anderson@xxxxxxxx; Robert Hancock
> > <robert.hancock@xxxxxxxxxx>
> > > > Subject: [PATCH v6 1/2] usb: dwc3: xilinx: Fix PIPE clock selection for
> > > > USB2.0
> > > > mode
> > > > 
> > > > It appears that the PIPE clock should not be selected when only USB 2.0
> > > > is being used in the design and no USB 3.0 reference clock is used. Fix
> > > > to set the correct value depending on whether a USB3 PHY is present.
> > > > 
> > > > Fixes: 84770f028fab ("usb: dwc3: Add driver for Xilinx platforms")
> > > > Signed-off-by: Robert Hancock <robert.hancock@xxxxxxxxxx>
> > > > ---
> > > >  drivers/usb/dwc3/dwc3-xilinx.c | 8 ++++++--
> > > >  1 file changed, 6 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/drivers/usb/dwc3/dwc3-xilinx.c b/drivers/usb/dwc3/dwc3-
> > > > xilinx.c
> > > > index 9cc3ad701a29..dd6218d05159 100644
> > > > --- a/drivers/usb/dwc3/dwc3-xilinx.c
> > > > +++ b/drivers/usb/dwc3/dwc3-xilinx.c
> > > > @@ -167,8 +167,12 @@ static int dwc3_xlnx_init_zynqmp(struct
> > dwc3_xlnx
> > > > *priv_data)
> > > >  	/* Set PIPE Power Present signal in FPD Power Present
> > > > Register*/
> > > >  	writel(FPD_POWER_PRSNT_OPTION, priv_data->regs +
> > > > XLNX_USB_FPD_POWER_PRSNT);
> > > > 
> > > > -	/* Set the PIPE Clock Select bit in FPD PIPE Clock register */
> > > > -	writel(PIPE_CLK_SELECT, priv_data->regs +
> > > > XLNX_USB_FPD_PIPE_CLK);
> > > > +	/*
> > > > +	 * Set the PIPE Clock Select bit in FPD PIPE Clock register if
> > > > a USB3
> > > > +	 * PHY is in use, deselect otherwise
> > > > +	 */
> > > > +	writel(usb3_phy ? PIPE_CLK_SELECT : PIPE_CLK_DESELECT,
> > > > +	       priv_data->regs + XLNX_USB_FPD_PIPE_CLK);
> > > 
> > > When USB3.0 is enabled in the design, FSBL will set this bit to
> > > PIPE_CLK_SELECT
> > > And it's state will be persistent till Linux stage. When this driver
> > > finds
> > > the usb3-phy property
> > > In the device tree, it will again set this bit.
> > > But in case if the usb3-phy is not present in the device tree and design
> > > has
> > > USB3.0 enabled, then this will clear this bit and ultimately it will
> > > fail.
> > > 
> > > It will be better to skip touching that bit in case the device tree does
> > > not
> > > have the usb3-phy property.
> > > This will skip the whole sequence of PHY initialization (reset
> > > assert/deassert are done in order to help initialize PHY).
> > > Something like below should work.
> > 
> > So the original patch was tested against hardware that only had USB 2.0
> > support
> > and seemed to work fine. However, we've since found an issue with some
> > other
> > hardware supporting USB 3.0 where either it doesn't detect devices at all,
> > or
> > they get detected but then seem to drop off the bus very quickly, and we
> > get
> > this repeatedly:
> > 
> > [   99.858607] usb usb2-port1: Cannot enable. Maybe the USB cable is bad?
> > 
> > The same problem is reproducible on the Xilinx ZCU102 board with the same
> > kernel build, where the USB works fine with the Xilinx kernel and a
> > Petalinux
> > 2021.2 pre-built ZCU102 image, so it's no hardware issue.
> > 
> > I've been trying to isolate any relevant differences between the Xilinx
> > kernel
> > and mainline in this respect but haven't had much success. One difference
> > in
> > this particular dwc3-xilinx code is that the Xilinx kernel has code to
> > reset
> > the ULPI PHY which is not in the mainline version yet. However, adding that
> > in
> > doesn't seem to fix the problem.
> > 
> > Have you (or anyone else on the CC list) done any testing of USB 3.0
> > devices
> > and USB 3.0 capable hardware on mainline with ZynqMP to know if this is a
> > more
> > general issue?
> 
> Yes, The USB fixes are work in progress and will be sent to mainline in near
> future.
> This fix is one of them. Your patch is solving the problem in case of USB
> 2.0 
> But not the USB 3.0 entirely. There is this corner case which I mentioned,
> breaks
> USB 3.0 functionality with your patch.

You mentioned the case where the design is using USB 3.0 but the usb3-phy is
missing from the device tree - with this patch it would switch the clock source
into the USB 2 configuration and might break things. I agree it's probably
better to just skip the whole reset process and keep the FSBL clock selection
if it's not needed in the USB 2 case.

We still have another case where USB 3.0 appears to be broken on a setup where
the usb3-phy is specified, and where the Xilinx/Petalinux images work on the
same hardware. I haven't yet isolated whether it is related to the kernel or
might be caused by the different PL logic or PS configuration settings somehow.

> 
> Thanks,
> Manish
> 
> > > ---
> > >         int                     ret;
> > >         u32                     reg;
> > > 
> > > -       usb3_phy = devm_phy_get(dev, "usb3-phy");
> > > -       if (PTR_ERR(usb3_phy) == -EPROBE_DEFER) {
> > > -               ret = -EPROBE_DEFER;
> > > +       usb3_phy = devm_phy_optional_get(dev, "usb3-phy");
> > > +       if (IS_ERR(usb3_phy)) {
> > > +               ret = PTR_ERR(usb3_phy);
> > > +               dev_err_probe(dev, ret, "failed to get USB3 PHY\n");
> > >                 goto err;
> > > -       } else if (IS_ERR(usb3_phy)) {
> > > -               usb3_phy = NULL;
> > >         }
> > > 
> > > +       if (!usb3_phy)
> > > +               goto skip_usb3_phy;
> > > +
> > >         crst = devm_reset_control_get_exclusive(dev, "usb_crst");
> > >         if (IS_ERR(crst)) {
> > >                 ret = PTR_ERR(crst);
> > > @@ -188,6 +190,7 @@ static int dwc3_xlnx_init_zynqmp(struct dwc3_xlnx
> > > *priv_data)
> > >                 goto err;
> > >         }
> > > 
> > > +skip_usb3_phy:
> > >         /*
> > >          * This routes the USB DMA traffic to go through FPD path instead
> > >          * of reaching DDR directly. This traffic routing is needed to
> > > ---
> > > 
> > > Thanks,
> > > Manish
-- 
Robert Hancock
Senior Hardware Designer, Calian Advanced Technologies
www.calian.com




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux