hinic: fix a bug of waitting for IO stopped
authorLuo bin <luobin9@huawei.com>
Fri, 20 Mar 2020 23:13:16 +0000 (23:13 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 24 Apr 2020 06:00:24 +0000 (08:00 +0200)
[ Upstream commit 96758117dc528e6d84bd23d205e8cf7f31eda029 ]

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: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/huawei/hinic/hinic_hw_dev.c

index 46aba02b8672b3807804d0c800c4fab439425702..5763e333a9afe58ccc0c851b049569cbd5fd1985 100644 (file)
@@ -373,50 +373,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
@@ -436,11 +392,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);