Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes...
[sfrench/cifs-2.6.git] / drivers / net / e1000e / netdev.c
index 71592ed2e6869c7fc5db1dcb29b251d1513f1f70..521c6ee1f32af75a0abb5950d10c941376d60116 100644 (file)
@@ -224,10 +224,10 @@ static void e1000e_dump(struct e1000_adapter *adapter)
        buffer_info = &tx_ring->buffer_info[tx_ring->next_to_clean];
        printk(KERN_INFO " %5d %5X %5X %016llX %04X %3X %016llX\n",
                0, tx_ring->next_to_use, tx_ring->next_to_clean,
-               (u64)buffer_info->dma,
+               (unsigned long long)buffer_info->dma,
                buffer_info->length,
                buffer_info->next_to_watch,
-               (u64)buffer_info->time_stamp);
+               (unsigned long long)buffer_info->time_stamp);
 
        /* Print TX Rings */
        if (!netif_msg_tx_done(adapter))
@@ -279,9 +279,11 @@ static void e1000e_dump(struct e1000_adapter *adapter)
                        "%04X  %3X %016llX %p",
                       (!(le64_to_cpu(u0->b) & (1<<29)) ? 'l' :
                        ((le64_to_cpu(u0->b) & (1<<20)) ? 'd' : 'c')), i,
-                      le64_to_cpu(u0->a), le64_to_cpu(u0->b),
-                      (u64)buffer_info->dma, buffer_info->length,
-                      buffer_info->next_to_watch, (u64)buffer_info->time_stamp,
+                      (unsigned long long)le64_to_cpu(u0->a),
+                      (unsigned long long)le64_to_cpu(u0->b),
+                      (unsigned long long)buffer_info->dma,
+                      buffer_info->length, buffer_info->next_to_watch,
+                      (unsigned long long)buffer_info->time_stamp,
                       buffer_info->skb);
                if (i == tx_ring->next_to_use && i == tx_ring->next_to_clean)
                        printk(KERN_CONT " NTC/U\n");
@@ -356,19 +358,19 @@ rx_ring_summary:
                                printk(KERN_INFO "RWB[0x%03X]     %016llX "
                                        "%016llX %016llX %016llX "
                                        "---------------- %p", i,
-                                       le64_to_cpu(u1->a),
-                                       le64_to_cpu(u1->b),
-                                       le64_to_cpu(u1->c),
-                                       le64_to_cpu(u1->d),
+                                       (unsigned long long)le64_to_cpu(u1->a),
+                                       (unsigned long long)le64_to_cpu(u1->b),
+                                       (unsigned long long)le64_to_cpu(u1->c),
+                                       (unsigned long long)le64_to_cpu(u1->d),
                                        buffer_info->skb);
                        } else {
                                printk(KERN_INFO "R  [0x%03X]     %016llX "
                                        "%016llX %016llX %016llX %016llX %p", i,
-                                       le64_to_cpu(u1->a),
-                                       le64_to_cpu(u1->b),
-                                       le64_to_cpu(u1->c),
-                                       le64_to_cpu(u1->d),
-                                       (u64)buffer_info->dma,
+                                       (unsigned long long)le64_to_cpu(u1->a),
+                                       (unsigned long long)le64_to_cpu(u1->b),
+                                       (unsigned long long)le64_to_cpu(u1->c),
+                                       (unsigned long long)le64_to_cpu(u1->d),
+                                       (unsigned long long)buffer_info->dma,
                                        buffer_info->skb);
 
                                if (netif_msg_pktdata(adapter))
@@ -405,9 +407,11 @@ rx_ring_summary:
                        buffer_info = &rx_ring->buffer_info[i];
                        u0 = (struct my_u0 *)rx_desc;
                        printk(KERN_INFO "Rl[0x%03X]    %016llX %016llX "
-                               "%016llX %p",
-                               i, le64_to_cpu(u0->a), le64_to_cpu(u0->b),
-                               (u64)buffer_info->dma, buffer_info->skb);
+                               "%016llX %p", i,
+                               (unsigned long long)le64_to_cpu(u0->a),
+                               (unsigned long long)le64_to_cpu(u0->b),
+                               (unsigned long long)buffer_info->dma,
+                               buffer_info->skb);
                        if (i == rx_ring->next_to_use)
                                printk(KERN_CONT " NTU\n");
                        else if (i == rx_ring->next_to_clean)
