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>
This commit is contained in:
parent
18115f82bc
commit
22a4cca2f4
3 changed files with 31 additions and 7 deletions
|
@ -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,
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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 @@ set_itr_now:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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)
|
||||||
/* 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)
|
||||||
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 @@ link_up:
|
||||||
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 */
|
||||||
|
|
Loading…
Add table
Reference in a new issue