diff options
Diffstat (limited to 'drivers/net/usb/rtl8150.c')
-rw-r--r-- | drivers/net/usb/rtl8150.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/drivers/net/usb/rtl8150.c b/drivers/net/usb/rtl8150.c index 95b7bd0d7abc..c81c79110cef 100644 --- a/drivers/net/usb/rtl8150.c +++ b/drivers/net/usb/rtl8150.c | |||
@@ -155,16 +155,36 @@ static const char driver_name [] = "rtl8150"; | |||
155 | */ | 155 | */ |
156 | static int get_registers(rtl8150_t * dev, u16 indx, u16 size, void *data) | 156 | static int get_registers(rtl8150_t * dev, u16 indx, u16 size, void *data) |
157 | { | 157 | { |
158 | return usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), | 158 | void *buf; |
159 | RTL8150_REQ_GET_REGS, RTL8150_REQT_READ, | 159 | int ret; |
160 | indx, 0, data, size, 500); | 160 | |
161 | buf = kmalloc(size, GFP_NOIO); | ||
162 | if (!buf) | ||
163 | return -ENOMEM; | ||
164 | |||
165 | ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), | ||
166 | RTL8150_REQ_GET_REGS, RTL8150_REQT_READ, | ||
167 | indx, 0, buf, size, 500); | ||
168 | if (ret > 0 && ret <= size) | ||
169 | memcpy(data, buf, ret); | ||
170 | kfree(buf); | ||
171 | return ret; | ||
161 | } | 172 | } |
162 | 173 | ||
163 | static int set_registers(rtl8150_t * dev, u16 indx, u16 size, void *data) | 174 | static int set_registers(rtl8150_t * dev, u16 indx, u16 size, const void *data) |
164 | { | 175 | { |
165 | return usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), | 176 | void *buf; |
166 | RTL8150_REQ_SET_REGS, RTL8150_REQT_WRITE, | 177 | int ret; |
167 | indx, 0, data, size, 500); | 178 | |
179 | buf = kmemdup(data, size, GFP_NOIO); | ||
180 | if (!buf) | ||
181 | return -ENOMEM; | ||
182 | |||
183 | ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), | ||
184 | RTL8150_REQ_SET_REGS, RTL8150_REQT_WRITE, | ||
185 | indx, 0, buf, size, 500); | ||
186 | kfree(buf); | ||
187 | return ret; | ||
168 | } | 188 | } |
169 | 189 | ||
170 | static void async_set_reg_cb(struct urb *urb) | 190 | static void async_set_reg_cb(struct urb *urb) |