| From d9d500b6c0ef17a0a4462a517cdd4eb1cc9bb404 Mon Sep 17 00:00:00 2001 |
| From: Luo bin <luobin9@huawei.com> |
| Date: Fri, 20 Mar 2020 23:13:16 +0000 |
| Subject: [PATCH] hinic: fix a bug of waitting for IO stopped |
| |
| commit 96758117dc528e6d84bd23d205e8cf7f31eda029 upstream. |
| |
| it's unreliable for fw to check whether IO is stopped, so driver |
| wait for enough time to ensure IO process is done in hw before |
| freeing resources |
| |
| Signed-off-by: Luo bin <luobin9@huawei.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c b/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c |
| index 813f48dede92..e69178694f28 100644 |
| --- a/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c |
| +++ b/drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c |
| @@ -361,50 +361,6 @@ static int wait_for_db_state(struct hinic_hwdev *hwdev) |
| return -EFAULT; |
| } |
| |
| -static int wait_for_io_stopped(struct hinic_hwdev *hwdev) |
| -{ |
| - struct hinic_cmd_io_status cmd_io_status; |
| - struct hinic_hwif *hwif = hwdev->hwif; |
| - struct pci_dev *pdev = hwif->pdev; |
| - struct hinic_pfhwdev *pfhwdev; |
| - unsigned long end; |
| - u16 out_size; |
| - int err; |
| - |
| - if (!HINIC_IS_PF(hwif) && !HINIC_IS_PPF(hwif)) { |
| - dev_err(&pdev->dev, "Unsupported PCI Function type\n"); |
| - return -EINVAL; |
| - } |
| - |
| - pfhwdev = container_of(hwdev, struct hinic_pfhwdev, hwdev); |
| - |
| - cmd_io_status.func_idx = HINIC_HWIF_FUNC_IDX(hwif); |
| - |
| - end = jiffies + msecs_to_jiffies(IO_STATUS_TIMEOUT); |
| - do { |
| - err = hinic_msg_to_mgmt(&pfhwdev->pf_to_mgmt, HINIC_MOD_COMM, |
| - HINIC_COMM_CMD_IO_STATUS_GET, |
| - &cmd_io_status, sizeof(cmd_io_status), |
| - &cmd_io_status, &out_size, |
| - HINIC_MGMT_MSG_SYNC); |
| - if ((err) || (out_size != sizeof(cmd_io_status))) { |
| - dev_err(&pdev->dev, "Failed to get IO status, ret = %d\n", |
| - err); |
| - return err; |
| - } |
| - |
| - if (cmd_io_status.status == IO_STOPPED) { |
| - dev_info(&pdev->dev, "IO stopped\n"); |
| - return 0; |
| - } |
| - |
| - msleep(20); |
| - } while (time_before(jiffies, end)); |
| - |
| - dev_err(&pdev->dev, "Wait for IO stopped - Timeout\n"); |
| - return -ETIMEDOUT; |
| -} |
| - |
| /** |
| * clear_io_resource - set the IO resources as not active in the NIC |
| * @hwdev: the NIC HW device |
| @@ -424,11 +380,8 @@ static int clear_io_resources(struct hinic_hwdev *hwdev) |
| return -EINVAL; |
| } |
| |
| - err = wait_for_io_stopped(hwdev); |
| - if (err) { |
| - dev_err(&pdev->dev, "IO has not stopped yet\n"); |
| - return err; |
| - } |
| + /* sleep 100ms to wait for firmware stopping I/O */ |
| + msleep(100); |
| |
| cmd_clear_io_res.func_idx = HINIC_HWIF_FUNC_IDX(hwif); |
| |
| -- |
| 2.7.4 |
| |