Acked-by: Jingjing Wu <jingjing.wu at intel.com>
> -----Original Message-----
> From: Tao, Zhe
> Sent: Thursday, July 09, 2015 10:58 AM
> To: dev at dpdk.org
> Cc: Tao, Zhe; Wu, Jingjing
> Subject: [PATCH v3] i40e:Fix the Descriptor Done check mechanism for i40e
>
> If a descriptor the device drive is handling is the context descriptor, its
> type
> value will be 0x1.
> When using the not operator ! to do the conditional check, if the expression
> value is zero, the device driver will consider the transaction for this
> descriptor
> has been completed, even its DD field is still 0x1 which means NIC has not
> finished the operation on this descriptor.
> Use the 0xF to check the DD status to avoid the above issue happens.
>
> Signed-off-by: Zhe Tao <zhe.tao at intel.com>
> ---
>
> Patch v3 changes:
> -Fix typo for the patch
>
> Patch v2 changes:
> -Fix the DD check mechanism for other functions (besides the
> i40e_xmit_cleanup) which use the DD bits to do conditional check
>
> changes:
> -Fix the DD check mechanism for i40e_xmit_cleanup
>
> drivers/net/i40e/i40e_fdir.c | 3 ++-
> drivers/net/i40e/i40e_rxtx.c | 10 ++++++----
> 2 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/i40e/i40e_fdir.c b/drivers/net/i40e/i40e_fdir.c index
> 4bf98d0..f3cb757 100644
> --- a/drivers/net/i40e/i40e_fdir.c
> +++ b/drivers/net/i40e/i40e_fdir.c
> @@ -1110,7 +1110,8 @@ i40e_fdir_filter_programming(struct i40e_pf *pf,
>
> for (i = 0; i < I40E_FDIR_WAIT_COUNT; i++) {
> rte_delay_us(I40E_FDIR_WAIT_INTERVAL_US);
> - if (txdp->cmd_type_offset_bsz &
> + if ((txdp->cmd_type_offset_bsz &
> +
> rte_cpu_to_le_64(I40E_TXD_QW1_DTYPE_MASK)) ==
>
> rte_cpu_to_le_64(I40E_TX_DESC_DTYPE_DESC_DONE))
> break;
> }
> diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c index
> 2de0ac4..7c0c684 100644
> --- a/drivers/net/i40e/i40e_rxtx.c
> +++ b/drivers/net/i40e/i40e_rxtx.c
> @@ -574,8 +574,9 @@ i40e_xmit_cleanup(struct i40e_tx_queue *txq)
> desc_to_clean_to = (uint16_t)(desc_to_clean_to -
> nb_tx_desc);
>
> desc_to_clean_to = sw_ring[desc_to_clean_to].last_id;
> - if (!(txd[desc_to_clean_to].cmd_type_offset_bsz &
> - rte_cpu_to_le_64(I40E_TX_DESC_DTYPE_DESC_DONE))) {
> + if ((txd[desc_to_clean_to].cmd_type_offset_bsz &
> +
> rte_cpu_to_le_64(I40E_TXD_QW1_DTYPE_MASK)) !=
> +
> rte_cpu_to_le_64(I40E_TX_DESC_DTYPE_DESC_DONE)) {
> PMD_TX_FREE_LOG(DEBUG, "TX descriptor %4u is not done
> "
> "(port=%d queue=%d)", desc_to_clean_to,
> txq->port_id, txq->queue_id);
> @@ -1431,8 +1432,9 @@ i40e_tx_free_bufs(struct i40e_tx_queue *txq)
> struct i40e_tx_entry *txep;
> uint16_t i;
>
> - if (!(txq->tx_ring[txq->tx_next_dd].cmd_type_offset_bsz &
> -
> rte_cpu_to_le_64(I40E_TX_DESC_DTYPE_DESC_DONE)))
> + if ((txq->tx_ring[txq->tx_next_dd].cmd_type_offset_bsz &
> +
> rte_cpu_to_le_64(I40E_TXD_QW1_DTYPE_MASK)) !=
> +
> rte_cpu_to_le_64(I40E_TX_DESC_DTYPE_DESC_DONE))
> return 0;
>
> txep = &(txq->sw_ring[txq->tx_next_dd - (txq->tx_rs_thresh - 1)]);
> --
> 1.8.4.2