From e1483104aa781cee58130d1f803315ae365a2ffe Mon Sep 17 00:00:00 2001 From: Ian Abbott Date: Thu, 31 Jan 2019 17:19:05 +0000 Subject: net: designware: fix TX descriptor length corruption dwc_ether_send() sets the SIZE1 field of the TX descriptor incorrectly. It sets the SIZE1 field to a bit-wise OR of the old value and the new value. If the old value differs from the new value, the transmitted Ethernet frame will be longer than it should be and is likely to have an incorrect frame check sequence. As more and more Ethernet frames of different lengths are sent, more and more of the TX descriptors are affected (up to a maximum number of CONFIG_TX_DESCR_NUM, defined as 16 in "designware.h"). Fix it by setting the SIZE1 field of the TX descriptor to just the new value. Signed-off-by: Ian Abbott Signed-off-by: Sascha Hauer --- drivers/net/designware.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers/net/designware.c') diff --git a/drivers/net/designware.c b/drivers/net/designware.c index ad70967e8c..3c9bca981c 100644 --- a/drivers/net/designware.c +++ b/drivers/net/designware.c @@ -291,12 +291,14 @@ static int dwc_ether_send(struct eth_device *dev, void *packet, int length) if (priv->enh_desc) { desc_p->txrx_status |= DESC_ENH_TXSTS_TXFIRST | DESC_ENH_TXSTS_TXLAST; + desc_p->dmamac_cntl &= ~(DESC_ENH_TXCTRL_SIZE1MASK); desc_p->dmamac_cntl |= (length << DESC_ENH_TXCTRL_SIZE1SHFT) & DESC_ENH_TXCTRL_SIZE1MASK; desc_p->txrx_status &= ~(DESC_ENH_TXSTS_MSK); desc_p->txrx_status |= DESC_ENH_TXSTS_OWNBYDMA; } else { + desc_p->dmamac_cntl &= ~(DESC_TXCTRL_SIZE1MASK); desc_p->dmamac_cntl |= ((length << DESC_TXCTRL_SIZE1SHFT) & DESC_TXCTRL_SIZE1MASK) | DESC_TXCTRL_TXLAST | DESC_TXCTRL_TXFIRST; -- cgit v1.2.3