Commit 77a22941 authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller

igb: resolve panic on shutdown when SR-IOV is enabled

The setup_rctl call was making a call into the ring structure after it had
been freed.  This was causing a panic on shutdown.  This call wasn't
necessary since it is possible to get the needed index from
adapter->vfs_allocated_count.
Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a860820d
...@@ -2006,7 +2006,7 @@ static void igb_setup_rctl(struct igb_adapter *adapter) ...@@ -2006,7 +2006,7 @@ static void igb_setup_rctl(struct igb_adapter *adapter)
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 rctl; u32 rctl;
u32 srrctl = 0; u32 srrctl = 0;
int i, j; int i;
rctl = rd32(E1000_RCTL); rctl = rd32(E1000_RCTL);
...@@ -2071,8 +2071,6 @@ static void igb_setup_rctl(struct igb_adapter *adapter) ...@@ -2071,8 +2071,6 @@ static void igb_setup_rctl(struct igb_adapter *adapter)
if (adapter->vfs_allocated_count) { if (adapter->vfs_allocated_count) {
u32 vmolr; u32 vmolr;
j = adapter->rx_ring[0].reg_idx;
/* set all queue drop enable bits */ /* set all queue drop enable bits */
wr32(E1000_QDE, ALL_QUEUES); wr32(E1000_QDE, ALL_QUEUES);
srrctl |= E1000_SRRCTL_DROP_EN; srrctl |= E1000_SRRCTL_DROP_EN;
...@@ -2080,16 +2078,16 @@ static void igb_setup_rctl(struct igb_adapter *adapter) ...@@ -2080,16 +2078,16 @@ static void igb_setup_rctl(struct igb_adapter *adapter)
/* disable queue 0 to prevent tail write w/o re-config */ /* disable queue 0 to prevent tail write w/o re-config */
wr32(E1000_RXDCTL(0), 0); wr32(E1000_RXDCTL(0), 0);
vmolr = rd32(E1000_VMOLR(j)); vmolr = rd32(E1000_VMOLR(adapter->vfs_allocated_count));
if (rctl & E1000_RCTL_LPE) if (rctl & E1000_RCTL_LPE)
vmolr |= E1000_VMOLR_LPE; vmolr |= E1000_VMOLR_LPE;
if (adapter->num_rx_queues > 0) if (adapter->num_rx_queues > 1)
vmolr |= E1000_VMOLR_RSSE; vmolr |= E1000_VMOLR_RSSE;
wr32(E1000_VMOLR(j), vmolr); wr32(E1000_VMOLR(adapter->vfs_allocated_count), vmolr);
} }
for (i = 0; i < adapter->num_rx_queues; i++) { for (i = 0; i < adapter->num_rx_queues; i++) {
j = adapter->rx_ring[i].reg_idx; int j = adapter->rx_ring[i].reg_idx;
wr32(E1000_SRRCTL(j), srrctl); wr32(E1000_SRRCTL(j), srrctl);
} }
......
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