On 20-08-25 15:00:59, Roger Quadros wrote: > From: Pawel Laszczak <pawell@xxxxxxxxxxx> > > USB2.0 PHY hangs in Rx Compliance test when the incoming packet > amplitude is varied below and above the Squelch Level of > Receiver during the active packet multiple times. > > Version 1 of the controller allows PHY to be reset when RX fail condition > is detected to work around the above issue. This feature is > disabled by default and needs to be enabled using a bit from > the newly added PHYRST_CFG register. This patch enables the workaround. > > As there is no way to distinguish between the controller version > before the device controller is started we need to rely on a > DT property to decide when to apply the workaround. Pawel, it could know the controller version at cdns3_gadget_start, but the controller starts when it tries to bind gadget driver, at that time, it has already known the controller version. For me, the device controller starts is using USB_CONF.DEVEN (Device Enable) through usb_gadget_connect, I am not sure if it is the same with yours. Peter > > Signed-off-by: Pawel Laszczak <pawell@xxxxxxxxxxx> > Signed-off-by: Roger Quadros <rogerq@xxxxxx> > --- > drivers/usb/cdns3/core.c | 2 ++ > drivers/usb/cdns3/core.h | 1 + > drivers/usb/cdns3/drd.c | 12 ++++++++++++ > drivers/usb/cdns3/drd.h | 5 ++++- > 4 files changed, 19 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/cdns3/core.c b/drivers/usb/cdns3/core.c > index 5c1586ec7824..34b36487682b 100644 > --- a/drivers/usb/cdns3/core.c > +++ b/drivers/usb/cdns3/core.c > @@ -443,6 +443,8 @@ static int cdns3_probe(struct platform_device *pdev) > return -ENXIO; > } > > + cdns->phyrst_a_enable = device_property_read_bool(dev, "cdns,phyrst-a-enable"); > + > cdns->otg_res = *res; > > mutex_init(&cdns->mutex); > diff --git a/drivers/usb/cdns3/core.h b/drivers/usb/cdns3/core.h > index 1ad1f1fe61e9..24cf0f1b5726 100644 > --- a/drivers/usb/cdns3/core.h > +++ b/drivers/usb/cdns3/core.h > @@ -76,6 +76,7 @@ struct cdns3 { > #define CDNS3_CONTROLLER_V0 0 > #define CDNS3_CONTROLLER_V1 1 > u32 version; > + bool phyrst_a_enable; > > int otg_irq; > int dev_irq; > diff --git a/drivers/usb/cdns3/drd.c b/drivers/usb/cdns3/drd.c > index 6234bcd6158a..b74803e9703d 100644 > --- a/drivers/usb/cdns3/drd.c > +++ b/drivers/usb/cdns3/drd.c > @@ -42,6 +42,18 @@ int cdns3_set_mode(struct cdns3 *cdns, enum usb_dr_mode mode) > reg = readl(&cdns->otg_v1_regs->override); > reg |= OVERRIDE_IDPULLUP; > writel(reg, &cdns->otg_v1_regs->override); > + > + /* > + * Enable work around feature built into the > + * controller to address issue with RX Sensitivity > + * est (EL_17) for USB2 PHY. The issue only occures > + * for 0x0002450D controller version. > + */ > + if (cdns->phyrst_a_enable) { > + reg = readl(&cdns->otg_v1_regs->phyrst_cfg); > + reg |= PHYRST_CFG_PHYRST_A_ENABLE; > + writel(reg, &cdns->otg_v1_regs->phyrst_cfg); > + } > } else { > reg = readl(&cdns->otg_v0_regs->ctrl1); > reg |= OVERRIDE_IDPULLUP_V0; > diff --git a/drivers/usb/cdns3/drd.h b/drivers/usb/cdns3/drd.h > index 7e7cf7fa2dd3..f1ccae285a16 100644 > --- a/drivers/usb/cdns3/drd.h > +++ b/drivers/usb/cdns3/drd.h > @@ -31,7 +31,7 @@ struct cdns3_otg_regs { > __le32 simulate; > __le32 override; > __le32 susp_ctrl; > - __le32 reserved4; > + __le32 phyrst_cfg; > __le32 anasts; > __le32 adp_ramp_time; > __le32 ctrl1; > @@ -153,6 +153,9 @@ struct cdns3_otg_common_regs { > /* Only for CDNS3_CONTROLLER_V0 version */ > #define OVERRIDE_IDPULLUP_V0 BIT(24) > > +/* PHYRST_CFG - bitmasks */ > +#define PHYRST_CFG_PHYRST_A_ENABLE BIT(0) > + > #define CDNS3_ID_PERIPHERAL 1 > #define CDNS3_ID_HOST 0 > > -- > Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. > Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki > -- Thanks, Peter Chen