Commit 9ce0e8d7 authored by Mitch Williams's avatar Mitch Williams Committed by Jeff Kirsher

igb/igbvf: don't give up

The driver shouldn't just give up if it fails to get the hardware
mailbox lock. This can happen in a situation where the PF-VF
communication channel is heavily loaded and causes complete
communications failure between the PF and VF drivers.

Add a counter and a delay. The driver will now retry ten times, waiting
one millisecond between retries.
Signed-off-by: default avatarMitch Williams <mitch.a.williams@intel.com>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 37a5d163
...@@ -322,14 +322,20 @@ static s32 igb_obtain_mbx_lock_pf(struct e1000_hw *hw, u16 vf_number) ...@@ -322,14 +322,20 @@ static s32 igb_obtain_mbx_lock_pf(struct e1000_hw *hw, u16 vf_number)
{ {
s32 ret_val = -E1000_ERR_MBX; s32 ret_val = -E1000_ERR_MBX;
u32 p2v_mailbox; u32 p2v_mailbox;
int count = 10;
/* Take ownership of the buffer */ do {
wr32(E1000_P2VMAILBOX(vf_number), E1000_P2VMAILBOX_PFU); /* Take ownership of the buffer */
wr32(E1000_P2VMAILBOX(vf_number), E1000_P2VMAILBOX_PFU);
/* reserve mailbox for vf use */ /* reserve mailbox for vf use */
p2v_mailbox = rd32(E1000_P2VMAILBOX(vf_number)); p2v_mailbox = rd32(E1000_P2VMAILBOX(vf_number));
if (p2v_mailbox & E1000_P2VMAILBOX_PFU) if (p2v_mailbox & E1000_P2VMAILBOX_PFU) {
ret_val = 0; ret_val = 0;
break;
}
udelay(1000);
} while (count-- > 0);
return ret_val; return ret_val;
} }
......
...@@ -234,13 +234,19 @@ static s32 e1000_check_for_rst_vf(struct e1000_hw *hw) ...@@ -234,13 +234,19 @@ static s32 e1000_check_for_rst_vf(struct e1000_hw *hw)
static s32 e1000_obtain_mbx_lock_vf(struct e1000_hw *hw) static s32 e1000_obtain_mbx_lock_vf(struct e1000_hw *hw)
{ {
s32 ret_val = -E1000_ERR_MBX; s32 ret_val = -E1000_ERR_MBX;
int count = 10;
/* Take ownership of the buffer */
ew32(V2PMAILBOX(0), E1000_V2PMAILBOX_VFU); do {
/* Take ownership of the buffer */
/* reserve mailbox for VF use */ ew32(V2PMAILBOX(0), E1000_V2PMAILBOX_VFU);
if (e1000_read_v2p_mailbox(hw) & E1000_V2PMAILBOX_VFU)
ret_val = E1000_SUCCESS; /* reserve mailbox for VF use */
if (e1000_read_v2p_mailbox(hw) & E1000_V2PMAILBOX_VFU) {
ret_val = 0;
break;
}
udelay(1000);
} while (count-- > 0);
return ret_val; return ret_val;
} }
......
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