diff --git a/drivers/net/hns3/hns3_rxtx.c b/drivers/net/hns3/hns3_rxtx.c
index 184b8e4b6..709e07c80 100644
--- a/drivers/net/hns3/hns3_rxtx.c
+++ b/drivers/net/hns3/hns3_rxtx.c
@@ -660,7 +660,6 @@ hns3_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc,
 	rxq->l4_csum_erros = 0;
 	rxq->ol3_csum_erros = 0;
 	rxq->ol4_csum_erros = 0;
-	rxq->errors = 0;
 
 	rte_spinlock_lock(&hw->lock);
 	dev->data->rx_queues[idx] = rxq;
@@ -816,14 +815,12 @@ hns3_handle_bdinfo(struct hns3_rx_queue *rxq, struct rte_mbuf *rxm,
 
 	if (unlikely(l234_info & BIT(HNS3_RXD_L2E_B))) {
 		rxq->l2_errors++;
-		rxq->errors++;
 		return -EINVAL;
 	}
 
 	if (unlikely(rxm->pkt_len == 0 ||
 		(l234_info & BIT(HNS3_RXD_TRUNCAT_B)))) {
 		rxq->pkt_len_errors++;
-		rxq->errors++;
 		return -EINVAL;
 	}
 
@@ -979,6 +976,7 @@ hns3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 		first_seg->pkt_len = pkt_len;
 		first_seg->port = rxq->port_id;
 		first_seg->hash.rss = rte_le_to_cpu_32(rxdp->rx.rss_hash);
+		first_seg->ol_flags |= PKT_RX_RSS_HASH;
 		if (unlikely(hns3_get_bit(bd_base_info, HNS3_RXD_LUM_B))) {
 			first_seg->hash.fdir.hi =
 				rte_le_to_cpu_32(rxdp->rx.fd_id);
@@ -1097,7 +1095,6 @@ hns3_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t nb_desc,
 	txq->next_to_clean = 0;
 	txq->tx_bd_ready   = txq->nb_tx_desc;
 	txq->port_id = dev->data->port_id;
-	txq->pkt_len_errors = 0;
 	txq->configured = true;
 	txq->io_base = (void *)((char *)hw->io_base + HNS3_TQP_REG_OFFSET +
 				idx * HNS3_TQP_REG_SIZE);
@@ -1604,10 +1601,8 @@ hns3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 		 * will be ignored.
 		 */
 		if (unlikely(tx_pkt->pkt_len > HNS3_MAX_FRAME_LEN ||
-			     tx_pkt->pkt_len == 0)) {
-			txq->pkt_len_errors++;
-			continue;
-		}
+			     tx_pkt->pkt_len == 0))
+			break;
 
 		m_seg = tx_pkt;
 		if (unlikely(nb_buf > HNS3_MAX_TX_BD_PER_PKT)) {
diff --git a/drivers/net/hns3/hns3_rxtx.h b/drivers/net/hns3/hns3_rxtx.h
index 358f12984..daf51f409 100644
--- a/drivers/net/hns3/hns3_rxtx.h
+++ b/drivers/net/hns3/hns3_rxtx.h
@@ -252,7 +252,6 @@ struct hns3_rx_queue {
 	uint64_t l4_csum_erros;
 	uint64_t ol3_csum_erros;
 	uint64_t ol4_csum_erros;
-	uint64_t errors;        /* num of error rx packets recorded by driver */
 };
 
 struct hns3_tx_queue {
@@ -272,8 +271,6 @@ 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 */
-
-	uint64_t pkt_len_errors;
 };
 
 #define HNS3_TX_CKSUM_OFFLOAD_MASK ( \
diff --git a/drivers/net/hns3/hns3_stats.c b/drivers/net/hns3/hns3_stats.c
index a0252eacc..9948beb17 100644
--- a/drivers/net/hns3/hns3_stats.c
+++ b/drivers/net/hns3/hns3_stats.c
@@ -235,12 +235,6 @@ 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 errors in Tx */
-static const struct hns3_xstats_name_offset hns3_tx_error_strings[] = {
-	{"TX_PKT_LEN_ERRORS",
-		HNS3_TX_ERROR_STATS_FIELD_OFFSET(pkt_len_errors)}
-};
-
 #define HNS3_NUM_MAC_STATS (sizeof(hns3_mac_strings) / \
 	sizeof(hns3_mac_strings[0]))
 
