DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver
@ 2020-04-29 11:13 Wei Hu (Xavier)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 1/6] net/hns3: get Tx abnormal errors in extend device statistics Wei Hu (Xavier)
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: Wei Hu (Xavier) @ 2020-04-29 11:13 UTC (permalink / raw)
  To: dev

This series are misc updates and bugfixes for hns3 PMD driver.

Lijun Ou (1):
  net/hns3: print the detail ret value

Min Hu (Connor) (1):
  net/hns3: fix VLAN pvid when configuring device

Wei Hu (Xavier) (4):
  net/hns3: get Tx abnormal errors in extend device statistics
  net/hns3: get PCI revision id
  net/hns3: fix MSI-x interrupt number during initialization
  net/hns3: fix return value when clearing statistics fails

 drivers/net/hns3/hns3_dcb.c       |   7 +-
 drivers/net/hns3/hns3_ethdev.c    |  33 ++++++--
 drivers/net/hns3/hns3_ethdev.h    |   5 ++
 drivers/net/hns3/hns3_ethdev_vf.c |  18 +++-
 drivers/net/hns3/hns3_fdir.c      |  12 +--
 drivers/net/hns3/hns3_rxtx.c      |  24 +++++-
 drivers/net/hns3/hns3_rxtx.h      |  48 +++++++++++
 drivers/net/hns3/hns3_stats.c     | 136 ++++++++++++++++++++++++------
 8 files changed, 234 insertions(+), 49 deletions(-)