@@ -1781,25 +1785,25 @@ void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter)
 void e1000e_set_interrupt_capability(struct e1000_adapter *adapter)
 {
        int err;
-       int numvecs, i;
-
+       int i;
 
        switch (adapter->int_mode) {
        case E1000E_INT_MODE_MSIX:
                if (adapter->flags & FLAG_HAS_MSIX) {
-                       numvecs = 3; /* RxQ0, TxQ0 and other */
-                       adapter->msix_entries = kcalloc(numvecs,
+                       adapter->num_vectors = 3; /* RxQ0, TxQ0 and other */
+                       adapter->msix_entries = kcalloc(adapter->num_vectors,
                                                      sizeof(struct msix_entry),
                                                      GFP_KERNEL);
                        if (adapter->msix_entries) {
-                               for (i = 0; i < numvecs; i++)
+                               for (i = 0; i < adapter->num_vectors; i++)
                                        adapter->msix_entries[i].entry = i;
 
                                err = pci_enable_msix(adapter->pdev,
                                                      adapter->msix_entries,
-                                                     numvecs);
-                               if (err == 0)
+                                                     adapter->num_vectors);
+                               if (err == 0) {
                                        return;
+                               }
                        }
                        /* MSI-X failed, so fall through and try MSI */
                        e_err("Failed to initialize MSI-X interrupts.  "
@@ -1821,6 +1825,9 @@ void e1000e_set_interrupt_capability(struct e1000_adapter *adapter)
                /* Don't do anything; this is the system default */
                break;
        }
+
+       /* store the number of vectors being used */
+       adapter->num_vectors = 1;
 }
 
 /**
@@ -1942,7 +1949,14 @@ static void e1000_irq_disable(struct e1000_adapter *adapter)
        if (adapter->msix_entries)
                ew32(EIAC_82574, 0);
        e1e_flush();
-       synchronize_irq(adapter->pdev->irq);
+
+       if (adapter->msix_entries) {
+               int i;
+               for (i = 0; i < adapter->num_vectors; i++)
+                       synchronize_irq(adapter->msix_entries[i].vector);
+       } else {
+               synchronize_irq(adapter->pdev->irq);
+       }
 }
 
 /**
@@ -2914,10 +2928,10 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
                         * dropped transactions.
                         */
                        pm_qos_update_request(
-                               adapter->netdev->pm_qos_req, 55);
+                               &adapter->netdev->pm_qos_req, 55);
                } else {
                        pm_qos_update_request(
-                               adapter->netdev->pm_qos_req,
+                               &adapter->netdev->pm_qos_req,
                                PM_QOS_DEFAULT_VALUE);
                }
        }
@@ -3214,12 +3228,6 @@ int e1000e_up(struct e1000_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
 
-       /* DMA latency requirement to workaround early-receive/jumbo issue */
-       if (adapter->flags & FLAG_HAS_ERT)
-               adapter->netdev->pm_qos_req =
-                       pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY,
-                                      PM_QOS_DEFAULT_VALUE);
-
        /* hardware has been reset, we need to reload some things */
        e1000_configure(adapter);
 
@@ -3283,12 +3291,6 @@ void e1000e_down(struct e1000_adapter *adapter)
        e1000_clean_tx_ring(adapter);
        e1000_clean_rx_ring(adapter);
 
-       if (adapter->flags & FLAG_HAS_ERT) {
-               pm_qos_remove_request(
-                             adapter->netdev->pm_qos_req);
-               adapter->netdev->pm_qos_req = NULL;
-       }
-
        /*
         * TODO: for power management, we could drop the link and
         * pci_disable_device here.
@@ -3439,13 +3441,18 @@ static int e1000_test_msi(struct e1000_adapter *adapter)
 
        /* disable SERR in case the MSI write causes a master abort */
        pci_read_config_word(adapter->pdev, PCI_COMMAND, &pci_cmd);
