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: Mitch Williams <mitch.a.williams@intel.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
committed by
Jeff Kirsher
parent
37a5d163fb
commit
9ce0e8d726
@@ -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)
|
|||||||
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 */
|
do {
|
||||||
ew32(V2PMAILBOX(0), E1000_V2PMAILBOX_VFU);
|
/* Take ownership of the buffer */
|
||||||
|
ew32(V2PMAILBOX(0), E1000_V2PMAILBOX_VFU);
|
||||||
|
|
||||||
/* reserve mailbox for VF use */
|
/* reserve mailbox for VF use */
|
||||||
if (e1000_read_v2p_mailbox(hw) & E1000_V2PMAILBOX_VFU)
|
if (e1000_read_v2p_mailbox(hw) & E1000_V2PMAILBOX_VFU) {
|
||||||
ret_val = E1000_SUCCESS;
|
ret_val = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
udelay(1000);
|
||||||
|
} while (count-- > 0);
|
||||||
|
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user