Patchwork [3.5.y.z,extended,stable] Patch "rtlwifi: fix incorrect use of usb_alloc_coherent with" has been added to staging queue

mail settings
Submitter Herton Ronaldo Krzesinski
Date Jan. 15, 2013, 10:20 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/212320/
State New
Headers show


Herton Ronaldo Krzesinski - Jan. 15, 2013, 10:20 p.m.
This is a note to let you know that I have just added a patch titled

    rtlwifi: fix incorrect use of usb_alloc_coherent with

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From 90b6901690c742a8011ef383499d187163b275af Mon Sep 17 00:00:00 2001
From: Jussi Kivilinna <>
Date: Thu, 20 Dec 2012 16:24:43 +0200
Subject: [PATCH] rtlwifi: fix incorrect use of usb_alloc_coherent with

commit 4c3de5920c486b8eefa6187ee6a181864c161100 upstream.

Incorrect use of usb_alloc_coherent memory as input buffer to usb_control_msg
can cause problems in arch DMA code, for example kernel BUG at
'arch/arm/include/asm/dma-mapping.h:321' on ARM (linux-3.4).

Change _usb_writeN_sync use kmalloc'd buffer instead.

Signed-off-by: Jussi Kivilinna <>
Acked-by: Larry Finger <>
Signed-off-by: John W. Linville <>
Signed-off-by: Herton Ronaldo Krzesinski <>
 drivers/net/wireless/rtlwifi/usb.c |    7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)



diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
index aa970fc..8fa144f 100644
--- a/drivers/net/wireless/rtlwifi/usb.c
+++ b/drivers/net/wireless/rtlwifi/usb.c
@@ -210,17 +210,16 @@  static void _usb_writeN_sync(struct rtl_priv *rtlpriv, u32 addr, void *data,
 	int pipe = usb_sndctrlpipe(udev, 0); /* write_out */
 	u8 *buffer;
-	dma_addr_t dma_addr;

-	wvalue = (u16)(addr&0x0000ffff);
-	buffer = usb_alloc_coherent(udev, (size_t)len, GFP_ATOMIC, &dma_addr);
+	wvalue = (u16)(addr & 0x0000ffff);
+	buffer = kmalloc(len, GFP_ATOMIC);
 	if (!buffer)
 	memcpy(buffer, data, len);
 	usb_control_msg(udev, pipe, request, reqtype, wvalue,
 			index, buffer, len, 50);

-	usb_free_coherent(udev, (size_t)len, buffer, dma_addr);
+	kfree(buffer);

 static void _rtl_usb_io_handler_init(struct device *dev,