diff options
author | Matthew Vick <matthew.vick@intel.com> | 2012-07-11 20:02:42 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2012-07-14 05:58:34 -0400 |
commit | 22a4cca2f4c2d60c703cdc42158c907570f508e6 (patch) | |
tree | 62977b37e1e8f9077089a2a3d1337f7085e3f92b /drivers/net | |
parent | 18115f82bc93094a3554f3013cc314ee366a6e7a (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>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/e1000.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/ethtool.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 32 |
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 6e6fffb34581..cd153326c3cf 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); | |||
514 | extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter); | 514 | extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter); |
515 | extern void e1000e_get_hw_control(struct e1000_adapter *adapter); | 515 | extern void e1000e_get_hw_control(struct e1000_adapter *adapter); |
516 | extern void e1000e_release_hw_control(struct e1000_adapter *adapter); | 516 | extern void e1000e_release_hw_control(struct e1000_adapter *adapter); |
517 | extern void e1000e_write_itr(struct e1000_adapter *adapter, u32 itr); | ||
517 | 518 | ||
518 | extern unsigned int copybreak; | 519 | extern unsigned int copybreak; |
519 | 520 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c index 905e2147d918..105d554ea9db 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 ca477e87eb87..95b245310f17 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 | **/ | ||
2485 | void 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 */ |