@@ -253,9 +247,6 @@ static const struct hns3_xstats_name_offset hns3_tx_error_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_ERROR_XSTATS (sizeof(hns3_tx_error_strings) / \
-	sizeof(hns3_tx_error_strings[0]))
-
 #define HNS3_FIX_NUM_STATS (HNS3_NUM_MAC_STATS + HNS3_NUM_ERROR_INT_XSTATS + \
 			    HNS3_NUM_RESET_XSTATS)
 
@@ -434,6 +425,7 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats)
 	struct hns3_hw *hw = &hns->hw;
 	struct hns3_tqp_stats *stats = &hw->tqp_stats;
 	struct hns3_rx_queue *rxq;
+	struct hns3_tx_queue *txq;
 	uint64_t cnt;
 	uint64_t num;
 	uint16_t i;
@@ -446,25 +438,32 @@ hns3_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats)
 		return ret;
 	}
 
-	rte_stats->ipackets  = stats->rcb_rx_ring_pktnum_rcd;
-	rte_stats->opackets  = stats->rcb_tx_ring_pktnum_rcd;
-	rte_stats->rx_nombuf = eth_dev->data->rx_mbuf_alloc_failed;
-
-	num = RTE_MIN(RTE_ETHDEV_QUEUE_STAT_CNTRS, hw->tqps_num);
-	for (i = 0; i < num; i++) {
-		rte_stats->q_ipackets[i] = stats->rcb_rx_ring_pktnum[i];
-		rte_stats->q_opackets[i] = stats->rcb_tx_ring_pktnum[i];
-	}
-
+	/* Get the error stats of received packets */
 	num = RTE_MIN(RTE_ETHDEV_QUEUE_STAT_CNTRS, eth_dev->data->nb_rx_queues);
 	for (i = 0; i != num; ++i) {
 		rxq = eth_dev->data->rx_queues[i];
 		if (rxq) {
-			cnt = rxq->errors;
+			cnt = rxq->l2_errors + rxq->pkt_len_errors;
 			rte_stats->q_errors[i] = cnt;
+			rte_stats->q_ipackets[i] =
+				stats->rcb_rx_ring_pktnum[i] - cnt;
 			rte_stats->ierrors += cnt;
 		}
 	}
+	/* Get the error stats of transmitted packets */
+	num = RTE_MIN(RTE_ETHDEV_QUEUE_STAT_CNTRS, eth_dev->data->nb_tx_queues);
+	for (i = 0; i < num; i++) {
+		txq = eth_dev->data->tx_queues[i];
+		if (txq)
+			rte_stats->q_opackets[i] = stats->rcb_tx_ring_pktnum[i];
+	}
+
+	rte_stats->oerrors = 0;
+	rte_stats->ipackets  = stats->rcb_rx_ring_pktnum_rcd -
+		rte_stats->ierrors;
+	rte_stats->opackets  = stats->rcb_tx_ring_pktnum_rcd -
+		rte_stats->oerrors;
+	rte_stats->rx_nombuf = eth_dev->data->rx_mbuf_alloc_failed;
 
 	return 0;
 }
@@ -477,7 +476,6 @@ 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;
 
@@ -518,12 +516,7 @@ hns3_stats_reset(struct rte_eth_dev *eth_dev)
 			rxq->l4_csum_erros = 0;
 			rxq->ol3_csum_erros = 0;
 			rxq->ol4_csum_erros = 0;
-			rxq->errors = 0;
 		}
