aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom
diff options
context:
space:
mode:
authorPhilippe Reynes <tremyfr@gmail.com>2016-09-25 17:31:24 -0400
committerDavid S. Miller <davem@davemloft.net>2016-09-26 20:17:09 -0400
commitb6f5be287344433100201c4d6f3f8dcd1755a6b3 (patch)
tree3c52eeaab786a82e7e597d6b66c5e6a0ca09b86e /drivers/net/ethernet/broadcom
parentbe92e538c2727e917ede78d022de8d64381dc213 (diff)
net: tg3: use new api ethtool_{get|set}_link_ksettings
The ethtool api {get|set}_settings is deprecated. We move this driver to new api {get|set}_link_ksettings. Signed-off-by: Philippe Reynes <tremyfr@gmail.com> Acked-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom')
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c112
1 files changed, 62 insertions, 50 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index a2551bcd1027..2726f032f2d4 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -12079,95 +12079,107 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
12079 return ret; 12079 return ret;
12080} 12080}
12081 12081
12082static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) 12082static int tg3_get_link_ksettings(struct net_device *dev,
12083 struct ethtool_link_ksettings *cmd)
12083{ 12084{
12084 struct tg3 *tp = netdev_priv(dev); 12085 struct tg3 *tp = netdev_priv(dev);
12086 u32 supported, advertising;
12085 12087
12086 if (tg3_flag(tp, USE_PHYLIB)) { 12088 if (tg3_flag(tp, USE_PHYLIB)) {
12087 struct phy_device *phydev; 12089 struct phy_device *phydev;
12088 if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)) 12090 if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
12089 return -EAGAIN; 12091 return -EAGAIN;
12090 phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); 12092 phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
12091 return phy_ethtool_gset(phydev, cmd); 12093 return phy_ethtool_ksettings_get(phydev, cmd);
12092 } 12094 }
12093 12095
12094 cmd->supported = (SUPPORTED_Autoneg); 12096 supported = (SUPPORTED_Autoneg);
12095 12097
12096 if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) 12098 if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY))
12097 cmd->supported |= (SUPPORTED_1000baseT_Half | 12099 supported |= (SUPPORTED_1000baseT_Half |
12098 SUPPORTED_1000baseT_Full); 12100 SUPPORTED_1000baseT_Full);
12099 12101
12100 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) { 12102 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) {
12101 cmd->supported |= (SUPPORTED_100baseT_Half | 12103 supported |= (SUPPORTED_100baseT_Half |
12102 SUPPORTED_100baseT_Full | 12104 SUPPORTED_100baseT_Full |
12103 SUPPORTED_10baseT_Half | 12105 SUPPORTED_10baseT_Half |
12104 SUPPORTED_10baseT_Full | 12106 SUPPORTED_10baseT_Full |
12105 SUPPORTED_TP); 12107 SUPPORTED_TP);
12106 cmd->port = PORT_TP; 12108 cmd->base.port = PORT_TP;
12107 } else { 12109 } else {
12108 cmd->supported |= SUPPORTED_FIBRE; 12110 supported |= SUPPORTED_FIBRE;
12109 cmd->port = PORT_FIBRE; 12111 cmd->base.port = PORT_FIBRE;
12110 } 12112 }
12113 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
12114 supported);
12111 12115
12112 cmd->advertising = tp->link_config.advertising; 12116 advertising = tp->link_config.advertising;
12113 if (tg3_flag(tp, PAUSE_AUTONEG)) { 12117 if (tg3_flag(tp, PAUSE_AUTONEG)) {
12114 if (tp->link_config.flowctrl & FLOW_CTRL_RX) { 12118 if (tp->link_config.flowctrl & FLOW_CTRL_RX) {
12115 if (tp->link_config.flowctrl & FLOW_CTRL_TX) { 12119 if (tp->link_config.flowctrl & FLOW_CTRL_TX) {
12116 cmd->advertising |= ADVERTISED_Pause; 12120 advertising |= ADVERTISED_Pause;
12117 } else { 12121 } else {
12118 cmd->advertising |= ADVERTISED_Pause | 12122 advertising |= ADVERTISED_Pause |
12119 ADVERTISED_Asym_Pause; 12123 ADVERTISED_Asym_Pause;
12120 } 12124 }
12121 } else if (tp->link_config.flowctrl & FLOW_CTRL_TX) { 12125 } else if (tp->link_config.flowctrl & FLOW_CTRL_TX) {
12122 cmd->advertising |= ADVERTISED_Asym_Pause; 12126 advertising |= ADVERTISED_Asym_Pause;
12123 } 12127 }
12124 } 12128 }
12129 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
12130 advertising);
12131
12125 if (netif_running(dev) && tp->link_up) { 12132 if (netif_running(dev) && tp->link_up) {
12126 ethtool_cmd_speed_set(cmd, tp->link_config.active_speed); 12133 cmd->base.speed = tp->link_config.active_speed;
12127 cmd->duplex = tp->link_config.active_duplex; 12134 cmd->base.duplex = tp->link_config.active_duplex;
12128 cmd->lp_advertising = tp->link_config.rmt_adv; 12135 ethtool_convert_legacy_u32_to_link_mode(
12136 cmd->link_modes.lp_advertising,
12137 tp->link_config.rmt_adv);
12138
12129 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) { 12139 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES)) {
12130 if (tp->phy_flags & TG3_PHYFLG_MDIX_STATE) 12140 if (tp->phy_flags & TG3_PHYFLG_MDIX_STATE)
12131 cmd->eth_tp_mdix = ETH_TP_MDI_X; 12141 cmd->base.eth_tp_mdix = ETH_TP_MDI_X;
12132 else 12142 else
12133 cmd->eth_tp_mdix = ETH_TP_MDI; 12143 cmd->base.eth_tp_mdix = ETH_TP_MDI;
12134 } 12144 }
12135 } else { 12145 } else {
12136 ethtool_cmd_speed_set(cmd, SPEED_UNKNOWN); 12146 cmd->base.speed = SPEED_UNKNOWN;
12137 cmd->duplex = DUPLEX_UNKNOWN; 12147 cmd->base.duplex = DUPLEX_UNKNOWN;
12138 cmd->eth_tp_mdix = ETH_TP_MDI_INVALID; 12148 cmd->base.eth_tp_mdix = ETH_TP_MDI_INVALID;
12139 } 12149 }
12140 cmd->phy_address = tp->phy_addr; 12150 cmd->base.phy_address = tp->phy_addr;
12141 cmd->transceiver = XCVR_INTERNAL; 12151 cmd->base.autoneg = tp->link_config.autoneg;
12142 cmd->autoneg = tp->link_config.autoneg;
12143 cmd->maxtxpkt = 0;
12144 cmd->maxrxpkt = 0;
12145 return 0; 12152 return 0;
12146} 12153}
12147 12154
12148static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) 12155static int tg3_set_link_ksettings(struct net_device *dev,
12156 const struct ethtool_link_ksettings *cmd)
12149{ 12157{
12150 struct tg3 *tp = netdev_priv(dev); 12158 struct tg3 *tp = netdev_priv(dev);
12151 u32 speed = ethtool_cmd_speed(cmd); 12159 u32 speed = cmd->base.speed;
12160 u32 advertising;
12152 12161
12153 if (tg3_flag(tp, USE_PHYLIB)) { 12162 if (tg3_flag(tp, USE_PHYLIB)) {
12154 struct phy_device *phydev; 12163 struct phy_device *phydev;
12155 if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED)) 12164 if (!(tp->phy_flags & TG3_PHYFLG_IS_CONNECTED))
12156 return -EAGAIN; 12165 return -EAGAIN;
12157 phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr); 12166 phydev = mdiobus_get_phy(tp->mdio_bus, tp->phy_addr);
12158 return phy_ethtool_sset(phydev, cmd); 12167 return phy_ethtool_ksettings_set(phydev, cmd);
12159 } 12168 }
12160 12169
12161 if (cmd->autoneg != AUTONEG_ENABLE && 12170 if (cmd->base.autoneg != AUTONEG_ENABLE &&
12162 cmd->autoneg != AUTONEG_DISABLE) 12171 cmd->base.autoneg != AUTONEG_DISABLE)
12163 return -EINVAL; 12172 return -EINVAL;
12164 12173
12165 if (cmd->autoneg == AUTONEG_DISABLE && 12174 if (cmd->base.autoneg == AUTONEG_DISABLE &&
12166 cmd->duplex != DUPLEX_FULL && 12175 cmd->base.duplex != DUPLEX_FULL &&
12167 cmd->duplex != DUPLEX_HALF) 12176 cmd->base.duplex != DUPLEX_HALF)
12168 return -EINVAL; 12177 return -EINVAL;
12169 12178
12170 if (cmd->autoneg == AUTONEG_ENABLE) { 12179 ethtool_convert_link_mode_to_legacy_u32(&advertising,
12180 cmd->link_modes.advertising);
12181
12182 if (cmd->base.autoneg == AUTONEG_ENABLE) {
12171 u32 mask = ADVERTISED_Autoneg | 12183 u32 mask = ADVERTISED_Autoneg |
12172 ADVERTISED_Pause | 12184 ADVERTISED_Pause |
12173 ADVERTISED_Asym_Pause; 12185 ADVERTISED_Asym_Pause;
@@ -12185,7 +12197,7 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
12185 else 12197 else
12186 mask |= ADVERTISED_FIBRE; 12198 mask |= ADVERTISED_FIBRE;
12187 12199
12188 if (cmd->advertising & ~mask) 12200 if (advertising & ~mask)
12189 return -EINVAL; 12201 return -EINVAL;
12190 12202
12191 mask &= (ADVERTISED_1000baseT_Half | 12203 mask &= (ADVERTISED_1000baseT_Half |
@@ -12195,13 +12207,13 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
12195 ADVERTISED_10baseT_Half | 12207 ADVERTISED_10baseT_Half |
12196 ADVERTISED_10baseT_Full); 12208 ADVERTISED_10baseT_Full);
12197 12209
12198 cmd->advertising &= mask; 12210 advertising &= mask;
12199 } else { 12211 } else {
12200 if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES) { 12212 if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES) {
12201 if (speed != SPEED_1000) 12213 if (speed != SPEED_1000)
12202 return -EINVAL; 12214 return -EINVAL;
12203 12215
12204 if (cmd->duplex != DUPLEX_FULL) 12216 if (cmd->base.duplex != DUPLEX_FULL)
12205 return -EINVAL; 12217 return -EINVAL;
12206 } else { 12218 } else {
12207 if (speed != SPEED_100 && 12219 if (speed != SPEED_100 &&
@@ -12212,16 +12224,16 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
12212 12224
12213 tg3_full_lock(tp, 0); 12225 tg3_full_lock(tp, 0);
12214 12226
12215 tp->link_config.autoneg = cmd->autoneg; 12227 tp->link_config.autoneg = cmd->base.autoneg;
12216 if (cmd->autoneg == AUTONEG_ENABLE) { 12228 if (cmd->base.autoneg == AUTONEG_ENABLE) {
12217 tp->link_config.advertising = (cmd->advertising | 12229 tp->link_config.advertising = (advertising |
12218 ADVERTISED_Autoneg); 12230 ADVERTISED_Autoneg);
12219 tp->link_config.speed = SPEED_UNKNOWN; 12231 tp->link_config.speed = SPEED_UNKNOWN;
12220 tp->link_config.duplex = DUPLEX_UNKNOWN; 12232 tp->link_config.duplex = DUPLEX_UNKNOWN;
12221 } else { 12233 } else {
12222 tp->link_config.advertising = 0; 12234 tp->link_config.advertising = 0;
12223 tp->link_config.speed = speed; 12235 tp->link_config.speed = speed;
12224 tp->link_config.duplex = cmd->duplex; 12236 tp->link_config.duplex = cmd->base.duplex;
12225 } 12237 }
12226 12238
12227 tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED; 12239 tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED;
@@ -14094,8 +14106,6 @@ static int tg3_get_eee(struct net_device *dev, struct ethtool_eee *edata)
14094} 14106}
14095 14107
14096static const struct ethtool_ops tg3_ethtool_ops = { 14108static const struct ethtool_ops tg3_ethtool_ops = {
14097 .get_settings = tg3_get_settings,
14098 .set_settings = tg3_set_settings,
14099 .get_drvinfo = tg3_get_drvinfo, 14109 .get_drvinfo = tg3_get_drvinfo,
14100 .get_regs_len = tg3_get_regs_len, 14110 .get_regs_len = tg3_get_regs_len,
14101 .get_regs = tg3_get_regs, 14111 .get_regs = tg3_get_regs,
@@ -14128,6 +14138,8 @@ static const struct ethtool_ops tg3_ethtool_ops = {
14128 .get_ts_info = tg3_get_ts_info, 14138 .get_ts_info = tg3_get_ts_info,
14129 .get_eee = tg3_get_eee, 14139 .get_eee = tg3_get_eee,
14130 .set_eee = tg3_set_eee, 14140 .set_eee = tg3_set_eee,
14141 .get_link_ksettings = tg3_get_link_ksettings,
14142 .set_link_ksettings = tg3_set_link_ksettings,
14131}; 14143};
14132 14144
14133static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, 14145static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,