Commit 48496255 authored by Shawn Guo's avatar Shawn Guo Committed by David S. Miller

net: fec: enable hardware checksum only on imx6q-fec

Commit 4c09eed9 (net: fec: Enable imx6 enet checksum acceleration.)
enables hardware checksum acceleration unconditionally for all fec
variants.  This is inappropriate, because some variants like imx5 have
no such support on hardware.  Consequently, fec is broken on these
platforms.  Fix it by enabling hardware checksum only on imx6q-fec type
of controllers.
Signed-off-by: default avatarShawn Guo <shawn.guo@linaro.org>
Reviewed-by: default avatarJim Baxter <jim_baxter@mentor.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1e9e9901
...@@ -87,6 +87,8 @@ ...@@ -87,6 +87,8 @@
#define FEC_QUIRK_HAS_GBIT (1 << 3) #define FEC_QUIRK_HAS_GBIT (1 << 3)
/* Controller has extend desc buffer */ /* Controller has extend desc buffer */
#define FEC_QUIRK_HAS_BUFDESC_EX (1 << 4) #define FEC_QUIRK_HAS_BUFDESC_EX (1 << 4)
/* Controller has hardware checksum support */
#define FEC_QUIRK_HAS_CSUM (1 << 5)
static struct platform_device_id fec_devtype[] = { static struct platform_device_id fec_devtype[] = {
{ {
...@@ -105,7 +107,7 @@ static struct platform_device_id fec_devtype[] = { ...@@ -105,7 +107,7 @@ static struct platform_device_id fec_devtype[] = {
}, { }, {
.name = "imx6q-fec", .name = "imx6q-fec",
.driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
FEC_QUIRK_HAS_BUFDESC_EX, FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM,
}, { }, {
.name = "mvf-fec", .name = "mvf-fec",
.driver_data = FEC_QUIRK_ENET_MAC, .driver_data = FEC_QUIRK_ENET_MAC,
...@@ -1744,6 +1746,8 @@ static const struct net_device_ops fec_netdev_ops = { ...@@ -1744,6 +1746,8 @@ static const struct net_device_ops fec_netdev_ops = {
static int fec_enet_init(struct net_device *ndev) static int fec_enet_init(struct net_device *ndev)
{ {
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
const struct platform_device_id *id_entry =
platform_get_device_id(fep->pdev);
struct bufdesc *cbd_base; struct bufdesc *cbd_base;
/* Allocate memory for buffer descriptors. */ /* Allocate memory for buffer descriptors. */
...@@ -1775,12 +1779,14 @@ static int fec_enet_init(struct net_device *ndev) ...@@ -1775,12 +1779,14 @@ static int fec_enet_init(struct net_device *ndev)
writel(FEC_RX_DISABLED_IMASK, fep->hwp + FEC_IMASK); writel(FEC_RX_DISABLED_IMASK, fep->hwp + FEC_IMASK);
netif_napi_add(ndev, &fep->napi, fec_enet_rx_napi, FEC_NAPI_WEIGHT); netif_napi_add(ndev, &fep->napi, fec_enet_rx_napi, FEC_NAPI_WEIGHT);
if (id_entry->driver_data & FEC_QUIRK_HAS_CSUM) {
/* enable hw accelerator */ /* enable hw accelerator */
ndev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM ndev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM
| NETIF_F_RXCSUM); | NETIF_F_RXCSUM);
ndev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM ndev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM
| NETIF_F_RXCSUM); | NETIF_F_RXCSUM);
fep->csum_flags |= FLAG_RX_CSUM_ENABLED; fep->csum_flags |= FLAG_RX_CSUM_ENABLED;
}
fec_restart(ndev, 0); fec_restart(ndev, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment