Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[cascardo/linux.git] / drivers / net / ethernet / intel / e1000e / netdev.c
index 7152eb1..851f793 100644 (file)
 
 #define DRV_EXTRAVERSION "-k"
 
-#define DRV_VERSION "1.9.5" DRV_EXTRAVERSION
+#define DRV_VERSION "1.10.6" DRV_EXTRAVERSION
 char e1000e_driver_name[] = "e1000e";
 const char e1000e_driver_version[] = DRV_VERSION;
 
+#define DEFAULT_MSG_ENABLE (NETIF_MSG_DRV|NETIF_MSG_PROBE|NETIF_MSG_LINK)
+static int debug = -1;
+module_param(debug, int, 0);
+MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
+
 static void e1000e_disable_aspm(struct pci_dev *pdev, u16 state);
 
 static const struct e1000_info *e1000_info_tbl[] = {
@@ -105,14 +110,14 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = {
 
        /* Rx Registers */
        {E1000_RCTL, "RCTL"},
-       {E1000_RDLEN, "RDLEN"},
-       {E1000_RDH, "RDH"},
-       {E1000_RDT, "RDT"},
+       {E1000_RDLEN(0), "RDLEN"},
+       {E1000_RDH(0), "RDH"},
+       {E1000_RDT(0), "RDT"},
        {E1000_RDTR, "RDTR"},
        {E1000_RXDCTL(0), "RXDCTL"},
        {E1000_ERT, "ERT"},
-       {E1000_RDBAL, "RDBAL"},
-       {E1000_RDBAH, "RDBAH"},
+       {E1000_RDBAL(0), "RDBAL"},
+       {E1000_RDBAH(0), "RDBAH"},
        {E1000_RDFH, "RDFH"},
        {E1000_RDFT, "RDFT"},
        {E1000_RDFHS, "RDFHS"},
@@ -121,11 +126,11 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = {
 
        /* Tx Registers */
        {E1000_TCTL, "TCTL"},
-       {E1000_TDBAL, "TDBAL"},
-       {E1000_TDBAH, "TDBAH"},
-       {E1000_TDLEN, "TDLEN"},
-       {E1000_TDH, "TDH"},
-       {E1000_TDT, "TDT"},
+       {E1000_TDBAL(0), "TDBAL"},
+       {E1000_TDBAH(0), "TDBAH"},
+       {E1000_TDLEN(0), "TDLEN"},
+       {E1000_TDH(0), "TDH"},
+       {E1000_TDT(0), "TDT"},
        {E1000_TIDV, "TIDV"},
        {E1000_TXDCTL(0), "TXDCTL"},
        {E1000_TADV, "TADV"},
@@ -1048,12 +1053,20 @@ static void e1000_print_hw_hang(struct work_struct *work)
 
        if (!adapter->tx_hang_recheck &&
            (adapter->flags2 & FLAG2_DMA_BURST)) {
-               /* May be block on write-back, flush and detect again
+               /*
+                * May be block on write-back, flush and detect again
                 * flush pending descriptor writebacks to memory
                 */
                ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
                /* execute the writes immediately */
                e1e_flush();
+               /*
+                * Due to rare timing issues, write to TIDV again to ensure
+                * the write is successful
+                */
+               ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
+               /* execute the writes immediately */
+               e1e_flush();
                adapter->tx_hang_recheck = true;
                return;
        }
@@ -2518,33 +2531,31 @@ err:
 }
 
 /**
- * e1000_clean - NAPI Rx polling callback
+ * e1000e_poll - NAPI Rx polling callback
  * @napi: struct associated with this polling callback
- * @budget: amount of packets driver is allowed to process this poll
+ * @weight: number of packets driver is allowed to process this poll
  **/
-static int e1000_clean(struct napi_struct *napi, int budget)
+static int e1000e_poll(struct napi_struct *napi, int weight)
 {
-       struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
+       struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter,
+                                                    napi);
        struct e1000_hw *hw = &adapter->hw;
        struct net_device *poll_dev = adapter->netdev;
        int tx_cleaned = 1, work_done = 0;
 
        adapter = netdev_priv(poll_dev);
 
-       if (adapter->msix_entries &&
-           !(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val))
-               goto clean_rx;
-
-       tx_cleaned = e1000_clean_tx_irq(adapter->tx_ring);
+       if (!adapter->msix_entries ||
+           (adapter->rx_ring->ims_val & adapter->tx_ring->ims_val))
+               tx_cleaned = e1000_clean_tx_irq(adapter->tx_ring);
 
-clean_rx:
-       adapter->clean_rx(adapter->rx_ring, &work_done, budget);
+       adapter->clean_rx(adapter->rx_ring, &work_done, weight);
 
        if (!tx_cleaned)
-               work_done = budget;
+               work_done = weight;
 
-       /* If budget not fully consumed, exit the polling mode */
-       if (work_done < budget) {
+       /* If weight not fully consumed, exit the polling mode */
+       if (work_done < weight) {
                if (adapter->itr_setting & 3)
                        e1000_set_itr(adapter);
                napi_complete(napi);
@@ -2788,13 +2799,13 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)
        /* Setup the HW Tx Head and Tail descriptor pointers */
        tdba = tx_ring->dma;
        tdlen = tx_ring->count * sizeof(struct e1000_tx_desc);
-       ew32(TDBAL, (tdba & DMA_BIT_MASK(32)));
-       ew32(TDBAH, (tdba >> 32));
-       ew32(TDLEN, tdlen);
-       ew32(TDH, 0);
-       ew32(TDT, 0);
-       tx_ring->head = adapter->hw.hw_addr + E1000_TDH;
-       tx_ring->tail = adapter->hw.hw_addr + E1000_TDT;
+       ew32(TDBAL(0), (tdba & DMA_BIT_MASK(32)));
+       ew32(TDBAH(0), (tdba >> 32));
+       ew32(TDLEN(0), tdlen);
+       ew32(TDH(0), 0);
+       ew32(TDT(0), 0);
+       tx_ring->head = adapter->hw.hw_addr + E1000_TDH(0);
+       tx_ring->tail = adapter->hw.hw_addr + E1000_TDT(0);
 
        /* Set the Tx Interrupt Delay register */
        ew32(TIDV, adapter->tx_int_delay);
@@ -3098,13 +3109,13 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
         * the Base and Length of the Rx Descriptor Ring
         */
        rdba = rx_ring->dma;
-       ew32(RDBAL, (rdba & DMA_BIT_MASK(32)));
-       ew32(RDBAH, (rdba >> 32));
-       ew32(RDLEN, rdlen);
-       ew32(RDH, 0);
-       ew32(RDT, 0);
-       rx_ring->head = adapter->hw.hw_addr + E1000_RDH;
-       rx_ring->tail = adapter->hw.hw_addr + E1000_RDT;
+       ew32(RDBAL(0), (rdba & DMA_BIT_MASK(32)));
+       ew32(RDBAH(0), (rdba >> 32));
+       ew32(RDLEN(0), rdlen);
+       ew32(RDH(0), 0);
+       ew32(RDT(0), 0);
+       rx_ring->head = adapter->hw.hw_addr + E1000_RDH(0);
+       rx_ring->tail = adapter->hw.hw_addr + E1000_RDT(0);
 
        /* Enable Receive Checksum Offload for TCP and UDP */
        rxcsum = er32(RXCSUM);
@@ -3611,6 +3622,16 @@ static void e1000e_flush_descriptors(struct e1000_adapter *adapter)
 
        /* execute the writes immediately */
        e1e_flush();
+
+       /*
+        * due to rare timing issues, write to TIDV/RDTR again to ensure the
+        * write is successful
+        */
+       ew32(TIDV, adapter->tx_int_delay | E1000_TIDV_FPD);
+       ew32(RDTR, adapter->rx_int_delay | E1000_RDTR_FPD);
+
+       /* execute the writes immediately */
+       e1e_flush();
 }
 
 static void e1000e_update_stats(struct e1000_adapter *adapter);
@@ -3963,6 +3984,10 @@ static int e1000_close(struct net_device *netdev)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
        struct pci_dev *pdev = adapter->pdev;
+       int count = E1000_CHECK_RESET_COUNT;
+
+       while (test_bit(__E1000_RESETTING, &adapter->state) && count--)
+               usleep_range(10000, 20000);
 
        WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
 
@@ -5467,6 +5492,11 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake,
        netif_device_detach(netdev);
 
        if (netif_running(netdev)) {
+               int count = E1000_CHECK_RESET_COUNT;
+
+               while (test_bit(__E1000_RESETTING, &adapter->state) && count--)
+                       usleep_range(10000, 20000);
+
                WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
                e1000e_down(adapter);
                e1000_free_irq(adapter);
@@ -6172,7 +6202,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
        adapter->hw.adapter = adapter;
        adapter->hw.mac.type = ei->mac;
        adapter->max_hw_frame_size = ei->max_hw_frame_size;
-       adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;
+       adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
 
        mmio_start = pci_resource_start(pdev, 0);
        mmio_len = pci_resource_len(pdev, 0);
@@ -6195,7 +6225,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
        netdev->netdev_ops              = &e1000e_netdev_ops;
        e1000e_set_ethtool_ops(netdev);
        netdev->watchdog_timeo          = 5 * HZ;
-       netif_napi_add(netdev, &adapter->napi, e1000_clean, 64);
+       netif_napi_add(netdev, &adapter->napi, e1000e_poll, 64);
        strlcpy(netdev->name, pci_name(pdev), sizeof(netdev->name));
 
        netdev->mem_start = mmio_start;