diff options
author | David Brownell <david-b@pacbell.net> | 2007-04-29 10:09:47 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-05-22 23:45:48 -0700 |
commit | 4149b72eaa74583c361e3aaf5804eb74b72c51f1 (patch) | |
tree | 49191dc736116ff2e00686b3605ce7ea130da1cf /drivers/net/usb | |
parent | 47f8468e6008a1d62f7dacbcff4ec3e115a500c8 (diff) | |
download | op-kernel-dev-4149b72eaa74583c361e3aaf5804eb74b72c51f1.zip op-kernel-dev-4149b72eaa74583c361e3aaf5804eb74b72c51f1.tar.gz |
USB: handle more rndis_host oddities
Workaround another device firmware bug, wherein CDC descriptors get
placed in a wrong place never previously observed in the wild.
Fix a bug where a seeming RNDIS device returns a bogus response during
device initialization.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/net/usb')
-rw-r--r-- | drivers/net/usb/cdc_ether.c | 16 | ||||
-rw-r--r-- | drivers/net/usb/rndis_host.c | 1 |
2 files changed, 17 insertions, 0 deletions
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 5a21f06..675ac99 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -91,6 +91,22 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) "CDC descriptors on config\n"); } + /* Maybe CDC descriptors are after the endpoint? This bug has + * been seen on some 2Wire Inc RNDIS-ish products. + */ + if (len == 0) { + struct usb_host_endpoint *hep; + + hep = intf->cur_altsetting->endpoint; + if (hep) { + buf = hep->extra; + len = hep->extralen; + } + if (len) + dev_dbg(&intf->dev, + "CDC descriptors on endpoint\n"); + } + /* this assumes that if there's a non-RNDIS vendor variant * of cdc-acm, it'll fail RNDIS requests cleanly. */ diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index 980e4aa..cd991a0 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c @@ -515,6 +515,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) dev_err(&intf->dev, "dev can't take %u byte packets (max %u)\n", dev->hard_mtu, tmp); + retval = -EINVAL; goto fail_and_release; } |