diff options
Diffstat (limited to 'drivers/net/fec.c')
-rw-r--r-- | drivers/net/fec.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 5b631fe74738..ed137bbbcf61 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c | |||
@@ -66,17 +66,28 @@ | |||
66 | #define FEC_QUIRK_ENET_MAC (1 << 0) | 66 | #define FEC_QUIRK_ENET_MAC (1 << 0) |
67 | /* Controller needs driver to swap frame */ | 67 | /* Controller needs driver to swap frame */ |
68 | #define FEC_QUIRK_SWAP_FRAME (1 << 1) | 68 | #define FEC_QUIRK_SWAP_FRAME (1 << 1) |
69 | /* Controller uses gasket */ | ||
70 | #define FEC_QUIRK_USE_GASKET (1 << 2) | ||
69 | 71 | ||
70 | static struct platform_device_id fec_devtype[] = { | 72 | static struct platform_device_id fec_devtype[] = { |
71 | { | 73 | { |
74 | /* keep it for coldfire */ | ||
72 | .name = DRIVER_NAME, | 75 | .name = DRIVER_NAME, |
73 | .driver_data = 0, | 76 | .driver_data = 0, |
74 | }, { | 77 | }, { |
78 | .name = "imx25-fec", | ||
79 | .driver_data = FEC_QUIRK_USE_GASKET, | ||
80 | }, { | ||
81 | .name = "imx27-fec", | ||
82 | .driver_data = 0, | ||
83 | }, { | ||
75 | .name = "imx28-fec", | 84 | .name = "imx28-fec", |
76 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME, | 85 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME, |
77 | }, | 86 | }, { |
78 | { } | 87 | /* sentinel */ |
88 | } | ||
79 | }; | 89 | }; |
90 | MODULE_DEVICE_TABLE(platform, fec_devtype); | ||
80 | 91 | ||
81 | static unsigned char macaddr[ETH_ALEN]; | 92 | static unsigned char macaddr[ETH_ALEN]; |
82 | module_param_array(macaddr, byte, NULL, 0); | 93 | module_param_array(macaddr, byte, NULL, 0); |
@@ -427,7 +438,7 @@ fec_restart(struct net_device *ndev, int duplex) | |||
427 | 438 | ||
428 | } else { | 439 | } else { |
429 | #ifdef FEC_MIIGSK_ENR | 440 | #ifdef FEC_MIIGSK_ENR |
430 | if (fep->phy_interface == PHY_INTERFACE_MODE_RMII) { | 441 | if (id_entry->driver_data & FEC_QUIRK_USE_GASKET) { |
431 | /* disable the gasket and wait */ | 442 | /* disable the gasket and wait */ |
432 | writel(0, fep->hwp + FEC_MIIGSK_ENR); | 443 | writel(0, fep->hwp + FEC_MIIGSK_ENR); |
433 | while (readl(fep->hwp + FEC_MIIGSK_ENR) & 4) | 444 | while (readl(fep->hwp + FEC_MIIGSK_ENR) & 4) |
@@ -436,8 +447,11 @@ fec_restart(struct net_device *ndev, int duplex) | |||
436 | /* | 447 | /* |
437 | * configure the gasket: | 448 | * configure the gasket: |
438 | * RMII, 50 MHz, no loopback, no echo | 449 | * RMII, 50 MHz, no loopback, no echo |
450 | * MII, 25 MHz, no loopback, no echo | ||
439 | */ | 451 | */ |
440 | writel(1, fep->hwp + FEC_MIIGSK_CFGR); | 452 | writel((fep->phy_interface == PHY_INTERFACE_MODE_RMII) ? |
453 | 1 : 0, fep->hwp + FEC_MIIGSK_CFGR); | ||
454 | |||
441 | 455 | ||
442 | /* re-enable the gasket */ | 456 | /* re-enable the gasket */ |
443 | writel(2, fep->hwp + FEC_MIIGSK_ENR); | 457 | writel(2, fep->hwp + FEC_MIIGSK_ENR); |