rndis_host: pass buffer length to rndis_command
authorJussi Kivilinna <jussi.kivilinna@mbnet.fi>
Wed, 18 Jun 2008 12:40:12 +0000 (15:40 +0300)
committerJeff Garzik <jgarzik@redhat.com>
Sat, 28 Jun 2008 14:23:34 +0000 (10:23 -0400)
Pass buffer length to rndis_command so that rndis_command can read full
response buffer from device instead of max CONTROL_BUFFER_SIZE bytes.

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/net/usb/rndis_host.c
drivers/net/wireless/rndis_wlan.c
include/linux/usb/rndis_host.h

index ae467f182c4025958b00060ee1b29972c0467d25..61c98beb4d17d05adb4fc741854f7163fcb84ad4 100644 (file)
@@ -74,7 +74,7 @@ EXPORT_SYMBOL_GPL(rndis_status);
  * Call context is likely probe(), before interface name is known,
  * which is why we won't try to use it in the diagnostics.
  */
-int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf)
+int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen)
 {
        struct cdc_state        *info = (void *) &dev->data;
        int                     master_ifnum;
@@ -121,7 +121,7 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf)
                        USB_CDC_GET_ENCAPSULATED_RESPONSE,
                        USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        0, master_ifnum,
-                       buf, CONTROL_BUFFER_SIZE,
+                       buf, buflen,
                        RNDIS_CONTROL_TIMEOUT_MS);
                if (likely(retval >= 8)) {
                        msg_len = le32_to_cpu(buf->msg_len);
@@ -239,7 +239,7 @@ static int rndis_query(struct usbnet *dev, struct usb_interface *intf,
        u.get->len = cpu_to_le32(in_len);
        u.get->offset = ccpu2(20);
 
-       retval = rndis_command(dev, u.header);
+       retval = rndis_command(dev, u.header, CONTROL_BUFFER_SIZE);
        if (unlikely(retval < 0)) {
                dev_err(&intf->dev, "RNDIS_MSG_QUERY(0x%08x) failed, %d\n",
                                oid, retval);
@@ -328,7 +328,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
        u.init->max_transfer_size = cpu_to_le32(dev->rx_urb_size);
 
        net->change_mtu = NULL;
-       retval = rndis_command(dev, u.header);
+       retval = rndis_command(dev, u.header, CONTROL_BUFFER_SIZE);
        if (unlikely(retval < 0)) {
                /* it might not even be an RNDIS device!! */
                dev_err(&intf->dev, "RNDIS init failed, %d\n", retval);
@@ -409,7 +409,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
        u.set->offset = ccpu2((sizeof *u.set) - 8);
        *(__le32 *)(u.buf + sizeof *u.set) = RNDIS_DEFAULT_FILTER;
 
-       retval = rndis_command(dev, u.header);
+       retval = rndis_command(dev, u.header, CONTROL_BUFFER_SIZE);
        if (unlikely(retval < 0)) {
                dev_err(&intf->dev, "rndis set packet filter, %d\n", retval);
                goto halt_fail_and_release;
@@ -424,7 +424,7 @@ halt_fail_and_release:
        memset(u.halt, 0, sizeof *u.halt);
        u.halt->msg_type = RNDIS_MSG_HALT;
        u.halt->msg_len = ccpu2(sizeof *u.halt);
-       (void) rndis_command(dev, (void *)u.halt);
+       (void) rndis_command(dev, (void *)u.halt, CONTROL_BUFFER_SIZE);
 fail_and_release:
        usb_set_intfdata(info->data, NULL);
        usb_driver_release_interface(driver_of(intf), info->data);
@@ -449,7 +449,7 @@ void rndis_unbind(struct usbnet *dev, struct usb_interface *intf)
        if (halt) {
                halt->msg_type = RNDIS_MSG_HALT;
                halt->msg_len = ccpu2(sizeof *halt);
-               (void) rndis_command(dev, (void *)halt);
+               (void) rndis_command(dev, (void *)halt, CONTROL_BUFFER_SIZE);
                kfree(halt);
        }
 
index a36d2c85e26e1e89b7d78d2329036001bf388f2b..f001f2afd05e64d2ede968e833dd8dfbf43a8398 100644 (file)
@@ -448,7 +448,7 @@ static int rndis_query_oid(struct usbnet *dev, __le32 oid, void *data, int *len)
        u.get->msg_len = ccpu2(sizeof *u.get);
        u.get->oid = oid;
 
-       ret = rndis_command(dev, u.header);
+       ret = rndis_command(dev, u.header, buflen);
        if (ret == 0) {
                ret = le32_to_cpu(u.get_c->len);
                *len = (*len > ret) ? ret : *len;
@@ -498,7 +498,7 @@ static int rndis_set_oid(struct usbnet *dev, __le32 oid, void *data, int len)
        u.set->handle = ccpu2(0);
        memcpy(u.buf + sizeof(*u.set), data, len);
 
-       ret = rndis_command(dev, u.header);
+       ret = rndis_command(dev, u.header, buflen);
        if (ret == 0)
                ret = rndis_error_status(u.set_c->status);
 
index 29d6458ecb8d88127af75d053cc286cba2e12d08..0a6e6d4b929a94c902ff12707237b973372388b7 100644 (file)
@@ -260,7 +260,8 @@ struct rndis_keepalive_c {  /* IN (optionally OUT) */
 
 
 extern void rndis_status(struct usbnet *dev, struct urb *urb);
-extern int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf);
+extern int
+rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen);
 extern int
 generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags);
 extern void rndis_unbind(struct usbnet *dev, struct usb_interface *intf);