diff options
author | Fariya Fatima <fariyaf@gmail.com> | 2014-04-01 23:59:55 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-04-09 13:55:54 -0400 |
commit | d453ba81cd2981d0040dad0def161f91f209ddf9 (patch) | |
tree | 1a7c16976169f5728b9169140118a9574c368b67 | |
parent | 5156fd24e9aec406ae14f02fc1779e234553fbd3 (diff) |
rsi: Fixed issue relating to doing dma on stack error.
Signed-off-by: Fariya Fatima <fariyaf@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/rsi/rsi_91x_usb.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c b/drivers/net/wireless/rsi/rsi_91x_usb.c index bb1bf96670eb..4c46e5631e2f 100644 --- a/drivers/net/wireless/rsi/rsi_91x_usb.c +++ b/drivers/net/wireless/rsi/rsi_91x_usb.c | |||
@@ -154,24 +154,30 @@ static int rsi_usb_reg_read(struct usb_device *usbdev, | |||
154 | u16 *value, | 154 | u16 *value, |
155 | u16 len) | 155 | u16 len) |
156 | { | 156 | { |
157 | u8 temp_buf[4]; | 157 | u8 *buf; |
158 | int status = 0; | 158 | int status = -ENOMEM; |
159 | |||
160 | buf = kmalloc(0x04, GFP_KERNEL); | ||
161 | if (!buf) | ||
162 | return status; | ||
159 | 163 | ||
160 | status = usb_control_msg(usbdev, | 164 | status = usb_control_msg(usbdev, |
161 | usb_rcvctrlpipe(usbdev, 0), | 165 | usb_rcvctrlpipe(usbdev, 0), |
162 | USB_VENDOR_REGISTER_READ, | 166 | USB_VENDOR_REGISTER_READ, |
163 | USB_TYPE_VENDOR, | 167 | USB_TYPE_VENDOR, |
164 | ((reg & 0xffff0000) >> 16), (reg & 0xffff), | 168 | ((reg & 0xffff0000) >> 16), (reg & 0xffff), |
165 | (void *)temp_buf, | 169 | (void *)buf, |
166 | len, | 170 | len, |
167 | HZ * 5); | 171 | HZ * 5); |
168 | 172 | ||
169 | *value = (temp_buf[0] | (temp_buf[1] << 8)); | 173 | *value = (buf[0] | (buf[1] << 8)); |
170 | if (status < 0) { | 174 | if (status < 0) { |
171 | rsi_dbg(ERR_ZONE, | 175 | rsi_dbg(ERR_ZONE, |
172 | "%s: Reg read failed with error code :%d\n", | 176 | "%s: Reg read failed with error code :%d\n", |
173 | __func__, status); | 177 | __func__, status); |
174 | } | 178 | } |
179 | kfree(buf); | ||
180 | |||
175 | return status; | 181 | return status; |
176 | } | 182 | } |
177 | 183 | ||
@@ -190,8 +196,12 @@ static int rsi_usb_reg_write(struct usb_device *usbdev, | |||
190 | u16 value, | 196 | u16 value, |
191 | u16 len) | 197 | u16 len) |
192 | { | 198 | { |
193 | u8 usb_reg_buf[4]; | 199 | u8 *usb_reg_buf; |
194 | int status = 0; | 200 | int status = -ENOMEM; |
201 | |||
202 | usb_reg_buf = kmalloc(0x04, GFP_KERNEL); | ||
203 | if (!usb_reg_buf) | ||
204 | return status; | ||
195 | 205 | ||
196 | usb_reg_buf[0] = (value & 0x00ff); | 206 | usb_reg_buf[0] = (value & 0x00ff); |
197 | usb_reg_buf[1] = (value & 0xff00) >> 8; | 207 | usb_reg_buf[1] = (value & 0xff00) >> 8; |
@@ -212,6 +222,8 @@ static int rsi_usb_reg_write(struct usb_device *usbdev, | |||
212 | "%s: Reg write failed with error code :%d\n", | 222 | "%s: Reg write failed with error code :%d\n", |
213 | __func__, status); | 223 | __func__, status); |
214 | } | 224 | } |
225 | kfree(usb_reg_buf); | ||
226 | |||
215 | return status; | 227 | return status; |
216 | } | 228 | } |
217 | 229 | ||
@@ -286,7 +298,7 @@ int rsi_usb_write_register_multiple(struct rsi_hw *adapter, | |||
286 | return -ENOMEM; | 298 | return -ENOMEM; |
287 | 299 | ||
288 | while (count) { | 300 | while (count) { |
289 | transfer = min_t(int, count, 4096); | 301 | transfer = (u8)(min_t(u32, count, 4096)); |
290 | memcpy(buf, data, transfer); | 302 | memcpy(buf, data, transfer); |
291 | status = usb_control_msg(dev->usbdev, | 303 | status = usb_control_msg(dev->usbdev, |
292 | usb_sndctrlpipe(dev->usbdev, 0), | 304 | usb_sndctrlpipe(dev->usbdev, 0), |