-       pci_write_config_word(adapter->pdev, PCI_COMMAND,
-                             pci_cmd & ~PCI_COMMAND_SERR);
+       if (pci_cmd & PCI_COMMAND_SERR)
+               pci_write_config_word(adapter->pdev, PCI_COMMAND,
+                                     pci_cmd & ~PCI_COMMAND_SERR);
 
        err = e1000_test_msi_interrupt(adapter);
 
-       /* restore previous setting of command word */
-       pci_write_config_word(adapter->pdev, PCI_COMMAND, pci_cmd);
+       /* re-enable SERR */
+       if (pci_cmd & PCI_COMMAND_SERR) {
+               pci_read_config_word(adapter->pdev, PCI_COMMAND, &pci_cmd);
+               pci_cmd |= PCI_COMMAND_SERR;
+               pci_write_config_word(adapter->pdev, PCI_COMMAND, pci_cmd);
+       }
 
        /* success ! */
        if (!err)
@@ -3518,6 +3525,12 @@ static int e1000_open(struct net_device *netdev)
             E1000_MNG_DHCP_COOKIE_STATUS_VLAN))
                e1000_update_mng_vlan(adapter);
 
+       /* DMA latency requirement to workaround early-receive/jumbo issue */
+       if (adapter->flags & FLAG_HAS_ERT)
+               pm_qos_add_request(&adapter->netdev->pm_qos_req,
+                                  PM_QOS_CPU_DMA_LATENCY,
+                                  PM_QOS_DEFAULT_VALUE);
+
        /*
         * before we allocate an interrupt, we must be ready to handle it.
         * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
@@ -3622,6 +3635,9 @@ static int e1000_close(struct net_device *netdev)
        if (adapter->flags & FLAG_HAS_AMT)
                e1000_release_hw_control(adapter);
 
+       if (adapter->flags & FLAG_HAS_ERT)
+               pm_qos_remove_request(&adapter->netdev->pm_qos_req);
+
        pm_runtime_put_sync(&pdev->dev);
 
        return 0;
@@ -5641,8 +5657,6 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
        if (err)
                goto err_sw_init;
 
-       err = -EIO;
-
        memcpy(&hw->mac.ops, ei->mac_ops, sizeof(hw->mac.ops));
        memcpy(&hw->nvm.ops, ei->nvm_ops, sizeof(hw->nvm.ops));
        memcpy(&hw->phy.ops, ei->phy_ops, sizeof(hw->phy.ops));
@@ -5811,11 +5825,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
 
        e1000_print_device_info(adapter);
 
-       if (pci_dev_run_wake(pdev)) {
-               pm_runtime_set_active(&pdev->dev);
-               pm_runtime_enable(&pdev->dev);
-       }
-       pm_schedule_suspend(&pdev->dev, MSEC_PER_SEC);
+       if (pci_dev_run_wake(pdev))
+               pm_runtime_put_noidle(&pdev->dev);
 
        return 0;
 
@@ -5861,8 +5872,6 @@ static void __devexit e1000_remove(struct pci_dev *pdev)
        struct e1000_adapter *adapter = netdev_priv(netdev);
        bool down = test_bit(__E1000_DOWN, &adapter->state);
 
-       pm_runtime_get_sync(&pdev->dev);
-
        /*
         * flush_scheduled work may reschedule our watchdog task, so
         * explicitly disable watchdog tasks from being rescheduled
@@ -5887,11 +5896,8 @@ static void __devexit e1000_remove(struct pci_dev *pdev)
                clear_bit(__E1000_DOWN, &adapter->state);
        unregister_netdev(netdev);
 
-       if (pci_dev_run_wake(pdev)) {
-               pm_runtime_disable(&pdev->dev);
-               pm_runtime_set_suspended(&pdev->dev);
-       }
-       pm_runtime_put_noidle(&pdev->dev);
+       if (pci_dev_run_wake(pdev))
+               pm_runtime_get_noresume(&pdev->dev);
 
        /*
         * Release control of h/w to f/w.  If f/w is AMT enabled, this