patch "drivers: usb: fsl: Workaround for USB erratum-A005275" added to usb-testing
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drivers: usb: fsl: Workaround for USB erratum-A005275
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-testing branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will be merged to the usb-next branch sometime soon, after it passes testing, and the merge window is open.
If you have any questions about this process, please let me know.
Quoted 1 line
From
f8786a91548df6930643a052e40e5c0b7a8403a5Mon Sep 17 00:00:00 2001
From: Nikhil Badola <[email protected]>
Date: Thu, 6 Aug 2015 14:51:27 +0530
Subject: drivers: usb: fsl: Workaround for USB erratum-A005275
Incoming packets in high speed are randomly corrupted by h/w resulting in multiple errors. This workaround makes FS as default mode in all affected socs by disabling HS chirp signalling.This errata does not affect FS and LS mode.
Forces all HS devices to connect in FS mode for all socs affected by this erratum:
P3041 and P2041 rev 1.0 and 1.1
P5020 and P5010 rev 1.0 and 2.0
P5040, P1010 and T4240 rev 1.0
--- drivers/usb/host/ehci-fsl.c | 4 ++++ drivers/usb/host/ehci-hub.c | 7 +++++++ drivers/usb/host/ehci.h | 12 ++++++++++++ drivers/usb/host/fsl-mph-dr-of.c | 4 ++++ include/linux/fsl_devices.h | 1 + 5 files changed, 28 insertions(+)
drivers/usb/host/ehci-fsl.c +4 -0
@@ -278,6 +278,10 @@ static int ehci_fsl_usb_setup(struct ehci_hcd *ehci)out_be32 (non_ehci +FSL_SOC_USB_SNOOP2 ,0x80000000 |SNOOP_SIZE_2GB ); } +/* Deal with USB erratum A-005275 */ +if (pdata->has_fsl_erratum_a005275 ==1 ) + ehci->has_fsl_hs_errata =1 ; +if ((pdata->operating_mode ==FSL_USB2_DR_HOST ) || (pdata->operating_mode ==FSL_USB2_DR_OTG ))if (ehci_fsl_setup_phy (hcd, pdata->phy_mode,0 ))
drivers/usb/host/ehci-hub.c +7 -0
@@ -1221,6 +1221,13 @@ int ehci_hub_control(*/ ehci->reset_done [wIndex] = jiffies +msecs_to_jiffies (50 ); + +/* +* Force full-speed connect for FSL high-speed +* erratum; disable HS Chirp by setting PFSC bit +*/ +if (ehci_has_fsl_hs_errata (ehci)) + temp |= (1 <<PORTSC_FSL_PFSC ); }ehci_writel (ehci, temp, status_reg);break ;
drivers/usb/host/ehci.h +12 -0
@@ -215,6 +215,7 @@ struct ehci_hcd { /* one per controller *//* SILICON QUIRKS */ unsigned no_selective_suspend:1; unsigned has_fsl_port_bug:1; /* FreeScale */ + unsigned has_fsl_hs_errata:1; /* Freescale HS quirk */ unsigned big_endian_mmio:1; unsigned big_endian_desc:1; unsigned big_endian_capbase:1;
@@ -686,6 +687,17 @@ ehci_port_speed(struct ehci_hcd *ehci, unsigned int portsc)#define ehci_has_fsl_portno_bug (e) (0)#endif +#define PORTSC_FSL_PFSC 24/* Port Force Full-Speed Connect */ + +#if defined(CONFIG_PPC_85xx) +/* Some Freescale processors have an erratum (USB A-005275) in which +* incoming packets get corrupted in HS mode +*/ +#define ehci_has_fsl_hs_errata (e) ((e)->has_fsl_hs_errata) +#else +#define ehci_has_fsl_hs_errata (e) (0) +#endif +/* * While most USB host controllers implement their registers in * little-endian format, a minority (celleb companion chip) implement
drivers/usb/host/fsl-mph-dr-of.c +4 -0
@@ -221,6 +221,10 @@ static int fsl_usb2_mph_dr_of_probe(struct platform_device *ofdev) pdata->has_fsl_erratum_a007792 =1 ; else pdata->has_fsl_erratum_a007792 = 0; +if (of_get_property (np,"fsl,usb-erratum-a005275" ,NULL )) + pdata->has_fsl_erratum_a005275 =1 ; +else + pdata->has_fsl_erratum_a005275 =0 ;/* * Determine whether phy_clk_valid needs to be checked
include/linux/fsl_devices.h +1 -0
@@ -99,6 +99,7 @@ struct fsl_usb2_platform_data { unsigned suspended:1; unsigned already_suspended:1; unsigned has_fsl_erratum_a007792:1; + unsigned has_fsl_erratum_a005275:1; unsigned check_phy_clk_valid:1;/* register save area for suspend/resume */
Signature · 1 line
2.5.0