net/ice: fix FDIR programming status check issue
Checks
Commit Message
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 <yahui.cao@intel.com>
Signed-off-by: Beilei Xing <beilei.xing@intel.com>
---
drivers/net/ice/ice_ethdev.c | 1 +
drivers/net/ice/ice_rxtx.c | 93 +++++++++++++++++++++++++++++++++---
2 files changed, 88 insertions(+), 6 deletions(-)
Comments
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 <yahui.cao@intel.com>
>Signed-off-by: Beilei Xing <beilei.xing@intel.com>
>---
> 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 <xiaolong.ye@intel.com>
Applied to dpdk-next-net-intel, Thanks.
On 11/14/2019 7:23 AM, Ye Xiaolong wrote:
> 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 <yahui.cao@intel.com>
>> Signed-off-by: Beilei Xing <beilei.xing@intel.com>
>> ---
>> 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 <xiaolong.ye@intel.com>
>
> Applied to dpdk-next-net-intel, Thanks.
>
Dropped in next-net.
@@ -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);
}
@@ -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;
+
+
}