rndis_host: Poll status channel before control channel (Closes: #576929)

svn path=/dists/sid/linux-2.6/; revision=15524
This commit is contained in:
Ben Hutchings 2010-04-19 23:09:43 +00:00
parent ea251fc2c9
commit 0db64f98bc
3 changed files with 64 additions and 0 deletions

1
debian/changelog vendored
View File

@ -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.

View 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),
+ &notification, 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

View File

@ -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