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.c149
1 files changed, 20 insertions, 129 deletions
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c
index b30de24f4a52..b34fb74d07e3 100644
--- a/drivers/net/netxen/netxen_nic_ethtool.c
+++ b/drivers/net/netxen/netxen_nic_ethtool.c
@@ -117,7 +117,7 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
117 117
118 ecmd->port = PORT_TP; 118 ecmd->port = PORT_TP;
119 119
120 ecmd->speed = adapter->link_speed; 120 ethtool_cmd_speed_set(ecmd, adapter->link_speed);
121 ecmd->duplex = adapter->link_duplex; 121 ecmd->duplex = adapter->link_duplex;
122 ecmd->autoneg = adapter->link_autoneg; 122 ecmd->autoneg = adapter->link_autoneg;
123 123
@@ -134,7 +134,7 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
134 } 134 }
135 135
136 if (netif_running(dev) && adapter->has_link_events) { 136 if (netif_running(dev) && adapter->has_link_events) {
137 ecmd->speed = adapter->link_speed; 137 ethtool_cmd_speed_set(ecmd, adapter->link_speed);
138 ecmd->autoneg = adapter->link_autoneg; 138 ecmd->autoneg = adapter->link_autoneg;
139 ecmd->duplex = adapter->link_duplex; 139 ecmd->duplex = adapter->link_duplex;
140 goto skip; 140 goto skip;
@@ -146,10 +146,10 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
146 u16 pcifn = adapter->ahw.pci_func; 146 u16 pcifn = adapter->ahw.pci_func;
147 147
148 val = NXRD32(adapter, P3_LINK_SPEED_REG(pcifn)); 148 val = NXRD32(adapter, P3_LINK_SPEED_REG(pcifn));
149 ecmd->speed = P3_LINK_SPEED_MHZ * 149 ethtool_cmd_speed_set(ecmd, P3_LINK_SPEED_MHZ *
150 P3_LINK_SPEED_VAL(pcifn, val); 150 P3_LINK_SPEED_VAL(pcifn, val));
151 } else 151 } else
152 ecmd->speed = SPEED_10000; 152 ethtool_cmd_speed_set(ecmd, SPEED_10000);
153 153
154 ecmd->duplex = DUPLEX_FULL; 154 ecmd->duplex = DUPLEX_FULL;
155 ecmd->autoneg = AUTONEG_DISABLE; 155 ecmd->autoneg = AUTONEG_DISABLE;
@@ -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,25 @@ 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 u32 speed = ethtool_cmd_speed(ecmd);
255 int ret;
256 256
257 /* read which mode */ 257 if (adapter->ahw.port_type != NETXEN_NIC_GBE)
258 if (adapter->ahw.port_type == NETXEN_NIC_GBE) { 258 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 259
268 if (adapter->phy_read && 260 if (!(adapter->capabilities & NX_FW_CAPABILITY_GBE_LINK_CFG))
269 adapter->phy_read(adapter, 261 return -EOPNOTSUPP;
270 NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
271 &status) != 0)
272 return -EIO;
273 262
274 /* speed */ 263 ret = nx_fw_cmd_set_gbe_port(adapter, speed, ecmd->duplex,
275 switch (ecmd->speed) { 264 ecmd->autoneg);
276 case SPEED_10: 265 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; 266 return -EOPNOTSUPP;
267 else if (ret)
268 return -EIO;
269
270 adapter->link_speed = speed;
271 adapter->link_duplex = ecmd->duplex;
272 adapter->link_autoneg = ecmd->autoneg;
302 273
303 if (!netif_running(dev)) 274 if (!netif_running(dev))
304 return 0; 275 return 0;
@@ -706,48 +677,6 @@ netxen_nic_get_ethtool_stats(struct net_device *dev,
706 } 677 }
707} 678}
708 679
709static u32 netxen_nic_get_tx_csum(struct net_device *dev)
710{
711 return dev->features & NETIF_F_IP_CSUM;
712}
713
714static u32 netxen_nic_get_rx_csum(struct net_device *dev)
715{
716 struct netxen_adapter *adapter = netdev_priv(dev);
717 return adapter->rx_csum;
718}
719
720static int netxen_nic_set_rx_csum(struct net_device *dev, u32 data)
721{
722 struct netxen_adapter *adapter = netdev_priv(dev);
723 adapter->rx_csum = !!data;
724 return 0;
725}
726
727static u32 netxen_nic_get_tso(struct net_device *dev)
728{
729 struct netxen_adapter *adapter = netdev_priv(dev);
730
731 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
732 return (dev->features & (NETIF_F_TSO | NETIF_F_TSO6)) != 0;
733
734 return (dev->features & NETIF_F_TSO) != 0;
735}
736
737static int netxen_nic_set_tso(struct net_device *dev, u32 data)
738{
739 if (data) {
740 struct netxen_adapter *adapter = netdev_priv(dev);
741
742 dev->features |= NETIF_F_TSO;
743 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
744 dev->features |= NETIF_F_TSO6;
745 } else
746 dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6);
747
748 return 0;
749}
750
751static void 680static void
752netxen_nic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 681netxen_nic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
753{ 682{
@@ -882,35 +811,6 @@ static int netxen_get_intr_coalesce(struct net_device *netdev,
882 return 0; 811 return 0;
883} 812}
884 813
885static int netxen_nic_set_flags(struct net_device *netdev, u32 data)
886{
887 struct netxen_adapter *adapter = netdev_priv(netdev);
888 int hw_lro;
889
890 if (data & ~ETH_FLAG_LRO)
891 return -EINVAL;
892
893 if (!(adapter->capabilities & NX_FW_CAPABILITY_HW_LRO))
894 return -EINVAL;
895
896 if (data & ETH_FLAG_LRO) {
897 hw_lro = NETXEN_NIC_LRO_ENABLED;
898 netdev->features |= NETIF_F_LRO;
899 } else {
900 hw_lro = 0;
901 netdev->features &= ~NETIF_F_LRO;
902 }
903
904 if (netxen_config_hw_lro(adapter, hw_lro))
905 return -EIO;
906
907 if ((hw_lro == 0) && netxen_send_lro_cleanup(adapter))
908 return -EIO;
909
910
911 return 0;
912}
913
914const struct ethtool_ops netxen_nic_ethtool_ops = { 814const struct ethtool_ops netxen_nic_ethtool_ops = {
915 .get_settings = netxen_nic_get_settings, 815 .get_settings = netxen_nic_get_settings,
916 .set_settings = netxen_nic_set_settings, 816 .set_settings = netxen_nic_set_settings,
@@ -924,21 +824,12 @@ const struct ethtool_ops netxen_nic_ethtool_ops = {
924 .set_ringparam = netxen_nic_set_ringparam, 824 .set_ringparam = netxen_nic_set_ringparam,
925 .get_pauseparam = netxen_nic_get_pauseparam, 825 .get_pauseparam = netxen_nic_get_pauseparam,
926 .set_pauseparam = netxen_nic_set_pauseparam, 826 .set_pauseparam = netxen_nic_set_pauseparam,
927 .get_tx_csum = netxen_nic_get_tx_csum,
928 .set_tx_csum = ethtool_op_set_tx_csum,
929 .set_sg = ethtool_op_set_sg,
930 .get_tso = netxen_nic_get_tso,
931 .set_tso = netxen_nic_set_tso,
932 .get_wol = netxen_nic_get_wol, 827 .get_wol = netxen_nic_get_wol,
933 .set_wol = netxen_nic_set_wol, 828 .set_wol = netxen_nic_set_wol,
934 .self_test = netxen_nic_diag_test, 829 .self_test = netxen_nic_diag_test,
935 .get_strings = netxen_nic_get_strings, 830 .get_strings = netxen_nic_get_strings,
936 .get_ethtool_stats = netxen_nic_get_ethtool_stats, 831 .get_ethtool_stats = netxen_nic_get_ethtool_stats,
937 .get_sset_count = netxen_get_sset_count, 832 .get_sset_count = netxen_get_sset_count,
938 .get_rx_csum = netxen_nic_get_rx_csum,
939 .set_rx_csum = netxen_nic_set_rx_csum,
940 .get_coalesce = netxen_get_intr_coalesce, 833 .get_coalesce = netxen_get_intr_coalesce,
941 .set_coalesce = netxen_set_intr_coalesce, 834 .set_coalesce = netxen_set_intr_coalesce,
942 .get_flags = ethtool_op_get_flags,
943 .set_flags = netxen_nic_set_flags,
944}; 835};