816 lines
26 KiB
Diff
816 lines
26 KiB
Diff
From 4d398dd78ebd4841a22a53e3dec54d7eea153cc0 Mon Sep 17 00:00:00 2001
|
|
From: Hao Lan <lanhao@huawei.com>
|
|
Date: Wed, 30 Nov 2022 18:23:57 +0800
|
|
Subject: [PATCH 189/283] net: hns3: support wake on lan configuration and
|
|
query
|
|
|
|
driver inclusion
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EN3D
|
|
CVE: NA
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Implement configuration and query WOL by ethtool and
|
|
added the needed device commands and structures to hns3.
|
|
Add it do not support suspend resume interface.
|
|
|
|
Signed-off-by: Hao Lan <lanhao@huawei.com>
|
|
Signed-off-by: Jiantao Xiao <xiaojiantao1@h-partners.com>
|
|
Reviewed-by: Yue Haibing <yuehaibing@huawei.com>
|
|
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
|
|
Conflicts:
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
|
|
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
|
|
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
---
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 29 +++
|
|
.../hns3/hns3_common/hclge_comm_cmd.c | 219 +++++++++++++++++-
|
|
.../hns3/hns3_common/hclge_comm_cmd.h | 89 +++++--
|
|
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 27 +++
|
|
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 25 ++
|
|
.../hisilicon/hns3/hns3pf/hclge_main.c | 202 ++++++++++++++++
|
|
.../hisilicon/hns3/hns3pf/hclge_main.h | 15 +-
|
|
7 files changed, 591 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
index f016bf08f297..d15038e8bcb5 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
@@ -99,6 +99,10 @@ enum HNAE3_DEV_CAP_BITS {
|
|
HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B,
|
|
HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B,
|
|
HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B,
|
|
+ HNAE3_DEV_SUPPORT_MC_MAC_MNG_B,
|
|
+ HNAE3_DEV_SUPPORT_CQ_B,
|
|
+ HNAE3_DEV_SUPPORT_LANE_NUM_B,
|
|
+ HNAE3_DEV_SUPPORT_WOL_B,
|
|
};
|
|
|
|
#define hnae3_ae_dev_fd_supported(ae_dev) \
|
|
@@ -158,6 +162,18 @@ enum HNAE3_DEV_CAP_BITS {
|
|
#define hnae3_ae_dev_rxd_adv_layout_supported(ae_dev) \
|
|
test_bit(HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B, (ae_dev)->caps)
|
|
|
|
+#define hnae3_ae_dev_mc_mac_mng_supported(ae_dev) \
|
|
+ test_bit(HNAE3_DEV_SUPPORT_MC_MAC_MNG_B, (ae_dev)->caps)
|
|
+
|
|
+#define hnae3_ae_dev_cq_supported(ae_dev) \
|
|
+ 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)
|
|
+
|
|
+#define hnae3_ae_dev_wol_supported(ae_dev) \
|
|
+ test_bit(HNAE3_DEV_SUPPORT_WOL_B, (ae_dev)->caps)
|
|
+
|
|
enum HNAE3_PF_CAP_BITS {
|
|
HNAE3_PF_SUPPORT_VLAN_FLTR_MDF_B = 0,
|
|
};
|
|
@@ -562,6 +578,12 @@ struct hnae3_ae_dev {
|
|
* Get 1588 rx hwstamp
|
|
* get_ts_info
|
|
* Get phc info
|
|
+ * clean_vf_config
|
|
+ * Clean residual vf info after disable sriov
|
|
+ * get_wol
|
|
+ * Get wake on lan info
|
|
+ * set_wol
|
|
+ * Config wake on lan
|
|
*/
|
|
struct hnae3_ae_ops {
|
|
int (*init_ae_dev)(struct hnae3_ae_dev *ae_dev);
|
|
@@ -758,6 +780,13 @@ struct hnae3_ae_ops {
|
|
struct ethtool_ts_info *info);
|
|
int (*get_link_diagnosis_info)(struct hnae3_handle *handle,
|
|
u32 *status_code);
|
|
+ void (*clean_vf_config)(struct hnae3_ae_dev *ae_dev, int num_vfs);
|
|
+ int (*get_dscp_prio)(struct hnae3_handle *handle, u8 dscp,
|
|
+ u8 *tc_map_mode, u8 *priority);
|
|
+ void (*get_wol)(struct hnae3_handle *handle,
|
|
+ struct ethtool_wolinfo *wol);
|
|
+ int (*set_wol)(struct hnae3_handle *handle,
|
|
+ struct ethtool_wolinfo *wol);
|
|
/* Notice! If the function is not for test, the definition must before
|
|
* CONFIG_HNS3_TEST! Because RoCE will use this head file, and it won't
|
|
* set CONFIG_HNS3_TEST, that may cause RoCE calling the wrong function.
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
|
|
index 89e999248b9a..a899b4c535dd 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
|
|
@@ -6,7 +6,224 @@
|
|
|
|
static bool hclge_is_elem_in_array(const u16 *spec_opcode, u32 size, u16 opcode)
|
|
{
|
|
- u32 i;
|
|
+ dma_addr_t dma = ring->desc_dma_addr;
|
|
+ u32 reg_val;
|
|
+
|
|
+ if (ring->ring_type == HCLGE_COMM_TYPE_CSQ) {
|
|
+ hclge_comm_write_dev(hw, HCLGE_COMM_NIC_CSQ_BASEADDR_L_REG,
|
|
+ lower_32_bits(dma));
|
|
+ hclge_comm_write_dev(hw, HCLGE_COMM_NIC_CSQ_BASEADDR_H_REG,
|
|
+ upper_32_bits(dma));
|
|
+ reg_val = hclge_comm_read_dev(hw, HCLGE_COMM_NIC_CSQ_DEPTH_REG);
|
|
+ reg_val &= HCLGE_COMM_NIC_SW_RST_RDY;
|
|
+ reg_val |= ring->desc_num >> HCLGE_COMM_NIC_CMQ_DESC_NUM_S;
|
|
+ hclge_comm_write_dev(hw, HCLGE_COMM_NIC_CSQ_DEPTH_REG, reg_val);
|
|
+ hclge_comm_write_dev(hw, HCLGE_COMM_NIC_CSQ_HEAD_REG, 0);
|
|
+ hclge_comm_write_dev(hw, HCLGE_COMM_NIC_CSQ_TAIL_REG, 0);
|
|
+ } else {
|
|
+ hclge_comm_write_dev(hw, HCLGE_COMM_NIC_CRQ_BASEADDR_L_REG,
|
|
+ lower_32_bits(dma));
|
|
+ hclge_comm_write_dev(hw, HCLGE_COMM_NIC_CRQ_BASEADDR_H_REG,
|
|
+ upper_32_bits(dma));
|
|
+ reg_val = ring->desc_num >> HCLGE_COMM_NIC_CMQ_DESC_NUM_S;
|
|
+ hclge_comm_write_dev(hw, HCLGE_COMM_NIC_CRQ_DEPTH_REG, reg_val);
|
|
+ hclge_comm_write_dev(hw, HCLGE_COMM_NIC_CRQ_HEAD_REG, 0);
|
|
+ hclge_comm_write_dev(hw, HCLGE_COMM_NIC_CRQ_TAIL_REG, 0);
|
|
+ }
|
|
+}
|
|
+
|
|
+void hclge_comm_cmd_init_regs(struct hclge_comm_hw *hw)
|
|
+{
|
|
+ hclge_comm_cmd_config_regs(hw, &hw->cmq.csq);
|
|
+ hclge_comm_cmd_config_regs(hw, &hw->cmq.crq);
|
|
+}
|
|
+
|
|
+void hclge_comm_cmd_reuse_desc(struct hclge_desc *desc, bool is_read)
|
|
+{
|
|
+ desc->flag = cpu_to_le16(HCLGE_COMM_CMD_FLAG_NO_INTR |
|
|
+ HCLGE_COMM_CMD_FLAG_IN);
|
|
+ if (is_read)
|
|
+ desc->flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_WR);
|
|
+ else
|
|
+ desc->flag &= cpu_to_le16(~HCLGE_COMM_CMD_FLAG_WR);
|
|
+}
|
|
+
|
|
+static void hclge_comm_set_default_capability(struct hnae3_ae_dev *ae_dev,
|
|
+ bool is_pf)
|
|
+{
|
|
+ set_bit(HNAE3_DEV_SUPPORT_GRO_B, ae_dev->caps);
|
|
+ if (is_pf) {
|
|
+ set_bit(HNAE3_DEV_SUPPORT_FD_B, ae_dev->caps);
|
|
+ set_bit(HNAE3_DEV_SUPPORT_FEC_B, ae_dev->caps);
|
|
+ set_bit(HNAE3_DEV_SUPPORT_PAUSE_B, ae_dev->caps);
|
|
+ }
|
|
+}
|
|
+
|
|
+void hclge_comm_cmd_setup_basic_desc(struct hclge_desc *desc,
|
|
+ enum hclge_opcode_type opcode,
|
|
+ bool is_read)
|
|
+{
|
|
+ memset((void *)desc, 0, sizeof(struct hclge_desc));
|
|
+ desc->opcode = cpu_to_le16(opcode);
|
|
+ desc->flag = cpu_to_le16(HCLGE_COMM_CMD_FLAG_NO_INTR |
|
|
+ HCLGE_COMM_CMD_FLAG_IN);
|
|
+
|
|
+ if (is_read)
|
|
+ desc->flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_WR);
|
|
+}
|
|
+
|
|
+int hclge_comm_firmware_compat_config(struct hnae3_ae_dev *ae_dev,
|
|
+ struct hclge_comm_hw *hw, bool en)
|
|
+{
|
|
+ struct hclge_comm_firmware_compat_cmd *req;
|
|
+ struct hclge_desc desc;
|
|
+ u32 compat = 0;
|
|
+
|
|
+ hclge_comm_cmd_setup_basic_desc(&desc, HCLGE_OPC_IMP_COMPAT_CFG, false);
|
|
+
|
|
+ if (en) {
|
|
+ req = (struct hclge_comm_firmware_compat_cmd *)desc.data;
|
|
+
|
|
+ hnae3_set_bit(compat, HCLGE_COMM_LINK_EVENT_REPORT_EN_B, 1);
|
|
+ hnae3_set_bit(compat, HCLGE_COMM_NCSI_ERROR_REPORT_EN_B, 1);
|
|
+ if (hclge_comm_dev_phy_imp_supported(ae_dev))
|
|
+ hnae3_set_bit(compat, HCLGE_COMM_PHY_IMP_EN_B, 1);
|
|
+ hnae3_set_bit(compat, HCLGE_COMM_MAC_STATS_EXT_EN_B, 1);
|
|
+ hnae3_set_bit(compat, HCLGE_COMM_SYNC_RX_RING_HEAD_EN_B, 1);
|
|
+ hnae3_set_bit(compat, HCLGE_COMM_LLRS_FEC_EN_B, 1);
|
|
+
|
|
+ req->compat = cpu_to_le32(compat);
|
|
+ }
|
|
+
|
|
+ return hclge_comm_cmd_send(hw, &desc, 1);
|
|
+}
|
|
+
|
|
+void hclge_comm_free_cmd_desc(struct hclge_comm_cmq_ring *ring)
|
|
+{
|
|
+ int size = ring->desc_num * sizeof(struct hclge_desc);
|
|
+
|
|
+ if (!ring->desc)
|
|
+ return;
|
|
+
|
|
+ dma_free_coherent(&ring->pdev->dev, size,
|
|
+ ring->desc, ring->desc_dma_addr);
|
|
+ ring->desc = NULL;
|
|
+}
|
|
+
|
|
+static int hclge_comm_alloc_cmd_desc(struct hclge_comm_cmq_ring *ring)
|
|
+{
|
|
+ int size = ring->desc_num * sizeof(struct hclge_desc);
|
|
+
|
|
+ ring->desc = dma_alloc_coherent(&ring->pdev->dev,
|
|
+ size, &ring->desc_dma_addr, GFP_KERNEL);
|
|
+ if (!ring->desc)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static __le32 hclge_comm_build_api_caps(void)
|
|
+{
|
|
+ u32 api_caps = 0;
|
|
+
|
|
+ hnae3_set_bit(api_caps, HCLGE_COMM_API_CAP_FLEX_RSS_TBL_B, 1);
|
|
+
|
|
+ return cpu_to_le32(api_caps);
|
|
+}
|
|
+
|
|
+static const struct hclge_comm_caps_bit_map hclge_pf_cmd_caps[] = {
|
|
+ {HCLGE_COMM_CAP_UDP_GSO_B, HNAE3_DEV_SUPPORT_UDP_GSO_B},
|
|
+ {HCLGE_COMM_CAP_PTP_B, HNAE3_DEV_SUPPORT_PTP_B},
|
|
+ {HCLGE_COMM_CAP_INT_QL_B, HNAE3_DEV_SUPPORT_INT_QL_B},
|
|
+ {HCLGE_COMM_CAP_TQP_TXRX_INDEP_B, HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B},
|
|
+ {HCLGE_COMM_CAP_HW_TX_CSUM_B, HNAE3_DEV_SUPPORT_HW_TX_CSUM_B},
|
|
+ {HCLGE_COMM_CAP_UDP_TUNNEL_CSUM_B, HNAE3_DEV_SUPPORT_UDP_TUNNEL_CSUM_B},
|
|
+ {HCLGE_COMM_CAP_FD_FORWARD_TC_B, HNAE3_DEV_SUPPORT_FD_FORWARD_TC_B},
|
|
+ {HCLGE_COMM_CAP_FEC_B, HNAE3_DEV_SUPPORT_FEC_B},
|
|
+ {HCLGE_COMM_CAP_PAUSE_B, HNAE3_DEV_SUPPORT_PAUSE_B},
|
|
+ {HCLGE_COMM_CAP_PHY_IMP_B, HNAE3_DEV_SUPPORT_PHY_IMP_B},
|
|
+ {HCLGE_COMM_CAP_QB_B, HNAE3_DEV_SUPPORT_QB_B},
|
|
+ {HCLGE_COMM_CAP_TX_PUSH_B, HNAE3_DEV_SUPPORT_TX_PUSH_B},
|
|
+ {HCLGE_COMM_CAP_RAS_IMP_B, HNAE3_DEV_SUPPORT_RAS_IMP_B},
|
|
+ {HCLGE_COMM_CAP_RXD_ADV_LAYOUT_B, HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B},
|
|
+ {HCLGE_COMM_CAP_PORT_VLAN_BYPASS_B,
|
|
+ HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B},
|
|
+ {HCLGE_COMM_CAP_PORT_VLAN_BYPASS_B, HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B},
|
|
+ {HCLGE_COMM_CAP_CQ_B, HNAE3_DEV_SUPPORT_CQ_B},
|
|
+ {HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B},
|
|
+ {HCLGE_COMM_CAP_FD_B, HNAE3_DEV_SUPPORT_FD_B},
|
|
+ {HCLGE_COMM_CAP_LANE_NUM_B, HNAE3_DEV_SUPPORT_LANE_NUM_B},
|
|
+ {HCLGE_COMM_CAP_WOL_B, HNAE3_DEV_SUPPORT_WOL_B},
|
|
+};
|
|
+
|
|
+static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = {
|
|
+ {HCLGE_COMM_CAP_UDP_GSO_B, HNAE3_DEV_SUPPORT_UDP_GSO_B},
|
|
+ {HCLGE_COMM_CAP_INT_QL_B, HNAE3_DEV_SUPPORT_INT_QL_B},
|
|
+ {HCLGE_COMM_CAP_TQP_TXRX_INDEP_B, HNAE3_DEV_SUPPORT_TQP_TXRX_INDEP_B},
|
|
+ {HCLGE_COMM_CAP_HW_TX_CSUM_B, HNAE3_DEV_SUPPORT_HW_TX_CSUM_B},
|
|
+ {HCLGE_COMM_CAP_UDP_TUNNEL_CSUM_B, HNAE3_DEV_SUPPORT_UDP_TUNNEL_CSUM_B},
|
|
+ {HCLGE_COMM_CAP_QB_B, HNAE3_DEV_SUPPORT_QB_B},
|
|
+ {HCLGE_COMM_CAP_TX_PUSH_B, HNAE3_DEV_SUPPORT_TX_PUSH_B},
|
|
+ {HCLGE_COMM_CAP_RXD_ADV_LAYOUT_B, HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B},
|
|
+ {HCLGE_COMM_CAP_CQ_B, HNAE3_DEV_SUPPORT_CQ_B},
|
|
+ {HCLGE_COMM_CAP_GRO_B, HNAE3_DEV_SUPPORT_GRO_B},
|
|
+};
|
|
+
|
|
+static void
|
|
+hclge_comm_parse_capability(struct hnae3_ae_dev *ae_dev, bool is_pf,
|
|
+ struct hclge_comm_query_version_cmd *cmd)
|
|
+{
|
|
+ const struct hclge_comm_caps_bit_map *caps_map =
|
|
+ is_pf ? hclge_pf_cmd_caps : hclge_vf_cmd_caps;
|
|
+ u32 size = is_pf ? ARRAY_SIZE(hclge_pf_cmd_caps) :
|
|
+ ARRAY_SIZE(hclge_vf_cmd_caps);
|
|
+ u32 caps, i;
|
|
+
|
|
+ caps = __le32_to_cpu(cmd->caps[0]);
|
|
+ for (i = 0; i < size; i++)
|
|
+ if (hnae3_get_bit(caps, caps_map[i].imp_bit))
|
|
+ set_bit(caps_map[i].local_bit, ae_dev->caps);
|
|
+}
|
|
+
|
|
+int hclge_comm_alloc_cmd_queue(struct hclge_comm_hw *hw, int ring_type)
|
|
+{
|
|
+ struct hclge_comm_cmq_ring *ring =
|
|
+ (ring_type == HCLGE_COMM_TYPE_CSQ) ? &hw->cmq.csq :
|
|
+ &hw->cmq.crq;
|
|
+ int ret;
|
|
+
|
|
+ ring->ring_type = ring_type;
|
|
+
|
|
+ ret = hclge_comm_alloc_cmd_desc(ring);
|
|
+ if (ret)
|
|
+ dev_err(&ring->pdev->dev, "descriptor %s alloc error %d\n",
|
|
+ (ring_type == HCLGE_COMM_TYPE_CSQ) ? "CSQ" : "CRQ",
|
|
+ ret);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+int hclge_comm_cmd_query_version_and_capability(struct hnae3_ae_dev *ae_dev,
|
|
+ struct hclge_comm_hw *hw,
|
|
+ u32 *fw_version, bool is_pf)
|
|
+{
|
|
+ struct hclge_comm_query_version_cmd *resp;
|
|
+ struct hclge_desc desc;
|
|
+ int ret;
|
|
+
|
|
+ hclge_comm_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_FW_VER, 1);
|
|
+ resp = (struct hclge_comm_query_version_cmd *)desc.data;
|
|
+ resp->api_caps = hclge_comm_build_api_caps();
|
|
+
|
|
+ ret = hclge_comm_cmd_send(hw, &desc, 1);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ *fw_version = le32_to_cpu(resp->firmware);
|
|
+
|
|
+ ae_dev->dev_version = le32_to_cpu(resp->hardware) <<
|
|
+ HNAE3_PCI_REVISION_BIT_SIZE;
|
|
+ ae_dev->dev_version |= ae_dev->pdev->revision;
|
|
|
|
for (i = 0; i < size; i++) {
|
|
if (spec_opcode[i] == opcode)
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
|
|
index ea30d94c081c..13562209f74d 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
|
|
@@ -5,6 +5,7 @@
|
|
#define __HCLGE_COMM_CMD_H
|
|
#include <linux/types.h>
|
|
|
|
+#include "hclge_cmd.h"
|
|
#include "hnae3.h"
|
|
|
|
#define HCLGE_COMM_CMD_FLAG_IN BIT(0)
|
|
@@ -36,6 +37,27 @@
|
|
#define HCLGE_COMM_NIC_CSQ_DEPTH_REG 0x27008
|
|
#define HCLGE_COMM_NIC_CSQ_TAIL_REG 0x27010
|
|
#define HCLGE_COMM_NIC_CSQ_HEAD_REG 0x27014
|
|
+#define HCLGE_COMM_NIC_CRQ_BASEADDR_L_REG 0x27018
|
|
+#define HCLGE_COMM_NIC_CRQ_BASEADDR_H_REG 0x2701C
|
|
+#define HCLGE_COMM_NIC_CRQ_DEPTH_REG 0x27020
|
|
+#define HCLGE_COMM_NIC_CRQ_TAIL_REG 0x27024
|
|
+#define HCLGE_COMM_NIC_CRQ_HEAD_REG 0x27028
|
|
+/* Vector0 interrupt CMDQ event source register(RW) */
|
|
+#define HCLGE_COMM_VECTOR0_CMDQ_SRC_REG 0x27100
|
|
+/* Vector0 interrupt CMDQ event status register(RO) */
|
|
+#define HCLGE_COMM_VECTOR0_CMDQ_STATE_REG 0x27104
|
|
+#define HCLGE_COMM_CMDQ_INTR_EN_REG 0x27108
|
|
+#define HCLGE_COMM_CMDQ_INTR_GEN_REG 0x2710C
|
|
+#define HCLGE_COMM_CMDQ_INTR_STS_REG 0x27104
|
|
+
|
|
+/* this bit indicates that the driver is ready for hardware reset */
|
|
+#define HCLGE_COMM_NIC_SW_RST_RDY_B 16
|
|
+#define HCLGE_COMM_NIC_SW_RST_RDY BIT(HCLGE_COMM_NIC_SW_RST_RDY_B)
|
|
+#define HCLGE_COMM_NIC_CMQ_DESC_NUM_S 3
|
|
+#define HCLGE_COMM_NIC_CMQ_DESC_NUM 1024
|
|
+#define HCLGE_COMM_CMDQ_TX_TIMEOUT 30000
|
|
+
|
|
+enum hclge_opcode_type;
|
|
|
|
enum hclge_comm_cmd_return_status {
|
|
HCLGE_COMM_CMD_EXEC_SUCCESS = 0,
|
|
@@ -52,18 +74,49 @@ enum hclge_comm_cmd_return_status {
|
|
HCLGE_COMM_CMD_INVALID = 11,
|
|
};
|
|
|
|
-enum hclge_comm_special_cmd {
|
|
- HCLGE_COMM_OPC_STATS_64_BIT = 0x0030,
|
|
- HCLGE_COMM_OPC_STATS_32_BIT = 0x0031,
|
|
- HCLGE_COMM_OPC_STATS_MAC = 0x0032,
|
|
- HCLGE_COMM_OPC_STATS_MAC_ALL = 0x0034,
|
|
- HCLGE_COMM_OPC_QUERY_32_BIT_REG = 0x0041,
|
|
- HCLGE_COMM_OPC_QUERY_64_BIT_REG = 0x0042,
|
|
- HCLGE_COMM_QUERY_CLEAR_MPF_RAS_INT = 0x1511,
|
|
- HCLGE_COMM_QUERY_CLEAR_PF_RAS_INT = 0x1512,
|
|
- HCLGE_COMM_QUERY_CLEAR_ALL_MPF_MSIX_INT = 0x1514,
|
|
- HCLGE_COMM_QUERY_CLEAR_ALL_PF_MSIX_INT = 0x1515,
|
|
- HCLGE_COMM_QUERY_ALL_ERR_INFO = 0x1517,
|
|
+enum HCLGE_COMM_CAP_BITS {
|
|
+ HCLGE_COMM_CAP_UDP_GSO_B,
|
|
+ HCLGE_COMM_CAP_QB_B,
|
|
+ HCLGE_COMM_CAP_FD_FORWARD_TC_B,
|
|
+ HCLGE_COMM_CAP_PTP_B,
|
|
+ HCLGE_COMM_CAP_INT_QL_B,
|
|
+ HCLGE_COMM_CAP_HW_TX_CSUM_B,
|
|
+ HCLGE_COMM_CAP_TX_PUSH_B,
|
|
+ HCLGE_COMM_CAP_PHY_IMP_B,
|
|
+ HCLGE_COMM_CAP_TQP_TXRX_INDEP_B,
|
|
+ HCLGE_COMM_CAP_HW_PAD_B,
|
|
+ HCLGE_COMM_CAP_STASH_B,
|
|
+ HCLGE_COMM_CAP_UDP_TUNNEL_CSUM_B,
|
|
+ HCLGE_COMM_CAP_RAS_IMP_B = 12,
|
|
+ HCLGE_COMM_CAP_FEC_B = 13,
|
|
+ HCLGE_COMM_CAP_PAUSE_B = 14,
|
|
+ HCLGE_COMM_CAP_RXD_ADV_LAYOUT_B = 15,
|
|
+ HCLGE_COMM_CAP_PORT_VLAN_BYPASS_B = 17,
|
|
+ HCLGE_COMM_CAP_CQ_B = 18,
|
|
+ HCLGE_COMM_CAP_GRO_B = 20,
|
|
+ HCLGE_COMM_CAP_FD_B = 21,
|
|
+ HCLGE_COMM_CAP_LANE_NUM_B = 27,
|
|
+ HCLGE_COMM_CAP_WOL_B = 28,
|
|
+};
|
|
+
|
|
+enum HCLGE_COMM_API_CAP_BITS {
|
|
+ HCLGE_COMM_API_CAP_FLEX_RSS_TBL_B,
|
|
+};
|
|
+
|
|
+enum hclge_comm_opcode_type {
|
|
+ HCLGE_COMM_OPC_QUERY_FW_VER = 0x0001,
|
|
+ HCLGE_COMM_OPC_IMP_COMPAT_CFG = 0x701A,
|
|
+};
|
|
+
|
|
+/* capabilities bits map between imp firmware and local driver */
|
|
+struct hclge_comm_caps_bit_map {
|
|
+ u16 imp_bit;
|
|
+ u16 local_bit;
|
|
+};
|
|
+
|
|
+struct hclge_comm_firmware_compat_cmd {
|
|
+ __le32 compat;
|
|
+ u8 rsv[20];
|
|
};
|
|
|
|
enum hclge_comm_cmd_state {
|
|
@@ -137,7 +190,17 @@ static inline u32 hclge_comm_read_reg(u8 __iomem *base, u32 reg)
|
|
#define hclge_comm_read_dev(a, reg) \
|
|
hclge_comm_read_reg((a)->io_base, reg)
|
|
|
|
+void hclge_comm_cmd_init_regs(struct hclge_comm_hw *hw);
|
|
+int hclge_comm_cmd_query_version_and_capability(struct hnae3_ae_dev *ae_dev,
|
|
+ struct hclge_comm_hw *hw,
|
|
+ u32 *fw_version, bool is_pf);
|
|
+int hclge_comm_alloc_cmd_queue(struct hclge_comm_hw *hw, int ring_type);
|
|
int hclge_comm_cmd_send(struct hclge_comm_hw *hw, struct hclge_desc *desc,
|
|
int num, bool is_pf);
|
|
-
|
|
+int hclge_comm_firmware_compat_config(struct hnae3_ae_dev *ae_dev,
|
|
+ struct hclge_comm_hw *hw, bool en);
|
|
+void hclge_comm_free_cmd_desc(struct hclge_comm_cmq_ring *ring);
|
|
+void hclge_comm_cmd_setup_basic_desc(struct hclge_desc *desc,
|
|
+ enum hclge_opcode_type opcode,
|
|
+ bool is_read);
|
|
#endif
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
index c2c7e94d0467..52d448686a06 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
@@ -1968,6 +1968,31 @@ static int hns3_get_link_ext_state(struct net_device *netdev,
|
|
return -ENODATA;
|
|
}
|
|
|
|
+static void hns3_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
|
+{
|
|
+ struct hnae3_handle *handle = hns3_get_handle(netdev);
|
|
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
|
+ const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
|
|
+
|
|
+ if (!hnae3_ae_dev_wol_supported(ae_dev) || !ops->get_wol)
|
|
+ return;
|
|
+
|
|
+ ops->get_wol(handle, wol);
|
|
+}
|
|
+
|
|
+static int hns3_set_wol(struct net_device *netdev,
|
|
+ struct ethtool_wolinfo *wol)
|
|
+{
|
|
+ struct hnae3_handle *handle = hns3_get_handle(netdev);
|
|
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
|
|
+ const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
|
|
+
|
|
+ if (!hnae3_ae_dev_wol_supported(ae_dev) || !ops->set_wol)
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
+ return ops->set_wol(handle, wol);
|
|
+}
|
|
+
|
|
static const struct ethtool_ops hns3vf_ethtool_ops = {
|
|
.supported_coalesce_params = HNS3_ETHTOOL_COALESCE,
|
|
.supported_ring_params = HNS3_ETHTOOL_RING,
|
|
@@ -2042,6 +2067,8 @@ static const struct ethtool_ops hns3_ethtool_ops = {
|
|
.set_tunable = hns3_set_tunable,
|
|
.reset = hns3_set_reset,
|
|
.get_link_ext_state = hns3_get_link_ext_state,
|
|
+ .get_wol = hns3_get_wol,
|
|
+ .set_wol = hns3_set_wol,
|
|
};
|
|
|
|
void hns3_ethtool_set_ops(struct net_device *netdev)
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
index 71cf6ad71427..1785eb6b0f33 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
@@ -312,6 +312,8 @@ enum hclge_opcode_type {
|
|
HCLGE_PPP_CMD1_INT_CMD = 0x2101,
|
|
HCLGE_PPP_MAC_VLAN_IDX_RD = 0x2104,
|
|
HCLGE_MAC_ETHERTYPE_IDX_RD = 0x2105,
|
|
+ HCLGE_OPC_WOL_CFG = 0x2200,
|
|
+ HCLGE_OPC_WOL_GET_SUPPORTED_MODE = 0x2201,
|
|
HCLGE_NCSI_INT_EN = 0x2401,
|
|
|
|
/* PHY command */
|
|
@@ -1275,6 +1277,29 @@ static inline u32 hclge_read_reg(u8 __iomem *base, u32 reg)
|
|
|
|
#define HCLGE_SEND_SYNC(flag) \
|
|
((flag) & HCLGE_CMD_FLAG_NO_INTR)
|
|
+enum HCLGE_WOL_MODE {
|
|
+ HCLGE_WOL_PHY = BIT(0),
|
|
+ HCLGE_WOL_UNICAST = BIT(1),
|
|
+ HCLGE_WOL_MULTICAST = BIT(2),
|
|
+ HCLGE_WOL_BROADCAST = BIT(3),
|
|
+ HCLGE_WOL_ARP = BIT(4),
|
|
+ HCLGE_WOL_MAGIC = BIT(5),
|
|
+ HCLGE_WOL_MAGICSECURED = BIT(6),
|
|
+ HCLGE_WOL_FILTER = BIT(7),
|
|
+ HCLGE_WOL_DISABLE = 0,
|
|
+};
|
|
+
|
|
+struct hclge_wol_cfg_cmd {
|
|
+ __le32 wake_on_lan_mode;
|
|
+ u8 sopass[SOPASS_MAX];
|
|
+ u8 sopass_size;
|
|
+ u8 rsv[13];
|
|
+};
|
|
+
|
|
+struct hclge_query_wol_supported_cmd {
|
|
+ __le32 supported_wake_mode;
|
|
+ u8 rsv[20];
|
|
+};
|
|
|
|
struct hclge_hw;
|
|
int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num);
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
index 970012a36c14..bbc63c47d0df 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
@@ -11127,6 +11127,199 @@ static void hclge_clear_hw_resource(struct hclge_dev *hdev)
|
|
"clear hw resource incomplete, ret = %d\n", ret);
|
|
}
|
|
|
|
+static __u32 hclge_wol_mode_to_ethtool(u32 mode)
|
|
+{
|
|
+ __u32 ret = 0;
|
|
+
|
|
+ if (mode & HCLGE_WOL_PHY)
|
|
+ ret |= WAKE_PHY;
|
|
+
|
|
+ if (mode & HCLGE_WOL_UNICAST)
|
|
+ ret |= WAKE_UCAST;
|
|
+
|
|
+ if (mode & HCLGE_WOL_MULTICAST)
|
|
+ ret |= WAKE_MCAST;
|
|
+
|
|
+ if (mode & HCLGE_WOL_BROADCAST)
|
|
+ ret |= WAKE_BCAST;
|
|
+
|
|
+ if (mode & HCLGE_WOL_ARP)
|
|
+ ret |= WAKE_ARP;
|
|
+
|
|
+ if (mode & HCLGE_WOL_MAGIC)
|
|
+ ret |= WAKE_MAGIC;
|
|
+
|
|
+ if (mode & HCLGE_WOL_MAGICSECURED)
|
|
+ ret |= WAKE_MAGICSECURE;
|
|
+
|
|
+ if (mode & HCLGE_WOL_FILTER)
|
|
+ ret |= WAKE_FILTER;
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static u32 hclge_wol_mode_from_ethtool(__u32 mode)
|
|
+{
|
|
+ u32 ret = HCLGE_WOL_DISABLE;
|
|
+
|
|
+ if (mode & WAKE_PHY)
|
|
+ ret |= HCLGE_WOL_PHY;
|
|
+
|
|
+ if (mode & WAKE_UCAST)
|
|
+ ret |= HCLGE_WOL_UNICAST;
|
|
+
|
|
+ if (mode & WAKE_MCAST)
|
|
+ ret |= HCLGE_WOL_MULTICAST;
|
|
+
|
|
+ if (mode & WAKE_BCAST)
|
|
+ ret |= HCLGE_WOL_BROADCAST;
|
|
+
|
|
+ if (mode & WAKE_ARP)
|
|
+ ret |= HCLGE_WOL_ARP;
|
|
+
|
|
+ if (mode & WAKE_MAGIC)
|
|
+ ret |= HCLGE_WOL_MAGIC;
|
|
+
|
|
+ if (mode & WAKE_MAGICSECURE)
|
|
+ ret |= HCLGE_WOL_MAGICSECURED;
|
|
+
|
|
+ if (mode & WAKE_FILTER)
|
|
+ ret |= HCLGE_WOL_FILTER;
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+int hclge_get_wol_supported_mode(struct hclge_dev *hdev, u32 *wol_supported)
|
|
+{
|
|
+ struct hclge_query_wol_supported_cmd *wol_supported_cmd;
|
|
+ struct hclge_desc desc;
|
|
+ int ret;
|
|
+
|
|
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_WOL_GET_SUPPORTED_MODE,
|
|
+ true);
|
|
+ wol_supported_cmd = (struct hclge_query_wol_supported_cmd *)&desc.data;
|
|
+
|
|
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
|
+ if (ret) {
|
|
+ dev_err(&hdev->pdev->dev,
|
|
+ "failed to query wol supported, ret = %d\n", ret);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ *wol_supported = le32_to_cpu(wol_supported_cmd->supported_wake_mode);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+int hclge_get_wol_cfg(struct hclge_dev *hdev, u32 *mode)
|
|
+{
|
|
+ struct hclge_wol_cfg_cmd *wol_cfg_cmd;
|
|
+ struct hclge_desc desc;
|
|
+ int ret;
|
|
+
|
|
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_WOL_CFG, true);
|
|
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
|
+ if (ret) {
|
|
+ dev_err(&hdev->pdev->dev,
|
|
+ "failed to get wol config, ret = %d\n", ret);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ wol_cfg_cmd = (struct hclge_wol_cfg_cmd *)&desc.data;
|
|
+ *mode = le32_to_cpu(wol_cfg_cmd->wake_on_lan_mode);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int hclge_set_wol_cfg(struct hclge_dev *hdev,
|
|
+ struct hclge_wol_info *wol_info)
|
|
+{
|
|
+ struct hclge_wol_cfg_cmd *wol_cfg_cmd;
|
|
+ struct hclge_desc desc;
|
|
+ int ret;
|
|
+
|
|
+ hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_WOL_CFG, false);
|
|
+ wol_cfg_cmd = (struct hclge_wol_cfg_cmd *)&desc.data;
|
|
+ wol_cfg_cmd->wake_on_lan_mode = cpu_to_le32(wol_info->wol_current_mode);
|
|
+ wol_cfg_cmd->sopass_size = wol_info->wol_sopass_size;
|
|
+ memcpy(&wol_cfg_cmd->sopass, wol_info->wol_sopass, SOPASS_MAX);
|
|
+
|
|
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
|
+ if (ret)
|
|
+ dev_err(&hdev->pdev->dev,
|
|
+ "failed to set wol config, ret = %d\n", ret);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static int hclge_update_wol(struct hclge_dev *hdev)
|
|
+{
|
|
+ struct hclge_wol_info *wol_info = &hdev->hw.mac.wol;
|
|
+
|
|
+ if (!hnae3_ae_dev_wol_supported(hdev->ae_dev))
|
|
+ return 0;
|
|
+
|
|
+ return hclge_set_wol_cfg(hdev, wol_info);
|
|
+}
|
|
+
|
|
+static int hclge_init_wol(struct hclge_dev *hdev)
|
|
+{
|
|
+ struct hclge_wol_info *wol_info = &hdev->hw.mac.wol;
|
|
+ int ret;
|
|
+
|
|
+ if (!hnae3_ae_dev_wol_supported(hdev->ae_dev))
|
|
+ return 0;
|
|
+
|
|
+ memset(wol_info, 0, sizeof(struct hclge_wol_info));
|
|
+ ret = hclge_get_wol_supported_mode(hdev,
|
|
+ &wol_info->wol_support_mode);
|
|
+ if (ret) {
|
|
+ wol_info->wol_support_mode = HCLGE_WOL_DISABLE;
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ return hclge_update_wol(hdev);
|
|
+}
|
|
+
|
|
+static void hclge_get_wol(struct hnae3_handle *handle,
|
|
+ struct ethtool_wolinfo *wol)
|
|
+{
|
|
+ struct hclge_vport *vport = hclge_get_vport(handle);
|
|
+ struct hclge_dev *hdev = vport->back;
|
|
+ struct hclge_wol_info *wol_info = &hdev->hw.mac.wol;
|
|
+
|
|
+ wol->supported = hclge_wol_mode_to_ethtool(wol_info->wol_support_mode);
|
|
+ wol->wolopts =
|
|
+ hclge_wol_mode_to_ethtool(wol_info->wol_current_mode);
|
|
+ if (wol_info->wol_current_mode & HCLGE_WOL_MAGICSECURED)
|
|
+ memcpy(&wol->sopass, wol_info->wol_sopass, SOPASS_MAX);
|
|
+}
|
|
+
|
|
+static int hclge_set_wol(struct hnae3_handle *handle,
|
|
+ struct ethtool_wolinfo *wol)
|
|
+{
|
|
+ struct hclge_vport *vport = hclge_get_vport(handle);
|
|
+ struct hclge_dev *hdev = vport->back;
|
|
+ struct hclge_wol_info *wol_info = &hdev->hw.mac.wol;
|
|
+ u32 wol_supported;
|
|
+ u32 wol_mode;
|
|
+
|
|
+ wol_supported = hclge_wol_mode_from_ethtool(wol->supported);
|
|
+ wol_mode = hclge_wol_mode_from_ethtool(wol->wolopts);
|
|
+ if (wol_mode & ~wol_supported)
|
|
+ return -EINVAL;
|
|
+
|
|
+ wol_info->wol_current_mode = wol_mode;
|
|
+ if (wol_mode & HCLGE_WOL_MAGICSECURED) {
|
|
+ memcpy(wol_info->wol_sopass, &wol->sopass, SOPASS_MAX);
|
|
+ wol_info->wol_sopass_size = SOPASS_MAX;
|
|
+ } else {
|
|
+ wol_info->wol_sopass_size = 0;
|
|
+ }
|
|
+
|
|
+ return hclge_set_wol_cfg(hdev, wol_info);
|
|
+}
|
|
+
|
|
static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
|
{
|
|
struct pci_dev *pdev = ae_dev->pdev;
|
|
@@ -11313,6 +11506,11 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
|
/* Enable MISC vector(vector0) */
|
|
hclge_enable_vector(&hdev->misc_vector, true);
|
|
|
|
+ ret = hclge_init_wol(hdev);
|
|
+ if (ret)
|
|
+ dev_warn(&pdev->dev,
|
|
+ "failed to wake on lan init, ret = %d\n", ret);
|
|
+
|
|
hclge_state_init(hdev);
|
|
hdev->last_reset_time = jiffies;
|
|
|
|
@@ -11693,6 +11891,8 @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev)
|
|
ae_dev->ops->ext_reset_done(&hdev->vport->nic);
|
|
#endif
|
|
|
|
+ (void)hclge_update_wol(hdev);
|
|
+
|
|
dev_info(&pdev->dev, "Reset done, %s driver initialization finished.\n",
|
|
HCLGE_DRIVER_NAME);
|
|
|
|
@@ -12651,6 +12851,8 @@ struct hnae3_ae_ops hclge_ops = {
|
|
.get_rx_hwts = hclge_ptp_get_rx_hwts,
|
|
.get_ts_info = hclge_ptp_get_ts_info,
|
|
.get_link_diagnosis_info = hclge_get_link_diagnosis_info,
|
|
+ .get_wol = hclge_get_wol,
|
|
+ .set_wol = hclge_set_wol,
|
|
};
|
|
|
|
static struct hnae3_ae_algo ae_algo = {
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
index 4924aaad757d..9d739033daab 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
@@ -277,6 +277,13 @@ enum HCLGE_MAC_DUPLEX {
|
|
#define QUERY_SFP_SPEED 0
|
|
#define QUERY_ACTIVE_SPEED 1
|
|
|
|
+struct hclge_wol_info {
|
|
+ u32 wol_support_mode; /* store the wake on lan info */
|
|
+ u32 wol_current_mode;
|
|
+ u8 wol_sopass[SOPASS_MAX];
|
|
+ u8 wol_sopass_size;
|
|
+};
|
|
+
|
|
struct hclge_mac {
|
|
u8 mac_id;
|
|
u8 phy_addr;
|
|
@@ -296,7 +303,8 @@ struct hclge_mac {
|
|
u32 fec_mode; /* active fec mode */
|
|
u32 user_fec_mode;
|
|
u32 fec_ability;
|
|
- int link; /* store the link status of mac & phy (if phy exit) */
|
|
+ int link; /* store the link status of mac & phy (if phy exists) */
|
|
+ struct hclge_wol_info wol;
|
|
struct phy_device *phydev;
|
|
struct mii_bus *mdio_bus;
|
|
phy_interface_t phy_if;
|
|
@@ -1155,4 +1163,9 @@ int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len);
|
|
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_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);
|
|
+int hclge_get_wol_supported_mode(struct hclge_dev *hdev, u32 *wol_supported);
|
|
+int hclge_get_wol_cfg(struct hclge_dev *hdev, u32 *mode);
|
|
#endif
|
|
--
|
|
2.34.1
|
|
|