rndis_host: Poll status channel before control channel (Closes: #576929)
svn path=/dists/sid/linux-2.6/; revision=15524
This commit is contained in:
parent
ea251fc2c9
commit
0db64f98bc
|
@ -21,6 +21,7 @@ linux-2.6 (2.6.32-12) UNRELEASED; urgency=low
|
|||
(Closes: #577724)
|
||||
* forcedeth: Fix hardware version check for TX bug workaround
|
||||
(Closes: #572201)
|
||||
* rndis_host: Poll status channel before control channel (Closes: #576929)
|
||||
|
||||
[ maximilian attems]
|
||||
* Ignore ABI breakage due to libata switch.
|
||||
|
|
62
debian/patches/bugfix/all/rndis_host-Poll-status-channel-before-control-channel.patch
vendored
Normal file
62
debian/patches/bugfix/all/rndis_host-Poll-status-channel-before-control-channel.patch
vendored
Normal file
|
@ -0,0 +1,62 @@
|
|||
From 1c941691a933e9c2d0314c9b84ea77b6ef2807e1 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Fri, 9 Apr 2010 01:55:27 +0100
|
||||
Subject: [PATCH] rndis_host: Poll status channel before control channel
|
||||
|
||||
Some RNDIS devices don't respond on the control channel until polled
|
||||
on the status channel. In particular, this was reported to be the
|
||||
case for the 2Wire HomePortal 1000SW.
|
||||
|
||||
This is roughly based on a patch by John Carr <john.carr@unrouted.co.uk>
|
||||
which is reported to be needed for use with some Windows Mobile devices
|
||||
and which is currently applied by Mandriva.
|
||||
|
||||
Reported-by: Mark Glassberg <vzeeaxwl@myfairpoint.net>
|
||||
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
Tested-by: Mark Glassberg <vzeeaxwl@myfairpoint.net>
|
||||
---
|
||||
drivers/net/usb/rndis_host.c | 18 ++++++++++++------
|
||||
1 files changed, 12 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c
|
||||
index f56dec6..52faca1 100644
|
||||
--- a/drivers/net/usb/rndis_host.c
|
||||
+++ b/drivers/net/usb/rndis_host.c
|
||||
@@ -103,8 +103,10 @@ static void rndis_msg_indicate(struct usbnet *dev, struct rndis_indicate *msg,
|
||||
int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen)
|
||||
{
|
||||
struct cdc_state *info = (void *) &dev->data;
|
||||
+ struct usb_cdc_notification notification;
|
||||
int master_ifnum;
|
||||
int retval;
|
||||
+ int partial;
|
||||
unsigned count;
|
||||
__le32 rsp;
|
||||
u32 xid = 0, msg_len, request_id;
|
||||
@@ -132,13 +134,17 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen)
|
||||
if (unlikely(retval < 0 || xid == 0))
|
||||
return retval;
|
||||
|
||||
- // FIXME Seems like some devices discard responses when
|
||||
- // we time out and cancel our "get response" requests...
|
||||
- // so, this is fragile. Probably need to poll for status.
|
||||
+ /* Some devices don't respond on the control channel until
|
||||
+ * polled on the status channel, so do that first. */
|
||||
+ retval = usb_interrupt_msg(
|
||||
+ dev->udev,
|
||||
+ usb_rcvintpipe(dev->udev, dev->status->desc.bEndpointAddress),
|
||||
+ ¬ification, sizeof(notification), &partial,
|
||||
+ RNDIS_CONTROL_TIMEOUT_MS);
|
||||
+ if (unlikely(retval < 0))
|
||||
+ return retval;
|
||||
|
||||
- /* ignore status endpoint, just poll the control channel;
|
||||
- * the request probably completed immediately
|
||||
- */
|
||||
+ /* Poll the control channel; the request probably completed immediately */
|
||||
rsp = buf->msg_type | RNDIS_MSG_COMPLETION;
|
||||
for (count = 0; count < 10; count++) {
|
||||
memset(buf, 0, CONTROL_BUFFER_SIZE);
|
||||
--
|
||||
1.7.0.3
|
||||
|
|
@ -11,3 +11,4 @@
|
|||
+ bugfix/all/libata-ata_piix-clear-spurious-IRQ.patch
|
||||
+ bugfix/all/block-blk_abort_request-lock-fix.patch
|
||||
+ bugfix/mips/enable-pata-platform.patch
|
||||
+ bugfix/all/rndis_host-Poll-status-channel-before-control-channel.patch
|
||||
|
|
Loading…
Reference in New Issue