[dpdk-dev] [PATCH] net/ixgbe: fix TDH register setting issue

Zhang, Qi Z qi.z.zhang at intel.com
Fri Nov 16 20:51:34 CET 2018


Hi Yanglong:

> -----Original Message-----
> From: Wu, Yanglong
> Sent: Thursday, November 15, 2018 6:32 PM
> To: dev at dpdk.org
> Cc: Zhang, Qi Z <qi.z.zhang at intel.com>; Wu, Jingjing <jingjing.wu at intel.com>;
> Byrne, Stephen1 <stephen1.byrne at intel.com>; Wu, Yanglong
> <yanglong.wu at intel.com>
> Subject: [PATCH] net/ixgbe: fix TDH register setting issue
> 
> The only time that software should write to the TDH register is after a reset
> (hardware reset or CTRL.RST) and before enabling the transmit function
> (TXDCTL.ENABLE).
> If software were to write to this register while the transmit function was
> enabled, the on-chip descriptor buffers might be invalidated and the hardware
> could become confused.
> 
> Fixes: a8cdaf0964f7 ("net/ixgbe: remove redundant queue id checks")

I try to understand why this patch is going to fix above commit. 
seems the commit didn't change the register write order, and even if we go much early I saw the TDH register is always be written after TXDCTL.ENABL.
Did I missed something?
btw, I'm also curious why only TDH matters but TDT does not.

> Signed-off-by: Yanglong Wu <yanglong.wu at intel.com>
> ---
>  drivers/net/ixgbe/ixgbe_rxtx.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
> index 2f0262ae1..ddc7efa87 100644
> --- a/drivers/net/ixgbe/ixgbe_rxtx.c
> +++ b/drivers/net/ixgbe/ixgbe_rxtx.c
> @@ -5264,6 +5264,7 @@ ixgbe_dev_tx_queue_start(struct rte_eth_dev *dev,
> uint16_t tx_queue_id)
>  	hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> 
>  	txq = dev->data->tx_queues[tx_queue_id];
> +	IXGBE_WRITE_REG(hw, IXGBE_TDH(txq->reg_idx), 0);
>  	txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txq->reg_idx));
>  	txdctl |= IXGBE_TXDCTL_ENABLE;
>  	IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txq->reg_idx), txdctl); @@
> -5281,7 +5282,6 @@ ixgbe_dev_tx_queue_start(struct rte_eth_dev *dev,
> uint16_t tx_queue_id)
>  				tx_queue_id);
>  	}
>  	rte_wmb();
> -	IXGBE_WRITE_REG(hw, IXGBE_TDH(txq->reg_idx), 0);
>  	IXGBE_WRITE_REG(hw, IXGBE_TDT(txq->reg_idx), 0);
>  	dev->data->tx_queue_state[tx_queue_id] =
> RTE_ETH_QUEUE_STATE_STARTED;
> 
> --
> 2.11.0



More information about the dev mailing list