mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 18:13:26 -04:00
net: hns3: add devlink reload support for PF
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>
This commit is contained in:
committed by
David S. Miller
parent
bd85e55bfb
commit
98fa7525d3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user