Problem description:
-------------------------
Harris radios that use the rndis_host driver do not work with Linux kernels 
from version 3.16 to 4.11. They give the following timeout errors in dmesg.

[  426.016082] usbcore: registered new interface driver cdc_ether [  
472.169327] rndis_host 2-1.2:1.0: RNDIS init failed, -110 [  472.169371] 
rndis_host: probe of 2-1.2:1.0 failed with error -110 [  472.169427] usbcore: 
registered new interface driver rndis_host [  482.383927] rndis_wlan 2-1.2:1.0: 
RNDIS init failed, -110 [  482.384068] rndis_wlan: probe of 2-1.2:1.0 failed 
with error -110 [  482.384121] usbcore: registered new interface driver 
rndis_wlan

Result of investigation:
----------------------------
git bisect shows that the problem started with this commit

commit b527caee1b91946db844b1dc63d4f726958891c8
Merge: c98158e d92f5de
Author: Linus Torvalds <torva...@linux-foundation.org>
Date:   Wed Jul 30 08:54:17 2014 -0700

    Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
    
    Pull networking fixes from David Miller:
     5) cdc-ether devices can come up with entries in their address filter,
        so explicitly clear the filter after the device initializes.  From
        Oliver Neukum.

This commit introduced using the USB_CDC_SET_ETHERNET_PACKET_FILTER message to 
set the packet filter on an attached CDC Ethernet device. The rndis_host driver 
relies on the cdc_ether driver and so this message also gets sent during an 
RNDIS device probe. As far as I can tell, USB_CDC_SET_ETHERNET_PACKET_FILTER is 
not part of the Microsoft RNDIS specification and it certainly causes problems 
with Harris radios as they return an EPIPE error which then results in the 
timeout errors seen in the dmesg output above.

The following patch fixes the problem.

Signed-off-by: Keith Ridgway <kridg...@harris.com>
Cc: sta...@vger.kernel.org
Cc: gre...@linuxfoundation.org

Regards,
Keith Ridgway


--
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 
f3ae88fdf332..87c7ff190c29 100644
--- a/drivers/net/usb/cdc_ether.c
+++ b/drivers/net/usb/cdc_ether.c
@@ -315,8 +315,10 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct 
usb_interface *intf)
         * don't do reset all the way. So the packet filter should
         * be set to a sane initial value.
         */
-       usbnet_cdc_update_filter(dev);
-
+       if (!rndis) {
+               usbnet_cdc_update_filter(dev);
+       }
+       
        return 0;
 
 bad_desc:
--
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to