aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgbe/ixgbe_ethtool.c
diff options
context:
space:
mode:
authorMallikarjuna R Chilakala <mallikarjuna.chilakala@intel.com>2009-06-04 07:11:34 -0400
committerDavid S. Miller <davem@davemloft.net>2009-06-07 08:20:19 -0400
commit74766013a131f1e1c2fe8fd138e12841eb708060 (patch)
treed5f43b46ca73fb4ddf27cb9e4def521e93286039 /drivers/net/ixgbe/ixgbe_ethtool.c
parent620fa036b2459ca9acf7484c8074147f0dda68da (diff)
ixgbe: ethtool support to change advertised link modes of 82599 adapters
Add ethtool support to change advertised link modes/autoneg settings of 82599 multispeed fiber adapters. Signed-off-by: Mallikarjuna R Chilakala <mallikarjuna.chilakala@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_ethtool.c')
-rw-r--r--drivers/net/ixgbe/ixgbe_ethtool.c42
1 files changed, 24 insertions, 18 deletions
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c
index 1c110459d33b..e0feaf5725bb 100644
--- a/drivers/net/ixgbe/ixgbe_ethtool.c
+++ b/drivers/net/ixgbe/ixgbe_ethtool.c
@@ -136,11 +136,12 @@ static int ixgbe_get_settings(struct net_device *netdev,
136 ecmd->supported = SUPPORTED_10000baseT_Full; 136 ecmd->supported = SUPPORTED_10000baseT_Full;
137 ecmd->autoneg = AUTONEG_ENABLE; 137 ecmd->autoneg = AUTONEG_ENABLE;
138 ecmd->transceiver = XCVR_EXTERNAL; 138 ecmd->transceiver = XCVR_EXTERNAL;
139 if (hw->phy.media_type == ixgbe_media_type_copper) { 139 if ((hw->phy.media_type == ixgbe_media_type_copper) ||
140 (hw->mac.type == ixgbe_mac_82599EB)) {
140 ecmd->supported |= (SUPPORTED_1000baseT_Full | 141 ecmd->supported |= (SUPPORTED_1000baseT_Full |
141 SUPPORTED_TP | SUPPORTED_Autoneg); 142 SUPPORTED_Autoneg);
142 143
143 ecmd->advertising = (ADVERTISED_TP | ADVERTISED_Autoneg); 144 ecmd->advertising = ADVERTISED_Autoneg;
144 if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) 145 if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
145 ecmd->advertising |= ADVERTISED_10000baseT_Full; 146 ecmd->advertising |= ADVERTISED_10000baseT_Full;
146 if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) 147 if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
@@ -155,7 +156,15 @@ static int ixgbe_get_settings(struct net_device *netdev,
155 ecmd->advertising |= (ADVERTISED_10000baseT_Full | 156 ecmd->advertising |= (ADVERTISED_10000baseT_Full |
156 ADVERTISED_1000baseT_Full); 157 ADVERTISED_1000baseT_Full);
157 158
158 ecmd->port = PORT_TP; 159 if (hw->phy.media_type == ixgbe_media_type_copper) {
160 ecmd->supported |= SUPPORTED_TP;
161 ecmd->advertising |= ADVERTISED_TP;
162 ecmd->port = PORT_TP;
163 } else {
164 ecmd->supported |= SUPPORTED_FIBRE;
165 ecmd->advertising |= ADVERTISED_FIBRE;
166 ecmd->port = PORT_FIBRE;
167 }
159 } else if (hw->phy.media_type == ixgbe_media_type_backplane) { 168 } else if (hw->phy.media_type == ixgbe_media_type_backplane) {
160 /* Set as FIBRE until SERDES defined in kernel */ 169 /* Set as FIBRE until SERDES defined in kernel */
161 switch (hw->device_id) { 170 switch (hw->device_id) {
@@ -203,16 +212,10 @@ static int ixgbe_set_settings(struct net_device *netdev,
203 struct ixgbe_adapter *adapter = netdev_priv(netdev); 212 struct ixgbe_adapter *adapter = netdev_priv(netdev);
204 struct ixgbe_hw *hw = &adapter->hw; 213 struct ixgbe_hw *hw = &adapter->hw;
205 u32 advertised, old; 214 u32 advertised, old;
206 s32 err; 215 s32 err = 0;
207 216
208 switch (hw->phy.media_type) { 217 if ((hw->phy.media_type == ixgbe_media_type_copper) ||
209 case ixgbe_media_type_fiber: 218 (hw->mac.type == ixgbe_mac_82599EB)) {
210 if ((ecmd->autoneg == AUTONEG_ENABLE) ||
211 (ecmd->speed + ecmd->duplex != SPEED_10000 + DUPLEX_FULL))
212 return -EINVAL;
213 /* in this case we currently only support 10Gb/FULL */
214 break;
215 case ixgbe_media_type_copper:
216 /* 10000/copper and 1000/copper must autoneg 219 /* 10000/copper and 1000/copper must autoneg
217 * this function does not support any duplex forcing, but can 220 * this function does not support any duplex forcing, but can
218 * limit the advertising of the adapter to only 10000 or 1000 */ 221 * limit the advertising of the adapter to only 10000 or 1000 */
@@ -228,20 +231,23 @@ static int ixgbe_set_settings(struct net_device *netdev,
228 advertised |= IXGBE_LINK_SPEED_1GB_FULL; 231 advertised |= IXGBE_LINK_SPEED_1GB_FULL;
229 232
230 if (old == advertised) 233 if (old == advertised)
231 break; 234 return err;
232 /* this sets the link speed and restarts auto-neg */ 235 /* this sets the link speed and restarts auto-neg */
236 hw->mac.autotry_restart = true;
233 err = hw->mac.ops.setup_link_speed(hw, advertised, true, true); 237 err = hw->mac.ops.setup_link_speed(hw, advertised, true, true);
234 if (err) { 238 if (err) {
235 DPRINTK(PROBE, INFO, 239 DPRINTK(PROBE, INFO,
236 "setup link failed with code %d\n", err); 240 "setup link failed with code %d\n", err);
237 hw->mac.ops.setup_link_speed(hw, old, true, true); 241 hw->mac.ops.setup_link_speed(hw, old, true, true);
238 } 242 }
239 break; 243 } else {
240 default: 244 /* in this case we currently only support 10Gb/FULL */
241 break; 245 if ((ecmd->autoneg == AUTONEG_ENABLE) ||
246 (ecmd->speed + ecmd->duplex != SPEED_10000 + DUPLEX_FULL))
247 return -EINVAL;
242 } 248 }
243 249
244 return 0; 250 return err;
245} 251}
246 252
247static void ixgbe_get_pauseparam(struct net_device *netdev, 253static void ixgbe_get_pauseparam(struct net_device *netdev,