aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-01-18 19:05:37 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2019-01-18 19:05:37 -0800
commitdc880a12f2add4cdf9b866b2dc6850074c828f94 (patch)
treee0bf49f4a38a1b68687615c89d32dc3b022d427d
parent26f7ba2ce05e0ccc219e8a9f76f8263af97d1016 (diff)
parent10ced02096303fc7dbca657666c9636c417f7156 (diff)
Merge "diag: Support dynamic switch between USB and PCIe interface"LE.UM.3.2.1-05000-SDX24
-rw-r--r--drivers/char/diag/Makefile3
-rw-r--r--drivers/char/diag/diag_debugfs.c10
-rw-r--r--drivers/char/diag/diag_mux.c53
-rw-r--r--drivers/char/diag/diag_mux.h3
-rw-r--r--drivers/char/diag/diag_pcie.c5
-rw-r--r--drivers/char/diag/diagchar.h3
-rw-r--r--drivers/char/diag/diagchar_core.c94
7 files changed, 99 insertions, 72 deletions
diff --git a/drivers/char/diag/Makefile b/drivers/char/diag/Makefile
index 86cc533c49d7..7282197c9e56 100644
--- a/drivers/char/diag/Makefile
+++ b/drivers/char/diag/Makefile
@@ -3,6 +3,5 @@ obj-$(CONFIG_DIAGFWD_BRIDGE_CODE) += diagfwd_bridge.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
-obj-$(CONFIG_DIAG_OVER_PCIE) += diag_pcie.o
obj-$(CONFIG_DIAG_USES_SMD) += diagfwd_smd.o
-diagchar-objs := diagchar_core.o diagchar_hdlc.o diagfwd.o diagfwd_glink.o diagfwd_peripheral.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
+diagchar-objs := diagchar_core.o diagchar_hdlc.o diagfwd.o diagfwd_glink.o diagfwd_peripheral.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 diag_pcie.o \ No newline at end of file
diff --git a/drivers/char/diag/diag_debugfs.c b/drivers/char/diag/diag_debugfs.c
index 6e0dba564b70..19b2b023e57a 100644
--- a/drivers/char/diag/diag_debugfs.c
+++ b/drivers/char/diag/diag_debugfs.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -44,9 +44,7 @@ static struct dentry *diag_dbgfs_dent;
static int diag_dbgfs_table_index;
static int diag_dbgfs_mempool_index;
static int diag_dbgfs_usbinfo_index;
-#ifdef CONFIG_DIAG_OVER_PCIE
static int diag_dbgfs_pcieinfo_index;
-#endif
static int diag_dbgfs_smdinfo_index;
static int diag_dbgfs_socketinfo_index;
static int diag_dbgfs_glinkinfo_index;
@@ -485,7 +483,6 @@ static ssize_t diag_dbgfs_read_usbinfo(struct file *file, char __user *ubuf,
return ret;
}
-#ifdef CONFIG_DIAG_OVER_PCIE
static ssize_t diag_dbgfs_read_pcieinfo(struct file *file, char __user *ubuf,
size_t count, loff_t *ppos)
{
@@ -545,7 +542,6 @@ static ssize_t diag_dbgfs_read_pcieinfo(struct file *file, char __user *ubuf,
kfree(buf);
return ret;
}
-#endif
#ifdef CONFIG_DIAG_USES_SMD
static ssize_t diag_dbgfs_read_smdinfo(struct file *file, char __user *ubuf,
@@ -1146,11 +1142,9 @@ const struct file_operations diag_dbgfs_usbinfo_ops = {
.read = diag_dbgfs_read_usbinfo,
};
-#ifdef CONFIG_DIAG_OVER_PCIE
const struct file_operations diag_dbgfs_pcieinfo_ops = {
.read = diag_dbgfs_read_pcieinfo,
};
-#endif
const struct file_operations diag_dbgfs_dcistats_ops = {
.read = diag_dbgfs_read_dcistats,
@@ -1211,12 +1205,10 @@ int diag_debugfs_init(void)
if (!entry)
goto err;
-#ifdef CONFIG_DIAG_OVER_PCIE
entry = debugfs_create_file("pcieinfo", 0444, diag_dbgfs_dent, 0,
&diag_dbgfs_pcieinfo_ops);
if (!entry)
goto err;
-#endif
entry = debugfs_create_file("dci_stats", 0444, diag_dbgfs_dent, 0,
&diag_dbgfs_dcistats_ops);
diff --git a/drivers/char/diag/diag_mux.c b/drivers/char/diag/diag_mux.c
index ae5917588d45..e742d08bd8a4 100644
--- a/drivers/char/diag/diag_mux.c
+++ b/drivers/char/diag/diag_mux.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -31,12 +31,6 @@
#include "diagfwd_peripheral.h"
#include "diag_ipc_logging.h"
-#ifdef CONFIG_DIAG_OVER_PCIE
-#define diag_mux_register_ops diag_pcie_register_ops
-#else
-#define diag_mux_register_ops diag_usb_register_ops
-#endif
-
struct diag_mux_state_t *diag_mux;
static struct diag_logger_t usb_logger;
static struct diag_logger_t md_logger;
@@ -58,7 +52,6 @@ static struct diag_logger_ops md_log_ops = {
.close_peripheral = diag_md_close_peripheral,
};
-#ifdef CONFIG_DIAG_OVER_PCIE
static struct diag_logger_ops pcie_log_ops = {
.open = diag_pcie_connect_all,
.close = diag_pcie_disconnect_all,
@@ -66,7 +59,6 @@ static struct diag_logger_ops pcie_log_ops = {
.write = diag_pcie_write,
.close_peripheral = NULL
};
-#endif
int diag_mux_init(void)
{
@@ -82,18 +74,16 @@ int diag_mux_init(void)
md_logger.mode = DIAG_MEMORY_DEVICE_MODE;
md_logger.log_ops = &md_log_ops;
diag_md_init();
-#ifdef CONFIG_DIAG_OVER_PCIE
pcie_logger.mode = DIAG_PCIE_MODE;
pcie_logger.log_ops = &pcie_log_ops;
diag_mux->pcie_ptr = &pcie_logger;
-#endif
/*
* Set USB logging as the default logger. This is the mode
* Diag should be in when it initializes.
*/
diag_mux->usb_ptr = &usb_logger;
diag_mux->md_ptr = &md_logger;
- switch (driver->transport_set) {
+ switch (driver->pcie_transport_def) {
case DIAG_ROUTE_TO_PCIE:
diag_mux->logger = &pcie_logger;
diag_mux->mode = DIAG_PCIE_MODE;
@@ -113,7 +103,6 @@ void diag_mux_exit(void)
kfree(diag_mux);
}
-#ifdef CONFIG_DIAG_OVER_PCIE
int diag_pcie_register_ops(int proc, int ctx, struct diag_mux_ops *ops)
{
int err = 0;
@@ -127,22 +116,13 @@ int diag_pcie_register_ops(int proc, int ctx, struct diag_mux_ops *ops)
pcie_logger.ops[proc] = ops;
err = diag_pcie_register(proc, ctx, ops);
if (err) {
- driver->transport_set = DIAG_ROUTE_TO_USB;
- diag_mux->logger = &usb_logger;
- diag_mux->mode = DIAG_USB_MODE;
- usb_logger.ops[proc] = ops;
- err = diag_usb_register(proc, ctx, ops);
- if (err) {
- pr_err("diag: MUX: unable to register usb operations for proc: %d, err: %d\n",
- proc, err);
- return err;
- }
pr_err("diag: MUX: unable to register pcie operations for proc: %d, err: %d\n",
proc, err);
+ return err;
}
return 0;
}
-#else
+
int diag_usb_register_ops(int proc, int ctx, struct diag_mux_ops *ops)
{
int err = 0;
@@ -161,7 +141,6 @@ int diag_usb_register_ops(int proc, int ctx, struct diag_mux_ops *ops)
}
return 0;
}
-#endif
int diag_mux_register(int proc, int ctx, struct diag_mux_ops *ops)
{
@@ -172,9 +151,17 @@ int diag_mux_register(int proc, int ctx, struct diag_mux_ops *ops)
if (proc < 0 || proc >= NUM_MUX_PROC)
return 0;
- err = diag_mux_register_ops(proc, ctx, ops);
- if (err)
+ err = diag_pcie_register_ops(proc, ctx, ops);
+ if (err) {
+ pr_err("diag: MUX: unable to register PCIe operations, continuing with USB registrations for proc: %d, err: %d\n",
+ proc, err);
+ }
+ err = diag_usb_register_ops(proc, ctx, ops);
+ if (err) {
+ pr_err("diag: MUX: unable to register USB operations for proc: %d, err: %d\n",
+ proc, err);
return err;
+ }
md_logger.ops[proc] = ops;
err = diag_md_register(proc, ctx, ops);
if (err) {
@@ -182,7 +169,6 @@ int diag_mux_register(int proc, int ctx, struct diag_mux_ops *ops)
proc, err);
return err;
}
-
return 0;
}
@@ -308,6 +294,10 @@ int diag_mux_switch_logging(int *req_mode, int *peripheral_mask)
diag_mux->pcie_ptr->log_ops->close();
diag_mux->logger = diag_mux->md_ptr;
diag_mux->md_ptr->log_ops->open();
+ } else if (*req_mode == DIAG_USB_MODE) {
+ diag_mux->pcie_ptr->log_ops->close();
+ diag_mux->logger = diag_mux->usb_ptr;
+ diag_mux->usb_ptr->log_ops->open();
} else if (*req_mode == DIAG_MULTI_MODE) {
diag_mux->md_ptr->log_ops->open();
diag_mux->logger = NULL;
@@ -318,6 +308,10 @@ int diag_mux_switch_logging(int *req_mode, int *peripheral_mask)
diag_mux->usb_ptr->log_ops->close();
diag_mux->logger = diag_mux->md_ptr;
diag_mux->md_ptr->log_ops->open();
+ } else if (*req_mode == DIAG_PCIE_MODE) {
+ diag_mux->usb_ptr->log_ops->close();
+ diag_mux->logger = diag_mux->pcie_ptr;
+ diag_mux->pcie_ptr->log_ops->open();
} else if (*req_mode == DIAG_MULTI_MODE) {
diag_mux->md_ptr->log_ops->open();
diag_mux->logger = NULL;
@@ -333,7 +327,8 @@ int diag_mux_switch_logging(int *req_mode, int *peripheral_mask)
diag_mux->logger = diag_mux->pcie_ptr;
diag_mux->pcie_ptr->log_ops->open();
} else if (*req_mode == DIAG_MULTI_MODE) {
- if (driver->transport_set == DIAG_ROUTE_TO_PCIE)
+ if (driver->pcie_transport_def == DIAG_ROUTE_TO_PCIE ||
+ driver->transport_set == DIAG_ROUTE_TO_PCIE)
diag_mux->pcie_ptr->log_ops->open();
else
diag_mux->usb_ptr->log_ops->open();
diff --git a/drivers/char/diag/diag_mux.h b/drivers/char/diag/diag_mux.h
index dac08b313324..c822f71b5aa6 100644
--- a/drivers/char/diag/diag_mux.h
+++ b/drivers/char/diag/diag_mux.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014-2016, 2018 The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2016, 2018-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -77,5 +77,4 @@ int diag_mux_close_all(void);
int diag_mux_switch_logging(int *new_mode, int *peripheral_mask);
int diag_pcie_register_ops(int proc, int ctx, struct diag_mux_ops *ops);
int diag_usb_register_ops(int proc, int ctx, struct diag_mux_ops *ops);
-int diag_mux_register_ops(int proc, int ctx, struct diag_mux_ops *ops);
#endif
diff --git a/drivers/char/diag/diag_pcie.c b/drivers/char/diag/diag_pcie.c
index 8f535732707e..bf048c1e0b27 100644
--- a/drivers/char/diag/diag_pcie.c
+++ b/drivers/char/diag/diag_pcie.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -85,6 +85,7 @@ void diag_pcie_read_work_fn(struct work_struct *work)
ureq.mode = IPA_DMA_SYNC;
ureq.buf = pcie_info->in_chan_attr.read_buffer;
ureq.len = pcie_info->in_chan_attr.read_buffer_size;
+ ureq.transfer_len = 0;
bytes_avail = mhi_dev_read_channel(&ureq);
if (bytes_avail < 0)
return;
@@ -319,7 +320,7 @@ int diag_pcie_write(int id, unsigned char *buf, int len, int ctxt)
pcie_info = &diag_pcie[id];
if (len > pcie_info->out_chan_attr.max_pkt_size) {
- DIAG_LOG(DIAG_DEBUG_MUX, "len: %d, max_size: %d\n",
+ DIAG_LOG(DIAG_DEBUG_MUX, "len: %d, max_size: %zu\n",
len, pcie_info->out_chan_attr.max_pkt_size);
return diag_pcie_write_ext(pcie_info, buf, len, ctxt);
}
diff --git a/drivers/char/diag/diagchar.h b/drivers/char/diag/diagchar.h
index 2e87d51dd2bf..31a8c3b85bd9 100644
--- a/drivers/char/diag/diagchar.h
+++ b/drivers/char/diag/diagchar.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2008-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -595,6 +595,7 @@ struct diagchar_dev {
uint32_t cmd_reg_count;
struct mutex diagfwd_channel_mutex[NUM_PERIPHERALS];
int transport_set;
+ int pcie_transport_def;
/* Sizes that reflect memory pool sizes */
unsigned int poolsize;
unsigned int poolsize_hdlc;
diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c
index cb041950fa92..2fc6c58d12eb 100644
--- a/drivers/char/diag/diagchar_core.c
+++ b/drivers/char/diag/diagchar_core.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2008-2019, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -454,8 +454,19 @@ static void diag_close_logging_process(const int pid)
session_info = diag_md_session_get_pid(pid);
if (!session_info) {
mutex_unlock(&driver->md_session_lock);
+ if (driver->pcie_transport_def == DIAG_ROUTE_TO_PCIE)
+ params.req_mode = PCIE_MODE;
+ else
+ params.req_mode = USB_MODE;
+ params.mode_param = 0;
+ params.pd_mask = 0;
+ params.peripheral_mask = DIAG_CON_ALL;
+ mutex_lock(&driver->diagchar_mutex);
+ diag_switch_logging(&params);
+ mutex_unlock(&driver->diagchar_mutex);
return;
}
+
session_mask = session_info->peripheral_mask;
mutex_unlock(&driver->md_session_lock);
@@ -469,10 +480,12 @@ static void diag_close_logging_process(const int pid)
for (i = 0; i < NUM_MD_SESSIONS; i++)
if (MD_PERIPHERAL_MASK(i) & session_mask)
diag_mux_close_peripheral(DIAG_LOCAL_PROC, i);
+
if (driver->transport_set == DIAG_ROUTE_TO_PCIE)
params.req_mode = PCIE_MODE;
else
params.req_mode = USB_MODE;
+
params.mode_param = 0;
params.pd_mask = 0;
params.peripheral_mask = p_mask;
@@ -1554,10 +1567,15 @@ static int diag_md_session_check(int curr_mode, int req_mode,
req_mode != DIAG_PCIE_MODE)
return -EINVAL;
- if (req_mode == DIAG_USB_MODE || req_mode == DIAG_PCIE_MODE) {
- if (curr_mode == req_mode)
- return 0;
+ if (curr_mode == req_mode)
+ return 0;
+ if ((req_mode == DIAG_USB_MODE && curr_mode == DIAG_PCIE_MODE) ||
+ (req_mode == DIAG_PCIE_MODE && curr_mode == DIAG_USB_MODE)) {
+ *change_mode = 1;
+ return 0;
+ } else if ((req_mode == DIAG_USB_MODE || req_mode == DIAG_PCIE_MODE)
+ && curr_mode == DIAG_MEMORY_DEVICE_MODE) {
mutex_lock(&driver->md_session_lock);
if (driver->md_session_mode == DIAG_MD_NONE
&& driver->md_session_mask == 0 && driver->logging_mask) {
@@ -1607,7 +1625,7 @@ static int diag_md_session_check(int curr_mode, int req_mode,
/* If all peripherals are being set to USB Mode, call close */
if (~change_mask & peripheral_mask) {
err = diag_md_peripheral_switch(current->tgid,
- change_mask, DIAG_USB_MODE);
+ change_mask, req_mode);
} else
diag_md_session_close(current->tgid);
mutex_unlock(&driver->md_session_lock);
@@ -1631,7 +1649,7 @@ static int diag_md_session_check(int curr_mode, int req_mode,
mutex_unlock(&driver->md_session_lock);
return -EINVAL;
}
- if (driver->transport_set == DIAG_ROUTE_TO_PCIE)
+ if (driver->pcie_transport_def == DIAG_ROUTE_TO_PCIE)
err = diag_md_peripheral_switch(current->tgid,
change_mask, DIAG_PCIE_MODE);
else
@@ -1865,6 +1883,15 @@ static int diag_switch_logging(struct diag_logging_mode_param_t *param)
}
driver->logging_mode = new_mode;
driver->logging_mask = peripheral_mask;
+ if (new_mode == DIAG_PCIE_MODE) {
+ driver->transport_set = DIAG_ROUTE_TO_PCIE;
+ diagmem_setsize(POOL_TYPE_MUX_APPS, itemsize_pcie_apps,
+ poolsize_pcie_apps + 1 + (NUM_PERIPHERALS * 6));
+ } else if (new_mode == DIAG_USB_MODE) {
+ driver->transport_set = DIAG_ROUTE_TO_USB;
+ diagmem_setsize(POOL_TYPE_MUX_APPS, itemsize_usb_apps,
+ poolsize_usb_apps + 1 + (NUM_PERIPHERALS * 6));
+ }
DIAG_LOG(DIAG_DEBUG_USERSPACE,
"Switch logging to %d mask:%0x\n", new_mode, peripheral_mask);
@@ -3952,6 +3979,39 @@ static int diagchar_cleanup(void)
return 0;
}
+#ifdef CONFIG_DIAG_OVER_PCIE
+static void diag_init_transport(void)
+{
+ driver->transport_set = DIAG_ROUTE_TO_PCIE;
+ driver->pcie_transport_def = DIAG_ROUTE_TO_PCIE;
+ driver->logging_mode = DIAG_PCIE_MODE;
+ /*
+ * POOL_TYPE_MUX_APPS is for the buffers in the Diag MUX layer.
+ * The number of buffers encompasses Diag data generated on
+ * the Apss processor + 1 for the responses generated
+ * exclusively on the Apps processor + data from data channels
+ *(4 channels periperipheral) + data from command channels (2)
+ */
+ diagmem_setsize(POOL_TYPE_MUX_APPS, itemsize_pcie_apps,
+ poolsize_pcie_apps + 1 + (NUM_PERIPHERALS * 6));
+}
+#else
+static void diag_init_transport(void)
+{
+ driver->transport_set = DIAG_ROUTE_TO_USB;
+ driver->pcie_transport_def = DIAG_ROUTE_TO_USB;
+ driver->logging_mode = DIAG_USB_MODE;
+ /*
+ * POOL_TYPE_MUX_APPS is for the buffers in the Diag MUX layer.
+ * The number of buffers encompasses Diag data generated on
+ * the Apss processor + 1 for the responses generated
+ * exclusively on the Apps processor + data from data channels
+ *(4 channels periperipheral) + data from command channels (2)
+ */
+ diagmem_setsize(POOL_TYPE_MUX_APPS, itemsize_usb_apps,
+ poolsize_usb_apps + 1 + (NUM_PERIPHERALS * 6));
+}
+#endif
static int __init diagchar_init(void)
{
dev_t dev;
@@ -3965,11 +4025,7 @@ static int __init diagchar_init(void)
kmemleak_not_leak(driver);
timer_in_progress = 0;
-#ifdef CONFIG_DIAG_OVER_PCIE
- driver->transport_set = DIAG_ROUTE_TO_PCIE;
-#else
- driver->transport_set = DIAG_ROUTE_TO_USB;
-#endif
+ diag_init_transport();
DIAG_LOG(DIAG_DEBUG_MUX, "Transport type set to %d\n",
driver->transport_set);
driver->delayed_rsp_id = 0;
@@ -3984,22 +4040,6 @@ static int __init diagchar_init(void)
driver->poolsize_dci = poolsize_dci;
driver->poolsize_user = poolsize_user;
driver->num_clients = max_clients;
- if (driver->transport_set == DIAG_ROUTE_TO_PCIE) {
- driver->logging_mode = DIAG_PCIE_MODE;
- /*
- * POOL_TYPE_MUX_APPS is for the buffers in the Diag MUX layer.
- * The number of buffers encompasses Diag data generated on
- * the Apss processor + 1 for the responses generated
- * exclusively on the Apps processor + data from data channels
- *(4 channels periperipheral) + data from command channels (2)
- */
- diagmem_setsize(POOL_TYPE_MUX_APPS, itemsize_pcie_apps,
- poolsize_pcie_apps + 1 + (NUM_PERIPHERALS * 6));
- } else {
- driver->logging_mode = DIAG_USB_MODE;
- diagmem_setsize(POOL_TYPE_MUX_APPS, itemsize_usb_apps,
- poolsize_usb_apps + 1 + (NUM_PERIPHERALS * 6));
- }
for (i = 0; i < NUM_UPD; i++) {
driver->pd_logging_mode[i] = 0;