提交 7c0849c7 编写于 作者: H Hao Chen 提交者: Zheng Zengkai

net: hns3: PF supports to set and query lane_num by sysfs

driver inclusion
category:feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I62HX2

----------------------------------------------------------------------

When serdes lane support setting 25Gb/s、50Gb/s speed and user wants to
set port speed as 50Gb/s, it can be setted as one 50Gb/s serdes lane or
two 25Gb/s serdes lanes.

So, this patch adds support to query and set lane number by sysfs
to satisfy this scenario.
Signed-off-by: NHao Chen <chenhao418@huawei.com>
Signed-off-by: NJiantao Xiao <xiaojiantao1@h-partners.com>
Reviewed-by: NYue Haibing <yuehaibing@huawei.com>
Reviewed-by: NJian Shen <shenjian15@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 b66ae5ce
...@@ -21,7 +21,7 @@ hclgevf-objs = hns3vf/hclgevf_main.o hns3vf/hclgevf_mbx.o hns3vf/hclgevf_devlin ...@@ -21,7 +21,7 @@ hclgevf-objs = hns3vf/hclgevf_main.o hns3vf/hclgevf_mbx.o hns3vf/hclgevf_devlin
hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o hns3_common/hclge_comm_tqp_stats.o hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o hns3_common/hclge_comm_tqp_stats.o
obj-$(CONFIG_HNS3_HCLGE) += hclge.o obj-$(CONFIG_HNS3_HCLGE) += hclge.o
hclge-objs = hns3pf/hclge_main.o hns3pf/hclge_mdio.o hns3pf/hclge_tm.o \ hclge-objs = hns3pf/hclge_main.o hns3pf/hclge_mdio.o hns3pf/hclge_tm.o hns3pf/hclge_sysfs.o \
hns3pf/hclge_mbx.o hns3pf/hclge_err.o hns3pf/hclge_debugfs.o hns3pf/hclge_ptp.o hns3pf/hclge_devlink.o \ hns3pf/hclge_mbx.o hns3pf/hclge_err.o hns3pf/hclge_debugfs.o hns3pf/hclge_ptp.o hns3pf/hclge_devlink.o \
hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o hns3_common/hclge_comm_tqp_stats.o hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o hns3_common/hclge_comm_tqp_stats.o
......
...@@ -100,6 +100,7 @@ enum HNAE3_DEV_CAP_BITS { ...@@ -100,6 +100,7 @@ enum HNAE3_DEV_CAP_BITS {
HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B,
HNAE3_DEV_SUPPORT_MC_MAC_MNG_B, HNAE3_DEV_SUPPORT_MC_MAC_MNG_B,
HNAE3_DEV_SUPPORT_CQ_B, HNAE3_DEV_SUPPORT_CQ_B,
HNAE3_DEV_SUPPORT_LANE_NUM_B,
}; };
#define hnae3_ae_dev_fd_supported(ae_dev) \ #define hnae3_ae_dev_fd_supported(ae_dev) \
...@@ -162,6 +163,9 @@ enum HNAE3_DEV_CAP_BITS { ...@@ -162,6 +163,9 @@ enum HNAE3_DEV_CAP_BITS {
#define hnae3_ae_dev_cq_supported(ae_dev) \ #define hnae3_ae_dev_cq_supported(ae_dev) \
test_bit(HNAE3_DEV_SUPPORT_CQ_B, (ae_dev)->caps) test_bit(HNAE3_DEV_SUPPORT_CQ_B, (ae_dev)->caps)
#define hnae3_ae_dev_lane_num_supported(ae_dev) \
test_bit(HNAE3_DEV_SUPPORT_LANE_NUM_B, (ae_dev)->caps)
enum HNAE3_PF_CAP_BITS { enum HNAE3_PF_CAP_BITS {
HNAE3_PF_SUPPORT_VLAN_FLTR_MDF_B = 0, HNAE3_PF_SUPPORT_VLAN_FLTR_MDF_B = 0,
}; };
......
...@@ -153,6 +153,7 @@ static const struct hclge_comm_caps_bit_map hclge_pf_cmd_caps[] = { ...@@ -153,6 +153,7 @@ static const struct hclge_comm_caps_bit_map hclge_pf_cmd_caps[] = {
{HCLGE_COMM_CAP_CQ_B, HNAE3_DEV_SUPPORT_CQ_B}, {HCLGE_COMM_CAP_CQ_B, HNAE3_DEV_SUPPORT_CQ_B},
{HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B}, {HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B},
{HCLGE_COMM_CAP_FD_B, HNAE3_DEV_SUPPORT_FD_B}, {HCLGE_COMM_CAP_FD_B, HNAE3_DEV_SUPPORT_FD_B},
{HCLGE_COMM_CAP_LANE_NUM_B, HNAE3_DEV_SUPPORT_LANE_NUM_B},
}; };
static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = { static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = {
......
...@@ -342,6 +342,7 @@ enum HCLGE_COMM_CAP_BITS { ...@@ -342,6 +342,7 @@ enum HCLGE_COMM_CAP_BITS {
HCLGE_COMM_CAP_CQ_B = 18, HCLGE_COMM_CAP_CQ_B = 18,
HCLGE_COMM_CAP_GRO_B = 20, HCLGE_COMM_CAP_GRO_B = 20,
HCLGE_COMM_CAP_FD_B = 21, HCLGE_COMM_CAP_FD_B = 21,
HCLGE_COMM_CAP_LANE_NUM_B = 27,
}; };
enum HCLGE_COMM_API_CAP_BITS { enum HCLGE_COMM_API_CAP_BITS {
......
...@@ -322,7 +322,9 @@ struct hclge_config_mac_speed_dup_cmd { ...@@ -322,7 +322,9 @@ struct hclge_config_mac_speed_dup_cmd {
#define HCLGE_CFG_MAC_SPEED_CHANGE_EN_B 0 #define HCLGE_CFG_MAC_SPEED_CHANGE_EN_B 0
u8 mac_change_fec_en; u8 mac_change_fec_en;
u8 rsv[22]; u8 rsv[4];
u8 lane_num;
u8 rsv1[17];
}; };
#define HCLGE_TQP_ENABLE_B 0 #define HCLGE_TQP_ENABLE_B 0
...@@ -349,7 +351,8 @@ struct hclge_sfp_info_cmd { ...@@ -349,7 +351,8 @@ struct hclge_sfp_info_cmd {
__le32 speed_ability; /* speed ability for current media */ __le32 speed_ability; /* speed ability for current media */
__le32 module_type; __le32 module_type;
u8 fec_ability; u8 fec_ability;
u8 rsv[7]; u8 lane_num;
u8 rsv[6];
}; };
#define HCLGE_MAC_CFG_FEC_AUTO_EN_B 0 #define HCLGE_MAC_CFG_FEC_AUTO_EN_B 0
......
...@@ -2663,8 +2663,8 @@ static int hclge_convert_to_fw_speed(u32 speed_drv, u32 *speed_fw) ...@@ -2663,8 +2663,8 @@ static int hclge_convert_to_fw_speed(u32 speed_drv, u32 *speed_fw)
return -EINVAL; return -EINVAL;
} }
static int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed, int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed,
u8 duplex) u8 duplex, u8 lane_num)
{ {
struct hclge_config_mac_speed_dup_cmd *req; struct hclge_config_mac_speed_dup_cmd *req;
struct hclge_desc desc; struct hclge_desc desc;
...@@ -2688,6 +2688,7 @@ static int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed, ...@@ -2688,6 +2688,7 @@ static int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed,
speed_fw); speed_fw);
hnae3_set_bit(req->mac_change_fec_en, HCLGE_CFG_MAC_SPEED_CHANGE_EN_B, hnae3_set_bit(req->mac_change_fec_en, HCLGE_CFG_MAC_SPEED_CHANGE_EN_B,
1); 1);
req->lane_num = lane_num;
ret = hclge_cmd_send(&hdev->hw, &desc, 1); ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret) { if (ret) {
...@@ -2709,7 +2710,7 @@ int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex) ...@@ -2709,7 +2710,7 @@ int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex)
mac->duplex == duplex) mac->duplex == duplex)
return 0; return 0;
ret = hclge_cfg_mac_speed_dup_hw(hdev, speed, duplex); ret = hclge_cfg_mac_speed_dup_hw(hdev, speed, duplex, 0);
if (ret) if (ret)
return ret; return ret;
...@@ -2875,7 +2876,8 @@ static int hclge_mac_init(struct hclge_dev *hdev) ...@@ -2875,7 +2876,8 @@ static int hclge_mac_init(struct hclge_dev *hdev)
hdev->support_sfp_query = true; hdev->support_sfp_query = true;
hdev->hw.mac.duplex = HCLGE_MAC_FULL; hdev->hw.mac.duplex = HCLGE_MAC_FULL;
ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.speed, ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.speed,
hdev->hw.mac.duplex); hdev->hw.mac.duplex,
hdev->hw.mac.lane_num);
if (ret) if (ret)
return ret; return ret;
...@@ -3200,6 +3202,7 @@ static int hclge_get_sfp_info(struct hclge_dev *hdev, struct hclge_mac *mac) ...@@ -3200,6 +3202,7 @@ static int hclge_get_sfp_info(struct hclge_dev *hdev, struct hclge_mac *mac)
mac->autoneg = resp->autoneg; mac->autoneg = resp->autoneg;
mac->support_autoneg = resp->autoneg_ability; mac->support_autoneg = resp->autoneg_ability;
mac->speed_type = QUERY_ACTIVE_SPEED; mac->speed_type = QUERY_ACTIVE_SPEED;
mac->lane_num = resp->lane_num;
if (!resp->active_fec) if (!resp->active_fec)
mac->fec_mode = 0; mac->fec_mode = 0;
else else
...@@ -12173,13 +12176,19 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -12173,13 +12176,19 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
goto err_mdiobus_unreg; goto err_mdiobus_unreg;
} }
ret = hclge_register_sysfs(hdev);
if (ret) {
dev_err(&pdev->dev, "failed to register sysfs, ret = %d\n", ret);
goto err_mdiobus_unreg;
}
ret = hclge_ptp_init(hdev); ret = hclge_ptp_init(hdev);
if (ret) if (ret)
goto err_mdiobus_unreg; goto err_sysfs_unregister;
ret = hclge_update_port_info(hdev); ret = hclge_update_port_info(hdev);
if (ret) if (ret)
goto err_mdiobus_unreg; goto err_sysfs_unregister;
INIT_KFIFO(hdev->mac_tnl_log); INIT_KFIFO(hdev->mac_tnl_log);
...@@ -12224,6 +12233,8 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -12224,6 +12233,8 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
return 0; return 0;
err_sysfs_unregister:
hclge_unregister_sysfs(hdev);
err_mdiobus_unreg: err_mdiobus_unreg:
if (hdev->hw.mac.phydev) if (hdev->hw.mac.phydev)
mdiobus_unregister(hdev->hw.mac.mdio_bus); mdiobus_unregister(hdev->hw.mac.mdio_bus);
...@@ -12605,6 +12616,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev) ...@@ -12605,6 +12616,7 @@ static void hclge_uninit_ae_dev(struct hnae3_ae_dev *ae_dev)
struct hclge_dev *hdev = ae_dev->priv; struct hclge_dev *hdev = ae_dev->priv;
struct hclge_mac *mac = &hdev->hw.mac; struct hclge_mac *mac = &hdev->hw.mac;
hclge_unregister_sysfs(hdev);
hclge_reset_vf_rate(hdev); hclge_reset_vf_rate(hdev);
hclge_clear_vf_vlan(hdev); hclge_clear_vf_vlan(hdev);
hclge_state_uninit(hdev); hclge_state_uninit(hdev);
......
...@@ -260,6 +260,7 @@ struct hclge_mac { ...@@ -260,6 +260,7 @@ struct hclge_mac {
u8 duplex; u8 duplex;
u8 support_autoneg; u8 support_autoneg;
u8 speed_type; /* 0: sfp speed, 1: active speed */ u8 speed_type; /* 0: sfp speed, 1: active speed */
u8 lane_num;
u32 speed; u32 speed;
u32 max_speed; u32 max_speed;
u32 speed_ability; /* speed ability supported by current media */ u32 speed_ability; /* speed ability supported by current media */
...@@ -1143,4 +1144,8 @@ int hclge_check_mac_addr_valid(struct hclge_dev *hdev, u8 vf, ...@@ -1143,4 +1144,8 @@ int hclge_check_mac_addr_valid(struct hclge_dev *hdev, u8 vf,
int hclge_push_vf_link_status(struct hclge_vport *vport); int hclge_push_vf_link_status(struct hclge_vport *vport);
int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en); int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en);
int hclge_mac_update_stats(struct hclge_dev *hdev); int hclge_mac_update_stats(struct hclge_dev *hdev);
int hclge_register_sysfs(struct hclge_dev *hdev);
void hclge_unregister_sysfs(struct hclge_dev *hdev);
int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed, u8 duplex,
u8 lane_num);
#endif #endif
// SPDX-License-Identifier: GPL-2.0+
// Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved.
#include "hnae3.h"
#include "hclge_main.h"
static ssize_t lane_num_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);
struct hclge_dev *hdev = ae_dev->priv;
return scnprintf(buf, PAGE_SIZE, "%u\n", hdev->hw.mac.lane_num);
}
static ssize_t lane_num_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
#define HCLGE_CONVERSION_NUM 10 /* Convert string to decimal number */
struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);
struct hclge_dev *hdev = ae_dev->priv;
u8 lane_num, duplex;
u32 speed;
int ret;
ret = kstrtou8(buf, HCLGE_CONVERSION_NUM, &lane_num);
if (ret) {
dev_err(dev, "input params of lane number format unmatch.\n");
return -EINVAL;
}
if (!lane_num || lane_num > 8 || !is_power_of_2(lane_num)) {
dev_err(dev, "lane number only supports setting 1, 2, 4, 8.\n");
return -EINVAL;
}
rtnl_lock();
if (hdev->hw.mac.support_autoneg && hdev->hw.mac.autoneg) {
ret = count;
goto out;
}
if (lane_num == hdev->hw.mac.lane_num) {
dev_info(dev, "setting lane number not changed.\n");
ret = count;
goto out;
}
speed = hdev->hw.mac.speed;
duplex = hdev->hw.mac.duplex;
ret = hclge_cfg_mac_speed_dup_hw(hdev, speed, duplex, lane_num);
if (!ret)
ret = count;
out:
rtnl_unlock();
return ret;
}
static DEVICE_ATTR_RW(lane_num);
static const struct device_attribute *hclge_hw_attrs_list[] = {
&dev_attr_lane_num,
};
int hclge_register_sysfs(struct hclge_dev *hdev)
{
int ret;
if (!hnae3_ae_dev_lane_num_supported(hdev->ae_dev))
return 0;
ret = device_create_file(&hdev->pdev->dev, hclge_hw_attrs_list[0]);
if (ret)
dev_err(&hdev->pdev->dev,
"failed to create node %s, ret = %d.\n",
hclge_hw_attrs_list[0]->attr.name, ret);
return ret;
}
void hclge_unregister_sysfs(struct hclge_dev *hdev)
{
device_remove_file(&hdev->pdev->dev, hclge_hw_attrs_list[0]);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册