msm: sdio_dmux: split the workqueue in sdio_dmux
Adds one reader and one writer single-threaded
workqueue.
CRs-Fixed: 292652
Signed-off-by: Eric Holmberg <eholmber@codeaurora.org>
diff --git a/arch/arm/mach-msm/sdio_dmux.c b/arch/arm/mach-msm/sdio_dmux.c
index 46788f0..2ea2adb 100644
--- a/arch/arm/mach-msm/sdio_dmux.c
+++ b/arch/arm/mach-msm/sdio_dmux.c
@@ -129,7 +129,8 @@
static DECLARE_WORK(work_sdio_mux_write, sdio_mux_write_data);
static DECLARE_DELAYED_WORK(delayed_work_sdio_mux_write, sdio_mux_write_data);
-static struct workqueue_struct *sdio_mux_workqueue;
+static struct workqueue_struct *sdio_mux_read_workqueue;
+static struct workqueue_struct *sdio_mux_write_workqueue;
static struct sdio_partial_pkt_info sdio_partial_pkt;
#define sdio_ch_is_open(x) \
@@ -353,7 +354,7 @@
pr_err("%s: sdio read failed %d\n", __func__, rc);
dev_kfree_skb_any(skb_mux);
mutex_unlock(&sdio_mux_lock);
- queue_work(sdio_mux_workqueue, &work_sdio_mux_read);
+ queue_work(sdio_mux_read_workqueue, &work_sdio_mux_read);
return;
}
mutex_unlock(&sdio_mux_lock);
@@ -384,7 +385,7 @@
dev_kfree_skb_any(skb_mux);
DBG("%s: read done\n", __func__);
- queue_work(sdio_mux_workqueue, &work_sdio_mux_read);
+ queue_work(sdio_mux_read_workqueue, &work_sdio_mux_read);
}
static int sdio_mux_write(struct sk_buff *skb)
@@ -513,7 +514,7 @@
notify = 1;
} else {
__skb_queue_head(&sdio_mux_write_pool, skb);
- queue_delayed_work(sdio_mux_workqueue,
+ queue_delayed_work(sdio_mux_write_workqueue,
&delayed_work_sdio_mux_write,
msecs_to_jiffies(250)
);
@@ -624,7 +625,7 @@
sdio_ch[id].num_tx_pkts++;
spin_unlock(&sdio_ch[id].lock);
- queue_work(sdio_mux_workqueue, &work_sdio_mux_write);
+ queue_work(sdio_mux_write_workqueue, &work_sdio_mux_write);
write_done:
spin_unlock_irqrestore(&sdio_mux_write_lock, flags);
@@ -703,11 +704,11 @@
/* write avail may not be enouogh for a packet, but should be fine */
if ((event == SDIO_EVENT_DATA_WRITE_AVAIL) &&
sdio_write_avail(sdio_mux_ch))
- queue_work(sdio_mux_workqueue, &work_sdio_mux_write);
+ queue_work(sdio_mux_write_workqueue, &work_sdio_mux_write);
if ((event == SDIO_EVENT_DATA_READ_AVAIL) &&
sdio_read_avail(sdio_mux_ch))
- queue_work(sdio_mux_workqueue, &work_sdio_mux_read);
+ queue_work(sdio_mux_read_workqueue, &work_sdio_mux_read);
}
int msm_sdio_dmux_is_ch_full(uint32_t id)
@@ -810,10 +811,18 @@
DBG("%s probe called\n", __func__);
if (!sdio_mux_initialized) {
- sdio_mux_workqueue = create_singlethread_workqueue("sdio_dmux");
- if (!sdio_mux_workqueue)
+ sdio_mux_read_workqueue = create_singlethread_workqueue(
+ "sdio_dmux_read");
+ if (!sdio_mux_read_workqueue)
return -ENOMEM;
+ sdio_mux_write_workqueue = create_singlethread_workqueue(
+ "sdio_dmux_write");
+ if (!sdio_mux_write_workqueue) {
+ destroy_workqueue(sdio_mux_read_workqueue);
+ return -ENOMEM;
+ }
+
skb_queue_head_init(&sdio_mux_write_pool);
spin_lock_init(&sdio_mux_write_lock);
@@ -829,7 +838,8 @@
if (rc < 0) {
pr_err("%s: sido open failed %d\n", __func__, rc);
wake_lock_destroy(&sdio_mux_ch_wakelock);
- destroy_workqueue(sdio_mux_workqueue);
+ destroy_workqueue(sdio_mux_read_workqueue);
+ destroy_workqueue(sdio_mux_write_workqueue);
sdio_mux_initialized = 0;
return rc;
}