e1000e: 82579 performance improvements
authorBruce Allan <bruce.w.allan@intel.com>
Wed, 29 Sep 2010 21:39:37 +0000 (21:39 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 1 Oct 2010 01:00:17 +0000 (18:00 -0700)
The initial support for 82579 was tuned poorly for performance.  Adjust the
packet buffer allocation appropriately for both standard and jumbo frames;
and for jumbo frames increase the receive descriptor pre-fetch, disable
adaptive interrupt moderation and set the DMA latency tolerance.

Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/e1000e/e1000.h
drivers/net/e1000e/ich8lan.c
drivers/net/e1000e/netdev.c

index 5ec0af59eeabc35a8c8fb8c8c5f2321074974cac..cee882dd67bf74c3601259e1fc6a3e87d605d6ee 100644 (file)
@@ -453,6 +453,7 @@ struct e1000_info {
 #define FLAG2_HAS_PHY_STATS               (1 << 4)
 #define FLAG2_HAS_EEE                     (1 << 5)
 #define FLAG2_DMA_BURST                   (1 << 6)
+#define FLAG2_DISABLE_AIM                 (1 << 8)
 
 #define E1000_RX_DESC_PS(R, i)     \
        (&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
index 57b5435599ab1d61c58e393d04e0a2f3912d66fc..e3374d9a2472a2af316ca137305a53162f62e882 100644 (file)
@@ -3986,7 +3986,7 @@ struct e1000_info e1000_pch2_info = {
                                  | FLAG_APME_IN_WUC,
        .flags2                 = FLAG2_HAS_PHY_STATS
                                  | FLAG2_HAS_EEE,
-       .pba                    = 18,
+       .pba                    = 26,
        .max_hw_frame_size      = DEFAULT_JUMBO,
        .get_variants           = e1000_get_variants_ich8lan,
        .mac_ops                = &ich8_mac_ops,
index 1aa4228e860a3ebc0d1e44990be7c475e7fe04e6..992b622fe205df7bba6c89010cfa86cd7437702b 100644 (file)
@@ -2290,6 +2290,11 @@ static void e1000_set_itr(struct e1000_adapter *adapter)
                goto set_itr_now;
        }
 
+       if (adapter->flags2 & FLAG2_DISABLE_AIM) {
+               new_itr = 0;
+               goto set_itr_now;
+       }
+
        adapter->tx_itr = e1000_update_itr(adapter,
                                    adapter->tx_itr,
                                    adapter->total_tx_packets,
@@ -2338,7 +2343,10 @@ set_itr_now:
                if (adapter->msix_entries)
                        adapter->rx_ring->set_itr = 1;
                else
-                       ew32(ITR, 1000000000 / (new_itr * 256));
+                       if (new_itr)
+                               ew32(ITR, 1000000000 / (new_itr * 256));
+                       else
+                               ew32(ITR, 0);
        }
 }
 
@@ -2920,7 +2928,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
 
        /* irq moderation */
        ew32(RADV, adapter->rx_abs_int_delay);
-       if (adapter->itr_setting != 0)
+       if ((adapter->itr_setting != 0) && (adapter->itr != 0))
                ew32(ITR, 1000000000 / (adapter->itr * 256));
 
        ctrl_ext = er32(CTRL_EXT);
@@ -2965,11 +2973,13 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
         * packet size is equal or larger than the specified value (in 8 byte
         * units), e.g. using jumbo frames when setting to E1000_ERT_2048
         */
-       if (adapter->flags & FLAG_HAS_ERT) {
+       if ((adapter->flags & FLAG_HAS_ERT) ||
+           (adapter->hw.mac.type == e1000_pch2lan)) {
                if (adapter->netdev->mtu > ETH_DATA_LEN) {
                        u32 rxdctl = er32(RXDCTL(0));
                        ew32(RXDCTL(0), rxdctl | 0x3);
-                       ew32(ERT, E1000_ERT_2048 | (1 << 13));
+                       if (adapter->flags & FLAG_HAS_ERT)
+                               ew32(ERT, E1000_ERT_2048 | (1 << 13));
                        /*
                         * With jumbo frames and early-receive enabled,
                         * excessive C-state transition latencies result in
@@ -3232,9 +3242,35 @@ void e1000e_reset(struct e1000_adapter *adapter)
                fc->low_water = 0x05048;
                fc->pause_time = 0x0650;
                fc->refresh_time = 0x0400;
+               if (adapter->netdev->mtu > ETH_DATA_LEN) {
+                       pba = 14;
+                       ew32(PBA, pba);
+               }
                break;
        }
 
+       /*
+        * Disable Adaptive Interrupt Moderation if 2 full packets cannot
+        * fit in receive buffer and early-receive not supported.
+        */
+       if (adapter->itr_setting & 0x3) {
+               if (((adapter->max_frame_size * 2) > (pba << 10)) &&
+                   !(adapter->flags & FLAG_HAS_ERT)) {
+                       if (!(adapter->flags2 & FLAG2_DISABLE_AIM)) {
+                               dev_info(&adapter->pdev->dev,
+                                       "Interrupt Throttle Rate turned off\n");
+                               adapter->flags2 |= FLAG2_DISABLE_AIM;
+                               ew32(ITR, 0);
+                       }
+               } else if (adapter->flags2 & FLAG2_DISABLE_AIM) {
+                       dev_info(&adapter->pdev->dev,
+                                "Interrupt Throttle Rate turned on\n");
+                       adapter->flags2 &= ~FLAG2_DISABLE_AIM;
+                       adapter->itr = 20000;
+                       ew32(ITR, 1000000000 / (adapter->itr * 256));
+               }
+       }
+
        /* Allow time for pending master requests to run */
        mac->ops.reset_hw(hw);
 
@@ -3553,7 +3589,8 @@ static int e1000_open(struct net_device *netdev)
                e1000_update_mng_vlan(adapter);
 
        /* DMA latency requirement to workaround early-receive/jumbo issue */
-       if (adapter->flags & FLAG_HAS_ERT)
+       if ((adapter->flags & FLAG_HAS_ERT) ||
+           (adapter->hw.mac.type == e1000_pch2lan))
                pm_qos_add_request(&adapter->netdev->pm_qos_req,
                                   PM_QOS_CPU_DMA_LATENCY,
                                   PM_QOS_DEFAULT_VALUE);
@@ -3662,7 +3699,8 @@ 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)
+       if ((adapter->flags & FLAG_HAS_ERT) ||
+           (adapter->hw.mac.type == e1000_pch2lan))
                pm_qos_remove_request(&adapter->netdev->pm_qos_req);
 
        pm_runtime_put_sync(&pdev->dev);