Commit 22a4cca2 authored by Matthew Vick's avatar Matthew Vick Committed by Jeff Kirsher

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: default avatarMatthew Vick <matthew.vick@intel.com>
Acked-by: default avatarBruce Allan <bruce.w.allan@intel.com>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 18115f82
...@@ -514,6 +514,7 @@ extern void e1000e_set_interrupt_capability(struct e1000_adapter *adapter); ...@@ -514,6 +514,7 @@ extern void e1000e_set_interrupt_capability(struct e1000_adapter *adapter);
extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter); extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter);
extern void e1000e_get_hw_control(struct e1000_adapter *adapter); extern void e1000e_get_hw_control(struct e1000_adapter *adapter);
extern void e1000e_release_hw_control(struct e1000_adapter *adapter); extern void e1000e_release_hw_control(struct e1000_adapter *adapter);
extern void e1000e_write_itr(struct e1000_adapter *adapter, u32 itr);
extern unsigned int copybreak; extern unsigned int copybreak;
......
...@@ -1897,7 +1897,6 @@ static int e1000_set_coalesce(struct net_device *netdev, ...@@ -1897,7 +1897,6 @@ static int e1000_set_coalesce(struct net_device *netdev,
struct ethtool_coalesce *ec) struct ethtool_coalesce *ec)
{ {
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw;
if ((ec->rx_coalesce_usecs > E1000_MAX_ITR_USECS) || if ((ec->rx_coalesce_usecs > E1000_MAX_ITR_USECS) ||
((ec->rx_coalesce_usecs > 4) && ((ec->rx_coalesce_usecs > 4) &&
...@@ -1916,9 +1915,9 @@ static int e1000_set_coalesce(struct net_device *netdev, ...@@ -1916,9 +1915,9 @@ static int e1000_set_coalesce(struct net_device *netdev,
} }
if (adapter->itr_setting != 0) if (adapter->itr_setting != 0)
ew32(ITR, 1000000000 / (adapter->itr * 256)); e1000e_write_itr(adapter, adapter->itr);
else else
ew32(ITR, 0); e1000e_write_itr(adapter, 0);
return 0; return 0;
} }
......
...@@ -2473,6 +2473,30 @@ static void e1000_set_itr(struct e1000_adapter *adapter) ...@@ -2473,6 +2473,30 @@ static void e1000_set_itr(struct e1000_adapter *adapter)
} }
} }
/**
* e1000e_write_itr - write the ITR value to the appropriate registers
* @adapter: address of board private structure
* @itr: new ITR value to program
*
* e1000e_write_itr determines if the adapter is in MSI-X mode
* and, if so, writes the EITR registers with the ITR value.
* Otherwise, it writes the ITR value into the ITR register.
**/
void e1000e_write_itr(struct e1000_adapter *adapter, u32 itr)
{
struct e1000_hw *hw = &adapter->hw;
u32 new_itr = itr ? 1000000000 / (itr * 256) : 0;
if (adapter->msix_entries) {
int vector;
for (vector = 0; vector < adapter->num_vectors; vector++)
writel(new_itr, hw->hw_addr + E1000_EITR_82574(vector));
} else {
ew32(ITR, new_itr);
}
}
/** /**
* e1000_alloc_queues - Allocate memory for all rings * e1000_alloc_queues - Allocate memory for all rings
* @adapter: board private structure to initialize * @adapter: board private structure to initialize
...@@ -3059,7 +3083,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) ...@@ -3059,7 +3083,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
/* irq moderation */ /* irq moderation */
ew32(RADV, adapter->rx_abs_int_delay); ew32(RADV, adapter->rx_abs_int_delay);
if ((adapter->itr_setting != 0) && (adapter->itr != 0)) if ((adapter->itr_setting != 0) && (adapter->itr != 0))
ew32(ITR, 1000000000 / (adapter->itr * 256)); e1000e_write_itr(adapter, adapter->itr);
ctrl_ext = er32(CTRL_EXT); ctrl_ext = er32(CTRL_EXT);
/* Auto-Mask interrupts upon ICR access */ /* Auto-Mask interrupts upon ICR access */
...@@ -3486,14 +3510,14 @@ void e1000e_reset(struct e1000_adapter *adapter) ...@@ -3486,14 +3510,14 @@ void e1000e_reset(struct e1000_adapter *adapter)
dev_info(&adapter->pdev->dev, dev_info(&adapter->pdev->dev,
"Interrupt Throttle Rate turned off\n"); "Interrupt Throttle Rate turned off\n");
adapter->flags2 |= FLAG2_DISABLE_AIM; adapter->flags2 |= FLAG2_DISABLE_AIM;
ew32(ITR, 0); e1000e_write_itr(adapter, 0);
} }
} else if (adapter->flags2 & FLAG2_DISABLE_AIM) { } else if (adapter->flags2 & FLAG2_DISABLE_AIM) {
dev_info(&adapter->pdev->dev, dev_info(&adapter->pdev->dev,
"Interrupt Throttle Rate turned on\n"); "Interrupt Throttle Rate turned on\n");
adapter->flags2 &= ~FLAG2_DISABLE_AIM; adapter->flags2 &= ~FLAG2_DISABLE_AIM;
adapter->itr = 20000; adapter->itr = 20000;
ew32(ITR, 1000000000 / (adapter->itr * 256)); e1000e_write_itr(adapter, adapter->itr);
} }
} }
...@@ -4576,7 +4600,7 @@ static void e1000_watchdog_task(struct work_struct *work) ...@@ -4576,7 +4600,7 @@ static void e1000_watchdog_task(struct work_struct *work)
adapter->gorc - adapter->gotc) / 10000; adapter->gorc - adapter->gotc) / 10000;
u32 itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000; u32 itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000;
ew32(ITR, 1000000000 / (itr * 256)); e1000e_write_itr(adapter, itr);
} }
/* Cause software interrupt to ensure Rx ring is cleaned */ /* Cause software interrupt to ensure Rx ring is cleaned */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment