&& desc->bInterfaceProtocol == 1;
 }
 
+static int is_wireless_rndis(struct usb_interface_descriptor *desc)
+{
+       return desc->bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER
+               && desc->bInterfaceSubClass == 1
+               && desc->bInterfaceProtocol == 3;
+}
+
 #else
 
 #define is_rndis(desc)         0
 #define is_activesync(desc)    0
+#define is_wireless_rndis(desc)        0
 
 #endif
 
         * of cdc-acm, it'll fail RNDIS requests cleanly.
         */
        rndis = is_rndis(&intf->cur_altsetting->desc)
-               || is_activesync(&intf->cur_altsetting->desc);
+               || is_activesync(&intf->cur_altsetting->desc)
+               || is_wireless_rndis(&intf->cur_altsetting->desc);
 
        memset(info, 0, sizeof *info);
        info->control = intf;
 
        /* "ActiveSync" is an undocumented variant of RNDIS, used in WM5 */
        USB_INTERFACE_INFO(USB_CLASS_MISC, 1, 1),
        .driver_info = (unsigned long) &rndis_info,
+}, {
+       /* RNDIS for tethering */
+       USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
+       .driver_info = (unsigned long) &rndis_info,
 },
        { },            // END
 };