diff options
Diffstat (limited to 'drivers/net/ixgbevf/ixgbevf_main.c')
-rw-r--r-- | drivers/net/ixgbevf/ixgbevf_main.c | 78 |
1 files changed, 50 insertions, 28 deletions
diff --git a/drivers/net/ixgbevf/ixgbevf_main.c b/drivers/net/ixgbevf/ixgbevf_main.c index ca653c49b765..0cd6202dfacc 100644 --- a/drivers/net/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ixgbevf/ixgbevf_main.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include <linux/ip.h> | 39 | #include <linux/ip.h> |
40 | #include <linux/tcp.h> | 40 | #include <linux/tcp.h> |
41 | #include <linux/ipv6.h> | 41 | #include <linux/ipv6.h> |
42 | #include <linux/slab.h> | ||
42 | #include <net/checksum.h> | 43 | #include <net/checksum.h> |
43 | #include <net/ip6_checksum.h> | 44 | #include <net/ip6_checksum.h> |
44 | #include <linux/ethtool.h> | 45 | #include <linux/ethtool.h> |
@@ -965,7 +966,7 @@ static irqreturn_t ixgbevf_msix_mbx(int irq, void *data) | |||
965 | 966 | ||
966 | if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG) | 967 | if ((msg & IXGBE_MBVFICR_VFREQ_MASK) == IXGBE_PF_CONTROL_MSG) |
967 | mod_timer(&adapter->watchdog_timer, | 968 | mod_timer(&adapter->watchdog_timer, |
968 | round_jiffies(jiffies + 10)); | 969 | round_jiffies(jiffies + 1)); |
969 | 970 | ||
970 | return IRQ_HANDLED; | 971 | return IRQ_HANDLED; |
971 | } | 972 | } |
@@ -1610,6 +1611,44 @@ static inline void ixgbevf_rx_desc_queue_enable(struct ixgbevf_adapter *adapter, | |||
1610 | (adapter->rx_ring[rxr].count - 1)); | 1611 | (adapter->rx_ring[rxr].count - 1)); |
1611 | } | 1612 | } |
1612 | 1613 | ||
1614 | static void ixgbevf_save_reset_stats(struct ixgbevf_adapter *adapter) | ||
1615 | { | ||
1616 | /* Only save pre-reset stats if there are some */ | ||
1617 | if (adapter->stats.vfgprc || adapter->stats.vfgptc) { | ||
1618 | adapter->stats.saved_reset_vfgprc += adapter->stats.vfgprc - | ||
1619 | adapter->stats.base_vfgprc; | ||
1620 | adapter->stats.saved_reset_vfgptc += adapter->stats.vfgptc - | ||
1621 | adapter->stats.base_vfgptc; | ||
1622 | adapter->stats.saved_reset_vfgorc += adapter->stats.vfgorc - | ||
1623 | adapter->stats.base_vfgorc; | ||
1624 | adapter->stats.saved_reset_vfgotc += adapter->stats.vfgotc - | ||
1625 | adapter->stats.base_vfgotc; | ||
1626 | adapter->stats.saved_reset_vfmprc += adapter->stats.vfmprc - | ||
1627 | adapter->stats.base_vfmprc; | ||
1628 | } | ||
1629 | } | ||
1630 | |||
1631 | static void ixgbevf_init_last_counter_stats(struct ixgbevf_adapter *adapter) | ||
1632 | { | ||
1633 | struct ixgbe_hw *hw = &adapter->hw; | ||
1634 | |||
1635 | adapter->stats.last_vfgprc = IXGBE_READ_REG(hw, IXGBE_VFGPRC); | ||
1636 | adapter->stats.last_vfgorc = IXGBE_READ_REG(hw, IXGBE_VFGORC_LSB); | ||
1637 | adapter->stats.last_vfgorc |= | ||
1638 | (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGORC_MSB))) << 32); | ||
1639 | adapter->stats.last_vfgptc = IXGBE_READ_REG(hw, IXGBE_VFGPTC); | ||
1640 | adapter->stats.last_vfgotc = IXGBE_READ_REG(hw, IXGBE_VFGOTC_LSB); | ||
1641 | adapter->stats.last_vfgotc |= | ||
1642 | (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGOTC_MSB))) << 32); | ||
1643 | adapter->stats.last_vfmprc = IXGBE_READ_REG(hw, IXGBE_VFMPRC); | ||
1644 | |||
1645 | adapter->stats.base_vfgprc = adapter->stats.last_vfgprc; | ||
1646 | adapter->stats.base_vfgorc = adapter->stats.last_vfgorc; | ||
1647 | adapter->stats.base_vfgptc = adapter->stats.last_vfgptc; | ||
1648 | adapter->stats.base_vfgotc = adapter->stats.last_vfgotc; | ||
1649 | adapter->stats.base_vfmprc = adapter->stats.last_vfmprc; | ||
1650 | } | ||
1651 | |||
1613 | static int ixgbevf_up_complete(struct ixgbevf_adapter *adapter) | 1652 | static int ixgbevf_up_complete(struct ixgbevf_adapter *adapter) |
1614 | { | 1653 | { |
1615 | struct net_device *netdev = adapter->netdev; | 1654 | struct net_device *netdev = adapter->netdev; |
@@ -1656,6 +1695,9 @@ static int ixgbevf_up_complete(struct ixgbevf_adapter *adapter) | |||
1656 | /* enable transmits */ | 1695 | /* enable transmits */ |
1657 | netif_tx_start_all_queues(netdev); | 1696 | netif_tx_start_all_queues(netdev); |
1658 | 1697 | ||
1698 | ixgbevf_save_reset_stats(adapter); | ||
1699 | ixgbevf_init_last_counter_stats(adapter); | ||
1700 | |||
1659 | /* bring the link up in the watchdog, this could race with our first | 1701 | /* bring the link up in the watchdog, this could race with our first |
1660 | * link up interrupt but shouldn't be a problem */ | 1702 | * link up interrupt but shouldn't be a problem */ |
1661 | adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE; | 1703 | adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE; |
@@ -2228,27 +2270,6 @@ out: | |||
2228 | return err; | 2270 | return err; |
2229 | } | 2271 | } |
2230 | 2272 | ||
2231 | static void ixgbevf_init_last_counter_stats(struct ixgbevf_adapter *adapter) | ||
2232 | { | ||
2233 | struct ixgbe_hw *hw = &adapter->hw; | ||
2234 | |||
2235 | adapter->stats.last_vfgprc = IXGBE_READ_REG(hw, IXGBE_VFGPRC); | ||
2236 | adapter->stats.last_vfgorc = IXGBE_READ_REG(hw, IXGBE_VFGORC_LSB); | ||
2237 | adapter->stats.last_vfgorc |= | ||
2238 | (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGORC_MSB))) << 32); | ||
2239 | adapter->stats.last_vfgptc = IXGBE_READ_REG(hw, IXGBE_VFGPTC); | ||
2240 | adapter->stats.last_vfgotc = IXGBE_READ_REG(hw, IXGBE_VFGOTC_LSB); | ||
2241 | adapter->stats.last_vfgotc |= | ||
2242 | (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGOTC_MSB))) << 32); | ||
2243 | adapter->stats.last_vfmprc = IXGBE_READ_REG(hw, IXGBE_VFMPRC); | ||
2244 | |||
2245 | adapter->stats.base_vfgprc = adapter->stats.last_vfgprc; | ||
2246 | adapter->stats.base_vfgorc = adapter->stats.last_vfgorc; | ||
2247 | adapter->stats.base_vfgptc = adapter->stats.last_vfgptc; | ||
2248 | adapter->stats.base_vfgotc = adapter->stats.last_vfgotc; | ||
2249 | adapter->stats.base_vfmprc = adapter->stats.last_vfmprc; | ||
2250 | } | ||
2251 | |||
2252 | #define UPDATE_VF_COUNTER_32bit(reg, last_counter, counter) \ | 2273 | #define UPDATE_VF_COUNTER_32bit(reg, last_counter, counter) \ |
2253 | { \ | 2274 | { \ |
2254 | u32 current_counter = IXGBE_READ_REG(hw, reg); \ | 2275 | u32 current_counter = IXGBE_READ_REG(hw, reg); \ |
@@ -2399,7 +2420,7 @@ static void ixgbevf_watchdog_task(struct work_struct *work) | |||
2399 | if (!netif_carrier_ok(netdev)) { | 2420 | if (!netif_carrier_ok(netdev)) { |
2400 | hw_dbg(&adapter->hw, "NIC Link is Up %s, ", | 2421 | hw_dbg(&adapter->hw, "NIC Link is Up %s, ", |
2401 | ((link_speed == IXGBE_LINK_SPEED_10GB_FULL) ? | 2422 | ((link_speed == IXGBE_LINK_SPEED_10GB_FULL) ? |
2402 | "10 Gbps" : "1 Gbps")); | 2423 | "10 Gbps\n" : "1 Gbps\n")); |
2403 | netif_carrier_on(netdev); | 2424 | netif_carrier_on(netdev); |
2404 | netif_tx_wake_all_queues(netdev); | 2425 | netif_tx_wake_all_queues(netdev); |
2405 | } else { | 2426 | } else { |
@@ -2416,9 +2437,9 @@ static void ixgbevf_watchdog_task(struct work_struct *work) | |||
2416 | } | 2437 | } |
2417 | } | 2438 | } |
2418 | 2439 | ||
2419 | pf_has_reset: | ||
2420 | ixgbevf_update_stats(adapter); | 2440 | ixgbevf_update_stats(adapter); |
2421 | 2441 | ||
2442 | pf_has_reset: | ||
2422 | /* Force detection of hung controller every watchdog period */ | 2443 | /* Force detection of hung controller every watchdog period */ |
2423 | adapter->detect_tx_hung = true; | 2444 | adapter->detect_tx_hung = true; |
2424 | 2445 | ||
@@ -2675,7 +2696,7 @@ static int ixgbevf_open(struct net_device *netdev) | |||
2675 | if (hw->adapter_stopped) { | 2696 | if (hw->adapter_stopped) { |
2676 | err = IXGBE_ERR_MBX; | 2697 | err = IXGBE_ERR_MBX; |
2677 | printk(KERN_ERR "Unable to start - perhaps the PF" | 2698 | printk(KERN_ERR "Unable to start - perhaps the PF" |
2678 | "Driver isn't up yet\n"); | 2699 | " Driver isn't up yet\n"); |
2679 | goto err_setup_reset; | 2700 | goto err_setup_reset; |
2680 | } | 2701 | } |
2681 | } | 2702 | } |
@@ -2923,9 +2944,10 @@ static int ixgbevf_tx_map(struct ixgbevf_adapter *adapter, | |||
2923 | struct ixgbevf_tx_buffer *tx_buffer_info; | 2944 | struct ixgbevf_tx_buffer *tx_buffer_info; |
2924 | unsigned int len; | 2945 | unsigned int len; |
2925 | unsigned int total = skb->len; | 2946 | unsigned int total = skb->len; |
2926 | unsigned int offset = 0, size, count = 0, i; | 2947 | unsigned int offset = 0, size, count = 0; |
2927 | unsigned int nr_frags = skb_shinfo(skb)->nr_frags; | 2948 | unsigned int nr_frags = skb_shinfo(skb)->nr_frags; |
2928 | unsigned int f; | 2949 | unsigned int f; |
2950 | int i; | ||
2929 | 2951 | ||
2930 | i = tx_ring->next_to_use; | 2952 | i = tx_ring->next_to_use; |
2931 | 2953 | ||
@@ -3390,8 +3412,6 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev, | |||
3390 | /* setup the private structure */ | 3412 | /* setup the private structure */ |
3391 | err = ixgbevf_sw_init(adapter); | 3413 | err = ixgbevf_sw_init(adapter); |
3392 | 3414 | ||
3393 | ixgbevf_init_last_counter_stats(adapter); | ||
3394 | |||
3395 | #ifdef MAX_SKB_FRAGS | 3415 | #ifdef MAX_SKB_FRAGS |
3396 | netdev->features = NETIF_F_SG | | 3416 | netdev->features = NETIF_F_SG | |
3397 | NETIF_F_IP_CSUM | | 3417 | NETIF_F_IP_CSUM | |
@@ -3449,6 +3469,8 @@ static int __devinit ixgbevf_probe(struct pci_dev *pdev, | |||
3449 | 3469 | ||
3450 | adapter->netdev_registered = true; | 3470 | adapter->netdev_registered = true; |
3451 | 3471 | ||
3472 | ixgbevf_init_last_counter_stats(adapter); | ||
3473 | |||
3452 | /* print the MAC address */ | 3474 | /* print the MAC address */ |
3453 | hw_dbg(hw, "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", | 3475 | hw_dbg(hw, "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", |
3454 | netdev->dev_addr[0], | 3476 | netdev->dev_addr[0], |