Sync some patchs from upstreaming for hns3 pmd and modifies are as follow: 1. support flow control autoneg for fiber port 2. support simplify hardware checksum offloading 3. support dump media type 4. add Tx Rx descriptor logs 5. fix Rx multiple firmware reset interrupts 6. ethdev: fix one address occupies two entries in MAC addrs (cherry picked from commit 2af7e093f8ec2ca13cf5b3f372c484b500e07aea)
304 lines
9.8 KiB
Diff
304 lines
9.8 KiB
Diff
From 1a547f79f8d9b412dd4d643107b134e653500865 Mon Sep 17 00:00:00 2001
|
|
From: Huisong Li <lihuisong@huawei.com>
|
|
Date: Mon, 22 May 2023 21:17:37 +0800
|
|
Subject: net/hns3: add flow control autoneg for fiber port
|
|
|
|
[ upstream commit ab0ddd9a0ad5adcc96eabd1fe49edbd2809f202e ]
|
|
|
|
Support flow control autoneg for fiber and backplane port.
|
|
And it depends on the capability of firmware.
|
|
|
|
Signed-off-by: Huisong Li <lihuisong@huawei.com>
|
|
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
|
|
---
|
|
drivers/net/hns3/hns3_cmd.c | 30 +++++++++++++++++-
|
|
drivers/net/hns3/hns3_cmd.h | 20 +++++++++++-
|
|
drivers/net/hns3/hns3_dump.c | 1 +
|
|
drivers/net/hns3/hns3_ethdev.c | 58 ++++++++--------------------------
|
|
drivers/net/hns3/hns3_ethdev.h | 1 +
|
|
5 files changed, 63 insertions(+), 47 deletions(-)
|
|
|
|
diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c
|
|
index d530650452..d0a3853656 100644
|
|
--- a/drivers/net/hns3/hns3_cmd.c
|
|
+++ b/drivers/net/hns3/hns3_cmd.c
|
|
@@ -428,7 +428,8 @@ hns3_get_caps_name(uint32_t caps_id)
|
|
{ HNS3_CAPS_UDP_TUNNEL_CSUM_B, "udp_tunnel_csum" },
|
|
{ HNS3_CAPS_RAS_IMP_B, "ras_imp" },
|
|
{ HNS3_CAPS_RXD_ADV_LAYOUT_B, "rxd_adv_layout" },
|
|
- { HNS3_CAPS_TM_B, "tm_capability" }
|
|
+ { HNS3_CAPS_TM_B, "tm_capability" },
|
|
+ { HNS3_CAPS_FC_AUTO_B, "fc_autoneg" }
|
|
};
|
|
uint32_t i;
|
|
|
|
@@ -510,6 +511,8 @@ hns3_parse_capability(struct hns3_hw *hw,
|
|
hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_RAS_IMP_B, 1);
|
|
if (hns3_get_bit(caps, HNS3_CAPS_TM_B))
|
|
hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_TM_B, 1);
|
|
+ if (hns3_get_bit(caps, HNS3_CAPS_FC_AUTO_B))
|
|
+ hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_FC_AUTO_B, 1);
|
|
}
|
|
|
|
static uint32_t
|
|
@@ -613,9 +616,31 @@ hns3_update_dev_lsc_cap(struct hns3_hw *hw, int fw_compact_cmd_result)
|
|
}
|
|
}
|
|
|
|
+static void
|
|
+hns3_set_fc_autoneg_cap(struct hns3_adapter *hns, int fw_compact_cmd_result)
|
|
+{
|
|
+ struct hns3_hw *hw = &hns->hw;
|
|
+ struct hns3_mac *mac = &hw->mac;
|
|
+
|
|
+ if (mac->media_type == HNS3_MEDIA_TYPE_COPPER) {
|
|
+ hns->pf.support_fc_autoneg = true;
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Flow control auto-negotiation requires the cooperation of the driver
|
|
+ * and firmware.
|
|
+ */
|
|
+ hns->pf.support_fc_autoneg = (hns3_dev_get_support(hw, FC_AUTO) &&
|
|
+ fw_compact_cmd_result == 0) ?
|
|
+ true : false;
|
|
+}
|
|
+
|
|
static int
|
|
hns3_apply_fw_compat_cmd_result(struct hns3_hw *hw, int result)
|
|
{
|
|
+ struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
|
|
+
|
|
if (result != 0 && hns3_dev_get_support(hw, COPPER)) {
|
|
hns3_err(hw, "firmware fails to initialize the PHY, ret = %d.",
|
|
result);
|
|
@@ -623,6 +648,7 @@ hns3_apply_fw_compat_cmd_result(struct hns3_hw *hw, int result)
|
|
}
|
|
|
|
hns3_update_dev_lsc_cap(hw, result);
|
|
+ hns3_set_fc_autoneg_cap(hns, result);
|
|
|
|
return 0;
|
|
}
|
|
@@ -642,6 +668,8 @@ hns3_firmware_compat_config(struct hns3_hw *hw, bool is_init)
|
|
hns3_set_bit(compat, HNS3_NCSI_ERROR_REPORT_EN_B, 0);
|
|
if (hns3_dev_get_support(hw, COPPER))
|
|
hns3_set_bit(compat, HNS3_FIRMWARE_PHY_DRIVER_EN_B, 1);
|
|
+ if (hns3_dev_get_support(hw, FC_AUTO))
|
|
+ hns3_set_bit(compat, HNS3_MAC_FC_AUTONEG_EN_B, 1);
|
|
}
|
|
req->compat = rte_cpu_to_le_32(compat);
|
|
|
|
diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h
|
|
index 4abe0f1d13..d78c1b401e 100644
|
|
--- a/drivers/net/hns3/hns3_cmd.h
|
|
+++ b/drivers/net/hns3/hns3_cmd.h
|
|
@@ -323,6 +323,7 @@ enum HNS3_CAPS_BITS {
|
|
HNS3_CAPS_RAS_IMP_B,
|
|
HNS3_CAPS_RXD_ADV_LAYOUT_B = 15,
|
|
HNS3_CAPS_TM_B = 19,
|
|
+ HNS3_CAPS_FC_AUTO_B = 30,
|
|
};
|
|
|
|
/* Capabilities of VF dependent on the PF */
|
|
@@ -666,6 +667,9 @@ enum hns3_promisc_type {
|
|
#define HNS3_LINK_EVENT_REPORT_EN_B 0
|
|
#define HNS3_NCSI_ERROR_REPORT_EN_B 1
|
|
#define HNS3_FIRMWARE_PHY_DRIVER_EN_B 2
|
|
+
|
|
+#define HNS3_MAC_FC_AUTONEG_EN_B 6
|
|
+
|
|
struct hns3_firmware_compat_cmd {
|
|
uint32_t compat;
|
|
uint8_t rsv[20];
|
|
@@ -680,6 +684,7 @@ struct hns3_firmware_compat_cmd {
|
|
#define HNS3_PHY_LINK_MODE_AUTONEG_BIT BIT(6)
|
|
#define HNS3_PHY_LINK_MODE_PAUSE_BIT BIT(13)
|
|
#define HNS3_PHY_LINK_MODE_ASYM_PAUSE_BIT BIT(14)
|
|
+#define HNS3_PHY_LINK_MODE_PAUSE_S 13
|
|
|
|
#define HNS3_PHY_PARAM_CFG_BD_NUM 2
|
|
struct hns3_phy_params_bd0_cmd {
|
|
@@ -789,6 +794,17 @@ struct hns3_sfp_type {
|
|
#define HNS3_FIBER_LINK_SPEED_10M_BIT BIT(7)
|
|
#define HNS3_FIBER_LINK_SPEED_200G_BIT BIT(8)
|
|
|
|
+/* Flags for pause status field */
|
|
+#define HNS3_FIBER_LOCAL_PAUSE_BIT BIT(0)
|
|
+#define HNS3_FIBER_LOCAL_ASYM_PAUSE_BIT BIT(1)
|
|
+#define HNS3_FIBER_LP_PAUSE_BIT BIT(2)
|
|
+#define HNS3_FIBER_LP_ASYM_PAUSE_BIT BIT(3)
|
|
+#define HNS3_FIBER_LOCAL_PAUSE_MASK (HNS3_FIBER_LOCAL_PAUSE_BIT | \
|
|
+ HNS3_FIBER_LOCAL_ASYM_PAUSE_BIT)
|
|
+#define HNS3_FIBER_LP_PAUSE_MASK (HNS3_FIBER_LP_PAUSE_BIT | \
|
|
+ HNS3_FIBER_LP_ASYM_PAUSE_BIT)
|
|
+#define HNS3_FIBER_LP_PAUSE_S 2
|
|
+
|
|
struct hns3_sfp_info_cmd {
|
|
uint32_t sfp_speed;
|
|
uint8_t query_type; /* 0: sfp speed, 1: active */
|
|
@@ -798,7 +814,9 @@ struct hns3_sfp_info_cmd {
|
|
uint8_t autoneg_ability;
|
|
uint32_t supported_speed; /* speed supported by current media */
|
|
uint32_t module_type;
|
|
- uint8_t rsv1[8];
|
|
+ uint8_t rsv[2];
|
|
+ uint8_t pause_status;
|
|
+ uint8_t rsv1[5];
|
|
};
|
|
|
|
#define HNS3_MAC_CFG_FEC_AUTO_EN_B 0
|
|
diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c
|
|
index 7daa54ec87..7ecfca8497 100644
|
|
--- a/drivers/net/hns3/hns3_dump.c
|
|
+++ b/drivers/net/hns3/hns3_dump.c
|
|
@@ -104,6 +104,7 @@ hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw)
|
|
{HNS3_DEV_SUPPORT_RAS_IMP_B, "RAS IMP"},
|
|
{HNS3_DEV_SUPPORT_TM_B, "TM"},
|
|
{HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, "VF VLAN FILTER MOD"},
|
|
+ {HNS3_DEV_SUPPORT_FC_AUTO_B, "FC AUTO"}
|
|
};
|
|
uint32_t i;
|
|
|
|
diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
|
|
index e01d5f76db..8a7f6cc7be 100644
|
|
--- a/drivers/net/hns3/hns3_ethdev.c
|
|
+++ b/drivers/net/hns3/hns3_ethdev.c
|
|
@@ -3975,6 +3975,7 @@ static int
|
|
hns3_get_sfp_info(struct hns3_hw *hw, struct hns3_mac *mac_info)
|
|
{
|
|
struct hns3_sfp_info_cmd *resp;
|
|
+ uint32_t local_pause, lp_pause;
|
|
struct hns3_cmd_desc desc;
|
|
int ret;
|
|
|
|
@@ -4011,6 +4012,13 @@ hns3_get_sfp_info(struct hns3_hw *hw, struct hns3_mac *mac_info)
|
|
mac_info->support_autoneg = resp->autoneg_ability;
|
|
mac_info->link_autoneg = (resp->autoneg == 0) ? RTE_ETH_LINK_FIXED
|
|
: RTE_ETH_LINK_AUTONEG;
|
|
+ local_pause = resp->pause_status & HNS3_FIBER_LOCAL_PAUSE_MASK;
|
|
+ lp_pause = (resp->pause_status & HNS3_FIBER_LP_PAUSE_MASK) >>
|
|
+ HNS3_FIBER_LP_PAUSE_S;
|
|
+ mac_info->advertising =
|
|
+ local_pause << HNS3_PHY_LINK_MODE_PAUSE_S;
|
|
+ mac_info->lp_advertising =
|
|
+ lp_pause << HNS3_PHY_LINK_MODE_PAUSE_S;
|
|
} else {
|
|
mac_info->query_type = HNS3_DEFAULT_QUERY;
|
|
}
|
|
@@ -4093,6 +4101,8 @@ hns3_update_fiber_link_info(struct hns3_hw *hw)
|
|
mac->supported_speed = mac_info.supported_speed;
|
|
mac->support_autoneg = mac_info.support_autoneg;
|
|
mac->link_autoneg = mac_info.link_autoneg;
|
|
+ mac->advertising = mac_info.advertising;
|
|
+ mac->lp_advertising = mac_info.lp_advertising;
|
|
|
|
return 0;
|
|
}
|
|
@@ -4495,24 +4505,6 @@ hns3_get_port_supported_speed(struct rte_eth_dev *eth_dev)
|
|
return 0;
|
|
}
|
|
|
|
-static void
|
|
-hns3_get_fc_autoneg_capability(struct hns3_adapter *hns)
|
|
-{
|
|
- struct hns3_mac *mac = &hns->hw.mac;
|
|
-
|
|
- if (mac->media_type == HNS3_MEDIA_TYPE_COPPER) {
|
|
- hns->pf.support_fc_autoneg = true;
|
|
- return;
|
|
- }
|
|
-
|
|
- /*
|
|
- * Flow control auto-negotiation requires the cooperation of the driver
|
|
- * and firmware. Currently, the optical port does not support flow
|
|
- * control auto-negotiation.
|
|
- */
|
|
- hns->pf.support_fc_autoneg = false;
|
|
-}
|
|
-
|
|
static int
|
|
hns3_init_pf(struct rte_eth_dev *eth_dev)
|
|
{
|
|
@@ -4615,8 +4607,6 @@ hns3_init_pf(struct rte_eth_dev *eth_dev)
|
|
goto err_supported_speed;
|
|
}
|
|
|
|
- hns3_get_fc_autoneg_capability(hns);
|
|
-
|
|
hns3_tm_conf_init(eth_dev);
|
|
|
|
return 0;
|
|
@@ -5181,8 +5171,7 @@ hns3_dev_close(struct rte_eth_dev *eth_dev)
|
|
}
|
|
|
|
static void
|
|
-hns3_get_autoneg_rxtx_pause_copper(struct hns3_hw *hw, bool *rx_pause,
|
|
- bool *tx_pause)
|
|
+hns3_get_autoneg_rxtx_pause(struct hns3_hw *hw, bool *rx_pause, bool *tx_pause)
|
|
{
|
|
struct hns3_mac *mac = &hw->mac;
|
|
uint32_t advertising = mac->advertising;
|
|
@@ -5193,8 +5182,7 @@ hns3_get_autoneg_rxtx_pause_copper(struct hns3_hw *hw, bool *rx_pause,
|
|
if (advertising & lp_advertising & HNS3_PHY_LINK_MODE_PAUSE_BIT) {
|
|
*rx_pause = true;
|
|
*tx_pause = true;
|
|
- } else if (advertising & lp_advertising &
|
|
- HNS3_PHY_LINK_MODE_ASYM_PAUSE_BIT) {
|
|
+ } else if (advertising & lp_advertising & HNS3_PHY_LINK_MODE_ASYM_PAUSE_BIT) {
|
|
if (advertising & HNS3_PHY_LINK_MODE_PAUSE_BIT)
|
|
*rx_pause = true;
|
|
else if (lp_advertising & HNS3_PHY_LINK_MODE_PAUSE_BIT)
|
|
@@ -5209,26 +5197,7 @@ hns3_get_autoneg_fc_mode(struct hns3_hw *hw)
|
|
bool rx_pause = false;
|
|
bool tx_pause = false;
|
|
|
|
- switch (hw->mac.media_type) {
|
|
- case HNS3_MEDIA_TYPE_COPPER:
|
|
- hns3_get_autoneg_rxtx_pause_copper(hw, &rx_pause, &tx_pause);
|
|
- break;
|
|
-
|
|
- /*
|
|
- * Flow control auto-negotiation is not supported for fiber and
|
|
- * backplane media type.
|
|
- */
|
|
- case HNS3_MEDIA_TYPE_FIBER:
|
|
- case HNS3_MEDIA_TYPE_BACKPLANE:
|
|
- hns3_err(hw, "autoneg FC mode can't be obtained, but flow control auto-negotiation is enabled.");
|
|
- current_mode = hw->requested_fc_mode;
|
|
- goto out;
|
|
- default:
|
|
- hns3_err(hw, "autoneg FC mode can't be obtained for unknown media type(%u).",
|
|
- hw->mac.media_type);
|
|
- current_mode = HNS3_FC_NONE;
|
|
- goto out;
|
|
- }
|
|
+ hns3_get_autoneg_rxtx_pause(hw, &rx_pause, &tx_pause);
|
|
|
|
if (rx_pause && tx_pause)
|
|
current_mode = HNS3_FC_FULL;
|
|
@@ -5239,7 +5208,6 @@ hns3_get_autoneg_fc_mode(struct hns3_hw *hw)
|
|
else
|
|
current_mode = HNS3_FC_NONE;
|
|
|
|
-out:
|
|
return current_mode;
|
|
}
|
|
|
|
diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h
|
|
index 8268dba788..88146f5054 100644
|
|
--- a/drivers/net/hns3/hns3_ethdev.h
|
|
+++ b/drivers/net/hns3/hns3_ethdev.h
|
|
@@ -892,6 +892,7 @@ enum hns3_dev_cap {
|
|
HNS3_DEV_SUPPORT_RAS_IMP_B,
|
|
HNS3_DEV_SUPPORT_TM_B,
|
|
HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B,
|
|
+ HNS3_DEV_SUPPORT_FC_AUTO_B,
|
|
};
|
|
|
|
#define hns3_dev_get_support(hw, _name) \
|
|
--
|
|
2.23.0
|
|
|