diff options
Diffstat (limited to 'drivers/net/ethernet/marvell')
-rw-r--r-- | drivers/net/ethernet/marvell/mvneta.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index 2777c70c603b..e35bac7cfdf1 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c | |||
@@ -138,7 +138,9 @@ | |||
138 | #define MVNETA_GMAC_FORCE_LINK_PASS BIT(1) | 138 | #define MVNETA_GMAC_FORCE_LINK_PASS BIT(1) |
139 | #define MVNETA_GMAC_CONFIG_MII_SPEED BIT(5) | 139 | #define MVNETA_GMAC_CONFIG_MII_SPEED BIT(5) |
140 | #define MVNETA_GMAC_CONFIG_GMII_SPEED BIT(6) | 140 | #define MVNETA_GMAC_CONFIG_GMII_SPEED BIT(6) |
141 | #define MVNETA_GMAC_AN_SPEED_EN BIT(7) | ||
141 | #define MVNETA_GMAC_CONFIG_FULL_DUPLEX BIT(12) | 142 | #define MVNETA_GMAC_CONFIG_FULL_DUPLEX BIT(12) |
143 | #define MVNETA_GMAC_AN_DUPLEX_EN BIT(13) | ||
142 | #define MVNETA_MIB_COUNTERS_BASE 0x3080 | 144 | #define MVNETA_MIB_COUNTERS_BASE 0x3080 |
143 | #define MVNETA_MIB_LATE_COLLISION 0x7c | 145 | #define MVNETA_MIB_LATE_COLLISION 0x7c |
144 | #define MVNETA_DA_FILT_SPEC_MCAST 0x3400 | 146 | #define MVNETA_DA_FILT_SPEC_MCAST 0x3400 |
@@ -948,6 +950,13 @@ static void mvneta_defaults_set(struct mvneta_port *pp) | |||
948 | /* Assign port SDMA configuration */ | 950 | /* Assign port SDMA configuration */ |
949 | mvreg_write(pp, MVNETA_SDMA_CONFIG, val); | 951 | mvreg_write(pp, MVNETA_SDMA_CONFIG, val); |
950 | 952 | ||
953 | /* Disable PHY polling in hardware, since we're using the | ||
954 | * kernel phylib to do this. | ||
955 | */ | ||
956 | val = mvreg_read(pp, MVNETA_UNIT_CONTROL); | ||
957 | val &= ~MVNETA_PHY_POLLING_ENABLE; | ||
958 | mvreg_write(pp, MVNETA_UNIT_CONTROL, val); | ||
959 | |||
951 | mvneta_set_ucast_table(pp, -1); | 960 | mvneta_set_ucast_table(pp, -1); |
952 | mvneta_set_special_mcast_table(pp, -1); | 961 | mvneta_set_special_mcast_table(pp, -1); |
953 | mvneta_set_other_mcast_table(pp, -1); | 962 | mvneta_set_other_mcast_table(pp, -1); |
@@ -2340,7 +2349,9 @@ static void mvneta_adjust_link(struct net_device *ndev) | |||
2340 | val = mvreg_read(pp, MVNETA_GMAC_AUTONEG_CONFIG); | 2349 | val = mvreg_read(pp, MVNETA_GMAC_AUTONEG_CONFIG); |
2341 | val &= ~(MVNETA_GMAC_CONFIG_MII_SPEED | | 2350 | val &= ~(MVNETA_GMAC_CONFIG_MII_SPEED | |
2342 | MVNETA_GMAC_CONFIG_GMII_SPEED | | 2351 | MVNETA_GMAC_CONFIG_GMII_SPEED | |
2343 | MVNETA_GMAC_CONFIG_FULL_DUPLEX); | 2352 | MVNETA_GMAC_CONFIG_FULL_DUPLEX | |
2353 | MVNETA_GMAC_AN_SPEED_EN | | ||
2354 | MVNETA_GMAC_AN_DUPLEX_EN); | ||
2344 | 2355 | ||
2345 | if (phydev->duplex) | 2356 | if (phydev->duplex) |
2346 | val |= MVNETA_GMAC_CONFIG_FULL_DUPLEX; | 2357 | val |= MVNETA_GMAC_CONFIG_FULL_DUPLEX; |
@@ -2473,6 +2484,21 @@ static int mvneta_stop(struct net_device *dev) | |||
2473 | return 0; | 2484 | return 0; |
2474 | } | 2485 | } |
2475 | 2486 | ||
2487 | static int mvneta_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | ||
2488 | { | ||
2489 | struct mvneta_port *pp = netdev_priv(dev); | ||
2490 | int ret; | ||
2491 | |||
2492 | if (!pp->phy_dev) | ||
2493 | return -ENOTSUPP; | ||
2494 | |||
2495 | ret = phy_mii_ioctl(pp->phy_dev, ifr, cmd); | ||
2496 | if (!ret) | ||
2497 | mvneta_adjust_link(dev); | ||
2498 | |||
2499 | return ret; | ||
2500 | } | ||
2501 | |||
2476 | /* Ethtool methods */ | 2502 | /* Ethtool methods */ |
2477 | 2503 | ||
2478 | /* Get settings (phy address, speed) for ethtools */ | 2504 | /* Get settings (phy address, speed) for ethtools */ |
@@ -2591,6 +2617,7 @@ static const struct net_device_ops mvneta_netdev_ops = { | |||
2591 | .ndo_change_mtu = mvneta_change_mtu, | 2617 | .ndo_change_mtu = mvneta_change_mtu, |
2592 | .ndo_tx_timeout = mvneta_tx_timeout, | 2618 | .ndo_tx_timeout = mvneta_tx_timeout, |
2593 | .ndo_get_stats64 = mvneta_get_stats64, | 2619 | .ndo_get_stats64 = mvneta_get_stats64, |
2620 | .ndo_do_ioctl = mvneta_ioctl, | ||
2594 | }; | 2621 | }; |
2595 | 2622 | ||
2596 | const struct ethtool_ops mvneta_eth_tool_ops = { | 2623 | const struct ethtool_ops mvneta_eth_tool_ops = { |