]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
net: hns3: add devlink reload support for PF
authorHao Chen <chenhao288@hisilicon.com>
Mon, 26 Jul 2021 02:47:06 +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 PF 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/hns3pf/hclge_devlink.c

index 7de423d510c536ad61aba2cbd303aaa81d4190e5..06d29945d4e16e53ef2b8b3c47c5185ed3c31275 100644 (file)
@@ -34,8 +34,74 @@ static int hclge_devlink_info_get(struct devlink *devlink,
                                                version_str);
 }
 
+static int hclge_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 hclge_devlink_priv *priv = devlink_priv(devlink);
+       struct hclge_dev *hdev = priv->hdev;
+       struct hnae3_handle *h = &hdev->vport->nic;
+       struct pci_dev *pdev = hdev->pdev;
+       int ret;
+
+       if (test_bit(HCLGE_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 hclge_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 hclge_devlink_priv *priv = devlink_priv(devlink);
+       struct hclge_dev *hdev = priv->hdev;
+       struct hnae3_handle *h = &hdev->vport->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 hclge_devlink_ops = {
        .info_get = hclge_devlink_info_get,
+       .reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT),
+       .reload_down = hclge_devlink_reload_down,
+       .reload_up = hclge_devlink_reload_up,
 };
 
 int hclge_devlink_init(struct hclge_dev *hdev)
@@ -62,6 +128,8 @@ int hclge_devlink_init(struct hclge_dev *hdev)
 
        hdev->devlink = devlink;
 
+       devlink_reload_enable(devlink);
+
        return 0;
 
 out_reg_fail:
@@ -76,6 +144,8 @@ void hclge_devlink_uninit(struct hclge_dev *hdev)
        if (!devlink)
                return;
 
+       devlink_reload_disable(devlink);
+
        devlink_unregister(devlink);
 
        devlink_free(devlink);