diff --git a/0285-net-hns3-simplify-hardware-checksum-offloading.patch b/0285-net-hns3-simplify-hardware-checksum-offloading.patch new file mode 100644 index 0000000..6e6422b --- /dev/null +++ b/0285-net-hns3-simplify-hardware-checksum-offloading.patch @@ -0,0 +1,224 @@ +From bc4b30bb7c3ce3310d98a43bb5364b327ecd5cf9 Mon Sep 17 00:00:00 2001 +From: Dongdong Liu +Date: Fri, 21 Apr 2023 17:53:21 +0800 +Subject: net/hns3: simplify hardware checksum offloading + +[ upstream commit 7fd763a9dd18a3edd98e95c26e96349fd71cbb9b ] + +If the NIC support simple BD mode, the hardware will calculate +the checksum from the start position of checksum and fill the +checksum result to the offset position, which simple the +HW operations of calculating the type and header length of +L3/L4. + +Add this mode for hns3 PMD when the packet type is L4. + +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_cmd.c | 3 ++ + drivers/net/hns3/hns3_cmd.h | 1 + + drivers/net/hns3/hns3_dump.c | 1 + + drivers/net/hns3/hns3_ethdev.h | 1 + + drivers/net/hns3/hns3_rxtx.c | 52 +++++++++++++++++++++++++++++++++- + drivers/net/hns3/hns3_rxtx.h | 12 +++++++- + 6 files changed, 68 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/hns3/hns3_cmd.c b/drivers/net/hns3/hns3_cmd.c +index bdfc85f934..d530650452 100644 +--- a/drivers/net/hns3/hns3_cmd.c ++++ b/drivers/net/hns3/hns3_cmd.c +@@ -419,6 +419,7 @@ hns3_get_caps_name(uint32_t caps_id) + } dev_caps[] = { + { HNS3_CAPS_FD_QUEUE_REGION_B, "fd_queue_region" }, + { HNS3_CAPS_PTP_B, "ptp" }, ++ { HNS3_CAPS_SIMPLE_BD_B, "simple_bd" }, + { HNS3_CAPS_TX_PUSH_B, "tx_push" }, + { HNS3_CAPS_PHY_IMP_B, "phy_imp" }, + { HNS3_CAPS_TQP_TXRX_INDEP_B, "tqp_txrx_indep" }, +@@ -489,6 +490,8 @@ hns3_parse_capability(struct hns3_hw *hw, + hns3_warn(hw, "ignore PTP capability due to lack of " + "rxd advanced layout capability."); + } ++ if (hns3_get_bit(caps, HNS3_CAPS_SIMPLE_BD_B)) ++ hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_SIMPLE_BD_B, 1); + if (hns3_get_bit(caps, HNS3_CAPS_TX_PUSH_B)) + hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_TX_PUSH_B, 1); + if (hns3_get_bit(caps, HNS3_CAPS_PHY_IMP_B)) +diff --git a/drivers/net/hns3/hns3_cmd.h b/drivers/net/hns3/hns3_cmd.h +index eb394c9dec..4abe0f1d13 100644 +--- a/drivers/net/hns3/hns3_cmd.h ++++ b/drivers/net/hns3/hns3_cmd.h +@@ -313,6 +313,7 @@ enum HNS3_CAPS_BITS { + */ + HNS3_CAPS_FD_QUEUE_REGION_B = 2, + HNS3_CAPS_PTP_B, ++ HNS3_CAPS_SIMPLE_BD_B = 5, + HNS3_CAPS_TX_PUSH_B = 6, + HNS3_CAPS_PHY_IMP_B = 7, + HNS3_CAPS_TQP_TXRX_INDEP_B, +diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c +index 8268506f6f..a793ba64ad 100644 +--- a/drivers/net/hns3/hns3_dump.c ++++ b/drivers/net/hns3/hns3_dump.c +@@ -96,6 +96,7 @@ hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw) + {HNS3_DEV_SUPPORT_TX_PUSH_B, "TX PUSH"}, + {HNS3_DEV_SUPPORT_INDEP_TXRX_B, "INDEP TXRX"}, + {HNS3_DEV_SUPPORT_STASH_B, "STASH"}, ++ {HNS3_DEV_SUPPORT_SIMPLE_BD_B, "SIMPLE BD"}, + {HNS3_DEV_SUPPORT_RXD_ADV_LAYOUT_B, "RXD Advanced Layout"}, + {HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B, "OUTER UDP CKSUM"}, + {HNS3_DEV_SUPPORT_RAS_IMP_B, "RAS IMP"}, +diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h +index 9acc5a3d7e..ee4dd18d7b 100644 +--- a/drivers/net/hns3/hns3_ethdev.h ++++ b/drivers/net/hns3/hns3_ethdev.h +@@ -886,6 +886,7 @@ enum hns3_dev_cap { + HNS3_DEV_SUPPORT_TX_PUSH_B, + HNS3_DEV_SUPPORT_INDEP_TXRX_B, + HNS3_DEV_SUPPORT_STASH_B, ++ HNS3_DEV_SUPPORT_SIMPLE_BD_B, + HNS3_DEV_SUPPORT_RXD_ADV_LAYOUT_B, + HNS3_DEV_SUPPORT_OUTER_UDP_CKSUM_B, + HNS3_DEV_SUPPORT_RAS_IMP_B, +diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c +index 1f44c0345f..aaf0a06ca6 100644 +--- a/drivers/net/hns3/hns3_rxtx.c ++++ b/drivers/net/hns3/hns3_rxtx.c +@@ -3046,6 +3046,10 @@ hns3_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc, + HNS3_PORT_BASE_VLAN_ENABLE; + else + txq->pvid_sw_shift_en = false; ++ ++ if (hns3_dev_get_support(hw, SIMPLE_BD)) ++ txq->simple_bd_enable = true; ++ + txq->max_non_tso_bd_num = hw->max_non_tso_bd_num; + txq->configured = true; + txq->io_base = (void *)((char *)hw->io_base + +@@ -3162,7 +3166,7 @@ hns3_set_tso(struct hns3_desc *desc, uint32_t paylen, struct rte_mbuf *rxm) + return; + + desc->tx.type_cs_vlan_tso_len |= rte_cpu_to_le_32(BIT(HNS3_TXD_TSO_B)); +- desc->tx.mss = rte_cpu_to_le_16(rxm->tso_segsz); ++ desc->tx.ckst_mss |= rte_cpu_to_le_16(rxm->tso_segsz); + } + + static inline void +@@ -3901,6 +3905,50 @@ hns3_prep_pkts(__rte_unused void *tx_queue, struct rte_mbuf **tx_pkts, + return i; + } + ++static inline int ++hns3_handle_simple_bd(struct hns3_tx_queue *txq, struct hns3_desc *desc, ++ struct rte_mbuf *m) ++{ ++#define HNS3_TCP_CSUM_OFFSET 16 ++#define HNS3_UDP_CSUM_OFFSET 6 ++ ++ /* ++ * In HIP09, NIC HW support Tx simple BD mode that the HW will ++ * calculate the checksum from the start position of checksum and fill ++ * the checksum result to the offset position without packet type and ++ * header length of L3/L4. ++ * For non-tunneling packet: ++ * - Tx simple BD support for TCP and UDP checksum. ++ * For tunneling packet: ++ * - Tx simple BD support for inner L4 checksum(except sctp checksum). ++ * - Tx simple BD not support the outer checksum and the inner L3 ++ * checksum. ++ * - Besides, Tx simple BD is not support for TSO. ++ */ ++ if (txq->simple_bd_enable && !(m->ol_flags & RTE_MBUF_F_TX_IP_CKSUM) && ++ !(m->ol_flags & RTE_MBUF_F_TX_TCP_SEG) && ++ !(m->ol_flags & RTE_MBUF_F_TX_OUTER_IP_CKSUM) && ++ ((m->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_TCP_CKSUM || ++ (m->ol_flags & RTE_MBUF_F_TX_L4_MASK) == RTE_MBUF_F_TX_UDP_CKSUM)) { ++ /* set checksum start and offset, defined in 2 Bytes */ ++ hns3_set_field(desc->tx.type_cs_vlan_tso_len, ++ HNS3_TXD_L4_START_M, HNS3_TXD_L4_START_S, ++ (m->l2_len + m->l3_len) >> HNS3_SIMPLE_BD_UNIT); ++ hns3_set_field(desc->tx.ol_type_vlan_len_msec, ++ HNS3_TXD_L4_CKS_OFFSET_M, HNS3_TXD_L4_CKS_OFFSET_S, ++ (m->ol_flags & RTE_MBUF_F_TX_L4_MASK) == ++ RTE_MBUF_F_TX_TCP_CKSUM ? ++ HNS3_TCP_CSUM_OFFSET >> HNS3_SIMPLE_BD_UNIT : ++ HNS3_UDP_CSUM_OFFSET >> HNS3_SIMPLE_BD_UNIT); ++ ++ hns3_set_bit(desc->tx.ckst_mss, HNS3_TXD_CKST_B, 1); ++ ++ return 0; ++ } ++ ++ return -ENOTSUP; ++} ++ + static int + hns3_parse_cksum(struct hns3_tx_queue *txq, uint16_t tx_desc_id, + struct rte_mbuf *m) +@@ -3910,6 +3958,8 @@ hns3_parse_cksum(struct hns3_tx_queue *txq, uint16_t tx_desc_id, + + /* Enable checksum offloading */ + if (m->ol_flags & HNS3_TX_CKSUM_OFFLOAD_MASK) { ++ if (hns3_handle_simple_bd(txq, desc, m) == 0) ++ return 0; + /* Fill in tunneling parameters if necessary */ + if (hns3_parse_tunneling_params(txq, m, tx_desc_id)) { + txq->dfx_stats.unsupported_tunnel_pkt_cnt++; +diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h +index fa39f6481a..7685ac2ea3 100644 +--- a/drivers/net/hns3/hns3_rxtx.h ++++ b/drivers/net/hns3/hns3_rxtx.h +@@ -134,6 +134,9 @@ + #define HNS3_TXD_L4LEN_S 24 + #define HNS3_TXD_L4LEN_M (0xffUL << HNS3_TXD_L4LEN_S) + ++#define HNS3_TXD_L4_START_S 8 ++#define HNS3_TXD_L4_START_M (0xffff << HNS3_TXD_L4_START_S) ++ + #define HNS3_TXD_OL3T_S 0 + #define HNS3_TXD_OL3T_M (0x3 << HNS3_TXD_OL3T_S) + #define HNS3_TXD_OVLAN_B 2 +@@ -141,6 +144,9 @@ + #define HNS3_TXD_TUNTYPE_S 4 + #define HNS3_TXD_TUNTYPE_M (0xf << HNS3_TXD_TUNTYPE_S) + ++#define HNS3_TXD_L4_CKS_OFFSET_S 8 ++#define HNS3_TXD_L4_CKS_OFFSET_M (0xffff << HNS3_TXD_L4_CKS_OFFSET_S) ++ + #define HNS3_TXD_BDTYPE_S 0 + #define HNS3_TXD_BDTYPE_M (0xf << HNS3_TXD_BDTYPE_S) + #define HNS3_TXD_FE_B 4 +@@ -157,10 +163,13 @@ + #define HNS3_TXD_MSS_S 0 + #define HNS3_TXD_MSS_M (0x3fff << HNS3_TXD_MSS_S) + ++#define HNS3_TXD_CKST_B 14 ++ + #define HNS3_TXD_OL4CS_B 22 + #define HNS3_L2_LEN_UNIT 1UL + #define HNS3_L3_LEN_UNIT 2UL + #define HNS3_L4_LEN_UNIT 2UL ++#define HNS3_SIMPLE_BD_UNIT 1UL + + #define HNS3_TXD_DEFAULT_BDTYPE 0 + #define HNS3_TXD_VLD_CMD (0x1 << HNS3_TXD_VLD_B) +@@ -247,7 +256,7 @@ struct hns3_desc { + + uint32_t paylen_fd_dop_ol4cs; + uint16_t tp_fe_sc_vld_ra_ri; +- uint16_t mss; ++ uint16_t ckst_mss; + } tx; + + struct { +@@ -488,6 +497,7 @@ struct hns3_tx_queue { + */ + uint16_t udp_cksum_mode:1; + ++ /* check whether the simple BD mode is supported */ + uint16_t simple_bd_enable:1; + uint16_t tx_push_enable:1; /* check whether the tx push is enabled */ + /* +-- +2.23.0 + diff --git a/0286-net-hns3-support-dump-media-type.patch b/0286-net-hns3-support-dump-media-type.patch new file mode 100644 index 0000000..08e2e5c --- /dev/null +++ b/0286-net-hns3-support-dump-media-type.patch @@ -0,0 +1,66 @@ +From 8c4f049f4ed9885886d4f16332472df7d2bd4773 Mon Sep 17 00:00:00 2001 +From: Chengwen Feng +Date: Fri, 21 Apr 2023 17:53:22 +0800 +Subject: net/hns3: support dump media type + +[ upstream commit 5a4af56b354d412b1be460f65d2977fd56b21ef8 ] + +The media type information helps locate faults such as AN or rate +switching, so add dump media type in eth_dev_priv_dump ops. + +Signed-off-by: Chengwen Feng +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_dump.c | 2 ++ + drivers/net/hns3/hns3_ethdev.c | 2 +- + drivers/net/hns3/hns3_ethdev.h | 2 ++ + 3 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/hns3/hns3_dump.c b/drivers/net/hns3/hns3_dump.c +index a793ba64ad..7daa54ec87 100644 +--- a/drivers/net/hns3/hns3_dump.c ++++ b/drivers/net/hns3/hns3_dump.c +@@ -68,12 +68,14 @@ hns3_get_dev_mac_info(FILE *file, struct hns3_adapter *hns) + + fprintf(file, " - MAC Info:\n"); + fprintf(file, ++ "\t -- media_type=%s\n" + "\t -- query_type=%u\n" + "\t -- supported_speed=0x%x\n" + "\t -- advertising=0x%x\n" + "\t -- lp_advertising=0x%x\n" + "\t -- support_autoneg=%s\n" + "\t -- support_fc_autoneg=%s\n", ++ hns3_get_media_type_name(hw->mac.media_type), + hw->mac.query_type, + hw->mac.supported_speed, + hw->mac.advertising, +diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c +index 1c67ff2c99..12e7a72c36 100644 +--- a/drivers/net/hns3/hns3_ethdev.c ++++ b/drivers/net/hns3/hns3_ethdev.c +@@ -4891,7 +4891,7 @@ hns3_set_fiber_port_link_speed(struct hns3_hw *hw, + return hns3_cfg_mac_speed_dup(hw, cfg->speed, cfg->duplex); + } + +-static const char * ++const char * + hns3_get_media_type_name(uint8_t media_type) + { + if (media_type == HNS3_MEDIA_TYPE_FIBER) +diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h +index ee4dd18d7b..8268dba788 100644 +--- a/drivers/net/hns3/hns3_ethdev.h ++++ b/drivers/net/hns3/hns3_ethdev.h +@@ -1054,6 +1054,8 @@ int hns3_timesync_write_time(struct rte_eth_dev *dev, + const struct timespec *ts); + int hns3_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta); + ++const char *hns3_get_media_type_name(uint8_t media_type); ++ + static inline bool + is_reset_pending(struct hns3_adapter *hns) + { +-- +2.23.0 + diff --git a/0287-ethdev-fix-one-address-occupies-two-entries-in-MAC-a.patch b/0287-ethdev-fix-one-address-occupies-two-entries-in-MAC-a.patch new file mode 100644 index 0000000..f94dc23 --- /dev/null +++ b/0287-ethdev-fix-one-address-occupies-two-entries-in-MAC-a.patch @@ -0,0 +1,116 @@ +From dfa6c33450b990739a282f5acad8e43a5b27437b Mon Sep 17 00:00:00 2001 +From: Huisong Li +Date: Fri, 19 May 2023 17:31:55 +0800 +Subject: ethdev: fix one address occupies two entries in MAC addrs + +[ upstream commit 964ccaf2fe229ef31f57574176f966af7fcefae4 ] + +The dev->data->mac_addrs[0] will be changed to a new MAC address when +applications modify the default MAC address by .mac_addr_set(). However, +if the new default one has been added as a non-default MAC address by +.mac_addr_add(), the .mac_addr_set() didn't check this address. +As a result, this MAC address occupies two entries in the list. Like: +add(MAC1) +add(MAC2) +add(MAC3) +add(MAC4) +set_default(MAC3) +default=MAC3, the rest of the list=MAC1, MAC2, MAC3, MAC4 +Note: MAC3 occupies two entries. + +But .mac_addr_set() cannot remove it implicitly in case of MAC address +shrinking in the list. +So this patch adds a check on whether the new default address was +already in the list and if so requires the user to remove it first. + +In addition, this patch documents the position of the default MAC +address and address unique in the list. + +Fixes: 854d8ad4ef68 ("ethdev: add default mac address modifier") +Cc: stable@dpdk.org + +Signed-off-by: Huisong Li +Acked-by: Chengwen Feng +Acked-by: Thomas Monjalon +Reviewed-by: Ferruh Yigit +--- + lib/ethdev/ethdev_driver.h | 6 +++++- + lib/ethdev/rte_ethdev.c | 14 +++++++++++++- + lib/ethdev/rte_ethdev.h | 4 ++++ + 3 files changed, 22 insertions(+), 2 deletions(-) + +diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h +index d3de203d7a..6f539d45c6 100644 +--- a/lib/ethdev/ethdev_driver.h ++++ b/lib/ethdev/ethdev_driver.h +@@ -111,7 +111,11 @@ struct rte_eth_dev_data { + + uint64_t rx_mbuf_alloc_failed; /**< Rx ring mbuf allocation failures */ + +- /** Device Ethernet link address. @see rte_eth_dev_release_port() */ ++ /** ++ * Device Ethernet link addresses. ++ * All entries are unique. ++ * The first entry (index zero) is the default address. ++ */ + struct rte_ether_addr *mac_addrs; + /** Bitmap associating MAC addresses to pools */ + uint64_t mac_pool_sel[RTE_ETH_NUM_RECEIVE_MAC_ADDR]; +diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c +index 054715e05a..2f0aa282df 100644 +--- a/lib/ethdev/rte_ethdev.c ++++ b/lib/ethdev/rte_ethdev.c +@@ -4471,6 +4471,7 @@ int + rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr) + { + struct rte_eth_dev *dev; ++ int index; + int ret; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); +@@ -4486,8 +4487,19 @@ rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct rte_ether_addr *addr) + if (!rte_is_valid_assigned_ether_addr(addr)) + return -EINVAL; + +- RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mac_addr_set, -ENOTSUP); ++ if (*dev->dev_ops->mac_addr_set == NULL) ++ return -ENOTSUP; ++ ++ /* Keep address unique in dev->data->mac_addrs[]. */ ++ index = eth_dev_get_mac_addr_index(port_id, addr); ++ if (index > 0) { ++ RTE_ETHDEV_LOG(ERR, ++ "New default address for port %u was already in the address list. Please remove it first.\n", ++ port_id); ++ return -EEXIST; ++ } + ++ ret = (*dev->dev_ops->mac_addr_set)(dev, addr); + ret = (*dev->dev_ops->mac_addr_set)(dev, addr); + if (ret < 0) + return ret; +diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h +index b262939a33..9df50c30b4 100644 +--- a/lib/ethdev/rte_ethdev.h ++++ b/lib/ethdev/rte_ethdev.h +@@ -4167,6 +4167,9 @@ int rte_eth_dev_mac_addr_remove(uint16_t port_id, + + /** + * Set the default MAC address. ++ * It replaces the address at index 0 of the MAC address list. ++ * If the address was already in the MAC address list, ++ * please remove it first. + * + * @param port_id + * The port identifier of the Ethernet device. +@@ -4177,6 +4180,7 @@ int rte_eth_dev_mac_addr_remove(uint16_t port_id, + * - (-ENOTSUP) if hardware doesn't support. + * - (-ENODEV) if *port* invalid. + * - (-EINVAL) if MAC address is invalid. ++ * - (-EEXIST) if MAC address was already in the address list. + */ + int rte_eth_dev_default_mac_addr_set(uint16_t port_id, + struct rte_ether_addr *mac_addr); +-- +2.23.0 + diff --git a/0288-net-hns3-fix-never-set-MAC-flow-control.patch b/0288-net-hns3-fix-never-set-MAC-flow-control.patch new file mode 100644 index 0000000..a99c01f --- /dev/null +++ b/0288-net-hns3-fix-never-set-MAC-flow-control.patch @@ -0,0 +1,47 @@ +From 68c936210f151e6359bb770026a2d6b7a3bed43a Mon Sep 17 00:00:00 2001 +From: Huisong Li +Date: Mon, 22 May 2023 21:17:36 +0800 +Subject: net/hns3: fix never set MAC flow control + +[ upstream commit 73b4f0011f09c5a57776c9f4edaf2d88a3065053 ] + +When some hardware and firmware support speed auto-negotiation +but do not support flow control auto-negotiation, driver can +never successfully set MAC flow control by flow_ctrl_set() API. +So only tell user driver doesn't support flow control autoneg +when user enable it. + +Fixes: 1f411e31a826 ("net/hns3: support flow control autoneg for copper port") +Cc: stable@dpdk.org + +Signed-off-by: Huisong Li +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_ethdev.c | 11 +---------- + 1 file changed, 1 insertion(+), 10 deletions(-) + +diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c +index 12e7a72c36..e01d5f76db 100644 +--- a/drivers/net/hns3/hns3_ethdev.c ++++ b/drivers/net/hns3/hns3_ethdev.c +@@ -5304,16 +5304,7 @@ hns3_check_fc_autoneg_valid(struct hns3_hw *hw, uint8_t autoneg) + + if (!pf->support_fc_autoneg) { + if (autoneg != 0) { +- hns3_err(hw, "unsupported fc auto-negotiation setting."); +- return -EOPNOTSUPP; +- } +- +- /* +- * Flow control auto-negotiation of the NIC is not supported, +- * but other auto-negotiation features may be supported. +- */ +- if (autoneg != hw->mac.link_autoneg) { +- hns3_err(hw, "please use 'link_speeds' in struct rte_eth_conf to disable autoneg!"); ++ hns3_err(hw, "unsupported fc auto-negotiation."); + return -EOPNOTSUPP; + } + +-- +2.23.0 + diff --git a/0289-net-hns3-add-flow-control-autoneg-for-fiber-port.patch b/0289-net-hns3-add-flow-control-autoneg-for-fiber-port.patch new file mode 100644 index 0000000..b402c1c --- /dev/null +++ b/0289-net-hns3-add-flow-control-autoneg-for-fiber-port.patch @@ -0,0 +1,303 @@ +From 1a547f79f8d9b412dd4d643107b134e653500865 Mon Sep 17 00:00:00 2001 +From: Huisong Li +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 +Signed-off-by: Dongdong Liu +--- + 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 + diff --git a/0290-net-hns3-fix-variable-type-mismatch.patch b/0290-net-hns3-fix-variable-type-mismatch.patch new file mode 100644 index 0000000..801d350 --- /dev/null +++ b/0290-net-hns3-fix-variable-type-mismatch.patch @@ -0,0 +1,52 @@ +From cae0ec81453b65080372918ea266b3e571fc6197 Mon Sep 17 00:00:00 2001 +From: Dengdui Huang +Date: Mon, 22 May 2023 21:17:38 +0800 +Subject: net/hns3: fix variable type mismatch + +[ upstream commit 84b195b9348810cb9ee2ac71f61ee4331b27d552 ] + +Loop conditions are compared with different variable types, +which may cause overflow risks. + +Fixes: 67d010346933 ("net/hns3: adjust data type of some variables") +Fixes: 6ee07e3cb589 ("net/hns3: fix insecure way to query MAC statistics") +Cc: stable@dpdk.org + +Signed-off-by: Dengdui Huang +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_regs.c | 3 ++- + drivers/net/hns3/hns3_stats.c | 2 +- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/hns3/hns3_regs.c b/drivers/net/hns3/hns3_regs.c +index 33392fd1f0..5d6f92e4bb 100644 +--- a/drivers/net/hns3/hns3_regs.c ++++ b/drivers/net/hns3/hns3_regs.c +@@ -294,8 +294,9 @@ hns3_direct_access_regs(struct hns3_hw *hw, uint32_t *data) + struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw); + uint32_t *origin_data_ptr = data; + uint32_t reg_offset; +- uint16_t i, j; + size_t reg_num; ++ uint16_t j; ++ size_t i; + + /* fetching per-PF registers values from PF PCIe register space */ + reg_num = sizeof(cmdq_reg_addrs) / sizeof(uint32_t); +diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c +index bad65fcbed..c2e692a2c5 100644 +--- a/drivers/net/hns3/hns3_stats.c ++++ b/drivers/net/hns3/hns3_stats.c +@@ -317,7 +317,7 @@ hns3_update_mac_stats(struct hns3_hw *hw) + uint32_t stats_iterms; + uint64_t *desc_data; + uint32_t desc_num; +- uint16_t i; ++ uint32_t i; + int ret; + + /* The first desc has a 64-bit header, so need to consider it. */ +-- +2.23.0 + diff --git a/0291-net-hns3-fix-Rx-multiple-firmware-reset-interrupts.patch b/0291-net-hns3-fix-Rx-multiple-firmware-reset-interrupts.patch new file mode 100644 index 0000000..0273b41 --- /dev/null +++ b/0291-net-hns3-fix-Rx-multiple-firmware-reset-interrupts.patch @@ -0,0 +1,67 @@ +From 307e0a26dd0c00b0e600e97c975f0e9d71b175a3 Mon Sep 17 00:00:00 2001 +From: Chengwen Feng +Date: Mon, 22 May 2023 21:17:39 +0800 +Subject: net/hns3: fix Rx multiple firmware reset interrupts + +[ upstream commit 312dd216fe75173016a4c5edce60bb1bea988315 ] + +In the firmware (also known as IMP) reset scenario, driver interrupt +processing and firmware watchdog initialization are asynchronous. + +If the driver interrupt processing is faster than firmware watchdog +initialization (that is, the driver clears the firmware reset +interrupt source before the firmware watchdog is initialized), the +driver will receive multiple firmware reset interrupts. + +In the Kunpeng 920 platform, the above situation does not exist. But +it does on the newer platforms. So we add 5ms delay before drivers +clears the IMP reset interrupt source. + +As for the impact of 5ms, the number of PFs managed by a firmware is +limited. Therefore, even if a DPDK process takes over all the PFs +which managed by the firmware, the delay is controllable. + +Fixes: ee930d38ffca ("net/hns3: fix timing of clearing interrupt source") +Cc: stable@dpdk.org + +Signed-off-by: Chengwen Feng +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_ethdev.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c +index 8a7f6cc7be..c0df8f5d97 100644 +--- a/drivers/net/hns3/hns3_ethdev.c ++++ b/drivers/net/hns3/hns3_ethdev.c +@@ -286,6 +286,19 @@ hns3_handle_mac_tnl(struct hns3_hw *hw) + } + } + ++static void ++hns3_delay_before_clear_event_cause(struct hns3_hw *hw, uint32_t event_type, uint32_t regclr) ++{ ++#define IMPRESET_WAIT_MS_TIME 5 ++ ++ if (event_type == HNS3_VECTOR0_EVENT_RST && ++ regclr & BIT(HNS3_VECTOR0_IMPRESET_INT_B) && ++ hw->revision >= PCI_REVISION_ID_HIP09_A) { ++ rte_delay_ms(IMPRESET_WAIT_MS_TIME); ++ hns3_dbg(hw, "wait firmware watchdog initialization completed."); ++ } ++} ++ + static void + hns3_interrupt_handler(void *param) + { +@@ -305,6 +318,7 @@ hns3_interrupt_handler(void *param) + vector0_int = hns3_read_dev(hw, HNS3_VECTOR0_OTHER_INT_STS_REG); + ras_int = hns3_read_dev(hw, HNS3_RAS_PF_OTHER_INT_STS_REG); + cmdq_int = hns3_read_dev(hw, HNS3_VECTOR0_CMDQ_SRC_REG); ++ hns3_delay_before_clear_event_cause(hw, event_cause, clearval); + hns3_clear_event_cause(hw, event_cause, clearval); + /* vector 0 interrupt is shared with reset and mailbox source events. */ + if (event_cause == HNS3_VECTOR0_EVENT_ERR) { +-- +2.23.0 + diff --git a/0292-net-hns3-add-Tx-Rx-descriptor-logs.patch b/0292-net-hns3-add-Tx-Rx-descriptor-logs.patch new file mode 100644 index 0000000..49a403b --- /dev/null +++ b/0292-net-hns3-add-Tx-Rx-descriptor-logs.patch @@ -0,0 +1,132 @@ +From 23e9f9ec10d6ef2cbb794d55c0018c76e393a9b0 Mon Sep 17 00:00:00 2001 +From: Dengdui Huang +Date: Mon, 22 May 2023 21:17:40 +0800 +Subject: net/hns3: add Tx/Rx descriptor logs + +[ upstream commit 7cd4df57fb216489979528d603d39a7a5d1529da ] + +Add Tx/Rx descriptor logs, controlled by 'RTE_ETHDEV_DEBUG_RX/TX' +compile time flag with 'pmd.net.hns3.rx/tx' log type. + +Signed-off-by: Dengdui Huang +Signed-off-by: Dongdong Liu +--- + drivers/net/hns3/hns3_ethdev.c | 6 ++++++ + drivers/net/hns3/hns3_logs.h | 18 ++++++++++++++++++ + drivers/net/hns3/hns3_rxtx.c | 4 ++++ + drivers/net/hns3/hns3_rxtx.h | 29 +++++++++++++++++++++++++++++ + 4 files changed, 57 insertions(+) + +diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c +index c0df8f5d97..2fb9e68039 100644 +--- a/drivers/net/hns3/hns3_ethdev.c ++++ b/drivers/net/hns3/hns3_ethdev.c +@@ -6625,3 +6625,9 @@ RTE_PMD_REGISTER_PARAM_STRING(net_hns3, + HNS3_DEVARG_MBX_TIME_LIMIT_MS "= "); + RTE_LOG_REGISTER_SUFFIX(hns3_logtype_init, init, NOTICE); + RTE_LOG_REGISTER_SUFFIX(hns3_logtype_driver, driver, NOTICE); ++#ifdef RTE_ETHDEV_DEBUG_RX ++RTE_LOG_REGISTER_SUFFIX(hns3_logtype_rx, rx, DEBUG); ++#endif ++#ifdef RTE_ETHDEV_DEBUG_TX ++RTE_LOG_REGISTER_SUFFIX(hns3_logtype_tx, tx, DEBUG); ++#endif +diff --git a/drivers/net/hns3/hns3_logs.h b/drivers/net/hns3/hns3_logs.h +index c880f752ab..47d3a13220 100644 +--- a/drivers/net/hns3/hns3_logs.h ++++ b/drivers/net/hns3/hns3_logs.h +@@ -31,4 +31,22 @@ extern int hns3_logtype_driver; + #define hns3_dbg(hw, fmt, args...) \ + PMD_DRV_LOG_RAW(hw, RTE_LOG_DEBUG, fmt "\n", ## args) + ++#ifdef RTE_ETHDEV_DEBUG_RX ++extern int hns3_logtype_rx; ++#define PMD_RX_LOG(hw, level, fmt, args...) \ ++ rte_log(RTE_LOG_ ## level, hns3_logtype_rx, "%s %s(): " fmt "\n", \ ++ (hw)->data->name, __func__, ## args) ++#else ++#define PMD_RX_LOG(hw, level, fmt, args...) do { } while (0) ++#endif ++ ++#ifdef RTE_ETHDEV_DEBUG_TX ++extern int hns3_logtype_tx; ++#define PMD_TX_LOG(hw, level, fmt, args...) \ ++ rte_log(RTE_LOG_ ## level, hns3_logtype_tx, "%s %s(): " fmt "\n", \ ++ (hw)->data->name, __func__, ## args) ++#else ++#define PMD_TX_LOG(hw, level, fmt, args...) do { } while (0) ++#endif ++ + #endif /* HNS3_LOGS_H */ +diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c +index aaf0a06ca6..e055b5415d 100644 +--- a/drivers/net/hns3/hns3_rxtx.c ++++ b/drivers/net/hns3/hns3_rxtx.c +@@ -2618,6 +2618,7 @@ hns3_recv_scattered_pkts(void *rx_queue, + */ + rxd = rxdp[(bd_base_info & (1u << HNS3_RXD_VLD_B)) - + (1u << HNS3_RXD_VLD_B)]; ++ RX_BD_LOG(&rxq->hns->hw, DEBUG, &rxd); + + nmb = hns3_rx_alloc_buffer(rxq); + if (unlikely(nmb == NULL)) { +@@ -4274,6 +4275,8 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) + tx_next_use = 0; + tx_bak_pkt = txq->sw_ring; + } ++ if (m_seg != NULL) ++ TX_BD_LOG(&txq->hns->hw, DEBUG, desc); + + i++; + } while (m_seg != NULL); +@@ -4281,6 +4284,7 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) + /* Add end flag for the last Tx Buffer Descriptor */ + desc->tx.tp_fe_sc_vld_ra_ri |= + rte_cpu_to_le_16(BIT(HNS3_TXD_FE_B)); ++ TX_BD_LOG(&txq->hns->hw, DEBUG, desc); + + /* Increment bytes counter */ + txq->basic_stats.bytes += tx_pkt->pkt_len; +diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h +index 7685ac2ea3..b6a6513307 100644 +--- a/drivers/net/hns3/hns3_rxtx.h ++++ b/drivers/net/hns3/hns3_rxtx.h +@@ -553,6 +553,35 @@ struct hns3_tx_queue { + bool enabled; /* indicate if Tx queue has been enabled */ + }; + ++#define RX_BD_LOG(hw, level, rxdp) \ ++ PMD_RX_LOG(hw, level, "Rx descriptor: " \ ++ "l234_info=%#x pkt_len=%u size=%u rss_hash=%#x fd_id=%u vlan_tag=%u " \ ++ "o_dm_vlan_id_fb=%#x ot_vlan_tag=%u bd_base_info=%#x", \ ++ rte_le_to_cpu_32((rxdp)->rx.l234_info), \ ++ rte_le_to_cpu_16((rxdp)->rx.pkt_len), \ ++ rte_le_to_cpu_16((rxdp)->rx.size), \ ++ rte_le_to_cpu_32((rxdp)->rx.rss_hash), \ ++ rte_le_to_cpu_16((rxdp)->rx.fd_id), \ ++ rte_le_to_cpu_16((rxdp)->rx.vlan_tag), \ ++ rte_le_to_cpu_16((rxdp)->rx.o_dm_vlan_id_fb), \ ++ rte_le_to_cpu_16((rxdp)->rx.ot_vlan_tag), \ ++ rte_le_to_cpu_32((rxdp)->rx.bd_base_info)) ++ ++#define TX_BD_LOG(hw, level, txdp) \ ++ PMD_TX_LOG(hw, level, "Tx descriptor: " \ ++ "vlan_tag=%u send_size=%u type_cs_vlan_tso_len=%#x outer_vlan_tag=%u " \ ++ "tv=%#x ol_type_vlan_len_msec=%#x paylen_fd_dop_ol4cs=%#x " \ ++ "tp_fe_sc_vld_ra_ri=%#x ckst_mss=%u", \ ++ rte_le_to_cpu_16((txdp)->tx.vlan_tag), \ ++ rte_le_to_cpu_16((txdp)->tx.send_size), \ ++ rte_le_to_cpu_32((txdp)->tx.type_cs_vlan_tso_len), \ ++ rte_le_to_cpu_16((txdp)->tx.outer_vlan_tag), \ ++ rte_le_to_cpu_16((txdp)->tx.tv), \ ++ rte_le_to_cpu_32((txdp)->tx.ol_type_vlan_len_msec), \ ++ rte_le_to_cpu_32((txdp)->tx.paylen_fd_dop_ol4cs), \ ++ rte_le_to_cpu_16((txdp)->tx.tp_fe_sc_vld_ra_ri), \ ++ rte_le_to_cpu_16((txdp)->tx.ckst_mss)) ++ + #define HNS3_GET_TX_QUEUE_PEND_BD_NUM(txq) \ + ((txq)->nb_tx_desc - 1 - (txq)->tx_bd_ready) + +-- +2.23.0 + diff --git a/dpdk.spec b/dpdk.spec index 0680ac2..a7102e9 100644 --- a/dpdk.spec +++ b/dpdk.spec @@ -1,6 +1,6 @@ Name: dpdk Version: 21.11 -Release: 42 +Release: 43 Packager: packaging@6wind.com URL: http://dpdk.org %global source_version 21.11 @@ -303,6 +303,14 @@ Patch9281: 0281-net-hns3-fix-empty-devargs-parsing.patch Patch9282: 0282-net-virtio-fix-empty-devargs-parsing.patch Patch9283: 0283-dma-skeleton-fix-empty-devargs-parsing.patch Patch9284: 0284-raw-skeleton-fix-empty-devargs-parsing.patch +Patch9285: 0285-net-hns3-simplify-hardware-checksum-offloading.patch +Patch9286: 0286-net-hns3-support-dump-media-type.patch +Patch9287: 0287-ethdev-fix-one-address-occupies-two-entries-in-MAC-a.patch +Patch9288: 0288-net-hns3-fix-never-set-MAC-flow-control.patch +Patch9289: 0289-net-hns3-add-flow-control-autoneg-for-fiber-port.patch +Patch9290: 0290-net-hns3-fix-variable-type-mismatch.patch +Patch9291: 0291-net-hns3-fix-Rx-multiple-firmware-reset-interrupts.patch +Patch9292: 0292-net-hns3-add-Tx-Rx-descriptor-logs.patch Summary: Data Plane Development Kit core Group: System Environment/Libraries @@ -450,6 +458,16 @@ strip -g $RPM_BUILD_ROOT/lib/modules/%{kern_devel_ver}/extra/dpdk/igb_uio.ko /usr/sbin/depmod %changelog +* Wed May 24 2023 chenjiji - 21.11-43 + 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 + * Thu Apr 27 2023 chenjiji - 21.11-42 - fix empty devargs parsing Sync some patchs from upstreaming and modifies are as