| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (c) 2012 Bjørn Mork <bjorn@mork.no> |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * The probing code is heavily inspired by cdc_ether, which is: |
|---|
| 5 | 6 | * Copyright (C) 2003-2005 by David Brownell |
|---|
| 6 | 7 | * Copyright (C) 2006 by Ole Andre Vadla Ravnas (ActiveSync) |
|---|
| 7 | | - * |
|---|
| 8 | | - * This program is free software; you can redistribute it and/or |
|---|
| 9 | | - * modify it under the terms of the GNU General Public License |
|---|
| 10 | | - * version 2 as published by the Free Software Foundation. |
|---|
| 11 | 8 | */ |
|---|
| 12 | 9 | |
|---|
| 13 | 10 | #include <linux/module.h> |
|---|
| .. | .. |
|---|
| 129 | 126 | struct rtnl_link_stats64 *stats) |
|---|
| 130 | 127 | { |
|---|
| 131 | 128 | struct qmimux_priv *priv = netdev_priv(net); |
|---|
| 132 | | - unsigned int start; |
|---|
| 133 | | - int cpu; |
|---|
| 134 | 129 | |
|---|
| 135 | 130 | netdev_stats_to_stats64(stats, &net->stats); |
|---|
| 136 | | - |
|---|
| 137 | | - for_each_possible_cpu(cpu) { |
|---|
| 138 | | - struct pcpu_sw_netstats *stats64; |
|---|
| 139 | | - u64 rx_packets, rx_bytes; |
|---|
| 140 | | - u64 tx_packets, tx_bytes; |
|---|
| 141 | | - |
|---|
| 142 | | - stats64 = per_cpu_ptr(priv->stats64, cpu); |
|---|
| 143 | | - |
|---|
| 144 | | - do { |
|---|
| 145 | | - start = u64_stats_fetch_begin_irq(&stats64->syncp); |
|---|
| 146 | | - rx_packets = stats64->rx_packets; |
|---|
| 147 | | - rx_bytes = stats64->rx_bytes; |
|---|
| 148 | | - tx_packets = stats64->tx_packets; |
|---|
| 149 | | - tx_bytes = stats64->tx_bytes; |
|---|
| 150 | | - } while (u64_stats_fetch_retry_irq(&stats64->syncp, start)); |
|---|
| 151 | | - |
|---|
| 152 | | - stats->rx_packets += rx_packets; |
|---|
| 153 | | - stats->rx_bytes += rx_bytes; |
|---|
| 154 | | - stats->tx_packets += tx_packets; |
|---|
| 155 | | - stats->tx_bytes += tx_bytes; |
|---|
| 156 | | - } |
|---|
| 131 | + dev_fetch_sw_netstats(stats, priv->stats64); |
|---|
| 157 | 132 | } |
|---|
| 158 | 133 | |
|---|
| 159 | 134 | static const struct net_device_ops qmimux_netdev_ops = { |
|---|
| .. | .. |
|---|
| 708 | 683 | |
|---|
| 709 | 684 | static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf) |
|---|
| 710 | 685 | { |
|---|
| 711 | | - int status = -1; |
|---|
| 686 | + int status; |
|---|
| 712 | 687 | u8 *buf = intf->cur_altsetting->extra; |
|---|
| 713 | 688 | int len = intf->cur_altsetting->extralen; |
|---|
| 714 | 689 | struct usb_interface_descriptor *desc = &intf->cur_altsetting->desc; |
|---|
| .. | .. |
|---|
| 1049 | 1024 | {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ |
|---|
| 1050 | 1025 | {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)}, /* Quectel EM160R-GL */ |
|---|
| 1051 | 1026 | {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ |
|---|
| 1027 | + {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0801)}, /* Quectel RM520N */ |
|---|
| 1052 | 1028 | |
|---|
| 1053 | 1029 | /* 3. Combined interface devices matching on interface number */ |
|---|
| 1054 | 1030 | {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ |
|---|
| .. | .. |
|---|
| 1180 | 1156 | {QMI_FIXED_INTF(0x05c6, 0x9080, 8)}, |
|---|
| 1181 | 1157 | {QMI_FIXED_INTF(0x05c6, 0x9083, 3)}, |
|---|
| 1182 | 1158 | {QMI_FIXED_INTF(0x05c6, 0x9084, 4)}, |
|---|
| 1159 | + {QMI_QUIRK_SET_DTR(0x05c6, 0x9091, 2)}, /* Compal RXM-G1 */ |
|---|
| 1183 | 1160 | {QMI_FIXED_INTF(0x05c6, 0x90b2, 3)}, /* ublox R410M */ |
|---|
| 1161 | + {QMI_QUIRK_SET_DTR(0x05c6, 0x90db, 2)}, /* Compal RXM-G1 */ |
|---|
| 1184 | 1162 | {QMI_FIXED_INTF(0x05c6, 0x920d, 0)}, |
|---|
| 1185 | 1163 | {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, |
|---|
| 1186 | 1164 | {QMI_QUIRK_SET_DTR(0x05c6, 0x9625, 4)}, /* YUGA CLM920-NC5 */ |
|---|
| .. | .. |
|---|
| 1284 | 1262 | {QMI_FIXED_INTF(0x2001, 0x7e3d, 4)}, /* D-Link DWM-222 A2 */ |
|---|
| 1285 | 1263 | {QMI_FIXED_INTF(0x2020, 0x2031, 4)}, /* Olicard 600 */ |
|---|
| 1286 | 1264 | {QMI_FIXED_INTF(0x2020, 0x2033, 4)}, /* BroadMobi BM806U */ |
|---|
| 1287 | | - {QMI_FIXED_INTF(0x2020, 0x2060, 4)}, /* BroadMobi BM818 */ |
|---|
| 1265 | + {QMI_QUIRK_SET_DTR(0x2020, 0x2060, 4)}, /* BroadMobi BM818 */ |
|---|
| 1288 | 1266 | {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */ |
|---|
| 1289 | 1267 | {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ |
|---|
| 1290 | 1268 | {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ |
|---|
| .. | .. |
|---|
| 1316 | 1294 | {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ |
|---|
| 1317 | 1295 | {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ |
|---|
| 1318 | 1296 | {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */ |
|---|
| 1297 | + {QMI_QUIRK_SET_DTR(0x1bc7, 0x103a, 0)}, /* Telit LE910C4-WWX */ |
|---|
| 1319 | 1298 | {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ |
|---|
| 1320 | 1299 | {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */ |
|---|
| 1300 | + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1060, 2)}, /* Telit LN920 */ |
|---|
| 1301 | + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1070, 2)}, /* Telit FN990 */ |
|---|
| 1302 | + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1080, 2)}, /* Telit FE990 */ |
|---|
| 1321 | 1303 | {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ |
|---|
| 1322 | 1304 | {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */ |
|---|
| 1323 | 1305 | {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */ |
|---|
| .. | .. |
|---|
| 1354 | 1336 | {QMI_FIXED_INTF(0x413c, 0x81b3, 8)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card (rev3) */ |
|---|
| 1355 | 1337 | {QMI_FIXED_INTF(0x413c, 0x81b6, 8)}, /* Dell Wireless 5811e */ |
|---|
| 1356 | 1338 | {QMI_FIXED_INTF(0x413c, 0x81b6, 10)}, /* Dell Wireless 5811e */ |
|---|
| 1339 | + {QMI_FIXED_INTF(0x413c, 0x81c2, 8)}, /* Dell Wireless 5811e */ |
|---|
| 1357 | 1340 | {QMI_FIXED_INTF(0x413c, 0x81cc, 8)}, /* Dell Wireless 5816e */ |
|---|
| 1358 | 1341 | {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ |
|---|
| 1359 | 1342 | {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ |
|---|
| .. | .. |
|---|
| 1368 | 1351 | {QMI_QUIRK_SET_DTR(0x2c7c, 0x0191, 4)}, /* Quectel EG91 */ |
|---|
| 1369 | 1352 | {QMI_QUIRK_SET_DTR(0x2c7c, 0x0195, 4)}, /* Quectel EG95 */ |
|---|
| 1370 | 1353 | {QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */ |
|---|
| 1354 | + {QMI_QUIRK_SET_DTR(0x2c7c, 0x030e, 4)}, /* Quectel EM05GV2 */ |
|---|
| 1371 | 1355 | {QMI_QUIRK_SET_DTR(0x2cb7, 0x0104, 4)}, /* Fibocom NL678 series */ |
|---|
| 1372 | 1356 | {QMI_FIXED_INTF(0x0489, 0xe0b4, 0)}, /* Foxconn T77W968 LTE */ |
|---|
| 1373 | 1357 | {QMI_FIXED_INTF(0x0489, 0xe0b5, 0)}, /* Foxconn T77W968 LTE with eSIM support*/ |
|---|
| 1374 | 1358 | {QMI_FIXED_INTF(0x2692, 0x9025, 4)}, /* Cellient MPL200 (rebranded Qualcomm 05c6:9025) */ |
|---|
| 1359 | + {QMI_QUIRK_SET_DTR(0x1546, 0x1342, 4)}, /* u-blox LARA-L6 */ |
|---|
| 1375 | 1360 | |
|---|
| 1376 | 1361 | /* 4. Gobi 1000 devices */ |
|---|
| 1377 | 1362 | {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ |
|---|