[U-Boot] [PATCH] drivers: usb: fsl: Workaround for Erratum A004477

York Sun yorksun at freescale.com
Fri Apr 24 05:39:50 CEST 2015



On 04/09/2015 08:29 PM, nikhil.badola at freescale.com wrote:
>> -----Original Message-----
>> From: Albert ARIBAUD [mailto:albert.u.boot at aribaud.net]
>> Sent: Friday, November 21, 2014 6:00 PM
>> To: Badola Nikhil-B46172
>> Cc: u-boot at lists.denx.de
>> Subject: Re: [U-Boot] [PATCH] drivers: usb: fsl: Workaround for Erratum
>> A004477
>>
>> Hello Nikhil,
>>
>> On Fri, 21 Nov 2014 17:25:21 +0530, Nikhil Badola
>> <nikhil.badola at freescale.com> wrote:
>>> Add a delay of 1 microsecond before issuing soft reset to the
>>> controller to let ongoing ULPI transaction complete.
>>> This prevents corruption of ULPI Function Control Register which
>>> eventually prevents phy clock from entering to low power mode
>>>
>>> Signed-off-by: Nikhil Badola <nikhil.badola at freescale.com>
>>> ---
>>> 	Depends on patch https://patchwork.ozlabs.org/patch/404879/
>>>
>>>  arch/powerpc/cpu/mpc85xx/cmd_errata.c     |  4 ++++
>>>  arch/powerpc/include/asm/config_mpc85xx.h |  6 ++++++
>>>  drivers/usb/host/ehci-fsl.c               | 10 ++++++++++
>>>  include/fsl_usb.h                         | 29 +++++++++++++++++++++++++++++
>>>  4 files changed, 49 insertions(+)
>>>
>>> diff --git a/arch/powerpc/cpu/mpc85xx/cmd_errata.c
>>> b/arch/powerpc/cpu/mpc85xx/cmd_errata.c
>>> index fe3eb06..bc59352 100644
>>> --- a/arch/powerpc/cpu/mpc85xx/cmd_errata.c
>>> +++ b/arch/powerpc/cpu/mpc85xx/cmd_errata.c
>>> @@ -298,6 +298,10 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int
>> argc, char * const argv[])
>>>  	if (has_erratum_a007798())
>>>  		puts("Work-around for Erratum A007798 enabled\n");
>> #endif
>>> +#ifdef CONFIG_SYS_FSL_ERRATUM_A004477
>>> +	if (has_erratum_a004477())
>>> +		puts("Work-around for Erratum A004477 enabled\n"); #endif
>>>  #ifdef CONFIG_SYS_FSL_ERRATUM_I2C_A004447
>>>  	if ((SVR_SOC_VER(svr) == SVR_8548 && IS_SVR_REV(svr, 3, 1)) ||
>>>  	    (SVR_REV(svr) <= CONFIG_SYS_FSL_A004447_SVR_REV)) diff --git
>>> a/arch/powerpc/include/asm/config_mpc85xx.h
>>> b/arch/powerpc/include/asm/config_mpc85xx.h
>>> index 7860b40..fe9e9c1 100644
>>> --- a/arch/powerpc/include/asm/config_mpc85xx.h
>>> +++ b/arch/powerpc/include/asm/config_mpc85xx.h
>>> @@ -161,6 +161,7 @@
>>>  #define CONFIG_SYS_FSL_ERRATUM_A004508  #define
>>> CONFIG_SYS_FSL_ERRATUM_A007075  #define
>> CONFIG_SYS_FSL_ERRATUM_A006261
>>> +#define CONFIG_SYS_FSL_ERRATUM_A004477
>>>  #define CONFIG_SYS_FSL_A004447_SVR_REV	0x10
>>>  #define CONFIG_ESDHC_HC_BLK_ADDR
>>>
>>> @@ -292,6 +293,7 @@
>>>  #define CONFIG_FSL_SATA_ERRATUM_A001
>>>  #define CONFIG_SYS_FSL_ERRATUM_A004508  #define
>>> CONFIG_SYS_FSL_ERRATUM_A005125
>>> +#define CONFIG_SYS_FSL_ERRATUM_A004477
>>>
>>>  #elif defined(CONFIG_P1023)
>>>  #define CONFIG_MAX_CPUS			2
>>> @@ -372,6 +374,7 @@
>>>  #define CONFIG_SYS_FSL_SRIO_MSG_UNIT_NUM	2
>>>  #define CONFIG_SYS_FSL_ERRATUM_A004508  #define
>>> CONFIG_SYS_FSL_ERRATUM_A005125
>>> +#define CONFIG_SYS_FSL_ERRATUM_A004477
>>>  #define CONFIG_USB_MAX_CONTROLLER_COUNT	1
>>>
>>>  #elif defined(CONFIG_PPC_P2041) /* also supports P2040 */ @@ -589,6
>>> +592,7 @@  #define CONFIG_NAND_FSL_IFC  #define
>>> CONFIG_SYS_FSL_ERRATUM_ESDHC111  #define
>>> CONFIG_SYS_FSL_ERRATUM_A005125
>>> +#define CONFIG_SYS_FSL_ERRATUM_A004477
>>>  #define CONFIG_ESDHC_HC_BLK_ADDR
>>>
>>>  #elif defined(CONFIG_BSC9132)
>>> @@ -613,6 +617,7 @@
>>>  #define CONFIG_SYS_FSL_PCIE_COMPAT	"fsl,qoriq-pcie-v2.2"
>>>  #define CONFIG_SYS_FSL_ERRATUM_A005125  #define
>>> CONFIG_SYS_FSL_ERRATUM_A005434
>>> +#define CONFIG_SYS_FSL_ERRATUM_A004477
>>>  #define CONFIG_SYS_FSL_ERRATUM_I2C_A004447
>>>  #define CONFIG_SYS_FSL_A004447_SVR_REV	0x11
>>>  #define CONFIG_ESDHC_HC_BLK_ADDR
>>> @@ -712,6 +717,7 @@
>>>  #define CONFIG_SYS_FSL_ERRATUM_A006475  #define
>>> CONFIG_SYS_FSL_ERRATUM_A006384  #define
>> CONFIG_SYS_FSL_ERRATUM_A007212
>>> +#define CONFIG_SYS_FSL_ERRATUM_A004477
>>>  #define CONFIG_SYS_CCSRBAR_DEFAULT	0xfe000000
>>>  #define CONFIG_SYS_FSL_SFP_VER_3_0
>>>
>>> diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c
>>> index 5d4288d..41ff1a7 100644
>>> --- a/drivers/usb/host/ehci-fsl.c
>>> +++ b/drivers/usb/host/ehci-fsl.c
>>> @@ -138,6 +138,16 @@ int ehci_hcd_init(int index, enum usb_init_type
>> init,
>>>  	if (has_erratum_a007798())
>>>  		set_txfifothresh(ehci, TXFIFOTHRESH);
>>>
>>> +	if (has_erratum_a004477()) {
>>> +		/*
>>> +		 * When reset is issued while any ULPI transaction is ongoing
>>> +		 * then it may result to corruption of ULPI Function Control
>>> +		 * Register which eventually causes phy clock to enter low
>>> +		 * power mode which stops the clock. Thus delay is required
>>> +		 * before reset to let ongoing ULPI transaction complete.
>>
>> Actually the erratum suggests checking transaction status before issuing a
>> soft reset. Here, could the code do this check and wait for the transation to
>> finish, rather than wait for an arbitrary duration?
> 
> There have been discussions with IP team for changing the suggested workaround.
> The erratum talks about the ULPI transactions i.e from controller to ULPI phy and not 
> the USB schedule transactions .Hence halting the controller before soft reset isn't the 
> correct workaround.
> In addition, as per the current flow of usb start/reset, the controller is always in halt set 
> before issuing soft reset. This is taken care by usb_stop().
> 
> Regarding the delay of 1 microsecond( minimum delay), it seems to be sufficient for ULPI 
> Transactions to complete as ULPI interface runs on 60Mhz clock.
> 

Guys,

Is there any open comment on this patch? Do we all agree on this approach? Are
we still waiting for IP team for the workaround?

York



More information about the U-Boot mailing list