]> www.infradead.org Git - users/willy/xarray.git/commitdiff
net: hns3: add devlink reload support for VF
authorHao Chen <chenhao288@hisilicon.com>
Mon, 26 Jul 2021 02:47:07 +0000 (10:47 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Jul 2021 11:16:03 +0000 (12:16 +0100)
Add devlink reload support for HNS3 ethernet VF driver.

Signed-off-by: Hao Chen <chenhao288@hisilicon.com>
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_devlink.c

index 49993c8be313a0ab94c915d31e2509183bd48021..21a45279fd991cb6a2ecea036ffe711be113ffc9 100644 (file)
@@ -34,8 +34,75 @@ static int hclgevf_devlink_info_get(struct devlink *devlink,
                                                version_str);
 }
 
+static int hclgevf_devlink_reload_down(struct devlink *devlink,
+                                      bool netns_change,
+                                      enum devlink_reload_action action,
+                                      enum devlink_reload_limit limit,
+                                      struct netlink_ext_ack *extack)
+{
+       struct hclgevf_devlink_priv *priv = devlink_priv(devlink);
+       struct hclgevf_dev *hdev = priv->hdev;
+       struct hnae3_handle *h = &hdev->nic;
+       struct pci_dev *pdev = hdev->pdev;
+       int ret;
+
+       if (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state)) {
+               dev_err(&pdev->dev, "reset is handling\n");
+               return -EBUSY;
+       }
+
+       switch (action) {
+       case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:
+               rtnl_lock();
+               ret = hdev->nic_client->ops->reset_notify(h, HNAE3_DOWN_CLIENT);
+               if (ret) {
+                       rtnl_unlock();
+                       return ret;
+               }
+
+               ret = hdev->nic_client->ops->reset_notify(h,
+                                                         HNAE3_UNINIT_CLIENT);
+               rtnl_unlock();
+               return ret;
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+
+static int hclgevf_devlink_reload_up(struct devlink *devlink,
+                                    enum devlink_reload_action action,
+                                    enum devlink_reload_limit limit,
+                                    u32 *actions_performed,
+                                    struct netlink_ext_ack *extack)
+{
+       struct hclgevf_devlink_priv *priv = devlink_priv(devlink);
+       struct hclgevf_dev *hdev = priv->hdev;
+       struct hnae3_handle *h = &hdev->nic;
+       int ret;
+
+       *actions_performed = BIT(action);
+       switch (action) {
+       case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:
+               rtnl_lock();
+               ret = hdev->nic_client->ops->reset_notify(h, HNAE3_INIT_CLIENT);
+               if (ret) {
+                       rtnl_unlock();
+                       return ret;
+               }
+
+               ret = hdev->nic_client->ops->reset_notify(h, HNAE3_UP_CLIENT);
+               rtnl_unlock();
+               return ret;
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+
 static const struct devlink_ops hclgevf_devlink_ops = {
        .info_get = hclgevf_devlink_info_get,
+       .reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT),
+       .reload_down = hclgevf_devlink_reload_down,
+       .reload_up = hclgevf_devlink_reload_up,
 };
 
 int hclgevf_devlink_init(struct hclgevf_dev *hdev)
@@ -62,6 +129,8 @@ int hclgevf_devlink_init(struct hclgevf_dev *hdev)
 
        hdev->devlink = devlink;
 
+       devlink_reload_enable(devlink);
+
        return 0;
 
 out_reg_fail:
@@ -76,6 +145,8 @@ void hclgevf_devlink_uninit(struct hclgevf_dev *hdev)
        if (!devlink)
                return;
 
+       devlink_reload_disable(devlink);
+
        devlink_unregister(devlink);
 
        devlink_free(devlink);