Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6589ade0 authored by Sathya Perla's avatar Sathya Perla Committed by David S. Miller
Browse files

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: default avatarSathya Perla <sathya.perla@emulex.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 434b3648
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -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);
+11 −18
Original line number Original line Diff line number Diff line
@@ -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;


+2 −0
Original line number Original line Diff line number Diff line
@@ -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)