aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_ethtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/netxen/netxen_nic_ethtool.c')
-rw-r--r--drivers/net/netxen/netxen_nic_ethtool.c60
1 files changed, 15 insertions, 45 deletions
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c
index 587498e140b..3bdcc803ec6 100644
--- a/drivers/net/netxen/netxen_nic_ethtool.c
+++ b/drivers/net/netxen/netxen_nic_ethtool.c
@@ -214,7 +214,6 @@ skip:
214 check_sfp_module = netif_running(dev) && 214 check_sfp_module = netif_running(dev) &&
215 adapter->has_link_events; 215 adapter->has_link_events;
216 } else { 216 } else {
217 ecmd->autoneg = AUTONEG_ENABLE;
218 ecmd->supported |= (SUPPORTED_TP |SUPPORTED_Autoneg); 217 ecmd->supported |= (SUPPORTED_TP |SUPPORTED_Autoneg);
219 ecmd->advertising |= 218 ecmd->advertising |=
220 (ADVERTISED_TP | ADVERTISED_Autoneg); 219 (ADVERTISED_TP | ADVERTISED_Autoneg);
@@ -252,53 +251,24 @@ static int
252netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) 251netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
253{ 252{
254 struct netxen_adapter *adapter = netdev_priv(dev); 253 struct netxen_adapter *adapter = netdev_priv(dev);
255 __u32 status; 254 int ret;
256 255
257 /* read which mode */ 256 if (adapter->ahw.port_type != NETXEN_NIC_GBE)
258 if (adapter->ahw.port_type == NETXEN_NIC_GBE) { 257 return -EOPNOTSUPP;
259 /* autonegotiation */
260 if (adapter->phy_write &&
261 adapter->phy_write(adapter,
262 NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG,
263 ecmd->autoneg) != 0)
264 return -EIO;
265 else
266 adapter->link_autoneg = ecmd->autoneg;
267 258
268 if (adapter->phy_read && 259 if (!(adapter->capabilities & NX_FW_CAPABILITY_GBE_LINK_CFG))
269 adapter->phy_read(adapter, 260 return -EOPNOTSUPP;
270 NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
271 &status) != 0)
272 return -EIO;
273 261
274 /* speed */ 262 ret = nx_fw_cmd_set_gbe_port(adapter, ecmd->speed, ecmd->duplex,
275 switch (ecmd->speed) { 263 ecmd->autoneg);
276 case SPEED_10: 264 if (ret == NX_RCODE_NOT_SUPPORTED)
277 netxen_set_phy_speed(status, 0);
278 break;
279 case SPEED_100:
280 netxen_set_phy_speed(status, 1);
281 break;
282 case SPEED_1000:
283 netxen_set_phy_speed(status, 2);
284 break;
285 }
286 /* set duplex mode */
287 if (ecmd->duplex == DUPLEX_HALF)
288 netxen_clear_phy_duplex(status);
289 if (ecmd->duplex == DUPLEX_FULL)
290 netxen_set_phy_duplex(status);
291 if (adapter->phy_write &&
292 adapter->phy_write(adapter,
293 NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
294 *((int *)&status)) != 0)
295 return -EIO;
296 else {
297 adapter->link_speed = ecmd->speed;
298 adapter->link_duplex = ecmd->duplex;
299 }
300 } else
301 return -EOPNOTSUPP; 265 return -EOPNOTSUPP;
266 else if (ret)
267 return -EIO;
268
269 adapter->link_speed = ecmd->speed;
270 adapter->link_duplex = ecmd->duplex;
271 adapter->link_autoneg = ecmd->autoneg;
302 272
303 if (!netif_running(dev)) 273 if (!netif_running(dev))
304 return 0; 274 return 0;
@@ -901,7 +871,7 @@ static int netxen_nic_set_flags(struct net_device *netdev, u32 data)
901 struct netxen_adapter *adapter = netdev_priv(netdev); 871 struct netxen_adapter *adapter = netdev_priv(netdev);
902 int hw_lro; 872 int hw_lro;
903 873
904 if (data & ~ETH_FLAG_LRO) 874 if (ethtool_invalid_flags(netdev, data, ETH_FLAG_LRO))
905 return -EINVAL; 875 return -EINVAL;
906 876
907 if (!(adapter->capabilities & NX_FW_CAPABILITY_HW_LRO)) 877 if (!(adapter->capabilities & NX_FW_CAPABILITY_HW_LRO))