diff options
author | David S. Miller <davem@davemloft.net> | 2011-05-08 01:57:22 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-05-08 01:57:22 -0400 |
commit | 534eacb5d4e7bafbdb60386678afeffb7966c375 (patch) | |
tree | c9785d952d8327c07993964d7313711f4f5bc6a0 | |
parent | 0f020dec545629bb068310e8ee374648867e391c (diff) | |
parent | 58f6bcf96e95f042a2bee6ace238365cb8fb1ce6 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/jkirsher/net-next-2.6
-rw-r--r-- | drivers/net/e100.c | 66 | ||||
-rw-r--r-- | drivers/net/e1000/e1000.h | 3 | ||||
-rw-r--r-- | drivers/net/e1000/e1000_ethtool.c | 50 | ||||
-rw-r--r-- | drivers/net/igb/igb_ethtool.c | 37 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_ethtool.c | 11 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 21 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_type.h | 8 |
7 files changed, 100 insertions, 96 deletions
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 29f812dc1098..e336c7937f05 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -593,7 +593,6 @@ struct nic { | |||
593 | enum phy phy; | 593 | enum phy phy; |
594 | struct params params; | 594 | struct params params; |
595 | struct timer_list watchdog; | 595 | struct timer_list watchdog; |
596 | struct timer_list blink_timer; | ||
597 | struct mii_if_info mii; | 596 | struct mii_if_info mii; |
598 | struct work_struct tx_timeout_task; | 597 | struct work_struct tx_timeout_task; |
599 | enum loopback loopback; | 598 | enum loopback loopback; |
@@ -618,7 +617,6 @@ struct nic { | |||
618 | u32 rx_tco_frames; | 617 | u32 rx_tco_frames; |
619 | u32 rx_over_length_errors; | 618 | u32 rx_over_length_errors; |
620 | 619 | ||
621 | u16 leds; | ||
622 | u16 eeprom_wc; | 620 | u16 eeprom_wc; |
623 | __le16 eeprom[256]; | 621 | __le16 eeprom[256]; |
624 | spinlock_t mdio_lock; | 622 | spinlock_t mdio_lock; |
@@ -2353,30 +2351,6 @@ err_clean_rx: | |||
2353 | #define E100_82552_LED_OVERRIDE 0x19 | 2351 | #define E100_82552_LED_OVERRIDE 0x19 |
2354 | #define E100_82552_LED_ON 0x000F /* LEDTX and LED_RX both on */ | 2352 | #define E100_82552_LED_ON 0x000F /* LEDTX and LED_RX both on */ |
2355 | #define E100_82552_LED_OFF 0x000A /* LEDTX and LED_RX both off */ | 2353 | #define E100_82552_LED_OFF 0x000A /* LEDTX and LED_RX both off */ |
2356 | static void e100_blink_led(unsigned long data) | ||
2357 | { | ||
2358 | struct nic *nic = (struct nic *)data; | ||
2359 | enum led_state { | ||
2360 | led_on = 0x01, | ||
2361 | led_off = 0x04, | ||
2362 | led_on_559 = 0x05, | ||
2363 | led_on_557 = 0x07, | ||
2364 | }; | ||
2365 | u16 led_reg = MII_LED_CONTROL; | ||
2366 | |||
2367 | if (nic->phy == phy_82552_v) { | ||
2368 | led_reg = E100_82552_LED_OVERRIDE; | ||
2369 | |||
2370 | nic->leds = (nic->leds == E100_82552_LED_ON) ? | ||
2371 | E100_82552_LED_OFF : E100_82552_LED_ON; | ||
2372 | } else { | ||
2373 | nic->leds = (nic->leds & led_on) ? led_off : | ||
2374 | (nic->mac < mac_82559_D101M) ? led_on_557 : | ||
2375 | led_on_559; | ||
2376 | } | ||
2377 | mdio_write(nic->netdev, nic->mii.phy_id, led_reg, nic->leds); | ||
2378 | mod_timer(&nic->blink_timer, jiffies + HZ / 4); | ||
2379 | } | ||
2380 | 2354 | ||
2381 | static int e100_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) | 2355 | static int e100_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) |
2382 | { | 2356 | { |
@@ -2600,19 +2574,38 @@ static void e100_diag_test(struct net_device *netdev, | |||
2600 | msleep_interruptible(4 * 1000); | 2574 | msleep_interruptible(4 * 1000); |
2601 | } | 2575 | } |
2602 | 2576 | ||
2603 | static int e100_phys_id(struct net_device *netdev, u32 data) | 2577 | static int e100_set_phys_id(struct net_device *netdev, |
2578 | enum ethtool_phys_id_state state) | ||
2604 | { | 2579 | { |
2605 | struct nic *nic = netdev_priv(netdev); | 2580 | struct nic *nic = netdev_priv(netdev); |
2581 | enum led_state { | ||
2582 | led_on = 0x01, | ||
2583 | led_off = 0x04, | ||
2584 | led_on_559 = 0x05, | ||
2585 | led_on_557 = 0x07, | ||
2586 | }; | ||
2606 | u16 led_reg = (nic->phy == phy_82552_v) ? E100_82552_LED_OVERRIDE : | 2587 | u16 led_reg = (nic->phy == phy_82552_v) ? E100_82552_LED_OVERRIDE : |
2607 | MII_LED_CONTROL; | 2588 | MII_LED_CONTROL; |
2589 | u16 leds = 0; | ||
2590 | |||
2591 | switch (state) { | ||
2592 | case ETHTOOL_ID_ACTIVE: | ||
2593 | return 2; | ||
2608 | 2594 | ||
2609 | if (!data || data > (u32)(MAX_SCHEDULE_TIMEOUT / HZ)) | 2595 | case ETHTOOL_ID_ON: |
2610 | data = (u32)(MAX_SCHEDULE_TIMEOUT / HZ); | 2596 | leds = (nic->phy == phy_82552_v) ? E100_82552_LED_ON : |
2611 | mod_timer(&nic->blink_timer, jiffies); | 2597 | (nic->mac < mac_82559_D101M) ? led_on_557 : led_on_559; |
2612 | msleep_interruptible(data * 1000); | 2598 | break; |
2613 | del_timer_sync(&nic->blink_timer); | 2599 | |
2614 | mdio_write(netdev, nic->mii.phy_id, led_reg, 0); | 2600 | case ETHTOOL_ID_OFF: |
2601 | leds = (nic->phy == phy_82552_v) ? E100_82552_LED_OFF : led_off; | ||
2602 | break; | ||
2603 | |||
2604 | case ETHTOOL_ID_INACTIVE: | ||
2605 | break; | ||
2606 | } | ||
2615 | 2607 | ||
2608 | mdio_write(netdev, nic->mii.phy_id, led_reg, leds); | ||
2616 | return 0; | 2609 | return 0; |
2617 | } | 2610 | } |
2618 | 2611 | ||
@@ -2693,7 +2686,7 @@ static const struct ethtool_ops e100_ethtool_ops = { | |||
2693 | .set_ringparam = e100_set_ringparam, | 2686 | .set_ringparam = e100_set_ringparam, |
2694 | .self_test = e100_diag_test, | 2687 | .self_test = e100_diag_test, |
2695 | .get_strings = e100_get_strings, | 2688 | .get_strings = e100_get_strings, |
2696 | .phys_id = e100_phys_id, | 2689 | .set_phys_id = e100_set_phys_id, |
2697 | .get_ethtool_stats = e100_get_ethtool_stats, | 2690 | .get_ethtool_stats = e100_get_ethtool_stats, |
2698 | .get_sset_count = e100_get_sset_count, | 2691 | .get_sset_count = e100_get_sset_count, |
2699 | }; | 2692 | }; |
@@ -2834,9 +2827,6 @@ static int __devinit e100_probe(struct pci_dev *pdev, | |||
2834 | init_timer(&nic->watchdog); | 2827 | init_timer(&nic->watchdog); |
2835 | nic->watchdog.function = e100_watchdog; | 2828 | nic->watchdog.function = e100_watchdog; |
2836 | nic->watchdog.data = (unsigned long)nic; | 2829 | nic->watchdog.data = (unsigned long)nic; |
2837 | init_timer(&nic->blink_timer); | ||
2838 | nic->blink_timer.function = e100_blink_led; | ||
2839 | nic->blink_timer.data = (unsigned long)nic; | ||
2840 | 2830 | ||
2841 | INIT_WORK(&nic->tx_timeout_task, e100_tx_timeout_task); | 2831 | INIT_WORK(&nic->tx_timeout_task, e100_tx_timeout_task); |
2842 | 2832 | ||
diff --git a/drivers/net/e1000/e1000.h b/drivers/net/e1000/e1000.h index b1b23ddd4eed..8676899120c3 100644 --- a/drivers/net/e1000/e1000.h +++ b/drivers/net/e1000/e1000.h | |||
@@ -238,9 +238,6 @@ struct e1000_adapter { | |||
238 | struct work_struct reset_task; | 238 | struct work_struct reset_task; |
239 | u8 fc_autoneg; | 239 | u8 fc_autoneg; |
240 | 240 | ||
241 | struct timer_list blink_timer; | ||
242 | unsigned long led_status; | ||
243 | |||
244 | /* TX */ | 241 | /* TX */ |
245 | struct e1000_tx_ring *tx_ring; /* One per active queue */ | 242 | struct e1000_tx_ring *tx_ring; /* One per active queue */ |
246 | unsigned int restart_queue; | 243 | unsigned int restart_queue; |
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index 4fa727ce8374..ec0fa426cce2 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
@@ -1755,46 +1755,28 @@ static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
1755 | return 0; | 1755 | return 0; |
1756 | } | 1756 | } |
1757 | 1757 | ||
1758 | /* toggle LED 4 times per second = 2 "blinks" per second */ | 1758 | static int e1000_set_phys_id(struct net_device *netdev, |
1759 | #define E1000_ID_INTERVAL (HZ/4) | 1759 | enum ethtool_phys_id_state state) |
1760 | |||
1761 | /* bit defines for adapter->led_status */ | ||
1762 | #define E1000_LED_ON 0 | ||
1763 | |||
1764 | static void e1000_led_blink_callback(unsigned long data) | ||
1765 | { | 1760 | { |
1766 | struct e1000_adapter *adapter = (struct e1000_adapter *) data; | 1761 | struct e1000_adapter *adapter = netdev_priv(netdev); |
1767 | struct e1000_hw *hw = &adapter->hw; | 1762 | struct e1000_hw *hw = &adapter->hw; |
1768 | 1763 | ||
1769 | if (test_and_change_bit(E1000_LED_ON, &adapter->led_status)) | 1764 | switch (state) { |
1770 | e1000_led_off(hw); | 1765 | case ETHTOOL_ID_ACTIVE: |
1771 | else | 1766 | e1000_setup_led(hw); |
1772 | e1000_led_on(hw); | 1767 | return 2; |
1773 | |||
1774 | mod_timer(&adapter->blink_timer, jiffies + E1000_ID_INTERVAL); | ||
1775 | } | ||
1776 | 1768 | ||
1777 | static int e1000_phys_id(struct net_device *netdev, u32 data) | 1769 | case ETHTOOL_ID_ON: |
1778 | { | 1770 | e1000_led_on(hw); |
1779 | struct e1000_adapter *adapter = netdev_priv(netdev); | 1771 | break; |
1780 | struct e1000_hw *hw = &adapter->hw; | ||
1781 | 1772 | ||
1782 | if (!data) | 1773 | case ETHTOOL_ID_OFF: |
1783 | data = INT_MAX; | 1774 | e1000_led_off(hw); |
1775 | break; | ||
1784 | 1776 | ||
1785 | if (!adapter->blink_timer.function) { | 1777 | case ETHTOOL_ID_INACTIVE: |
1786 | init_timer(&adapter->blink_timer); | 1778 | e1000_cleanup_led(hw); |
1787 | adapter->blink_timer.function = e1000_led_blink_callback; | ||
1788 | adapter->blink_timer.data = (unsigned long)adapter; | ||
1789 | } | 1779 | } |
1790 | e1000_setup_led(hw); | ||
1791 | mod_timer(&adapter->blink_timer, jiffies); | ||
1792 | msleep_interruptible(data * 1000); | ||
1793 | del_timer_sync(&adapter->blink_timer); | ||
1794 | |||
1795 | e1000_led_off(hw); | ||
1796 | clear_bit(E1000_LED_ON, &adapter->led_status); | ||
1797 | e1000_cleanup_led(hw); | ||
1798 | 1780 | ||
1799 | return 0; | 1781 | return 0; |
1800 | } | 1782 | } |
@@ -1931,7 +1913,7 @@ static const struct ethtool_ops e1000_ethtool_ops = { | |||
1931 | .set_tso = e1000_set_tso, | 1913 | .set_tso = e1000_set_tso, |
1932 | .self_test = e1000_diag_test, | 1914 | .self_test = e1000_diag_test, |
1933 | .get_strings = e1000_get_strings, | 1915 | .get_strings = e1000_get_strings, |
1934 | .phys_id = e1000_phys_id, | 1916 | .set_phys_id = e1000_set_phys_id, |
1935 | .get_ethtool_stats = e1000_get_ethtool_stats, | 1917 | .get_ethtool_stats = e1000_get_ethtool_stats, |
1936 | .get_sset_count = e1000_get_sset_count, | 1918 | .get_sset_count = e1000_get_sset_count, |
1937 | .get_coalesce = e1000_get_coalesce, | 1919 | .get_coalesce = e1000_get_coalesce, |
diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c index 6e29634b1fb5..fdc895e5a3f8 100644 --- a/drivers/net/igb/igb_ethtool.c +++ b/drivers/net/igb/igb_ethtool.c | |||
@@ -1964,27 +1964,28 @@ static int igb_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
1964 | /* bit defines for adapter->led_status */ | 1964 | /* bit defines for adapter->led_status */ |
1965 | #define IGB_LED_ON 0 | 1965 | #define IGB_LED_ON 0 |
1966 | 1966 | ||
1967 | static int igb_phys_id(struct net_device *netdev, u32 data) | 1967 | static int igb_set_phys_id(struct net_device *netdev, |
1968 | enum ethtool_phys_id_state state) | ||
1968 | { | 1969 | { |
1969 | struct igb_adapter *adapter = netdev_priv(netdev); | 1970 | struct igb_adapter *adapter = netdev_priv(netdev); |
1970 | struct e1000_hw *hw = &adapter->hw; | 1971 | struct e1000_hw *hw = &adapter->hw; |
1971 | unsigned long timeout; | ||
1972 | 1972 | ||
1973 | timeout = data * 1000; | 1973 | switch (state) { |
1974 | 1974 | case ETHTOOL_ID_ACTIVE: | |
1975 | /* | 1975 | igb_blink_led(hw); |
1976 | * msleep_interruptable only accepts unsigned int so we are limited | 1976 | return 2; |
1977 | * in how long a duration we can wait | 1977 | case ETHTOOL_ID_ON: |
1978 | */ | 1978 | igb_blink_led(hw); |
1979 | if (!timeout || timeout > UINT_MAX) | 1979 | break; |
1980 | timeout = UINT_MAX; | 1980 | case ETHTOOL_ID_OFF: |
1981 | 1981 | igb_led_off(hw); | |
1982 | igb_blink_led(hw); | 1982 | break; |
1983 | msleep_interruptible(timeout); | 1983 | case ETHTOOL_ID_INACTIVE: |
1984 | 1984 | igb_led_off(hw); | |
1985 | igb_led_off(hw); | 1985 | clear_bit(IGB_LED_ON, &adapter->led_status); |
1986 | clear_bit(IGB_LED_ON, &adapter->led_status); | 1986 | igb_cleanup_led(hw); |
1987 | igb_cleanup_led(hw); | 1987 | break; |
1988 | } | ||
1988 | 1989 | ||
1989 | return 0; | 1990 | return 0; |
1990 | } | 1991 | } |
@@ -2216,7 +2217,7 @@ static const struct ethtool_ops igb_ethtool_ops = { | |||
2216 | .set_tso = igb_set_tso, | 2217 | .set_tso = igb_set_tso, |
2217 | .self_test = igb_diag_test, | 2218 | .self_test = igb_diag_test, |
2218 | .get_strings = igb_get_strings, | 2219 | .get_strings = igb_get_strings, |
2219 | .phys_id = igb_phys_id, | 2220 | .set_phys_id = igb_set_phys_id, |
2220 | .get_sset_count = igb_get_sset_count, | 2221 | .get_sset_count = igb_get_sset_count, |
2221 | .get_ethtool_stats = igb_get_ethtool_stats, | 2222 | .get_ethtool_stats = igb_get_ethtool_stats, |
2222 | .get_coalesce = igb_get_coalesce, | 2223 | .get_coalesce = igb_get_coalesce, |
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c index f2efa3245352..1fdd075afe79 100644 --- a/drivers/net/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ixgbe/ixgbe_ethtool.c | |||
@@ -102,6 +102,10 @@ static struct ixgbe_stats ixgbe_gstrings_stats[] = { | |||
102 | {"alloc_rx_page_failed", IXGBE_STAT(alloc_rx_page_failed)}, | 102 | {"alloc_rx_page_failed", IXGBE_STAT(alloc_rx_page_failed)}, |
103 | {"alloc_rx_buff_failed", IXGBE_STAT(alloc_rx_buff_failed)}, | 103 | {"alloc_rx_buff_failed", IXGBE_STAT(alloc_rx_buff_failed)}, |
104 | {"rx_no_dma_resources", IXGBE_STAT(hw_rx_no_dma_resources)}, | 104 | {"rx_no_dma_resources", IXGBE_STAT(hw_rx_no_dma_resources)}, |
105 | {"os2bmc_rx_by_bmc", IXGBE_STAT(stats.o2bgptc)}, | ||
106 | {"os2bmc_tx_by_bmc", IXGBE_STAT(stats.b2ospc)}, | ||
107 | {"os2bmc_tx_by_host", IXGBE_STAT(stats.o2bspc)}, | ||
108 | {"os2bmc_rx_by_host", IXGBE_STAT(stats.b2ogprc)}, | ||
105 | #ifdef IXGBE_FCOE | 109 | #ifdef IXGBE_FCOE |
106 | {"fcoe_bad_fccrc", IXGBE_STAT(stats.fccrc)}, | 110 | {"fcoe_bad_fccrc", IXGBE_STAT(stats.fccrc)}, |
107 | {"rx_fcoe_dropped", IXGBE_STAT(stats.fcoerpdc)}, | 111 | {"rx_fcoe_dropped", IXGBE_STAT(stats.fcoerpdc)}, |
@@ -2253,8 +2257,13 @@ static int ixgbe_set_flags(struct net_device *netdev, u32 data) | |||
2253 | need_reset = (data & ETH_FLAG_RXVLAN) != | 2257 | need_reset = (data & ETH_FLAG_RXVLAN) != |
2254 | (netdev->features & NETIF_F_HW_VLAN_RX); | 2258 | (netdev->features & NETIF_F_HW_VLAN_RX); |
2255 | 2259 | ||
2260 | if ((data & ETH_FLAG_RXHASH) && | ||
2261 | !(adapter->flags & IXGBE_FLAG_RSS_ENABLED)) | ||
2262 | return -EOPNOTSUPP; | ||
2263 | |||
2256 | rc = ethtool_op_set_flags(netdev, data, ETH_FLAG_LRO | ETH_FLAG_NTUPLE | | 2264 | rc = ethtool_op_set_flags(netdev, data, ETH_FLAG_LRO | ETH_FLAG_NTUPLE | |
2257 | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN); | 2265 | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN | |
2266 | ETH_FLAG_RXHASH); | ||
2258 | if (rc) | 2267 | if (rc) |
2259 | return rc; | 2268 | return rc; |
2260 | 2269 | ||
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index eebb1921c660..a3e384bc50fe 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -1063,8 +1063,14 @@ static int __ixgbe_notify_dca(struct device *dev, void *data) | |||
1063 | 1063 | ||
1064 | return 0; | 1064 | return 0; |
1065 | } | 1065 | } |
1066 | |||
1067 | #endif /* CONFIG_IXGBE_DCA */ | 1066 | #endif /* CONFIG_IXGBE_DCA */ |
1067 | |||
1068 | static inline void ixgbe_rx_hash(union ixgbe_adv_rx_desc *rx_desc, | ||
1069 | struct sk_buff *skb) | ||
1070 | { | ||
1071 | skb->rxhash = le32_to_cpu(rx_desc->wb.lower.hi_dword.rss); | ||
1072 | } | ||
1073 | |||
1068 | /** | 1074 | /** |
1069 | * ixgbe_receive_skb - Send a completed packet up the stack | 1075 | * ixgbe_receive_skb - Send a completed packet up the stack |
1070 | * @adapter: board private structure | 1076 | * @adapter: board private structure |
@@ -1456,6 +1462,8 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
1456 | } | 1462 | } |
1457 | 1463 | ||
1458 | ixgbe_rx_checksum(adapter, rx_desc, skb); | 1464 | ixgbe_rx_checksum(adapter, rx_desc, skb); |
1465 | if (adapter->netdev->features & NETIF_F_RXHASH) | ||
1466 | ixgbe_rx_hash(rx_desc, skb); | ||
1459 | 1467 | ||
1460 | /* probably a little skewed due to removing CRC */ | 1468 | /* probably a little skewed due to removing CRC */ |
1461 | total_rx_bytes += skb->len; | 1469 | total_rx_bytes += skb->len; |
@@ -5904,8 +5912,13 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter) | |||
5904 | hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); | 5912 | hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH); |
5905 | hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORH); | 5913 | hwstats->tor += IXGBE_READ_REG(hw, IXGBE_TORH); |
5906 | break; | 5914 | break; |
5907 | case ixgbe_mac_82599EB: | ||
5908 | case ixgbe_mac_X540: | 5915 | case ixgbe_mac_X540: |
5916 | /* OS2BMC stats are X540 only*/ | ||
5917 | hwstats->o2bgptc += IXGBE_READ_REG(hw, IXGBE_O2BGPTC); | ||
5918 | hwstats->o2bspc += IXGBE_READ_REG(hw, IXGBE_O2BSPC); | ||
5919 | hwstats->b2ospc += IXGBE_READ_REG(hw, IXGBE_B2OSPC); | ||
5920 | hwstats->b2ogprc += IXGBE_READ_REG(hw, IXGBE_B2OGPRC); | ||
5921 | case ixgbe_mac_82599EB: | ||
5909 | hwstats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCL); | 5922 | hwstats->gorc += IXGBE_READ_REG(hw, IXGBE_GORCL); |
5910 | IXGBE_READ_REG(hw, IXGBE_GORCH); /* to clear */ | 5923 | IXGBE_READ_REG(hw, IXGBE_GORCH); /* to clear */ |
5911 | hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL); | 5924 | hwstats->gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL); |
@@ -7361,6 +7374,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
7361 | netdev->features |= NETIF_F_TSO; | 7374 | netdev->features |= NETIF_F_TSO; |
7362 | netdev->features |= NETIF_F_TSO6; | 7375 | netdev->features |= NETIF_F_TSO6; |
7363 | netdev->features |= NETIF_F_GRO; | 7376 | netdev->features |= NETIF_F_GRO; |
7377 | netdev->features |= NETIF_F_RXHASH; | ||
7364 | 7378 | ||
7365 | switch (adapter->hw.mac.type) { | 7379 | switch (adapter->hw.mac.type) { |
7366 | case ixgbe_mac_82599EB: | 7380 | case ixgbe_mac_82599EB: |
@@ -7441,6 +7455,9 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
7441 | if (err) | 7455 | if (err) |
7442 | goto err_sw_init; | 7456 | goto err_sw_init; |
7443 | 7457 | ||
7458 | if (!(adapter->flags & IXGBE_FLAG_RSS_ENABLED)) | ||
7459 | netdev->features &= ~NETIF_F_RXHASH; | ||
7460 | |||
7444 | switch (pdev->device) { | 7461 | switch (pdev->device) { |
7445 | case IXGBE_DEV_ID_82599_SFP: | 7462 | case IXGBE_DEV_ID_82599_SFP: |
7446 | /* Only this subdevice supports WOL */ | 7463 | /* Only this subdevice supports WOL */ |
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index b1d523ca4d81..70e6870be01f 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
@@ -672,6 +672,10 @@ | |||
672 | #define IXGBE_FCOEDWRC 0x0242C /* Number of FCoE DWords Received */ | 672 | #define IXGBE_FCOEDWRC 0x0242C /* Number of FCoE DWords Received */ |
673 | #define IXGBE_FCOEPTC 0x08784 /* Number of FCoE Packets Transmitted */ | 673 | #define IXGBE_FCOEPTC 0x08784 /* Number of FCoE Packets Transmitted */ |
674 | #define IXGBE_FCOEDWTC 0x08788 /* Number of FCoE DWords Transmitted */ | 674 | #define IXGBE_FCOEDWTC 0x08788 /* Number of FCoE DWords Transmitted */ |
675 | #define IXGBE_O2BGPTC 0x041C4 | ||
676 | #define IXGBE_O2BSPC 0x087B0 | ||
677 | #define IXGBE_B2OSPC 0x041C0 | ||
678 | #define IXGBE_B2OGPRC 0x02F90 | ||
675 | #define IXGBE_PCRC8ECL 0x0E810 | 679 | #define IXGBE_PCRC8ECL 0x0E810 |
676 | #define IXGBE_PCRC8ECH 0x0E811 | 680 | #define IXGBE_PCRC8ECH 0x0E811 |
677 | #define IXGBE_PCRC8ECH_MASK 0x1F | 681 | #define IXGBE_PCRC8ECH_MASK 0x1F |
@@ -2554,6 +2558,10 @@ struct ixgbe_hw_stats { | |||
2554 | u64 fcoeptc; | 2558 | u64 fcoeptc; |
2555 | u64 fcoedwrc; | 2559 | u64 fcoedwrc; |
2556 | u64 fcoedwtc; | 2560 | u64 fcoedwtc; |
2561 | u64 b2ospc; | ||
2562 | u64 b2ogprc; | ||
2563 | u64 o2bgptc; | ||
2564 | u64 o2bspc; | ||
2557 | }; | 2565 | }; |
2558 | 2566 | ||
2559 | /* forward declaration */ | 2567 | /* forward declaration */ |