From 71bb2eb119e11486ac8486a8ec488d3acf4331d7 Mon Sep 17 00:00:00 2001 From: Tianling Shen Date: Tue, 25 Feb 2025 00:00:27 +0800 Subject: [PATCH] quectel-qmi-wwan: Update to 1.2.9 Signed-off-by: Tianling Shen --- drivers/quectel-qmi-wwan/Makefile | 4 +- .../patches/010-disable-rmnet_nss.patch | 2 +- .../020-fix-build-for-kernel-6.6.patch | 23 -------- .../patches/100-add-more-usb-ids.patch | 2 +- drivers/quectel-qmi-wwan/src/Makefile | 10 ++-- drivers/quectel-qmi-wwan/src/ReleaseNotes.txt | 6 +++ drivers/quectel-qmi-wwan/src/qmi_wwan_q.c | 53 ++++++++++++++----- drivers/quectel-qmi-wwan/src/rmnet_nss.c | 24 +++++---- 8 files changed, 68 insertions(+), 56 deletions(-) delete mode 100644 drivers/quectel-qmi-wwan/patches/020-fix-build-for-kernel-6.6.patch diff --git a/drivers/quectel-qmi-wwan/Makefile b/drivers/quectel-qmi-wwan/Makefile index d162470..0a593fe 100644 --- a/drivers/quectel-qmi-wwan/Makefile +++ b/drivers/quectel-qmi-wwan/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=quectel-qmi-wwan -PKG_VERSION:=1.2.6 -PKG_RELEASE:=2 +PKG_VERSION:=1.2.9 +PKG_RELEASE:=1 include $(INCLUDE_DIR)/kernel.mk include $(INCLUDE_DIR)/package.mk diff --git a/drivers/quectel-qmi-wwan/patches/010-disable-rmnet_nss.patch b/drivers/quectel-qmi-wwan/patches/010-disable-rmnet_nss.patch index a02c140..2643b9f 100644 --- a/drivers/quectel-qmi-wwan/patches/010-disable-rmnet_nss.patch +++ b/drivers/quectel-qmi-wwan/patches/010-disable-rmnet_nss.patch @@ -1,6 +1,6 @@ --- a/qmi_wwan_q.c +++ b/qmi_wwan_q.c -@@ -59,9 +59,8 @@ struct rmnet_nss_cb { +@@ -62,9 +62,8 @@ struct rmnet_nss_cb { int (*nss_tx)(struct sk_buff *skb); }; static struct rmnet_nss_cb __read_mostly *nss_cb = NULL; diff --git a/drivers/quectel-qmi-wwan/patches/020-fix-build-for-kernel-6.6.patch b/drivers/quectel-qmi-wwan/patches/020-fix-build-for-kernel-6.6.patch deleted file mode 100644 index 6db7e45..0000000 --- a/drivers/quectel-qmi-wwan/patches/020-fix-build-for-kernel-6.6.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/qmi_wwan_q.c -+++ b/qmi_wwan_q.c -@@ -846,12 +846,20 @@ static struct rtnl_link_stats64 *_rmnet_ - stats64 = per_cpu_ptr(dev->stats64, cpu); - - do { -+#if (LINUX_VERSION_CODE < KERNEL_VERSION( 6,6,0 )) - start = u64_stats_fetch_begin_irq(&stats64->syncp); -+#else -+ start = u64_stats_fetch_begin(&stats64->syncp); -+#endif - rx_packets = stats64->rx_packets; - rx_bytes = stats64->rx_bytes; - tx_packets = stats64->tx_packets; - tx_bytes = stats64->tx_bytes; -+#if (LINUX_VERSION_CODE < KERNEL_VERSION( 6,6,0 )) - } while (u64_stats_fetch_retry_irq(&stats64->syncp, start)); -+#else -+ } while (u64_stats_fetch_retry(&stats64->syncp, start)); -+#endif - - stats->rx_packets += u64_stats_read(&rx_packets); - stats->rx_bytes += u64_stats_read(&rx_bytes); diff --git a/drivers/quectel-qmi-wwan/patches/100-add-more-usb-ids.patch b/drivers/quectel-qmi-wwan/patches/100-add-more-usb-ids.patch index e8c7b54..8079fab 100644 --- a/drivers/quectel-qmi-wwan/patches/100-add-more-usb-ids.patch +++ b/drivers/quectel-qmi-wwan/patches/100-add-more-usb-ids.patch @@ -1,6 +1,6 @@ --- a/qmi_wwan_q.c +++ b/qmi_wwan_q.c -@@ -2533,6 +2533,13 @@ static const struct usb_device_id produc +@@ -2550,6 +2550,13 @@ static const struct usb_device_id produc { QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0800, 4, sdx55) }, /* Quectel RG500 */ { QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0801, 4, sdx55) }, /* Quectel RG520 */ { QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0122, 4, sdx55) }, /* Quectel RG650 */ diff --git a/drivers/quectel-qmi-wwan/src/Makefile b/drivers/quectel-qmi-wwan/src/Makefile index 160cb8e..1f0aa73 100644 --- a/drivers/quectel-qmi-wwan/src/Makefile +++ b/drivers/quectel-qmi-wwan/src/Makefile @@ -1,6 +1,6 @@ obj-m += qmi_wwan_q.o -PWD := $(shell pwd) +DIR := $(shell pwd) OUTPUTDIR=/lib/modules/`uname -r`/kernel/drivers/net/usb/ ifeq ($(ARCH),) @@ -18,17 +18,17 @@ endif endif endif -ifneq ($(findstring &,${PWD}),) -$(warning "${PWD}") +ifneq ($(findstring &,${DIR}),) +$(warning "${DIR}") $(warning "current directory contain special char '&' !") $(error "please remove it!") endif default: - $(MAKE) ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -C $(KDIR) M=$(PWD) modules + $(MAKE) ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -C $(KDIR) M=$(DIR) modules install: default - cp $(PWD)/qmi_wwan_q.ko /lib/modules/$(shell uname -r)/kernel/drivers/net/usb/ + cp $(DIR)/qmi_wwan_q.ko /lib/modules/$(shell uname -r)/kernel/drivers/net/usb/ depmod clean: diff --git a/drivers/quectel-qmi-wwan/src/ReleaseNotes.txt b/drivers/quectel-qmi-wwan/src/ReleaseNotes.txt index 3a6f77c..35366cf 100644 --- a/drivers/quectel-qmi-wwan/src/ReleaseNotes.txt +++ b/drivers/quectel-qmi-wwan/src/ReleaseNotes.txt @@ -1,5 +1,11 @@ Release Notes +[V1.2.7] +Date: 1/12/2024 +enhancement: + 1. support SDX35 platform +fix: + [V1.2.6] Date: 5/25/2023 enhancement: diff --git a/drivers/quectel-qmi-wwan/src/qmi_wwan_q.c b/drivers/quectel-qmi-wwan/src/qmi_wwan_q.c index 13258c9..391972c 100644 --- a/drivers/quectel-qmi-wwan/src/qmi_wwan_q.c +++ b/drivers/quectel-qmi-wwan/src/qmi_wwan_q.c @@ -1,13 +1,16 @@ /* - * Copyright (c) 2012 Bjørn Mork - * - * The probing code is heavily inspired by cdc_ether, which is: - * Copyright (C) 2003-2005 by David Brownell - * Copyright (C) 2006 by Ole Andre Vadla Ravnas (ActiveSync) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. + Copyright (c) Bjørn Mork of author + + This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General + Public licenseas published byFree Software Foundation; either version 2theof the License,(at your option) + any later version.O1 + This program isdistributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the + implied warranty ofOr FITNESS FOR A PARTICULAR PURPOSE.MERCHANTABILITYSee theGNU General Public License + for more details. + You should have received a copy of the GNU General Public licensealong withthis program; if not, write to + the Free SoftwareFoundation, Inc.r51 Franklin Street, Fifth Floor,Boston,MA 02110-1301,USA. + + Based on version modification, the author is Quectel */ #include @@ -93,7 +96,7 @@ extern struct rmnet_nss_cb *rmnet_nss_callbacks __rcu __read_mostly; * These devices may alternatively/additionally be configured using AT * commands on a serial interface */ -#define VERSION_NUMBER "V1.2.6" +#define VERSION_NUMBER "V1.2.9" #define QUECTEL_WWAN_VERSION "Quectel_Linux&Android_QMI_WWAN_Driver_"VERSION_NUMBER static const char driver_name[] = "qmi_wwan_q"; @@ -406,7 +409,7 @@ static void bridge_mode_rx_fixup(sQmiWwanQmap *pQmapDev, struct net_device *net, uint bridge_mode = 0; unsigned char *bridge_mac; - if (pQmapDev->qmap_mode > 1 || pQmapDev->use_rmnet_usb == 1) { + if (pQmapDev->qmap_mode > 1 || ((pQmapDev->use_rmnet_usb == 1) && !one_card_mode)) { struct qmap_priv *priv = netdev_priv(net); bridge_mode = priv->bridge_mode; bridge_mac = priv->bridge_mac; @@ -806,6 +809,19 @@ static void rmnet_vnd_update_tx_stats(struct net_device *net, #endif } +#if (LINUX_VERSION_CODE > KERNEL_VERSION(6,5,0)) +static inline unsigned int u64_stats_fetch_begin_irq(const struct u64_stats_sync *syncp) +{ + return u64_stats_fetch_begin(syncp); +} + +static inline bool u64_stats_fetch_retry_irq(const struct u64_stats_sync *syncp, + unsigned int start) +{ + return u64_stats_fetch_retry(syncp, start); +} +#endif + #if defined(MHI_NETDEV_STATUS64) static struct rtnl_link_stats64 *_rmnet_vnd_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) { @@ -1999,8 +2015,14 @@ static void ql_net_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *i { /* Inherit standard device info */ usbnet_get_drvinfo(net, info); + /* strlcpy() is deprecated in kernel 6.8.0+, using strscpy instead */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(6,8,0)) strlcpy(info->driver, driver_name, sizeof(info->driver)); strlcpy(info->version, VERSION_NUMBER, sizeof(info->version)); +#else + strscpy(info->driver, driver_name, sizeof(info->driver)); + strscpy(info->version, VERSION_NUMBER, sizeof(info->version)); +#endif } static struct ethtool_ops ql_net_ethtool_ops; @@ -2065,7 +2087,7 @@ static int qmi_wwan_register_subdriver(struct usbnet *dev) atomic_set(&info->pmcount, 0); /* register subdriver */ -#if (LINUX_VERSION_CODE > KERNEL_VERSION( 5,12,0 )) //cac6fb015f719104e60b1c68c15ca5b734f57b9c +#if (LINUX_VERSION_CODE >= KERNEL_VERSION( 5,14,0 )) //cac6fb015f719104e60b1c68c15ca5b734f57b9c subdriver = usb_cdc_wdm_register(info->control, &dev->status->desc, 4096, WWAN_PORT_QMI, &qmi_wwan_cdc_wdm_manage_power); #else @@ -2194,7 +2216,7 @@ static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf) int qmap_size = (dev->driver_info->data)&0xFF; int idProduct = le16_to_cpu(dev->udev->descriptor.idProduct); int lte_a = (idProduct == 0x0306 || idProduct == 0x030B || idProduct == 0x0512 || idProduct == 0x0620 || - idProduct == 0x0800 || idProduct == 0x0801 || idProduct == 0x0122); + idProduct == 0x0800 || idProduct == 0x0801 || idProduct == 0x0122 || idProduct == 0x0316); if (qmap_size > 4096 || dev->udev->speed >= USB_SPEED_SUPER) { //if meet this requirements, must be LTE-A or 5G lte_a = 1; @@ -2226,7 +2248,9 @@ static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf) pQmapDev->rmnet_info.size = sizeof(RMNET_INFO); pQmapDev->rmnet_info.rx_urb_size = pQmapDev->qmap_size; pQmapDev->rmnet_info.ep_type = 2; //DATA_EP_TYPE_HSUSB - pQmapDev->rmnet_info.iface_id = 4; + pQmapDev->rmnet_info.iface_id = 4;//Interface ID + if(idProduct == 0x0316) + pQmapDev->rmnet_info.iface_id = 3;// SDX35 Interface ID pQmapDev->rmnet_info.qmap_mode = pQmapDev->qmap_mode; pQmapDev->rmnet_info.qmap_version = pQmapDev->qmap_version; pQmapDev->rmnet_info.dl_minimum_padding = 0; @@ -2523,6 +2547,7 @@ static const struct usb_device_id products[] = { { QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0296, 4, mdm9x07) }, /* Quectel BG96 */ { QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0435, 4, mdm9x07) }, /* Quectel AG35 */ { QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0620, 4, mdm9x40) }, /* Quectel EG20 */ + { QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0316, 3, mdm9x40) }, /* Quectel RG255 */ { QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0800, 4, sdx55) }, /* Quectel RG500 */ { QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0801, 4, sdx55) }, /* Quectel RG520 */ { QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0122, 4, sdx55) }, /* Quectel RG650 */ diff --git a/drivers/quectel-qmi-wwan/src/rmnet_nss.c b/drivers/quectel-qmi-wwan/src/rmnet_nss.c index e6e8414..f01b301 100644 --- a/drivers/quectel-qmi-wwan/src/rmnet_nss.c +++ b/drivers/quectel-qmi-wwan/src/rmnet_nss.c @@ -1,14 +1,18 @@ -/* Copyright (c) 2019, The Linux Foundation. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 and - * only version 2 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. +/* + Copyright (c) 2023, The Linux Foundation. All rights reserved. + + This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General + Public licenseas published byFree Software Foundation; either version 2theof the License,(at your option) + any later version.O1 + This program isdistributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the + implied warranty ofOr FITNESS FOR A PARTICULAR PURPOSE.MERCHANTABILITYSee theGNU General Public License + for more details. + You should have received a copy of the GNU General Public licensealong withthis program; if not, write to + the Free SoftwareFoundation, Inc.r51 Franklin Street,Fifth Floor,Boston,MA 02110-1301,USA. + + Based on version modification, the author is Quectel */ + #include #include #include