Lines Matching +full:u +full:- +full:blox
1 // SPDX-License-Identifier: GPL-2.0-only
6 * Copyright (C) 2003-2005 by David Brownell
22 #include <linux/usb/cdc-wdm.h>
26 * specific management protocol called Qualcomm MSM Interface (QMI) -
31 * control ("master") interface of a two-interface CDC Union
41 * It is exported as a character device using the cdc-wdm driver as
82 struct net_device *real_dev = priv->real_dev; in qmimux_open()
84 if (!(priv->real_dev->flags & IFF_UP)) in qmimux_open()
85 return -ENETDOWN; in qmimux_open()
101 unsigned int len = skb->len; in qmimux_start_xmit()
106 hdr->pad = 0; in qmimux_start_xmit()
107 hdr->mux_id = priv->mux_id; in qmimux_start_xmit()
108 hdr->pkt_len = cpu_to_be16(len); in qmimux_start_xmit()
109 skb->dev = priv->real_dev; in qmimux_start_xmit()
115 dev->stats.tx_dropped++; in qmimux_start_xmit()
129 dev->header_ops = NULL; /* No header */ in qmimux_setup()
130 dev->type = ARPHRD_NONE; in qmimux_setup()
131 dev->hard_header_len = 0; in qmimux_setup()
132 dev->addr_len = 0; in qmimux_setup()
133 dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; in qmimux_setup()
134 dev->netdev_ops = &qmimux_netdev_ops; in qmimux_setup()
135 dev->mtu = 1500; in qmimux_setup()
136 dev->needs_free_netdev = true; in qmimux_setup()
146 netdev_for_each_upper_dev_rcu(dev->net, ldev, iter) { in qmimux_find_dev()
148 if (priv->mux_id == mux_id) { in qmimux_find_dev()
159 return !list_empty(&dev->net->adj_list.upper); in qmimux_has_slaves()
170 while (offset + qmimux_hdr_sz < skb->len) { in qmimux_rx_fixup()
171 hdr = (struct qmimux_hdr *)(skb->data + offset); in qmimux_rx_fixup()
172 len = be16_to_cpu(hdr->pkt_len); in qmimux_rx_fixup()
175 if (offset + len + qmimux_hdr_sz > skb->len) in qmimux_rx_fixup()
179 if (hdr->pad & 0x80) in qmimux_rx_fixup()
183 pad_len = hdr->pad & 0x3f; in qmimux_rx_fixup()
186 pkt_len = len - pad_len; in qmimux_rx_fixup()
188 net = qmimux_find_dev(dev, hdr->mux_id); in qmimux_rx_fixup()
195 switch (skb->data[offset + qmimux_hdr_sz] & 0xf0) { in qmimux_rx_fixup()
197 skbn->protocol = htons(ETH_P_IP); in qmimux_rx_fixup()
200 skbn->protocol = htons(ETH_P_IPV6); in qmimux_rx_fixup()
203 /* not ip - do not know what to do */ in qmimux_rx_fixup()
209 skb_put_data(skbn, skb->data + offset + qmimux_hdr_sz, pkt_len); in qmimux_rx_fixup()
211 net->stats.rx_errors++; in qmimux_rx_fixup()
230 return sysfs_emit(buf, "0x%02x\n", priv->mux_id); in mux_id_show()
254 return -ENOBUFS; in qmimux_register_device()
258 priv->mux_id = mux_id; in qmimux_register_device()
259 priv->real_dev = real_dev; in qmimux_register_device()
261 new_dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); in qmimux_register_device()
262 if (!new_dev->tstats) { in qmimux_register_device()
263 err = -ENOBUFS; in qmimux_register_device()
267 new_dev->sysfs_groups[0] = &qmi_wwan_sysfs_qmimux_attr_group; in qmimux_register_device()
297 struct net_device *real_dev = priv->real_dev; in qmimux_unregister_device()
299 free_percpu(dev->tstats); in qmimux_unregister_device()
310 struct qmi_wwan_state *info = (void *)&dev->data; in qmi_wwan_netdev_setup()
312 if (info->flags & QMI_WWAN_FLAG_RAWIP) { in qmi_wwan_netdev_setup()
313 net->header_ops = NULL; /* No header */ in qmi_wwan_netdev_setup()
314 net->type = ARPHRD_NONE; in qmi_wwan_netdev_setup()
315 net->hard_header_len = 0; in qmi_wwan_netdev_setup()
316 net->addr_len = 0; in qmi_wwan_netdev_setup()
317 net->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; in qmi_wwan_netdev_setup()
318 set_bit(EVENT_NO_IP_ALIGN, &dev->flags); in qmi_wwan_netdev_setup()
320 } else if (!net->header_ops) { /* don't bother if already set */ in qmi_wwan_netdev_setup()
323 net->min_mtu = 0; in qmi_wwan_netdev_setup()
324 net->max_mtu = ETH_MAX_MTU; in qmi_wwan_netdev_setup()
325 clear_bit(EVENT_NO_IP_ALIGN, &dev->flags); in qmi_wwan_netdev_setup()
330 usbnet_change_mtu(net, net->mtu); in qmi_wwan_netdev_setup()
336 struct qmi_wwan_state *info = (void *)&dev->data; in raw_ip_show()
338 return sprintf(buf, "%c\n", info->flags & QMI_WWAN_FLAG_RAWIP ? 'Y' : 'N'); in raw_ip_show()
344 struct qmi_wwan_state *info = (void *)&dev->data; in raw_ip_store()
349 return -EINVAL; in raw_ip_store()
352 if (enable == (info->flags & QMI_WWAN_FLAG_RAWIP)) in raw_ip_store()
356 if (!enable && (info->flags & QMI_WWAN_FLAG_PASS_THROUGH)) { in raw_ip_store()
357 netdev_err(dev->net, in raw_ip_store()
359 return -EINVAL; in raw_ip_store()
366 if (netif_running(dev->net)) { in raw_ip_store()
367 netdev_err(dev->net, "Cannot change a running device\n"); in raw_ip_store()
368 ret = -EBUSY; in raw_ip_store()
373 ret = call_netdevice_notifiers(NETDEV_PRE_TYPE_CHANGE, dev->net); in raw_ip_store()
376 netdev_err(dev->net, "Type change was refused\n"); in raw_ip_store()
381 info->flags |= QMI_WWAN_FLAG_RAWIP; in raw_ip_store()
383 info->flags &= ~QMI_WWAN_FLAG_RAWIP; in raw_ip_store()
384 qmi_wwan_netdev_setup(dev->net); in raw_ip_store()
385 call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE, dev->net); in raw_ip_store()
403 count += scnprintf(&buf[count], PAGE_SIZE - count, in add_mux_show()
404 "0x%02x\n", priv->mux_id); in add_mux_show()
413 struct qmi_wwan_state *info = (void *)&dev->data; in add_mux_store()
418 return -EINVAL; in add_mux_store()
420 /* mux_id [1 - 254] for compatibility with ip(8) and the rmnet driver */ in add_mux_store()
422 return -EINVAL; in add_mux_store()
428 netdev_err(dev->net, "mux_id already present\n"); in add_mux_store()
429 ret = -EINVAL; in add_mux_store()
433 ret = qmimux_register_device(dev->net, mux_id); in add_mux_store()
435 info->flags |= QMI_WWAN_FLAG_MUX; in add_mux_store()
451 struct qmi_wwan_state *info = (void *)&dev->data; in del_mux_store()
457 return -EINVAL; in del_mux_store()
464 netdev_err(dev->net, "mux_id not present\n"); in del_mux_store()
465 ret = -EINVAL; in del_mux_store()
471 info->flags &= ~QMI_WWAN_FLAG_MUX; in del_mux_store()
484 info = (void *)&dev->data; in pass_through_show()
486 info->flags & QMI_WWAN_FLAG_PASS_THROUGH ? 'Y' : 'N'); in pass_through_show()
498 return -EINVAL; in pass_through_store()
500 info = (void *)&dev->data; in pass_through_store()
503 if (enable == (info->flags & QMI_WWAN_FLAG_PASS_THROUGH)) in pass_through_store()
507 if (!(info->flags & QMI_WWAN_FLAG_RAWIP)) { in pass_through_store()
508 netdev_err(dev->net, in pass_through_store()
510 return -EINVAL; in pass_through_store()
514 info->flags |= QMI_WWAN_FLAG_PASS_THROUGH; in pass_through_store()
516 info->flags &= ~QMI_WWAN_FLAG_PASS_THROUGH; in pass_through_store()
552 * ARP packets on a point-to-point link. Any packet with an ethernet
566 struct qmi_wwan_state *info = (void *)&dev->data; in qmi_wwan_rx_fixup()
567 bool rawip = info->flags & QMI_WWAN_FLAG_RAWIP; in qmi_wwan_rx_fixup()
571 if (skb->len < dev->net->hard_header_len) in qmi_wwan_rx_fixup()
574 if (info->flags & QMI_WWAN_FLAG_MUX) in qmi_wwan_rx_fixup()
577 if (info->flags & QMI_WWAN_FLAG_PASS_THROUGH) { in qmi_wwan_rx_fixup()
578 skb->protocol = htons(ETH_P_MAP); in qmi_wwan_rx_fixup()
582 switch (skb->data[0] & 0xf0) { in qmi_wwan_rx_fixup()
592 if (is_multicast_ether_addr(skb->data)) in qmi_wwan_rx_fixup()
594 /* possibly bogus destination - rewrite just in case */ in qmi_wwan_rx_fixup()
605 skb->dev = dev->net; /* normally set by eth_type_trans */ in qmi_wwan_rx_fixup()
606 skb->protocol = proto; in qmi_wwan_rx_fixup()
614 eth_hdr(skb)->h_proto = proto; in qmi_wwan_rx_fixup()
615 eth_zero_addr(eth_hdr(skb)->h_source); in qmi_wwan_rx_fixup()
617 memcpy(eth_hdr(skb)->h_dest, dev->net->dev_addr, ETH_ALEN); in qmi_wwan_rx_fixup()
636 if (possibly_iphdr(addr->sa_data)) in qmi_wwan_mac_addr()
637 return -EADDRNOTAVAIL; in qmi_wwan_mac_addr()
658 struct qmi_wwan_state *info = (void *)&dev->data; in qmi_wwan_manage_power()
661 dev_dbg(&dev->intf->dev, "%s() pmcount=%d, on=%d\n", __func__, in qmi_wwan_manage_power()
662 atomic_read(&info->pmcount), on); in qmi_wwan_manage_power()
664 if ((on && atomic_add_return(1, &info->pmcount) == 1) || in qmi_wwan_manage_power()
665 (!on && atomic_dec_and_test(&info->pmcount))) { in qmi_wwan_manage_power()
669 rv = usb_autopm_get_interface(dev->intf); in qmi_wwan_manage_power()
670 dev->intf->needs_remote_wakeup = on; in qmi_wwan_manage_power()
672 usb_autopm_put_interface(dev->intf); in qmi_wwan_manage_power()
692 struct qmi_wwan_state *info = (void *)&dev->data; in qmi_wwan_register_subdriver()
695 rv = usbnet_get_endpoints(dev, info->data); in qmi_wwan_register_subdriver()
700 if (info->control != info->data) in qmi_wwan_register_subdriver()
701 dev->status = &info->control->cur_altsetting->endpoint[0]; in qmi_wwan_register_subdriver()
704 if (!dev->status) { in qmi_wwan_register_subdriver()
705 rv = -EINVAL; in qmi_wwan_register_subdriver()
710 atomic_set(&info->pmcount, 0); in qmi_wwan_register_subdriver()
713 subdriver = usb_cdc_wdm_register(info->control, &dev->status->desc, in qmi_wwan_register_subdriver()
717 dev_err(&info->control->dev, "subdriver registration failed\n"); in qmi_wwan_register_subdriver()
723 dev->status = NULL; in qmi_wwan_register_subdriver()
726 info->subdriver = subdriver; in qmi_wwan_register_subdriver()
739 u8 intf = dev->intf->cur_altsetting->desc.bInterfaceNumber; in qmi_wwan_change_dtr()
749 u8 *buf = intf->cur_altsetting->extra; in qmi_wwan_bind()
750 int len = intf->cur_altsetting->extralen; in qmi_wwan_bind()
751 struct usb_interface_descriptor *desc = &intf->cur_altsetting->desc; in qmi_wwan_bind()
755 struct qmi_wwan_state *info = (void *)&dev->data; in qmi_wwan_bind()
758 BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data) < in qmi_wwan_bind()
762 info->control = intf; in qmi_wwan_bind()
763 info->data = intf; in qmi_wwan_bind()
772 info->data = usb_ifnum_to_if(dev->udev, in qmi_wwan_bind()
773 cdc_union->bSlaveInterface0); in qmi_wwan_bind()
774 if (desc->bInterfaceNumber != cdc_union->bMasterInterface0 || in qmi_wwan_bind()
775 !info->data) { in qmi_wwan_bind()
776 dev_err(&intf->dev, in qmi_wwan_bind()
777 "bogus CDC Union: master=%u, slave=%u\n", in qmi_wwan_bind()
778 cdc_union->bMasterInterface0, in qmi_wwan_bind()
779 cdc_union->bSlaveInterface0); in qmi_wwan_bind()
783 info->data = intf; in qmi_wwan_bind()
787 /* errors aren't fatal - we can live with the dynamic address */ in qmi_wwan_bind()
788 if (cdc_ether && cdc_ether->wMaxSegmentSize) { in qmi_wwan_bind()
789 dev->hard_mtu = le16_to_cpu(cdc_ether->wMaxSegmentSize); in qmi_wwan_bind()
790 usbnet_get_ethernet_addr(dev, cdc_ether->iMACAddress); in qmi_wwan_bind()
794 if (info->control != info->data) { in qmi_wwan_bind()
795 status = usb_driver_claim_interface(driver, info->data, dev); in qmi_wwan_bind()
801 if (status < 0 && info->control != info->data) { in qmi_wwan_bind()
802 usb_set_intfdata(info->data, NULL); in qmi_wwan_bind()
803 usb_driver_release_interface(driver, info->data); in qmi_wwan_bind()
823 if (dev->driver_info->data & QMI_WWAN_QUIRK_DTR || in qmi_wwan_bind()
824 le16_to_cpu(dev->udev->descriptor.bcdUSB) >= 0x0201) { in qmi_wwan_bind()
830 * buggy firmware told us to. Or, if device is assigned the well-known in qmi_wwan_bind()
833 if (ether_addr_equal(dev->net->dev_addr, default_modem_addr) || in qmi_wwan_bind()
834 ether_addr_equal(dev->net->dev_addr, buggy_fw_addr)) in qmi_wwan_bind()
835 eth_hw_addr_random(dev->net); in qmi_wwan_bind()
838 if (possibly_iphdr(dev->net->dev_addr)) { in qmi_wwan_bind()
839 u8 addr = dev->net->dev_addr[0]; in qmi_wwan_bind()
843 dev_addr_mod(dev->net, 0, &addr, 1); in qmi_wwan_bind()
845 dev->net->netdev_ops = &qmi_wwan_netdev_ops; in qmi_wwan_bind()
846 dev->net->sysfs_groups[0] = &qmi_wwan_sysfs_attr_group; in qmi_wwan_bind()
853 struct qmi_wwan_state *info = (void *)&dev->data; in qmi_wwan_unbind()
857 if (info->subdriver && info->subdriver->disconnect) in qmi_wwan_unbind()
858 info->subdriver->disconnect(info->control); in qmi_wwan_unbind()
861 if (le16_to_cpu(dev->udev->descriptor.bcdUSB) >= 0x0201) { in qmi_wwan_unbind()
867 if (intf == info->control) in qmi_wwan_unbind()
868 other = info->data; in qmi_wwan_unbind()
870 other = info->control; in qmi_wwan_unbind()
878 info->subdriver = NULL; in qmi_wwan_unbind()
879 info->data = NULL; in qmi_wwan_unbind()
880 info->control = NULL; in qmi_wwan_unbind()
883 /* suspend/resume wrappers calling both usbnet and the cdc-wdm
886 * NOTE: cdc-wdm also supports pre/post_reset, but we cannot provide
892 struct qmi_wwan_state *info = (void *)&dev->data; in qmi_wwan_suspend()
895 /* Both usbnet_suspend() and subdriver->suspend() MUST return 0 in qmi_wwan_suspend()
903 if (intf == info->control && info->subdriver && in qmi_wwan_suspend()
904 info->subdriver->suspend) in qmi_wwan_suspend()
905 ret = info->subdriver->suspend(intf, message); in qmi_wwan_suspend()
915 struct qmi_wwan_state *info = (void *)&dev->data; in qmi_wwan_resume()
917 bool callsub = (intf == info->control && info->subdriver && in qmi_wwan_resume()
918 info->subdriver->resume); in qmi_wwan_resume()
921 ret = info->subdriver->resume(intf); in qmi_wwan_resume()
926 info->subdriver->suspend(intf, PMSG_SUSPEND); in qmi_wwan_resume()
1023 { /* Pantech UML290 - newer firmware */
1091 {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)}, /* Quectel EM160R-GL */
1092 {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */
1096 {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
1097 {QMI_FIXED_INTF(0x05c6, 0x6001, 3)}, /* 4G LTE usb-modem U901 */
1127 {QMI_QUIRK_SET_DTR(0x05c6, 0x9025, 4)}, /* Alcatel-sbell ASB TL131 TDD LTE (China Mobile) */
1225 {QMI_QUIRK_SET_DTR(0x05c6, 0x9091, 2)}, /* Compal RXM-G1 */
1227 {QMI_QUIRK_SET_DTR(0x05c6, 0x90db, 2)}, /* Compal RXM-G1 */
1230 {QMI_QUIRK_SET_DTR(0x05c6, 0x9625, 4)}, /* YUGA CLM920-NC5 */
1239 {QMI_FIXED_INTF(0x1435, 0xd111, 4)}, /* M9615A DM11-1 D51QC */
1249 {QMI_FIXED_INTF(0x16d8, 0x6007, 0)}, /* CMOTech CHE-628S */
1250 {QMI_FIXED_INTF(0x16d8, 0x6008, 0)}, /* CMOTech CMU-301 */
1251 {QMI_FIXED_INTF(0x16d8, 0x6280, 0)}, /* CMOTech CHU-628 */
1252 {QMI_FIXED_INTF(0x16d8, 0x7001, 0)}, /* CMOTech CHU-720S */
1254 {QMI_FIXED_INTF(0x16d8, 0x7003, 4)}, /* CMOTech CHU-629K */
1256 {QMI_FIXED_INTF(0x16d8, 0x7006, 5)}, /* CMOTech CGU-629 */
1257 {QMI_FIXED_INTF(0x16d8, 0x700a, 4)}, /* CMOTech CHU-629S */
1258 {QMI_FIXED_INTF(0x16d8, 0x7211, 0)}, /* CMOTech CHU-720I */
1274 {QMI_FIXED_INTF(0x19d2, 0x0055, 1)}, /* ZTE (Vodafone) K3520-Z */
1276 {QMI_FIXED_INTF(0x19d2, 0x0063, 4)}, /* ZTE (Vodafone) K3565-Z */
1277 {QMI_FIXED_INTF(0x19d2, 0x0104, 4)}, /* ZTE (Vodafone) K4505-Z */
1303 {QMI_FIXED_INTF(0x19d2, 0x0412, 4)}, /* Telewell TW-LTE 4G */
1304 {QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */
1305 {QMI_FIXED_INTF(0x19d2, 0x1010, 4)}, /* ZTE (Vodafone) K3571-Z */
1307 {QMI_FIXED_INTF(0x19d2, 0x1018, 3)}, /* ZTE (Vodafone) K5006-Z */
1323 {QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */
1326 {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */
1327 {QMI_FIXED_INTF(0x2001, 0x7e16, 3)}, /* D-Link DWM-221 */
1328 {QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */
1329 {QMI_FIXED_INTF(0x2001, 0x7e35, 4)}, /* D-Link DWM-222 */
1330 {QMI_FIXED_INTF(0x2001, 0x7e3d, 4)}, /* D-Link DWM-222 A2 */
1344 {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */
1347 {QMI_FIXED_INTF(0x1199, 0x9055, 8)}, /* Netgear AirCard 341U */
1363 {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
1364 {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */
1365 {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */
1366 {QMI_QUIRK_SET_DTR(0x1bc7, 0x103a, 0)}, /* Telit LE910C4-WWX */
1392 {QMI_FIXED_INTF(0x1c9e, 0x9801, 3)}, /* Telewell TW-3G HSPA+ */
1393 {QMI_FIXED_INTF(0x1c9e, 0x9803, 4)}, /* Telewell TW-3G HSPA+ */
1394 {QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */
1412 {QMI_FIXED_INTF(0x1e2d, 0x00f3, 0)}, /* Cinterion MV32-W-A RmNet */
1413 {QMI_FIXED_INTF(0x1e2d, 0x00f4, 0)}, /* Cinterion MV32-W-B RmNet */
1430 {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */
1432 {QMI_QUIRK_SET_DTR(0x22de, 0x9051, 2)}, /* Hucom Wireless HM-211S/K */
1433 {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
1446 {QMI_QUIRK_SET_DTR(0x1546, 0x1312, 4)}, /* u-blox LARA-R6 01B */
1447 {QMI_QUIRK_SET_DTR(0x1546, 0x1342, 4)}, /* u-blox LARA-L6 */
1456 {QMI_GOBI1K_DEVICE(0x1410, 0xa001)}, /* Novatel/Verizon USB-1000 */
1516 if (dev->actconfig && in quectel_ec20_detected()
1517 le16_to_cpu(dev->descriptor.idVendor) == 0x05c6 && in quectel_ec20_detected()
1518 le16_to_cpu(dev->descriptor.idProduct) == 0x9215 && in quectel_ec20_detected()
1519 dev->actconfig->desc.bNumInterfaces == 5) in quectel_ec20_detected()
1529 struct usb_interface_descriptor *desc = &intf->cur_altsetting->desc; in qmi_wwan_probe()
1536 if (!id->driver_info) { in qmi_wwan_probe()
1537 dev_dbg(&intf->dev, "setting defaults for dynamic device id\n"); in qmi_wwan_probe()
1538 id->driver_info = (unsigned long)&qmi_wwan_info; in qmi_wwan_probe()
1545 if (id->match_flags & USB_DEVICE_ID_MATCH_INT_NUMBER && in qmi_wwan_probe()
1546 desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) { in qmi_wwan_probe()
1547 dev_dbg(&intf->dev, in qmi_wwan_probe()
1549 desc->bInterfaceClass); in qmi_wwan_probe()
1550 return -ENODEV; in qmi_wwan_probe()
1554 if (quectel_ec20_detected(intf) && desc->bInterfaceNumber == 0) { in qmi_wwan_probe()
1555 dev_dbg(&intf->dev, "Quectel EC20 quirk, skipping interface 0\n"); in qmi_wwan_probe()
1556 return -ENODEV; in qmi_wwan_probe()
1561 * identical for the diagnostic- and QMI-interface, but bNumEndpoints is in qmi_wwan_probe()
1565 if (desc->bNumEndpoints == 2) in qmi_wwan_probe()
1566 return -ENODEV; in qmi_wwan_probe()
1582 info = (void *)&dev->data; in qmi_wwan_disconnect()
1583 if (info->flags & QMI_WWAN_FLAG_MUX) { in qmi_wwan_disconnect()
1589 netdev_for_each_upper_dev_rcu(dev->net, ldev, iter) in qmi_wwan_disconnect()
1594 info->flags &= ~QMI_WWAN_FLAG_MUX; in qmi_wwan_disconnect()