Skip to content

Commit 63ba395

Browse files
aleksander0mdavem330
authored andcommitted
rndis_host: support Novatel Verizon USB730L
Treat the ef/04/01 interface class/subclass/protocol combination used by the Novatel Verizon USB730L (1410:9030) as a possible RNDIS interface. T: Bus=01 Lev=02 Prnt=02 Port=01 Cnt=02 Dev#= 17 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 3 P: Vendor=1410 ProdID=9030 Rev=03.10 S: Manufacturer=Novatel Wireless S: Product=MiFi USB730L S: SerialNumber=0123456789ABCDEF C: #Ifs= 3 Cfg#= 1 Atr=80 MxPwr=500mA I: If#= 0 Alt= 0 #EPs= 1 Cls=ef(misc ) Sub=04 Prot=01 Driver=rndis_host I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=rndis_host I: If#= 2 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid Once the network interface is brought up, the user just needs to run a DHCP client to get IP address and routing setup. As a side note, other Novatel Verizon USB730L models with the same vid:pid end up exposing a standard ECM interface which doesn't require any other kernel update to make it work. Signed-off-by: Aleksander Morgado <aleksander@aleksander.es> Reviewed-by: Bjørn Mork <bjorn@mork.no> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent ce024f4 commit 63ba395

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

drivers/net/usb/cdc_ether.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,19 @@ static int is_wireless_rndis(struct usb_interface_descriptor *desc)
5454
desc->bInterfaceProtocol == 3);
5555
}
5656

57+
static int is_novatel_rndis(struct usb_interface_descriptor *desc)
58+
{
59+
return (desc->bInterfaceClass == USB_CLASS_MISC &&
60+
desc->bInterfaceSubClass == 4 &&
61+
desc->bInterfaceProtocol == 1);
62+
}
63+
5764
#else
5865

5966
#define is_rndis(desc) 0
6067
#define is_activesync(desc) 0
6168
#define is_wireless_rndis(desc) 0
69+
#define is_novatel_rndis(desc) 0
6270

6371
#endif
6472

@@ -150,7 +158,8 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
150158
*/
151159
rndis = (is_rndis(&intf->cur_altsetting->desc) ||
152160
is_activesync(&intf->cur_altsetting->desc) ||
153-
is_wireless_rndis(&intf->cur_altsetting->desc));
161+
is_wireless_rndis(&intf->cur_altsetting->desc) ||
162+
is_novatel_rndis(&intf->cur_altsetting->desc));
154163

155164
memset(info, 0, sizeof(*info));
156165
info->control = intf;

drivers/net/usb/rndis_host.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,10 @@ static const struct usb_device_id products [] = {
632632
/* RNDIS for tethering */
633633
USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
634634
.driver_info = (unsigned long) &rndis_info,
635+
}, {
636+
/* Novatel Verizon USB730L */
637+
USB_INTERFACE_INFO(USB_CLASS_MISC, 4, 1),
638+
.driver_info = (unsigned long) &rndis_info,
635639
},
636640
{ }, // END
637641
};

0 commit comments

Comments
 (0)