Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 352825
b: refs/heads/master
c: bc6b892
h: refs/heads/master
i:
  352823: bcded86
v: v3
  • Loading branch information
Jussi Kivilinna authored and John W. Linville committed Feb 18, 2013
1 parent a3600ef commit 4c3733f
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a5f390562a375a315292648e2da865a12b42f280
refs/heads/master: bc6b89237acb3dee6af6e64e51a18255fef89cc2
44 changes: 28 additions & 16 deletions trunk/drivers/net/wireless/rtlwifi/usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,12 @@

static void usbctrl_async_callback(struct urb *urb)
{
if (urb)
kfree(urb->context);
if (urb) {
/* free dr */
kfree(urb->setup_packet);
/* free databuf */
kfree(urb->transfer_buffer);
}
}

static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,
Expand All @@ -55,39 +59,47 @@ static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,
u8 reqtype;
struct usb_ctrlrequest *dr;
struct urb *urb;
struct rtl819x_async_write_data {
u8 data[REALTEK_USB_VENQT_MAX_BUF_SIZE];
struct usb_ctrlrequest dr;
} *buf;
const u16 databuf_maxlen = REALTEK_USB_VENQT_MAX_BUF_SIZE;
u8 *databuf;

if (WARN_ON_ONCE(len > databuf_maxlen))
len = databuf_maxlen;

pipe = usb_sndctrlpipe(udev, 0); /* write_out */
reqtype = REALTEK_USB_VENQT_WRITE;

buf = kmalloc(sizeof(*buf), GFP_ATOMIC);
if (!buf)
dr = kmalloc(sizeof(*dr), GFP_ATOMIC);
if (!dr)
return -ENOMEM;

databuf = kmalloc(databuf_maxlen, GFP_ATOMIC);
if (!databuf) {
kfree(dr);
return -ENOMEM;
}

urb = usb_alloc_urb(0, GFP_ATOMIC);
if (!urb) {
kfree(buf);
kfree(databuf);
kfree(dr);
return -ENOMEM;
}

dr = &buf->dr;

dr->bRequestType = reqtype;
dr->bRequest = request;
dr->wValue = cpu_to_le16(value);
dr->wIndex = cpu_to_le16(index);
dr->wLength = cpu_to_le16(len);
/* data are already in little-endian order */
memcpy(buf, pdata, len);
memcpy(databuf, pdata, len);
usb_fill_control_urb(urb, udev, pipe,
(unsigned char *)dr, buf, len,
usbctrl_async_callback, buf);
(unsigned char *)dr, databuf, len,
usbctrl_async_callback, NULL);
rc = usb_submit_urb(urb, GFP_ATOMIC);
if (rc < 0)
kfree(buf);
if (rc < 0) {
kfree(databuf);
kfree(dr);
}
usb_free_urb(urb);
return rc;
}
Expand Down

0 comments on commit 4c3733f

Please sign in to comment.