| From 887403e560ac21ca265b084128caaab52127462f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 24 Jun 2020 18:14:55 -0700 |
| Subject: net: bcmgenet: use hardware padding of runt frames |
| |
| From: Doug Berger <opendmb@gmail.com> |
| |
| [ Upstream commit 20d1f2d1b024f6be199a3bedf1578a1d21592bc5 ] |
| |
| When commit 474ea9cafc45 ("net: bcmgenet: correctly pad short |
| packets") added the call to skb_padto() it should have been |
| located before the nr_frags parameter was read since that value |
| could be changed when padding packets with lengths between 55 |
| and 59 bytes (inclusive). |
| |
| The use of a stale nr_frags value can cause corruption of the |
| pad data when tx-scatter-gather is enabled. This corruption of |
| the pad can cause invalid checksum computation when hardware |
| offload of tx-checksum is also enabled. |
| |
| Since the original reason for the padding was corrected by |
| commit 7dd399130efb ("net: bcmgenet: fix skb_len in |
| bcmgenet_xmit_single()") we can remove the software padding all |
| together and make use of hardware padding of short frames as |
| long as the hardware also always appends the FCS value to the |
| frame. |
| |
| Fixes: 474ea9cafc45 ("net: bcmgenet: correctly pad short packets") |
| Signed-off-by: Doug Berger <opendmb@gmail.com> |
| Acked-by: Florian Fainelli <f.fainelli@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/broadcom/genet/bcmgenet.c | 8 +++----- |
| 1 file changed, 3 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
| index 38bdfd4b46f0f..dde1c23c8e399 100644 |
| --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
| +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
| @@ -1520,11 +1520,6 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) |
| goto out; |
| } |
| |
| - if (skb_padto(skb, ETH_ZLEN)) { |
| - ret = NETDEV_TX_OK; |
| - goto out; |
| - } |
| - |
| /* Retain how many bytes will be sent on the wire, without TSB inserted |
| * by transmit checksum offload |
| */ |
| @@ -1571,6 +1566,9 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) |
| len_stat = (size << DMA_BUFLENGTH_SHIFT) | |
| (priv->hw_params->qtag_mask << DMA_TX_QTAG_SHIFT); |
| |
| + /* Note: if we ever change from DMA_TX_APPEND_CRC below we |
| + * will need to restore software padding of "runt" packets |
| + */ |
| if (!i) { |
| len_stat |= DMA_TX_APPEND_CRC | DMA_SOP; |
| if (skb->ip_summed == CHECKSUM_PARTIAL) |
| -- |
| 2.25.1 |
| |