diff options
| author | Huazhong Tan <tanhuazhong@huawei.com> | 2018-07-06 13:28:04 +0300 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-07-07 05:13:07 +0300 | 
| commit | 8d40854fc180b7d39bf08cc76fbb9a60bcd65f14 (patch) | |
| tree | 6ec1cbc6879d27e5db34d216698f26eea6ac3aef | |
| parent | a754e5c4ed0627c3d5695ebbbc7ca53b38c6103a (diff) | |
| download | linux-8d40854fc180b7d39bf08cc76fbb9a60bcd65f14.tar.xz | |
net: hns3: Prevent sending command during global or core reset
According to hardware's description, driver should not send command to
IMP while hardware doing global or core reset.
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 1 | 
3 files changed, 6 insertions, 1 deletions
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c index 82cf12a07dc0..eca4b23fd0a8 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c @@ -206,7 +206,8 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)  	spin_lock_bh(&hw->cmq.csq.lock); -	if (num > hclge_ring_space(&hw->cmq.csq)) { +	if (num > hclge_ring_space(&hw->cmq.csq) || +	    test_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state)) {  		spin_unlock_bh(&hw->cmq.csq.lock);  		return -EBUSY;  	} @@ -346,6 +347,7 @@ int hclge_cmd_init(struct hclge_dev *hdev)  	spin_lock_init(&hdev->hw.cmq.crq.lock);  	hclge_cmd_init_regs(&hdev->hw); +	clear_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);  	ret = hclge_cmd_query_firmware_version(&hdev->hw, &version);  	if (ret) { diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 4ca3e6b42f4f..8bbf4e5c0032 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -2507,12 +2507,14 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)  	/* check for vector0 reset event sources */  	if (BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B) & rst_src_reg) { +		set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);  		set_bit(HNAE3_GLOBAL_RESET, &hdev->reset_pending);  		*clearval = BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B);  		return HCLGE_VECTOR0_EVENT_RST;  	}  	if (BIT(HCLGE_VECTOR0_CORERESET_INT_B) & rst_src_reg) { +		set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);  		set_bit(HNAE3_CORE_RESET, &hdev->reset_pending);  		*clearval = BIT(HCLGE_VECTOR0_CORERESET_INT_B);  		return HCLGE_VECTOR0_EVENT_RST; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h index 71d38b852c56..20abe828e30b 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h @@ -128,6 +128,7 @@ enum HCLGE_DEV_STATE {  	HCLGE_STATE_MBX_SERVICE_SCHED,  	HCLGE_STATE_MBX_HANDLING,  	HCLGE_STATE_STATISTICS_UPDATING, +	HCLGE_STATE_CMD_DISABLE,  	HCLGE_STATE_MAX  }; | 
