mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-16 11:38:11 +00:00
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. Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
0caa11663c
commit
818727badc
3 changed files with 11 additions and 10 deletions
|
@ -74,7 +74,7 @@ EXPORT_SYMBOL_GPL(rndis_status);
|
||||||
* Call context is likely probe(), before interface name is known,
|
* Call context is likely probe(), before interface name is known,
|
||||||
* which is why we won't try to use it in the diagnostics.
|
* 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;
|
struct cdc_state *info = (void *) &dev->data;
|
||||||
int master_ifnum;
|
int master_ifnum;
|
||||||
|
@ -121,7 +121,7 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf)
|
||||||
USB_CDC_GET_ENCAPSULATED_RESPONSE,
|
USB_CDC_GET_ENCAPSULATED_RESPONSE,
|
||||||
USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||||
0, master_ifnum,
|
0, master_ifnum,
|
||||||
buf, CONTROL_BUFFER_SIZE,
|
buf, buflen,
|
||||||
RNDIS_CONTROL_TIMEOUT_MS);
|
RNDIS_CONTROL_TIMEOUT_MS);
|
||||||
if (likely(retval >= 8)) {
|
if (likely(retval >= 8)) {
|
||||||
msg_len = le32_to_cpu(buf->msg_len);
|
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->len = cpu_to_le32(in_len);
|
||||||
u.get->offset = ccpu2(20);
|
u.get->offset = ccpu2(20);
|
||||||
|
|
||||||
retval = rndis_command(dev, u.header);
|
retval = rndis_command(dev, u.header, CONTROL_BUFFER_SIZE);
|
||||||
if (unlikely(retval < 0)) {
|
if (unlikely(retval < 0)) {
|
||||||
dev_err(&intf->dev, "RNDIS_MSG_QUERY(0x%08x) failed, %d\n",
|
dev_err(&intf->dev, "RNDIS_MSG_QUERY(0x%08x) failed, %d\n",
|
||||||
oid, retval);
|
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);
|
u.init->max_transfer_size = cpu_to_le32(dev->rx_urb_size);
|
||||||
|
|
||||||
net->change_mtu = NULL;
|
net->change_mtu = NULL;
|
||||||
retval = rndis_command(dev, u.header);
|
retval = rndis_command(dev, u.header, CONTROL_BUFFER_SIZE);
|
||||||
if (unlikely(retval < 0)) {
|
if (unlikely(retval < 0)) {
|
||||||
/* it might not even be an RNDIS device!! */
|
/* it might not even be an RNDIS device!! */
|
||||||
dev_err(&intf->dev, "RNDIS init failed, %d\n", retval);
|
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);
|
u.set->offset = ccpu2((sizeof *u.set) - 8);
|
||||||
*(__le32 *)(u.buf + sizeof *u.set) = RNDIS_DEFAULT_FILTER;
|
*(__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)) {
|
if (unlikely(retval < 0)) {
|
||||||
dev_err(&intf->dev, "rndis set packet filter, %d\n", retval);
|
dev_err(&intf->dev, "rndis set packet filter, %d\n", retval);
|
||||||
goto halt_fail_and_release;
|
goto halt_fail_and_release;
|
||||||
|
@ -424,7 +424,7 @@ halt_fail_and_release:
|
||||||
memset(u.halt, 0, sizeof *u.halt);
|
memset(u.halt, 0, sizeof *u.halt);
|
||||||
u.halt->msg_type = RNDIS_MSG_HALT;
|
u.halt->msg_type = RNDIS_MSG_HALT;
|
||||||
u.halt->msg_len = ccpu2(sizeof *u.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:
|
fail_and_release:
|
||||||
usb_set_intfdata(info->data, NULL);
|
usb_set_intfdata(info->data, NULL);
|
||||||
usb_driver_release_interface(driver_of(intf), info->data);
|
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) {
|
if (halt) {
|
||||||
halt->msg_type = RNDIS_MSG_HALT;
|
halt->msg_type = RNDIS_MSG_HALT;
|
||||||
halt->msg_len = ccpu2(sizeof *halt);
|
halt->msg_len = ccpu2(sizeof *halt);
|
||||||
(void) rndis_command(dev, (void *)halt);
|
(void) rndis_command(dev, (void *)halt, CONTROL_BUFFER_SIZE);
|
||||||
kfree(halt);
|
kfree(halt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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->msg_len = ccpu2(sizeof *u.get);
|
||||||
u.get->oid = oid;
|
u.get->oid = oid;
|
||||||
|
|
||||||
ret = rndis_command(dev, u.header);
|
ret = rndis_command(dev, u.header, buflen);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = le32_to_cpu(u.get_c->len);
|
ret = le32_to_cpu(u.get_c->len);
|
||||||
*len = (*len > ret) ? ret : *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);
|
u.set->handle = ccpu2(0);
|
||||||
memcpy(u.buf + sizeof(*u.set), data, len);
|
memcpy(u.buf + sizeof(*u.set), data, len);
|
||||||
|
|
||||||
ret = rndis_command(dev, u.header);
|
ret = rndis_command(dev, u.header, buflen);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = rndis_error_status(u.set_c->status);
|
ret = rndis_error_status(u.set_c->status);
|
||||||
|
|
||||||
|
|
|
@ -260,7 +260,8 @@ struct rndis_keepalive_c { /* IN (optionally OUT) */
|
||||||
|
|
||||||
|
|
||||||
extern void rndis_status(struct usbnet *dev, struct urb *urb);
|
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
|
extern int
|
||||||
generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags);
|
generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags);
|
||||||
extern void rndis_unbind(struct usbnet *dev, struct usb_interface *intf);
|
extern void rndis_unbind(struct usbnet *dev, struct usb_interface *intf);
|
||||||
|
|
Loading…
Add table
Reference in a new issue