-- 
2.23.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [dpdk-dev] [PATCH 1/6] net/hns3: get Tx abnormal errors in extend device statistics
  2020-04-29 11:13 [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Wei Hu (Xavier)
@ 2020-04-29 11:13 ` Wei Hu (Xavier)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 2/6] net/hns3: print the detail ret value Wei Hu (Xavier)
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Wei Hu (Xavier) @ 2020-04-29 11:13 UTC (permalink / raw)
  To: dev

From: "Wei Hu (Xavier)" <xavier.huwei@huawei.com>

When upper level application calls the rte_eth_tx_burst API function to
send multiple packets at a time with burst mode based on hns3 network
engine, there are some abnormal conditions that cause the driver to fail
to operate the hardware to send packets correctly.

This patch adds some statistic counts for the abnormal errors of Tx data
path to the extend device statistics. The upper level application can get
them by calling the rte_eth_xstats_get API function.

Note:
When using burst mode to call the rte_eth_tx_burst API function to send
multiple packets at a time. When the first abnormal error is detected,
add one to the relevant error statistics item, and then exit the loop of
sending multiple packets of the function. That is to say, even if there
are multiple packets in which abnormal errors may be detected in the burst,
the relevant error statistics in the driver will only be increased by one.

The detail description of the Tx abnormal errors statistic items as below:
 - TX_OVER_LENGTH_PKT_CNT
     Total number of greater than HNS3_MAX_FRAME_LEN the driver supported.

 - TX_EXCEED_LIMITED_BD_PKT_CNT
     Total number of exceeding the hardware limited bd which process a
     packet needed bd numbers.

 - TX_EXCEED_LIMITED_BD_PKT_REASSEMBLE_FAIL_CNT
     Total number of exceeding the hardware limited bd fail which
     process a packet needed bd numbers and reassemble fail.

 - TX_UNSUPPORTED_TUNNEL_PKT_CNT
     Total number of unsupported tunnel packet. The unsupported tunnel
     type: vxlan_gpe, gtp, ipip and MPLSINUDP, MPLSINUDP is a packet
     with MPLS-in-UDP RFC 7510 header.

 - TX_QUEUE_FULL_CNT
     Total count which the available bd numbers in current bd queue is
     less than the bd numbers with the pkt process needed.

 - TX_SHORT_PKT_PAD_FAIL_CNT
     Total count which the packet length is less than minimum packet
     size HNS3_MIN_PKT_SIZE and fail to be appended with 0.

Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
Signed-off-by: Huisong Li <lihuisong@huawei.com>
Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Signed-off-by: Hao Chen <chenhao164@huawei.com>
---
 drivers/net/hns3/hns3_rxtx.c  |  24 +++++--
 drivers/net/hns3/hns3_rxtx.h  |  48 ++++++++++++++
 drivers/net/hns3/hns3_stats.c | 115 +++++++++++++++++++++++++++-------
 3 files changed, 159 insertions(+), 28 deletions(-)

diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c
index 0728cb182..8b3ced116 100644
--- a/drivers/net/hns3/hns3_rxtx.c
+++ b/drivers/net/hns3/hns3_rxtx.c
@@ -1708,6 +1708,12 @@ hns3_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc,
 	txq->configured = true;
 	txq->io_base = (void *)((char *)hw->io_base + HNS3_TQP_REG_OFFSET +
 				idx * HNS3_TQP_REG_SIZE);
+	txq->over_length_pkt_cnt = 0;
+	txq->exceed_limit_bd_pkt_cnt = 0;
+	txq->exceed_limit_bd_reassem_fail = 0;
+	txq->unsupported_tunnel_pkt_cnt = 0;
+	txq->queue_full_cnt = 0;
+	txq->pkt_padding_fail_cnt = 0;
 	rte_spinlock_lock(&hw->lock);
 	dev->data->tx_queues[idx] = txq;
 	rte_spinlock_unlock(&hw->lock);
@@ -2347,8 +2353,10 @@ hns3_parse_cksum(struct hns3_tx_queue *txq, uint16_t tx_desc_id,
 	if (m->ol_flags & PKT_TX_TUNNEL_MASK) {
 		(void)rte_net_get_ptype(m, hdr_lens, RTE_PTYPE_ALL_MASK);
 		if (hns3_parse_tunneling_params(txq, tx_desc_id, m->ol_flags,
-						hdr_lens))
+						hdr_lens)) {
+			txq->unsupported_tunnel_pkt_cnt++;
 			return -EINVAL;
+		}
 	}
 	/* Enable checksum offloading */
 	if (m->ol_flags & HNS3_TX_CKSUM_OFFLOAD_MASK)
@@ -2371,13 +2379,18 @@ hns3_check_non_tso_pkt(uint16_t nb_buf, struct rte_mbuf **m_seg,
 	 * If packet length is greater than HNS3_MAX_FRAME_LEN
 	 * driver support, the packet will be ignored.
 	 */
-	if (unlikely(rte_pktmbuf_pkt_len(tx_pkt) > HNS3_MAX_FRAME_LEN))
+	if (unlikely(rte_pktmbuf_pkt_len(tx_pkt) > HNS3_MAX_FRAME_LEN)) {
+		txq->over_length_pkt_cnt++;
 		return -EINVAL;
+	}
 
 	if (unlikely(nb_buf > HNS3_MAX_NON_TSO_BD_PER_PKT)) {
+		txq->exceed_limit_bd_pkt_cnt++;
 		ret = hns3_reassemble_tx_pkts(txq, tx_pkt, &new_pkt);
-		if (ret)
+		if (ret) {
+			txq->exceed_limit_bd_reassem_fail++;
 			return ret;
+		}
 		*m_seg = new_pkt;
 	}
 
@@ -2415,6 +2428,7 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 		nb_buf = tx_pkt->nb_segs;
 
 		if (nb_buf > txq->tx_bd_ready) {
+			txq->queue_full_cnt++;
 			if (nb_tx == 0)
 				return 0;
 
@@ -2432,8 +2446,10 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 			add_len = HNS3_MIN_PKT_SIZE -
 					 rte_pktmbuf_pkt_len(tx_pkt);
 			appended = rte_pktmbuf_append(tx_pkt, add_len);
-			if (appended == NULL)
+			if (appended == NULL) {
+				txq->pkt_padding_fail_cnt++;
 				break;
+			}
 
 			memset(appended, 0, add_len);
 		}
diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h
index 771f3c9be..0cb92ce9b 100644
--- a/drivers/net/hns3/hns3_rxtx.h
+++ b/drivers/net/hns3/hns3_rxtx.h
@@ -270,6 +270,54 @@ struct hns3_tx_queue {
 
 	bool tx_deferred_start; /* don't start this queue in dev start */
 	bool configured;        /* indicate if tx queue has been configured */
+
+	/*
+	 * The following items are used for the abnormal errors statistics in
+	 * the Tx datapath. When upper level application calls the
+	 * rte_eth_tx_burst API function to send multiple packets at a time with
+	 * burst mode based on hns3 network engine, there are some abnormal
+	 * conditions that cause the driver to fail to operate the hardware to
+	 * send packets correctly.
+	 * Note: When using burst mode to call the rte_eth_tx_burst API function
+	 * to send multiple packets at a time. When the first abnormal error is
+	 * detected, add one to the relevant error statistics item, and then
+	 * exit the loop of sending multiple packets of the function. That is to
+	 * say, even if there are multiple packets in which abnormal errors may
+	 * be detected in the burst, the relevant error statistics in the driver
+	 * will only be increased by one.
+	 * The detail description of the Tx abnormal errors statistic items as
+	 * below:
+	 *  - over_length_pkt_cnt
+	 *     Total number of greater than HNS3_MAX_FRAME_LEN the driver
+	 *     supported.
+	 *
+	 * - exceed_limit_bd_pkt_cnt
+	 *     Total number of exceeding the hardware limited bd which process
+	 *     a packet needed bd numbers.
+	 *
+	 * - exceed_limit_bd_reassem_fail
+	 *     Total number of exceeding the hardware limited bd fail which
+	 *     process a packet needed bd numbers and reassemble fail.
+	 *
+	 * - unsupported_tunnel_pkt_cnt
+	 *     Total number of unsupported tunnel packet. The unsupported tunnel
+	 *     type: vxlan_gpe, gtp, ipip and MPLSINUDP, MPLSINUDP is a packet
+	 *     with MPLS-in-UDP RFC 7510 header.
+	 *
+	 * - queue_full_cnt
+	 *     Total count which the available bd numbers in current bd queue is
+	 *     less than the bd numbers with the pkt process needed.
+	 *
+	 * - pkt_padding_fail_cnt
+	 *     Total count which the packet length is less than minimum packet
+	 *     size HNS3_MIN_PKT_SIZE and fail to be appended with 0.
+	 */
+	uint64_t over_length_pkt_cnt;
+	uint64_t exceed_limit_bd_pkt_cnt;
+	uint64_t exceed_limit_bd_reassem_fail;
+	uint64_t unsupported_tunnel_pkt_cnt;
+	uint64_t queue_full_cnt;
+	uint64_t pkt_padding_fail_cnt;
 };
 
 struct hns3_queue_info {
diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c
index 2891875f4..ad276206c 100644
--- a/drivers/net/hns3/hns3_stats.c
+++ b/drivers/net/hns3/hns3_stats.c
@@ -234,6 +234,22 @@ static const struct hns3_xstats_name_offset hns3_rx_bd_error_strings[] = {
 		HNS3_RX_BD_ERROR_STATS_FIELD_OFFSET(ol4_csum_erros)}
 };
 
+/* The statistic of the Tx errors */
+static const struct hns3_xstats_name_offset hns3_tx_errors_strings[] = {
+	{"TX_OVER_LENGTH_PKT_CNT",
+		HNS3_TX_ERROR_STATS_FIELD_OFFSET(over_length_pkt_cnt)},
+	{"TX_EXCEED_LIMITED_BD_PKT_CNT",
+		HNS3_TX_ERROR_STATS_FIELD_OFFSET(exceed_limit_bd_pkt_cnt)},
+	{"TX_EXCEED_LIMITED_BD_PKT_REASSEMBLE_FAIL_CNT",
+		HNS3_TX_ERROR_STATS_FIELD_OFFSET(exceed_limit_bd_reassem_fail)},
+	{"TX_UNSUPPORTED_TUNNEL_PKT_CNT",
+		HNS3_TX_ERROR_STATS_FIELD_OFFSET(unsupported_tunnel_pkt_cnt)},
+	{"TX_QUEUE_FULL_CNT",
+		HNS3_TX_ERROR_STATS_FIELD_OFFSET(queue_full_cnt)},
+	{"TX_SHORT_PKT_PAD_FAIL_CNT",
+		HNS3_TX_ERROR_STATS_FIELD_OFFSET(pkt_padding_fail_cnt)}
+};
+
 /* The statistic of rx queue */
 static const struct hns3_xstats_name_offset hns3_rx_queue_strings[] = {
 	{"RX_QUEUE_FBD", HNS3_RING_RX_FBDNUM_REG}
@@ -256,6 +272,9 @@ static const struct hns3_xstats_name_offset hns3_tx_queue_strings[] = {
 #define HNS3_NUM_RX_BD_ERROR_XSTATS (sizeof(hns3_rx_bd_error_strings) / \
 	sizeof(hns3_rx_bd_error_strings[0]))
 
+#define HNS3_NUM_TX_ERRORS_XSTATS (sizeof(hns3_tx_errors_strings) / \
+	sizeof(hns3_tx_errors_strings[0]))
+
 #define HNS3_NUM_RX_QUEUE_STATS (sizeof(hns3_rx_queue_strings) / \
 	sizeof(hns3_rx_queue_strings[0]))
 
@@ -491,6 +510,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)
 	struct hns3_tqp_stats *stats = &hw->tqp_stats;
 	struct hns3_cmd_desc desc_reset;
 	struct hns3_rx_queue *rxq;
+	struct hns3_tx_queue *txq;
 	uint16_t i;
 	int ret;
 
@@ -520,7 +540,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)
 		}
 	}
 
-	/* Clear Rx BD and Tx error stats */
+	/* Clear the Rx BD errors stats */
 	for (i = 0; i != eth_dev->data->nb_rx_queues; ++i) {
 		rxq = eth_dev->data->rx_queues[i];
 		if (rxq) {
@@ -533,6 +553,19 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)
 		}
 	}
 
+	/* Clear the Tx errors stats */
+	for (i = 0; i != eth_dev->data->nb_tx_queues; ++i) {
+		txq = eth_dev->data->tx_queues[i];
+		if (txq) {
+			txq->over_length_pkt_cnt = 0;
+			txq->exceed_limit_bd_pkt_cnt = 0;
+			txq->exceed_limit_bd_reassem_fail = 0;
+			txq->unsupported_tunnel_pkt_cnt = 0;
+			txq->queue_full_cnt = 0;
+			txq->pkt_padding_fail_cnt = 0;
+		}
+	}
+
 	memset(stats, 0, sizeof(struct hns3_tqp_stats));
 
 	return 0;
@@ -559,15 +592,51 @@ hns3_xstats_calc_num(struct rte_eth_dev *dev)
 {
 	struct hns3_adapter *hns = dev->data->dev_private;
 	int bderr_stats = dev->data->nb_rx_queues * HNS3_NUM_RX_BD_ERROR_XSTATS;
+	int tx_err_stats = dev->data->nb_tx_queues * HNS3_NUM_TX_ERRORS_XSTATS;
 	int rx_queue_stats = dev->data->nb_rx_queues * HNS3_NUM_RX_QUEUE_STATS;
 	int tx_queue_stats = dev->data->nb_tx_queues * HNS3_NUM_TX_QUEUE_STATS;
 
 	if (hns->is_vf)
-		return bderr_stats + rx_queue_stats + tx_queue_stats +
-			HNS3_NUM_RESET_XSTATS;
+		return bderr_stats + tx_err_stats + rx_queue_stats +
+		       tx_queue_stats + HNS3_NUM_RESET_XSTATS;
 	else
-		return bderr_stats + rx_queue_stats + tx_queue_stats +
-			HNS3_FIX_NUM_STATS;
+		return bderr_stats + tx_err_stats + rx_queue_stats +
+		       tx_queue_stats + HNS3_FIX_NUM_STATS;
+}
+
+static void
+hns3_get_queue_stats(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
+		     int *count)
+{
+	struct hns3_adapter *hns = dev->data->dev_private;
+	struct hns3_hw *hw = &hns->hw;
+	uint32_t reg_offset;
+	uint16_t i, j;
+
+	/* Get rx queue stats */
+	for (j = 0; j < dev->data->nb_rx_queues; j++) {
+		for (i = 0; i < HNS3_NUM_RX_QUEUE_STATS; i++) {
+			reg_offset = HNS3_TQP_REG_OFFSET +
+					HNS3_TQP_REG_SIZE * j;
+			xstats[*count].value = hns3_read_dev(hw,
+				reg_offset + hns3_rx_queue_strings[i].offset);
+			xstats[*count].id = *count;
+			(*count)++;
+		}
+	}
+
+	/* Get tx queue stats */
+	for (j = 0; j < dev->data->nb_tx_queues; j++) {
+		for (i = 0; i < HNS3_NUM_TX_QUEUE_STATS; i++) {
+			reg_offset = HNS3_TQP_REG_OFFSET +
+					HNS3_TQP_REG_SIZE * j;
+			xstats[*count].value = hns3_read_dev(hw,
+				reg_offset + hns3_tx_queue_strings[i].offset);
+			xstats[*count].id = *count;
+			(*count)++;
+		}
+	}
+
 }
 
 /*
@@ -593,7 +662,7 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
 	struct hns3_mac_stats *mac_stats = &hw->mac_stats;
 	struct hns3_reset_stats *reset_stats = &hw->reset.stats;
 	struct hns3_rx_queue *rxq;
-	uint32_t reg_offset;
+	struct hns3_tx_queue *txq;
 	uint16_t i, j;
 	char *addr;
 	int count;
@@ -652,30 +721,18 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
 		}
 	}
 
-	/* Get rx queue stats */
-	for (j = 0; j < dev->data->nb_rx_queues; j++) {
-		for (i = 0; i < HNS3_NUM_RX_QUEUE_STATS; i++) {
-			reg_offset = HNS3_TQP_REG_OFFSET +
-					HNS3_TQP_REG_SIZE * j;
-			xstats[count].value = hns3_read_dev(hw,
-				reg_offset + hns3_rx_queue_strings[i].offset);
-			xstats[count].id = count;
-			count++;
-		}
-	}
-
-	/* Get tx queue stats */
+	/* Get the Tx errors stats */
 	for (j = 0; j < dev->data->nb_tx_queues; j++) {
-		for (i = 0; i < HNS3_NUM_TX_QUEUE_STATS; i++) {
-			reg_offset = HNS3_TQP_REG_OFFSET +
-					HNS3_TQP_REG_SIZE * j;
-			xstats[count].value = hns3_read_dev(hw,
-				reg_offset + hns3_tx_queue_strings[i].offset);
+		for (i = 0; i < HNS3_NUM_TX_ERRORS_XSTATS; i++) {
+			txq = dev->data->tx_queues[j];
+			addr = (char *)txq + hns3_tx_errors_strings[i].offset;
+			xstats[count].value = *(uint64_t *)addr;
 			xstats[count].id = count;
 			count++;
 		}
 	}
 
+	hns3_get_queue_stats(dev, xstats, &count);
 	return count;
 }
 
@@ -750,6 +807,16 @@ hns3_dev_xstats_get_names(struct rte_eth_dev *dev,
 		}
 	}
 
+	for (j = 0; j < dev->data->nb_tx_queues; j++) {
+		for (i = 0; i < HNS3_NUM_TX_ERRORS_XSTATS; i++) {
+			snprintf(xstats_names[count].name,
+				 sizeof(xstats_names[count].name),
+				 "tx_q%u%s", j,
+				 hns3_tx_errors_strings[i].name);
+			count++;
+		}
+	}
+
 	for (j = 0; j < dev->data->nb_rx_queues; j++) {
 		for (i = 0; i < HNS3_NUM_RX_QUEUE_STATS; i++) {
 			snprintf(xstats_names[count].name,
-- 
2.23.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [dpdk-dev] [PATCH 2/6] net/hns3: print the detail ret value
  2020-04-29 11:13 [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Wei Hu (Xavier)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 1/6] net/hns3: get Tx abnormal errors in extend device statistics Wei Hu (Xavier)
@ 2020-04-29 11:13 ` Wei Hu (Xavier)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 3/6] net/hns3: get PCI revision id Wei Hu (Xavier)
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Wei Hu (Xavier) @ 2020-04-29 11:13 UTC (permalink / raw)
  To: dev

From: Lijun Ou <oulijun@huawei.com>

Here adds some prints for return value when the relative function fails
and enter the exception branch.

Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
---
 drivers/net/hns3/hns3_dcb.c    |  7 +++++--
 drivers/net/hns3/hns3_ethdev.c |  4 ++--
 drivers/net/hns3/hns3_fdir.c   | 12 ++++++------
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/drivers/net/hns3/hns3_dcb.c b/drivers/net/hns3/hns3_dcb.c
index 7dd77dc61..02628b6b6 100644
--- a/drivers/net/hns3/hns3_dcb.c
+++ b/drivers/net/hns3/hns3_dcb.c
@@ -768,13 +768,16 @@ hns3_dcb_pri_tc_base_dwrr_cfg(struct hns3_hw *hw)
 
 		ret = hns3_dcb_pri_weight_cfg(hw, i, dwrr);
 		if (ret) {
-			hns3_err(hw, "fail to send priority weight cmd: %d", i);
+			hns3_err(hw,
+			       "fail to send priority weight cmd: %d, ret = %d",
+			       i, ret);
 			return ret;
 		}
 
 		ret = hns3_dcb_qs_weight_cfg(hw, i, BW_MAX_PERCENT);
 		if (ret) {
-			hns3_err(hw, "fail to send qs_weight cmd: %d", i);
+			hns3_err(hw, "fail to send qs_weight cmd: %d, ret = %d",
+				 i, ret);
 			return ret;
 		}
 	}
diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index c314d3711..8ff638850 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -2064,8 +2064,8 @@ hns3_configure_all_mc_mac_addr(struct hns3_adapter *hns, bool del)
 			err = ret;
 			rte_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE,
 					      addr);
-			hns3_dbg(hw, "%s mc mac addr: %s failed",
-				 del ? "Remove" : "Restore", mac_str);
+			hns3_dbg(hw, "%s mc mac addr: %s failed for pf: ret = %d",
+				 del ? "Remove" : "Restore", mac_str, ret);
 		}
 	}
 	return err;
diff --git a/drivers/net/hns3/hns3_fdir.c b/drivers/net/hns3/hns3_fdir.c
index 26c311758..4c5928ffc 100644
--- a/drivers/net/hns3/hns3_fdir.c
+++ b/drivers/net/hns3/hns3_fdir.c
@@ -945,12 +945,12 @@ int hns3_fdir_filter_program(struct hns3_adapter *hns,
 					  false);
 		if (ret)
 			hns3_err(hw, "Failed to delete fdir: %d src_ip:%x "
-				 "dst_ip:%x src_port:%d dst_port:%d",
+				 "dst_ip:%x src_port:%d dst_port:%d ret = %d",
 				 rule->location,
 				 rule->key_conf.spec.src_ip[IP_ADDR_KEY_ID],
 				 rule->key_conf.spec.dst_ip[IP_ADDR_KEY_ID],
 				 rule->key_conf.spec.src_port,
-				 rule->key_conf.spec.dst_port);
+				 rule->key_conf.spec.dst_port, ret);
 		else
 			hns3_remove_fdir_filter(hw, fdir_info, &rule->key_conf);
 
