brintos

brintos / linux-shallow public Read only

0
0
Text · 3.4 KiB · 1b53514 Raw
131 lines · c
1// SPDX-License-Identifier: GPL-2.0+2/* Copyright (c) 2021 Hisilicon Limited. */3 4#include <net/devlink.h>5 6#include "hclgevf_devlink.h"7 8static int hclgevf_devlink_info_get(struct devlink *devlink,9				    struct devlink_info_req *req,10				    struct netlink_ext_ack *extack)11{12#define	HCLGEVF_DEVLINK_FW_STRING_LEN	3213	struct hclgevf_devlink_priv *priv = devlink_priv(devlink);14	char version_str[HCLGEVF_DEVLINK_FW_STRING_LEN];15	struct hclgevf_dev *hdev = priv->hdev;16 17	snprintf(version_str, sizeof(version_str), "%lu.%lu.%lu.%lu",18		 hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE3_MASK,19				 HNAE3_FW_VERSION_BYTE3_SHIFT),20		 hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE2_MASK,21				 HNAE3_FW_VERSION_BYTE2_SHIFT),22		 hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE1_MASK,23				 HNAE3_FW_VERSION_BYTE1_SHIFT),24		 hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE0_MASK,25				 HNAE3_FW_VERSION_BYTE0_SHIFT));26 27	return devlink_info_version_running_put(req,28						DEVLINK_INFO_VERSION_GENERIC_FW,29						version_str);30}31 32static int hclgevf_devlink_reload_down(struct devlink *devlink,33				       bool netns_change,34				       enum devlink_reload_action action,35				       enum devlink_reload_limit limit,36				       struct netlink_ext_ack *extack)37{38	struct hclgevf_devlink_priv *priv = devlink_priv(devlink);39	struct hclgevf_dev *hdev = priv->hdev;40	struct hnae3_handle *h = &hdev->nic;41	struct pci_dev *pdev = hdev->pdev;42	int ret;43 44	if (test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state)) {45		dev_err(&pdev->dev, "reset is handling\n");46		return -EBUSY;47	}48 49	switch (action) {50	case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:51		rtnl_lock();52		ret = hdev->nic_client->ops->reset_notify(h, HNAE3_DOWN_CLIENT);53		if (ret) {54			rtnl_unlock();55			return ret;56		}57 58		ret = hdev->nic_client->ops->reset_notify(h,59							  HNAE3_UNINIT_CLIENT);60		rtnl_unlock();61		return ret;62	default:63		return -EOPNOTSUPP;64	}65}66 67static int hclgevf_devlink_reload_up(struct devlink *devlink,68				     enum devlink_reload_action action,69				     enum devlink_reload_limit limit,70				     u32 *actions_performed,71				     struct netlink_ext_ack *extack)72{73	struct hclgevf_devlink_priv *priv = devlink_priv(devlink);74	struct hclgevf_dev *hdev = priv->hdev;75	struct hnae3_handle *h = &hdev->nic;76	int ret;77 78	*actions_performed = BIT(action);79	switch (action) {80	case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:81		rtnl_lock();82		ret = hdev->nic_client->ops->reset_notify(h, HNAE3_INIT_CLIENT);83		if (ret) {84			rtnl_unlock();85			return ret;86		}87 88		ret = hdev->nic_client->ops->reset_notify(h, HNAE3_UP_CLIENT);89		rtnl_unlock();90		return ret;91	default:92		return -EOPNOTSUPP;93	}94}95 96static const struct devlink_ops hclgevf_devlink_ops = {97	.info_get = hclgevf_devlink_info_get,98	.reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT),99	.reload_down = hclgevf_devlink_reload_down,100	.reload_up = hclgevf_devlink_reload_up,101};102 103int hclgevf_devlink_init(struct hclgevf_dev *hdev)104{105	struct pci_dev *pdev = hdev->pdev;106	struct hclgevf_devlink_priv *priv;107	struct devlink *devlink;108 109	devlink =110		devlink_alloc(&hclgevf_devlink_ops,111			      sizeof(struct hclgevf_devlink_priv), &pdev->dev);112	if (!devlink)113		return -ENOMEM;114 115	priv = devlink_priv(devlink);116	priv->hdev = hdev;117	hdev->devlink = devlink;118 119	devlink_register(devlink);120	return 0;121}122 123void hclgevf_devlink_uninit(struct hclgevf_dev *hdev)124{125	struct devlink *devlink = hdev->devlink;126 127	devlink_unregister(devlink);128 129	devlink_free(devlink);130}131