693 lines
27 KiB
Diff
693 lines
27 KiB
Diff
From acbb6b40a74fc79a356273a4ade6e30e7f5a82f8 Mon Sep 17 00:00:00 2001
|
|
From: Huazhong Tan <tanhuazhong@huawei.com>
|
|
Date: Thu, 15 Jun 2023 14:40:50 +0800
|
|
Subject: [PATCH] net: hns3: add device version to replace pci revision
|
|
|
|
mainline inclusion
|
|
from mainline-v5.10-rc1
|
|
commit 295ba232a8c3c5547f9fb470a62f3585025ccd00
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMQV
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=295ba232a8c3c5547f9fb470a62f3585025ccd00
|
|
|
|
--------------------------------
|
|
|
|
To better identify the device version, struct hnae3_handle adds a
|
|
member dev_version to replace pci revision. The dev_version consists
|
|
of hardware version and PCI revision. The hardware version is queried
|
|
from firmware by an existing firmware version query command.
|
|
|
|
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
|
Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
---
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 7 ++++
|
|
.../net/ethernet/hisilicon/hns3/hns3_enet.c | 7 ++--
|
|
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 30 +++++++++-----
|
|
.../hisilicon/hns3/hns3pf/hclge_cmd.c | 38 ++++++++++--------
|
|
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 3 +-
|
|
.../hisilicon/hns3/hns3pf/hclge_err.c | 13 +++---
|
|
.../hisilicon/hns3/hns3pf/hclge_main.c | 33 +++++++--------
|
|
.../hisilicon/hns3/hns3vf/hclgevf_cmd.c | 40 ++++++++++---------
|
|
.../hisilicon/hns3/hns3vf/hclgevf_cmd.h | 3 +-
|
|
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 17 ++++----
|
|
10 files changed, 110 insertions(+), 81 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
index 19a8f315aa43..971239db844a 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
@@ -36,6 +36,12 @@
|
|
|
|
#define HNAE3_MIN_VECTOR_NUM 2 /* first one for misc, another for IO */
|
|
|
|
+/* Device version */
|
|
+#define HNAE3_DEVICE_VERSION_V1 0x00020
|
|
+#define HNAE3_DEVICE_VERSION_V2 0x00021
|
|
+#define HNAE3_DEVICE_VERSION_V3 0x00030
|
|
+
|
|
+#define HNAE3_PCI_REVISION_BIT_SIZE 8
|
|
/* Device IDs */
|
|
#define HNAE3_DEV_ID_GE 0xA220
|
|
#define HNAE3_DEV_ID_25GE 0xA221
|
|
@@ -288,6 +294,7 @@ struct hnae3_ae_dev {
|
|
struct list_head node;
|
|
u32 flag;
|
|
unsigned long hw_err_reset_req;
|
|
+ u32 dev_version;
|
|
void *priv;
|
|
};
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
index 8279aa124ac9..3784001b09a7 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
@@ -2165,7 +2165,7 @@ static void hns3_disable_sriov(struct pci_dev *pdev)
|
|
static void hns3_get_dev_capability(struct pci_dev *pdev,
|
|
struct hnae3_ae_dev *ae_dev)
|
|
{
|
|
- if (pdev->revision >= 0x21) {
|
|
+ if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
|
hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_FD_B, 1);
|
|
hnae3_set_bit(ae_dev->flag, HNAE3_DEV_SUPPORT_GRO_B, 1);
|
|
}
|
|
@@ -2424,7 +2424,7 @@ static void hns3_set_default_feature(struct net_device *netdev)
|
|
NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC |
|
|
NETIF_F_FRAGLIST;
|
|
|
|
- if (pdev->revision > HNAE3_REVISION_ID_20) {
|
|
+ if (ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
|
#ifdef NETIF_F_GRO_HW
|
|
netdev->features |= NETIF_F_GRO_HW;
|
|
netdev->hw_features |= NETIF_F_GRO_HW;
|
|
@@ -2930,8 +2930,9 @@ static bool hns3_parse_vlan_tag(struct hns3_enet_ring *ring,
|
|
{
|
|
struct hnae3_handle *handle = ring->tqp->handle;
|
|
struct pci_dev *pdev = ring->tqp->handle->pdev;
|
|
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev);
|
|
|
|
- if (pdev->revision == HNAE3_REVISION_ID_20) {
|
|
+ if (unlikely(ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)) {
|
|
*vlan_tag = le16_to_cpu(desc->rx.ot_vlan_tag);
|
|
if (!(*vlan_tag & VLAN_VID_MASK))
|
|
*vlan_tag = le16_to_cpu(desc->rx.vlan_tag);
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
index 11480bb99055..e38fb6ef3e75 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
@@ -83,6 +83,7 @@ static const struct hns3_stats hns3_rxq_stats[] = {
|
|
static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
|
|
{
|
|
struct hnae3_handle *h = hns3_get_handle(ndev);
|
|
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
|
|
int ret;
|
|
|
|
if (!h->ae_algo->ops->set_loopback ||
|
|
@@ -101,7 +102,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
|
|
break;
|
|
}
|
|
|
|
- if (ret || h->pdev->revision >= 0x21)
|
|
+ if (ret || ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
|
return ret;
|
|
|
|
if (en)
|
|
@@ -149,6 +150,7 @@ static void hns3_lp_setup_skb(struct sk_buff *skb)
|
|
|
|
struct net_device *ndev = skb->dev;
|
|
struct hnae3_handle *handle;
|
|
+ struct hnae3_ae_dev *ae_dev;
|
|
unsigned char *packet;
|
|
struct ethhdr *ethh;
|
|
unsigned int i;
|
|
@@ -170,7 +172,8 @@ static void hns3_lp_setup_skb(struct sk_buff *skb)
|
|
* the purpose of mac or serdes selftest.
|
|
*/
|
|
handle = hns3_get_handle(ndev);
|
|
- if (handle->pdev->revision == 0x20)
|
|
+ ae_dev = pci_get_drvdata(handle->pdev);
|
|
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
ethh->h_dest[5] += HNS3_NIC_LB_DST_MAC_ADDR;
|
|
eth_zero_addr(ethh->h_source);
|
|
ethh->h_proto = htons(ETH_P_ARP);
|
|
@@ -771,6 +774,7 @@ static int hns3_set_link_ksettings(struct net_device *netdev,
|
|
const struct ethtool_link_ksettings *cmd)
|
|
{
|
|
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;
|
|
int ret;
|
|
|
|
@@ -794,7 +798,7 @@ static int hns3_set_link_ksettings(struct net_device *netdev,
|
|
return phy_ethtool_ksettings_set(netdev->phydev, cmd);
|
|
}
|
|
|
|
- if (handle->pdev->revision == 0x20)
|
|
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
return -EOPNOTSUPP;
|
|
|
|
ret = hns3_check_ksettings_param(netdev, cmd);
|
|
@@ -858,11 +862,12 @@ static int hns3_set_rss(struct net_device *netdev, const u32 *indir,
|
|
const u8 *key, const u8 hfunc)
|
|
{
|
|
struct hnae3_handle *h = hns3_get_handle(netdev);
|
|
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
|
|
|
|
if (!h->ae_algo->ops->set_rss)
|
|
return -EOPNOTSUPP;
|
|
|
|
- if ((h->pdev->revision == HNAE3_REVISION_ID_20 &&
|
|
+ if ((ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 &&
|
|
hfunc != ETH_RSS_HASH_TOP) || (hfunc != ETH_RSS_HASH_NO_CHANGE &&
|
|
hfunc != ETH_RSS_HASH_TOP && hfunc != ETH_RSS_HASH_XOR)) {
|
|
netdev_err(netdev, "hash func not supported\n");
|
|
@@ -1055,6 +1060,7 @@ static int hns3_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd)
|
|
static int hns3_nway_reset(struct net_device *netdev)
|
|
{
|
|
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;
|
|
struct phy_device *phy = netdev->phydev;
|
|
int autoneg;
|
|
@@ -1084,7 +1090,7 @@ static int hns3_nway_reset(struct net_device *netdev)
|
|
if (phy)
|
|
return genphy_restart_aneg(phy);
|
|
|
|
- if (handle->pdev->revision == 0x20)
|
|
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
return -EOPNOTSUPP;
|
|
|
|
return ops->restart_autoneg(handle);
|
|
@@ -1374,11 +1380,12 @@ static int hns3_get_fecparam(struct net_device *netdev,
|
|
struct ethtool_fecparam *fec)
|
|
{
|
|
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;
|
|
u8 fec_ability;
|
|
u8 fec_mode;
|
|
|
|
- if (handle->pdev->revision == 0x20)
|
|
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
return -EOPNOTSUPP;
|
|
|
|
if (!ops->get_fec)
|
|
@@ -1396,10 +1403,11 @@ static int hns3_set_fecparam(struct net_device *netdev,
|
|
struct ethtool_fecparam *fec)
|
|
{
|
|
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;
|
|
u32 fec_mode;
|
|
|
|
- if (handle->pdev->revision == 0x20)
|
|
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
return -EOPNOTSUPP;
|
|
|
|
if (!ops->set_fec)
|
|
@@ -1418,11 +1426,13 @@ static int hns3_get_module_info(struct net_device *netdev,
|
|
#define HNS3_SFF_8636_V1_3 0x03
|
|
|
|
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;
|
|
struct hns3_sfp_type sfp_type;
|
|
int ret;
|
|
|
|
- if (handle->pdev->revision == 0x20 || !ops->get_module_eeprom)
|
|
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 ||
|
|
+ !ops->get_module_eeprom)
|
|
return -EOPNOTSUPP;
|
|
|
|
memset(&sfp_type, 0, sizeof(sfp_type));
|
|
@@ -1466,9 +1476,11 @@ static int hns3_get_module_eeprom(struct net_device *netdev,
|
|
struct ethtool_eeprom *ee, u8 *data)
|
|
{
|
|
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 (handle->pdev->revision == 0x20 || !ops->get_module_eeprom)
|
|
+ if (ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 ||
|
|
+ !ops->get_module_eeprom)
|
|
return -EOPNOTSUPP;
|
|
|
|
if (!ee->len)
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
|
index 55bdfd95a0fd..114970c8e21a 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
|
|
@@ -346,9 +346,9 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
|
|
return retval;
|
|
}
|
|
|
|
-static enum hclge_cmd_status hclge_cmd_query_firmware_version(
|
|
- struct hclge_hw *hw, u32 *version)
|
|
+static enum hclge_cmd_status hclge_cmd_query_version(struct hclge_dev *hdev)
|
|
{
|
|
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
|
struct hclge_query_version_cmd *resp;
|
|
struct hclge_desc desc;
|
|
int ret;
|
|
@@ -356,9 +356,15 @@ static enum hclge_cmd_status hclge_cmd_query_firmware_version(
|
|
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_FW_VER, 1);
|
|
resp = (struct hclge_query_version_cmd *)desc.data;
|
|
|
|
- ret = hclge_cmd_send(hw, &desc, 1);
|
|
- if (!ret)
|
|
- *version = le32_to_cpu(resp->firmware);
|
|
+ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ hdev->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 |= hdev->pdev->revision;
|
|
|
|
return ret;
|
|
}
|
|
@@ -426,7 +432,6 @@ static int hclge_firmware_compat_config(struct hclge_dev *hdev, bool en)
|
|
|
|
int hclge_cmd_init(struct hclge_dev *hdev)
|
|
{
|
|
- u32 version;
|
|
int ret;
|
|
|
|
spin_lock_bh(&hdev->hw.cmq.csq.lock);
|
|
@@ -455,23 +460,22 @@ int hclge_cmd_init(struct hclge_dev *hdev)
|
|
goto err_cmd_init;
|
|
}
|
|
|
|
- ret = hclge_cmd_query_firmware_version(&hdev->hw, &version);
|
|
+ ret = hclge_cmd_query_version(hdev);
|
|
if (ret) {
|
|
dev_err(&hdev->pdev->dev,
|
|
- "firmware version query failed %d\n", ret);
|
|
+ "failed to query version ret=%d\n", ret);
|
|
goto err_cmd_init;
|
|
}
|
|
- hdev->fw_version = version;
|
|
|
|
dev_info(&hdev->pdev->dev, "The firmware version is %lu.%lu.%lu.%lu\n",
|
|
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE3_MASK,
|
|
- HNAE3_FW_VERSION_BYTE3_SHIFT),
|
|
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE2_MASK,
|
|
- HNAE3_FW_VERSION_BYTE2_SHIFT),
|
|
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE1_MASK,
|
|
- HNAE3_FW_VERSION_BYTE1_SHIFT),
|
|
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE0_MASK,
|
|
- HNAE3_FW_VERSION_BYTE0_SHIFT));
|
|
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE3_MASK,
|
|
+ HNAE3_FW_VERSION_BYTE3_SHIFT),
|
|
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE2_MASK,
|
|
+ HNAE3_FW_VERSION_BYTE2_SHIFT),
|
|
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE1_MASK,
|
|
+ HNAE3_FW_VERSION_BYTE1_SHIFT),
|
|
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE0_MASK,
|
|
+ HNAE3_FW_VERSION_BYTE0_SHIFT));
|
|
|
|
/* ask the firmware to enable some features, driver can work without
|
|
* it.
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
index aacb75eb8ea8..c43bae3ecbfe 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
@@ -371,7 +371,8 @@ struct hclge_rx_priv_buff_cmd {
|
|
|
|
struct hclge_query_version_cmd {
|
|
__le32 firmware;
|
|
- __le32 firmware_rsv[5];
|
|
+ __le32 hardware;
|
|
+ __le32 rsv[4];
|
|
};
|
|
|
|
#define HCLGE_RX_PRIV_EN_B 15
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
|
index 9338f030842c..55990ba4b30e 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c
|
|
@@ -729,7 +729,7 @@ static int hclge_config_ncsi_hw_err_int(struct hclge_dev *hdev, bool en)
|
|
struct hclge_desc desc;
|
|
int ret;
|
|
|
|
- if (hdev->pdev->revision < 0x21)
|
|
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
return 0;
|
|
|
|
/* configure NCSI error interrupts */
|
|
@@ -809,7 +809,7 @@ static int hclge_config_ppp_error_interrupt(struct hclge_dev *hdev, u32 cmd,
|
|
cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT0_EN_MASK);
|
|
desc[1].data[1] =
|
|
cpu_to_le32(HCLGE_PPP_MPF_ECC_ERR_INT1_EN_MASK);
|
|
- if (hdev->pdev->revision >= 0x21)
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
|
desc[1].data[2] =
|
|
cpu_to_le32(HCLGE_PPP_PF_ERR_INT_EN_MASK);
|
|
} else if (cmd == HCLGE_PPP_CMD1_INT_CMD) {
|
|
@@ -1042,7 +1042,7 @@ static int hclge_config_ssu_hw_err_int(struct hclge_dev *hdev, bool en)
|
|
hclge_cmd_setup_basic_desc(&desc[1], HCLGE_SSU_COMMON_INT_CMD, false);
|
|
|
|
if (en) {
|
|
- if (hdev->pdev->revision >= 0x21)
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
|
desc[0].data[0] =
|
|
cpu_to_le32(HCLGE_SSU_COMMON_INT_EN);
|
|
else
|
|
@@ -1551,7 +1551,8 @@ int hclge_config_rocee_ras_interrupt(struct hclge_dev *hdev, bool en)
|
|
struct hclge_desc desc;
|
|
int ret;
|
|
|
|
- if (hdev->pdev->revision < 0x21 || !hnae3_dev_roce_supported(hdev))
|
|
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2 ||
|
|
+ !hnae3_dev_roce_supported(hdev))
|
|
return 0;
|
|
|
|
hclge_cmd_setup_basic_desc(&desc, HCLGE_CONFIG_ROCEE_RAS_INT_EN, false);
|
|
@@ -1578,7 +1579,7 @@ int hclge_handle_rocee_ras_error(struct hnae3_ae_dev *ae_dev)
|
|
struct hclge_dev *hdev = ae_dev->priv;
|
|
|
|
if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) ||
|
|
- hdev->pdev->revision < 0x21)
|
|
+ hdev->pdev->revision < HNAE3_DEVICE_VERSION_V2)
|
|
return reset_type;
|
|
|
|
reset_type = hclge_log_and_clear_rocee_ras_error(hdev);
|
|
@@ -1666,7 +1667,7 @@ pci_ers_result_t hclge_handle_hw_ras_error(struct hnae3_ae_dev *ae_dev)
|
|
}
|
|
|
|
/* Handling Non-fatal Rocee RAS errors */
|
|
- if (hdev->pdev->revision >= 0x21 &&
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2 &&
|
|
status & HCLGE_RAS_REG_ROCEE_ERR_MASK) {
|
|
dev_err(dev, "ROCEE Non-Fatal RAS error identified\n");
|
|
hclge_handle_rocee_ras_error(ae_dev);
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
index 1248534f3376..d1cf21f86119 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
@@ -739,7 +739,7 @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset)
|
|
if (stringset == ETH_SS_TEST) {
|
|
/* clear loopback bit flags at first */
|
|
handle->flags = (handle->flags & (~HCLGE_LOOPBACK_TEST_FLAGS));
|
|
- if (hdev->pdev->revision >= HNAE3_REVISION_ID_21 ||
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2 ||
|
|
hdev->hw.mac.speed == HCLGE_MAC_SPEED_10M ||
|
|
hdev->hw.mac.speed == HCLGE_MAC_SPEED_100M ||
|
|
hdev->hw.mac.speed == HCLGE_MAC_SPEED_1G) {
|
|
@@ -1139,7 +1139,7 @@ static void hclge_parse_fiber_link_mode(struct hclge_dev *hdev,
|
|
hclge_convert_setting_sr(mac, speed_ability);
|
|
hclge_convert_setting_lr(mac, speed_ability);
|
|
hclge_convert_setting_cr(mac, speed_ability);
|
|
- if (hdev->pdev->revision >= 0x21)
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
|
hclge_convert_setting_fec(mac);
|
|
|
|
linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, mac->supported);
|
|
@@ -1168,7 +1168,7 @@ static void hclge_parse_backplane_link_mode(struct hclge_dev *hdev,
|
|
|
|
#ifdef HAVE_ETHTOOL_CONVERT_U32_AND_LINK_MODE
|
|
hclge_convert_setting_kr(mac, speed_ability);
|
|
- if (hdev->pdev->revision >= 0x21)
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
|
hclge_convert_setting_fec(mac);
|
|
#else
|
|
if (speed_ability & HCLGE_SUPPORT_1G_BIT)
|
|
@@ -2916,7 +2916,7 @@ static int hclge_update_port_info(struct hclge_dev *hdev)
|
|
if (!hdev->support_sfp_query)
|
|
return 0;
|
|
|
|
- if (hdev->pdev->revision >= 0x21) {
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
|
speed = mac->speed;
|
|
ret = hclge_get_sfp_info(hdev, mac);
|
|
} else {
|
|
@@ -2931,7 +2931,7 @@ static int hclge_update_port_info(struct hclge_dev *hdev)
|
|
return ret;
|
|
}
|
|
|
|
- if (hdev->pdev->revision >= 0x21) {
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
|
if (mac->speed_type == QUERY_ACTIVE_SPEED) {
|
|
hclge_update_port_capability(mac);
|
|
if (mac->speed != speed)
|
|
@@ -3572,7 +3572,7 @@ static void hclge_clear_reset_cause(struct hclge_dev *hdev)
|
|
/* For revision 0x20, the reset interrupt source
|
|
* can only be cleared after hardware reset done
|
|
*/
|
|
- if (hdev->pdev->revision == 0x20)
|
|
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
hclge_write_dev(&hdev->hw, HCLGE_MISC_RESET_STS_REG,
|
|
clearval);
|
|
|
|
@@ -4676,7 +4676,7 @@ static void hclge_rss_init_cfg(struct hclge_dev *hdev)
|
|
int i, rss_algo = HCLGE_RSS_HASH_ALGO_TOEPLITZ;
|
|
struct hclge_vport *vport = hdev->vport;
|
|
|
|
- if (hdev->pdev->revision >= 0x21)
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
|
rss_algo = HCLGE_RSS_HASH_ALGO_SIMPLE;
|
|
|
|
for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
|
|
@@ -4876,13 +4876,14 @@ static int hclge_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc,
|
|
bool en_mc_pmc)
|
|
{
|
|
struct hclge_vport *vport = hclge_get_vport(handle);
|
|
+ struct hclge_dev *hdev = vport->back;
|
|
bool en_bc_pmc = true;
|
|
|
|
- /* For revision 0x20, if broadcast promisc enabled, vlan filter is
|
|
- * always bypassed. So broadcast promisc should be disabled until
|
|
- * user enable promisc mode
|
|
+ /* For device whose version below V2, if broadcast promisc enabled,
|
|
+ * vlan filter is always bypassed. So broadcast promisc should be
|
|
+ * disabled until user enable promisc mode
|
|
*/
|
|
- if (handle->pdev->revision == 0x20)
|
|
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
en_bc_pmc = handle->netdev_flags & HNAE3_BPE ? true : false;
|
|
|
|
return hclge_set_vport_promisc_mode(vport, en_uc_pmc, en_mc_pmc,
|
|
@@ -6926,7 +6927,7 @@ static int hclge_set_loopback(struct hnae3_handle *handle,
|
|
* the same, the packets are looped back in the SSU. If SSU loopback
|
|
* is disabled, packets can reach MAC even if SMAC is the same as DMAC.
|
|
*/
|
|
- if (hdev->pdev->revision >= 0x21) {
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
|
u8 switch_param = en ? 0 : BIT(HCLGE_SWITCH_ALW_LPBK_B);
|
|
|
|
ret = hclge_config_switch_param(hdev, PF_VPORT_ID, switch_param,
|
|
@@ -8800,7 +8801,7 @@ static int hclge_init_vlan_config(struct hclge_dev *hdev)
|
|
int ret;
|
|
int i;
|
|
|
|
- if (hdev->pdev->revision >= HNAE3_REVISION_ID_21) {
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
|
/* for revision 0x21, vf vlan filter is per function */
|
|
for (i = 0; i < hdev->num_alloc_vport; i++) {
|
|
vport = &hdev->vport[i];
|
|
@@ -9256,7 +9257,7 @@ static int hclge_set_vf_vlan_filter(struct hnae3_handle *handle, int vfid,
|
|
u16 state;
|
|
int ret;
|
|
|
|
- if (hdev->pdev->revision == 0x20)
|
|
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
return -EOPNOTSUPP;
|
|
|
|
vport = hclge_get_vf_vport(hdev, vfid);
|
|
@@ -10553,7 +10554,7 @@ static int hclge_set_vf_spoofchk(struct hnae3_handle *handle, int vf,
|
|
u32 new_spoofchk = enable ? 1 : 0;
|
|
int ret;
|
|
|
|
- if (hdev->pdev->revision == 0x20)
|
|
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
return -EOPNOTSUPP;
|
|
|
|
vport = hclge_get_vf_vport(hdev, vf);
|
|
@@ -10586,7 +10587,7 @@ static int hclge_reset_vport_spoofchk(struct hclge_dev *hdev)
|
|
int ret;
|
|
int i;
|
|
|
|
- if (hdev->pdev->revision == 0x20)
|
|
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
return 0;
|
|
|
|
/* resume the vf spoof check state after reset */
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
|
index 842c37d2a4fe..4585a22f0003 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c
|
|
@@ -329,9 +329,9 @@ int hclgevf_cmd_send(struct hclgevf_hw *hw, struct hclgevf_desc *desc, int num)
|
|
return status;
|
|
}
|
|
|
|
-static int hclgevf_cmd_query_firmware_version(struct hclgevf_hw *hw,
|
|
- u32 *version)
|
|
+static int hclgevf_cmd_query_version(struct hclgevf_dev *hdev)
|
|
{
|
|
+ struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
|
|
struct hclgevf_query_version_cmd *resp;
|
|
struct hclgevf_desc desc;
|
|
int status;
|
|
@@ -339,9 +339,15 @@ static int hclgevf_cmd_query_firmware_version(struct hclgevf_hw *hw,
|
|
resp = (struct hclgevf_query_version_cmd *)desc.data;
|
|
|
|
hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_QUERY_FW_VER, 1);
|
|
- status = hclgevf_cmd_send(hw, &desc, 1);
|
|
- if (!status)
|
|
- *version = le32_to_cpu(resp->firmware);
|
|
+ status = hclgevf_cmd_send(&hdev->hw, &desc, 1);
|
|
+ if (status)
|
|
+ return status;
|
|
+
|
|
+ hdev->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 |= hdev->pdev->revision;
|
|
|
|
return status;
|
|
}
|
|
@@ -385,7 +391,6 @@ int hclgevf_cmd_queue_init(struct hclgevf_dev *hdev)
|
|
|
|
int hclgevf_cmd_init(struct hclgevf_dev *hdev)
|
|
{
|
|
- u32 version;
|
|
int ret;
|
|
|
|
spin_lock_bh(&hdev->hw.cmq.csq.lock);
|
|
@@ -416,24 +421,21 @@ int hclgevf_cmd_init(struct hclgevf_dev *hdev)
|
|
goto err_cmd_init;
|
|
}
|
|
|
|
- /* get firmware version */
|
|
- ret = hclgevf_cmd_query_firmware_version(&hdev->hw, &version);
|
|
+ ret = hclgevf_cmd_query_version(hdev);
|
|
if (ret) {
|
|
- dev_err(&hdev->pdev->dev,
|
|
- "failed(%d) to query firmware version\n", ret);
|
|
+ dev_err(&hdev->pdev->dev, "failed(%d) to query version\n", ret);
|
|
goto err_cmd_init;
|
|
}
|
|
- hdev->fw_version = version;
|
|
|
|
dev_info(&hdev->pdev->dev, "The firmware version is %lu.%lu.%lu.%lu\n",
|
|
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE3_MASK,
|
|
- HNAE3_FW_VERSION_BYTE3_SHIFT),
|
|
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE2_MASK,
|
|
- HNAE3_FW_VERSION_BYTE2_SHIFT),
|
|
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE1_MASK,
|
|
- HNAE3_FW_VERSION_BYTE1_SHIFT),
|
|
- hnae3_get_field(version, HNAE3_FW_VERSION_BYTE0_MASK,
|
|
- HNAE3_FW_VERSION_BYTE0_SHIFT));
|
|
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE3_MASK,
|
|
+ HNAE3_FW_VERSION_BYTE3_SHIFT),
|
|
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE2_MASK,
|
|
+ HNAE3_FW_VERSION_BYTE2_SHIFT),
|
|
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE1_MASK,
|
|
+ HNAE3_FW_VERSION_BYTE1_SHIFT),
|
|
+ hnae3_get_field(hdev->fw_version, HNAE3_FW_VERSION_BYTE0_MASK,
|
|
+ HNAE3_FW_VERSION_BYTE0_SHIFT));
|
|
|
|
return 0;
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
|
index 69ddfad488a5..a797f770a9fa 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.h
|
|
@@ -144,7 +144,8 @@ struct hclgevf_ctrl_vector_chain {
|
|
|
|
struct hclgevf_query_version_cmd {
|
|
__le32 firmware;
|
|
- __le32 firmware_rsv[5];
|
|
+ __le32 hardware;
|
|
+ __le32 rsv[4];
|
|
};
|
|
|
|
#define HCLGEVF_MSIX_OFT_ROCEE_S 0
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
|
index c8b7b3ede445..f688217d4c59 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
|
|
@@ -757,7 +757,7 @@ static int hclgevf_get_rss(struct hnae3_handle *handle, u32 *indir, u8 *key,
|
|
struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
|
|
int i, ret;
|
|
|
|
- if (handle->pdev->revision >= HNAE3_REVISION_ID_21) {
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
|
/* Get hash algorithm */
|
|
if (hfunc) {
|
|
switch (rss_cfg->hash_algo) {
|
|
@@ -822,7 +822,7 @@ static int hclgevf_set_rss(struct hnae3_handle *handle, const u32 *indir,
|
|
u8 hash_algo;
|
|
int ret, i;
|
|
|
|
- if (handle->pdev->revision >= HNAE3_REVISION_ID_21) {
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
|
ret = hclgevf_parse_rss_hfunc(hdev, hfunc, &hash_algo);
|
|
if (ret)
|
|
return ret;
|
|
@@ -891,7 +891,7 @@ static int hclgevf_set_rss_tuple(struct hnae3_handle *handle,
|
|
u8 tuple_sets;
|
|
int ret;
|
|
|
|
- if (handle->pdev->revision == HNAE3_REVISION_ID_20)
|
|
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
return -EOPNOTSUPP;
|
|
|
|
if (nfc->data &
|
|
@@ -969,7 +969,7 @@ static int hclgevf_get_rss_tuple(struct hnae3_handle *handle,
|
|
struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
|
|
u8 tuple_sets;
|
|
|
|
- if (handle->pdev->revision == HNAE3_REVISION_ID_20)
|
|
+ if (hdev->ae_dev->dev_version < HNAE3_DEVICE_VERSION_V2)
|
|
return -EOPNOTSUPP;
|
|
|
|
nfc->data = 0;
|
|
@@ -1182,10 +1182,9 @@ static int hclgevf_set_promisc_mode(struct hnae3_handle *handle, bool en_uc_pmc,
|
|
bool en_mc_pmc)
|
|
{
|
|
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
|
- struct pci_dev *pdev = hdev->pdev;
|
|
bool en_bc_pmc;
|
|
|
|
- en_bc_pmc = pdev->revision != 0x20;
|
|
+ en_bc_pmc = hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2;
|
|
|
|
return hclgevf_cmd_set_promisc_mode(hdev, en_uc_pmc, en_mc_pmc,
|
|
en_bc_pmc);
|
|
@@ -2364,7 +2363,7 @@ static enum hclgevf_evt_cause hclgevf_check_evt_cause(struct hclgevf_dev *hdev,
|
|
* register, so we should just write 0 to the bit we are
|
|
* handling, and keep other bits as cmdq_stat_reg.
|
|
*/
|
|
- if (hdev->pdev->revision >= 0x21)
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2)
|
|
*clearval = ~(1U << HCLGEVF_VECTOR0_RX_CMDQ_INT_B);
|
|
else
|
|
*clearval = cmdq_stat_reg &
|
|
@@ -2506,7 +2505,7 @@ static void hclgevf_rss_init_cfg(struct hclgevf_dev *hdev)
|
|
rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_TOEPLITZ;
|
|
rss_cfg->rss_size = hdev->nic.kinfo.rss_size;
|
|
tuple_sets = &rss_cfg->rss_tuple_sets;
|
|
- if (hdev->pdev->revision >= 0x21) {
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
|
rss_cfg->hash_algo = HCLGEVF_RSS_HASH_ALGO_SIMPLE;
|
|
memcpy(rss_cfg->rss_hash_key, hclgevf_hash_key,
|
|
HCLGEVF_RSS_KEY_SIZE);
|
|
@@ -2531,7 +2530,7 @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
|
|
struct hclgevf_rss_cfg *rss_cfg = &hdev->rss_cfg;
|
|
int ret;
|
|
|
|
- if (hdev->pdev->revision >= HNAE3_REVISION_ID_21) {
|
|
+ if (hdev->ae_dev->dev_version >= HNAE3_DEVICE_VERSION_V2) {
|
|
ret = hclgevf_set_rss_algo_key(hdev, rss_cfg->hash_algo,
|
|
rss_cfg->rss_hash_key);
|
|
if (ret)
|
|
--
|
|
2.27.0
|
|
|