@@ -986,12 +986,12 @@ int hns3_fdir_filter_program(struct hns3_adapter *hns,
 	rte_spinlock_unlock(&fdir_info->flows_lock);
 	if (ret) {
 		hns3_err(hw, "Failed to config fdir: %d src_ip:%x dst_ip:%x "
-			 "src_port:%d dst_port:%d",
+			 "src_port:%d dst_port:%d ret = %d",
 			 rule->location,
 			 rule->key_conf.spec.src_ip[IP_ADDR_KEY_ID],
 			 rule->key_conf.spec.dst_ip[IP_ADDR_KEY_ID],
 			 rule->key_conf.spec.src_port,
-			 rule->key_conf.spec.dst_port);
+			 rule->key_conf.spec.dst_port, ret);
 		(void)hns3_remove_fdir_filter(hw, fdir_info, &rule->key_conf);
 	}
 
@@ -1023,7 +1023,7 @@ int hns3_clear_all_fdir_filter(struct hns3_adapter *hns)
 	}
 
 	if (ret) {
-		hns3_err(hw, "Fail to delete FDIR filter!");
+		hns3_err(hw, "Fail to delete FDIR filter, ret = %d", ret);
 		ret = -EIO;
 	}
 	return ret;
@@ -1050,7 +1050,7 @@ int hns3_restore_all_fdir_filter(struct hns3_adapter *hns)
 	}
 
 	if (err) {
-		hns3_err(hw, "Fail to restore FDIR filter!");
+		hns3_err(hw, "Fail to restore FDIR filter, ret = %d", ret);
 		return -EIO;
 	}
 	return 0;
-- 
2.23.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [dpdk-dev] [PATCH 3/6] net/hns3: get PCI revision id
  2020-04-29 11:13 [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Wei Hu (Xavier)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 1/6] net/hns3: get Tx abnormal errors in extend device statistics Wei Hu (Xavier)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 2/6] net/hns3: print the detail ret value Wei Hu (Xavier)
