@@ -196,18 +196,27 @@ EXPORT_SYMBOL_GPL(rtsx_usb_ep0_write_register);
196
196
int rtsx_usb_ep0_read_register (struct rtsx_ucr * ucr , u16 addr , u8 * data )
197
197
{
198
198
u16 value ;
199
+ u8 * buf ;
200
+ int ret ;
199
201
200
202
if (!data )
201
203
return - EINVAL ;
202
- * data = 0 ;
204
+
205
+ buf = kzalloc (sizeof (u8 ), GFP_KERNEL );
206
+ if (!buf )
207
+ return - ENOMEM ;
203
208
204
209
addr |= EP0_READ_REG_CMD << EP0_OP_SHIFT ;
205
210
value = swab16 (addr );
206
211
207
- return usb_control_msg (ucr -> pusb_dev ,
212
+ ret = usb_control_msg (ucr -> pusb_dev ,
208
213
usb_rcvctrlpipe (ucr -> pusb_dev , 0 ), RTSX_USB_REQ_REG_OP ,
209
214
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE ,
210
- value , 0 , data , 1 , 100 );
215
+ value , 0 , buf , 1 , 100 );
216
+ * data = * buf ;
217
+
218
+ kfree (buf );
219
+ return ret ;
211
220
}
212
221
EXPORT_SYMBOL_GPL (rtsx_usb_ep0_read_register );
213
222
@@ -288,18 +297,27 @@ static int rtsx_usb_get_status_with_bulk(struct rtsx_ucr *ucr, u16 *status)
288
297
int rtsx_usb_get_card_status (struct rtsx_ucr * ucr , u16 * status )
289
298
{
290
299
int ret ;
300
+ u16 * buf ;
291
301
292
302
if (!status )
293
303
return - EINVAL ;
294
304
295
- if (polling_pipe == 0 )
305
+ if (polling_pipe == 0 ) {
306
+ buf = kzalloc (sizeof (u16 ), GFP_KERNEL );
307
+ if (!buf )
308
+ return - ENOMEM ;
309
+
296
310
ret = usb_control_msg (ucr -> pusb_dev ,
297
311
usb_rcvctrlpipe (ucr -> pusb_dev , 0 ),
298
312
RTSX_USB_REQ_POLL ,
299
313
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE ,
300
- 0 , 0 , status , 2 , 100 );
301
- else
314
+ 0 , 0 , buf , 2 , 100 );
315
+ * status = * buf ;
316
+
317
+ kfree (buf );
318
+ } else {
302
319
ret = rtsx_usb_get_status_with_bulk (ucr , status );
320
+ }
303
321
304
322
/* usb_control_msg may return positive when success */
305
323
if (ret < 0 )
0 commit comments