Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: fec: don't access RACC register when not available

Not all silicon implementations of the Freescale FEC hardware module
have the RACC (Receive Accelerator Function) register, so we should not
be trying to access it on those that don't. Currently none of the ColdFire
based parts with a FEC have it.

Support for RACC was introduced by commit 4c09eed9 ("net: fec: Enable imx6
enet checksum acceleration"). A fix was introduced in commit d1391930
("net: fec: Fix build for MCF5272") that disables its use on the ColdFire
M5272 part, but it doesn't fix the general case of other ColdFire parts.

To fix we create a quirk flag, FEC_QUIRK_HAS_RACC, and check it before
working with the RACC register.

Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Greg Ungerer and committed by
David S. Miller
18803495 eb686231

+19 -13
+2
drivers/net/ethernet/freescale/fec.h
··· 428 428 #define FEC_QUIRK_BUG_CAPTURE (1 << 10) 429 429 /* Controller has only one MDIO bus */ 430 430 #define FEC_QUIRK_SINGLE_MDIO (1 << 11) 431 + /* Controller supports RACC register */ 432 + #define FEC_QUIRK_HAS_RACC (1 << 12) 431 433 432 434 struct fec_enet_priv_tx_q { 433 435 int index;
+17 -13
drivers/net/ethernet/freescale/fec_main.c
··· 85 85 .driver_data = 0, 86 86 }, { 87 87 .name = "imx25-fec", 88 - .driver_data = FEC_QUIRK_USE_GASKET, 88 + .driver_data = FEC_QUIRK_USE_GASKET | FEC_QUIRK_HAS_RACC, 89 89 }, { 90 90 .name = "imx27-fec", 91 - .driver_data = 0, 91 + .driver_data = FEC_QUIRK_HAS_RACC, 92 92 }, { 93 93 .name = "imx28-fec", 94 94 .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME | 95 - FEC_QUIRK_SINGLE_MDIO, 95 + FEC_QUIRK_SINGLE_MDIO | FEC_QUIRK_HAS_RACC, 96 96 }, { 97 97 .name = "imx6q-fec", 98 98 .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT | 99 99 FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM | 100 - FEC_QUIRK_HAS_VLAN | FEC_QUIRK_ERR006358, 100 + FEC_QUIRK_HAS_VLAN | FEC_QUIRK_ERR006358 | 101 + FEC_QUIRK_HAS_RACC, 101 102 }, { 102 103 .name = "mvf600-fec", 103 - .driver_data = FEC_QUIRK_ENET_MAC, 104 + .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_RACC, 104 105 }, { 105 106 .name = "imx6sx-fec", 106 107 .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT | 107 108 FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM | 108 109 FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB | 109 - FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE, 110 + FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE | 111 + FEC_QUIRK_HAS_RACC, 110 112 }, { 111 113 /* sentinel */ 112 114 } ··· 972 970 writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); 973 971 974 972 #if !defined(CONFIG_M5272) 975 - /* set RX checksum */ 976 - val = readl(fep->hwp + FEC_RACC); 977 - if (fep->csum_flags & FLAG_RX_CSUM_ENABLED) 978 - val |= FEC_RACC_OPTIONS; 979 - else 980 - val &= ~FEC_RACC_OPTIONS; 981 - writel(val, fep->hwp + FEC_RACC); 973 + if (fep->quirks & FEC_QUIRK_HAS_RACC) { 974 + /* set RX checksum */ 975 + val = readl(fep->hwp + FEC_RACC); 976 + if (fep->csum_flags & FLAG_RX_CSUM_ENABLED) 977 + val |= FEC_RACC_OPTIONS; 978 + else 979 + val &= ~FEC_RACC_OPTIONS; 980 + writel(val, fep->hwp + FEC_RACC); 981 + } 982 982 #endif 983 983 984 984 /*