]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/intel/igb/igb_main.c
Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
[karo-tx-linux.git] / drivers / net / ethernet / intel / igb / igb_main.c
index 2f70a9b152bd1789349d9c4d995852e95be1e70d..e174fbbdba4049d9a335b33498b4866da08c96ac 100644 (file)
@@ -57,8 +57,8 @@
 #include "igb.h"
 
 #define MAJ 5
-#define MIN 2
-#define BUILD 18
+#define MIN 3
+#define BUILD 0
 #define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \
 __stringify(BUILD) "-k"
 char igb_driver_name[] = "igb";
@@ -179,6 +179,8 @@ static void igb_check_vf_rate_limit(struct igb_adapter *);
 #ifdef CONFIG_PCI_IOV
 static int igb_vf_configure(struct igb_adapter *adapter, int vf);
 static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs);
+static int igb_disable_sriov(struct pci_dev *dev);
+static int igb_pci_disable_sriov(struct pci_dev *dev);
 #endif
 
 #ifdef CONFIG_PM
@@ -1205,10 +1207,14 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,
 
        /* allocate q_vector and rings */
        q_vector = adapter->q_vector[v_idx];
-       if (!q_vector)
+       if (!q_vector) {
                q_vector = kzalloc(size, GFP_KERNEL);
-       else
+       } else if (size > ksize(q_vector)) {
+               kfree_rcu(q_vector, rcu);
+               q_vector = kzalloc(size, GFP_KERNEL);
+       } else {
                memset(q_vector, 0, size);
+       }
        if (!q_vector)
                return -ENOMEM;
 
@@ -2645,7 +2651,11 @@ err_eeprom:
        if (hw->flash_address)
                iounmap(hw->flash_address);
 err_sw_init:
+       kfree(adapter->shadow_vfta);
        igb_clear_interrupt_scheme(adapter);
+#ifdef CONFIG_PCI_IOV
+       igb_disable_sriov(pdev);
+#endif
        pci_iounmap(pdev, hw->hw_addr);
 err_ioremap:
        free_netdev(netdev);
@@ -2805,14 +2815,14 @@ static void igb_remove(struct pci_dev *pdev)
         */
        igb_release_hw_control(adapter);
 
-       unregister_netdev(netdev);
-
-       igb_clear_interrupt_scheme(adapter);
-
 #ifdef CONFIG_PCI_IOV
        igb_disable_sriov(pdev);
 #endif
 
+       unregister_netdev(netdev);
+
+       igb_clear_interrupt_scheme(adapter);
+
        pci_iounmap(pdev, hw->hw_addr);
        if (hw->flash_address)
                iounmap(hw->flash_address);
@@ -2847,7 +2857,7 @@ static void igb_probe_vfs(struct igb_adapter *adapter)
                return;
 
        pci_sriov_set_totalvfs(pdev, 7);
-       igb_pci_enable_sriov(pdev, max_vfs);
+       igb_enable_sriov(pdev, max_vfs);
 
 #endif /* CONFIG_PCI_IOV */
 }
@@ -2888,6 +2898,14 @@ static void igb_init_queue_configuration(struct igb_adapter *adapter)
 
        adapter->rss_queues = min_t(u32, max_rss_queues, num_online_cpus());
 
+       igb_set_flag_queue_pairs(adapter, max_rss_queues);
+}
+
+void igb_set_flag_queue_pairs(struct igb_adapter *adapter,
+                             const u32 max_rss_queues)
+{
+       struct e1000_hw *hw = &adapter->hw;
+
        /* Determine if we need to pair queues. */
        switch (hw->mac.type) {
        case e1000_82575:
@@ -2968,6 +2986,8 @@ static int igb_sw_init(struct igb_adapter *adapter)
        }
 #endif /* CONFIG_PCI_IOV */
 
+       igb_probe_vfs(adapter);
+
        igb_init_queue_configuration(adapter);
 
        /* Setup and initialize a copy of the hw vlan table array */
@@ -2980,8 +3000,6 @@ static int igb_sw_init(struct igb_adapter *adapter)
                return -ENOMEM;
        }
 
-       igb_probe_vfs(adapter);
-
        /* Explicitly disable IRQ since the NIC can be in any state. */
        igb_irq_disable(adapter);
 