-
-		txq = eth_dev->data->tx_queues[i];
-		if (txq)
-			txq->pkt_len_errors = 0;
 	}
 
 	memset(stats, 0, sizeof(struct hns3_tqp_stats));
@@ -554,11 +547,9 @@ hns3_xstats_calc_num(struct rte_eth_dev *dev)
 
 	if (hns->is_vf)
 		return dev->data->nb_rx_queues * HNS3_NUM_RX_BD_ERROR_XSTATS +
-		       dev->data->nb_tx_queues * HNS3_NUM_TX_ERROR_XSTATS +
 		       HNS3_NUM_RESET_XSTATS;
 	else
 		return dev->data->nb_rx_queues * HNS3_NUM_RX_BD_ERROR_XSTATS +
-		       dev->data->nb_tx_queues * HNS3_NUM_TX_ERROR_XSTATS +
 		       HNS3_FIX_NUM_STATS;
 }
 
@@ -585,7 +576,6 @@ 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;
-	struct hns3_tx_queue *txq;
 	uint16_t i, j;
 	char *addr;
 	int count;
@@ -644,16 +634,6 @@ hns3_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
 		}
 	}
 
-	/* Get the Tx errors stats */
-	for (j = 0; j != dev->data->nb_tx_queues; ++j) {
-		for (i = 0; i < HNS3_NUM_TX_ERROR_XSTATS; i++) {
-			txq = dev->data->tx_queues[j];
-			addr = (char *)txq + hns3_tx_error_strings[i].offset;
-			xstats[count].value = *(uint64_t *)addr;
-			xstats[count].id = count;
-			count++;
-		}
-	}
 	return count;
 }
 
@@ -727,14 +707,6 @@ hns3_dev_xstats_get_names(__rte_unused struct rte_eth_dev *dev,
 			count++;
 		}
 	}
-	for (j = 0; j < dev->data->nb_tx_queues; j++) {
-		for (i = 0; i < HNS3_NUM_TX_ERROR_XSTATS; i++) {
-			snprintf(xstats_names[count].name,
-				 sizeof(xstats_names[count].name),
-				 "tx_q%u%s", j, hns3_tx_error_strings[i].name);
-			count++;
-		}
-	}
 
 	return count;
 }
@@ -772,7 +744,6 @@ hns3_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
 	struct hns3_mac_stats *mac_stats = &hw->mac_stats;
 	struct hns3_reset_stats *reset_stats = &hw->reset.stats;
 	struct hns3_rx_queue *rxq;
-	struct hns3_tx_queue *txq;
 	const uint32_t cnt_stats = hns3_xstats_calc_num(dev);
 	uint64_t *values_copy;
 	uint64_t len;
@@ -831,15 +802,6 @@ hns3_dev_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
 		}
 	}
 
-	for (j = 0; j != dev->data->nb_tx_queues; ++j) {
-		for (i = 0; i < HNS3_NUM_TX_ERROR_XSTATS; i++) {
-			txq = dev->data->tx_queues[j];
-			addr = (char *)txq + hns3_tx_error_strings[i].offset;
-			values_copy[count] = *(uint64_t *)addr;
-			count++;
-		}
-	}
-
 	for (i = 0; i < size; i++) {
 		if (ids[i] >= cnt_stats) {
 			hns3_err(hw, "ids[%d] (%" PRIx64 ") is invalid, "
@@ -928,14 +890,6 @@ hns3_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,
 			count_name++;
 		}
 	}
-	for (j = 0; j != dev->data->nb_rx_queues; ++j) {
-		for (i = 0; i < HNS3_NUM_TX_ERROR_XSTATS; i++) {
-			snprintf(xstats_names_copy[count_name].name,
-				 sizeof(xstats_names_copy[count_name].name),
-				 "tx_q%u%s", j, hns3_tx_error_strings[i].name);
-			count_name++;
-		}
-	}
 
 	for (i = 0; i < size; i++) {
 		if (ids[i] >= cnt_stats) {
