--- sdio_dmux.c 2012-11-09 09:09:18.000000000 +0200 +++ sdio_dmux.c.atnt 2012-08-10 08:30:43.000000000 +0300 @@ -306,8 +306,11 @@ void *ptr = 0; int sz, rc, len = 0; struct sdio_mux_hdr *hdr; + + /* ALRAN QCT Patch 20120531 bluetooth.kang static int workqueue_pinned; + if (!workqueue_pinned) { struct cpumask cpus; @@ -319,6 +322,7 @@ __func__); workqueue_pinned = 1; } + */ DBG("%s: reading\n", __func__); /* should probably have a separate read lock */ @@ -369,7 +373,8 @@ 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_workqueue, &work_sdio_mux_read); + queue_work_on(0, sdio_mux_workqueue, &work_sdio_mux_read); //ALRAN QCT_Patch 20120531 bluetooth.kang return; } mutex_unlock(&sdio_mux_lock); @@ -400,7 +405,8 @@ 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_workqueue, &work_sdio_mux_read); + queue_work_on(0, sdio_mux_workqueue, &work_sdio_mux_read); //ALRAN QCT_Patch 20120531 bluetooth.kang } static int sdio_mux_write(struct sk_buff *skb) @@ -645,7 +651,8 @@ 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_workqueue, &work_sdio_mux_write); + queue_work_on(0, sdio_mux_workqueue, &work_sdio_mux_write);//ALRAN QCT_Patch 20120531 bluetooth.kang write_done: spin_unlock_irqrestore(&sdio_mux_write_lock, flags); @@ -724,11 +731,13 @@ /* 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_on(0, sdio_mux_workqueue, &work_sdio_mux_write); //ALRAN QCT_PATCH 20120531 bluetooth.kang + //queue_work(sdio_mux_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_on(0, sdio_mux_workqueue, &work_sdio_mux_read); //ALRAN QCT_PATCH 20120531 bluetooth.kang + //queue_work(sdio_mux_workqueue, &work_sdio_mux_read); } int msm_sdio_dmux_is_ch_full(uint32_t id) @@ -826,9 +835,13 @@ int rc; DBG("%s probe called\n", __func__); - + if (!sdio_mux_initialized) { - sdio_mux_workqueue = create_singlethread_workqueue("sdio_dmux"); + //ALRAN + //sdio_mux_workqueue = create_singlethread_workqueue("sdio_dmux"); QCT_PATCH 20120531 bluetooth.kang + sdio_mux_workqueue = alloc_workqueue("sdio_dmux", /*WQ_UNBOUND*/WQ_MEM_RECLAIM, 1); + //ALRANEND + if (!sdio_mux_workqueue) return -ENOMEM;