Skip to content

Commit

Permalink
igb: delay VF reset notification until after interrupts are enabed
Browse files Browse the repository at this point in the history
This update delays the VF reset notification until after interrupts are
enabled.  Otherwise there is a chance of having the VF try to reset itself too
soon and being ignored by the PF as a result.

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>
  • Loading branch information
Alexander Duyck authored and David S. Miller committed Oct 28, 2009
1 parent 06cf266 commit d496030
Showing 1 changed file with 23 additions and 10 deletions.
33 changes: 23 additions & 10 deletions drivers/net/igb/igb_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1165,6 +1165,13 @@ int igb_up(struct igb_adapter *adapter)
rd32(E1000_ICR);
igb_irq_enable(adapter);

/* notify VFs that reset has been completed */
if (adapter->vfs_allocated_count) {
u32 reg_data = rd32(E1000_CTRL_EXT);
reg_data |= E1000_CTRL_EXT_PFRSTD;
wr32(E1000_CTRL_EXT, reg_data);
}

netif_tx_start_all_queues(adapter->netdev);

/* Fire a link change interrupt to start the watchdog. */
Expand Down Expand Up @@ -1948,6 +1955,13 @@ static int igb_open(struct net_device *netdev)

igb_irq_enable(adapter);

/* notify VFs that reset has been completed */
if (adapter->vfs_allocated_count) {
u32 reg_data = rd32(E1000_CTRL_EXT);
reg_data |= E1000_CTRL_EXT_PFRSTD;
wr32(E1000_CTRL_EXT, reg_data);
}

netif_tx_start_all_queues(netdev);

/* Fire a link status change interrupt to start the watchdog. */
Expand Down Expand Up @@ -5785,19 +5799,18 @@ static int igb_set_vf_mac(struct igb_adapter *adapter,
static void igb_vmm_control(struct igb_adapter *adapter)
{
struct e1000_hw *hw = &adapter->hw;
u32 reg_data;

if (!adapter->vfs_allocated_count)
/* replication is not supported for 82575 */
if (hw->mac.type == e1000_82575)
return;

/* VF's need PF reset indication before they
* can send/receive mail */
reg_data = rd32(E1000_CTRL_EXT);
reg_data |= E1000_CTRL_EXT_PFRSTD;
wr32(E1000_CTRL_EXT, reg_data);

igb_vmdq_set_loopback_pf(hw, true);
igb_vmdq_set_replication_pf(hw, true);
if (adapter->vfs_allocated_count) {
igb_vmdq_set_loopback_pf(hw, true);
igb_vmdq_set_replication_pf(hw, true);
} else {
igb_vmdq_set_loopback_pf(hw, false);
igb_vmdq_set_replication_pf(hw, false);
}
}

/* igb_main.c */

0 comments on commit d496030

Please sign in to comment.