@ 2020-04-29 11:13 ` Wei Hu (Xavier)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 4/6] net/hns3: fix VLAN pvid when configuring device Wei Hu (Xavier)
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Wei Hu (Xavier) @ 2020-04-29 11:13 UTC (permalink / raw)
  To: dev

From: "Wei Hu (Xavier)" <xavier.huwei@huawei.com>

The hns3 network engine is built-in multiple SoCs, such as kunpeng 920,
kunpeng 930, etc. The PCI revision id is 0x21 in kunpeng 920, and the PCI
revision id is 0x30 in kunpeng 930.

This patch gets PCI revison to identify different version of hardware
network engine.

Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
---
 drivers/net/hns3/hns3_ethdev.c    | 12 ++++++++++++
 drivers/net/hns3/hns3_ethdev.h    |  5 +++++
 drivers/net/hns3/hns3_ethdev_vf.c | 13 +++++++++++++
 3 files changed, 30 insertions(+)

diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index 8ff638850..ae87aa0dd 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -5326,9 +5326,21 @@ hns3_dev_init(struct rte_eth_dev *eth_dev)
 	struct hns3_adapter *hns = eth_dev->data->dev_private;
 	struct hns3_hw *hw = &hns->hw;
 	uint16_t device_id = pci_dev->id.device_id;
+	uint8_t revision;
 	int ret;
 
 	PMD_INIT_FUNC_TRACE();
+
+	/* Get PCI revision id */
+	ret = rte_pci_read_config(pci_dev, &revision, HNS3_PCI_REVISION_ID_LEN,
+				  HNS3_PCI_REVISION_ID);
+	if (ret != HNS3_PCI_REVISION_ID_LEN) {
+		PMD_INIT_LOG(ERR, "Failed to read pci revision id, ret = %d",
+			     ret);
+		return -EIO;
+	}
+	hw->revision = revision;
+
 	eth_dev->process_private = (struct hns3_process_private *)
 	    rte_zmalloc_socket("hns3_filter_list",
 			       sizeof(struct hns3_process_private),
diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h
index 0423e64ea..06a186451 100644
--- a/drivers/net/hns3/hns3_ethdev.h
+++ b/drivers/net/hns3/hns3_ethdev.h
@@ -26,6 +26,10 @@
 #define HNS3_DEV_ID_100G_VF			0xA22E
 #define HNS3_DEV_ID_100G_RDMA_PFC_VF		0xA22F
 
+/* PCI Config offsets */
+#define HNS3_PCI_REVISION_ID			0x08
+#define HNS3_PCI_REVISION_ID_LEN		1
+
 #define HNS3_UC_MACADDR_NUM		128
 #define HNS3_VF_UC_MACADDR_NUM		48
 #define HNS3_MC_MACADDR_NUM		128
@@ -343,6 +347,7 @@ struct hns3_reset_data {
 struct hns3_hw {
 	struct rte_eth_dev_data *data;
 	void *io_base;
+	uint8_t revision;           /* PCI revision, low byte of class word */
 	struct hns3_cmq cmq;
 	struct hns3_mbx_resp_status mbx_resp; /* mailbox response */
 	struct hns3_mbx_arq_ring arq;         /* mailbox async rx queue */
diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c
index 93631872d..e26089065 100644
--- a/drivers/net/hns3/hns3_ethdev_vf.c
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
@@ -2409,12 +2409,25 @@ static const struct hns3_reset_ops hns3vf_reset_ops = {
 static int
 hns3vf_dev_init(struct rte_eth_dev *eth_dev)
 {
+	struct rte_device *dev = eth_dev->device;
+	struct rte_pci_device *pci_dev = RTE_DEV_TO_PCI(dev);
 	struct hns3_adapter *hns = eth_dev->data->dev_private;
 	struct hns3_hw *hw = &hns->hw;
+	uint8_t revision;
 	int ret;
 
 	PMD_INIT_FUNC_TRACE();
 
+	/* Get PCI revision id */
+	ret = rte_pci_read_config(pci_dev, &revision, HNS3_PCI_REVISION_ID_LEN,
+				  HNS3_PCI_REVISION_ID);
+	if (ret != HNS3_PCI_REVISION_ID_LEN) {
+		PMD_INIT_LOG(ERR, "Failed to read pci revision id, ret = %d",
+			     ret);
+		return -EIO;
+	}
+	hw->revision = revision;
+
 	eth_dev->process_private = (struct hns3_process_private *)
 	    rte_zmalloc_socket("hns3_filter_list",
 			       sizeof(struct hns3_process_private),
-- 
2.23.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [dpdk-dev] [PATCH 4/6] net/hns3: fix VLAN pvid when configuring device
  2020-04-29 11:13 [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Wei Hu (Xavier)
                   ` (2 preceding siblings ...)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 3/6] net/hns3: get PCI revision id Wei Hu (Xavier)
@ 2020-04-29 11:13 ` Wei Hu (Xavier)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 5/6] net/hns3: fix MSI-x interrupt number during initialization Wei Hu (Xavier)
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Wei Hu (Xavier) @ 2020-04-29 11:13 UTC (permalink / raw)
  To: dev

From: "Min Hu (Connor)" <humin29@huawei.com>

In current version, when upper level application calls the
rte_eth_dev_configure API function, if pvid config is not set of the
input parameter which struct type is rte_eth_conf, hns3 pmd driver also
sets the VLAN pvid related configuration to hardware, and this is not
reasonable. For example, As pvid is set to 100 by
rte_eth_dev_set_vlan_pvid, when pvid config is not set in rte_eth_conf,
rte_eth_dev_configure will tell driver to delete pvid 0, and that is
meaningless.

This patch fixes it to ensure that driver does not set VLAN pvid related
configuration to hardware when pvid config is not set in rte_eth_conf.

Fixes: 411d23b9eafb ("net/hns3: support VLAN")
Cc: stable@dpdk.org

Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
---
 drivers/net/hns3/hns3_ethdev.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index ae87aa0dd..1fac4f366 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -1059,6 +1059,13 @@ hns3_dev_configure_vlan(struct rte_eth_dev *dev)
 		return ret;
 	}
 
+	/*
+	 * If pvid config is not set in rte_eth_conf, driver needn't to set
+	 * VLAN pvid related configuration to hardware.
+	 */
+	if (txmode->pvid == 0 && txmode->hw_vlan_insert_pvid == 0)
+		return 0;
+
 	/* Apply pvid setting */
 	ret = hns3_vlan_pvid_set(dev, txmode->pvid,
 				 txmode->hw_vlan_insert_pvid);
-- 
2.23.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [dpdk-dev] [PATCH 5/6] net/hns3: fix MSI-x interrupt number during initialization
  2020-04-29 11:13 [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Wei Hu (Xavier)
                   ` (3 preceding siblings ...)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 4/6] net/hns3: fix VLAN pvid when configuring device Wei Hu (Xavier)