@@ -6566,7 +6584,7 @@ static void igb_reuse_rx_page(struct igb_ring *rx_ring,
 
 static inline bool igb_page_is_reserved(struct page *page)
 {
-       return (page_to_nid(page) != numa_mem_id()) || page->pfmemalloc;
+       return (page_to_nid(page) != numa_mem_id()) || page_is_pfmemalloc(page);
 }
 
 static bool igb_can_reuse_rx_page(struct igb_rx_buffer *rx_buffer,
@@ -6621,22 +6639,25 @@ static bool igb_add_rx_frag(struct igb_ring *rx_ring,
                            struct sk_buff *skb)
 {
        struct page *page = rx_buffer->page;
+       unsigned char *va = page_address(page) + rx_buffer->page_offset;
        unsigned int size = le16_to_cpu(rx_desc->wb.upper.length);
 #if (PAGE_SIZE < 8192)
        unsigned int truesize = IGB_RX_BUFSZ;
 #else
-       unsigned int truesize = ALIGN(size, L1_CACHE_BYTES);
+       unsigned int truesize = SKB_DATA_ALIGN(size);
 #endif
+       unsigned int pull_len;
 
-       if ((size <= IGB_RX_HDR_LEN) && !skb_is_nonlinear(skb)) {
-               unsigned char *va = page_address(page) + rx_buffer->page_offset;
+       if (unlikely(skb_is_nonlinear(skb)))
+               goto add_tail_frag;
 
-               if (igb_test_staterr(rx_desc, E1000_RXDADV_STAT_TSIP)) {
-                       igb_ptp_rx_pktstamp(rx_ring->q_vector, va, skb);
-                       va += IGB_TS_HDR_LEN;
-                       size -= IGB_TS_HDR_LEN;
-               }
+       if (unlikely(igb_test_staterr(rx_desc, E1000_RXDADV_STAT_TSIP))) {
+               igb_ptp_rx_pktstamp(rx_ring->q_vector, va, skb);
+               va += IGB_TS_HDR_LEN;
+               size -= IGB_TS_HDR_LEN;
+       }
 
+       if (likely(size <= IGB_RX_HDR_LEN)) {
                memcpy(__skb_put(skb, size), va, ALIGN(size, sizeof(long)));
 
                /* page is not reserved, we can reuse buffer as-is */
@@ -6648,8 +6669,21 @@ static bool igb_add_rx_frag(struct igb_ring *rx_ring,
                return false;
        }
 
+       /* we need the header to contain the greater of either ETH_HLEN or
+        * 60 bytes if the skb->len is less than 60 for skb_pad.
+        */
+       pull_len = eth_get_headlen(va, IGB_RX_HDR_LEN);
+
+       /* align pull length to size of long to optimize memcpy performance */
+       memcpy(__skb_put(skb, pull_len), va, ALIGN(pull_len, sizeof(long)));
+
+       /* update all of the pointers */
+       va += pull_len;
+       size -= pull_len;
+
+add_tail_frag:
        skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page,
-                       rx_buffer->page_offset, size, truesize);
+                       (unsigned long)va & ~PAGE_MASK, size, truesize);
 
        return igb_can_reuse_rx_page(rx_buffer, page, truesize);
 }
@@ -6790,62 +6824,6 @@ static bool igb_is_non_eop(struct igb_ring *rx_ring,
        return true;
 }
 
-/**
- *  igb_pull_tail - igb specific version of skb_pull_tail
- *  @rx_ring: rx descriptor ring packet is being transacted on
- *  @rx_desc: pointer to the EOP Rx descriptor
- *  @skb: pointer to current skb being adjusted
- *
- *  This function is an igb specific version of __pskb_pull_tail.  The
- *  main difference between this version and the original function is that
- *  this function can make several assumptions about the state of things
- *  that allow for significant optimizations versus the standard function.
- *  As a result we can do things like drop a frag and maintain an accurate
- *  truesize for the skb.
- */
-static void igb_pull_tail(struct igb_ring *rx_ring,
-                         union e1000_adv_rx_desc *rx_desc,
-                         struct sk_buff *skb)
-{
-       struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0];
-       unsigned char *va;
-       unsigned int pull_len;
-
-       /* it is valid to use page_address instead of kmap since we are
-        * working with pages allocated out of the lomem pool per
-        * alloc_page(GFP_ATOMIC)
-        */
-       va = skb_frag_address(frag);
-
-       if (igb_test_staterr(rx_desc, E1000_RXDADV_STAT_TSIP)) {
-               /* retrieve timestamp from buffer */
-               igb_ptp_rx_pktstamp(rx_ring->q_vector, va, skb);
-
-               /* update pointers to remove timestamp header */
-               skb_frag_size_sub(frag, IGB_TS_HDR_LEN);
-               frag->page_offset += IGB_TS_HDR_LEN;
-               skb->data_len -= IGB_TS_HDR_LEN;
-               skb->len -= IGB_TS_HDR_LEN;
-
-               /* move va to start of packet data */
-               va += IGB_TS_HDR_LEN;
-       }
-
-       /* we need the header to contain the greater of either ETH_HLEN or
-        * 60 bytes if the skb->len is less than 60 for skb_pad.
-        */
-       pull_len = eth_get_headlen(va, IGB_RX_HDR_LEN);
-
-       /* align pull length to size of long to optimize memcpy performance */
-       skb_copy_to_linear_data(skb, va, ALIGN(pull_len, sizeof(long)));
-
-       /* update all of the pointers */
-       skb_frag_size_sub(frag, pull_len);
-       frag->page_offset += pull_len;
-       skb->data_len -= pull_len;
-       skb->tail += pull_len;
-}
-
 /**
  *  igb_cleanup_headers - Correct corrupted or empty headers
  *  @rx_ring: rx descriptor ring packet is being transacted on
@@ -6873,10 +6851,6 @@ static bool igb_cleanup_headers(struct igb_ring *rx_ring,
                }
        }
 
-       /* place header in linear portion of buffer */
-       if (skb_is_nonlinear(skb))
-               igb_pull_tail(rx_ring, rx_desc, skb);
-
        /* if eth_skb_pad returns an error the skb was freed */
        if (eth_skb_pad(skb))
                return true;
@@ -7445,6 +7419,7 @@ static int igb_resume(struct device *dev)
 
        if (igb_init_interrupt_scheme(adapter, true)) {
                dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
+               rtnl_unlock();
                return -ENOMEM;
        }
 
@@ -7538,6 +7513,7 @@ static int igb_sriov_reinit(struct pci_dev *dev)
        igb_init_queue_configuration(adapter);
 
        if (igb_init_interrupt_scheme(adapter, true)) {
+               rtnl_unlock();
                dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
                return -ENOMEM;
        }