USB: EHCI: tegra: set txfill_tuning

commit 4f2fe2d274 upstream.

To avoid memory fetch underflows with larger USB transfers, Tegra SoCs
need txfill_tuning's txfifothresh register field set to a non-default
value. Add a custom reset override in order to set this up.

These values are recommended practice for all Tegra chips. However,
I've only noticed practical problems when not setting them this way on
systems using Tegra124. Hence, CC: stable only for recent kernels which
actually support Tegra124.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Tested-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Stephen Warren 2014-04-14 15:21:23 -06:00 committed by Greg Kroah-Hartman
parent 73be2e28cf
commit 7df528e7b9
1 changed files with 23 additions and 0 deletions

View File

@ -513,8 +513,31 @@ static struct platform_driver tegra_ehci_driver = {
}
};
static int tegra_ehci_reset(struct usb_hcd *hcd)
{
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
int retval;
int txfifothresh;
retval = ehci_setup(hcd);
if (retval)
return retval;
/*
* We should really pull this value out of tegra_ehci_soc_config, but
* to avoid needing access to it, make use of the fact that Tegra20 is
* the only one so far that needs a value of 10, and Tegra20 is the
* only one which doesn't set has_hostpc.
*/
txfifothresh = ehci->has_hostpc ? 0x10 : 10;
ehci_writel(ehci, txfifothresh << 16, &ehci->regs->txfill_tuning);
return 0;
}
static const struct ehci_driver_overrides tegra_overrides __initconst = {
.extra_priv_size = sizeof(struct tegra_ehci_hcd),
.reset = tegra_ehci_reset,
};
static int __init ehci_tegra_init(void)