rndis_host: pass buffer length to rndis_command
Subsystems (5)
PATCH 1/1 rndis_host: pass buffer length to rndis_command
Pass buffer length to rndis_command so that rndis_command can read full response buffer from device instead of max CONTROL_BUFFER_SIZE bytes.
---
drivers/net/usb/rndis_host.c | 14 +++++++------- drivers/net/wireless/rndis_wlan.c | 4 ++-- include/linux/usb/rndis_host.h | 3 ++- 3 files changed, 11 insertions(+), 10 deletions(-)
drivers/net/usb/rndis_host.c +7 -7
@@ -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); }
drivers/net/wireless/rndis_wlan.c +2 -2
@@ -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);
include/linux/usb/rndis_host.h +2 -1
@@ -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);
Quoted 2 lines · Jussi Kivilinna
Pass buffer length to
rndis_commandso thatrndis_commandcan read full response buffer from device instead of maxCONTROL_BUFFER_SIZEbytes.
That is: allow rndis_wlan to get responses *bigger* than that size, while preserving the requirement that the host must always be ready to receive that many bytes.
Quoted 1 line
Signed-off-by Jussi Kivilinna <[email protected]>
Quoting David Brownell <[email protected]>:
Quoted 7 lines · Jussi Kivilinna
Quoted 2 lines
Pass buffer length to
rndis_commandso thatrndis_commandcan read full response buffer from device instead of maxCONTROL_BUFFER_SIZEbytes.That is: allow
rndis_wlanto get responses *bigger* than that size, while preserving the requirement that the host must always be ready to receive that many bytes.
Exactly.. I should try remember answer to the "why" part in description in future.
Jeff Garzik
AppliedQuoted 10 lines · Jussi Kivilinna
Pass buffer length to
rndis_commandso thatrndis_commandcan read full response buffer from device instead of maxCONTROL_BUFFER_SIZEbytes.Signed-off-by Jussi Kivilinna <[email protected]>---
drivers/net/usb/rndis_host.c | 14 +++++++------- drivers/net/wireless/rndis_wlan.c | 4 ++-- include/linux/usb/rndis_host.h | 3 ++- 3 files changed, 11 insertions(+), 10 deletions(-)
applied