@ 2020-04-29 11:13 ` Wei Hu (Xavier)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 6/6] net/hns3: fix return value when clearing statistics fails Wei Hu (Xavier)
  2020-05-05  9:12 ` [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Ferruh Yigit
  6 siblings, 0 replies; 8+ messages in thread
From: Wei Hu (Xavier) @ 2020-04-29 11:13 UTC (permalink / raw)
  To: dev

From: "Wei Hu (Xavier)" <xavier.huwei@huawei.com>

Currnetly, based on hns3 VF device error may occur during initialization.

The root cause as below:
When the following fomula is excuted during initialization, the private
variable named hw->tqps_num has not been obtained from PF driver through
mailbox, further causes failure when mapping interrupt and queues.
  hw->num_msi = (num_msi > hw->tqps_num + 1) ? hw->tqps_num + 1 : num_msi;
We need to use hw->tqp_num after it is correctly assigned.

On the other hand, because the private variable named hw->num_msi, which
represents the number of MSI-x interrupt of hns3 PF/VF device, is used in
the '.get_reg' ops implementation function to dump all interrupt related
registers, it should be obtained from firmware directly and we'd better
not modify it in the driver.

Fixes: ef2e785c36cf ("net/hns3: fix Tx interrupt when enabling Rx interrupt")
Fixes: 02a7b55657b2 ("net/hns3: support Rx interrupt")
Cc: stable@dpdk.org

Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
Signed-off-by: Hao Chen <chenhao164@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
---
 drivers/net/hns3/hns3_ethdev.c    | 10 +++++-----
 drivers/net/hns3/hns3_ethdev_vf.c |  5 +++--
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
index 1fac4f366..a09ac082e 100644
--- a/drivers/net/hns3/hns3_ethdev.c
+++ b/drivers/net/hns3/hns3_ethdev.c
@@ -2236,7 +2236,8 @@ hns3_init_ring_with_vector(struct hns3_hw *hw)
 	 * Rx interrupt.
 	 */
 	vec = hw->num_msi - 1; /* vector 0 for misc interrupt, not for queue */
-	hw->intr_tqps_num = vec - 1; /* the last interrupt is reserved */
+	/* vec - 1: the last interrupt is reserved */
+	hw->intr_tqps_num = vec > hw->tqps_num ? hw->tqps_num : vec - 1;
 	for (i = 0; i < hw->intr_tqps_num; i++) {
 		/*
 		 * Set gap limiter and rate limiter configuration of queue's
@@ -2625,7 +2626,6 @@ hns3_query_pf_resource(struct hns3_hw *hw)
 	struct hns3_pf *pf = &hns->pf;
 	struct hns3_pf_res_cmd *req;
 	struct hns3_cmd_desc desc;
-	uint16_t num_msi;
 	int ret;
 
 	hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_QUERY_PF_RSRC, true);
@@ -2657,9 +2657,9 @@ hns3_query_pf_resource(struct hns3_hw *hw)
 
 	pf->dv_buf_size = roundup(pf->dv_buf_size, HNS3_BUF_SIZE_UNIT);
 
-	num_msi = hns3_get_field(rte_le_to_cpu_16(req->pf_intr_vector_number),
-				 HNS3_VEC_NUM_M, HNS3_VEC_NUM_S);
-	hw->num_msi = (num_msi > hw->tqps_num + 1) ? hw->tqps_num + 1 : num_msi;
+	hw->num_msi =
+	    hns3_get_field(rte_le_to_cpu_16(req->pf_intr_vector_number),
+			   HNS3_VEC_NUM_M, HNS3_VEC_NUM_S);
 
 	return 0;
 }
diff --git a/drivers/net/hns3/hns3_ethdev_vf.c b/drivers/net/hns3/hns3_ethdev_vf.c
index e26089065..904562e03 100644
--- a/drivers/net/hns3/hns3_ethdev_vf.c
+++ b/drivers/net/hns3/hns3_ethdev_vf.c
@@ -713,7 +713,8 @@ hns3vf_init_ring_with_vector(struct hns3_hw *hw)
 	 * Rx interrupt.
 	 */
 	vec = hw->num_msi - 1; /* vector 0 for misc interrupt, not for queue */
-	hw->intr_tqps_num = vec - 1; /* the last interrupt is reserved */
+	/* vec - 1: the last interrupt is reserved */
+	hw->intr_tqps_num = vec > hw->tqps_num ? hw->tqps_num : vec - 1;
 	for (i = 0; i < hw->intr_tqps_num; i++) {
 		/*
 		 * Set gap limiter and rate limiter configuration of queue's
@@ -1473,7 +1474,7 @@ hns3_query_vf_resource(struct hns3_hw *hw)
 		return -EINVAL;
 	}
 
-	hw->num_msi = (num_msi > hw->tqps_num + 1) ? hw->tqps_num + 1 : num_msi;
+	hw->num_msi = num_msi;
 
 	return 0;
 }
-- 
2.23.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [dpdk-dev] [PATCH 6/6] net/hns3: fix return value when clearing statistics fails
  2020-04-29 11:13 [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Wei Hu (Xavier)
                   ` (4 preceding siblings ...)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 5/6] net/hns3: fix MSI-x interrupt number during initialization Wei Hu (Xavier)
@ 2020-04-29 11:13 ` Wei Hu (Xavier)
  2020-05-05  9:12 ` [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Ferruh Yigit
  6 siblings, 0 replies; 8+ messages in thread
From: Wei Hu (Xavier) @ 2020-04-29 11:13 UTC (permalink / raw)
  To: dev

From: "Wei Hu (Xavier)" <xavier.huwei@huawei.com>

Since the return value of the '.stats_reset' and '.xstats_reset' callback
function is int, when failing to issue command to firmware to execute clear
statistics, the relevant callback function should return non-zero value.

Fixes: 8839c5e202f3 ("net/hns3: support device stats")
Cc: stable@dpdk.org

Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
---
 drivers/net/hns3/hns3_stats.c | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c
index ad276206c..d2467a484 100644
--- a/drivers/net/hns3/hns3_stats.c
+++ b/drivers/net/hns3/hns3_stats.c
@@ -527,6 +527,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)
 		if (ret) {
 			hns3_err(hw, "Failed to reset RX No.%d queue stat: %d",
 				 i, ret);
+			return ret;
 		}
 
 		hns3_cmd_setup_basic_desc(&desc_reset, HNS3_OPC_QUERY_TX_STATUS,
@@ -537,6 +538,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)
 		if (ret) {
 			hns3_err(hw, "Failed to reset TX No.%d queue stat: %d",
 				 i, ret);
+			return ret;
 		}
 	}
 
@@ -571,7 +573,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)
 	return 0;
 }
 
-static void
+static int
 hns3_mac_stats_reset(__rte_unused struct rte_eth_dev *dev)
 {
 	struct hns3_adapter *hns = dev->data->dev_private;
@@ -580,10 +582,14 @@ hns3_mac_stats_reset(__rte_unused struct rte_eth_dev *dev)
 	int ret;
 
 	ret = hns3_query_update_mac_stats(dev);
-	if (ret)
+	if (ret) {
 		hns3_err(hw, "Clear Mac stats fail : %d", ret);
+		return ret;
+	}
 
 	memset(mac_stats, 0, sizeof(struct hns3_mac_stats));
+
+	return 0;
 }
 
 /* This function calculates the number of xstats based on the current config */
@@ -979,9 +985,13 @@ hns3_dev_xstats_reset(struct rte_eth_dev *dev)
 {
 	struct hns3_adapter *hns = dev->data->dev_private;
 	struct hns3_pf *pf = &hns->pf;
+	int ret;
 
 	/* Clear tqp stats */
-	(void)hns3_stats_reset(dev);
+	ret = hns3_stats_reset(dev);
+	if (ret)
+		return ret;
+
 	/* Clear reset stats */
 	memset(&hns->hw.reset.stats, 0, sizeof(struct hns3_reset_stats));
 
@@ -989,7 +999,10 @@ hns3_dev_xstats_reset(struct rte_eth_dev *dev)
 		return 0;
 
 	/* HW registers are cleared on read */
-	hns3_mac_stats_reset(dev);
+	ret = hns3_mac_stats_reset(dev);
+	if (ret)
+		return ret;
+
 	/* Clear error stats */
 	memset(&pf->abn_int_stats, 0, sizeof(struct hns3_err_msix_intr_stats));
 
-- 
2.23.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver
  2020-04-29 11:13 [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Wei Hu (Xavier)
                   ` (5 preceding siblings ...)
  2020-04-29 11:13 ` [dpdk-dev] [PATCH 6/6] net/hns3: fix return value when clearing statistics fails Wei Hu (Xavier)
@ 2020-05-05  9:12 ` Ferruh Yigit
  6 siblings, 0 replies; 8+ messages in thread
From: Ferruh Yigit @ 2020-05-05  9:12 UTC (permalink / raw)
  To: Wei Hu (Xavier), dev

On 4/29/2020 12:13 PM, Wei Hu (Xavier) wrote:
> This series are misc updates and bugfixes for hns3 PMD driver.
> 
> Lijun Ou (1):
>   net/hns3: print the detail ret value
> 
> Min Hu (Connor) (1):
>   net/hns3: fix VLAN pvid when configuring device
> 
> Wei Hu (Xavier) (4):
>   net/hns3: get Tx abnormal errors in extend device statistics
>   net/hns3: get PCI revision id
>   net/hns3: fix MSI-x interrupt number during initialization
>   net/hns3: fix return value when clearing statistics fails

Series applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-05-05  9:12 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-29 11:13 [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Wei Hu (Xavier)
2020-04-29 11:13 ` [dpdk-dev] [PATCH 1/6] net/hns3: get Tx abnormal errors in extend device statistics Wei Hu (Xavier)
2020-04-29 11:13 ` [dpdk-dev] [PATCH 2/6] net/hns3: print the detail ret value Wei Hu (Xavier)
2020-04-29 11:13 ` [dpdk-dev] [PATCH 3/6] net/hns3: get PCI revision id Wei Hu (Xavier)
2020-04-29 11:13 ` [dpdk-dev] [PATCH 4/6] net/hns3: fix VLAN pvid when configuring device Wei Hu (Xavier)
2020-04-29 11:13 ` [dpdk-dev] [PATCH 5/6] net/hns3: fix MSI-x interrupt number during initialization Wei Hu (Xavier)
2020-04-29 11:13 ` [dpdk-dev] [PATCH 6/6] net/hns3: fix return value when clearing statistics fails Wei Hu (Xavier)
2020-05-05  9:12 ` [dpdk-dev] [PATCH 0/6] misc updates and bugfixes for hns3 PMD driver Ferruh Yigit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).