aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/lantiq/patches-5.10/0703-v5.16-net-lantiq_xrx200-increase-buffer-reservation.patch
diff options
context:
space:
mode:
authorAleksander Jan Bajkowski <olek2@wp.pl>2022-03-08 21:20:37 +0100
committerChristian Lamparter <chunkeey@gmail.com>2022-03-25 18:14:13 +0100
commitb4970dab6b0c3e13715f4b13de42d72a74c1c9e9 (patch)
tree43a6be6b4c676b5a53b903af56c4d8b3861a5829 /target/linux/lantiq/patches-5.10/0703-v5.16-net-lantiq_xrx200-increase-buffer-reservation.patch
parent210c534ce2be55fc0c59b1700809470e8ba971b8 (diff)
downloadupstream-b4970dab6b0c3e13715f4b13de42d72a74c1c9e9.tar.gz
upstream-b4970dab6b0c3e13715f4b13de42d72a74c1c9e9.tar.bz2
upstream-b4970dab6b0c3e13715f4b13de42d72a74c1c9e9.zip
lantiq: xrx200: replace patch with upstream version
This commit replaces patch number 0703 with the upstream accepted version. This patch requires backporting an additional patch to avoid conflicts. The only significant change is the lower maximum MTU. Packets with lengths over 2400 may be dropped. Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
Diffstat (limited to 'target/linux/lantiq/patches-5.10/0703-v5.16-net-lantiq_xrx200-increase-buffer-reservation.patch')
-rw-r--r--target/linux/lantiq/patches-5.10/0703-v5.16-net-lantiq_xrx200-increase-buffer-reservation.patch122
1 files changed, 122 insertions, 0 deletions
diff --git a/target/linux/lantiq/patches-5.10/0703-v5.16-net-lantiq_xrx200-increase-buffer-reservation.patch b/target/linux/lantiq/patches-5.10/0703-v5.16-net-lantiq_xrx200-increase-buffer-reservation.patch
new file mode 100644
index 0000000000..77c0eb6354
--- /dev/null
+++ b/target/linux/lantiq/patches-5.10/0703-v5.16-net-lantiq_xrx200-increase-buffer-reservation.patch
@@ -0,0 +1,122 @@
+From 1488fc204568f707fe2a42a913788c00a95af30e Mon Sep 17 00:00:00 2001
+From: Aleksander Jan Bajkowski <olek2@wp.pl>
+Date: Fri, 17 Dec 2021 01:07:40 +0100
+Subject: [PATCH] net: lantiq_xrx200: increase buffer reservation
+
+If the user sets a lower mtu on the CPU port than on the switch,
+then DMA inserts a few more bytes into the buffer than expected.
+In the worst case, it may exceed the size of the buffer. The
+experiments showed that the buffer should be a multiple of the
+burst length value. This patch rounds the length of the rx buffer
+upwards and fixes this bug. The reservation of FCS space in the
+buffer has been removed as PMAC strips the FCS.
+
+Fixes: 998ac358019e ("net: lantiq: add support for jumbo frames")
+Reported-by: Thomas Nixon <tom@tomn.co.uk>
+Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/lantiq_xrx200.c | 34 ++++++++++++++++++++--------
+ 1 file changed, 24 insertions(+), 10 deletions(-)
+
+--- a/drivers/net/ethernet/lantiq_xrx200.c
++++ b/drivers/net/ethernet/lantiq_xrx200.c
+@@ -70,6 +70,8 @@ struct xrx200_priv {
+ struct xrx200_chan chan_tx;
+ struct xrx200_chan chan_rx;
+
++ u16 rx_buf_size;
++
+ struct net_device *net_dev;
+ struct device *dev;
+
+@@ -96,6 +98,16 @@ static void xrx200_pmac_mask(struct xrx2
+ xrx200_pmac_w32(priv, val, offset);
+ }
+
++static int xrx200_max_frame_len(int mtu)
++{
++ return VLAN_ETH_HLEN + mtu;
++}
++
++static int xrx200_buffer_size(int mtu)
++{
++ return round_up(xrx200_max_frame_len(mtu), 4 * XRX200_DMA_BURST_LEN);
++}
++
+ /* drop all the packets from the DMA ring */
+ static void xrx200_flush_dma(struct xrx200_chan *ch)
+ {
+@@ -108,8 +120,7 @@ static void xrx200_flush_dma(struct xrx2
+ break;
+
+ desc->ctl = LTQ_DMA_OWN | LTQ_DMA_RX_OFFSET(NET_IP_ALIGN) |
+- (ch->priv->net_dev->mtu + VLAN_ETH_HLEN +
+- ETH_FCS_LEN);
++ ch->priv->rx_buf_size;
+ ch->dma.desc++;
+ ch->dma.desc %= LTQ_DESC_NUM;
+ }
+@@ -157,21 +168,21 @@ static int xrx200_close(struct net_devic
+
+ static int xrx200_alloc_skb(struct xrx200_chan *ch)
+ {
+- int len = ch->priv->net_dev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
+ struct sk_buff *skb = ch->skb[ch->dma.desc];
++ struct xrx200_priv *priv = ch->priv;
+ dma_addr_t mapping;
+ int ret = 0;
+
+- ch->skb[ch->dma.desc] = netdev_alloc_skb_ip_align(ch->priv->net_dev,
+- len);
++ ch->skb[ch->dma.desc] = netdev_alloc_skb_ip_align(priv->net_dev,
++ priv->rx_buf_size);
+ if (!ch->skb[ch->dma.desc]) {
+ ret = -ENOMEM;
+ goto skip;
+ }
+
+- mapping = dma_map_single(ch->priv->dev, ch->skb[ch->dma.desc]->data,
+- len, DMA_FROM_DEVICE);
+- if (unlikely(dma_mapping_error(ch->priv->dev, mapping))) {
++ mapping = dma_map_single(priv->dev, ch->skb[ch->dma.desc]->data,
++ priv->rx_buf_size, DMA_FROM_DEVICE);
++ if (unlikely(dma_mapping_error(priv->dev, mapping))) {
+ dev_kfree_skb_any(ch->skb[ch->dma.desc]);
+ ch->skb[ch->dma.desc] = skb;
+ ret = -ENOMEM;
+@@ -183,7 +194,7 @@ static int xrx200_alloc_skb(struct xrx20
+ wmb();
+ skip:
+ ch->dma.desc_base[ch->dma.desc].ctl =
+- LTQ_DMA_OWN | LTQ_DMA_RX_OFFSET(NET_IP_ALIGN) | len;
++ LTQ_DMA_OWN | LTQ_DMA_RX_OFFSET(NET_IP_ALIGN) | priv->rx_buf_size;
+
+ return ret;
+ }
+@@ -355,6 +366,7 @@ xrx200_change_mtu(struct net_device *net
+ int ret = 0;
+
+ net_dev->mtu = new_mtu;
++ priv->rx_buf_size = xrx200_buffer_size(new_mtu);
+
+ if (new_mtu <= old_mtu)
+ return ret;
+@@ -374,6 +386,7 @@ xrx200_change_mtu(struct net_device *net
+ ret = xrx200_alloc_skb(ch_rx);
+ if (ret) {
+ net_dev->mtu = old_mtu;
++ priv->rx_buf_size = xrx200_buffer_size(old_mtu);
+ break;
+ }
+ dev_kfree_skb_any(skb);
+@@ -504,7 +517,8 @@ static int xrx200_probe(struct platform_
+ net_dev->netdev_ops = &xrx200_netdev_ops;
+ SET_NETDEV_DEV(net_dev, dev);
+ net_dev->min_mtu = ETH_ZLEN;
+- net_dev->max_mtu = XRX200_DMA_DATA_LEN - VLAN_ETH_HLEN - ETH_FCS_LEN;
++ net_dev->max_mtu = XRX200_DMA_DATA_LEN - xrx200_max_frame_len(0);
++ priv->rx_buf_size = xrx200_buffer_size(ETH_DATA_LEN);
+
+ /* load the memory ranges */
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);