be2net: Wait till resources are available for VF in error recovery
After FW error, driver should wait for NO_RESOURCE error to disappear before proceeding with recovery. Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
704e4c88f0
commit
67297ad8a6
|
@ -452,10 +452,33 @@ int lancer_wait_ready(struct be_adapter *adapter)
|
|||
return status;
|
||||
}
|
||||
|
||||
static bool lancer_provisioning_error(struct be_adapter *adapter)
|
||||
{
|
||||
u32 sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0;
|
||||
sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET);
|
||||
if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
|
||||
sliport_err1 = ioread32(adapter->db +
|
||||
SLIPORT_ERROR1_OFFSET);
|
||||
sliport_err2 = ioread32(adapter->db +
|
||||
SLIPORT_ERROR2_OFFSET);
|
||||
|
||||
if (sliport_err1 == SLIPORT_ERROR_NO_RESOURCE1 &&
|
||||
sliport_err2 == SLIPORT_ERROR_NO_RESOURCE2)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int lancer_test_and_set_rdy_state(struct be_adapter *adapter)
|
||||
{
|
||||
int status;
|
||||
u32 sliport_status, err, reset_needed;
|
||||
bool resource_error;
|
||||
|
||||
resource_error = lancer_provisioning_error(adapter);
|
||||
if (resource_error)
|
||||
return -1;
|
||||
|
||||
status = lancer_wait_ready(adapter);
|
||||
if (!status) {
|
||||
sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET);
|
||||
|
@ -477,6 +500,14 @@ int lancer_test_and_set_rdy_state(struct be_adapter *adapter)
|
|||
status = -1;
|
||||
}
|
||||
}
|
||||
/* Stop error recovery if error is not recoverable.
|
||||
* No resource error is temporary errors and will go away
|
||||
* when PF provisions resources.
|
||||
*/
|
||||
resource_error = lancer_provisioning_error(adapter);
|
||||
if (status == -1 && !resource_error)
|
||||
adapter->eeh_error = true;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
|
@ -59,6 +59,9 @@
|
|||
#define PHYSDEV_CONTROL_FW_RESET_MASK 0x00000002
|
||||
#define PHYSDEV_CONTROL_INP_MASK 0x40000000
|
||||
|
||||
#define SLIPORT_ERROR_NO_RESOURCE1 0x2
|
||||
#define SLIPORT_ERROR_NO_RESOURCE2 0x9
|
||||
|
||||
/********* Memory BAR register ************/
|
||||
#define PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET 0xfc
|
||||
/* Host Interrupt Enable, if set interrupts are enabled although "PCI Interrupt
|
||||
|
|
|
@ -3837,8 +3837,9 @@ static int lancer_recover_func(struct be_adapter *adapter)
|
|||
"Adapter SLIPORT recovery succeeded\n");
|
||||
return 0;
|
||||
err:
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"Adapter SLIPORT recovery failed\n");
|
||||
if (adapter->eeh_error)
|
||||
dev_err(&adapter->pdev->dev,
|
||||
"Adapter SLIPORT recovery failed\n");
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue