mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-30 04:16:40 +07:00
be2net: stop issuing FW cmds if any cmd times out
A FW cmd timeout (with a sufficiently large timeout value in the order of tens of seconds) indicates an unresponsive FW. In this state issuing further cmds and waiting for a completion will only stall the process. Signed-off-by: Sathya Perla <sathya.perla@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
434b3648e9
commit
6589ade019
@ -350,6 +350,8 @@ struct be_adapter {
|
|||||||
u32 beacon_state; /* for set_phys_id */
|
u32 beacon_state; /* for set_phys_id */
|
||||||
|
|
||||||
bool eeh_err;
|
bool eeh_err;
|
||||||
|
bool ue_detected;
|
||||||
|
bool fw_timeout;
|
||||||
u32 port_num;
|
u32 port_num;
|
||||||
bool promiscuous;
|
bool promiscuous;
|
||||||
bool wol;
|
bool wol;
|
||||||
@ -357,7 +359,6 @@ struct be_adapter {
|
|||||||
u32 function_caps;
|
u32 function_caps;
|
||||||
u32 rx_fc; /* Rx flow control */
|
u32 rx_fc; /* Rx flow control */
|
||||||
u32 tx_fc; /* Tx flow control */
|
u32 tx_fc; /* Tx flow control */
|
||||||
bool ue_detected;
|
|
||||||
bool stats_cmd_sent;
|
bool stats_cmd_sent;
|
||||||
int link_speed;
|
int link_speed;
|
||||||
u8 port_type;
|
u8 port_type;
|
||||||
@ -522,6 +523,11 @@ static inline bool be_multi_rxq(const struct be_adapter *adapter)
|
|||||||
return adapter->num_rx_qs > 1;
|
return adapter->num_rx_qs > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool be_error(struct be_adapter *adapter)
|
||||||
|
{
|
||||||
|
return adapter->eeh_err || adapter->ue_detected || adapter->fw_timeout;
|
||||||
|
}
|
||||||
|
|
||||||
extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,
|
extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,
|
||||||
u16 num_popped);
|
u16 num_popped);
|
||||||
extern void be_link_status_update(struct be_adapter *adapter, u32 link_status);
|
extern void be_link_status_update(struct be_adapter *adapter, u32 link_status);
|
||||||
|
@ -31,7 +31,7 @@ static void be_mcc_notify(struct be_adapter *adapter)
|
|||||||
struct be_queue_info *mccq = &adapter->mcc_obj.q;
|
struct be_queue_info *mccq = &adapter->mcc_obj.q;
|
||||||
u32 val = 0;
|
u32 val = 0;
|
||||||
|
|
||||||
if (adapter->eeh_err)
|
if (be_error(adapter))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
val |= mccq->id & DB_MCCQ_RING_ID_MASK;
|
val |= mccq->id & DB_MCCQ_RING_ID_MASK;
|
||||||
@ -263,10 +263,10 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
|
|||||||
int i, num, status = 0;
|
int i, num, status = 0;
|
||||||
struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
|
struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
|
||||||
|
|
||||||
if (adapter->eeh_err)
|
for (i = 0; i < mcc_timeout; i++) {
|
||||||
|
if (be_error(adapter))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
for (i = 0; i < mcc_timeout; i++) {
|
|
||||||
num = be_process_mcc(adapter, &status);
|
num = be_process_mcc(adapter, &status);
|
||||||
if (num)
|
if (num)
|
||||||
be_cq_notify(adapter, mcc_obj->cq.id,
|
be_cq_notify(adapter, mcc_obj->cq.id,
|
||||||
@ -277,7 +277,8 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
|
|||||||
udelay(100);
|
udelay(100);
|
||||||
}
|
}
|
||||||
if (i == mcc_timeout) {
|
if (i == mcc_timeout) {
|
||||||
dev_err(&adapter->pdev->dev, "mccq poll timed out\n");
|
dev_err(&adapter->pdev->dev, "FW not responding\n");
|
||||||
|
adapter->fw_timeout = true;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
@ -295,10 +296,10 @@ static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db)
|
|||||||
int msecs = 0;
|
int msecs = 0;
|
||||||
u32 ready;
|
u32 ready;
|
||||||
|
|
||||||
if (adapter->eeh_err)
|
do {
|
||||||
|
if (be_error(adapter))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
do {
|
|
||||||
ready = ioread32(db);
|
ready = ioread32(db);
|
||||||
if (ready == 0xffffffff)
|
if (ready == 0xffffffff)
|
||||||
return -1;
|
return -1;
|
||||||
@ -308,7 +309,8 @@ static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
if (msecs > 4000) {
|
if (msecs > 4000) {
|
||||||
dev_err(&adapter->pdev->dev, "mbox poll timed out\n");
|
dev_err(&adapter->pdev->dev, "FW not responding\n");
|
||||||
|
adapter->fw_timeout = true;
|
||||||
be_detect_dump_ue(adapter);
|
be_detect_dump_ue(adapter);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -546,9 +548,6 @@ int be_cmd_fw_clean(struct be_adapter *adapter)
|
|||||||
u8 *wrb;
|
u8 *wrb;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (adapter->eeh_err)
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -1012,9 +1011,6 @@ int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
|
|||||||
u8 subsys = 0, opcode = 0;
|
u8 subsys = 0, opcode = 0;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (adapter->eeh_err)
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
if (mutex_lock_interruptible(&adapter->mbox_lock))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -1136,9 +1132,6 @@ int be_cmd_if_destroy(struct be_adapter *adapter, int interface_id, u32 domain)
|
|||||||
struct be_cmd_req_if_destroy *req;
|
struct be_cmd_req_if_destroy *req;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (adapter->eeh_err)
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
if (interface_id == -1)
|
if (interface_id == -1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -3569,6 +3569,8 @@ static pci_ers_result_t be_eeh_reset(struct pci_dev *pdev)
|
|||||||
|
|
||||||
dev_info(&adapter->pdev->dev, "EEH reset\n");
|
dev_info(&adapter->pdev->dev, "EEH reset\n");
|
||||||
adapter->eeh_err = false;
|
adapter->eeh_err = false;
|
||||||
|
adapter->ue_detected = false;
|
||||||
|
adapter->fw_timeout = false;
|
||||||
|
|
||||||
status = pci_enable_device(pdev);
|
status = pci_enable_device(pdev);
|
||||||
if (status)
|
if (status)
|
||||||
|
Loading…
Reference in New Issue
Block a user