net: hns3: split hclgevf_reset() into preparing and rebuilding part
hclgevf_reset() is a little bloated, and the process of VF FLR will be separated from the reset task later. So this patch splits hclgevf_reset() into hclgevf_reset_prepare() and hclge_reset_rebuild(), then FLR can also reuse these two functions. Also moves HNAE3_UP_CLIENT into hclgevf_reset_stack(). Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d4fa06562a
commit
1cc9bc6e58
@ -1523,7 +1523,8 @@ static int hclgevf_reset_stack(struct hclgevf_dev *hdev)
|
|||||||
/* clear handshake status with IMP */
|
/* clear handshake status with IMP */
|
||||||
hclgevf_reset_handshake(hdev, false);
|
hclgevf_reset_handshake(hdev, false);
|
||||||
|
|
||||||
return 0;
|
/* bring up the nic to enable TX/RX again */
|
||||||
|
return hclgevf_notify_client(hdev, HNAE3_UP_CLIENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hclgevf_reset_prepare_wait(struct hclgevf_dev *hdev)
|
static int hclgevf_reset_prepare_wait(struct hclgevf_dev *hdev)
|
||||||
@ -1603,7 +1604,7 @@ static void hclgevf_reset_err_handle(struct hclgevf_dev *hdev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hclgevf_reset(struct hclgevf_dev *hdev)
|
static int hclgevf_reset_prepare(struct hclgevf_dev *hdev)
|
||||||
{
|
{
|
||||||
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||||
int ret;
|
int ret;
|
||||||
@ -1613,62 +1614,64 @@ static int hclgevf_reset(struct hclgevf_dev *hdev)
|
|||||||
*/
|
*/
|
||||||
ae_dev->reset_type = hdev->reset_type;
|
ae_dev->reset_type = hdev->reset_type;
|
||||||
hdev->rst_stats.rst_cnt++;
|
hdev->rst_stats.rst_cnt++;
|
||||||
rtnl_lock();
|
|
||||||
|
|
||||||
|
rtnl_lock();
|
||||||
/* bring down the nic to stop any ongoing TX/RX */
|
/* bring down the nic to stop any ongoing TX/RX */
|
||||||
ret = hclgevf_notify_client(hdev, HNAE3_DOWN_CLIENT);
|
ret = hclgevf_notify_client(hdev, HNAE3_DOWN_CLIENT);
|
||||||
if (ret)
|
|
||||||
goto err_reset_lock;
|
|
||||||
|
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
|
|
||||||
ret = hclgevf_reset_prepare_wait(hdev);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_reset;
|
return ret;
|
||||||
|
|
||||||
/* check if VF could successfully fetch the hardware reset completion
|
return hclgevf_reset_prepare_wait(hdev);
|
||||||
* status from the hardware
|
}
|
||||||
*/
|
|
||||||
ret = hclgevf_reset_wait(hdev);
|
static int hclgevf_reset_rebuild(struct hclgevf_dev *hdev)
|
||||||
if (ret) {
|
{
|
||||||
/* can't do much in this situation, will disable VF */
|
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
||||||
dev_err(&hdev->pdev->dev,
|
int ret;
|
||||||
"VF failed(=%d) to fetch H/W reset completion status\n",
|
|
||||||
ret);
|
|
||||||
goto err_reset;
|
|
||||||
}
|
|
||||||
|
|
||||||
hdev->rst_stats.hw_rst_done_cnt++;
|
hdev->rst_stats.hw_rst_done_cnt++;
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
|
|
||||||
/* now, re-initialize the nic client and ae device */
|
/* now, re-initialize the nic client and ae device */
|
||||||
ret = hclgevf_reset_stack(hdev);
|
ret = hclgevf_reset_stack(hdev);
|
||||||
|
rtnl_unlock();
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&hdev->pdev->dev, "failed to reset VF stack\n");
|
dev_err(&hdev->pdev->dev, "failed to reset VF stack\n");
|
||||||
goto err_reset_lock;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bring up the nic to enable TX/RX again */
|
|
||||||
ret = hclgevf_notify_client(hdev, HNAE3_UP_CLIENT);
|
|
||||||
if (ret)
|
|
||||||
goto err_reset_lock;
|
|
||||||
|
|
||||||
rtnl_unlock();
|
|
||||||
|
|
||||||
hdev->last_reset_time = jiffies;
|
hdev->last_reset_time = jiffies;
|
||||||
ae_dev->reset_type = HNAE3_NONE_RESET;
|
ae_dev->reset_type = HNAE3_NONE_RESET;
|
||||||
hdev->rst_stats.rst_done_cnt++;
|
hdev->rst_stats.rst_done_cnt++;
|
||||||
hdev->rst_stats.rst_fail_cnt = 0;
|
hdev->rst_stats.rst_fail_cnt = 0;
|
||||||
clear_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state);
|
clear_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state);
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
err_reset_lock:
|
}
|
||||||
rtnl_unlock();
|
|
||||||
|
static void hclgevf_reset(struct hclgevf_dev *hdev)
|
||||||
|
{
|
||||||
|
if (hclgevf_reset_prepare(hdev))
|
||||||
|
goto err_reset;
|
||||||
|
|
||||||
|
/* check if VF could successfully fetch the hardware reset completion
|
||||||
|
* status from the hardware
|
||||||
|
*/
|
||||||
|
if (hclgevf_reset_wait(hdev)) {
|
||||||
|
/* can't do much in this situation, will disable VF */
|
||||||
|
dev_err(&hdev->pdev->dev,
|
||||||
|
"failed to fetch H/W reset completion status\n");
|
||||||
|
goto err_reset;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hclgevf_reset_rebuild(hdev))
|
||||||
|
goto err_reset;
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
err_reset:
|
err_reset:
|
||||||
hclgevf_reset_err_handle(hdev);
|
hclgevf_reset_err_handle(hdev);
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum hnae3_reset_type hclgevf_get_reset_level(struct hclgevf_dev *hdev,
|
static enum hnae3_reset_type hclgevf_get_reset_level(struct hclgevf_dev *hdev,
|
||||||
@ -1802,8 +1805,6 @@ static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)
|
|||||||
{
|
{
|
||||||
#define HCLGEVF_MAX_RESET_ATTEMPTS_CNT 3
|
#define HCLGEVF_MAX_RESET_ATTEMPTS_CNT 3
|
||||||
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!test_and_clear_bit(HCLGEVF_STATE_RST_SERVICE_SCHED, &hdev->state))
|
if (!test_and_clear_bit(HCLGEVF_STATE_RST_SERVICE_SCHED, &hdev->state))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1822,12 +1823,8 @@ static void hclgevf_reset_service_task(struct hclgevf_dev *hdev)
|
|||||||
hdev->last_reset_time = jiffies;
|
hdev->last_reset_time = jiffies;
|
||||||
while ((hdev->reset_type =
|
while ((hdev->reset_type =
|
||||||
hclgevf_get_reset_level(hdev, &hdev->reset_pending))
|
hclgevf_get_reset_level(hdev, &hdev->reset_pending))
|
||||||
!= HNAE3_NONE_RESET) {
|
!= HNAE3_NONE_RESET)
|
||||||
ret = hclgevf_reset(hdev);
|
hclgevf_reset(hdev);
|
||||||
if (ret)
|
|
||||||
dev_err(&hdev->pdev->dev,
|
|
||||||
"VF stack reset failed %d.\n", ret);
|
|
||||||
}
|
|
||||||
} else if (test_and_clear_bit(HCLGEVF_RESET_REQUESTED,
|
} else if (test_and_clear_bit(HCLGEVF_RESET_REQUESTED,
|
||||||
&hdev->reset_state)) {
|
&hdev->reset_state)) {
|
||||||
/* we could be here when either of below happens:
|
/* we could be here when either of below happens:
|
||||||
|
Loading…
Reference in New Issue
Block a user