diff options
author | Sreelakshmi Gownipalli <sgownipa@codeaurora.org> | 2015-10-26 11:30:39 -0700 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:23:49 -0700 |
commit | 9e1875b6945e251ada3f84ad9906b92b5d698694 (patch) | |
tree | 70e626ed60870ccfd19f86636734ea8994041589 /drivers/char/diag | |
parent | 750e7e411590f45f6187bf02e6865d8159804507 (diff) |
diag: Enable Diag over MHI
Make changes to support diag over MHI.
Change-Id: I6a1ff44da275c12144c0a83dbb317a00487f62be
Signed-off-by: Sreelakshmi Gownipalli <sgownipa@codeaurora.org>
Diffstat (limited to 'drivers/char/diag')
-rw-r--r-- | drivers/char/diag/Kconfig | 2 | ||||
-rw-r--r-- | drivers/char/diag/Makefile | 6 | ||||
-rw-r--r-- | drivers/char/diag/diag_debugfs.c | 31 | ||||
-rw-r--r-- | drivers/char/diag/diagchar_core.c | 3 | ||||
-rw-r--r-- | drivers/char/diag/diagfwd_bridge.c | 8 | ||||
-rw-r--r-- | drivers/char/diag/diagfwd_mhi.c | 59 | ||||
-rw-r--r-- | drivers/char/diag/diagfwd_mhi.h | 1 |
7 files changed, 50 insertions, 60 deletions
diff --git a/drivers/char/diag/Kconfig b/drivers/char/diag/Kconfig index 1e2638348715..ba629abdd36e 100644 --- a/drivers/char/diag/Kconfig +++ b/drivers/char/diag/Kconfig @@ -25,7 +25,7 @@ endmenu menu "HSIC/SMUX support for DIAG" config DIAGFWD_BRIDGE_CODE - depends on USB_QCOM_DIAG_BRIDGE + depends on USB_QCOM_DIAG_BRIDGE || MSM_MHI default y bool "Enable QSC/9K DIAG traffic over SMUX/HSIC" help diff --git a/drivers/char/diag/Makefile b/drivers/char/diag/Makefile index ed5a61baf222..3de7aba12a2f 100644 --- a/drivers/char/diag/Makefile +++ b/drivers/char/diag/Makefile @@ -1,6 +1,6 @@ obj-$(CONFIG_DIAG_CHAR) := diagchar.o obj-$(CONFIG_DIAGFWD_BRIDGE_CODE) += diagfwd_bridge.o -obj-$(CONFIG_DIAGFWD_BRIDGE_CODE) += diagfwd_hsic.o -obj-$(CONFIG_DIAGFWD_BRIDGE_CODE) += diagfwd_smux.o -obj-$(CONFIG_DIAGFWD_BRIDGE_CODE) += diagfwd_mhi.o +obj-$(CONFIG_USB_QCOM_DIAG_BRIDGE) += diagfwd_hsic.o +obj-$(CONFIG_USB_QCOM_DIAG_BRIDGE) += diagfwd_smux.o +obj-$(CONFIG_MSM_MHI) += diagfwd_mhi.o diagchar-objs := diagchar_core.o diagchar_hdlc.o diagfwd.o diagfwd_peripheral.o diagfwd_smd.o diagfwd_socket.o diag_mux.o diag_memorydevice.o diag_usb.o diagmem.o diagfwd_cntl.o diag_dci.o diag_masks.o diag_debugfs.o diff --git a/drivers/char/diag/diag_debugfs.c b/drivers/char/diag/diag_debugfs.c index 61f52681b712..bb73ee08d4b0 100644 --- a/drivers/char/diag/diag_debugfs.c +++ b/drivers/char/diag/diag_debugfs.c @@ -20,8 +20,12 @@ #include "diagfwd.h" #ifdef CONFIG_DIAGFWD_BRIDGE_CODE #include "diagfwd_bridge.h" +#endif +#ifdef CONFIG_USB_QCOM_DIAG_BRIDGE #include "diagfwd_hsic.h" #include "diagfwd_smux.h" +#endif +#ifdef CONFIG_MSM_MHI #include "diagfwd_mhi.h" #endif #include "diagmem.h" @@ -712,6 +716,7 @@ static ssize_t diag_dbgfs_write_debug(struct file *fp, const char __user *buf, } #ifdef CONFIG_DIAGFWD_BRIDGE_CODE +#ifdef CONFIG_USB_QCOM_DIAG_BRIDGE static ssize_t diag_dbgfs_read_hsicinfo(struct file *file, char __user *ubuf, size_t count, loff_t *ppos) { @@ -779,6 +784,11 @@ static ssize_t diag_dbgfs_read_hsicinfo(struct file *file, char __user *ubuf, return ret; } +const struct file_operations diag_dbgfs_hsicinfo_ops = { + .read = diag_dbgfs_read_hsicinfo, +}; +#endif +#ifdef CONFIG_MSM_MHI static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf, size_t count, loff_t *ppos) { @@ -848,6 +858,12 @@ static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf, return ret; } + +const struct file_operations diag_dbgfs_mhiinfo_ops = { + .read = diag_dbgfs_read_mhiinfo, +}; + +#endif static ssize_t diag_dbgfs_read_bridge(struct file *file, char __user *ubuf, size_t count, loff_t *ppos) { @@ -913,14 +929,6 @@ static ssize_t diag_dbgfs_read_bridge(struct file *file, char __user *ubuf, return ret; } -const struct file_operations diag_dbgfs_mhiinfo_ops = { - .read = diag_dbgfs_read_mhiinfo, -}; - -const struct file_operations diag_dbgfs_hsicinfo_ops = { - .read = diag_dbgfs_read_hsicinfo, -}; - const struct file_operations diag_dbgfs_bridge_ops = { .read = diag_dbgfs_read_bridge, }; @@ -1021,18 +1029,19 @@ int diag_debugfs_init(void) &diag_dbgfs_bridge_ops); if (!entry) goto err; - +#ifdef CONFIG_USB_QCOM_DIAG_BRIDGE entry = debugfs_create_file("hsicinfo", 0444, diag_dbgfs_dent, 0, &diag_dbgfs_hsicinfo_ops); if (!entry) goto err; - +#endif +#ifdef CONFIG_MSM_MHI entry = debugfs_create_file("mhiinfo", 0444, diag_dbgfs_dent, 0, &diag_dbgfs_mhiinfo_ops); if (!entry) goto err; #endif - +#endif diag_dbgfs_table_index = 0; diag_dbgfs_mempool_index = 0; diag_dbgfs_usbinfo_index = 0; diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index c42bde07d458..d1b6659f8160 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -3152,7 +3152,8 @@ static void diag_debug_init(void) * Set the bit mask here as per diag_ipc_logging.h to enable debug logs * to be logged to IPC */ - diag_debug_mask = DIAG_DEBUG_PERIPHERALS | DIAG_DEBUG_DCI; + diag_debug_mask = DIAG_DEBUG_PERIPHERALS | DIAG_DEBUG_DCI | + DIAG_DEBUG_BRIDGE; } #else static void diag_debug_init(void) diff --git a/drivers/char/diag/diagfwd_bridge.c b/drivers/char/diag/diagfwd_bridge.c index e08530f64b25..038740d42b95 100644 --- a/drivers/char/diag/diagfwd_bridge.c +++ b/drivers/char/diag/diagfwd_bridge.c @@ -18,11 +18,15 @@ #include <linux/workqueue.h> #include <linux/ratelimit.h> #include <linux/platform_device.h> +#ifdef USB_QCOM_DIAG_BRIDGE #include <linux/smux.h> +#endif #include "diag_mux.h" #include "diagfwd_bridge.h" +#ifdef USB_QCOM_DIAG_BRIDGE #include "diagfwd_hsic.h" #include "diagfwd_smux.h" +#endif #include "diagfwd_mhi.h" #include "diag_dci.h" @@ -256,9 +260,11 @@ int diagfwd_bridge_init() err = diag_mdm_init(); if (err) goto fail; + #ifdef USB_QCOM_DIAG_BRIDGE err = diag_smux_init(); if (err) goto fail; + #endif return 0; fail: @@ -268,8 +274,10 @@ fail: void diagfwd_bridge_exit() { + #ifdef USB_QCOM_DIAG_BRIDGE diag_hsic_exit(); diag_smux_exit(); + #endif } int diagfwd_bridge_close(int id) diff --git a/drivers/char/diag/diagfwd_mhi.c b/drivers/char/diag/diagfwd_mhi.c index 32b4a00f2560..a35d5c715840 100644 --- a/drivers/char/diag/diagfwd_mhi.c +++ b/drivers/char/diag/diagfwd_mhi.c @@ -107,7 +107,7 @@ static int mhi_ch_open(struct diag_mhi_ch_t *ch) } static int mhi_buf_tbl_add(struct diag_mhi_info *mhi_info, int type, - void *buf, dma_addr_t dma_addr, int len) + void *buf, int len) { unsigned long flags; struct diag_mhi_buf_tbl_t *item; @@ -140,7 +140,6 @@ static int mhi_buf_tbl_add(struct diag_mhi_info *mhi_info, int type, spin_lock_irqsave(&ch->lock, flags); item->buf = buf; item->len = len; - item->dma_addr = dma_addr; list_add_tail(&item->link, &ch->buf_tbl); spin_unlock_irqrestore(&ch->lock, flags); @@ -210,8 +209,6 @@ static void mhi_buf_tbl_clear(struct diag_mhi_info *mhi_info) item = list_entry(start, struct diag_mhi_buf_tbl_t, link); list_del(&item->link); - dma_unmap_single(NULL, item->dma_addr, - DIAG_MDM_BUF_SIZE, DMA_FROM_DEVICE); diagmem_free(driver, item->buf, mhi_info->mempool); kfree(item); @@ -228,8 +225,6 @@ static void mhi_buf_tbl_clear(struct diag_mhi_info *mhi_info) item = list_entry(start, struct diag_mhi_buf_tbl_t, link); list_del(&item->link); - dma_unmap_single(NULL, item->dma_addr, item->len, - DMA_TO_DEVICE); diag_remote_dev_write_done(mhi_info->dev_id, item->buf, item->len, mhi_info->id); kfree(item); @@ -384,7 +379,6 @@ static void mhi_read_done_work_fn(struct work_struct *work) { unsigned char *buf = NULL; struct mhi_result result; - uintptr_t phy_buf = 0; int err = 0; struct diag_mhi_info *mhi_info = container_of(work, struct diag_mhi_info, @@ -400,15 +394,12 @@ static void mhi_read_done_work_fn(struct work_struct *work) pr_debug("diag: In %s, err %d\n", __func__, err); break; } - phy_buf = result.payload_buf; - if (!phy_buf) + buf = result.buf_addr; + if (!buf) break; - dma_unmap_single(NULL, result.payload_buf, result.bytes_xferd, - DMA_FROM_DEVICE); - buf = dma_to_virt(NULL, result.payload_buf); DIAG_LOG(DIAG_DEBUG_BRIDGE, - "read from mhi port %d buf %p unmapped from %u\n", - mhi_info->id, buf, result.payload_buf); + "read from mhi port %d buf %p\n", + mhi_info->id, buf); /* * The read buffers can come after the MHI channels are closed. * If the channels are closed at the time of read, discard the @@ -421,14 +412,13 @@ static void mhi_read_done_work_fn(struct work_struct *work) mhi_buf_tbl_remove(mhi_info, TYPE_MHI_READ_CH, buf, result.bytes_xferd); } - } while (phy_buf); + } while (buf); } static void mhi_read_work_fn(struct work_struct *work) { int err = 0; unsigned char *buf = NULL; - dma_addr_t dma_addr; enum MHI_FLAGS mhi_flags = MHI_EOT; struct diag_mhi_ch_t *read_ch = NULL; unsigned long flags; @@ -448,21 +438,16 @@ static void mhi_read_work_fn(struct work_struct *work) if (!buf) break; - dma_addr = dma_map_single(NULL, buf, DIAG_MDM_BUF_SIZE, - DMA_FROM_DEVICE); - if (dma_mapping_error(NULL, dma_addr)) - panic("ASSERT"); - - err = mhi_buf_tbl_add(mhi_info, TYPE_MHI_READ_CH, buf, dma_addr, + err = mhi_buf_tbl_add(mhi_info, TYPE_MHI_READ_CH, buf, DIAG_MDM_BUF_SIZE); if (err) goto fail; DIAG_LOG(DIAG_DEBUG_BRIDGE, - "queueing a read buf %p mapped to 0x%x, ch: %s\n", - buf, dma_addr, mhi_info->name); + "queueing a read buf %p, ch: %s\n", + buf, mhi_info->name); spin_lock_irqsave(&read_ch->lock, flags); - err = mhi_queue_xfer(read_ch->hdl, dma_addr, DIAG_MDM_BUF_SIZE, + err = mhi_queue_xfer(read_ch->hdl, buf, DIAG_MDM_BUF_SIZE, mhi_flags); spin_unlock_irqrestore(&read_ch->lock, flags); if (err) { @@ -474,9 +459,6 @@ static void mhi_read_work_fn(struct work_struct *work) return; fail: - dma_unmap_single(NULL, dma_addr, DIAG_MDM_BUF_SIZE, - DMA_FROM_DEVICE); - buf = dma_to_virt(NULL, dma_addr); mhi_buf_tbl_remove(mhi_info, TYPE_MHI_READ_CH, buf, DIAG_MDM_BUF_SIZE); queue_work(mhi_info->mhi_wq, &mhi_info->read_work); } @@ -497,7 +479,6 @@ static int mhi_write(int id, unsigned char *buf, int len, int ctxt) int err = 0; enum MHI_FLAGS mhi_flags = MHI_EOT; unsigned long flags; - dma_addr_t dma_addr = 0; struct diag_mhi_ch_t *ch = NULL; if (id < 0 || id >= NUM_MHI_DEV) { @@ -525,18 +506,13 @@ static int mhi_write(int id, unsigned char *buf, int len, int ctxt) return -EIO; } - dma_addr = dma_map_single(NULL, buf, len, DMA_TO_DEVICE); - if (dma_mapping_error(NULL, dma_addr)) - panic("ASSERT"); - - err = mhi_buf_tbl_add(&diag_mhi[id], TYPE_MHI_WRITE_CH, buf, dma_addr, + err = mhi_buf_tbl_add(&diag_mhi[id], TYPE_MHI_WRITE_CH, buf, len); if (err) goto fail; - DIAG_LOG(DIAG_DEBUG_BRIDGE, "buf %p mapped to %u\n", buf, dma_addr); spin_lock_irqsave(&ch->lock, flags); - err = mhi_queue_xfer(ch->hdl, dma_addr, len, mhi_flags); + err = mhi_queue_xfer(ch->hdl, buf, len, mhi_flags); spin_unlock_irqrestore(&ch->lock, flags); if (err) { pr_err_ratelimited("diag: In %s, cannot write to MHI channel %p, len %d, err: %d\n", @@ -547,7 +523,6 @@ static int mhi_write(int id, unsigned char *buf, int len, int ctxt) return 0; fail: - dma_unmap_single(NULL, dma_addr, len, DMA_TO_DEVICE); return err; } @@ -585,14 +560,14 @@ static void mhi_notifier(struct mhi_cb_info *cb_info) return; } - index = GET_INFO_INDEX((int)cb_info->result->user_data); + index = GET_INFO_INDEX((uintptr_t)cb_info->result->user_data); if (index < 0 || index >= NUM_MHI_DEV) { pr_err_ratelimited("diag: In %s, invalid MHI index %d\n", __func__, index); return; } - type = GET_CH_TYPE((int)cb_info->result->user_data); + type = GET_CH_TYPE((uintptr_t)cb_info->result->user_data); switch (type) { case TYPE_MHI_READ_CH: ch = &diag_mhi[index].read_ch; @@ -647,9 +622,7 @@ static void mhi_notifier(struct mhi_cb_info *cb_info) &(diag_mhi[index].read_done_work)); break; } - dma_unmap_single(NULL, result->payload_buf, - result->bytes_xferd, DMA_TO_DEVICE); - buf = dma_to_virt(NULL, result->payload_buf); + buf = result->buf_addr; if (!buf) { pr_err_ratelimited("diag: In %s, unable to de-serialize the data\n", __func__); @@ -690,7 +663,7 @@ static int diag_mhi_register_ch(int id, struct diag_mhi_ch_t *ch) ctxt = SET_CH_CTXT(id, ch->type); ch->client_info.mhi_client_cb = mhi_notifier; return mhi_register_channel(&ch->hdl, ch->chan, 0, &ch->client_info, - (void *)ctxt); + (void *)(uintptr_t)ctxt); } int diag_mhi_init() diff --git a/drivers/char/diag/diagfwd_mhi.h b/drivers/char/diag/diagfwd_mhi.h index ef4e600ce353..8332efdf5efb 100644 --- a/drivers/char/diag/diagfwd_mhi.h +++ b/drivers/char/diag/diagfwd_mhi.h @@ -47,7 +47,6 @@ struct diag_mhi_buf_tbl_t { struct list_head link; unsigned char *buf; - dma_addr_t dma_addr; int len; }; |