summaryrefslogtreecommitdiff
path: root/recipes-kernel/linux
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux')
-rw-r--r--recipes-kernel/linux/linux-at91-5.4.199/linux-5.4-usb-qmi-wwan-prevent-babble.patch70
-rw-r--r--recipes-kernel/linux/linux-at91_5.4.199.bb1
2 files changed, 71 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
+
diff --git a/recipes-kernel/linux/linux-at91_5.4.199.bb b/recipes-kernel/linux/linux-at91_5.4.199.bb
index bcd58bb..64ab072 100644
--- a/recipes-kernel/linux/linux-at91_5.4.199.bb
+++ b/recipes-kernel/linux/linux-at91_5.4.199.bb
@@ -54,6 +54,7 @@ COMMON_PATCHES = " \
file://linux-5.4-revert-net-macb-Properly-handle-phylink-on-at91rm9200.patch \
file://linux-5.4-bring-back-PAE-bit-and-fix-NCFGR-values-applicable-f.patch \
file://linux-5.4-quiet-overlay.patch \
+ file://linux-5.4-usb-qmi-wwan-prevent-babble.patch \
file://mt-at91.h \
"