diff options
Diffstat (limited to 'drivers/net/netxen/netxen_nic_ethtool.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_ethtool.c | 149 |
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 | |||
252 | netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | 251 | netxen_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 | ||
709 | static u32 netxen_nic_get_tx_csum(struct net_device *dev) | ||
710 | { | ||
711 | return dev->features & NETIF_F_IP_CSUM; | ||
712 | } | ||
713 | |||
714 | static 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 | |||
720 | static 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 | |||
727 | static 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 | |||
737 | static 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 | |||
751 | static void | 680 | static void |
752 | netxen_nic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | 681 | netxen_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 | ||
885 | static 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 | |||
914 | const struct ethtool_ops netxen_nic_ethtool_ops = { | 814 | const 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 | }; |