summaryrefslogtreecommitdiffstats
path: root/drivers/usb/renesas_usbhs/fifo.h
diff options
context:
space:
mode:
authorGuennadi Liakhovetski2012-02-14 11:37:21 +0100
committerFelipe Balbi2012-02-14 12:44:53 +0100
commit6e4b74e4690dd03b5664fa4895c3db0607d64742 (patch)
tree607c5bd1c23be029b589971e512458fde91ed0fa /drivers/usb/renesas_usbhs/fifo.h
parentusb: renesas_usbhs: (cosmetic) simplify list operations (diff)
downloadkernel-qcow2-linux-6e4b74e4690dd03b5664fa4895c3db0607d64742.tar.gz
kernel-qcow2-linux-6e4b74e4690dd03b5664fa4895c3db0607d64742.tar.xz
kernel-qcow2-linux-6e4b74e4690dd03b5664fa4895c3db0607d64742.zip
usb: renesas: fix scheduling in atomic context bug
The current renesas_usbhs driver triggers BUG: scheduling while atomic: ksoftirqd/0/3/0x00000102 with enabled CONFIG_DEBUG_ATOMIC_SLEEP, by submitting DMA transfers from an atomic (tasklet) context, which is not supported by the shdma dmaengine driver. Fix it by switching to a work. Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/renesas_usbhs/fifo.h')
-rw-r--r--drivers/usb/renesas_usbhs/fifo.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/usb/renesas_usbhs/fifo.h b/drivers/usb/renesas_usbhs/fifo.h
index f68609c0f489..c31731a843d1 100644
--- a/drivers/usb/renesas_usbhs/fifo.h
+++ b/drivers/usb/renesas_usbhs/fifo.h
@@ -19,6 +19,7 @@
#include <linux/interrupt.h>
#include <linux/sh_dma.h>
+#include <linux/workqueue.h>
#include <asm/dma.h>
#include "pipe.h"
@@ -31,7 +32,6 @@ struct usbhs_fifo {
u32 ctr; /* xFIFOCTR */
struct usbhs_pipe *pipe;
- struct tasklet_struct tasklet;
struct dma_chan *tx_chan;
struct dma_chan *rx_chan;
@@ -53,6 +53,7 @@ struct usbhs_pkt {
struct usbhs_pkt_handle *handler;
void (*done)(struct usbhs_priv *priv,
struct usbhs_pkt *pkt);
+ struct work_struct work;
dma_addr_t dma;
void *buf;
int length;