111 lines
3.6 KiB
Diff
111 lines
3.6 KiB
Diff
From 68696319a6fde3f464fab18aafad6b01ee2cc8f0 Mon Sep 17 00:00:00 2001
|
|
From: Tian Jiang <jiangtian6@h-partners.com>
|
|
Date: Mon, 17 Apr 2023 17:20:55 +0800
|
|
Subject: [PATCH 201/283] net: hns3: add support config and query serdes lane
|
|
status
|
|
|
|
driver inclusion
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EN3D
|
|
CVE: NA
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
The patch supports the function of disabling and status query of lane
|
|
channels on a port. The patch traverses all covered lanes on the
|
|
port and powers off the serdes ds power.
|
|
|
|
Signed-off-by: Tian Jiang <jiangtian6@h-partners.com>
|
|
Signed-off-by: shaojijie <shaojijie@huawei.com>
|
|
Signed-off-by: Jiantao Xiao <xiaojiantao1@h-partners.com>
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
|
|
Conflicts:
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3_ext.h
|
|
drivers/net/ethernet/hisilicon/hns3/hns3_ext.c
|
|
drivers/net/ethernet/hisilicon/hns3/hns3_ext.h
|
|
---
|
|
.../hisilicon/hns3/hns3pf/hclge_ext.c | 46 +++++++++++++++++++
|
|
.../hisilicon/hns3/hns3pf/hclge_ext.h | 1 +
|
|
2 files changed, 47 insertions(+)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.c
|
|
index dd595a783b55..b8bdace3245b 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.c
|
|
@@ -478,6 +478,50 @@ static int hclge_set_sfp_state(struct hclge_dev *hdev, void *data,
|
|
return ret;
|
|
}
|
|
|
|
+static int hclge_set_net_lane_status(struct hclge_dev *hdev,
|
|
+ u32 enable)
|
|
+{
|
|
+ struct hclge_desc desc;
|
|
+ int ret;
|
|
+
|
|
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_DISABLE_NET_LANE, false);
|
|
+ desc.data[0] = cpu_to_le32(enable);
|
|
+
|
|
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
|
+ if (ret)
|
|
+ dev_err(&hdev->pdev->dev,
|
|
+ "failed to set net lane status, ret = %d\n", ret);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static int hclge_disable_net_lane(struct hclge_dev *hdev, void *data,
|
|
+ size_t length)
|
|
+{
|
|
+ return hclge_set_net_lane_status(hdev, 0);
|
|
+}
|
|
+
|
|
+static int hclge_get_net_lane_status(struct hclge_dev *hdev, void *data,
|
|
+ size_t length)
|
|
+{
|
|
+ struct hclge_desc desc;
|
|
+ int ret;
|
|
+
|
|
+ if (length != sizeof(u32))
|
|
+ return -EINVAL;
|
|
+
|
|
+ ret = hclge_get_info_from_cmd(hdev, &desc, 1,
|
|
+ HCLGE_OPC_DISABLE_NET_LANE);
|
|
+ if (ret) {
|
|
+ dev_err(&hdev->pdev->dev,
|
|
+ "failed to get net lane status, ret = %d\n", ret);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ *(u32 *)data = le32_to_cpu(desc.data[0]);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static void hclge_ext_resotre_config(struct hclge_dev *hdev)
|
|
{
|
|
if (hdev->reset_type != HNAE3_IMP_RESET &&
|
|
@@ -640,6 +684,8 @@ static const hclge_priv_ops_fn hclge_ext_func_arr[] = {
|
|
[HNAE3_EXT_OPC_SET_PFC_TIME] = hclge_set_pause_trans_time,
|
|
[HNAE3_EXT_OPC_GET_PRESENT] = hclge_get_sfp_present,
|
|
[HNAE3_EXT_OPC_SET_SFP_STATE] = hclge_set_sfp_state,
|
|
+ [HNAE3_EXT_OPC_DISABLE_LANE] = hclge_disable_net_lane,
|
|
+ [HNAE3_EXT_OPC_GET_LANE_STATUS] = hclge_get_net_lane_status,
|
|
};
|
|
|
|
int hclge_ext_ops_handle(struct hnae3_handle *handle, int opcode,
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.h
|
|
index 607bd1668cdc..06b3d9c494f4 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ext.h
|
|
@@ -91,6 +91,7 @@ enum hclge_ext_opcode_type {
|
|
HCLGE_OPC_CHIP_ID_GET = 0x7003,
|
|
HCLGE_OPC_GET_CHIP_NUM = 0x7005,
|
|
HCLGE_OPC_GET_PORT_NUM = 0x7006,
|
|
+ HCLGE_OPC_DISABLE_NET_LANE = 0x7008,
|
|
HCLGE_OPC_CFG_PAUSE_STORM_PARA = 0x7019,
|
|
HCLGE_OPC_SFP_GET_PRESENT = 0x7101,
|
|
HCLGE_OPC_SFP_SET_STATUS = 0x7102,
|
|
--
|
|
2.34.1
|
|
|