Skip to content

Commit eb7f8e2

Browse files
shuahkhgregkh
authored andcommitted
misc: rtsx_usb: fix use of dma mapped buffer for usb bulk transfer
rtsx_usb driver allocates coherent dma buffer for urb transfers. This buffer is passed to usb_bulk_msg() and usb core tries to map already mapped buffer running into a dma mapping error. xhci_hcd 0000:01:00.0: rejecting DMA map of vmalloc memory WARNING: CPU: 1 PID: 279 at include/linux/dma-mapping.h:326 usb_ hcd_map_urb_for_dma+0x7d6/0x820 ... xhci_map_urb_for_dma+0x291/0x4e0 usb_hcd_submit_urb+0x199/0x12b0 ... usb_submit_urb+0x3b8/0x9e0 usb_start_wait_urb+0xe3/0x2d0 usb_bulk_msg+0x115/0x240 rtsx_usb_transfer_data+0x185/0x1a8 [rtsx_usb] rtsx_usb_send_cmd+0xbb/0x123 [rtsx_usb] rtsx_usb_write_register+0x12c/0x143 [rtsx_usb] rtsx_usb_probe+0x226/0x4b2 [rtsx_usb] Fix it to use kmalloc() to get DMA-able memory region instead. Signed-off-by: Shuah Khan <skhan@linuxfoundation.org> Cc: stable <stable@kernel.org> Link: https://lore.kernel.org/r/667d627d502e1ba9ff4f9b94966df3299d2d3c0d.1656642167.git.skhan@linuxfoundation.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 19e506b commit eb7f8e2

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

drivers/misc/cardreader/rtsx_usb.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -631,8 +631,7 @@ static int rtsx_usb_probe(struct usb_interface *intf,
631631

632632
ucr->pusb_dev = usb_dev;
633633

634-
ucr->iobuf = usb_alloc_coherent(ucr->pusb_dev, IOBUF_SIZE,
635-
GFP_KERNEL, &ucr->iobuf_dma);
634+
ucr->iobuf = kmalloc(IOBUF_SIZE, GFP_KERNEL);
636635
if (!ucr->iobuf)
637636
return -ENOMEM;
638637

@@ -668,8 +667,9 @@ static int rtsx_usb_probe(struct usb_interface *intf,
668667

669668
out_init_fail:
670669
usb_set_intfdata(ucr->pusb_intf, NULL);
671-
usb_free_coherent(ucr->pusb_dev, IOBUF_SIZE, ucr->iobuf,
672-
ucr->iobuf_dma);
670+
kfree(ucr->iobuf);
671+
ucr->iobuf = NULL;
672+
ucr->cmd_buf = ucr->rsp_buf = NULL;
673673
return ret;
674674
}
675675

@@ -682,8 +682,9 @@ static void rtsx_usb_disconnect(struct usb_interface *intf)
682682
mfd_remove_devices(&intf->dev);
683683

684684
usb_set_intfdata(ucr->pusb_intf, NULL);
685-
usb_free_coherent(ucr->pusb_dev, IOBUF_SIZE, ucr->iobuf,
686-
ucr->iobuf_dma);
685+
kfree(ucr->iobuf);
686+
ucr->iobuf = NULL;
687+
ucr->cmd_buf = ucr->rsp_buf = NULL;
687688
}
688689

689690
#ifdef CONFIG_PM

include/linux/rtsx_usb.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ struct rtsx_ucr {
5555
struct usb_interface *pusb_intf;
5656
struct usb_sg_request current_sg;
5757
unsigned char *iobuf;
58-
dma_addr_t iobuf_dma;
5958

6059
struct timer_list sg_timer;
6160
struct mutex dev_mutex;

0 commit comments

Comments
 (0)