igb: make certain to reassign legacy interrupt vectors after reset
This change corrects an issue that will cause false hangs when using either 82575 or 82580 in legacy interrupt mode. The issue is caused when there is a slow traffic flow and an "ethtool -r" is executed while using legacy or MSI interrupts. MSI-X is not affected by this issue due to the fact that we were already reconfiguring the vectors after reset. If possible it would be best to push this for net-2.6 since it is resolving a bug but if that is not possible then net-next-2.6 will be fine. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3fdde0a160
commit
feeb2721a7
@ -421,6 +421,8 @@ static void igb_assign_vector(struct igb_q_vector *q_vector, int msix_vector)
|
||||
msixbm = E1000_EICR_RX_QUEUE0 << rx_queue;
|
||||
if (tx_queue > IGB_N0_QUEUE)
|
||||
msixbm |= E1000_EICR_TX_QUEUE0 << tx_queue;
|
||||
if (!adapter->msix_entries && msix_vector == 0)
|
||||
msixbm |= E1000_EIMS_OTHER;
|
||||
array_wr32(E1000_MSIXBM(0), msix_vector, msixbm);
|
||||
q_vector->eims_value = msixbm;
|
||||
break;
|
||||
@ -877,7 +879,6 @@ static int igb_request_irq(struct igb_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
struct pci_dev *pdev = adapter->pdev;
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
int err = 0;
|
||||
|
||||
if (adapter->msix_entries) {
|
||||
@ -909,20 +910,7 @@ static int igb_request_irq(struct igb_adapter *adapter)
|
||||
igb_setup_all_tx_resources(adapter);
|
||||
igb_setup_all_rx_resources(adapter);
|
||||
} else {
|
||||
switch (hw->mac.type) {
|
||||
case e1000_82575:
|
||||
wr32(E1000_MSIXBM(0),
|
||||
(E1000_EICR_RX_QUEUE0 |
|
||||
E1000_EICR_TX_QUEUE0 |
|
||||
E1000_EIMS_OTHER));
|
||||
break;
|
||||
case e1000_82580:
|
||||
case e1000_82576:
|
||||
wr32(E1000_IVAR0, E1000_IVAR_VALID);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
igb_assign_vector(adapter->q_vector[0], 0);
|
||||
}
|
||||
|
||||
if (adapter->flags & IGB_FLAG_HAS_MSI) {
|
||||
@ -1140,6 +1128,8 @@ int igb_up(struct igb_adapter *adapter)
|
||||
}
|
||||
if (adapter->msix_entries)
|
||||
igb_configure_msix(adapter);
|
||||
else
|
||||
igb_assign_vector(adapter->q_vector[0], 0);
|
||||
|
||||
/* Clear any pending interrupts. */
|
||||
rd32(E1000_ICR);
|
||||
|
Loading…
Reference in New Issue
Block a user