[XFS] Fix merge failures
[pandora-kernel.git] / drivers / net / ixgbe / ixgbe_main.c
index a7aa892..acef3c6 100644 (file)
@@ -479,7 +479,6 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter,
        union ixgbe_adv_rx_desc *rx_desc;
        struct ixgbe_rx_buffer *bi;
        unsigned int i;
-       unsigned int bufsz = rx_ring->rx_buf_len + NET_IP_ALIGN;
 
        i = rx_ring->next_to_use;
        bi = &rx_ring->rx_buffer_info[i];
@@ -508,8 +507,10 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter,
                }
 
                if (!bi->skb) {
-                       struct sk_buff *skb = netdev_alloc_skb(adapter->netdev,
-                                                              bufsz);
+                       struct sk_buff *skb;
+                       skb = netdev_alloc_skb(adapter->netdev,
+                                              (rx_ring->rx_buf_len +
+                                               NET_IP_ALIGN));
 
                        if (!skb) {
                                adapter->alloc_rx_buff_failed++;
@@ -524,7 +525,8 @@ static void ixgbe_alloc_rx_buffers(struct ixgbe_adapter *adapter,
                        skb_reserve(skb, NET_IP_ALIGN);
 
                        bi->skb = skb;
-                       bi->dma = pci_map_single(pdev, skb->data, bufsz,
+                       bi->dma = pci_map_single(pdev, skb->data,
+                                                rx_ring->rx_buf_len,
                                                 PCI_DMA_FROMDEVICE);
                }
                /* Refresh the desc even if buffer_addrs didn't change because
@@ -615,7 +617,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_adapter *adapter,
 
                if (len && !skb_shinfo(skb)->nr_frags) {
                        pci_unmap_single(pdev, rx_buffer_info->dma,
-                                        rx_ring->rx_buf_len + NET_IP_ALIGN,
+                                        rx_ring->rx_buf_len,
                                         PCI_DMA_FROMDEVICE);
                        skb_put(skb, len);
                }
@@ -1010,7 +1012,7 @@ static irqreturn_t ixgbe_msix_clean_rx(int irq, void *data)
        rx_ring = &(adapter->rx_ring[r_idx]);
        /* disable interrupts on this vector only */
        IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, rx_ring->v_idx);
-       netif_rx_schedule(adapter->netdev, &q_vector->napi);
+       netif_rx_schedule(&q_vector->napi);
 
        return IRQ_HANDLED;
 }
@@ -1051,7 +1053,7 @@ static int ixgbe_clean_rxonly(struct napi_struct *napi, int budget)
 
        /* If all Rx work done, exit the polling mode */
        if (work_done < budget) {
-               netif_rx_complete(adapter->netdev, napi);
+               netif_rx_complete(napi);
                if (adapter->itr_setting & 3)
                        ixgbe_set_itr_msix(q_vector);
                if (!test_bit(__IXGBE_DOWN, &adapter->state))
@@ -1100,7 +1102,7 @@ static int ixgbe_clean_rxonly_many(struct napi_struct *napi, int budget)
        rx_ring = &(adapter->rx_ring[r_idx]);
        /* If all Rx work done, exit the polling mode */
        if (work_done < budget) {
-               netif_rx_complete(adapter->netdev, napi);
+               netif_rx_complete(napi);
                if (adapter->itr_setting & 3)
                        ixgbe_set_itr_msix(q_vector);
                if (!test_bit(__IXGBE_DOWN, &adapter->state))
@@ -1376,13 +1378,13 @@ static irqreturn_t ixgbe_intr(int irq, void *data)
 
        ixgbe_check_fan_failure(adapter, eicr);
 
-       if (netif_rx_schedule_prep(netdev, &adapter->q_vector[0].napi)) {
+       if (netif_rx_schedule_prep(&adapter->q_vector[0].napi)) {
                adapter->tx_ring[0].total_packets = 0;
                adapter->tx_ring[0].total_bytes = 0;
                adapter->rx_ring[0].total_packets = 0;
                adapter->rx_ring[0].total_bytes = 0;
                /* would disable interrupts here but EIAM disabled it */
-               __netif_rx_schedule(netdev, &adapter->q_vector[0].napi);
+               __netif_rx_schedule(&adapter->q_vector[0].napi);
        }
 
        return IRQ_HANDLED;
@@ -2062,6 +2064,8 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)
        else
                ixgbe_configure_msi_and_legacy(adapter);
 
+       ixgbe_napi_add_all(adapter);
+
        clear_bit(__IXGBE_DOWN, &adapter->state);
        ixgbe_napi_enable_all(adapter);
 
@@ -2306,7 +2310,7 @@ static int ixgbe_poll(struct napi_struct *napi, int budget)
 
        /* If budget not fully consumed, exit the polling mode */
        if (work_done < budget) {
-               netif_rx_complete(adapter->netdev, napi);
+               netif_rx_complete(napi);
                if (adapter->itr_setting & 3)
                        ixgbe_set_itr(adapter);
                if (!test_bit(__IXGBE_DOWN, &adapter->state))
@@ -3174,8 +3178,13 @@ static int ixgbe_close(struct net_device *netdev)
 void ixgbe_napi_add_all(struct ixgbe_adapter *adapter)
 {
        int q_idx, q_vectors;
+       struct net_device *netdev = adapter->netdev;
        int (*poll)(struct napi_struct *, int);
 
+       /* check if we already have our netdev->napi_list populated */
+       if (&netdev->napi_list != netdev->napi_list.next)
+               return;
+
        if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
                poll = &ixgbe_clean_rxonly;
                /* Only enable as many vectors as we have rx queues. */
@@ -3269,6 +3278,7 @@ static int ixgbe_suspend(struct pci_dev *pdev, pm_message_t state)
        }
        ixgbe_reset_interrupt_capability(adapter);
        ixgbe_napi_del_all(adapter);
+       INIT_LIST_HEAD(&netdev->napi_list);
        kfree(adapter->tx_ring);
        kfree(adapter->rx_ring);
 
@@ -4020,6 +4030,13 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
                goto err_pci_reg;
        }
 
+       err = pci_enable_pcie_error_reporting(pdev);
+       if (err) {
+               dev_err(&pdev->dev, "pci_enable_pcie_error_reporting failed "
+                                   "0x%x\n", err);
+               /* non-fatal, continue */
+       }
+
        pci_set_master(pdev);
        pci_save_state(pdev);
 
@@ -4203,8 +4220,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
        netif_carrier_off(netdev);
        netif_tx_stop_all_queues(netdev);
 
-       ixgbe_napi_add_all(adapter);
-
        strcpy(netdev->name, "eth%d");
        err = register_netdev(netdev);
        if (err)
@@ -4257,6 +4272,7 @@ static void __devexit ixgbe_remove(struct pci_dev *pdev)
 {
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
+       int err;
 
        set_bit(__IXGBE_DOWN, &adapter->state);
        /* clear the module not found bit to make sure the worker won't
@@ -4289,12 +4305,16 @@ static void __devexit ixgbe_remove(struct pci_dev *pdev)
        pci_release_regions(pdev);
 
        DPRINTK(PROBE, INFO, "complete\n");
-       ixgbe_napi_del_all(adapter);
        kfree(adapter->tx_ring);
        kfree(adapter->rx_ring);
 
        free_netdev(netdev);
 
+       err = pci_disable_pcie_error_reporting(pdev);
+       if (err)
+               dev_err(&pdev->dev,
+                       "pci_disable_pcie_error_reporting failed 0x%x\n", err);
+
        pci_disable_device(pdev);
 }
 
@@ -4332,21 +4352,33 @@ static pci_ers_result_t ixgbe_io_slot_reset(struct pci_dev *pdev)
 {
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
+       pci_ers_result_t result;
+       int err;
 
        if (pci_enable_device(pdev)) {
                DPRINTK(PROBE, ERR,
                        "Cannot re-enable PCI device after reset.\n");
-               return PCI_ERS_RESULT_DISCONNECT;
-       }
-       pci_set_master(pdev);
-       pci_restore_state(pdev);
+               result = PCI_ERS_RESULT_DISCONNECT;
+       } else {
+               pci_set_master(pdev);
+               pci_restore_state(pdev);
 
-       pci_enable_wake(pdev, PCI_D3hot, 0);
-       pci_enable_wake(pdev, PCI_D3cold, 0);
+               pci_enable_wake(pdev, PCI_D3hot, 0);
+               pci_enable_wake(pdev, PCI_D3cold, 0);
 
-       ixgbe_reset(adapter);
+               ixgbe_reset(adapter);
+
+               result = PCI_ERS_RESULT_RECOVERED;
+       }
+
+       err = pci_cleanup_aer_uncorrect_error_status(pdev);
+       if (err) {
+               dev_err(&pdev->dev,
+                 "pci_cleanup_aer_uncorrect_error_status failed 0x%0x\n", err);
+               /* non-fatal, continue */
+       }
 
-       return PCI_ERS_RESULT_RECOVERED;
+       return result;
 }
 
 /**