summaryrefslogtreecommitdiff
path: root/drivers/char/diag
diff options
context:
space:
mode:
authorSreelakshmi Gownipalli <sgownipa@codeaurora.org>2015-10-26 11:30:39 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:23:49 -0700
commit9e1875b6945e251ada3f84ad9906b92b5d698694 (patch)
tree70e626ed60870ccfd19f86636734ea8994041589 /drivers/char/diag
parent750e7e411590f45f6187bf02e6865d8159804507 (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/Kconfig2
-rw-r--r--drivers/char/diag/Makefile6
-rw-r--r--drivers/char/diag/diag_debugfs.c31
-rw-r--r--drivers/char/diag/diagchar_core.c3
-rw-r--r--drivers/char/diag/diagfwd_bridge.c8
-rw-r--r--drivers/char/diag/diagfwd_mhi.c59
-rw-r--r--drivers/char/diag/diagfwd_mhi.h1
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;
};