aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/netxen/netxen_nic.h2
-rw-r--r--drivers/net/netxen/netxen_nic_ethtool.c102
-rw-r--r--drivers/net/netxen/netxen_nic_init.c3
-rw-r--r--drivers/net/netxen/netxen_nic_main.c53
4 files changed, 46 insertions, 114 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h
index d7299f1a4940..15595b3a54c6 100644
--- a/drivers/net/netxen/netxen_nic.h
+++ b/drivers/net/netxen/netxen_nic.h
@@ -1177,7 +1177,7 @@ struct netxen_adapter {
1177 u8 max_sds_rings; 1177 u8 max_sds_rings;
1178 u8 driver_mismatch; 1178 u8 driver_mismatch;
1179 u8 msix_supported; 1179 u8 msix_supported;
1180 u8 rx_csum; 1180 u8 __pad;
1181 u8 pci_using_dac; 1181 u8 pci_using_dac;
1182 u8 portnum; 1182 u8 portnum;
1183 u8 physical_port; 1183 u8 physical_port;
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c
index 3bdcc803ec68..29f90baaa79b 100644
--- a/drivers/net/netxen/netxen_nic_ethtool.c
+++ b/drivers/net/netxen/netxen_nic_ethtool.c
@@ -676,62 +676,6 @@ netxen_nic_get_ethtool_stats(struct net_device *dev,
676 } 676 }
677} 677}
678 678
679static u32 netxen_nic_get_tx_csum(struct net_device *dev)
680{
681 return dev->features & NETIF_F_IP_CSUM;
682}
683
684static u32 netxen_nic_get_rx_csum(struct net_device *dev)
685{
686 struct netxen_adapter *adapter = netdev_priv(dev);
687 return adapter->rx_csum;
688}
689
690static int netxen_nic_set_rx_csum(struct net_device *dev, u32 data)
691{
692 struct netxen_adapter *adapter = netdev_priv(dev);
693
694 if (data) {
695 adapter->rx_csum = data;
696 return 0;
697 }
698
699 if (dev->features & NETIF_F_LRO) {
700 if (netxen_config_hw_lro(adapter, NETXEN_NIC_LRO_DISABLED))
701 return -EIO;
702
703 dev->features &= ~NETIF_F_LRO;
704 netxen_send_lro_cleanup(adapter);
705 netdev_info(dev, "disabling LRO as rx_csum is off\n");
706 }
707 adapter->rx_csum = data;
708 return 0;
709}
710
711static u32 netxen_nic_get_tso(struct net_device *dev)
712{
713 struct netxen_adapter *adapter = netdev_priv(dev);
714
715 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
716 return (dev->features & (NETIF_F_TSO | NETIF_F_TSO6)) != 0;
717
718 return (dev->features & NETIF_F_TSO) != 0;
719}
720
721static int netxen_nic_set_tso(struct net_device *dev, u32 data)
722{
723 if (data) {
724 struct netxen_adapter *adapter = netdev_priv(dev);
725
726 dev->features |= NETIF_F_TSO;
727 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
728 dev->features |= NETIF_F_TSO6;
729 } else
730 dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6);
731
732 return 0;
733}
734
735static void 679static void
736netxen_nic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 680netxen_nic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
737{ 681{
@@ -866,43 +810,6 @@ static int netxen_get_intr_coalesce(struct net_device *netdev,
866 return 0; 810 return 0;
867} 811}
868 812
869static int netxen_nic_set_flags(struct net_device *netdev, u32 data)
870{
871 struct netxen_adapter *adapter = netdev_priv(netdev);
872 int hw_lro;
873
874 if (ethtool_invalid_flags(netdev, data, ETH_FLAG_LRO))
875 return -EINVAL;
876
877 if (!(adapter->capabilities & NX_FW_CAPABILITY_HW_LRO))
878 return -EINVAL;
879
880 if (!adapter->rx_csum) {
881 netdev_info(netdev, "rx csum is off, cannot toggle LRO\n");
882 return -EINVAL;
883 }
884
885 if (!!(data & ETH_FLAG_LRO) == !!(netdev->features & NETIF_F_LRO))
886 return 0;
887
888 if (data & ETH_FLAG_LRO) {
889 hw_lro = NETXEN_NIC_LRO_ENABLED;
890 netdev->features |= NETIF_F_LRO;
891 } else {
892 hw_lro = NETXEN_NIC_LRO_DISABLED;
893 netdev->features &= ~NETIF_F_LRO;
894 }
895
896 if (netxen_config_hw_lro(adapter, hw_lro))
897 return -EIO;
898
899 if ((hw_lro == 0) && netxen_send_lro_cleanup(adapter))
900 return -EIO;
901
902
903 return 0;
904}
905
906const struct ethtool_ops netxen_nic_ethtool_ops = { 813const struct ethtool_ops netxen_nic_ethtool_ops = {
907 .get_settings = netxen_nic_get_settings, 814 .get_settings = netxen_nic_get_settings,
908 .set_settings = netxen_nic_set_settings, 815 .set_settings = netxen_nic_set_settings,
@@ -916,21 +823,12 @@ const struct ethtool_ops netxen_nic_ethtool_ops = {
916 .set_ringparam = netxen_nic_set_ringparam, 823 .set_ringparam = netxen_nic_set_ringparam,
917 .get_pauseparam = netxen_nic_get_pauseparam, 824 .get_pauseparam = netxen_nic_get_pauseparam,
918 .set_pauseparam = netxen_nic_set_pauseparam, 825 .set_pauseparam = netxen_nic_set_pauseparam,
919 .get_tx_csum = netxen_nic_get_tx_csum,
920 .set_tx_csum = ethtool_op_set_tx_csum,
921 .set_sg = ethtool_op_set_sg,
922 .get_tso = netxen_nic_get_tso,
923 .set_tso = netxen_nic_set_tso,
924 .get_wol = netxen_nic_get_wol, 826 .get_wol = netxen_nic_get_wol,
925 .set_wol = netxen_nic_set_wol, 827 .set_wol = netxen_nic_set_wol,
926 .self_test = netxen_nic_diag_test, 828 .self_test = netxen_nic_diag_test,
927 .get_strings = netxen_nic_get_strings, 829 .get_strings = netxen_nic_get_strings,
928 .get_ethtool_stats = netxen_nic_get_ethtool_stats, 830 .get_ethtool_stats = netxen_nic_get_ethtool_stats,
929 .get_sset_count = netxen_get_sset_count, 831 .get_sset_count = netxen_get_sset_count,
930 .get_rx_csum = netxen_nic_get_rx_csum,
931 .set_rx_csum = netxen_nic_set_rx_csum,
932 .get_coalesce = netxen_get_intr_coalesce, 832 .get_coalesce = netxen_get_intr_coalesce,
933 .set_coalesce = netxen_set_intr_coalesce, 833 .set_coalesce = netxen_set_intr_coalesce,
934 .get_flags = ethtool_op_get_flags,
935 .set_flags = netxen_nic_set_flags,
936}; 834};
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
index 731077d8d962..7f999671c7b2 100644
--- a/drivers/net/netxen/netxen_nic_init.c
+++ b/drivers/net/netxen/netxen_nic_init.c
@@ -1483,7 +1483,8 @@ static struct sk_buff *netxen_process_rxbuf(struct netxen_adapter *adapter,
1483 if (!skb) 1483 if (!skb)
1484 goto no_skb; 1484 goto no_skb;
1485 1485
1486 if (likely(adapter->rx_csum && cksum == STATUS_CKSUM_OK)) { 1486 if (likely((adapter->netdev->features & NETIF_F_RXCSUM)
1487 && cksum == STATUS_CKSUM_OK)) {
1487 adapter->stats.csummed++; 1488 adapter->stats.csummed++;
1488 skb->ip_summed = CHECKSUM_UNNECESSARY; 1489 skb->ip_summed = CHECKSUM_UNNECESSARY;
1489 } else 1490 } else
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index 933671556c15..201b944bd463 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -485,6 +485,37 @@ static void netxen_set_multicast_list(struct net_device *dev)
485 adapter->set_multi(dev); 485 adapter->set_multi(dev);
486} 486}
487 487
488static u32 netxen_fix_features(struct net_device *dev, u32 features)
489{
490 if (!(features & NETIF_F_RXCSUM)) {
491 netdev_info(dev, "disabling LRO as RXCSUM is off\n");
492
493 features &= ~NETIF_F_LRO;
494 }
495
496 return features;
497}
498
499static int netxen_set_features(struct net_device *dev, u32 features)
500{
501 struct netxen_adapter *adapter = netdev_priv(dev);
502 int hw_lro;
503
504 if (!((dev->features ^ features) & NETIF_F_LRO))
505 return 0;
506
507 hw_lro = (features & NETIF_F_LRO) ? NETXEN_NIC_LRO_ENABLED
508 : NETXEN_NIC_LRO_DISABLED;
509
510 if (netxen_config_hw_lro(adapter, hw_lro))
511 return -EIO;
512
513 if (!(features & NETIF_F_LRO) && netxen_send_lro_cleanup(adapter))
514 return -EIO;
515
516 return 0;
517}
518
488static const struct net_device_ops netxen_netdev_ops = { 519static const struct net_device_ops netxen_netdev_ops = {
489 .ndo_open = netxen_nic_open, 520 .ndo_open = netxen_nic_open,
490 .ndo_stop = netxen_nic_close, 521 .ndo_stop = netxen_nic_close,
@@ -495,6 +526,8 @@ static const struct net_device_ops netxen_netdev_ops = {
495 .ndo_set_mac_address = netxen_nic_set_mac, 526 .ndo_set_mac_address = netxen_nic_set_mac,
496 .ndo_change_mtu = netxen_nic_change_mtu, 527 .ndo_change_mtu = netxen_nic_change_mtu,
497 .ndo_tx_timeout = netxen_tx_timeout, 528 .ndo_tx_timeout = netxen_tx_timeout,
529 .ndo_fix_features = netxen_fix_features,
530 .ndo_set_features = netxen_set_features,
498#ifdef CONFIG_NET_POLL_CONTROLLER 531#ifdef CONFIG_NET_POLL_CONTROLLER
499 .ndo_poll_controller = netxen_nic_poll_controller, 532 .ndo_poll_controller = netxen_nic_poll_controller,
500#endif 533#endif
@@ -1196,7 +1229,6 @@ netxen_setup_netdev(struct netxen_adapter *adapter,
1196 int err = 0; 1229 int err = 0;
1197 struct pci_dev *pdev = adapter->pdev; 1230 struct pci_dev *pdev = adapter->pdev;
1198 1231
1199 adapter->rx_csum = 1;
1200 adapter->mc_enabled = 0; 1232 adapter->mc_enabled = 0;
1201 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) 1233 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1202 adapter->max_mc_count = 38; 1234 adapter->max_mc_count = 38;
@@ -1210,14 +1242,13 @@ netxen_setup_netdev(struct netxen_adapter *adapter,
1210 1242
1211 SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops); 1243 SET_ETHTOOL_OPS(netdev, &netxen_nic_ethtool_ops);
1212 1244
1213 netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO); 1245 netdev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
1214 netdev->features |= (NETIF_F_GRO); 1246 NETIF_F_RXCSUM;
1215 netdev->vlan_features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
1216 1247
1217 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { 1248 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1218 netdev->features |= (NETIF_F_IPV6_CSUM | NETIF_F_TSO6); 1249 netdev->hw_features |= NETIF_F_IPV6_CSUM | NETIF_F_TSO6;
1219 netdev->vlan_features |= (NETIF_F_IPV6_CSUM | NETIF_F_TSO6); 1250
1220 } 1251 netdev->vlan_features |= netdev->hw_features;
1221 1252
1222 if (adapter->pci_using_dac) { 1253 if (adapter->pci_using_dac) {
1223 netdev->features |= NETIF_F_HIGHDMA; 1254 netdev->features |= NETIF_F_HIGHDMA;
@@ -1225,10 +1256,12 @@ netxen_setup_netdev(struct netxen_adapter *adapter,
1225 } 1256 }
1226 1257
1227 if (adapter->capabilities & NX_FW_CAPABILITY_FVLANTX) 1258 if (adapter->capabilities & NX_FW_CAPABILITY_FVLANTX)
1228 netdev->features |= (NETIF_F_HW_VLAN_TX); 1259 netdev->hw_features |= NETIF_F_HW_VLAN_TX;
1229 1260
1230 if (adapter->capabilities & NX_FW_CAPABILITY_HW_LRO) 1261 if (adapter->capabilities & NX_FW_CAPABILITY_HW_LRO)
1231 netdev->features |= NETIF_F_LRO; 1262 netdev->hw_features |= NETIF_F_LRO;
1263
1264 netdev->features |= netdev->hw_features;
1232 1265
1233 netdev->irq = adapter->msix_entries[0].vector; 1266 netdev->irq = adapter->msix_entries[0].vector;
1234 1267