summaryrefslogtreecommitdiff
path: root/recipes-kernel/linux/linux-at91-5.4.199/linux-5.4-usb-qmi-wwan-prevent-babble.patch
diff options
context:
space:
mode:
authorJohn Klug <john.klug@multitech.com>2024-02-01 15:17:46 -0600
committerJohn Klug <john.klug@multitech.com>2024-02-01 15:17:46 -0600
commit3902efbf00c818d69c45fcc96807ab924d9b01df (patch)
tree5de94f00d21308e87cd64f94d1e5285e72dd3849 /recipes-kernel/linux/linux-at91-5.4.199/linux-5.4-usb-qmi-wwan-prevent-babble.patch
parentbc1cdb86b2c2d27deb8405b90419166242715bff (diff)
parente4d5366bc2173eab010a6e65359f7e76066d4f81 (diff)
downloadmeta-multitech-atmel-6.3.1.tar.gz
meta-multitech-atmel-6.3.1.tar.bz2
meta-multitech-atmel-6.3.1.zip
Merge branch 'sk/GP-2221/wwan-rx-6' into '6' HEAD6.3.1master
GP-2221 Prevent receive errors on wwan0 when MTU is less than 1500 See merge request !39
Diffstat (limited to 'recipes-kernel/linux/linux-at91-5.4.199/linux-5.4-usb-qmi-wwan-prevent-babble.patch')
-rw-r--r--recipes-kernel/linux/linux-at91-5.4.199/linux-5.4-usb-qmi-wwan-prevent-babble.patch70
1 files changed, 70 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-at91-5.4.199/linux-5.4-usb-qmi-wwan-prevent-babble.patch b/recipes-kernel/linux/linux-at91-5.4.199/linux-5.4-usb-qmi-wwan-prevent-babble.patch
new file mode 100644
index 0000000..0d24f81
--- /dev/null
+++ b/recipes-kernel/linux/linux-at91-5.4.199/linux-5.4-usb-qmi-wwan-prevent-babble.patch
@@ -0,0 +1,70 @@
+From: "Seija K." <doremylover123@gmail.com>
+Date: Tue, 13 Dec 2022 12:40:52 -0500
+Subject: [PATCH] net: Fix for packets being rejected in the xHCI controller's
+ ring buffer
+
+When a packet larger than MTU arrives in Linux from the modem, it is
+discarded with -EOVERFLOW error (Babble error).
+
+This is seen on USB3.0 and USB2.0 buses.
+
+This is because the MRU (Max Receive Size) is not a separate entity
+from the MTU (Max Transmit Size), and the received packets can be
+larger than those transmitted.
+
+Following the babble error, there was an endless supply of zero-length
+URBs that were rejected with -EPROTO (increasing the rx input error
+counter each time).
+
+This is only seen on USB3.0. These continue to come ad infinitum until
+the modem is shut down.
+
+There appears to be a bug in the core USB handling code in Linux that
+doesn't deal with network MTUs smaller than 1500 bytes well.
+
+By default, the dev->hard_mtu (the real MTU) is in lockstep with
+dev->rx_urb_size (essentially an MRU), and the latter is causing
+trouble.
+
+This has nothing to do with the modems; the issue can be reproduced by
+getting a USB-Ethernet dongle, setting the MTU to 1430, and pinging
+with size greater than 1406.
+
+Signed-off-by: Seija Kijin <doremylover123@gmail.com>
+
+Co-Authored-By: TarAldarion <gildeap@tcd.ie>
+
+Upstream-Status: Inappropriate [other]
+ Workaround for the babble issue, breaks qmap link aggregation that uses
+ datagram sizes bigger than 1504. qmap link aggregation requires datagram
+ sizes of 4096, 16384 bytes and so on, depending on the radio.
+ mPower and mLinux do not use qmap link aggregation, but set the MTU based
+ on the value reported by the radio (provider-specific). This patch sets
+ "almost-MRU" to a high and fixed value, and should be enough for our needs.
+ See GP-2221 for details.
+
+---
+ drivers/net/usb/qmi_wwan.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 554d4e2a84a4..39db53a74b5a 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -842,6 +842,13 @@ static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)
+ }
+ dev->net->netdev_ops = &qmi_wwan_netdev_ops;
+ dev->net->sysfs_groups[0] = &qmi_wwan_sysfs_attr_group;
++ /* LTE Networks don't always respect their own MTU on the receiving side;
++ * e.g. AT&T pushes 1430 MTU but still allows 1500 byte packets from
++ * far-end networks. Make the receive buffer large enough to accommodate
++ * them, and add four bytes so MTU does not equal MRU on network
++ * with 1500 MTU. Otherwise, usbnet_change_mtu() will change both.
++ */
++ dev->rx_urb_size = ETH_DATA_LEN + 4;
+ err:
+ return status;
+ }
+--
+2.38.2
+