Revert "msm: bam_dmux: switch to polling on DL"
This reverts commit 54d6f481f288753b653b52dc55e8ca96cb7ad14a.
CRs-Fixed: 302704
Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
diff --git a/arch/arm/mach-msm/bam_dmux.c b/arch/arm/mach-msm/bam_dmux.c
index 8c04443..6dd6a43 100644
--- a/arch/arm/mach-msm/bam_dmux.c
+++ b/arch/arm/mach-msm/bam_dmux.c
@@ -107,7 +107,6 @@
struct sk_buff *skb;
dma_addr_t dma_address;
struct work_struct work;
- struct list_head list_node;
};
#define A2_NUM_PIPES 6
@@ -125,13 +124,11 @@
static struct sps_mem_buffer tx_desc_mem_buf;
static struct sps_mem_buffer rx_desc_mem_buf;
static struct sps_register_event tx_register_event;
+static struct sps_register_event rx_register_event;
static struct bam_ch_info bam_ch[BAM_DMUX_NUM_CHANNELS];
static int bam_mux_initialized;
-static LIST_HEAD(bam_rx_pool);
-static DEFINE_MUTEX(bam_rx_pool_lock);
-
struct bam_mux_hdr {
uint16_t magic_num;
uint8_t reserved;
@@ -143,10 +140,8 @@
static void bam_mux_write_done(struct work_struct *work);
static void handle_bam_mux_cmd(struct work_struct *work);
-static void rx_timer_work_func(struct work_struct *work);
static DEFINE_MUTEX(bam_mux_lock);
-static DECLARE_WORK(rx_timer_work, rx_timer_work_func);
static struct workqueue_struct *bam_mux_rx_workqueue;
static struct workqueue_struct *bam_mux_tx_workqueue;
@@ -173,16 +168,12 @@
info->skb = __dev_alloc_skb(BUFFER_SIZE, GFP_KERNEL);
ptr = skb_put(info->skb, BUFFER_SIZE);
-
- mutex_lock(&bam_rx_pool_lock);
- list_add_tail(&info->list_node, &bam_rx_pool);
- mutex_unlock(&bam_rx_pool_lock);
-
/* need a way to handle error case */
info->dma_address = dma_map_single(NULL, ptr, BUFFER_SIZE,
DMA_FROM_DEVICE);
sps_transfer_one(bam_rx_pipe, info->dma_address,
- BUFFER_SIZE, info, 0);
+ BUFFER_SIZE, info,
+ SPS_IOVEC_FLAG_INT | SPS_IOVEC_FLAG_EOT);
}
static void bam_mux_process_data(struct sk_buff *rx_skb)
@@ -507,28 +498,6 @@
return rc;
}
-static void rx_timer_work_func(struct work_struct *work)
-{
- struct sps_iovec iov;
- struct list_head *node;
- struct rx_pkt_info *info;
-
- while (1) {
- sps_get_iovec(bam_rx_pipe, &iov);
- if (iov.addr == 0)
- break;
- mutex_lock(&bam_rx_pool_lock);
- node = bam_rx_pool.next;
- list_del(node);
- mutex_unlock(&bam_rx_pool_lock);
- info = container_of(node, struct rx_pkt_info, list_node);
- handle_bam_mux_cmd(&info->work);
- }
-
- msleep(1);
- queue_work(bam_mux_rx_workqueue, &rx_timer_work);
-}
-
static void bam_mux_tx_notify(struct sps_event_notify *notify)
{
struct tx_pkt_info *pkt;
@@ -557,6 +526,26 @@
}
}
+static void bam_mux_rx_notify(struct sps_event_notify *notify)
+{
+ struct rx_pkt_info *info;
+
+ DBG("%s: event %d notified\n", __func__, notify->event_id);
+
+ info = (struct rx_pkt_info *)(notify->data.transfer.user);
+
+ switch (notify->event_id) {
+ case SPS_EVENT_EOT:
+ dma_unmap_single(NULL, info->dma_address,
+ BUFFER_SIZE, DMA_FROM_DEVICE);
+ queue_work(bam_mux_rx_workqueue, &info->work);
+ break;
+ default:
+ pr_err("%s: recieved unexpected event id %d\n", __func__,
+ notify->event_id);
+ }
+}
+
#ifdef CONFIG_DEBUG_FS
static int debug_tbl(char *buf, int max)
@@ -688,8 +677,7 @@
rx_connection.destination = SPS_DEV_HANDLE_MEM;
rx_connection.dest_pipe_index = 1;
rx_connection.mode = SPS_MODE_SRC;
- rx_connection.options = SPS_O_AUTO_ENABLE | SPS_O_EOT |
- SPS_O_ACK_TRANSFERS | SPS_O_POLL;
+ rx_connection.options = SPS_O_AUTO_ENABLE | SPS_O_EOT;
rx_desc_mem_buf.size = 0x800; /* 2k */
rx_desc_mem_buf.base = dma_alloc_coherent(NULL, rx_desc_mem_buf.size,
&dma_addr, 0);
@@ -720,11 +708,20 @@
goto rx_event_reg_failed;
}
+ rx_register_event.options = SPS_O_EOT;
+ rx_register_event.mode = SPS_TRIGGER_CALLBACK;
+ rx_register_event.xfer_done = NULL;
+ rx_register_event.callback = bam_mux_rx_notify;
+ rx_register_event.user = NULL;
+ ret = sps_register_event(bam_rx_pipe, &rx_register_event);
+ if (ret < 0) {
+ pr_err("%s: tx register event error %d\n", __func__, ret);
+ goto rx_event_reg_failed;
+ }
+
bam_mux_initialized = 1;
for (i = 0; i < NUM_BUFFERS; ++i)
queue_rx();
-
- queue_work(bam_mux_rx_workqueue, &rx_timer_work);
return;
rx_event_reg_failed: