Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Aleksander Morgado and committed by
David S. Miller
63ba395c ce024f42

+14 -1
+10 -1
drivers/net/usb/cdc_ether.c
··· 54 54 desc->bInterfaceProtocol == 3); 55 55 } 56 56 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 + 57 64 #else 58 65 59 66 #define is_rndis(desc) 0 60 67 #define is_activesync(desc) 0 61 68 #define is_wireless_rndis(desc) 0 69 + #define is_novatel_rndis(desc) 0 62 70 63 71 #endif 64 72 ··· 158 150 */ 159 151 rndis = (is_rndis(&intf->cur_altsetting->desc) || 160 152 is_activesync(&intf->cur_altsetting->desc) || 161 - is_wireless_rndis(&intf->cur_altsetting->desc)); 153 + is_wireless_rndis(&intf->cur_altsetting->desc) || 154 + is_novatel_rndis(&intf->cur_altsetting->desc)); 162 155 163 156 memset(info, 0, sizeof(*info)); 164 157 info->control = intf;
+4
drivers/net/usb/rndis_host.c
··· 632 632 /* RNDIS for tethering */ 633 633 USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3), 634 634 .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, 635 639 }, 636 640 { }, // END 637 641 };