diff options
author | John Klug <john.klug@multitech.com> | 2024-02-01 15:17:46 -0600 |
---|---|---|
committer | John Klug <john.klug@multitech.com> | 2024-02-01 15:17:46 -0600 |
commit | 3902efbf00c818d69c45fcc96807ab924d9b01df (patch) | |
tree | 5de94f00d21308e87cd64f94d1e5285e72dd3849 /recipes-kernel/linux/linux-at91-5.4.199/linux-5.4-usb-qmi-wwan-prevent-babble.patch | |
parent | bc1cdb86b2c2d27deb8405b90419166242715bff (diff) | |
parent | e4d5366bc2173eab010a6e65359f7e76066d4f81 (diff) | |
download | meta-multitech-atmel-6.3.1.tar.gz meta-multitech-atmel-6.3.1.tar.bz2 meta-multitech-atmel-6.3.1.zip |
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.patch | 70 |
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 + |