2012-01-19 23:37:22 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2012 Bjørn Mork <bjorn@mork.no>
|
|
|
|
*
|
2012-06-19 08:42:01 +08:00
|
|
|
* 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)
|
|
|
|
*
|
2012-01-19 23:37:22 +08:00
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/netdevice.h>
|
|
|
|
#include <linux/ethtool.h>
|
2013-04-18 20:57:09 +08:00
|
|
|
#include <linux/etherdevice.h>
|
2012-01-19 23:37:22 +08:00
|
|
|
#include <linux/mii.h>
|
|
|
|
#include <linux/usb.h>
|
|
|
|
#include <linux/usb/cdc.h>
|
|
|
|
#include <linux/usb/usbnet.h>
|
2012-03-09 19:35:05 +08:00
|
|
|
#include <linux/usb/cdc-wdm.h>
|
2012-01-19 23:37:22 +08:00
|
|
|
|
2012-06-19 08:42:01 +08:00
|
|
|
/* This driver supports wwan (3G/LTE/?) devices using a vendor
|
2012-01-19 23:37:22 +08:00
|
|
|
* specific management protocol called Qualcomm MSM Interface (QMI) -
|
|
|
|
* in addition to the more common AT commands over serial interface
|
|
|
|
* management
|
|
|
|
*
|
|
|
|
* QMI is wrapped in CDC, using CDC encapsulated commands on the
|
|
|
|
* control ("master") interface of a two-interface CDC Union
|
|
|
|
* resembling standard CDC ECM. The devices do not use the control
|
|
|
|
* interface for any other CDC messages. Most likely because the
|
|
|
|
* management protocol is used in place of the standard CDC
|
|
|
|
* notifications NOTIFY_NETWORK_CONNECTION and NOTIFY_SPEED_CHANGE
|
|
|
|
*
|
2012-06-19 08:42:01 +08:00
|
|
|
* Alternatively, control and data functions can be combined in a
|
|
|
|
* single USB interface.
|
|
|
|
*
|
2012-01-19 23:37:22 +08:00
|
|
|
* Handling a protocol like QMI is out of the scope for any driver.
|
2012-06-19 08:42:01 +08:00
|
|
|
* It is exported as a character device using the cdc-wdm driver as
|
|
|
|
* a subdriver, enabling userspace applications ("modem managers") to
|
|
|
|
* handle it.
|
2012-01-19 23:37:22 +08:00
|
|
|
*
|
|
|
|
* These devices may alternatively/additionally be configured using AT
|
2012-06-19 08:42:01 +08:00
|
|
|
* commands on a serial interface
|
2012-01-19 23:37:22 +08:00
|
|
|
*/
|
|
|
|
|
2012-06-19 08:41:59 +08:00
|
|
|
/* driver specific data */
|
|
|
|
struct qmi_wwan_state {
|
|
|
|
struct usb_driver *subdriver;
|
|
|
|
atomic_t pmcount;
|
2012-06-19 08:42:00 +08:00
|
|
|
unsigned long unused;
|
|
|
|
struct usb_interface *control;
|
|
|
|
struct usb_interface *data;
|
2012-06-19 08:41:59 +08:00
|
|
|
};
|
|
|
|
|
2013-04-18 20:57:11 +08:00
|
|
|
/* default ethernet address used by the modem */
|
|
|
|
static const u8 default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3};
|
|
|
|
|
2013-04-18 20:57:09 +08:00
|
|
|
/* Make up an ethernet header if the packet doesn't have one.
|
|
|
|
*
|
|
|
|
* A firmware bug common among several devices cause them to send raw
|
|
|
|
* IP packets under some circumstances. There is no way for the
|
|
|
|
* driver/host to know when this will happen. And even when the bug
|
|
|
|
* hits, some packets will still arrive with an intact header.
|
|
|
|
*
|
|
|
|
* The supported devices are only capably of sending IPv4, IPv6 and
|
|
|
|
* ARP packets on a point-to-point link. Any packet with an ethernet
|
|
|
|
* header will have either our address or a broadcast/multicast
|
|
|
|
* address as destination. ARP packets will always have a header.
|
|
|
|
*
|
|
|
|
* This means that this function will reliably add the appropriate
|
|
|
|
* header iff necessary, provided our hardware address does not start
|
|
|
|
* with 4 or 6.
|
net: qmi_wwan: fixup destination address (firmware bug workaround)
Received packets are sometimes addressed to 00:a0:c6:00:00:00
instead of the address the device firmware should have learned
from the host:
321.224126 77.16.85.204 -> 148.122.171.134 ICMP 98 Echo (ping) request id=0x4025, seq=64/16384, ttl=64
0000 82 c0 82 c9 f1 67 82 c0 82 c9 f1 67 08 00 45 00 .....g.....g..E.
0010 00 54 00 00 40 00 40 01 57 cc 4d 10 55 cc 94 7a .T..@.@.W.M.U..z
0020 ab 86 08 00 62 fc 40 25 00 40 b2 bc 6e 51 00 00 ....b.@%.@..nQ..
0030 00 00 6b bd 09 00 00 00 00 00 10 11 12 13 14 15 ..k.............
0040 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 .......... !"#$%
0050 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 &'()*+,-./012345
0060 36 37 67
321.240607 148.122.171.134 -> 77.16.85.204 ICMP 98 Echo (ping) reply id=0x4025, seq=64/16384, ttl=55
0000 00 a0 c6 00 00 00 02 50 f3 00 00 00 08 00 45 00 .......P......E.
0010 00 54 00 56 00 00 37 01 a0 76 94 7a ab 86 4d 10 .T.V..7..v.z..M.
0020 55 cc 00 00 6a fc 40 25 00 40 b2 bc 6e 51 00 00 U...j.@%.@..nQ..
0030 00 00 6b bd 09 00 00 00 00 00 10 11 12 13 14 15 ..k.............
0040 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 .......... !"#$%
0050 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 &'()*+,-./012345
0060 36 37 67
The bogus address is always the same, and matches the address
suggested by many devices as a default address. It is likely a
hardcoded firmware default.
The circumstances where this bug has been observed indicates that
the trigger is related to timing or some other factor the host
cannot control. Repeating the exact same configuration sequence
that caused it to trigger once, will not necessarily cause it to
trigger the next time. Reproducing the bug is therefore difficult.
This opens up a possibility that the bug is more common than we can
confirm, because affected devices often will work properly again
after a reset. A procedure most users are likely to try out before
reporting a bug.
Unconditionally rewriting the destination address if the first digit
of the received packet is 0, is considered an acceptable compromise
since we already have to inspect this digit. The simplification will
cause unnecessary rewrites if the real address starts with 0, but this
is still better than adding additional tests for this particular case.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-04-18 20:57:10 +08:00
|
|
|
*
|
|
|
|
* Another common firmware bug results in all packets being addressed
|
|
|
|
* to 00:a0:c6:00:00:00 despite the host address being different.
|
|
|
|
* This function will also fixup such packets.
|
2013-04-18 20:57:09 +08:00
|
|
|
*/
|
|
|
|
static int qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
|
|
|
{
|
|
|
|
__be16 proto;
|
|
|
|
|
|
|
|
/* usbnet rx_complete guarantees that skb->len is at least
|
|
|
|
* hard_header_len, so we can inspect the dest address without
|
|
|
|
* checking skb->len
|
|
|
|
*/
|
|
|
|
switch (skb->data[0] & 0xf0) {
|
|
|
|
case 0x40:
|
|
|
|
proto = htons(ETH_P_IP);
|
|
|
|
break;
|
|
|
|
case 0x60:
|
|
|
|
proto = htons(ETH_P_IPV6);
|
|
|
|
break;
|
net: qmi_wwan: fixup destination address (firmware bug workaround)
Received packets are sometimes addressed to 00:a0:c6:00:00:00
instead of the address the device firmware should have learned
from the host:
321.224126 77.16.85.204 -> 148.122.171.134 ICMP 98 Echo (ping) request id=0x4025, seq=64/16384, ttl=64
0000 82 c0 82 c9 f1 67 82 c0 82 c9 f1 67 08 00 45 00 .....g.....g..E.
0010 00 54 00 00 40 00 40 01 57 cc 4d 10 55 cc 94 7a .T..@.@.W.M.U..z
0020 ab 86 08 00 62 fc 40 25 00 40 b2 bc 6e 51 00 00 ....b.@%.@..nQ..
0030 00 00 6b bd 09 00 00 00 00 00 10 11 12 13 14 15 ..k.............
0040 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 .......... !"#$%
0050 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 &'()*+,-./012345
0060 36 37 67
321.240607 148.122.171.134 -> 77.16.85.204 ICMP 98 Echo (ping) reply id=0x4025, seq=64/16384, ttl=55
0000 00 a0 c6 00 00 00 02 50 f3 00 00 00 08 00 45 00 .......P......E.
0010 00 54 00 56 00 00 37 01 a0 76 94 7a ab 86 4d 10 .T.V..7..v.z..M.
0020 55 cc 00 00 6a fc 40 25 00 40 b2 bc 6e 51 00 00 U...j.@%.@..nQ..
0030 00 00 6b bd 09 00 00 00 00 00 10 11 12 13 14 15 ..k.............
0040 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 .......... !"#$%
0050 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 &'()*+,-./012345
0060 36 37 67
The bogus address is always the same, and matches the address
suggested by many devices as a default address. It is likely a
hardcoded firmware default.
The circumstances where this bug has been observed indicates that
the trigger is related to timing or some other factor the host
cannot control. Repeating the exact same configuration sequence
that caused it to trigger once, will not necessarily cause it to
trigger the next time. Reproducing the bug is therefore difficult.
This opens up a possibility that the bug is more common than we can
confirm, because affected devices often will work properly again
after a reset. A procedure most users are likely to try out before
reporting a bug.
Unconditionally rewriting the destination address if the first digit
of the received packet is 0, is considered an acceptable compromise
since we already have to inspect this digit. The simplification will
cause unnecessary rewrites if the real address starts with 0, but this
is still better than adding additional tests for this particular case.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-04-18 20:57:10 +08:00
|
|
|
case 0x00:
|
|
|
|
if (is_multicast_ether_addr(skb->data))
|
|
|
|
return 1;
|
|
|
|
/* possibly bogus destination - rewrite just in case */
|
|
|
|
skb_reset_mac_header(skb);
|
|
|
|
goto fix_dest;
|
2013-04-18 20:57:09 +08:00
|
|
|
default:
|
|
|
|
/* pass along other packets without modifications */
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (skb_headroom(skb) < ETH_HLEN)
|
|
|
|
return 0;
|
|
|
|
skb_push(skb, ETH_HLEN);
|
|
|
|
skb_reset_mac_header(skb);
|
|
|
|
eth_hdr(skb)->h_proto = proto;
|
|
|
|
memset(eth_hdr(skb)->h_source, 0, ETH_ALEN);
|
net: qmi_wwan: fixup destination address (firmware bug workaround)
Received packets are sometimes addressed to 00:a0:c6:00:00:00
instead of the address the device firmware should have learned
from the host:
321.224126 77.16.85.204 -> 148.122.171.134 ICMP 98 Echo (ping) request id=0x4025, seq=64/16384, ttl=64
0000 82 c0 82 c9 f1 67 82 c0 82 c9 f1 67 08 00 45 00 .....g.....g..E.
0010 00 54 00 00 40 00 40 01 57 cc 4d 10 55 cc 94 7a .T..@.@.W.M.U..z
0020 ab 86 08 00 62 fc 40 25 00 40 b2 bc 6e 51 00 00 ....b.@%.@..nQ..
0030 00 00 6b bd 09 00 00 00 00 00 10 11 12 13 14 15 ..k.............
0040 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 .......... !"#$%
0050 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 &'()*+,-./012345
0060 36 37 67
321.240607 148.122.171.134 -> 77.16.85.204 ICMP 98 Echo (ping) reply id=0x4025, seq=64/16384, ttl=55
0000 00 a0 c6 00 00 00 02 50 f3 00 00 00 08 00 45 00 .......P......E.
0010 00 54 00 56 00 00 37 01 a0 76 94 7a ab 86 4d 10 .T.V..7..v.z..M.
0020 55 cc 00 00 6a fc 40 25 00 40 b2 bc 6e 51 00 00 U...j.@%.@..nQ..
0030 00 00 6b bd 09 00 00 00 00 00 10 11 12 13 14 15 ..k.............
0040 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 .......... !"#$%
0050 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 &'()*+,-./012345
0060 36 37 67
The bogus address is always the same, and matches the address
suggested by many devices as a default address. It is likely a
hardcoded firmware default.
The circumstances where this bug has been observed indicates that
the trigger is related to timing or some other factor the host
cannot control. Repeating the exact same configuration sequence
that caused it to trigger once, will not necessarily cause it to
trigger the next time. Reproducing the bug is therefore difficult.
This opens up a possibility that the bug is more common than we can
confirm, because affected devices often will work properly again
after a reset. A procedure most users are likely to try out before
reporting a bug.
Unconditionally rewriting the destination address if the first digit
of the received packet is 0, is considered an acceptable compromise
since we already have to inspect this digit. The simplification will
cause unnecessary rewrites if the real address starts with 0, but this
is still better than adding additional tests for this particular case.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-04-18 20:57:10 +08:00
|
|
|
fix_dest:
|
2013-04-18 20:57:09 +08:00
|
|
|
memcpy(eth_hdr(skb)->h_dest, dev->net->dev_addr, ETH_ALEN);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* very simplistic detection of IPv4 or IPv6 headers */
|
|
|
|
static bool possibly_iphdr(const char *data)
|
|
|
|
{
|
|
|
|
return (data[0] & 0xd0) == 0x40;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* disallow addresses which may be confused with IP headers */
|
|
|
|
static int qmi_wwan_mac_addr(struct net_device *dev, void *p)
|
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
struct sockaddr *addr = p;
|
|
|
|
|
|
|
|
ret = eth_prepare_mac_addr_change(dev, p);
|
|
|
|
if (ret < 0)
|
|
|
|
return ret;
|
|
|
|
if (possibly_iphdr(addr->sa_data))
|
|
|
|
return -EADDRNOTAVAIL;
|
|
|
|
eth_commit_mac_addr_change(dev, p);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const struct net_device_ops qmi_wwan_netdev_ops = {
|
|
|
|
.ndo_open = usbnet_open,
|
|
|
|
.ndo_stop = usbnet_stop,
|
|
|
|
.ndo_start_xmit = usbnet_start_xmit,
|
|
|
|
.ndo_tx_timeout = usbnet_tx_timeout,
|
|
|
|
.ndo_change_mtu = usbnet_change_mtu,
|
|
|
|
.ndo_set_mac_address = qmi_wwan_mac_addr,
|
|
|
|
.ndo_validate_addr = eth_validate_addr,
|
|
|
|
};
|
|
|
|
|
2012-06-19 08:42:00 +08:00
|
|
|
/* using a counter to merge subdriver requests with our own into a combined state */
|
|
|
|
static int qmi_wwan_manage_power(struct usbnet *dev, int on)
|
|
|
|
{
|
|
|
|
struct qmi_wwan_state *info = (void *)&dev->data;
|
|
|
|
int rv = 0;
|
|
|
|
|
|
|
|
dev_dbg(&dev->intf->dev, "%s() pmcount=%d, on=%d\n", __func__, atomic_read(&info->pmcount), on);
|
|
|
|
|
|
|
|
if ((on && atomic_add_return(1, &info->pmcount) == 1) || (!on && atomic_dec_and_test(&info->pmcount))) {
|
|
|
|
/* need autopm_get/put here to ensure the usbcore sees the new value */
|
|
|
|
rv = usb_autopm_get_interface(dev->intf);
|
|
|
|
if (rv < 0)
|
|
|
|
goto err;
|
|
|
|
dev->intf->needs_remote_wakeup = on;
|
|
|
|
usb_autopm_put_interface(dev->intf);
|
|
|
|
}
|
|
|
|
err:
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int qmi_wwan_cdc_wdm_manage_power(struct usb_interface *intf, int on)
|
|
|
|
{
|
|
|
|
struct usbnet *dev = usb_get_intfdata(intf);
|
2012-06-29 08:37:00 +08:00
|
|
|
|
|
|
|
/* can be called while disconnecting */
|
|
|
|
if (!dev)
|
|
|
|
return 0;
|
2012-06-19 08:42:00 +08:00
|
|
|
return qmi_wwan_manage_power(dev, on);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* collect all three endpoints and register subdriver */
|
|
|
|
static int qmi_wwan_register_subdriver(struct usbnet *dev)
|
|
|
|
{
|
|
|
|
int rv;
|
|
|
|
struct usb_driver *subdriver = NULL;
|
|
|
|
struct qmi_wwan_state *info = (void *)&dev->data;
|
|
|
|
|
|
|
|
/* collect bulk endpoints */
|
|
|
|
rv = usbnet_get_endpoints(dev, info->data);
|
|
|
|
if (rv < 0)
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
/* update status endpoint if separate control interface */
|
|
|
|
if (info->control != info->data)
|
|
|
|
dev->status = &info->control->cur_altsetting->endpoint[0];
|
|
|
|
|
|
|
|
/* require interrupt endpoint for subdriver */
|
|
|
|
if (!dev->status) {
|
|
|
|
rv = -EINVAL;
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* for subdriver power management */
|
|
|
|
atomic_set(&info->pmcount, 0);
|
|
|
|
|
|
|
|
/* register subdriver */
|
2012-09-07 15:36:06 +08:00
|
|
|
subdriver = usb_cdc_wdm_register(info->control, &dev->status->desc, 4096, &qmi_wwan_cdc_wdm_manage_power);
|
2012-06-19 08:42:00 +08:00
|
|
|
if (IS_ERR(subdriver)) {
|
|
|
|
dev_err(&info->control->dev, "subdriver registration failed\n");
|
|
|
|
rv = PTR_ERR(subdriver);
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* prevent usbnet from using status endpoint */
|
|
|
|
dev->status = NULL;
|
|
|
|
|
|
|
|
/* save subdriver struct for suspend/resume wrappers */
|
|
|
|
info->subdriver = subdriver;
|
|
|
|
|
|
|
|
err:
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2012-01-19 23:37:22 +08:00
|
|
|
static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)
|
|
|
|
{
|
|
|
|
int status = -1;
|
|
|
|
u8 *buf = intf->cur_altsetting->extra;
|
|
|
|
int len = intf->cur_altsetting->extralen;
|
|
|
|
struct usb_interface_descriptor *desc = &intf->cur_altsetting->desc;
|
|
|
|
struct usb_cdc_union_desc *cdc_union = NULL;
|
|
|
|
struct usb_cdc_ether_desc *cdc_ether = NULL;
|
|
|
|
u32 found = 0;
|
2012-06-19 08:42:01 +08:00
|
|
|
struct usb_driver *driver = driver_of(intf);
|
2012-06-19 08:41:59 +08:00
|
|
|
struct qmi_wwan_state *info = (void *)&dev->data;
|
|
|
|
|
|
|
|
BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data) < sizeof(struct qmi_wwan_state)));
|
2012-03-09 19:35:05 +08:00
|
|
|
|
2013-03-13 10:25:17 +08:00
|
|
|
/* set up initial state */
|
|
|
|
info->control = intf;
|
|
|
|
info->data = intf;
|
2012-01-19 23:37:22 +08:00
|
|
|
|
2012-09-07 15:36:07 +08:00
|
|
|
/* and a number of CDC descriptors */
|
2012-01-19 23:37:22 +08:00
|
|
|
while (len > 3) {
|
|
|
|
struct usb_descriptor_header *h = (void *)buf;
|
|
|
|
|
|
|
|
/* ignore any misplaced descriptors */
|
|
|
|
if (h->bDescriptorType != USB_DT_CS_INTERFACE)
|
|
|
|
goto next_desc;
|
|
|
|
|
|
|
|
/* buf[2] is CDC descriptor subtype */
|
|
|
|
switch (buf[2]) {
|
|
|
|
case USB_CDC_HEADER_TYPE:
|
|
|
|
if (found & 1 << USB_CDC_HEADER_TYPE) {
|
|
|
|
dev_dbg(&intf->dev, "extra CDC header\n");
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (h->bLength != sizeof(struct usb_cdc_header_desc)) {
|
|
|
|
dev_dbg(&intf->dev, "CDC header len %u\n", h->bLength);
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case USB_CDC_UNION_TYPE:
|
|
|
|
if (found & 1 << USB_CDC_UNION_TYPE) {
|
|
|
|
dev_dbg(&intf->dev, "extra CDC union\n");
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (h->bLength != sizeof(struct usb_cdc_union_desc)) {
|
|
|
|
dev_dbg(&intf->dev, "CDC union len %u\n", h->bLength);
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
cdc_union = (struct usb_cdc_union_desc *)buf;
|
|
|
|
break;
|
|
|
|
case USB_CDC_ETHERNET_TYPE:
|
|
|
|
if (found & 1 << USB_CDC_ETHERNET_TYPE) {
|
|
|
|
dev_dbg(&intf->dev, "extra CDC ether\n");
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (h->bLength != sizeof(struct usb_cdc_ether_desc)) {
|
|
|
|
dev_dbg(&intf->dev, "CDC ether len %u\n", h->bLength);
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
cdc_ether = (struct usb_cdc_ether_desc *)buf;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Remember which CDC functional descriptors we've seen. Works
|
|
|
|
* for all types we care about, of which USB_CDC_ETHERNET_TYPE
|
|
|
|
* (0x0f) is the highest numbered
|
|
|
|
*/
|
|
|
|
if (buf[2] < 32)
|
|
|
|
found |= 1 << buf[2];
|
|
|
|
|
|
|
|
next_desc:
|
|
|
|
len -= h->bLength;
|
|
|
|
buf += h->bLength;
|
|
|
|
}
|
|
|
|
|
2013-03-13 10:25:17 +08:00
|
|
|
/* Use separate control and data interfaces if we found a CDC Union */
|
|
|
|
if (cdc_union) {
|
|
|
|
info->data = usb_ifnum_to_if(dev->udev, cdc_union->bSlaveInterface0);
|
|
|
|
if (desc->bInterfaceNumber != cdc_union->bMasterInterface0 || !info->data) {
|
|
|
|
dev_err(&intf->dev, "bogus CDC Union: master=%u, slave=%u\n",
|
|
|
|
cdc_union->bMasterInterface0, cdc_union->bSlaveInterface0);
|
|
|
|
goto err;
|
|
|
|
}
|
2012-01-19 23:37:22 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* errors aren't fatal - we can live with the dynamic address */
|
|
|
|
if (cdc_ether) {
|
|
|
|
dev->hard_mtu = le16_to_cpu(cdc_ether->wMaxSegmentSize);
|
|
|
|
usbnet_get_ethernet_addr(dev, cdc_ether->iMACAddress);
|
|
|
|
}
|
|
|
|
|
2012-06-19 08:42:01 +08:00
|
|
|
/* claim data interface and set it up */
|
2013-03-13 10:25:17 +08:00
|
|
|
if (info->control != info->data) {
|
|
|
|
status = usb_driver_claim_interface(driver, info->data, dev);
|
|
|
|
if (status < 0)
|
|
|
|
goto err;
|
|
|
|
}
|
2012-01-19 23:37:22 +08:00
|
|
|
|
2012-06-19 08:42:01 +08:00
|
|
|
status = qmi_wwan_register_subdriver(dev);
|
2012-09-07 15:36:07 +08:00
|
|
|
if (status < 0 && info->control != info->data) {
|
2012-06-19 08:42:01 +08:00
|
|
|
usb_set_intfdata(info->data, NULL);
|
|
|
|
usb_driver_release_interface(driver, info->data);
|
|
|
|
}
|
2012-01-19 23:37:22 +08:00
|
|
|
|
2013-04-18 20:57:11 +08:00
|
|
|
/* Never use the same address on both ends of the link, even
|
|
|
|
* if the buggy firmware told us to.
|
|
|
|
*/
|
|
|
|
if (!compare_ether_addr(dev->net->dev_addr, default_modem_addr))
|
|
|
|
eth_hw_addr_random(dev->net);
|
|
|
|
|
2013-04-18 20:57:09 +08:00
|
|
|
/* make MAC addr easily distinguishable from an IP header */
|
|
|
|
if (possibly_iphdr(dev->net->dev_addr)) {
|
|
|
|
dev->net->dev_addr[0] |= 0x02; /* set local assignment bit */
|
|
|
|
dev->net->dev_addr[0] &= 0xbf; /* clear "IP" bit */
|
|
|
|
}
|
|
|
|
dev->net->netdev_ops = &qmi_wwan_netdev_ops;
|
2012-01-19 23:37:22 +08:00
|
|
|
err:
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2012-06-19 08:42:01 +08:00
|
|
|
static void qmi_wwan_unbind(struct usbnet *dev, struct usb_interface *intf)
|
2012-03-09 19:35:05 +08:00
|
|
|
{
|
2012-06-19 08:41:59 +08:00
|
|
|
struct qmi_wwan_state *info = (void *)&dev->data;
|
2012-06-19 08:42:01 +08:00
|
|
|
struct usb_driver *driver = driver_of(intf);
|
|
|
|
struct usb_interface *other;
|
2012-03-09 19:35:05 +08:00
|
|
|
|
2012-06-19 08:41:59 +08:00
|
|
|
if (info->subdriver && info->subdriver->disconnect)
|
2012-06-19 08:42:01 +08:00
|
|
|
info->subdriver->disconnect(info->control);
|
|
|
|
|
|
|
|
/* allow user to unbind using either control or data */
|
|
|
|
if (intf == info->control)
|
|
|
|
other = info->data;
|
|
|
|
else
|
|
|
|
other = info->control;
|
|
|
|
|
|
|
|
/* only if not shared */
|
|
|
|
if (other && intf != other) {
|
|
|
|
usb_set_intfdata(other, NULL);
|
|
|
|
usb_driver_release_interface(driver, other);
|
|
|
|
}
|
2012-03-09 19:35:05 +08:00
|
|
|
|
2012-06-19 08:41:59 +08:00
|
|
|
info->subdriver = NULL;
|
2012-06-19 08:42:01 +08:00
|
|
|
info->data = NULL;
|
|
|
|
info->control = NULL;
|
2012-03-09 19:35:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* suspend/resume wrappers calling both usbnet and the cdc-wdm
|
|
|
|
* subdriver if present.
|
|
|
|
*
|
|
|
|
* NOTE: cdc-wdm also supports pre/post_reset, but we cannot provide
|
|
|
|
* wrappers for those without adding usbnet reset support first.
|
|
|
|
*/
|
|
|
|
static int qmi_wwan_suspend(struct usb_interface *intf, pm_message_t message)
|
|
|
|
{
|
|
|
|
struct usbnet *dev = usb_get_intfdata(intf);
|
2012-06-19 08:41:59 +08:00
|
|
|
struct qmi_wwan_state *info = (void *)&dev->data;
|
2012-03-09 19:35:05 +08:00
|
|
|
int ret;
|
|
|
|
|
2013-03-15 12:08:57 +08:00
|
|
|
/*
|
|
|
|
* Both usbnet_suspend() and subdriver->suspend() MUST return 0
|
|
|
|
* in system sleep context, otherwise, the resume callback has
|
|
|
|
* to recover device from previous suspend failure.
|
|
|
|
*/
|
2012-03-09 19:35:05 +08:00
|
|
|
ret = usbnet_suspend(intf, message);
|
|
|
|
if (ret < 0)
|
|
|
|
goto err;
|
|
|
|
|
2012-09-13 04:44:35 +08:00
|
|
|
if (intf == info->control && info->subdriver && info->subdriver->suspend)
|
2012-06-19 08:41:59 +08:00
|
|
|
ret = info->subdriver->suspend(intf, message);
|
2012-03-09 19:35:05 +08:00
|
|
|
if (ret < 0)
|
|
|
|
usbnet_resume(intf);
|
|
|
|
err:
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int qmi_wwan_resume(struct usb_interface *intf)
|
|
|
|
{
|
|
|
|
struct usbnet *dev = usb_get_intfdata(intf);
|
2012-06-19 08:41:59 +08:00
|
|
|
struct qmi_wwan_state *info = (void *)&dev->data;
|
2012-03-09 19:35:05 +08:00
|
|
|
int ret = 0;
|
2012-09-13 04:44:35 +08:00
|
|
|
bool callsub = (intf == info->control && info->subdriver && info->subdriver->resume);
|
2012-03-09 19:35:05 +08:00
|
|
|
|
2012-09-13 04:44:35 +08:00
|
|
|
if (callsub)
|
2012-06-19 08:41:59 +08:00
|
|
|
ret = info->subdriver->resume(intf);
|
2012-03-09 19:35:05 +08:00
|
|
|
if (ret < 0)
|
|
|
|
goto err;
|
|
|
|
ret = usbnet_resume(intf);
|
2012-09-13 04:44:35 +08:00
|
|
|
if (ret < 0 && callsub && info->subdriver->suspend)
|
2012-06-19 08:41:59 +08:00
|
|
|
info->subdriver->suspend(intf, PMSG_SUSPEND);
|
2012-03-09 19:35:05 +08:00
|
|
|
err:
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-01-19 23:37:22 +08:00
|
|
|
static const struct driver_info qmi_wwan_info = {
|
2012-06-19 08:42:02 +08:00
|
|
|
.description = "WWAN/QMI device",
|
2012-01-19 23:37:22 +08:00
|
|
|
.flags = FLAG_WWAN,
|
|
|
|
.bind = qmi_wwan_bind,
|
2012-06-19 08:42:01 +08:00
|
|
|
.unbind = qmi_wwan_unbind,
|
2012-01-19 23:37:22 +08:00
|
|
|
.manage_power = qmi_wwan_manage_power,
|
2013-04-18 20:57:09 +08:00
|
|
|
.rx_fixup = qmi_wwan_rx_fixup,
|
2012-01-19 23:37:22 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#define HUAWEI_VENDOR_ID 0x12D1
|
2012-06-21 10:45:58 +08:00
|
|
|
|
2012-08-12 17:16:30 +08:00
|
|
|
/* map QMI/wwan function by a fixed interface number */
|
|
|
|
#define QMI_FIXED_INTF(vend, prod, num) \
|
|
|
|
USB_DEVICE_INTERFACE_NUMBER(vend, prod, num), \
|
2012-09-07 15:36:07 +08:00
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info
|
2012-08-12 17:16:30 +08:00
|
|
|
|
2012-06-21 10:45:58 +08:00
|
|
|
/* Gobi 1000 QMI/wwan interface number is 3 according to qcserial */
|
|
|
|
#define QMI_GOBI1K_DEVICE(vend, prod) \
|
2012-08-12 17:16:30 +08:00
|
|
|
QMI_FIXED_INTF(vend, prod, 3)
|
2012-06-21 10:45:58 +08:00
|
|
|
|
2012-08-12 17:16:30 +08:00
|
|
|
/* Gobi 2000/3000 QMI/wwan interface number is 0 according to qcserial */
|
2012-03-09 19:35:06 +08:00
|
|
|
#define QMI_GOBI_DEVICE(vend, prod) \
|
2012-08-12 17:16:30 +08:00
|
|
|
QMI_FIXED_INTF(vend, prod, 0)
|
2012-01-19 23:37:22 +08:00
|
|
|
|
|
|
|
static const struct usb_device_id products[] = {
|
2012-08-12 17:16:30 +08:00
|
|
|
/* 1. CDC ECM like devices match on the control interface */
|
2012-03-09 19:35:05 +08:00
|
|
|
{ /* Huawei E392, E398 and possibly others sharing both device id and more... */
|
2012-08-12 17:16:32 +08:00
|
|
|
USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 9),
|
2012-03-09 19:35:05 +08:00
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
2012-05-19 15:20:31 +08:00
|
|
|
{ /* Vodafone/Huawei K5005 (12d1:14c8) and similar modems */
|
2012-08-12 17:16:32 +08:00
|
|
|
USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 57),
|
2012-05-19 15:20:31 +08:00
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
2013-02-06 13:22:08 +08:00
|
|
|
{ /* HUAWEI_INTERFACE_NDIS_CONTROL_QUALCOMM */
|
|
|
|
USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 0x01, 0x69),
|
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
2012-08-12 17:16:30 +08:00
|
|
|
|
|
|
|
/* 2. Combined interface devices matching on class+protocol */
|
2012-09-19 18:03:36 +08:00
|
|
|
{ /* Huawei E367 and possibly others in "Windows mode" */
|
2012-09-20 05:18:05 +08:00
|
|
|
USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 7),
|
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
2012-08-12 17:16:30 +08:00
|
|
|
{ /* Huawei E392, E398 and possibly others in "Windows mode" */
|
2012-08-12 17:16:32 +08:00
|
|
|
USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 17),
|
2012-09-07 15:36:07 +08:00
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
2012-03-09 19:35:05 +08:00
|
|
|
},
|
2013-02-06 13:22:08 +08:00
|
|
|
{ /* HUAWEI_NDIS_SINGLE_INTERFACE_VDF */
|
|
|
|
USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 0x01, 0x37),
|
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
|
|
|
{ /* HUAWEI_INTERFACE_NDIS_HW_QUALCOMM */
|
|
|
|
USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 0x01, 0x67),
|
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
2012-09-19 18:03:36 +08:00
|
|
|
{ /* Pantech UML290, P4200 and more */
|
2012-09-20 05:18:05 +08:00
|
|
|
USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf0, 0xff),
|
2012-09-07 15:36:07 +08:00
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
2012-03-09 19:35:06 +08:00
|
|
|
},
|
2012-08-15 11:42:57 +08:00
|
|
|
{ /* Pantech UML290 - newer firmware */
|
2012-09-20 05:18:05 +08:00
|
|
|
USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf1, 0xff),
|
2012-09-07 15:36:07 +08:00
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
2012-08-15 11:42:57 +08:00
|
|
|
},
|
2012-10-24 20:10:34 +08:00
|
|
|
{ /* Novatel USB551L and MC551 */
|
|
|
|
USB_DEVICE_AND_INTERFACE_INFO(0x1410, 0xb001,
|
|
|
|
USB_CLASS_COMM,
|
|
|
|
USB_CDC_SUBCLASS_ETHERNET,
|
|
|
|
USB_CDC_PROTO_NONE),
|
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
|
|
|
{ /* Novatel E362 */
|
|
|
|
USB_DEVICE_AND_INTERFACE_INFO(0x1410, 0x9010,
|
|
|
|
USB_CLASS_COMM,
|
|
|
|
USB_CDC_SUBCLASS_ETHERNET,
|
|
|
|
USB_CDC_PROTO_NONE),
|
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
2012-12-17 16:17:41 +08:00
|
|
|
{ /* Dell Wireless 5800 (Novatel E362) */
|
|
|
|
USB_DEVICE_AND_INTERFACE_INFO(0x413C, 0x8195,
|
|
|
|
USB_CLASS_COMM,
|
|
|
|
USB_CDC_SUBCLASS_ETHERNET,
|
|
|
|
USB_CDC_PROTO_NONE),
|
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
|
|
|
{ /* Dell Wireless 5800 V2 (Novatel E362) */
|
|
|
|
USB_DEVICE_AND_INTERFACE_INFO(0x413C, 0x8196,
|
|
|
|
USB_CLASS_COMM,
|
2013-02-19 01:25:09 +08:00
|
|
|
USB_CDC_SUBCLASS_ETHERNET,
|
|
|
|
USB_CDC_PROTO_NONE),
|
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
2013-05-06 19:17:37 +08:00
|
|
|
{ /* Dell Wireless 5804 (Novatel E371) */
|
|
|
|
USB_DEVICE_AND_INTERFACE_INFO(0x413C, 0x819b,
|
|
|
|
USB_CLASS_COMM,
|
|
|
|
USB_CDC_SUBCLASS_ETHERNET,
|
|
|
|
USB_CDC_PROTO_NONE),
|
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
2013-02-19 01:25:09 +08:00
|
|
|
{ /* ADU960S */
|
|
|
|
USB_DEVICE_AND_INTERFACE_INFO(0x16d5, 0x650a,
|
|
|
|
USB_CLASS_COMM,
|
2012-12-17 16:17:41 +08:00
|
|
|
USB_CDC_SUBCLASS_ETHERNET,
|
|
|
|
USB_CDC_PROTO_NONE),
|
|
|
|
.driver_info = (unsigned long)&qmi_wwan_info,
|
|
|
|
},
|
2012-06-21 10:45:58 +08:00
|
|
|
|
2012-08-12 17:16:30 +08:00
|
|
|
/* 3. Combined interface devices matching on interface number */
|
2013-02-12 10:42:50 +08:00
|
|
|
{QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
|
2012-11-25 14:03:59 +08:00
|
|
|
{QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */
|
qmi_wwan/cdc_ether: let qmi_wwan handle the Huawei E1820
Another QMI speaking Qualcomm based device, which should be
driven by qmi_wwan, while cdc_ether should ignore it.
Like on other Huawei devices, the wwan function can appear
either as a single vendor specific interface or as a CDC ECM
class function using separate control and data interfaces.
The ECM control interface protocol is 0xff, likely in an
attempt to indicate that vendor specific management is
required.
In addition to the near standard CDC class, Huawei also add
vendor specific AT management commands to their firmwares.
This is probably an attempt to support non-Windows systems
using standard class drivers. Unfortunately, this part of
the firmware is often buggy. Linux is much better off using
whatever native vendor specific management protocol the
device offers, and Windows uses, whenever possible. This
means QMI in the case of Qualcomm based devices.
The E1820 has been verified to work fine with QMI.
Matching on interface number is necessary to distiguish the
wwan function from serial functions in the single interface
mode, as both function types will have class/subclass/function
set to ff/ff/ff.
The control interface number does not change in CDC ECM mode,
so the interface number matching rule is sufficient to handle
both modes. The cdc_ether blacklist entry is only relevant in
CDC ECM mode, but using a similar interface number based rule
helps document this as a transfer from one driver to another.
Other Huawei 02/06/ff devices are left with the cdc_ether driver
because we do not know whether they are based on Qualcomm chips.
The Huawei specific AT command management is known to be somewhat
hardware independent, and their usage of these class codes may
also be independent of the modem hardware.
Reported-by: Graham Inggs <graham.inggs@uct.ac.za>
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-06-06 18:57:02 +08:00
|
|
|
{QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */
|
net: qmi_wwan: adding more ZTE devices
Analyzed a few Windows driver description files, supporting
this long list of devices:
%ztewwan.DeviceDesc0002% = ztewwan.ndi, USB\VID_19D2&PID_0002&MI_01
%ztewwan.DeviceDesc0012% = ztewwan.ndi, USB\VID_19D2&PID_0012&MI_01
%ztewwan.DeviceDesc0017% = ztewwan.ndi, USB\VID_19D2&PID_0017&MI_03
%ztewwan.DeviceDesc0021% = ztewwan.ndi, USB\VID_19D2&PID_0021&MI_04
%ztewwan.DeviceDesc0025% = ztewwan.ndi, USB\VID_19D2&PID_0025&MI_01
%ztewwan.DeviceDesc0031% = ztewwan.ndi, USB\VID_19D2&PID_0031&MI_04
%ztewwan.DeviceDesc0042% = ztewwan.ndi, USB\VID_19D2&PID_0042&MI_04
%ztewwan.DeviceDesc0049% = ztewwan.ndi, USB\VID_19D2&PID_0049&MI_05
%ztewwan.DeviceDesc0052% = ztewwan.ndi, USB\VID_19D2&PID_0052&MI_04
%ztewwan.DeviceDesc0055% = ztewwan.ndi, USB\VID_19D2&PID_0055&MI_01
%ztewwan.DeviceDesc0058% = ztewwan.ndi, USB\VID_19D2&PID_0058&MI_04
%ztewwan.DeviceDesc0063% = ztewwan.ndi, USB\VID_19D2&PID_0063&MI_04
%ztewwan.DeviceDesc2002% = ztewwan.ndi, USB\VID_19D2&PID_2002&MI_04
%ztewwan.DeviceDesc0104% = ztewwan.ndi, USB\VID_19D2&PID_0104&MI_04
%ztewwan.DeviceDesc0113% = ztewwan.ndi, USB\VID_19D2&PID_0113&MI_05
%ztewwan.DeviceDesc0118% = ztewwan.ndi, USB\VID_19D2&PID_0118&MI_05
%ztewwan.DeviceDesc0121% = ztewwan.ndi, USB\VID_19D2&PID_0121&MI_05
%ztewwan.DeviceDesc0123% = ztewwan.ndi, USB\VID_19D2&PID_0123&MI_04
%ztewwan.DeviceDesc0124% = ztewwan.ndi, USB\VID_19D2&PID_0124&MI_05
%ztewwan.DeviceDesc0125% = ztewwan.ndi, USB\VID_19D2&PID_0125&MI_06
%ztewwan.DeviceDesc0126% = ztewwan.ndi, USB\VID_19D2&PID_0126&MI_05
%ztewwan.DeviceDesc1008% = ztewwan.ndi, USB\VID_19D2&PID_1008&MI_04
%ztewwan.DeviceDesc1010% = ztewwan.ndi, USB\VID_19D2&PID_1010&MI_04
%ztewwan.DeviceDesc1012% = ztewwan.ndi, USB\VID_19D2&PID_1012&MI_04
%ztewwan.DeviceDesc1402% = ztewwan.ndi, USB\VID_19D2&PID_1402&MI_02
%ztewwan.DeviceDesc0157% = ztewwan.ndi, USB\VID_19D2&PID_0157&MI_05
%ztewwan.DeviceDesc0158% = ztewwan.ndi, USB\VID_19D2&PID_0158&MI_03
%ztewwan.DeviceDesc1401% = ztewwan.ndi, USB\VID_19D2&PID_1401&MI_02
%ztewwan.DeviceDesc0130% = ztewwan.ndi, USB\VID_19D2&PID_0130&MI_01
%ztewwan.DeviceDesc0133% = ztewwan.ndi, USB\VID_19D2&PID_0133&MI_03
%ztewwan.DeviceDesc0176% = ztewwan.ndi, USB\VID_19D2&PID_0176&MI_03
%ztewwan.DeviceDesc0178% = ztewwan.ndi, USB\VID_19D2&PID_0178&MI_03
%ztewwan.DeviceDesc0168% = ztewwan.ndi, USB\VID_19D2&PID_0168&MI_04
;EuFi890
%ztewwan.DeviceDesc0191% = ztewwan.ndi, USB\VID_19D2&PID_0191&MI_04
;AL621
%ztewwan.DeviceDesc0167% = ztewwan.ndi, USB\VID_19D2&PID_0167&MI_04
;MF821
%ztewwan.DeviceDesc0199% = ztewwan.ndi, USB\VID_19D2&PID_0199&MI_01
%ztewwan.DeviceDesc0200% = ztewwan.ndi, USB\VID_19D2&PID_0200&MI_01
%ztewwan.DeviceDesc0257% = ztewwan.ndi, USB\VID_19D2&PID_0257&MI_03
;MF821V
%ztewwan.DeviceDesc1018% = ztewwan.ndi, USB\VID_19D2&PID_1018&MI_03
;MF91
%ztewwan.DeviceDesc1426% = ztewwan.ndi, USB\VID_19D2&PID_1426&MI_02
;0141
%ztewwan.DeviceDesc1247% = ztewwan.ndi, USB\VID_19D2&PID_1247&MI_04
%ztewwan.DeviceDesc1425% = ztewwan.ndi, USB\VID_19D2&PID_1425&MI_02
%ztewwan.DeviceDesc1424% = ztewwan.ndi, USB\VID_19D2&PID_1424&MI_02
%ztewwan.DeviceDesc1252% = ztewwan.ndi, USB\VID_19D2&PID_1252&MI_04
%ztewwan.DeviceDesc1254% = ztewwan.ndi, USB\VID_19D2&PID_1254&MI_04
%ztewwan.DeviceDesc1255A% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_03
%ztewwan.DeviceDesc1255B% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_04
%ztewwan.DeviceDesc1256% = ztewwan.ndi, USB\VID_19D2&PID_1256&MI_04
%ztewwan.DeviceDesc1245% = ztewwanCombB.ndi, USB\VID_19D2&PID_1245&MI_04
%ztewwan.DeviceDesc1021% = ztewwan.ndi, USB\VID_19D2&PID_1021&MI_02
Adding the ones we were missing.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-10-18 13:11:29 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0002, 1)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0012, 1)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0017, 3)},
|
2013-06-29 21:39:19 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0019, 3)}, /* ONDA MT689DC */
|
net: qmi_wwan: adding more ZTE devices
Analyzed a few Windows driver description files, supporting
this long list of devices:
%ztewwan.DeviceDesc0002% = ztewwan.ndi, USB\VID_19D2&PID_0002&MI_01
%ztewwan.DeviceDesc0012% = ztewwan.ndi, USB\VID_19D2&PID_0012&MI_01
%ztewwan.DeviceDesc0017% = ztewwan.ndi, USB\VID_19D2&PID_0017&MI_03
%ztewwan.DeviceDesc0021% = ztewwan.ndi, USB\VID_19D2&PID_0021&MI_04
%ztewwan.DeviceDesc0025% = ztewwan.ndi, USB\VID_19D2&PID_0025&MI_01
%ztewwan.DeviceDesc0031% = ztewwan.ndi, USB\VID_19D2&PID_0031&MI_04
%ztewwan.DeviceDesc0042% = ztewwan.ndi, USB\VID_19D2&PID_0042&MI_04
%ztewwan.DeviceDesc0049% = ztewwan.ndi, USB\VID_19D2&PID_0049&MI_05
%ztewwan.DeviceDesc0052% = ztewwan.ndi, USB\VID_19D2&PID_0052&MI_04
%ztewwan.DeviceDesc0055% = ztewwan.ndi, USB\VID_19D2&PID_0055&MI_01
%ztewwan.DeviceDesc0058% = ztewwan.ndi, USB\VID_19D2&PID_0058&MI_04
%ztewwan.DeviceDesc0063% = ztewwan.ndi, USB\VID_19D2&PID_0063&MI_04
%ztewwan.DeviceDesc2002% = ztewwan.ndi, USB\VID_19D2&PID_2002&MI_04
%ztewwan.DeviceDesc0104% = ztewwan.ndi, USB\VID_19D2&PID_0104&MI_04
%ztewwan.DeviceDesc0113% = ztewwan.ndi, USB\VID_19D2&PID_0113&MI_05
%ztewwan.DeviceDesc0118% = ztewwan.ndi, USB\VID_19D2&PID_0118&MI_05
%ztewwan.DeviceDesc0121% = ztewwan.ndi, USB\VID_19D2&PID_0121&MI_05
%ztewwan.DeviceDesc0123% = ztewwan.ndi, USB\VID_19D2&PID_0123&MI_04
%ztewwan.DeviceDesc0124% = ztewwan.ndi, USB\VID_19D2&PID_0124&MI_05
%ztewwan.DeviceDesc0125% = ztewwan.ndi, USB\VID_19D2&PID_0125&MI_06
%ztewwan.DeviceDesc0126% = ztewwan.ndi, USB\VID_19D2&PID_0126&MI_05
%ztewwan.DeviceDesc1008% = ztewwan.ndi, USB\VID_19D2&PID_1008&MI_04
%ztewwan.DeviceDesc1010% = ztewwan.ndi, USB\VID_19D2&PID_1010&MI_04
%ztewwan.DeviceDesc1012% = ztewwan.ndi, USB\VID_19D2&PID_1012&MI_04
%ztewwan.DeviceDesc1402% = ztewwan.ndi, USB\VID_19D2&PID_1402&MI_02
%ztewwan.DeviceDesc0157% = ztewwan.ndi, USB\VID_19D2&PID_0157&MI_05
%ztewwan.DeviceDesc0158% = ztewwan.ndi, USB\VID_19D2&PID_0158&MI_03
%ztewwan.DeviceDesc1401% = ztewwan.ndi, USB\VID_19D2&PID_1401&MI_02
%ztewwan.DeviceDesc0130% = ztewwan.ndi, USB\VID_19D2&PID_0130&MI_01
%ztewwan.DeviceDesc0133% = ztewwan.ndi, USB\VID_19D2&PID_0133&MI_03
%ztewwan.DeviceDesc0176% = ztewwan.ndi, USB\VID_19D2&PID_0176&MI_03
%ztewwan.DeviceDesc0178% = ztewwan.ndi, USB\VID_19D2&PID_0178&MI_03
%ztewwan.DeviceDesc0168% = ztewwan.ndi, USB\VID_19D2&PID_0168&MI_04
;EuFi890
%ztewwan.DeviceDesc0191% = ztewwan.ndi, USB\VID_19D2&PID_0191&MI_04
;AL621
%ztewwan.DeviceDesc0167% = ztewwan.ndi, USB\VID_19D2&PID_0167&MI_04
;MF821
%ztewwan.DeviceDesc0199% = ztewwan.ndi, USB\VID_19D2&PID_0199&MI_01
%ztewwan.DeviceDesc0200% = ztewwan.ndi, USB\VID_19D2&PID_0200&MI_01
%ztewwan.DeviceDesc0257% = ztewwan.ndi, USB\VID_19D2&PID_0257&MI_03
;MF821V
%ztewwan.DeviceDesc1018% = ztewwan.ndi, USB\VID_19D2&PID_1018&MI_03
;MF91
%ztewwan.DeviceDesc1426% = ztewwan.ndi, USB\VID_19D2&PID_1426&MI_02
;0141
%ztewwan.DeviceDesc1247% = ztewwan.ndi, USB\VID_19D2&PID_1247&MI_04
%ztewwan.DeviceDesc1425% = ztewwan.ndi, USB\VID_19D2&PID_1425&MI_02
%ztewwan.DeviceDesc1424% = ztewwan.ndi, USB\VID_19D2&PID_1424&MI_02
%ztewwan.DeviceDesc1252% = ztewwan.ndi, USB\VID_19D2&PID_1252&MI_04
%ztewwan.DeviceDesc1254% = ztewwan.ndi, USB\VID_19D2&PID_1254&MI_04
%ztewwan.DeviceDesc1255A% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_03
%ztewwan.DeviceDesc1255B% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_04
%ztewwan.DeviceDesc1256% = ztewwan.ndi, USB\VID_19D2&PID_1256&MI_04
%ztewwan.DeviceDesc1245% = ztewwanCombB.ndi, USB\VID_19D2&PID_1245&MI_04
%ztewwan.DeviceDesc1021% = ztewwan.ndi, USB\VID_19D2&PID_1021&MI_02
Adding the ones we were missing.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-10-18 13:11:29 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0021, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0025, 1)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0031, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0042, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0049, 5)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0052, 4)},
|
2012-08-12 17:16:30 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0055, 1)}, /* ZTE (Vodafone) K3520-Z */
|
net: qmi_wwan: adding more ZTE devices
Analyzed a few Windows driver description files, supporting
this long list of devices:
%ztewwan.DeviceDesc0002% = ztewwan.ndi, USB\VID_19D2&PID_0002&MI_01
%ztewwan.DeviceDesc0012% = ztewwan.ndi, USB\VID_19D2&PID_0012&MI_01
%ztewwan.DeviceDesc0017% = ztewwan.ndi, USB\VID_19D2&PID_0017&MI_03
%ztewwan.DeviceDesc0021% = ztewwan.ndi, USB\VID_19D2&PID_0021&MI_04
%ztewwan.DeviceDesc0025% = ztewwan.ndi, USB\VID_19D2&PID_0025&MI_01
%ztewwan.DeviceDesc0031% = ztewwan.ndi, USB\VID_19D2&PID_0031&MI_04
%ztewwan.DeviceDesc0042% = ztewwan.ndi, USB\VID_19D2&PID_0042&MI_04
%ztewwan.DeviceDesc0049% = ztewwan.ndi, USB\VID_19D2&PID_0049&MI_05
%ztewwan.DeviceDesc0052% = ztewwan.ndi, USB\VID_19D2&PID_0052&MI_04
%ztewwan.DeviceDesc0055% = ztewwan.ndi, USB\VID_19D2&PID_0055&MI_01
%ztewwan.DeviceDesc0058% = ztewwan.ndi, USB\VID_19D2&PID_0058&MI_04
%ztewwan.DeviceDesc0063% = ztewwan.ndi, USB\VID_19D2&PID_0063&MI_04
%ztewwan.DeviceDesc2002% = ztewwan.ndi, USB\VID_19D2&PID_2002&MI_04
%ztewwan.DeviceDesc0104% = ztewwan.ndi, USB\VID_19D2&PID_0104&MI_04
%ztewwan.DeviceDesc0113% = ztewwan.ndi, USB\VID_19D2&PID_0113&MI_05
%ztewwan.DeviceDesc0118% = ztewwan.ndi, USB\VID_19D2&PID_0118&MI_05
%ztewwan.DeviceDesc0121% = ztewwan.ndi, USB\VID_19D2&PID_0121&MI_05
%ztewwan.DeviceDesc0123% = ztewwan.ndi, USB\VID_19D2&PID_0123&MI_04
%ztewwan.DeviceDesc0124% = ztewwan.ndi, USB\VID_19D2&PID_0124&MI_05
%ztewwan.DeviceDesc0125% = ztewwan.ndi, USB\VID_19D2&PID_0125&MI_06
%ztewwan.DeviceDesc0126% = ztewwan.ndi, USB\VID_19D2&PID_0126&MI_05
%ztewwan.DeviceDesc1008% = ztewwan.ndi, USB\VID_19D2&PID_1008&MI_04
%ztewwan.DeviceDesc1010% = ztewwan.ndi, USB\VID_19D2&PID_1010&MI_04
%ztewwan.DeviceDesc1012% = ztewwan.ndi, USB\VID_19D2&PID_1012&MI_04
%ztewwan.DeviceDesc1402% = ztewwan.ndi, USB\VID_19D2&PID_1402&MI_02
%ztewwan.DeviceDesc0157% = ztewwan.ndi, USB\VID_19D2&PID_0157&MI_05
%ztewwan.DeviceDesc0158% = ztewwan.ndi, USB\VID_19D2&PID_0158&MI_03
%ztewwan.DeviceDesc1401% = ztewwan.ndi, USB\VID_19D2&PID_1401&MI_02
%ztewwan.DeviceDesc0130% = ztewwan.ndi, USB\VID_19D2&PID_0130&MI_01
%ztewwan.DeviceDesc0133% = ztewwan.ndi, USB\VID_19D2&PID_0133&MI_03
%ztewwan.DeviceDesc0176% = ztewwan.ndi, USB\VID_19D2&PID_0176&MI_03
%ztewwan.DeviceDesc0178% = ztewwan.ndi, USB\VID_19D2&PID_0178&MI_03
%ztewwan.DeviceDesc0168% = ztewwan.ndi, USB\VID_19D2&PID_0168&MI_04
;EuFi890
%ztewwan.DeviceDesc0191% = ztewwan.ndi, USB\VID_19D2&PID_0191&MI_04
;AL621
%ztewwan.DeviceDesc0167% = ztewwan.ndi, USB\VID_19D2&PID_0167&MI_04
;MF821
%ztewwan.DeviceDesc0199% = ztewwan.ndi, USB\VID_19D2&PID_0199&MI_01
%ztewwan.DeviceDesc0200% = ztewwan.ndi, USB\VID_19D2&PID_0200&MI_01
%ztewwan.DeviceDesc0257% = ztewwan.ndi, USB\VID_19D2&PID_0257&MI_03
;MF821V
%ztewwan.DeviceDesc1018% = ztewwan.ndi, USB\VID_19D2&PID_1018&MI_03
;MF91
%ztewwan.DeviceDesc1426% = ztewwan.ndi, USB\VID_19D2&PID_1426&MI_02
;0141
%ztewwan.DeviceDesc1247% = ztewwan.ndi, USB\VID_19D2&PID_1247&MI_04
%ztewwan.DeviceDesc1425% = ztewwan.ndi, USB\VID_19D2&PID_1425&MI_02
%ztewwan.DeviceDesc1424% = ztewwan.ndi, USB\VID_19D2&PID_1424&MI_02
%ztewwan.DeviceDesc1252% = ztewwan.ndi, USB\VID_19D2&PID_1252&MI_04
%ztewwan.DeviceDesc1254% = ztewwan.ndi, USB\VID_19D2&PID_1254&MI_04
%ztewwan.DeviceDesc1255A% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_03
%ztewwan.DeviceDesc1255B% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_04
%ztewwan.DeviceDesc1256% = ztewwan.ndi, USB\VID_19D2&PID_1256&MI_04
%ztewwan.DeviceDesc1245% = ztewwanCombB.ndi, USB\VID_19D2&PID_1245&MI_04
%ztewwan.DeviceDesc1021% = ztewwan.ndi, USB\VID_19D2&PID_1021&MI_02
Adding the ones we were missing.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-10-18 13:11:29 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0058, 4)},
|
2012-08-12 17:16:30 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0063, 4)}, /* ZTE (Vodafone) K3565-Z */
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0104, 4)}, /* ZTE (Vodafone) K4505-Z */
|
net: qmi_wwan: adding more ZTE devices
Analyzed a few Windows driver description files, supporting
this long list of devices:
%ztewwan.DeviceDesc0002% = ztewwan.ndi, USB\VID_19D2&PID_0002&MI_01
%ztewwan.DeviceDesc0012% = ztewwan.ndi, USB\VID_19D2&PID_0012&MI_01
%ztewwan.DeviceDesc0017% = ztewwan.ndi, USB\VID_19D2&PID_0017&MI_03
%ztewwan.DeviceDesc0021% = ztewwan.ndi, USB\VID_19D2&PID_0021&MI_04
%ztewwan.DeviceDesc0025% = ztewwan.ndi, USB\VID_19D2&PID_0025&MI_01
%ztewwan.DeviceDesc0031% = ztewwan.ndi, USB\VID_19D2&PID_0031&MI_04
%ztewwan.DeviceDesc0042% = ztewwan.ndi, USB\VID_19D2&PID_0042&MI_04
%ztewwan.DeviceDesc0049% = ztewwan.ndi, USB\VID_19D2&PID_0049&MI_05
%ztewwan.DeviceDesc0052% = ztewwan.ndi, USB\VID_19D2&PID_0052&MI_04
%ztewwan.DeviceDesc0055% = ztewwan.ndi, USB\VID_19D2&PID_0055&MI_01
%ztewwan.DeviceDesc0058% = ztewwan.ndi, USB\VID_19D2&PID_0058&MI_04
%ztewwan.DeviceDesc0063% = ztewwan.ndi, USB\VID_19D2&PID_0063&MI_04
%ztewwan.DeviceDesc2002% = ztewwan.ndi, USB\VID_19D2&PID_2002&MI_04
%ztewwan.DeviceDesc0104% = ztewwan.ndi, USB\VID_19D2&PID_0104&MI_04
%ztewwan.DeviceDesc0113% = ztewwan.ndi, USB\VID_19D2&PID_0113&MI_05
%ztewwan.DeviceDesc0118% = ztewwan.ndi, USB\VID_19D2&PID_0118&MI_05
%ztewwan.DeviceDesc0121% = ztewwan.ndi, USB\VID_19D2&PID_0121&MI_05
%ztewwan.DeviceDesc0123% = ztewwan.ndi, USB\VID_19D2&PID_0123&MI_04
%ztewwan.DeviceDesc0124% = ztewwan.ndi, USB\VID_19D2&PID_0124&MI_05
%ztewwan.DeviceDesc0125% = ztewwan.ndi, USB\VID_19D2&PID_0125&MI_06
%ztewwan.DeviceDesc0126% = ztewwan.ndi, USB\VID_19D2&PID_0126&MI_05
%ztewwan.DeviceDesc1008% = ztewwan.ndi, USB\VID_19D2&PID_1008&MI_04
%ztewwan.DeviceDesc1010% = ztewwan.ndi, USB\VID_19D2&PID_1010&MI_04
%ztewwan.DeviceDesc1012% = ztewwan.ndi, USB\VID_19D2&PID_1012&MI_04
%ztewwan.DeviceDesc1402% = ztewwan.ndi, USB\VID_19D2&PID_1402&MI_02
%ztewwan.DeviceDesc0157% = ztewwan.ndi, USB\VID_19D2&PID_0157&MI_05
%ztewwan.DeviceDesc0158% = ztewwan.ndi, USB\VID_19D2&PID_0158&MI_03
%ztewwan.DeviceDesc1401% = ztewwan.ndi, USB\VID_19D2&PID_1401&MI_02
%ztewwan.DeviceDesc0130% = ztewwan.ndi, USB\VID_19D2&PID_0130&MI_01
%ztewwan.DeviceDesc0133% = ztewwan.ndi, USB\VID_19D2&PID_0133&MI_03
%ztewwan.DeviceDesc0176% = ztewwan.ndi, USB\VID_19D2&PID_0176&MI_03
%ztewwan.DeviceDesc0178% = ztewwan.ndi, USB\VID_19D2&PID_0178&MI_03
%ztewwan.DeviceDesc0168% = ztewwan.ndi, USB\VID_19D2&PID_0168&MI_04
;EuFi890
%ztewwan.DeviceDesc0191% = ztewwan.ndi, USB\VID_19D2&PID_0191&MI_04
;AL621
%ztewwan.DeviceDesc0167% = ztewwan.ndi, USB\VID_19D2&PID_0167&MI_04
;MF821
%ztewwan.DeviceDesc0199% = ztewwan.ndi, USB\VID_19D2&PID_0199&MI_01
%ztewwan.DeviceDesc0200% = ztewwan.ndi, USB\VID_19D2&PID_0200&MI_01
%ztewwan.DeviceDesc0257% = ztewwan.ndi, USB\VID_19D2&PID_0257&MI_03
;MF821V
%ztewwan.DeviceDesc1018% = ztewwan.ndi, USB\VID_19D2&PID_1018&MI_03
;MF91
%ztewwan.DeviceDesc1426% = ztewwan.ndi, USB\VID_19D2&PID_1426&MI_02
;0141
%ztewwan.DeviceDesc1247% = ztewwan.ndi, USB\VID_19D2&PID_1247&MI_04
%ztewwan.DeviceDesc1425% = ztewwan.ndi, USB\VID_19D2&PID_1425&MI_02
%ztewwan.DeviceDesc1424% = ztewwan.ndi, USB\VID_19D2&PID_1424&MI_02
%ztewwan.DeviceDesc1252% = ztewwan.ndi, USB\VID_19D2&PID_1252&MI_04
%ztewwan.DeviceDesc1254% = ztewwan.ndi, USB\VID_19D2&PID_1254&MI_04
%ztewwan.DeviceDesc1255A% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_03
%ztewwan.DeviceDesc1255B% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_04
%ztewwan.DeviceDesc1256% = ztewwan.ndi, USB\VID_19D2&PID_1256&MI_04
%ztewwan.DeviceDesc1245% = ztewwanCombB.ndi, USB\VID_19D2&PID_1245&MI_04
%ztewwan.DeviceDesc1021% = ztewwan.ndi, USB\VID_19D2&PID_1021&MI_02
Adding the ones we were missing.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-10-18 13:11:29 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0113, 5)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0118, 5)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0121, 5)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0123, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0124, 5)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0125, 6)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0126, 5)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0130, 1)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0133, 3)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0141, 5)},
|
2012-09-20 05:18:05 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0157, 5)}, /* ZTE MF683 */
|
net: qmi_wwan: adding more ZTE devices
Analyzed a few Windows driver description files, supporting
this long list of devices:
%ztewwan.DeviceDesc0002% = ztewwan.ndi, USB\VID_19D2&PID_0002&MI_01
%ztewwan.DeviceDesc0012% = ztewwan.ndi, USB\VID_19D2&PID_0012&MI_01
%ztewwan.DeviceDesc0017% = ztewwan.ndi, USB\VID_19D2&PID_0017&MI_03
%ztewwan.DeviceDesc0021% = ztewwan.ndi, USB\VID_19D2&PID_0021&MI_04
%ztewwan.DeviceDesc0025% = ztewwan.ndi, USB\VID_19D2&PID_0025&MI_01
%ztewwan.DeviceDesc0031% = ztewwan.ndi, USB\VID_19D2&PID_0031&MI_04
%ztewwan.DeviceDesc0042% = ztewwan.ndi, USB\VID_19D2&PID_0042&MI_04
%ztewwan.DeviceDesc0049% = ztewwan.ndi, USB\VID_19D2&PID_0049&MI_05
%ztewwan.DeviceDesc0052% = ztewwan.ndi, USB\VID_19D2&PID_0052&MI_04
%ztewwan.DeviceDesc0055% = ztewwan.ndi, USB\VID_19D2&PID_0055&MI_01
%ztewwan.DeviceDesc0058% = ztewwan.ndi, USB\VID_19D2&PID_0058&MI_04
%ztewwan.DeviceDesc0063% = ztewwan.ndi, USB\VID_19D2&PID_0063&MI_04
%ztewwan.DeviceDesc2002% = ztewwan.ndi, USB\VID_19D2&PID_2002&MI_04
%ztewwan.DeviceDesc0104% = ztewwan.ndi, USB\VID_19D2&PID_0104&MI_04
%ztewwan.DeviceDesc0113% = ztewwan.ndi, USB\VID_19D2&PID_0113&MI_05
%ztewwan.DeviceDesc0118% = ztewwan.ndi, USB\VID_19D2&PID_0118&MI_05
%ztewwan.DeviceDesc0121% = ztewwan.ndi, USB\VID_19D2&PID_0121&MI_05
%ztewwan.DeviceDesc0123% = ztewwan.ndi, USB\VID_19D2&PID_0123&MI_04
%ztewwan.DeviceDesc0124% = ztewwan.ndi, USB\VID_19D2&PID_0124&MI_05
%ztewwan.DeviceDesc0125% = ztewwan.ndi, USB\VID_19D2&PID_0125&MI_06
%ztewwan.DeviceDesc0126% = ztewwan.ndi, USB\VID_19D2&PID_0126&MI_05
%ztewwan.DeviceDesc1008% = ztewwan.ndi, USB\VID_19D2&PID_1008&MI_04
%ztewwan.DeviceDesc1010% = ztewwan.ndi, USB\VID_19D2&PID_1010&MI_04
%ztewwan.DeviceDesc1012% = ztewwan.ndi, USB\VID_19D2&PID_1012&MI_04
%ztewwan.DeviceDesc1402% = ztewwan.ndi, USB\VID_19D2&PID_1402&MI_02
%ztewwan.DeviceDesc0157% = ztewwan.ndi, USB\VID_19D2&PID_0157&MI_05
%ztewwan.DeviceDesc0158% = ztewwan.ndi, USB\VID_19D2&PID_0158&MI_03
%ztewwan.DeviceDesc1401% = ztewwan.ndi, USB\VID_19D2&PID_1401&MI_02
%ztewwan.DeviceDesc0130% = ztewwan.ndi, USB\VID_19D2&PID_0130&MI_01
%ztewwan.DeviceDesc0133% = ztewwan.ndi, USB\VID_19D2&PID_0133&MI_03
%ztewwan.DeviceDesc0176% = ztewwan.ndi, USB\VID_19D2&PID_0176&MI_03
%ztewwan.DeviceDesc0178% = ztewwan.ndi, USB\VID_19D2&PID_0178&MI_03
%ztewwan.DeviceDesc0168% = ztewwan.ndi, USB\VID_19D2&PID_0168&MI_04
;EuFi890
%ztewwan.DeviceDesc0191% = ztewwan.ndi, USB\VID_19D2&PID_0191&MI_04
;AL621
%ztewwan.DeviceDesc0167% = ztewwan.ndi, USB\VID_19D2&PID_0167&MI_04
;MF821
%ztewwan.DeviceDesc0199% = ztewwan.ndi, USB\VID_19D2&PID_0199&MI_01
%ztewwan.DeviceDesc0200% = ztewwan.ndi, USB\VID_19D2&PID_0200&MI_01
%ztewwan.DeviceDesc0257% = ztewwan.ndi, USB\VID_19D2&PID_0257&MI_03
;MF821V
%ztewwan.DeviceDesc1018% = ztewwan.ndi, USB\VID_19D2&PID_1018&MI_03
;MF91
%ztewwan.DeviceDesc1426% = ztewwan.ndi, USB\VID_19D2&PID_1426&MI_02
;0141
%ztewwan.DeviceDesc1247% = ztewwan.ndi, USB\VID_19D2&PID_1247&MI_04
%ztewwan.DeviceDesc1425% = ztewwan.ndi, USB\VID_19D2&PID_1425&MI_02
%ztewwan.DeviceDesc1424% = ztewwan.ndi, USB\VID_19D2&PID_1424&MI_02
%ztewwan.DeviceDesc1252% = ztewwan.ndi, USB\VID_19D2&PID_1252&MI_04
%ztewwan.DeviceDesc1254% = ztewwan.ndi, USB\VID_19D2&PID_1254&MI_04
%ztewwan.DeviceDesc1255A% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_03
%ztewwan.DeviceDesc1255B% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_04
%ztewwan.DeviceDesc1256% = ztewwan.ndi, USB\VID_19D2&PID_1256&MI_04
%ztewwan.DeviceDesc1245% = ztewwanCombB.ndi, USB\VID_19D2&PID_1245&MI_04
%ztewwan.DeviceDesc1021% = ztewwan.ndi, USB\VID_19D2&PID_1021&MI_02
Adding the ones we were missing.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-10-18 13:11:29 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0158, 3)},
|
2012-08-12 17:16:30 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0167, 4)}, /* ZTE MF820D */
|
net: qmi_wwan: adding more ZTE devices
Analyzed a few Windows driver description files, supporting
this long list of devices:
%ztewwan.DeviceDesc0002% = ztewwan.ndi, USB\VID_19D2&PID_0002&MI_01
%ztewwan.DeviceDesc0012% = ztewwan.ndi, USB\VID_19D2&PID_0012&MI_01
%ztewwan.DeviceDesc0017% = ztewwan.ndi, USB\VID_19D2&PID_0017&MI_03
%ztewwan.DeviceDesc0021% = ztewwan.ndi, USB\VID_19D2&PID_0021&MI_04
%ztewwan.DeviceDesc0025% = ztewwan.ndi, USB\VID_19D2&PID_0025&MI_01
%ztewwan.DeviceDesc0031% = ztewwan.ndi, USB\VID_19D2&PID_0031&MI_04
%ztewwan.DeviceDesc0042% = ztewwan.ndi, USB\VID_19D2&PID_0042&MI_04
%ztewwan.DeviceDesc0049% = ztewwan.ndi, USB\VID_19D2&PID_0049&MI_05
%ztewwan.DeviceDesc0052% = ztewwan.ndi, USB\VID_19D2&PID_0052&MI_04
%ztewwan.DeviceDesc0055% = ztewwan.ndi, USB\VID_19D2&PID_0055&MI_01
%ztewwan.DeviceDesc0058% = ztewwan.ndi, USB\VID_19D2&PID_0058&MI_04
%ztewwan.DeviceDesc0063% = ztewwan.ndi, USB\VID_19D2&PID_0063&MI_04
%ztewwan.DeviceDesc2002% = ztewwan.ndi, USB\VID_19D2&PID_2002&MI_04
%ztewwan.DeviceDesc0104% = ztewwan.ndi, USB\VID_19D2&PID_0104&MI_04
%ztewwan.DeviceDesc0113% = ztewwan.ndi, USB\VID_19D2&PID_0113&MI_05
%ztewwan.DeviceDesc0118% = ztewwan.ndi, USB\VID_19D2&PID_0118&MI_05
%ztewwan.DeviceDesc0121% = ztewwan.ndi, USB\VID_19D2&PID_0121&MI_05
%ztewwan.DeviceDesc0123% = ztewwan.ndi, USB\VID_19D2&PID_0123&MI_04
%ztewwan.DeviceDesc0124% = ztewwan.ndi, USB\VID_19D2&PID_0124&MI_05
%ztewwan.DeviceDesc0125% = ztewwan.ndi, USB\VID_19D2&PID_0125&MI_06
%ztewwan.DeviceDesc0126% = ztewwan.ndi, USB\VID_19D2&PID_0126&MI_05
%ztewwan.DeviceDesc1008% = ztewwan.ndi, USB\VID_19D2&PID_1008&MI_04
%ztewwan.DeviceDesc1010% = ztewwan.ndi, USB\VID_19D2&PID_1010&MI_04
%ztewwan.DeviceDesc1012% = ztewwan.ndi, USB\VID_19D2&PID_1012&MI_04
%ztewwan.DeviceDesc1402% = ztewwan.ndi, USB\VID_19D2&PID_1402&MI_02
%ztewwan.DeviceDesc0157% = ztewwan.ndi, USB\VID_19D2&PID_0157&MI_05
%ztewwan.DeviceDesc0158% = ztewwan.ndi, USB\VID_19D2&PID_0158&MI_03
%ztewwan.DeviceDesc1401% = ztewwan.ndi, USB\VID_19D2&PID_1401&MI_02
%ztewwan.DeviceDesc0130% = ztewwan.ndi, USB\VID_19D2&PID_0130&MI_01
%ztewwan.DeviceDesc0133% = ztewwan.ndi, USB\VID_19D2&PID_0133&MI_03
%ztewwan.DeviceDesc0176% = ztewwan.ndi, USB\VID_19D2&PID_0176&MI_03
%ztewwan.DeviceDesc0178% = ztewwan.ndi, USB\VID_19D2&PID_0178&MI_03
%ztewwan.DeviceDesc0168% = ztewwan.ndi, USB\VID_19D2&PID_0168&MI_04
;EuFi890
%ztewwan.DeviceDesc0191% = ztewwan.ndi, USB\VID_19D2&PID_0191&MI_04
;AL621
%ztewwan.DeviceDesc0167% = ztewwan.ndi, USB\VID_19D2&PID_0167&MI_04
;MF821
%ztewwan.DeviceDesc0199% = ztewwan.ndi, USB\VID_19D2&PID_0199&MI_01
%ztewwan.DeviceDesc0200% = ztewwan.ndi, USB\VID_19D2&PID_0200&MI_01
%ztewwan.DeviceDesc0257% = ztewwan.ndi, USB\VID_19D2&PID_0257&MI_03
;MF821V
%ztewwan.DeviceDesc1018% = ztewwan.ndi, USB\VID_19D2&PID_1018&MI_03
;MF91
%ztewwan.DeviceDesc1426% = ztewwan.ndi, USB\VID_19D2&PID_1426&MI_02
;0141
%ztewwan.DeviceDesc1247% = ztewwan.ndi, USB\VID_19D2&PID_1247&MI_04
%ztewwan.DeviceDesc1425% = ztewwan.ndi, USB\VID_19D2&PID_1425&MI_02
%ztewwan.DeviceDesc1424% = ztewwan.ndi, USB\VID_19D2&PID_1424&MI_02
%ztewwan.DeviceDesc1252% = ztewwan.ndi, USB\VID_19D2&PID_1252&MI_04
%ztewwan.DeviceDesc1254% = ztewwan.ndi, USB\VID_19D2&PID_1254&MI_04
%ztewwan.DeviceDesc1255A% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_03
%ztewwan.DeviceDesc1255B% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_04
%ztewwan.DeviceDesc1256% = ztewwan.ndi, USB\VID_19D2&PID_1256&MI_04
%ztewwan.DeviceDesc1245% = ztewwanCombB.ndi, USB\VID_19D2&PID_1245&MI_04
%ztewwan.DeviceDesc1021% = ztewwan.ndi, USB\VID_19D2&PID_1021&MI_02
Adding the ones we were missing.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-10-18 13:11:29 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0168, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0176, 3)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0178, 3)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0191, 4)}, /* ZTE EuFi890 */
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0199, 1)}, /* ZTE MF820S */
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0200, 1)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0257, 3)}, /* ZTE MF821 */
|
2013-01-18 12:26:34 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0265, 4)}, /* ONDA MT8205 4G LTE */
|
2012-12-19 12:15:51 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0284, 4)}, /* ZTE MF880 */
|
2012-08-12 17:16:30 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */
|
2013-05-03 07:05:13 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x0412, 4)}, /* Telewell TW-LTE 4G */
|
2012-08-12 17:16:30 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1010, 4)}, /* ZTE (Vodafone) K3571-Z */
|
net: qmi_wwan: adding more ZTE devices
Analyzed a few Windows driver description files, supporting
this long list of devices:
%ztewwan.DeviceDesc0002% = ztewwan.ndi, USB\VID_19D2&PID_0002&MI_01
%ztewwan.DeviceDesc0012% = ztewwan.ndi, USB\VID_19D2&PID_0012&MI_01
%ztewwan.DeviceDesc0017% = ztewwan.ndi, USB\VID_19D2&PID_0017&MI_03
%ztewwan.DeviceDesc0021% = ztewwan.ndi, USB\VID_19D2&PID_0021&MI_04
%ztewwan.DeviceDesc0025% = ztewwan.ndi, USB\VID_19D2&PID_0025&MI_01
%ztewwan.DeviceDesc0031% = ztewwan.ndi, USB\VID_19D2&PID_0031&MI_04
%ztewwan.DeviceDesc0042% = ztewwan.ndi, USB\VID_19D2&PID_0042&MI_04
%ztewwan.DeviceDesc0049% = ztewwan.ndi, USB\VID_19D2&PID_0049&MI_05
%ztewwan.DeviceDesc0052% = ztewwan.ndi, USB\VID_19D2&PID_0052&MI_04
%ztewwan.DeviceDesc0055% = ztewwan.ndi, USB\VID_19D2&PID_0055&MI_01
%ztewwan.DeviceDesc0058% = ztewwan.ndi, USB\VID_19D2&PID_0058&MI_04
%ztewwan.DeviceDesc0063% = ztewwan.ndi, USB\VID_19D2&PID_0063&MI_04
%ztewwan.DeviceDesc2002% = ztewwan.ndi, USB\VID_19D2&PID_2002&MI_04
%ztewwan.DeviceDesc0104% = ztewwan.ndi, USB\VID_19D2&PID_0104&MI_04
%ztewwan.DeviceDesc0113% = ztewwan.ndi, USB\VID_19D2&PID_0113&MI_05
%ztewwan.DeviceDesc0118% = ztewwan.ndi, USB\VID_19D2&PID_0118&MI_05
%ztewwan.DeviceDesc0121% = ztewwan.ndi, USB\VID_19D2&PID_0121&MI_05
%ztewwan.DeviceDesc0123% = ztewwan.ndi, USB\VID_19D2&PID_0123&MI_04
%ztewwan.DeviceDesc0124% = ztewwan.ndi, USB\VID_19D2&PID_0124&MI_05
%ztewwan.DeviceDesc0125% = ztewwan.ndi, USB\VID_19D2&PID_0125&MI_06
%ztewwan.DeviceDesc0126% = ztewwan.ndi, USB\VID_19D2&PID_0126&MI_05
%ztewwan.DeviceDesc1008% = ztewwan.ndi, USB\VID_19D2&PID_1008&MI_04
%ztewwan.DeviceDesc1010% = ztewwan.ndi, USB\VID_19D2&PID_1010&MI_04
%ztewwan.DeviceDesc1012% = ztewwan.ndi, USB\VID_19D2&PID_1012&MI_04
%ztewwan.DeviceDesc1402% = ztewwan.ndi, USB\VID_19D2&PID_1402&MI_02
%ztewwan.DeviceDesc0157% = ztewwan.ndi, USB\VID_19D2&PID_0157&MI_05
%ztewwan.DeviceDesc0158% = ztewwan.ndi, USB\VID_19D2&PID_0158&MI_03
%ztewwan.DeviceDesc1401% = ztewwan.ndi, USB\VID_19D2&PID_1401&MI_02
%ztewwan.DeviceDesc0130% = ztewwan.ndi, USB\VID_19D2&PID_0130&MI_01
%ztewwan.DeviceDesc0133% = ztewwan.ndi, USB\VID_19D2&PID_0133&MI_03
%ztewwan.DeviceDesc0176% = ztewwan.ndi, USB\VID_19D2&PID_0176&MI_03
%ztewwan.DeviceDesc0178% = ztewwan.ndi, USB\VID_19D2&PID_0178&MI_03
%ztewwan.DeviceDesc0168% = ztewwan.ndi, USB\VID_19D2&PID_0168&MI_04
;EuFi890
%ztewwan.DeviceDesc0191% = ztewwan.ndi, USB\VID_19D2&PID_0191&MI_04
;AL621
%ztewwan.DeviceDesc0167% = ztewwan.ndi, USB\VID_19D2&PID_0167&MI_04
;MF821
%ztewwan.DeviceDesc0199% = ztewwan.ndi, USB\VID_19D2&PID_0199&MI_01
%ztewwan.DeviceDesc0200% = ztewwan.ndi, USB\VID_19D2&PID_0200&MI_01
%ztewwan.DeviceDesc0257% = ztewwan.ndi, USB\VID_19D2&PID_0257&MI_03
;MF821V
%ztewwan.DeviceDesc1018% = ztewwan.ndi, USB\VID_19D2&PID_1018&MI_03
;MF91
%ztewwan.DeviceDesc1426% = ztewwan.ndi, USB\VID_19D2&PID_1426&MI_02
;0141
%ztewwan.DeviceDesc1247% = ztewwan.ndi, USB\VID_19D2&PID_1247&MI_04
%ztewwan.DeviceDesc1425% = ztewwan.ndi, USB\VID_19D2&PID_1425&MI_02
%ztewwan.DeviceDesc1424% = ztewwan.ndi, USB\VID_19D2&PID_1424&MI_02
%ztewwan.DeviceDesc1252% = ztewwan.ndi, USB\VID_19D2&PID_1252&MI_04
%ztewwan.DeviceDesc1254% = ztewwan.ndi, USB\VID_19D2&PID_1254&MI_04
%ztewwan.DeviceDesc1255A% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_03
%ztewwan.DeviceDesc1255B% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_04
%ztewwan.DeviceDesc1256% = ztewwan.ndi, USB\VID_19D2&PID_1256&MI_04
%ztewwan.DeviceDesc1245% = ztewwanCombB.ndi, USB\VID_19D2&PID_1245&MI_04
%ztewwan.DeviceDesc1021% = ztewwan.ndi, USB\VID_19D2&PID_1021&MI_02
Adding the ones we were missing.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-10-18 13:11:29 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1012, 4)},
|
2012-08-15 11:42:57 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1018, 3)}, /* ZTE (Vodafone) K5006-Z */
|
net: qmi_wwan: adding more ZTE devices
Analyzed a few Windows driver description files, supporting
this long list of devices:
%ztewwan.DeviceDesc0002% = ztewwan.ndi, USB\VID_19D2&PID_0002&MI_01
%ztewwan.DeviceDesc0012% = ztewwan.ndi, USB\VID_19D2&PID_0012&MI_01
%ztewwan.DeviceDesc0017% = ztewwan.ndi, USB\VID_19D2&PID_0017&MI_03
%ztewwan.DeviceDesc0021% = ztewwan.ndi, USB\VID_19D2&PID_0021&MI_04
%ztewwan.DeviceDesc0025% = ztewwan.ndi, USB\VID_19D2&PID_0025&MI_01
%ztewwan.DeviceDesc0031% = ztewwan.ndi, USB\VID_19D2&PID_0031&MI_04
%ztewwan.DeviceDesc0042% = ztewwan.ndi, USB\VID_19D2&PID_0042&MI_04
%ztewwan.DeviceDesc0049% = ztewwan.ndi, USB\VID_19D2&PID_0049&MI_05
%ztewwan.DeviceDesc0052% = ztewwan.ndi, USB\VID_19D2&PID_0052&MI_04
%ztewwan.DeviceDesc0055% = ztewwan.ndi, USB\VID_19D2&PID_0055&MI_01
%ztewwan.DeviceDesc0058% = ztewwan.ndi, USB\VID_19D2&PID_0058&MI_04
%ztewwan.DeviceDesc0063% = ztewwan.ndi, USB\VID_19D2&PID_0063&MI_04
%ztewwan.DeviceDesc2002% = ztewwan.ndi, USB\VID_19D2&PID_2002&MI_04
%ztewwan.DeviceDesc0104% = ztewwan.ndi, USB\VID_19D2&PID_0104&MI_04
%ztewwan.DeviceDesc0113% = ztewwan.ndi, USB\VID_19D2&PID_0113&MI_05
%ztewwan.DeviceDesc0118% = ztewwan.ndi, USB\VID_19D2&PID_0118&MI_05
%ztewwan.DeviceDesc0121% = ztewwan.ndi, USB\VID_19D2&PID_0121&MI_05
%ztewwan.DeviceDesc0123% = ztewwan.ndi, USB\VID_19D2&PID_0123&MI_04
%ztewwan.DeviceDesc0124% = ztewwan.ndi, USB\VID_19D2&PID_0124&MI_05
%ztewwan.DeviceDesc0125% = ztewwan.ndi, USB\VID_19D2&PID_0125&MI_06
%ztewwan.DeviceDesc0126% = ztewwan.ndi, USB\VID_19D2&PID_0126&MI_05
%ztewwan.DeviceDesc1008% = ztewwan.ndi, USB\VID_19D2&PID_1008&MI_04
%ztewwan.DeviceDesc1010% = ztewwan.ndi, USB\VID_19D2&PID_1010&MI_04
%ztewwan.DeviceDesc1012% = ztewwan.ndi, USB\VID_19D2&PID_1012&MI_04
%ztewwan.DeviceDesc1402% = ztewwan.ndi, USB\VID_19D2&PID_1402&MI_02
%ztewwan.DeviceDesc0157% = ztewwan.ndi, USB\VID_19D2&PID_0157&MI_05
%ztewwan.DeviceDesc0158% = ztewwan.ndi, USB\VID_19D2&PID_0158&MI_03
%ztewwan.DeviceDesc1401% = ztewwan.ndi, USB\VID_19D2&PID_1401&MI_02
%ztewwan.DeviceDesc0130% = ztewwan.ndi, USB\VID_19D2&PID_0130&MI_01
%ztewwan.DeviceDesc0133% = ztewwan.ndi, USB\VID_19D2&PID_0133&MI_03
%ztewwan.DeviceDesc0176% = ztewwan.ndi, USB\VID_19D2&PID_0176&MI_03
%ztewwan.DeviceDesc0178% = ztewwan.ndi, USB\VID_19D2&PID_0178&MI_03
%ztewwan.DeviceDesc0168% = ztewwan.ndi, USB\VID_19D2&PID_0168&MI_04
;EuFi890
%ztewwan.DeviceDesc0191% = ztewwan.ndi, USB\VID_19D2&PID_0191&MI_04
;AL621
%ztewwan.DeviceDesc0167% = ztewwan.ndi, USB\VID_19D2&PID_0167&MI_04
;MF821
%ztewwan.DeviceDesc0199% = ztewwan.ndi, USB\VID_19D2&PID_0199&MI_01
%ztewwan.DeviceDesc0200% = ztewwan.ndi, USB\VID_19D2&PID_0200&MI_01
%ztewwan.DeviceDesc0257% = ztewwan.ndi, USB\VID_19D2&PID_0257&MI_03
;MF821V
%ztewwan.DeviceDesc1018% = ztewwan.ndi, USB\VID_19D2&PID_1018&MI_03
;MF91
%ztewwan.DeviceDesc1426% = ztewwan.ndi, USB\VID_19D2&PID_1426&MI_02
;0141
%ztewwan.DeviceDesc1247% = ztewwan.ndi, USB\VID_19D2&PID_1247&MI_04
%ztewwan.DeviceDesc1425% = ztewwan.ndi, USB\VID_19D2&PID_1425&MI_02
%ztewwan.DeviceDesc1424% = ztewwan.ndi, USB\VID_19D2&PID_1424&MI_02
%ztewwan.DeviceDesc1252% = ztewwan.ndi, USB\VID_19D2&PID_1252&MI_04
%ztewwan.DeviceDesc1254% = ztewwan.ndi, USB\VID_19D2&PID_1254&MI_04
%ztewwan.DeviceDesc1255A% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_03
%ztewwan.DeviceDesc1255B% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_04
%ztewwan.DeviceDesc1256% = ztewwan.ndi, USB\VID_19D2&PID_1256&MI_04
%ztewwan.DeviceDesc1245% = ztewwanCombB.ndi, USB\VID_19D2&PID_1245&MI_04
%ztewwan.DeviceDesc1021% = ztewwan.ndi, USB\VID_19D2&PID_1021&MI_02
Adding the ones we were missing.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-10-18 13:11:29 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1021, 2)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1245, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1247, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1252, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1254, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1255, 3)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1255, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1256, 4)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1401, 2)},
|
2012-08-12 17:16:30 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1402, 2)}, /* ZTE MF60 */
|
net: qmi_wwan: adding more ZTE devices
Analyzed a few Windows driver description files, supporting
this long list of devices:
%ztewwan.DeviceDesc0002% = ztewwan.ndi, USB\VID_19D2&PID_0002&MI_01
%ztewwan.DeviceDesc0012% = ztewwan.ndi, USB\VID_19D2&PID_0012&MI_01
%ztewwan.DeviceDesc0017% = ztewwan.ndi, USB\VID_19D2&PID_0017&MI_03
%ztewwan.DeviceDesc0021% = ztewwan.ndi, USB\VID_19D2&PID_0021&MI_04
%ztewwan.DeviceDesc0025% = ztewwan.ndi, USB\VID_19D2&PID_0025&MI_01
%ztewwan.DeviceDesc0031% = ztewwan.ndi, USB\VID_19D2&PID_0031&MI_04
%ztewwan.DeviceDesc0042% = ztewwan.ndi, USB\VID_19D2&PID_0042&MI_04
%ztewwan.DeviceDesc0049% = ztewwan.ndi, USB\VID_19D2&PID_0049&MI_05
%ztewwan.DeviceDesc0052% = ztewwan.ndi, USB\VID_19D2&PID_0052&MI_04
%ztewwan.DeviceDesc0055% = ztewwan.ndi, USB\VID_19D2&PID_0055&MI_01
%ztewwan.DeviceDesc0058% = ztewwan.ndi, USB\VID_19D2&PID_0058&MI_04
%ztewwan.DeviceDesc0063% = ztewwan.ndi, USB\VID_19D2&PID_0063&MI_04
%ztewwan.DeviceDesc2002% = ztewwan.ndi, USB\VID_19D2&PID_2002&MI_04
%ztewwan.DeviceDesc0104% = ztewwan.ndi, USB\VID_19D2&PID_0104&MI_04
%ztewwan.DeviceDesc0113% = ztewwan.ndi, USB\VID_19D2&PID_0113&MI_05
%ztewwan.DeviceDesc0118% = ztewwan.ndi, USB\VID_19D2&PID_0118&MI_05
%ztewwan.DeviceDesc0121% = ztewwan.ndi, USB\VID_19D2&PID_0121&MI_05
%ztewwan.DeviceDesc0123% = ztewwan.ndi, USB\VID_19D2&PID_0123&MI_04
%ztewwan.DeviceDesc0124% = ztewwan.ndi, USB\VID_19D2&PID_0124&MI_05
%ztewwan.DeviceDesc0125% = ztewwan.ndi, USB\VID_19D2&PID_0125&MI_06
%ztewwan.DeviceDesc0126% = ztewwan.ndi, USB\VID_19D2&PID_0126&MI_05
%ztewwan.DeviceDesc1008% = ztewwan.ndi, USB\VID_19D2&PID_1008&MI_04
%ztewwan.DeviceDesc1010% = ztewwan.ndi, USB\VID_19D2&PID_1010&MI_04
%ztewwan.DeviceDesc1012% = ztewwan.ndi, USB\VID_19D2&PID_1012&MI_04
%ztewwan.DeviceDesc1402% = ztewwan.ndi, USB\VID_19D2&PID_1402&MI_02
%ztewwan.DeviceDesc0157% = ztewwan.ndi, USB\VID_19D2&PID_0157&MI_05
%ztewwan.DeviceDesc0158% = ztewwan.ndi, USB\VID_19D2&PID_0158&MI_03
%ztewwan.DeviceDesc1401% = ztewwan.ndi, USB\VID_19D2&PID_1401&MI_02
%ztewwan.DeviceDesc0130% = ztewwan.ndi, USB\VID_19D2&PID_0130&MI_01
%ztewwan.DeviceDesc0133% = ztewwan.ndi, USB\VID_19D2&PID_0133&MI_03
%ztewwan.DeviceDesc0176% = ztewwan.ndi, USB\VID_19D2&PID_0176&MI_03
%ztewwan.DeviceDesc0178% = ztewwan.ndi, USB\VID_19D2&PID_0178&MI_03
%ztewwan.DeviceDesc0168% = ztewwan.ndi, USB\VID_19D2&PID_0168&MI_04
;EuFi890
%ztewwan.DeviceDesc0191% = ztewwan.ndi, USB\VID_19D2&PID_0191&MI_04
;AL621
%ztewwan.DeviceDesc0167% = ztewwan.ndi, USB\VID_19D2&PID_0167&MI_04
;MF821
%ztewwan.DeviceDesc0199% = ztewwan.ndi, USB\VID_19D2&PID_0199&MI_01
%ztewwan.DeviceDesc0200% = ztewwan.ndi, USB\VID_19D2&PID_0200&MI_01
%ztewwan.DeviceDesc0257% = ztewwan.ndi, USB\VID_19D2&PID_0257&MI_03
;MF821V
%ztewwan.DeviceDesc1018% = ztewwan.ndi, USB\VID_19D2&PID_1018&MI_03
;MF91
%ztewwan.DeviceDesc1426% = ztewwan.ndi, USB\VID_19D2&PID_1426&MI_02
;0141
%ztewwan.DeviceDesc1247% = ztewwan.ndi, USB\VID_19D2&PID_1247&MI_04
%ztewwan.DeviceDesc1425% = ztewwan.ndi, USB\VID_19D2&PID_1425&MI_02
%ztewwan.DeviceDesc1424% = ztewwan.ndi, USB\VID_19D2&PID_1424&MI_02
%ztewwan.DeviceDesc1252% = ztewwan.ndi, USB\VID_19D2&PID_1252&MI_04
%ztewwan.DeviceDesc1254% = ztewwan.ndi, USB\VID_19D2&PID_1254&MI_04
%ztewwan.DeviceDesc1255A% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_03
%ztewwan.DeviceDesc1255B% = ztewwan.ndi, USB\VID_19D2&PID_1255&MI_04
%ztewwan.DeviceDesc1256% = ztewwan.ndi, USB\VID_19D2&PID_1256&MI_04
%ztewwan.DeviceDesc1245% = ztewwanCombB.ndi, USB\VID_19D2&PID_1245&MI_04
%ztewwan.DeviceDesc1021% = ztewwan.ndi, USB\VID_19D2&PID_1021&MI_02
Adding the ones we were missing.
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-10-18 13:11:29 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1424, 2)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1425, 2)},
|
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x1426, 2)}, /* ZTE MF91 */
|
2012-08-12 17:16:30 +08:00
|
|
|
{QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */
|
2012-08-12 17:16:31 +08:00
|
|
|
{QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */
|
|
|
|
{QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */
|
2012-08-12 17:16:30 +08:00
|
|
|
{QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */
|
|
|
|
{QMI_FIXED_INTF(0x1199, 0x68a2, 19)}, /* Sierra Wireless MC7710 in QMI mode */
|
2012-08-12 17:16:31 +08:00
|
|
|
{QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */
|
2012-12-28 14:30:55 +08:00
|
|
|
{QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */
|
2013-01-15 07:19:50 +08:00
|
|
|
{QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
|
2013-06-28 23:17:51 +08:00
|
|
|
{QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */
|
2013-01-30 10:47:06 +08:00
|
|
|
{QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
|
2013-05-21 10:07:17 +08:00
|
|
|
{QMI_FIXED_INTF(0x1e2d, 0x12d1, 4)}, /* Cinterion PLxx */
|
2012-08-12 17:16:30 +08:00
|
|
|
|
|
|
|
/* 4. Gobi 1000 devices */
|
2012-06-21 10:45:58 +08:00
|
|
|
{QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */
|
2013-06-21 05:10:59 +08:00
|
|
|
{QMI_GOBI1K_DEVICE(0x1410, 0xa001)}, /* Novatel/Verizon USB-1000 */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x1410, 0xa002)}, /* Novatel Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x1410, 0xa003)}, /* Novatel Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x1410, 0xa004)}, /* Novatel Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x1410, 0xa005)}, /* Novatel Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x1410, 0xa006)}, /* Novatel Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x1410, 0xa007)}, /* Novatel Gobi Modem device */
|
2012-06-21 10:45:58 +08:00
|
|
|
{QMI_GOBI1K_DEVICE(0x0b05, 0x1776)}, /* Asus Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x19d2, 0xfff3)}, /* ONDA Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x05c6, 0x9001)}, /* Generic Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x05c6, 0x9002)}, /* Generic Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x05c6, 0x9202)}, /* Generic Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */
|
|
|
|
{QMI_GOBI1K_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */
|
|
|
|
|
2012-08-12 17:16:30 +08:00
|
|
|
/* 5. Gobi 2000 and 3000 devices */
|
2012-03-09 19:35:06 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */
|
2012-09-01 11:47:26 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */
|
2012-03-09 19:35:06 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x05c6, 0x920b)}, /* Generic Gobi 2000 Modem device */
|
2012-09-01 11:47:26 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x05c6, 0x920d)}, /* Gobi 3000 Composite */
|
2012-03-09 19:35:06 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x05c6, 0x9225)}, /* Sony Gobi 2000 Modem device (N0279, VU730) */
|
|
|
|
{QMI_GOBI_DEVICE(0x05c6, 0x9245)}, /* Samsung Gobi 2000 Modem device (VL176) */
|
|
|
|
{QMI_GOBI_DEVICE(0x03f0, 0x251d)}, /* HP Gobi 2000 Modem device (VP412) */
|
|
|
|
{QMI_GOBI_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */
|
|
|
|
{QMI_GOBI_DEVICE(0x05c6, 0x9265)}, /* Asus Gobi 2000 Modem device (VR305) */
|
|
|
|
{QMI_GOBI_DEVICE(0x05c6, 0x9235)}, /* Top Global Gobi 2000 Modem device (VR306) */
|
|
|
|
{QMI_GOBI_DEVICE(0x05c6, 0x9275)}, /* iRex Technologies Gobi 2000 Modem device (VR307) */
|
2013-06-28 23:17:50 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x0af0, 0x8120)}, /* Option GTM681W */
|
2012-08-12 17:16:31 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x68a5)}, /* Sierra Wireless Modem */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x68a9)}, /* Sierra Wireless Modem */
|
2012-03-09 19:35:06 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9001)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9002)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9003)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9004)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9005)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9006)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9007)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9008)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9009)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x900a)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9011)}, /* Sierra Wireless Gobi 2000 Modem device (MC8305) */
|
|
|
|
{QMI_GOBI_DEVICE(0x16d8, 0x8002)}, /* CMDTech Gobi 2000 Modem device (VU922) */
|
|
|
|
{QMI_GOBI_DEVICE(0x05c6, 0x9205)}, /* Gobi 2000 Modem device */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9013)}, /* Sierra Wireless Gobi 3000 Modem device (MC8355) */
|
2012-09-10 15:02:59 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */
|
2012-05-24 07:19:32 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9015)}, /* Sierra Wireless Gobi 3000 Modem device */
|
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x9019)}, /* Sierra Wireless Gobi 3000 Modem device */
|
2012-08-12 17:16:31 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x1199, 0x901b)}, /* Sierra Wireless MC7770 */
|
2012-09-01 11:47:26 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x12d1, 0x14f1)}, /* Sony Gobi 3000 Composite */
|
2012-08-28 10:30:32 +08:00
|
|
|
{QMI_GOBI_DEVICE(0x1410, 0xa021)}, /* Foxconn Gobi 3000 Modem device (Novatel E396) */
|
2012-08-12 17:16:31 +08:00
|
|
|
|
2012-03-09 19:35:06 +08:00
|
|
|
{ } /* END */
|
2012-01-19 23:37:22 +08:00
|
|
|
};
|
|
|
|
MODULE_DEVICE_TABLE(usb, products);
|
|
|
|
|
2012-07-17 19:14:32 +08:00
|
|
|
static int qmi_wwan_probe(struct usb_interface *intf, const struct usb_device_id *prod)
|
|
|
|
{
|
|
|
|
struct usb_device_id *id = (struct usb_device_id *)prod;
|
|
|
|
|
|
|
|
/* Workaround to enable dynamic IDs. This disables usbnet
|
|
|
|
* blacklisting functionality. Which, if required, can be
|
|
|
|
* reimplemented here by using a magic "blacklist" value
|
|
|
|
* instead of 0 in the static device id table
|
|
|
|
*/
|
|
|
|
if (!id->driver_info) {
|
|
|
|
dev_dbg(&intf->dev, "setting defaults for dynamic device id\n");
|
2012-09-07 15:36:07 +08:00
|
|
|
id->driver_info = (unsigned long)&qmi_wwan_info;
|
2012-07-17 19:14:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return usbnet_probe(intf, id);
|
|
|
|
}
|
|
|
|
|
2012-01-19 23:37:22 +08:00
|
|
|
static struct usb_driver qmi_wwan_driver = {
|
|
|
|
.name = "qmi_wwan",
|
|
|
|
.id_table = products,
|
2012-07-17 19:14:32 +08:00
|
|
|
.probe = qmi_wwan_probe,
|
2012-01-19 23:37:22 +08:00
|
|
|
.disconnect = usbnet_disconnect,
|
2012-03-09 19:35:05 +08:00
|
|
|
.suspend = qmi_wwan_suspend,
|
|
|
|
.resume = qmi_wwan_resume,
|
|
|
|
.reset_resume = qmi_wwan_resume,
|
2012-01-19 23:37:22 +08:00
|
|
|
.supports_autosuspend = 1,
|
2012-04-24 01:08:51 +08:00
|
|
|
.disable_hub_initiated_lpm = 1,
|
2012-01-19 23:37:22 +08:00
|
|
|
};
|
|
|
|
|
2012-06-19 08:42:03 +08:00
|
|
|
module_usb_driver(qmi_wwan_driver);
|
2012-01-19 23:37:22 +08:00
|
|
|
|
|
|
|
MODULE_AUTHOR("Bjørn Mork <bjorn@mork.no>");
|
|
|
|
MODULE_DESCRIPTION("Qualcomm MSM Interface (QMI) WWAN driver");
|
|
|
|
MODULE_LICENSE("GPL");
|