From ad2c20ceacebce3badd2f0e36b78b896ed8b3726 Mon Sep 17 00:00:00 2001 From: Jeff Kirsher Date: Sun, 31 Jul 2011 00:06:29 -0700 Subject: [PATCH] --- yaml --- r: 265573 b: refs/heads/master c: 33f810b2036f13f1b123062a9e5c1794d400ce81 h: refs/heads/master i: 265571: ebbed283d1f7afb7505023fb8cdc6e6091ddf02b v: v3 --- [refs] | 2 +- trunk/MAINTAINERS | 2 +- trunk/drivers/net/Kconfig | 72 +------ trunk/drivers/net/Makefile | 3 +- .../net/ethernet/intel/e1000e/80003es2lan.c | 1 + .../drivers/net/ethernet/intel/e1000e/82571.c | 5 + .../drivers/net/ethernet/intel/e1000e/e1000.h | 3 +- .../net/ethernet/intel/e1000e/ethtool.c | 88 ++++++++ .../net/ethernet/intel/e1000e/ich8lan.c | 5 + .../net/ethernet/intel/e1000e/netdev.c | 49 ++--- .../drivers/net/ethernet/intel/ixgbe/ixgbe.h | 7 +- .../net/ethernet/intel/ixgbe/ixgbe_main.c | 202 ++++++++++++------ .../net/ethernet/intel/ixgbevf/ethtool.c | 46 ++++ .../net/ethernet/intel/ixgbevf/ixgbevf.h | 8 +- .../net/ethernet/intel/ixgbevf/ixgbevf_main.c | 81 ++----- trunk/drivers/net/fddi/Kconfig | 77 +++++++ trunk/drivers/net/fddi/Makefile | 6 + trunk/drivers/net/{ => fddi}/defxx.c | 0 trunk/drivers/net/{ => fddi}/defxx.h | 0 trunk/drivers/net/{ => fddi}/skfp/Makefile | 0 trunk/drivers/net/{ => fddi}/skfp/cfm.c | 0 trunk/drivers/net/{ => fddi}/skfp/drvfbi.c | 0 trunk/drivers/net/{ => fddi}/skfp/ecm.c | 0 trunk/drivers/net/{ => fddi}/skfp/ess.c | 0 trunk/drivers/net/{ => fddi}/skfp/fplustm.c | 0 trunk/drivers/net/{ => fddi}/skfp/h/cmtdef.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/fddi.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/fddimib.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/fplustm.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/hwmtm.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/mbuf.h | 0 .../drivers/net/{ => fddi}/skfp/h/osdef1st.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/sba.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/sba_def.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/skfbi.h | 0 .../drivers/net/{ => fddi}/skfp/h/skfbiinc.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/smc.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/smt.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/smt_p.h | 0 .../drivers/net/{ => fddi}/skfp/h/smtstate.h | 0 .../drivers/net/{ => fddi}/skfp/h/supern_2.h | 0 .../drivers/net/{ => fddi}/skfp/h/targethw.h | 0 .../drivers/net/{ => fddi}/skfp/h/targetos.h | 0 trunk/drivers/net/{ => fddi}/skfp/h/types.h | 0 trunk/drivers/net/{ => fddi}/skfp/hwmtm.c | 0 trunk/drivers/net/{ => fddi}/skfp/hwt.c | 0 trunk/drivers/net/{ => fddi}/skfp/pcmplc.c | 0 trunk/drivers/net/{ => fddi}/skfp/pmf.c | 0 trunk/drivers/net/{ => fddi}/skfp/queue.c | 0 trunk/drivers/net/{ => fddi}/skfp/rmt.c | 0 trunk/drivers/net/{ => fddi}/skfp/skfddi.c | 0 trunk/drivers/net/{ => fddi}/skfp/smt.c | 0 trunk/drivers/net/{ => fddi}/skfp/smtdef.c | 0 trunk/drivers/net/{ => fddi}/skfp/smtinit.c | 0 trunk/drivers/net/{ => fddi}/skfp/smttimer.c | 0 trunk/drivers/net/{ => fddi}/skfp/srf.c | 0 56 files changed, 408 insertions(+), 249 deletions(-) create mode 100644 trunk/drivers/net/fddi/Kconfig create mode 100644 trunk/drivers/net/fddi/Makefile rename trunk/drivers/net/{ => fddi}/defxx.c (100%) rename trunk/drivers/net/{ => fddi}/defxx.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/Makefile (100%) rename trunk/drivers/net/{ => fddi}/skfp/cfm.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/drvfbi.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/ecm.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/ess.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/fplustm.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/cmtdef.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/fddi.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/fddimib.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/fplustm.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/hwmtm.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/mbuf.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/osdef1st.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/sba.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/sba_def.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/skfbi.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/skfbiinc.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/smc.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/smt.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/smt_p.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/smtstate.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/supern_2.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/targethw.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/targetos.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/h/types.h (100%) rename trunk/drivers/net/{ => fddi}/skfp/hwmtm.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/hwt.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/pcmplc.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/pmf.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/queue.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/rmt.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/skfddi.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/smt.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/smtdef.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/smtinit.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/smttimer.c (100%) rename trunk/drivers/net/{ => fddi}/skfp/srf.c (100%) diff --git a/[refs] b/[refs] index edf4188c1876..d7d68770589b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: efe3d3c8ee6805c7e8b17f9aae554c04b271ab99 +refs/heads/master: 33f810b2036f13f1b123062a9e5c1794d400ce81 diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS index d32e1ca5ba73..2777088fa2bf 100644 --- a/trunk/MAINTAINERS +++ b/trunk/MAINTAINERS @@ -2113,7 +2113,7 @@ F: net/decnet/ DEFXX FDDI NETWORK DRIVER M: "Maciej W. Rozycki" S: Maintained -F: drivers/net/defxx.* +F: drivers/net/fddi/defxx.* DELL LAPTOP DRIVER M: Matthew Garrett diff --git a/trunk/drivers/net/Kconfig b/trunk/drivers/net/Kconfig index ef6b6bee11da..7bdc22b59856 100644 --- a/trunk/drivers/net/Kconfig +++ b/trunk/drivers/net/Kconfig @@ -195,6 +195,8 @@ config SUNGEM_PHY source "drivers/net/ethernet/Kconfig" +source "drivers/net/fddi/Kconfig" + source "drivers/net/tokenring/Kconfig" source "drivers/net/wireless/Kconfig" @@ -268,76 +270,6 @@ config RIONET_RX_SIZE depends on RIONET default "128" -config FDDI - tristate "FDDI driver support" - depends on (PCI || EISA || TC) - help - Fiber Distributed Data Interface is a high speed local area network - design; essentially a replacement for high speed Ethernet. FDDI can - run over copper or fiber. If you are connected to such a network and - want a driver for the FDDI card in your computer, say Y here (and - then also Y to the driver for your FDDI card, below). Most people - will say N. - -config DEFXX - tristate "Digital DEFTA/DEFEA/DEFPA adapter support" - depends on FDDI && (PCI || EISA || TC) - ---help--- - This is support for the DIGITAL series of TURBOchannel (DEFTA), - EISA (DEFEA) and PCI (DEFPA) controllers which can connect you - to a local FDDI network. - - To compile this driver as a module, choose M here: the module - will be called defxx. If unsure, say N. - -config DEFXX_MMIO - bool - prompt "Use MMIO instead of PIO" if PCI || EISA - depends on DEFXX - default n if PCI || EISA - default y - ---help--- - This instructs the driver to use EISA or PCI memory-mapped I/O - (MMIO) as appropriate instead of programmed I/O ports (PIO). - Enabling this gives an improvement in processing time in parts - of the driver, but it may cause problems with EISA (DEFEA) - adapters. TURBOchannel does not have the concept of I/O ports, - so MMIO is always used for these (DEFTA) adapters. - - If unsure, say N. - -config SKFP - tristate "SysKonnect FDDI PCI support" - depends on FDDI && PCI - select BITREVERSE - ---help--- - Say Y here if you have a SysKonnect FDDI PCI adapter. - The following adapters are supported by this driver: - - SK-5521 (SK-NET FDDI-UP) - - SK-5522 (SK-NET FDDI-UP DAS) - - SK-5541 (SK-NET FDDI-FP) - - SK-5543 (SK-NET FDDI-LP) - - SK-5544 (SK-NET FDDI-LP DAS) - - SK-5821 (SK-NET FDDI-UP64) - - SK-5822 (SK-NET FDDI-UP64 DAS) - - SK-5841 (SK-NET FDDI-FP64) - - SK-5843 (SK-NET FDDI-LP64) - - SK-5844 (SK-NET FDDI-LP64 DAS) - - Netelligent 100 FDDI DAS Fibre SC - - Netelligent 100 FDDI SAS Fibre SC - - Netelligent 100 FDDI DAS UTP - - Netelligent 100 FDDI SAS UTP - - Netelligent 100 FDDI SAS Fibre MIC - - Read for information about - the driver. - - Questions concerning this driver can be addressed to: - - - To compile this driver as a module, choose M here: the module - will be called skfp. This is recommended. - config HIPPI bool "HIPPI driver support (EXPERIMENTAL)" depends on EXPERIMENTAL && INET && PCI diff --git a/trunk/drivers/net/Makefile b/trunk/drivers/net/Makefile index c33009b49608..3087b27c7841 100644 --- a/trunk/drivers/net/Makefile +++ b/trunk/drivers/net/Makefile @@ -14,7 +14,6 @@ obj-$(CONFIG_VMXNET3) += vmxnet3/ # obj-$(CONFIG_PLIP) += plip.o obj-$(CONFIG_ROADRUNNER) += rrunner.o -obj-$(CONFIG_SKFP) += skfp/ obj-$(CONFIG_RIONET) += rionet.o # @@ -42,13 +41,13 @@ obj-$(CONFIG_DUMMY) += dummy.o obj-$(CONFIG_IFB) += ifb.o obj-$(CONFIG_MACVLAN) += macvlan.o obj-$(CONFIG_MACVTAP) += macvtap.o -obj-$(CONFIG_DEFXX) += defxx.o obj-$(CONFIG_EQUALIZER) += eql.o obj-$(CONFIG_TUN) += tun.o obj-$(CONFIG_VETH) += veth.o obj-$(CONFIG_DEV_APPLETALK) += appletalk/ obj-$(CONFIG_ETHERNET) += ethernet/ +obj-$(CONFIG_FDDI) += fddi/ obj-$(CONFIG_TR) += tokenring/ obj-$(CONFIG_WAN) += wan/ obj-$(CONFIG_ARCNET) += arcnet/ diff --git a/trunk/drivers/net/ethernet/intel/e1000e/80003es2lan.c b/trunk/drivers/net/ethernet/intel/e1000e/80003es2lan.c index b7544336cef4..e4f42257c24c 100644 --- a/trunk/drivers/net/ethernet/intel/e1000e/80003es2lan.c +++ b/trunk/drivers/net/ethernet/intel/e1000e/80003es2lan.c @@ -1498,6 +1498,7 @@ struct e1000_info e1000_es2_info = { | FLAG_HAS_JUMBO_FRAMES | FLAG_HAS_WOL | FLAG_APME_IN_CTRL3 + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_RX_NEEDS_RESTART /* errata */ | FLAG_TARC_SET_BIT_ZERO /* errata */ diff --git a/trunk/drivers/net/ethernet/intel/e1000e/82571.c b/trunk/drivers/net/ethernet/intel/e1000e/82571.c index 2d4dc53a4fb8..536b3a55c45f 100644 --- a/trunk/drivers/net/ethernet/intel/e1000e/82571.c +++ b/trunk/drivers/net/ethernet/intel/e1000e/82571.c @@ -2019,6 +2019,7 @@ struct e1000_info e1000_82571_info = { | FLAG_HAS_JUMBO_FRAMES | FLAG_HAS_WOL | FLAG_APME_IN_CTRL3 + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_SMART_POWER_DOWN | FLAG_RESET_OVERWRITES_LAA /* errata */ @@ -2040,6 +2041,7 @@ struct e1000_info e1000_82572_info = { | FLAG_HAS_JUMBO_FRAMES | FLAG_HAS_WOL | FLAG_APME_IN_CTRL3 + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_TARC_SPEED_MODE_BIT, /* errata */ .flags2 = FLAG2_DISABLE_ASPM_L1 /* errata 13 */ @@ -2057,6 +2059,7 @@ struct e1000_info e1000_82573_info = { .flags = FLAG_HAS_HW_VLAN_FILTER | FLAG_HAS_WOL | FLAG_APME_IN_CTRL3 + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_SMART_POWER_DOWN | FLAG_HAS_AMT | FLAG_HAS_SWSM_ON_LOAD, @@ -2077,6 +2080,7 @@ struct e1000_info e1000_82574_info = { | FLAG_HAS_JUMBO_FRAMES | FLAG_HAS_WOL | FLAG_APME_IN_CTRL3 + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_SMART_POWER_DOWN | FLAG_HAS_AMT | FLAG_HAS_CTRLEXT_ON_LOAD, @@ -2096,6 +2100,7 @@ struct e1000_info e1000_82583_info = { .flags = FLAG_HAS_HW_VLAN_FILTER | FLAG_HAS_WOL | FLAG_APME_IN_CTRL3 + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_SMART_POWER_DOWN | FLAG_HAS_AMT | FLAG_HAS_JUMBO_FRAMES diff --git a/trunk/drivers/net/ethernet/intel/e1000e/e1000.h b/trunk/drivers/net/ethernet/intel/e1000e/e1000.h index 1b15d1ff583c..fa72052a0031 100644 --- a/trunk/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/trunk/drivers/net/ethernet/intel/e1000e/e1000.h @@ -440,11 +440,12 @@ struct e1000_info { #define FLAG_LSC_GIG_SPEED_DROP (1 << 25) #define FLAG_SMART_POWER_DOWN (1 << 26) #define FLAG_MSI_ENABLED (1 << 27) -/* reserved (1 << 28) */ +#define FLAG_RX_CSUM_ENABLED (1 << 28) #define FLAG_TSO_FORCE (1 << 29) #define FLAG_RX_RESTART_NOW (1 << 30) #define FLAG_MSI_TEST_FAILED (1 << 31) +/* CRC Stripping defines */ #define FLAG2_CRC_STRIPPING (1 << 0) #define FLAG2_HAS_PHY_WAKEUP (1 << 1) #define FLAG2_IS_DISCARDING (1 << 2) diff --git a/trunk/drivers/net/ethernet/intel/e1000e/ethtool.c b/trunk/drivers/net/ethernet/intel/e1000e/ethtool.c index d96d0b0e08cf..e0cbd6a0bde8 100644 --- a/trunk/drivers/net/ethernet/intel/e1000e/ethtool.c +++ b/trunk/drivers/net/ethernet/intel/e1000e/ethtool.c @@ -367,6 +367,59 @@ static int e1000_set_pauseparam(struct net_device *netdev, return retval; } +static u32 e1000_get_rx_csum(struct net_device *netdev) +{ + struct e1000_adapter *adapter = netdev_priv(netdev); + return adapter->flags & FLAG_RX_CSUM_ENABLED; +} + +static int e1000_set_rx_csum(struct net_device *netdev, u32 data) +{ + struct e1000_adapter *adapter = netdev_priv(netdev); + + if (data) + adapter->flags |= FLAG_RX_CSUM_ENABLED; + else + adapter->flags &= ~FLAG_RX_CSUM_ENABLED; + + if (netif_running(netdev)) + e1000e_reinit_locked(adapter); + else + e1000e_reset(adapter); + return 0; +} + +static u32 e1000_get_tx_csum(struct net_device *netdev) +{ + return (netdev->features & NETIF_F_HW_CSUM) != 0; +} + +static int e1000_set_tx_csum(struct net_device *netdev, u32 data) +{ + if (data) + netdev->features |= NETIF_F_HW_CSUM; + else + netdev->features &= ~NETIF_F_HW_CSUM; + + return 0; +} + +static int e1000_set_tso(struct net_device *netdev, u32 data) +{ + struct e1000_adapter *adapter = netdev_priv(netdev); + + if (data) { + netdev->features |= NETIF_F_TSO; + netdev->features |= NETIF_F_TSO6; + } else { + netdev->features &= ~NETIF_F_TSO; + netdev->features &= ~NETIF_F_TSO6; + } + + adapter->flags |= FLAG_TSO_FORCE; + return 0; +} + static u32 e1000_get_msglevel(struct net_device *netdev) { struct e1000_adapter *adapter = netdev_priv(netdev); @@ -1961,6 +2014,31 @@ static void e1000_get_strings(struct net_device *netdev, u32 stringset, } } +static int e1000e_set_flags(struct net_device *netdev, u32 data) +{ + struct e1000_adapter *adapter = netdev_priv(netdev); + bool need_reset = false; + int rc; + + need_reset = (data & ETH_FLAG_RXVLAN) != + (netdev->features & NETIF_F_HW_VLAN_RX); + + rc = ethtool_op_set_flags(netdev, data, ETH_FLAG_RXVLAN | + ETH_FLAG_TXVLAN); + + if (rc) + return rc; + + if (need_reset) { + if (netif_running(netdev)) + e1000e_reinit_locked(adapter); + else + e1000e_reset(adapter); + } + + return 0; +} + static const struct ethtool_ops e1000_ethtool_ops = { .get_settings = e1000_get_settings, .set_settings = e1000_set_settings, @@ -1980,6 +2058,14 @@ static const struct ethtool_ops e1000_ethtool_ops = { .set_ringparam = e1000_set_ringparam, .get_pauseparam = e1000_get_pauseparam, .set_pauseparam = e1000_set_pauseparam, + .get_rx_csum = e1000_get_rx_csum, + .set_rx_csum = e1000_set_rx_csum, + .get_tx_csum = e1000_get_tx_csum, + .set_tx_csum = e1000_set_tx_csum, + .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, + .get_tso = ethtool_op_get_tso, + .set_tso = e1000_set_tso, .self_test = e1000_diag_test, .get_strings = e1000_get_strings, .set_phys_id = e1000_set_phys_id, @@ -1987,6 +2073,8 @@ static const struct ethtool_ops e1000_ethtool_ops = { .get_sset_count = e1000e_get_sset_count, .get_coalesce = e1000_get_coalesce, .set_coalesce = e1000_set_coalesce, + .get_flags = ethtool_op_get_flags, + .set_flags = e1000e_set_flags, }; void e1000e_set_ethtool_ops(struct net_device *netdev) diff --git a/trunk/drivers/net/ethernet/intel/e1000e/ich8lan.c b/trunk/drivers/net/ethernet/intel/e1000e/ich8lan.c index 3fc3acce9950..54add27c8f76 100644 --- a/trunk/drivers/net/ethernet/intel/e1000e/ich8lan.c +++ b/trunk/drivers/net/ethernet/intel/e1000e/ich8lan.c @@ -4058,6 +4058,7 @@ struct e1000_info e1000_ich8_info = { .mac = e1000_ich8lan, .flags = FLAG_HAS_WOL | FLAG_IS_ICH + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_AMT | FLAG_HAS_FLASH @@ -4075,6 +4076,7 @@ struct e1000_info e1000_ich9_info = { .flags = FLAG_HAS_JUMBO_FRAMES | FLAG_IS_ICH | FLAG_HAS_WOL + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_AMT | FLAG_HAS_ERT @@ -4093,6 +4095,7 @@ struct e1000_info e1000_ich10_info = { .flags = FLAG_HAS_JUMBO_FRAMES | FLAG_IS_ICH | FLAG_HAS_WOL + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_AMT | FLAG_HAS_ERT @@ -4110,6 +4113,7 @@ struct e1000_info e1000_pch_info = { .mac = e1000_pchlan, .flags = FLAG_IS_ICH | FLAG_HAS_WOL + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_AMT | FLAG_HAS_FLASH @@ -4129,6 +4133,7 @@ struct e1000_info e1000_pch2_info = { .mac = e1000_pch2lan, .flags = FLAG_IS_ICH | FLAG_HAS_WOL + | FLAG_RX_CSUM_ENABLED | FLAG_HAS_CTRLEXT_ON_LOAD | FLAG_HAS_AMT | FLAG_HAS_FLASH diff --git a/trunk/drivers/net/ethernet/intel/e1000e/netdev.c b/trunk/drivers/net/ethernet/intel/e1000e/netdev.c index 4f669995623f..9742bc603cad 100644 --- a/trunk/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/trunk/drivers/net/ethernet/intel/e1000e/netdev.c @@ -3069,7 +3069,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) /* Enable Receive Checksum Offload for TCP and UDP */ rxcsum = er32(RXCSUM); - if (adapter->netdev->features & NETIF_F_RXCSUM) { + if (adapter->flags & FLAG_RX_CSUM_ENABLED) { rxcsum |= E1000_RXCSUM_TUOFL; /* @@ -5860,26 +5860,6 @@ static void e1000_eeprom_checks(struct e1000_adapter *adapter) } } -static int e1000_set_features(struct net_device *netdev, u32 features) -{ - struct e1000_adapter *adapter = netdev_priv(netdev); - u32 changed = features ^ netdev->features; - - if (changed & (NETIF_F_TSO | NETIF_F_TSO6)) - adapter->flags |= FLAG_TSO_FORCE; - - if (!(changed & (NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX | - NETIF_F_RXCSUM))) - return 0; - - if (netif_running(netdev)) - e1000e_reinit_locked(adapter); - else - e1000e_reset(adapter); - - return 0; -} - static const struct net_device_ops e1000e_netdev_ops = { .ndo_open = e1000_open, .ndo_stop = e1000_close, @@ -5897,7 +5877,6 @@ static const struct net_device_ops e1000e_netdev_ops = { #ifdef CONFIG_NET_POLL_CONTROLLER .ndo_poll_controller = e1000_netpoll, #endif - .ndo_set_features = e1000_set_features, }; /** @@ -6057,25 +6036,21 @@ static int __devinit e1000_probe(struct pci_dev *pdev, if (e1000_check_reset_block(&adapter->hw)) e_info("PHY reset is blocked due to SOL/IDER session.\n"); - /* Set initial default active device features */ - netdev->features = (NETIF_F_SG | - NETIF_F_HW_VLAN_RX | - NETIF_F_HW_VLAN_TX | - NETIF_F_TSO | - NETIF_F_TSO6 | - NETIF_F_RXCSUM | - NETIF_F_HW_CSUM); - - /* Set user-changeable features (subset of all device features) */ - netdev->hw_features = netdev->features; + netdev->features = NETIF_F_SG | + NETIF_F_HW_CSUM | + NETIF_F_HW_VLAN_TX | + NETIF_F_HW_VLAN_RX; if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) netdev->features |= NETIF_F_HW_VLAN_FILTER; - netdev->vlan_features |= (NETIF_F_SG | - NETIF_F_TSO | - NETIF_F_TSO6 | - NETIF_F_HW_CSUM); + netdev->features |= NETIF_F_TSO; + netdev->features |= NETIF_F_TSO6; + + netdev->vlan_features |= NETIF_F_TSO; + netdev->vlan_features |= NETIF_F_TSO6; + netdev->vlan_features |= NETIF_F_HW_CSUM; + netdev->vlan_features |= NETIF_F_SG; if (pci_using_dac) { netdev->features |= NETIF_F_HIGHDMA; diff --git a/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe.h index dc3b12e15331..378ce46a7f92 100644 --- a/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe.h @@ -209,7 +209,6 @@ enum ixbge_ring_state_t { #define clear_ring_rsc_enabled(ring) \ clear_bit(__IXGBE_RX_RSC_ENABLED, &(ring)->state) struct ixgbe_ring { - struct ixgbe_ring *next; /* pointer to next ring in q_vector */ void *desc; /* descriptor ring memory */ struct device *dev; /* device for DMA mapping */ struct net_device *netdev; /* netdev ring belongs to */ @@ -278,7 +277,11 @@ struct ixgbe_ring_feature { } ____cacheline_internodealigned_in_smp; struct ixgbe_ring_container { - struct ixgbe_ring *ring; /* pointer to linked list of rings */ +#if MAX_RX_QUEUES > MAX_TX_QUEUES + DECLARE_BITMAP(idx, MAX_RX_QUEUES); +#else + DECLARE_BITMAP(idx, MAX_TX_QUEUES); +#endif unsigned int total_bytes; /* total bytes processed this int */ unsigned int total_packets; /* total packets processed this int */ u16 work_limit; /* total work allowed per interrupt */ diff --git a/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index bb54d3d28419..e8aad76fa530 100644 --- a/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/trunk/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -804,13 +804,13 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, struct ixgbe_tx_buffer *tx_buffer; union ixgbe_adv_tx_desc *tx_desc; unsigned int total_bytes = 0, total_packets = 0; - u16 budget = q_vector->tx.work_limit; u16 i = tx_ring->next_to_clean; + u16 count; tx_buffer = &tx_ring->tx_buffer_info[i]; tx_desc = IXGBE_TX_DESC_ADV(tx_ring, i); - for (; budget; budget--) { + for (count = 0; count < q_vector->tx.work_limit; count++) { union ixgbe_adv_tx_desc *eop_desc = tx_buffer->next_to_watch; /* if next_to_watch is not set then there is no work pending */ @@ -891,11 +891,11 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, ixgbe_tx_timeout_reset(adapter); /* the adapter is about to reset, no point in enabling stuff */ - return budget; + return true; } #define TX_WAKE_THRESHOLD (DESC_NEEDED * 2) - if (unlikely(total_packets && netif_carrier_ok(tx_ring->netdev) && + if (unlikely(count && netif_carrier_ok(tx_ring->netdev) && (ixgbe_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD))) { /* Make sure that anybody stopping the queue after this * sees the new next_to_clean. @@ -908,7 +908,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, } } - return budget; + return count < q_vector->tx.work_limit; } #ifdef CONFIG_IXGBE_DCA @@ -974,17 +974,26 @@ static void ixgbe_update_tx_dca(struct ixgbe_adapter *adapter, static void ixgbe_update_dca(struct ixgbe_q_vector *q_vector) { struct ixgbe_adapter *adapter = q_vector->adapter; - struct ixgbe_ring *ring; int cpu = get_cpu(); + long r_idx; + int i; if (q_vector->cpu == cpu) goto out_no_update; - for (ring = q_vector->tx.ring; ring != NULL; ring = ring->next) - ixgbe_update_tx_dca(adapter, ring, cpu); + r_idx = find_first_bit(q_vector->tx.idx, adapter->num_tx_queues); + for (i = 0; i < q_vector->tx.count; i++) { + ixgbe_update_tx_dca(adapter, adapter->tx_ring[r_idx], cpu); + r_idx = find_next_bit(q_vector->tx.idx, adapter->num_tx_queues, + r_idx + 1); + } - for (ring = q_vector->rx.ring; ring != NULL; ring = ring->next) - ixgbe_update_rx_dca(adapter, ring, cpu); + r_idx = find_first_bit(q_vector->rx.idx, adapter->num_rx_queues); + for (i = 0; i < q_vector->rx.count; i++) { + ixgbe_update_rx_dca(adapter, adapter->rx_ring[r_idx], cpu); + r_idx = find_next_bit(q_vector->rx.idx, adapter->num_rx_queues, + r_idx + 1); + } q_vector->cpu = cpu; out_no_update: @@ -1537,7 +1546,7 @@ static int ixgbe_clean_rxonly(struct napi_struct *, int); static void ixgbe_configure_msix(struct ixgbe_adapter *adapter) { struct ixgbe_q_vector *q_vector; - int q_vectors, v_idx; + int i, q_vectors, v_idx, r_idx; u32 mask; q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; @@ -1547,19 +1556,33 @@ static void ixgbe_configure_msix(struct ixgbe_adapter *adapter) * corresponding register. */ for (v_idx = 0; v_idx < q_vectors; v_idx++) { - struct ixgbe_ring *ring; q_vector = adapter->q_vector[v_idx]; + /* XXX for_each_set_bit(...) */ + r_idx = find_first_bit(q_vector->rx.idx, + adapter->num_rx_queues); + + for (i = 0; i < q_vector->rx.count; i++) { + u8 reg_idx = adapter->rx_ring[r_idx]->reg_idx; + ixgbe_set_ivar(adapter, 0, reg_idx, v_idx); + r_idx = find_next_bit(q_vector->rx.idx, + adapter->num_rx_queues, + r_idx + 1); + } + r_idx = find_first_bit(q_vector->tx.idx, + adapter->num_tx_queues); + + for (i = 0; i < q_vector->tx.count; i++) { + u8 reg_idx = adapter->tx_ring[r_idx]->reg_idx; + ixgbe_set_ivar(adapter, 1, reg_idx, v_idx); + r_idx = find_next_bit(q_vector->tx.idx, + adapter->num_tx_queues, + r_idx + 1); + } - for (ring = q_vector->rx.ring; ring != NULL; ring = ring->next) - ixgbe_set_ivar(adapter, 0, ring->reg_idx, v_idx); - - for (ring = q_vector->tx.ring; ring != NULL; ring = ring->next) - ixgbe_set_ivar(adapter, 1, ring->reg_idx, v_idx); - - if (q_vector->tx.ring && !q_vector->rx.ring) + if (q_vector->tx.count && !q_vector->rx.count) /* tx only */ q_vector->eitr = adapter->tx_eitr_param; - else if (q_vector->rx.ring) + else if (q_vector->rx.count) /* rx or mixed */ q_vector->eitr = adapter->rx_eitr_param; @@ -1983,10 +2006,20 @@ static inline void ixgbe_irq_disable_queues(struct ixgbe_adapter *adapter, static irqreturn_t ixgbe_msix_clean_tx(int irq, void *data) { struct ixgbe_q_vector *q_vector = data; + struct ixgbe_adapter *adapter = q_vector->adapter; + struct ixgbe_ring *tx_ring; + int i, r_idx; if (!q_vector->tx.count) return IRQ_HANDLED; + r_idx = find_first_bit(q_vector->tx.idx, adapter->num_tx_queues); + for (i = 0; i < q_vector->tx.count; i++) { + tx_ring = adapter->tx_ring[r_idx]; + r_idx = find_next_bit(q_vector->tx.idx, adapter->num_tx_queues, + r_idx + 1); + } + /* EIAM disabled interrupts (on this vector) for us */ napi_schedule(&q_vector->napi); @@ -2001,6 +2034,22 @@ static irqreturn_t ixgbe_msix_clean_tx(int irq, void *data) static irqreturn_t ixgbe_msix_clean_rx(int irq, void *data) { struct ixgbe_q_vector *q_vector = data; + struct ixgbe_adapter *adapter = q_vector->adapter; + struct ixgbe_ring *rx_ring; + int r_idx; + int i; + +#ifdef CONFIG_IXGBE_DCA + if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) + ixgbe_update_dca(q_vector); +#endif + + r_idx = find_first_bit(q_vector->rx.idx, adapter->num_rx_queues); + for (i = 0; i < q_vector->rx.count; i++) { + rx_ring = adapter->rx_ring[r_idx]; + r_idx = find_next_bit(q_vector->rx.idx, adapter->num_rx_queues, + r_idx + 1); + } if (!q_vector->rx.count) return IRQ_HANDLED; @@ -2014,10 +2063,28 @@ static irqreturn_t ixgbe_msix_clean_rx(int irq, void *data) static irqreturn_t ixgbe_msix_clean_many(int irq, void *data) { struct ixgbe_q_vector *q_vector = data; + struct ixgbe_adapter *adapter = q_vector->adapter; + struct ixgbe_ring *ring; + int r_idx; + int i; if (!q_vector->tx.count && !q_vector->rx.count) return IRQ_HANDLED; + r_idx = find_first_bit(q_vector->tx.idx, adapter->num_tx_queues); + for (i = 0; i < q_vector->tx.count; i++) { + ring = adapter->tx_ring[r_idx]; + r_idx = find_next_bit(q_vector->tx.idx, adapter->num_tx_queues, + r_idx + 1); + } + + r_idx = find_first_bit(q_vector->rx.idx, adapter->num_rx_queues); + for (i = 0; i < q_vector->rx.count; i++) { + ring = adapter->rx_ring[r_idx]; + r_idx = find_next_bit(q_vector->rx.idx, adapter->num_rx_queues, + r_idx + 1); + } + /* EIAM disabled interrupts (on this vector) for us */ napi_schedule(&q_vector->napi); @@ -2037,14 +2104,19 @@ static int ixgbe_clean_rxonly(struct napi_struct *napi, int budget) struct ixgbe_q_vector *q_vector = container_of(napi, struct ixgbe_q_vector, napi); struct ixgbe_adapter *adapter = q_vector->adapter; + struct ixgbe_ring *rx_ring = NULL; int work_done = 0; + long r_idx; #ifdef CONFIG_IXGBE_DCA if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) ixgbe_update_dca(q_vector); #endif - ixgbe_clean_rx_irq(q_vector, q_vector->rx.ring, &work_done, budget); + r_idx = find_first_bit(q_vector->rx.idx, adapter->num_rx_queues); + rx_ring = adapter->rx_ring[r_idx]; + + ixgbe_clean_rx_irq(q_vector, rx_ring, &work_done, budget); /* If all Rx work done, exit the polling mode */ if (work_done < budget) { @@ -2072,29 +2144,38 @@ static int ixgbe_clean_rxtx_many(struct napi_struct *napi, int budget) struct ixgbe_q_vector *q_vector = container_of(napi, struct ixgbe_q_vector, napi); struct ixgbe_adapter *adapter = q_vector->adapter; - struct ixgbe_ring *ring; - int work_done = 0; - bool clean_complete = true; + struct ixgbe_ring *ring = NULL; + int work_done = 0, i; + long r_idx; + bool tx_clean_complete = true; #ifdef CONFIG_IXGBE_DCA if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) ixgbe_update_dca(q_vector); #endif - for (ring = q_vector->tx.ring; ring != NULL; ring = ring->next) - clean_complete &= ixgbe_clean_tx_irq(q_vector, ring); + r_idx = find_first_bit(q_vector->tx.idx, adapter->num_tx_queues); + for (i = 0; i < q_vector->tx.count; i++) { + ring = adapter->tx_ring[r_idx]; + tx_clean_complete &= ixgbe_clean_tx_irq(q_vector, ring); + r_idx = find_next_bit(q_vector->tx.idx, adapter->num_tx_queues, + r_idx + 1); + } /* attempt to distribute budget to each queue fairly, but don't allow * the budget to go below 1 because we'll exit polling */ budget /= (q_vector->rx.count ?: 1); budget = max(budget, 1); - - for (ring = q_vector->rx.ring; ring != NULL; ring = ring->next) + r_idx = find_first_bit(q_vector->rx.idx, adapter->num_rx_queues); + for (i = 0; i < q_vector->rx.count; i++) { + ring = adapter->rx_ring[r_idx]; ixgbe_clean_rx_irq(q_vector, ring, &work_done, budget); + r_idx = find_next_bit(q_vector->rx.idx, adapter->num_rx_queues, + r_idx + 1); + } - if (!clean_complete) - work_done = budget; - + r_idx = find_first_bit(q_vector->rx.idx, adapter->num_rx_queues); + ring = adapter->rx_ring[r_idx]; /* If all Rx work done, exit the polling mode */ if (work_done < budget) { napi_complete(napi); @@ -2122,23 +2203,32 @@ static int ixgbe_clean_txonly(struct napi_struct *napi, int budget) struct ixgbe_q_vector *q_vector = container_of(napi, struct ixgbe_q_vector, napi); struct ixgbe_adapter *adapter = q_vector->adapter; + struct ixgbe_ring *tx_ring = NULL; + int work_done = 0; + long r_idx; #ifdef CONFIG_IXGBE_DCA if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) ixgbe_update_dca(q_vector); #endif - if (!ixgbe_clean_tx_irq(q_vector, q_vector->tx.ring)) - return budget; + r_idx = find_first_bit(q_vector->tx.idx, adapter->num_tx_queues); + tx_ring = adapter->tx_ring[r_idx]; + + if (!ixgbe_clean_tx_irq(q_vector, tx_ring)) + work_done = budget; /* If all Tx work done, exit the polling mode */ - napi_complete(napi); - if (adapter->tx_itr_setting & 1) - ixgbe_set_itr(q_vector); - if (!test_bit(__IXGBE_DOWN, &adapter->state)) - ixgbe_irq_enable_queues(adapter, ((u64)1 << q_vector->v_idx)); + if (work_done < budget) { + napi_complete(napi); + if (adapter->tx_itr_setting & 1) + ixgbe_set_itr(q_vector); + if (!test_bit(__IXGBE_DOWN, &adapter->state)) + ixgbe_irq_enable_queues(adapter, + ((u64)1 << q_vector->v_idx)); + } - return 0; + return work_done; } static inline void map_vector_to_rxq(struct ixgbe_adapter *a, int v_idx, @@ -2147,10 +2237,9 @@ static inline void map_vector_to_rxq(struct ixgbe_adapter *a, int v_idx, struct ixgbe_q_vector *q_vector = a->q_vector[v_idx]; struct ixgbe_ring *rx_ring = a->rx_ring[r_idx]; - rx_ring->q_vector = q_vector; - rx_ring->next = q_vector->rx.ring; - q_vector->rx.ring = rx_ring; + set_bit(r_idx, q_vector->rx.idx); q_vector->rx.count++; + rx_ring->q_vector = q_vector; } static inline void map_vector_to_txq(struct ixgbe_adapter *a, int v_idx, @@ -2159,10 +2248,9 @@ static inline void map_vector_to_txq(struct ixgbe_adapter *a, int v_idx, struct ixgbe_q_vector *q_vector = a->q_vector[v_idx]; struct ixgbe_ring *tx_ring = a->tx_ring[t_idx]; - tx_ring->q_vector = q_vector; - tx_ring->next = q_vector->tx.ring; - q_vector->tx.ring = tx_ring; + set_bit(t_idx, q_vector->tx.idx); q_vector->tx.count++; + tx_ring->q_vector = q_vector; q_vector->tx.work_limit = a->tx_work_limit; } @@ -2420,26 +2508,14 @@ static irqreturn_t ixgbe_intr(int irq, void *data) static inline void ixgbe_reset_q_vectors(struct ixgbe_adapter *adapter) { - int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; - int i; - - /* legacy and MSI only use one vector */ - if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) - q_vectors = 1; - - for (i = 0; i < adapter->num_rx_queues; i++) { - adapter->rx_ring[i]->q_vector = NULL; - adapter->rx_ring[i]->next = NULL; - } - for (i = 0; i < adapter->num_tx_queues; i++) { - adapter->tx_ring[i]->q_vector = NULL; - adapter->tx_ring[i]->next = NULL; - } + int i, q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; for (i = 0; i < q_vectors; i++) { struct ixgbe_q_vector *q_vector = adapter->q_vector[i]; - memset(&q_vector->rx, 0, sizeof(struct ixgbe_ring_container)); - memset(&q_vector->tx, 0, sizeof(struct ixgbe_ring_container)); + bitmap_zero(q_vector->rx.idx, MAX_RX_QUEUES); + bitmap_zero(q_vector->tx.idx, MAX_TX_QUEUES); + q_vector->rx.count = 0; + q_vector->tx.count = 0; } } @@ -5847,7 +5923,7 @@ static void ixgbe_check_hang_subtask(struct ixgbe_adapter *adapter) /* get one bit for every active tx/rx interrupt vector */ for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) { struct ixgbe_q_vector *qv = adapter->q_vector[i]; - if (qv->rx.ring || qv->tx.ring) + if (qv->rx.count || qv->tx.count) eics |= ((u64)1 << i); } } diff --git a/trunk/drivers/net/ethernet/intel/ixgbevf/ethtool.c b/trunk/drivers/net/ethernet/intel/ixgbevf/ethtool.c index e1d9e3b63448..deee3754b1f7 100644 --- a/trunk/drivers/net/ethernet/intel/ixgbevf/ethtool.c +++ b/trunk/drivers/net/ethernet/intel/ixgbevf/ethtool.c @@ -117,6 +117,44 @@ static int ixgbevf_get_settings(struct net_device *netdev, return 0; } +static u32 ixgbevf_get_rx_csum(struct net_device *netdev) +{ + struct ixgbevf_adapter *adapter = netdev_priv(netdev); + return adapter->flags & IXGBE_FLAG_RX_CSUM_ENABLED; +} + +static int ixgbevf_set_rx_csum(struct net_device *netdev, u32 data) +{ + struct ixgbevf_adapter *adapter = netdev_priv(netdev); + if (data) + adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED; + else + adapter->flags &= ~IXGBE_FLAG_RX_CSUM_ENABLED; + + if (netif_running(netdev)) { + if (!adapter->dev_closed) + ixgbevf_reinit_locked(adapter); + } else { + ixgbevf_reset(adapter); + } + + return 0; +} + +static int ixgbevf_set_tso(struct net_device *netdev, u32 data) +{ + if (data) { + netdev->features |= NETIF_F_TSO; + netdev->features |= NETIF_F_TSO6; + } else { + netif_tx_stop_all_queues(netdev); + netdev->features &= ~NETIF_F_TSO; + netdev->features &= ~NETIF_F_TSO6; + netif_tx_start_all_queues(netdev); + } + return 0; +} + static u32 ixgbevf_get_msglevel(struct net_device *netdev) { struct ixgbevf_adapter *adapter = netdev_priv(netdev); @@ -682,8 +720,16 @@ static struct ethtool_ops ixgbevf_ethtool_ops = { .get_link = ethtool_op_get_link, .get_ringparam = ixgbevf_get_ringparam, .set_ringparam = ixgbevf_set_ringparam, + .get_rx_csum = ixgbevf_get_rx_csum, + .set_rx_csum = ixgbevf_set_rx_csum, + .get_tx_csum = ethtool_op_get_tx_csum, + .set_tx_csum = ethtool_op_set_tx_ipv6_csum, + .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, .get_msglevel = ixgbevf_get_msglevel, .set_msglevel = ixgbevf_set_msglevel, + .get_tso = ethtool_op_get_tso, + .set_tso = ixgbevf_set_tso, .self_test = ixgbevf_diag_test, .get_sset_count = ixgbevf_get_sset_count, .get_strings = ixgbevf_get_strings, diff --git a/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h index e6c9d1a927a9..8857df4dd3b9 100644 --- a/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +++ b/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h @@ -34,7 +34,6 @@ #include #include #include -#include #include "vf.h" @@ -72,13 +71,12 @@ struct ixgbevf_ring { struct ixgbevf_rx_buffer *rx_buffer_info; }; - u64 total_bytes; - u64 total_packets; - struct u64_stats_sync syncp; - u16 head; u16 tail; + unsigned int total_bytes; + unsigned int total_packets; + u16 reg_idx; /* holds the special value that gets the hardware register * offset associated with this ring, which is different * for DCB and RSS modes */ diff --git a/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 98963970206e..b1e1c2daf5f9 100644 --- a/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c @@ -203,9 +203,6 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_adapter *adapter, (count < tx_ring->work_limit)) { bool cleaned = false; rmb(); /* read buffer_info after eop_desc */ - /* eop could change between read and DD-check */ - if (unlikely(eop != tx_ring->tx_buffer_info[i].next_to_watch)) - goto cont_loop; for ( ; !cleaned; count++) { struct sk_buff *skb; tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, i); @@ -235,7 +232,6 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_adapter *adapter, i = 0; } -cont_loop: eop = tx_ring->tx_buffer_info[i].next_to_watch; eop_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop); } @@ -270,10 +266,11 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_adapter *adapter, IXGBE_WRITE_REG(hw, IXGBE_VTEICS, tx_ring->v_idx); } - u64_stats_update_begin(&tx_ring->syncp); tx_ring->total_bytes += total_bytes; tx_ring->total_packets += total_packets; - u64_stats_update_end(&tx_ring->syncp); + + netdev->stats.tx_bytes += total_bytes; + netdev->stats.tx_packets += total_packets; return count < tx_ring->work_limit; } @@ -596,10 +593,10 @@ static bool ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector, if (cleaned_count) ixgbevf_alloc_rx_buffers(adapter, rx_ring, cleaned_count); - u64_stats_update_begin(&rx_ring->syncp); rx_ring->total_packets += total_rx_packets; rx_ring->total_bytes += total_rx_bytes; - u64_stats_update_end(&rx_ring->syncp); + adapter->netdev->stats.rx_bytes += total_rx_bytes; + adapter->netdev->stats.rx_packets += total_rx_packets; return cleaned; } @@ -2259,6 +2256,10 @@ void ixgbevf_update_stats(struct ixgbevf_adapter *adapter) adapter->stats.vfgotc); UPDATE_VF_COUNTER_32bit(IXGBE_VFMPRC, adapter->stats.last_vfmprc, adapter->stats.vfmprc); + + /* Fill out the OS statistics structure */ + adapter->netdev->stats.multicast = adapter->stats.vfmprc - + adapter->stats.base_vfmprc; } /** @@ -3215,69 +3216,17 @@ static void ixgbevf_shutdown(struct pci_dev *pdev) pci_disable_device(pdev); } -static struct rtnl_link_stats64 *ixgbevf_get_stats(struct net_device *netdev, - struct rtnl_link_stats64 *stats) -{ - struct ixgbevf_adapter *adapter = netdev_priv(netdev); - unsigned int start; - u64 bytes, packets; - const struct ixgbevf_ring *ring; - int i; - - ixgbevf_update_stats(adapter); - - stats->multicast = adapter->stats.vfmprc - adapter->stats.base_vfmprc; - - for (i = 0; i < adapter->num_rx_queues; i++) { - ring = &adapter->rx_ring[i]; - do { - start = u64_stats_fetch_begin_bh(&ring->syncp); - bytes = ring->total_bytes; - packets = ring->total_packets; - } while (u64_stats_fetch_retry_bh(&ring->syncp, start)); - stats->rx_bytes += bytes; - stats->rx_packets += packets; - } - - for (i = 0; i < adapter->num_tx_queues; i++) { - ring = &adapter->tx_ring[i]; - do { - start = u64_stats_fetch_begin_bh(&ring->syncp); - bytes = ring->total_bytes; - packets = ring->total_packets; - } while (u64_stats_fetch_retry_bh(&ring->syncp, start)); - stats->tx_bytes += bytes; - stats->tx_packets += packets; - } - - return stats; -} - -static int ixgbevf_set_features(struct net_device *netdev, u32 features) -{ - struct ixgbevf_adapter *adapter = netdev_priv(netdev); - - if (features & NETIF_F_RXCSUM) - adapter->flags |= IXGBE_FLAG_RX_CSUM_ENABLED; - else - adapter->flags &= ~IXGBE_FLAG_RX_CSUM_ENABLED; - - return 0; -} - static const struct net_device_ops ixgbe_netdev_ops = { .ndo_open = ixgbevf_open, .ndo_stop = ixgbevf_close, .ndo_start_xmit = ixgbevf_xmit_frame, .ndo_set_rx_mode = ixgbevf_set_rx_mode, - .ndo_get_stats64 = ixgbevf_get_stats, .ndo_validate_addr = eth_validate_addr, .ndo_set_mac_address = ixgbevf_set_mac, .ndo_change_mtu = ixgbevf_change_mtu, .ndo_tx_timeout = ixgbevf_tx_timeout, .ndo_vlan_rx_add_vid = ixgbevf_vlan_rx_add_vid, .ndo_vlan_rx_kill_vid = ixgbevf_vlan_rx_kill_vid, - .ndo_set_features = ixgbevf_set_features, }; static void ixgbevf_assign_netdev_ops(struct net_device *dev) @@ -3390,18 +3339,16 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev, /* setup the private structure */ err = ixgbevf_sw_init(adapter); - netdev->hw_features = NETIF_F_SG | + netdev->features = NETIF_F_SG | NETIF_F_IP_CSUM | - NETIF_F_IPV6_CSUM | - NETIF_F_TSO | - NETIF_F_TSO6 | - NETIF_F_RXCSUM; - - netdev->features = netdev->hw_features | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER; + netdev->features |= NETIF_F_IPV6_CSUM; + netdev->features |= NETIF_F_TSO; + netdev->features |= NETIF_F_TSO6; + netdev->features |= NETIF_F_GRO; netdev->vlan_features |= NETIF_F_TSO; netdev->vlan_features |= NETIF_F_TSO6; netdev->vlan_features |= NETIF_F_IP_CSUM; diff --git a/trunk/drivers/net/fddi/Kconfig b/trunk/drivers/net/fddi/Kconfig new file mode 100644 index 000000000000..3a424c864f4d --- /dev/null +++ b/trunk/drivers/net/fddi/Kconfig @@ -0,0 +1,77 @@ +# +# FDDI network device configuration +# + +config FDDI + tristate "FDDI driver support" + depends on PCI || EISA || TC + ---help--- + Fiber Distributed Data Interface is a high speed local area network + design; essentially a replacement for high speed Ethernet. FDDI can + run over copper or fiber. If you are connected to such a network and + want a driver for the FDDI card in your computer, say Y here (and + then also Y to the driver for your FDDI card, below). Most people + will say N. + +if FDDI + +config DEFXX + tristate "Digital DEFTA/DEFEA/DEFPA adapter support" + depends on FDDI && (PCI || EISA || TC) + ---help--- + This is support for the DIGITAL series of TURBOchannel (DEFTA), + EISA (DEFEA) and PCI (DEFPA) controllers which can connect you + to a local FDDI network. + + To compile this driver as a module, choose M here: the module + will be called defxx. If unsure, say N. + +config DEFXX_MMIO + bool + prompt "Use MMIO instead of PIO" if PCI || EISA + depends on DEFXX + default n if PCI || EISA + default y + ---help--- + This instructs the driver to use EISA or PCI memory-mapped I/O + (MMIO) as appropriate instead of programmed I/O ports (PIO). + Enabling this gives an improvement in processing time in parts + of the driver, but it may cause problems with EISA (DEFEA) + adapters. TURBOchannel does not have the concept of I/O ports, + so MMIO is always used for these (DEFTA) adapters. + + If unsure, say N. + +config SKFP + tristate "SysKonnect FDDI PCI support" + depends on FDDI && PCI + select BITREVERSE + ---help--- + Say Y here if you have a SysKonnect FDDI PCI adapter. + The following adapters are supported by this driver: + - SK-5521 (SK-NET FDDI-UP) + - SK-5522 (SK-NET FDDI-UP DAS) + - SK-5541 (SK-NET FDDI-FP) + - SK-5543 (SK-NET FDDI-LP) + - SK-5544 (SK-NET FDDI-LP DAS) + - SK-5821 (SK-NET FDDI-UP64) + - SK-5822 (SK-NET FDDI-UP64 DAS) + - SK-5841 (SK-NET FDDI-FP64) + - SK-5843 (SK-NET FDDI-LP64) + - SK-5844 (SK-NET FDDI-LP64 DAS) + - Netelligent 100 FDDI DAS Fibre SC + - Netelligent 100 FDDI SAS Fibre SC + - Netelligent 100 FDDI DAS UTP + - Netelligent 100 FDDI SAS UTP + - Netelligent 100 FDDI SAS Fibre MIC + + Read for information about + the driver. + + Questions concerning this driver can be addressed to: + + + To compile this driver as a module, choose M here: the module + will be called skfp. This is recommended. + +endif # FDDI diff --git a/trunk/drivers/net/fddi/Makefile b/trunk/drivers/net/fddi/Makefile new file mode 100644 index 000000000000..36da19c9a8aa --- /dev/null +++ b/trunk/drivers/net/fddi/Makefile @@ -0,0 +1,6 @@ +# +# Makefile for the Linux FDDI network device drivers. +# + +obj-$(CONFIG_DEFXX) += defxx.o +obj-$(CONFIG_SKFP) += skfp/ diff --git a/trunk/drivers/net/defxx.c b/trunk/drivers/net/fddi/defxx.c similarity index 100% rename from trunk/drivers/net/defxx.c rename to trunk/drivers/net/fddi/defxx.c diff --git a/trunk/drivers/net/defxx.h b/trunk/drivers/net/fddi/defxx.h similarity index 100% rename from trunk/drivers/net/defxx.h rename to trunk/drivers/net/fddi/defxx.h diff --git a/trunk/drivers/net/skfp/Makefile b/trunk/drivers/net/fddi/skfp/Makefile similarity index 100% rename from trunk/drivers/net/skfp/Makefile rename to trunk/drivers/net/fddi/skfp/Makefile diff --git a/trunk/drivers/net/skfp/cfm.c b/trunk/drivers/net/fddi/skfp/cfm.c similarity index 100% rename from trunk/drivers/net/skfp/cfm.c rename to trunk/drivers/net/fddi/skfp/cfm.c diff --git a/trunk/drivers/net/skfp/drvfbi.c b/trunk/drivers/net/fddi/skfp/drvfbi.c similarity index 100% rename from trunk/drivers/net/skfp/drvfbi.c rename to trunk/drivers/net/fddi/skfp/drvfbi.c diff --git a/trunk/drivers/net/skfp/ecm.c b/trunk/drivers/net/fddi/skfp/ecm.c similarity index 100% rename from trunk/drivers/net/skfp/ecm.c rename to trunk/drivers/net/fddi/skfp/ecm.c diff --git a/trunk/drivers/net/skfp/ess.c b/trunk/drivers/net/fddi/skfp/ess.c similarity index 100% rename from trunk/drivers/net/skfp/ess.c rename to trunk/drivers/net/fddi/skfp/ess.c diff --git a/trunk/drivers/net/skfp/fplustm.c b/trunk/drivers/net/fddi/skfp/fplustm.c similarity index 100% rename from trunk/drivers/net/skfp/fplustm.c rename to trunk/drivers/net/fddi/skfp/fplustm.c diff --git a/trunk/drivers/net/skfp/h/cmtdef.h b/trunk/drivers/net/fddi/skfp/h/cmtdef.h similarity index 100% rename from trunk/drivers/net/skfp/h/cmtdef.h rename to trunk/drivers/net/fddi/skfp/h/cmtdef.h diff --git a/trunk/drivers/net/skfp/h/fddi.h b/trunk/drivers/net/fddi/skfp/h/fddi.h similarity index 100% rename from trunk/drivers/net/skfp/h/fddi.h rename to trunk/drivers/net/fddi/skfp/h/fddi.h diff --git a/trunk/drivers/net/skfp/h/fddimib.h b/trunk/drivers/net/fddi/skfp/h/fddimib.h similarity index 100% rename from trunk/drivers/net/skfp/h/fddimib.h rename to trunk/drivers/net/fddi/skfp/h/fddimib.h diff --git a/trunk/drivers/net/skfp/h/fplustm.h b/trunk/drivers/net/fddi/skfp/h/fplustm.h similarity index 100% rename from trunk/drivers/net/skfp/h/fplustm.h rename to trunk/drivers/net/fddi/skfp/h/fplustm.h diff --git a/trunk/drivers/net/skfp/h/hwmtm.h b/trunk/drivers/net/fddi/skfp/h/hwmtm.h similarity index 100% rename from trunk/drivers/net/skfp/h/hwmtm.h rename to trunk/drivers/net/fddi/skfp/h/hwmtm.h diff --git a/trunk/drivers/net/skfp/h/mbuf.h b/trunk/drivers/net/fddi/skfp/h/mbuf.h similarity index 100% rename from trunk/drivers/net/skfp/h/mbuf.h rename to trunk/drivers/net/fddi/skfp/h/mbuf.h diff --git a/trunk/drivers/net/skfp/h/osdef1st.h b/trunk/drivers/net/fddi/skfp/h/osdef1st.h similarity index 100% rename from trunk/drivers/net/skfp/h/osdef1st.h rename to trunk/drivers/net/fddi/skfp/h/osdef1st.h diff --git a/trunk/drivers/net/skfp/h/sba.h b/trunk/drivers/net/fddi/skfp/h/sba.h similarity index 100% rename from trunk/drivers/net/skfp/h/sba.h rename to trunk/drivers/net/fddi/skfp/h/sba.h diff --git a/trunk/drivers/net/skfp/h/sba_def.h b/trunk/drivers/net/fddi/skfp/h/sba_def.h similarity index 100% rename from trunk/drivers/net/skfp/h/sba_def.h rename to trunk/drivers/net/fddi/skfp/h/sba_def.h diff --git a/trunk/drivers/net/skfp/h/skfbi.h b/trunk/drivers/net/fddi/skfp/h/skfbi.h similarity index 100% rename from trunk/drivers/net/skfp/h/skfbi.h rename to trunk/drivers/net/fddi/skfp/h/skfbi.h diff --git a/trunk/drivers/net/skfp/h/skfbiinc.h b/trunk/drivers/net/fddi/skfp/h/skfbiinc.h similarity index 100% rename from trunk/drivers/net/skfp/h/skfbiinc.h rename to trunk/drivers/net/fddi/skfp/h/skfbiinc.h diff --git a/trunk/drivers/net/skfp/h/smc.h b/trunk/drivers/net/fddi/skfp/h/smc.h similarity index 100% rename from trunk/drivers/net/skfp/h/smc.h rename to trunk/drivers/net/fddi/skfp/h/smc.h diff --git a/trunk/drivers/net/skfp/h/smt.h b/trunk/drivers/net/fddi/skfp/h/smt.h similarity index 100% rename from trunk/drivers/net/skfp/h/smt.h rename to trunk/drivers/net/fddi/skfp/h/smt.h diff --git a/trunk/drivers/net/skfp/h/smt_p.h b/trunk/drivers/net/fddi/skfp/h/smt_p.h similarity index 100% rename from trunk/drivers/net/skfp/h/smt_p.h rename to trunk/drivers/net/fddi/skfp/h/smt_p.h diff --git a/trunk/drivers/net/skfp/h/smtstate.h b/trunk/drivers/net/fddi/skfp/h/smtstate.h similarity index 100% rename from trunk/drivers/net/skfp/h/smtstate.h rename to trunk/drivers/net/fddi/skfp/h/smtstate.h diff --git a/trunk/drivers/net/skfp/h/supern_2.h b/trunk/drivers/net/fddi/skfp/h/supern_2.h similarity index 100% rename from trunk/drivers/net/skfp/h/supern_2.h rename to trunk/drivers/net/fddi/skfp/h/supern_2.h diff --git a/trunk/drivers/net/skfp/h/targethw.h b/trunk/drivers/net/fddi/skfp/h/targethw.h similarity index 100% rename from trunk/drivers/net/skfp/h/targethw.h rename to trunk/drivers/net/fddi/skfp/h/targethw.h diff --git a/trunk/drivers/net/skfp/h/targetos.h b/trunk/drivers/net/fddi/skfp/h/targetos.h similarity index 100% rename from trunk/drivers/net/skfp/h/targetos.h rename to trunk/drivers/net/fddi/skfp/h/targetos.h diff --git a/trunk/drivers/net/skfp/h/types.h b/trunk/drivers/net/fddi/skfp/h/types.h similarity index 100% rename from trunk/drivers/net/skfp/h/types.h rename to trunk/drivers/net/fddi/skfp/h/types.h diff --git a/trunk/drivers/net/skfp/hwmtm.c b/trunk/drivers/net/fddi/skfp/hwmtm.c similarity index 100% rename from trunk/drivers/net/skfp/hwmtm.c rename to trunk/drivers/net/fddi/skfp/hwmtm.c diff --git a/trunk/drivers/net/skfp/hwt.c b/trunk/drivers/net/fddi/skfp/hwt.c similarity index 100% rename from trunk/drivers/net/skfp/hwt.c rename to trunk/drivers/net/fddi/skfp/hwt.c diff --git a/trunk/drivers/net/skfp/pcmplc.c b/trunk/drivers/net/fddi/skfp/pcmplc.c similarity index 100% rename from trunk/drivers/net/skfp/pcmplc.c rename to trunk/drivers/net/fddi/skfp/pcmplc.c diff --git a/trunk/drivers/net/skfp/pmf.c b/trunk/drivers/net/fddi/skfp/pmf.c similarity index 100% rename from trunk/drivers/net/skfp/pmf.c rename to trunk/drivers/net/fddi/skfp/pmf.c diff --git a/trunk/drivers/net/skfp/queue.c b/trunk/drivers/net/fddi/skfp/queue.c similarity index 100% rename from trunk/drivers/net/skfp/queue.c rename to trunk/drivers/net/fddi/skfp/queue.c diff --git a/trunk/drivers/net/skfp/rmt.c b/trunk/drivers/net/fddi/skfp/rmt.c similarity index 100% rename from trunk/drivers/net/skfp/rmt.c rename to trunk/drivers/net/fddi/skfp/rmt.c diff --git a/trunk/drivers/net/skfp/skfddi.c b/trunk/drivers/net/fddi/skfp/skfddi.c similarity index 100% rename from trunk/drivers/net/skfp/skfddi.c rename to trunk/drivers/net/fddi/skfp/skfddi.c diff --git a/trunk/drivers/net/skfp/smt.c b/trunk/drivers/net/fddi/skfp/smt.c similarity index 100% rename from trunk/drivers/net/skfp/smt.c rename to trunk/drivers/net/fddi/skfp/smt.c diff --git a/trunk/drivers/net/skfp/smtdef.c b/trunk/drivers/net/fddi/skfp/smtdef.c similarity index 100% rename from trunk/drivers/net/skfp/smtdef.c rename to trunk/drivers/net/fddi/skfp/smtdef.c diff --git a/trunk/drivers/net/skfp/smtinit.c b/trunk/drivers/net/fddi/skfp/smtinit.c similarity index 100% rename from trunk/drivers/net/skfp/smtinit.c rename to trunk/drivers/net/fddi/skfp/smtinit.c diff --git a/trunk/drivers/net/skfp/smttimer.c b/trunk/drivers/net/fddi/skfp/smttimer.c similarity index 100% rename from trunk/drivers/net/skfp/smttimer.c rename to trunk/drivers/net/fddi/skfp/smttimer.c diff --git a/trunk/drivers/net/skfp/srf.c b/trunk/drivers/net/fddi/skfp/srf.c similarity index 100% rename from trunk/drivers/net/skfp/srf.c rename to trunk/drivers/net/fddi/skfp/srf.c