From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id AE1BAA04C2; Thu, 14 Nov 2019 08:26:28 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EC5854C93; Thu, 14 Nov 2019 08:26:27 +0100 (CET) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 5AE4C4C90 for ; Thu, 14 Nov 2019 08:26:26 +0100 (CET) X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Nov 2019 23:26:25 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,302,1569308400"; d="scan'208";a="235565310" Received: from yexl-server.sh.intel.com (HELO localhost) ([10.67.117.17]) by fmsmga002.fm.intel.com with ESMTP; 13 Nov 2019 23:26:23 -0800 Date: Thu, 14 Nov 2019 15:23:05 +0800 From: Ye Xiaolong To: Yahui Cao Cc: Qiming Yang , Wenzhuo Lu , dev@dpdk.org, Qi Zhang , Beilei Xing Message-ID: <20191114072305.GI66623@intel.com> References: <20191113160921.90573-1-yahui.cao@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20191113160921.90573-1-yahui.cao@intel.com> User-Agent: Mutt/1.9.4 (2018-02-28) Subject: Re: [dpdk-dev] [PATCH] net/ice: fix FDIR programming status check issue X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 11/14, Yahui Cao wrote: >To make sure if FDIR programming succeed or fail, legacy programming >status descriptor WB format is enabled and FDIR queue irq is opened. > >Fixes: 84dc7a95a2d3 ("net/ice: enable flow director engine") >Cc: beilei.xing@intel.com > >Signed-off-by: Yahui Cao >Signed-off-by: Beilei Xing >--- > drivers/net/ice/ice_ethdev.c | 1 + > drivers/net/ice/ice_rxtx.c | 93 +++++++++++++++++++++++++++++++++--- > 2 files changed, 88 insertions(+), 6 deletions(-) > >diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c >index 3b20ea423..27b0fbc83 100644 >--- a/drivers/net/ice/ice_ethdev.c >+++ b/drivers/net/ice/ice_ethdev.c >@@ -2726,6 +2726,7 @@ ice_rxq_intr_setup(struct rte_eth_dev *dev) > > /* Enable FDIR MSIX interrupt */ > if (pf->fdir.fdir_vsi) { >+ pf->fdir.fdir_vsi->nb_used_qps = 1; > ice_vsi_queues_bind_intr(pf->fdir.fdir_vsi); > ice_vsi_enable_queues_intr(pf->fdir.fdir_vsi); > } >diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c >index 18c02979e..2db174456 100644 >--- a/drivers/net/ice/ice_rxtx.c >+++ b/drivers/net/ice/ice_rxtx.c >@@ -535,7 +535,7 @@ ice_fdir_program_hw_rx_queue(struct ice_rx_queue *rxq) > { > struct ice_vsi *vsi = rxq->vsi; > struct ice_hw *hw = ICE_VSI_TO_HW(vsi); >- uint32_t rxdid = ICE_RXDID_COMMS_GENERIC; >+ uint32_t rxdid = ICE_RXDID_LEGACY_1; > struct ice_rlan_ctx rx_ctx; > enum ice_status err; > uint32_t regval; >@@ -550,9 +550,7 @@ ice_fdir_program_hw_rx_queue(struct ice_rx_queue *rxq) > rx_ctx.dbuf = rxq->rx_buf_len >> ICE_RLAN_CTX_DBUF_S; > rx_ctx.hbuf = rxq->rx_hdr_len >> ICE_RLAN_CTX_HBUF_S; > rx_ctx.dtype = 0; /* No Header Split mode */ >-#ifndef RTE_LIBRTE_ICE_16BYTE_RX_DESC > rx_ctx.dsize = 1; /* 32B descriptors */ >-#endif > rx_ctx.rxmax = RTE_ETHER_MAX_LEN; > /* TPH: Transaction Layer Packet (TLP) processing hints */ > rx_ctx.tphrdesc_ena = 1; >@@ -2077,7 +2075,7 @@ ice_fdir_setup_rx_resources(struct ice_pf *pf) > } > > /* Allocate RX hardware ring descriptors. */ >- ring_size = sizeof(union ice_rx_flex_desc) * ICE_FDIR_NUM_RX_DESC; >+ ring_size = sizeof(union ice_32byte_rx_desc) * ICE_FDIR_NUM_RX_DESC; > ring_size = RTE_ALIGN(ring_size, ICE_DMA_MEM_ALIGN); > > rz = rte_eth_dma_zone_reserve(dev, "fdir_rx_ring", >@@ -2096,7 +2094,7 @@ ice_fdir_setup_rx_resources(struct ice_pf *pf) > > rxq->rx_ring_dma = rz->iova; > memset(rz->addr, 0, ICE_FDIR_NUM_RX_DESC * >- sizeof(union ice_rx_flex_desc)); >+ sizeof(union ice_32byte_rx_desc)); > rxq->rx_ring = (union ice_rx_flex_desc *)rz->addr; > > /* >@@ -3607,12 +3605,81 @@ ice_set_default_ptype_table(struct rte_eth_dev *dev) > ad->ptype_tbl[i] = ice_get_default_pkt_type(i); > } > >+#define ICE_RX_PROG_STATUS_DESC_WB_QW1_PROGID_S 1 >+#define ICE_RX_PROG_STATUS_DESC_WB_QW1_PROGID_M \ >+ (0x3UL << ICE_RX_PROG_STATUS_DESC_WB_QW1_PROGID_S) >+#define ICE_RX_PROG_STATUS_DESC_WB_QW1_PROG_ADD 0 >+#define ICE_RX_PROG_STATUS_DESC_WB_QW1_PROG_DEL 0x1 >+ >+#define ICE_RX_PROG_STATUS_DESC_WB_QW1_FAIL_S 4 >+#define ICE_RX_PROG_STATUS_DESC_WB_QW1_FAIL_M \ >+ (1 << ICE_RX_PROG_STATUS_DESC_WB_QW1_FAIL_S) >+#define ICE_RX_PROG_STATUS_DESC_WB_QW1_FAIL_PROF_S 5 >+#define ICE_RX_PROG_STATUS_DESC_WB_QW1_FAIL_PROF_M \ >+ (1 << ICE_RX_PROG_STATUS_DESC_WB_QW1_FAIL_PROF_S) >+ >+/* >+ * check the programming status descriptor in rx queue. >+ * done after Programming Flow Director is programmed on >+ * tx queue >+ */ >+static inline int >+ice_check_fdir_programming_status(struct ice_rx_queue *rxq) >+{ >+ volatile union ice_32byte_rx_desc *rxdp; >+ uint64_t qword1; >+ uint32_t rx_status; >+ uint32_t error; >+ uint32_t id; >+ int ret = -EAGAIN; >+ >+ rxdp = (volatile union ice_32byte_rx_desc *) >+ (&rxq->rx_ring[rxq->rx_tail]); >+ qword1 = rte_le_to_cpu_64(rxdp->wb.qword1.status_error_len); >+ rx_status = (qword1 & ICE_RXD_QW1_STATUS_M) >+ >> ICE_RXD_QW1_STATUS_S; >+ >+ if (rx_status & (1 << ICE_RX_DESC_STATUS_DD_S)) { >+ ret = 0; >+ error = (qword1 & ICE_RX_PROG_STATUS_DESC_WB_QW1_FAIL_M) >> >+ ICE_RX_PROG_STATUS_DESC_WB_QW1_FAIL_S; >+ id = (qword1 & ICE_RX_PROG_STATUS_DESC_WB_QW1_PROGID_M) >> >+ ICE_RX_PROG_STATUS_DESC_WB_QW1_PROGID_S; >+ if (error) { >+ if (id == ICE_RX_PROG_STATUS_DESC_WB_QW1_PROG_ADD) >+ PMD_DRV_LOG(ERR, "Failed to add FDIR rule."); >+ else if (id == ICE_RX_PROG_STATUS_DESC_WB_QW1_PROG_DEL) >+ PMD_DRV_LOG(ERR, "Failed to remove FDIR rule."); >+ ret = -EINVAL; >+ goto err; >+ } >+ error = (qword1 & ICE_RX_PROG_STATUS_DESC_WB_QW1_FAIL_PROF_M) >> >+ ICE_RX_PROG_STATUS_DESC_WB_QW1_FAIL_PROF_S; >+ if (error) { >+ PMD_DRV_LOG(ERR, "Failed to create FDIR profile."); >+ ret = -EINVAL; >+ } >+err: >+ rxdp->wb.qword1.status_error_len = 0; >+ rxq->rx_tail++; >+ if (unlikely(rxq->rx_tail == rxq->nb_rx_desc)) >+ rxq->rx_tail = 0; >+ if (rxq->rx_tail == 0) >+ ICE_PCI_REG_WRITE(rxq->qrx_tail, rxq->nb_rx_desc - 1); >+ else >+ ICE_PCI_REG_WRITE(rxq->qrx_tail, rxq->rx_tail - 1); >+ } >+ >+ return ret; >+} >+ > #define ICE_FDIR_MAX_WAIT_US 10000 > > int > ice_fdir_programming(struct ice_pf *pf, struct ice_fltr_desc *fdir_desc) > { > struct ice_tx_queue *txq = pf->fdir.txq; >+ struct ice_rx_queue *rxq = pf->fdir.rxq; > volatile struct ice_fltr_desc *fdirdp; > volatile struct ice_tx_desc *txdp; > uint32_t td_cmd; >@@ -3650,5 +3717,19 @@ ice_fdir_programming(struct ice_pf *pf, struct ice_fltr_desc *fdir_desc) > return -ETIMEDOUT; > } > >- return 0; >+ for (; i < ICE_FDIR_MAX_WAIT_US; i++) { >+ int ret; >+ >+ ret = ice_check_fdir_programming_status(rxq); >+ if (ret == -EAGAIN) >+ rte_delay_us(1); >+ else >+ return ret; >+ } >+ >+ PMD_DRV_LOG(ERR, >+ "Failed to program FDIR filter: programming status reported."); >+ return -ETIMEDOUT; >+ >+ > } >-- >2.17.1 > Acked-by: Xiaolong Ye Applied to dpdk-next-net-intel, Thanks.