Commit feeb2721a7a0bd0cfa5b8847f80aec93aa2cc00d

Authored by Alexander Duyck
Committed by David S. Miller
1 parent 3fdde0a160

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>

Showing 1 changed file with 5 additions and 15 deletions Side-by-side Diff

drivers/net/igb/igb_main.c
... ... @@ -421,6 +421,8 @@
421 421 msixbm = E1000_EICR_RX_QUEUE0 << rx_queue;
422 422 if (tx_queue > IGB_N0_QUEUE)
423 423 msixbm |= E1000_EICR_TX_QUEUE0 << tx_queue;
  424 + if (!adapter->msix_entries && msix_vector == 0)
  425 + msixbm |= E1000_EIMS_OTHER;
424 426 array_wr32(E1000_MSIXBM(0), msix_vector, msixbm);
425 427 q_vector->eims_value = msixbm;
426 428 break;
... ... @@ -877,7 +879,6 @@
877 879 {
878 880 struct net_device *netdev = adapter->netdev;
879 881 struct pci_dev *pdev = adapter->pdev;
880   - struct e1000_hw *hw = &adapter->hw;
881 882 int err = 0;
882 883  
883 884 if (adapter->msix_entries) {
... ... @@ -909,20 +910,7 @@
909 910 igb_setup_all_tx_resources(adapter);
910 911 igb_setup_all_rx_resources(adapter);
911 912 } else {
912   - switch (hw->mac.type) {
913   - case e1000_82575:
914   - wr32(E1000_MSIXBM(0),
915   - (E1000_EICR_RX_QUEUE0 |
916   - E1000_EICR_TX_QUEUE0 |
917   - E1000_EIMS_OTHER));
918   - break;
919   - case e1000_82580:
920   - case e1000_82576:
921   - wr32(E1000_IVAR0, E1000_IVAR_VALID);
922   - break;
923   - default:
924   - break;
925   - }
  913 + igb_assign_vector(adapter->q_vector[0], 0);
926 914 }
927 915  
928 916 if (adapter->flags & IGB_FLAG_HAS_MSI) {
... ... @@ -1140,6 +1128,8 @@
1140 1128 }
1141 1129 if (adapter->msix_entries)
1142 1130 igb_configure_msix(adapter);
  1131 + else
  1132 + igb_assign_vector(adapter->q_vector[0], 0);
1143 1133  
1144 1134 /* Clear any pending interrupts. */
1145 1135 rd32(E1000_ICR);