aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Vick <matthew.vick@intel.com>2012-07-11 20:02:42 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2012-07-14 05:58:34 -0400
commit22a4cca2f4c2d60c703cdc42158c907570f508e6 (patch)
tree62977b37e1e8f9077089a2a3d1337f7085e3f92b
parent18115f82bc93094a3554f3013cc314ee366a6e7a (diff)
e1000e: Program the correct register for ITR when using MSI-X.
When configuring interrupt throttling on 82574 in MSI-X mode, we need to be programming the EITR registers instead of the ITR register. -rc2: Renamed e1000_write_itr() to e1000e_write_itr(), fixed whitespace issues, and removed unnecessary !! operation. -rc3: Reduced the scope of the loop variable in e1000e_write_itr(). Signed-off-by: Matthew Vick <matthew.vick@intel.com> Acked-by: Bruce Allan <bruce.w.allan@intel.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/e1000e/e1000.h1
-rw-r--r--drivers/net/ethernet/intel/e1000e/ethtool.c5
-rw-r--r--drivers/net/ethernet/intel/e1000e/netdev.c32
3 files changed, 31 insertions, 7 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h
index 6e6fffb3458..cd153326c3c 100644
--- a/drivers/net/ethernet/intel/e1000e/e1000.h
+++ b/drivers/net/ethernet/intel/e1000e/e1000.h
@@ -514,6 +514,7 @@ extern void e1000e_set_interrupt_capability(struct e1000_adapter *adapter);
514extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter); 514extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter);
515extern void e1000e_get_hw_control(struct e1000_adapter *adapter); 515extern void e1000e_get_hw_control(struct e1000_adapter *adapter);
516extern void e1000e_release_hw_control(struct e1000_adapter *adapter); 516extern void e1000e_release_hw_control(struct e1000_adapter *adapter);
517extern void e1000e_write_itr(struct e1000_adapter *adapter, u32 itr);
517 518
518extern unsigned int copybreak; 519extern unsigned int copybreak;
519 520
diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c
index 905e2147d91..105d554ea9d 100644
--- a/drivers/net/ethernet/intel/e1000e/ethtool.c
+++ b/drivers/net/ethernet/intel/e1000e/ethtool.c
@@ -1897,7 +1897,6 @@ static int e1000_set_coalesce(struct net_device *netdev,
1897 struct ethtool_coalesce *ec) 1897 struct ethtool_coalesce *ec)
1898{ 1898{
1899 struct e1000_adapter *adapter = netdev_priv(netdev); 1899 struct e1000_adapter *adapter = netdev_priv(netdev);
1900 struct e1000_hw *hw = &adapter->hw;
1901 1900
1902 if ((ec->rx_coalesce_usecs > E1000_MAX_ITR_USECS) || 1901 if ((ec->rx_coalesce_usecs > E1000_MAX_ITR_USECS) ||
1903 ((ec->rx_coalesce_usecs > 4) && 1902 ((ec->rx_coalesce_usecs > 4) &&
@@ -1916,9 +1915,9 @@ static int e1000_set_coalesce(struct net_device *netdev,
1916 } 1915 }
1917 1916
1918 if (adapter->itr_setting != 0) 1917 if (adapter->itr_setting != 0)
1919 ew32(ITR, 1000000000 / (adapter->itr * 256)); 1918 e1000e_write_itr(adapter, adapter->itr);
1920 else 1919 else
1921 ew32(ITR, 0); 1920 e1000e_write_itr(adapter, 0);
1922 1921
1923 return 0; 1922 return 0;
1924} 1923}
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
index ca477e87eb8..95b245310f1 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -2474,6 +2474,30 @@ set_itr_now:
2474} 2474}
2475 2475
2476/** 2476/**
2477 * e1000e_write_itr - write the ITR value to the appropriate registers
2478 * @adapter: address of board private structure
2479 * @itr: new ITR value to program
2480 *
2481 * e1000e_write_itr determines if the adapter is in MSI-X mode
2482 * and, if so, writes the EITR registers with the ITR value.
2483 * Otherwise, it writes the ITR value into the ITR register.
2484 **/
2485void e1000e_write_itr(struct e1000_adapter *adapter, u32 itr)
2486{
2487 struct e1000_hw *hw = &adapter->hw;
2488 u32 new_itr = itr ? 1000000000 / (itr * 256) : 0;
2489
2490 if (adapter->msix_entries) {
2491 int vector;
2492
2493 for (vector = 0; vector < adapter->num_vectors; vector++)
2494 writel(new_itr, hw->hw_addr + E1000_EITR_82574(vector));
2495 } else {
2496 ew32(ITR, new_itr);
2497 }
2498}
2499
2500/**
2477 * e1000_alloc_queues - Allocate memory for all rings 2501 * e1000_alloc_queues - Allocate memory for all rings
2478 * @adapter: board private structure to initialize 2502 * @adapter: board private structure to initialize
2479 **/ 2503 **/
@@ -3059,7 +3083,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
3059 /* irq moderation */ 3083 /* irq moderation */
3060 ew32(RADV, adapter->rx_abs_int_delay); 3084 ew32(RADV, adapter->rx_abs_int_delay);
3061 if ((adapter->itr_setting != 0) && (adapter->itr != 0)) 3085 if ((adapter->itr_setting != 0) && (adapter->itr != 0))
3062 ew32(ITR, 1000000000 / (adapter->itr * 256)); 3086 e1000e_write_itr(adapter, adapter->itr);
3063 3087
3064 ctrl_ext = er32(CTRL_EXT); 3088 ctrl_ext = er32(CTRL_EXT);
3065 /* Auto-Mask interrupts upon ICR access */ 3089 /* Auto-Mask interrupts upon ICR access */
@@ -3486,14 +3510,14 @@ void e1000e_reset(struct e1000_adapter *adapter)
3486 dev_info(&adapter->pdev->dev, 3510 dev_info(&adapter->pdev->dev,
3487 "Interrupt Throttle Rate turned off\n"); 3511 "Interrupt Throttle Rate turned off\n");
3488 adapter->flags2 |= FLAG2_DISABLE_AIM; 3512 adapter->flags2 |= FLAG2_DISABLE_AIM;
3489 ew32(ITR, 0); 3513 e1000e_write_itr(adapter, 0);
3490 } 3514 }
3491 } else if (adapter->flags2 & FLAG2_DISABLE_AIM) { 3515 } else if (adapter->flags2 & FLAG2_DISABLE_AIM) {
3492 dev_info(&adapter->pdev->dev, 3516 dev_info(&adapter->pdev->dev,
3493 "Interrupt Throttle Rate turned on\n"); 3517 "Interrupt Throttle Rate turned on\n");
3494 adapter->flags2 &= ~FLAG2_DISABLE_AIM; 3518 adapter->flags2 &= ~FLAG2_DISABLE_AIM;
3495 adapter->itr = 20000; 3519 adapter->itr = 20000;
3496 ew32(ITR, 1000000000 / (adapter->itr * 256)); 3520 e1000e_write_itr(adapter, adapter->itr);
3497 } 3521 }
3498 } 3522 }
3499 3523
@@ -4576,7 +4600,7 @@ link_up:
4576 adapter->gorc - adapter->gotc) / 10000; 4600 adapter->gorc - adapter->gotc) / 10000;
4577 u32 itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000; 4601 u32 itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000;
4578 4602
4579 ew32(ITR, 1000000000 / (itr * 256)); 4603 e1000e_write_itr(adapter, itr);
4580 } 4604 }
4581 4605
4582 /* Cause software interrupt to ensure Rx ring is cleaned */ 4606 /* Cause software interrupt to ensure Rx ring is cleaned */