Loading drivers/char/diag/diag_dci.c +9 −1 Original line number Diff line number Diff line Loading @@ -73,6 +73,13 @@ struct dci_ops_tbl_t dci_ops_tbl[NUM_DCI_PROC] = { .send_event_mask = diag_send_dci_event_mask_remote, .peripheral_status = 0, .mempool = POOL_TYPE_MDM_DCI_WRITE, }, { .ctx = DIAGFWD_MDM_DCI_2, .send_log_mask = diag_send_dci_log_mask_remote, .send_event_mask = diag_send_dci_event_mask_remote, .peripheral_status = 0, .mempool = POOL_TYPE_MDM2_DCI_WRITE, } #endif }; Loading Loading @@ -593,7 +600,7 @@ void diag_process_remote_dci_read_data(int index, void *buf, int recd_bytes) * (1 byte) + version (1 byte) + length (2 bytes) */ err = diag_process_single_dci_pkt(buf + 4, dci_pkt_len, DCI_REMOTE_DATA, DCI_MDM_PROC); DCI_REMOTE_DATA, token); if (err) break; read_bytes += header_len + dci_pkt_len; Loading Loading @@ -2963,6 +2970,7 @@ int diag_dci_register_client(struct diag_dci_reg_tbl_t *reg_entry) new_entry->num_buffers = NUM_DCI_PERIPHERALS; break; case DCI_MDM_PROC: case DCI_MDM_2_PROC: new_entry->num_buffers = 1; break; } Loading drivers/char/diag/diag_dci.h +3 −2 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. */ #ifndef DIAG_DCI_H #define DIAG_DCI_H Loading Loading @@ -58,7 +58,8 @@ extern unsigned int dci_max_clients; #define DCI_LOCAL_PROC 0 #define DCI_REMOTE_BASE 1 #define DCI_MDM_PROC DCI_REMOTE_BASE #define DCI_REMOTE_LAST (DCI_REMOTE_BASE + 1) #define DCI_MDM_2_PROC (DCI_REMOTE_BASE + 1) #define DCI_REMOTE_LAST (DCI_REMOTE_BASE + 2) #ifndef CONFIG_DIAGFWD_BRIDGE_CODE #define NUM_DCI_PROC 1 Loading drivers/char/diag/diag_debugfs.c +31 −25 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2011-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved. */ #ifdef CONFIG_DEBUG_FS Loading Loading @@ -789,7 +789,8 @@ static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf, { char *buf = NULL; int ret = 0; int i = 0; int ch_idx = 0; int dev_idx = 0; unsigned int buf_size; unsigned int bytes_remaining = 0; unsigned int bytes_written = 0; Loading @@ -810,9 +811,13 @@ static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf, buf_size = ksize(buf); bytes_remaining = buf_size; for (i = diag_dbgfs_mhiinfo_index; i < NUM_MHI_DEV; i++) { mhi_info = &diag_mhi[i]; bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining, for (dev_idx = diag_dbgfs_mhiinfo_index; dev_idx < NUM_MHI_DEV; dev_idx++) { for (ch_idx = diag_dbgfs_mhiinfo_index; ch_idx < NUM_MHI_DEV; ch_idx++) { mhi_info = &diag_mhi[dev_idx][ch_idx]; bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining, "id: %d\n" "name: %s\n" "enabled %d\n" Loading Loading @@ -843,7 +848,8 @@ static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf, if (bytes_remaining < bytes_written) break; } diag_dbgfs_mhiinfo_index = i+1; } diag_dbgfs_mhiinfo_index = dev_idx + 1; *ppos = 0; ret = simple_read_from_buffer(ubuf, count, ppos, buf, bytes_in_buffer); Loading drivers/char/diag/diagfwd_bridge.c +23 −10 Original line number Diff line number Diff line Loading @@ -45,9 +45,9 @@ struct diagfwd_bridge_info bridge_info[NUM_REMOTE_DEV] = { .dci_wq = NULL, }, { .id = DIAGFWD_SMUX, .id = DIAGFWD_MDM2, .type = DIAG_DATA_TYPE, .name = "SMUX", .name = "MDM_2", .inited = 0, .ctxt = 0, .dci_read_ptr = NULL, Loading @@ -68,6 +68,18 @@ struct diagfwd_bridge_info bridge_info[NUM_REMOTE_DEV] = { .dci_read_len = 0, .dci_wq = NULL, }, { .id = DIAGFWD_MDM_DCI_2, .type = DIAG_DCI_TYPE, .name = "MDM_DCI_2", .inited = 0, .ctxt = 0, .dci_read_ptr = NULL, .dev_ops = NULL, .dci_read_buf = NULL, .dci_read_len = 0, .dci_wq = NULL, }, }; static int diagfwd_bridge_mux_connect(int id, int mode) Loading @@ -75,7 +87,7 @@ static int diagfwd_bridge_mux_connect(int id, int mode) if (id < 0 || id >= NUM_REMOTE_DEV) return -EINVAL; if (bridge_info[id].dev_ops && bridge_info[id].dev_ops->open) bridge_info[id].dev_ops->open(bridge_info[id].ctxt); bridge_info[id].dev_ops->open(id, bridge_info[id].ctxt); return 0; } Loading @@ -101,7 +113,7 @@ static int diagfwd_bridge_mux_write_done(unsigned char *buf, int len, return -EINVAL; ch = &bridge_info[buf_ctx]; if (ch->dev_ops && ch->dev_ops->fwd_complete) ch->dev_ops->fwd_complete(ch->ctxt, buf, len, 0); ch->dev_ops->fwd_complete(ch->id, ch->ctxt, buf, len, 0); return 0; } Loading @@ -122,7 +134,7 @@ static void bridge_dci_read_work_fn(struct work_struct *work) diag_process_remote_dci_read_data(ch->id, ch->dci_read_buf, ch->dci_read_len); if (ch->dev_ops && ch->dev_ops->fwd_complete) { ch->dev_ops->fwd_complete(ch->ctxt, ch->dci_read_ptr, ch->dev_ops->fwd_complete(ch->id, ch->ctxt, ch->dci_read_ptr, ch->dci_read_len, 0); } } Loading @@ -134,7 +146,8 @@ int diagfwd_bridge_register(int id, int ctxt, struct diag_remote_dev_ops *ops) char wq_name[DIAG_BRIDGE_NAME_SZ + 10]; if (!ops) { pr_err("diag: Invalid pointers ops: %pK ctxt: %d\n", ops, ctxt); pr_err("diag: Invalid pointers ops: %pK ctxt: %d id: %d\n", ops, ctxt, id); return -EINVAL; } Loading Loading @@ -201,7 +214,7 @@ int diag_remote_dev_read_done(int id, unsigned char *buf, int len) if (ch->type == DIAG_DATA_TYPE) { err = diag_mux_write(BRIDGE_TO_MUX(id), buf, len, id); if (ch->dev_ops && ch->dev_ops->queue_read) ch->dev_ops->queue_read(ch->ctxt); ch->dev_ops->queue_read(id, ch->ctxt); return err; } /* Loading Loading @@ -277,7 +290,7 @@ int diagfwd_bridge_close(int id) if (id < 0 || id >= NUM_REMOTE_DEV) return -EINVAL; if (bridge_info[id].dev_ops && bridge_info[id].dev_ops->close) return bridge_info[id].dev_ops->close(bridge_info[id].ctxt); return bridge_info[id].dev_ops->close(id, bridge_info[id].ctxt); return 0; } Loading @@ -286,7 +299,7 @@ int diagfwd_bridge_write(int id, unsigned char *buf, int len) if (id < 0 || id >= NUM_REMOTE_DEV) return -EINVAL; if (bridge_info[id].dev_ops && bridge_info[id].dev_ops->write) { return bridge_info[id].dev_ops->write(bridge_info[id].ctxt, return bridge_info[id].dev_ops->write(id, bridge_info[id].ctxt, buf, len, 0); } return 0; Loading @@ -301,7 +314,7 @@ uint16_t diag_get_remote_device_mask(void) if (bridge_info[i].inited && bridge_info[i].type == DIAG_DATA_TYPE && (bridge_info[i].dev_ops->remote_proc_check && bridge_info[i].dev_ops->remote_proc_check())) { bridge_info[i].dev_ops->remote_proc_check(i))) { remote_dev |= 1 << i; } } Loading drivers/char/diag/diagfwd_bridge.h +12 −9 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (c) 2012-2014, 2017-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2014, 2017-2019, The Linux Foundation. All rights reserved. */ #ifndef DIAGFWD_BRIDGE_H Loading @@ -10,22 +10,25 @@ * bottom half of this list. */ #define DIAGFWD_MDM 0 #define DIAGFWD_SMUX 1 #define DIAGFWD_MDM2 1 #define NUM_REMOTE_DATA_DEV 2 #define DIAGFWD_MDM_DCI NUM_REMOTE_DATA_DEV #define NUM_REMOTE_DCI_DEV (DIAGFWD_MDM_DCI - NUM_REMOTE_DATA_DEV + 1) #define DIAGFWD_MDM_DCI_2 (NUM_REMOTE_DATA_DEV + 1) #define NUM_REMOTE_DCI_DEV (DIAGFWD_MDM_DCI_2 - NUM_REMOTE_DATA_DEV + 1) #define NUM_REMOTE_DEV (NUM_REMOTE_DATA_DEV + NUM_REMOTE_DCI_DEV) #define DIAG_BRIDGE_NAME_SZ 24 #define DIAG_BRIDGE_GET_NAME(x) (bridge_info[x].name) struct diag_remote_dev_ops { int (*open)(int id); int (*close)(int id); int (*queue_read)(int id); int (*write)(int id, unsigned char *buf, int len, int ctxt); int (*fwd_complete)(int id, unsigned char *buf, int len, int ctxt); int (*remote_proc_check)(void); int (*open)(int id, int ch); int (*close)(int id, int ch); int (*queue_read)(int id, int ch); int (*write)(int id, int ch, unsigned char *buf, int len, int ctxt); int (*fwd_complete)(int id, int ch, unsigned char *buf, int len, int ctxt); int (*remote_proc_check)(int id); }; struct diagfwd_bridge_info { Loading Loading
drivers/char/diag/diag_dci.c +9 −1 Original line number Diff line number Diff line Loading @@ -73,6 +73,13 @@ struct dci_ops_tbl_t dci_ops_tbl[NUM_DCI_PROC] = { .send_event_mask = diag_send_dci_event_mask_remote, .peripheral_status = 0, .mempool = POOL_TYPE_MDM_DCI_WRITE, }, { .ctx = DIAGFWD_MDM_DCI_2, .send_log_mask = diag_send_dci_log_mask_remote, .send_event_mask = diag_send_dci_event_mask_remote, .peripheral_status = 0, .mempool = POOL_TYPE_MDM2_DCI_WRITE, } #endif }; Loading Loading @@ -593,7 +600,7 @@ void diag_process_remote_dci_read_data(int index, void *buf, int recd_bytes) * (1 byte) + version (1 byte) + length (2 bytes) */ err = diag_process_single_dci_pkt(buf + 4, dci_pkt_len, DCI_REMOTE_DATA, DCI_MDM_PROC); DCI_REMOTE_DATA, token); if (err) break; read_bytes += header_len + dci_pkt_len; Loading Loading @@ -2963,6 +2970,7 @@ int diag_dci_register_client(struct diag_dci_reg_tbl_t *reg_entry) new_entry->num_buffers = NUM_DCI_PERIPHERALS; break; case DCI_MDM_PROC: case DCI_MDM_2_PROC: new_entry->num_buffers = 1; break; } Loading
drivers/char/diag/diag_dci.h +3 −2 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. */ #ifndef DIAG_DCI_H #define DIAG_DCI_H Loading Loading @@ -58,7 +58,8 @@ extern unsigned int dci_max_clients; #define DCI_LOCAL_PROC 0 #define DCI_REMOTE_BASE 1 #define DCI_MDM_PROC DCI_REMOTE_BASE #define DCI_REMOTE_LAST (DCI_REMOTE_BASE + 1) #define DCI_MDM_2_PROC (DCI_REMOTE_BASE + 1) #define DCI_REMOTE_LAST (DCI_REMOTE_BASE + 2) #ifndef CONFIG_DIAGFWD_BRIDGE_CODE #define NUM_DCI_PROC 1 Loading
drivers/char/diag/diag_debugfs.c +31 −25 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2011-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2011-2019, The Linux Foundation. All rights reserved. */ #ifdef CONFIG_DEBUG_FS Loading Loading @@ -789,7 +789,8 @@ static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf, { char *buf = NULL; int ret = 0; int i = 0; int ch_idx = 0; int dev_idx = 0; unsigned int buf_size; unsigned int bytes_remaining = 0; unsigned int bytes_written = 0; Loading @@ -810,9 +811,13 @@ static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf, buf_size = ksize(buf); bytes_remaining = buf_size; for (i = diag_dbgfs_mhiinfo_index; i < NUM_MHI_DEV; i++) { mhi_info = &diag_mhi[i]; bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining, for (dev_idx = diag_dbgfs_mhiinfo_index; dev_idx < NUM_MHI_DEV; dev_idx++) { for (ch_idx = diag_dbgfs_mhiinfo_index; ch_idx < NUM_MHI_DEV; ch_idx++) { mhi_info = &diag_mhi[dev_idx][ch_idx]; bytes_written = scnprintf(buf+bytes_in_buffer, bytes_remaining, "id: %d\n" "name: %s\n" "enabled %d\n" Loading Loading @@ -843,7 +848,8 @@ static ssize_t diag_dbgfs_read_mhiinfo(struct file *file, char __user *ubuf, if (bytes_remaining < bytes_written) break; } diag_dbgfs_mhiinfo_index = i+1; } diag_dbgfs_mhiinfo_index = dev_idx + 1; *ppos = 0; ret = simple_read_from_buffer(ubuf, count, ppos, buf, bytes_in_buffer); Loading
drivers/char/diag/diagfwd_bridge.c +23 −10 Original line number Diff line number Diff line Loading @@ -45,9 +45,9 @@ struct diagfwd_bridge_info bridge_info[NUM_REMOTE_DEV] = { .dci_wq = NULL, }, { .id = DIAGFWD_SMUX, .id = DIAGFWD_MDM2, .type = DIAG_DATA_TYPE, .name = "SMUX", .name = "MDM_2", .inited = 0, .ctxt = 0, .dci_read_ptr = NULL, Loading @@ -68,6 +68,18 @@ struct diagfwd_bridge_info bridge_info[NUM_REMOTE_DEV] = { .dci_read_len = 0, .dci_wq = NULL, }, { .id = DIAGFWD_MDM_DCI_2, .type = DIAG_DCI_TYPE, .name = "MDM_DCI_2", .inited = 0, .ctxt = 0, .dci_read_ptr = NULL, .dev_ops = NULL, .dci_read_buf = NULL, .dci_read_len = 0, .dci_wq = NULL, }, }; static int diagfwd_bridge_mux_connect(int id, int mode) Loading @@ -75,7 +87,7 @@ static int diagfwd_bridge_mux_connect(int id, int mode) if (id < 0 || id >= NUM_REMOTE_DEV) return -EINVAL; if (bridge_info[id].dev_ops && bridge_info[id].dev_ops->open) bridge_info[id].dev_ops->open(bridge_info[id].ctxt); bridge_info[id].dev_ops->open(id, bridge_info[id].ctxt); return 0; } Loading @@ -101,7 +113,7 @@ static int diagfwd_bridge_mux_write_done(unsigned char *buf, int len, return -EINVAL; ch = &bridge_info[buf_ctx]; if (ch->dev_ops && ch->dev_ops->fwd_complete) ch->dev_ops->fwd_complete(ch->ctxt, buf, len, 0); ch->dev_ops->fwd_complete(ch->id, ch->ctxt, buf, len, 0); return 0; } Loading @@ -122,7 +134,7 @@ static void bridge_dci_read_work_fn(struct work_struct *work) diag_process_remote_dci_read_data(ch->id, ch->dci_read_buf, ch->dci_read_len); if (ch->dev_ops && ch->dev_ops->fwd_complete) { ch->dev_ops->fwd_complete(ch->ctxt, ch->dci_read_ptr, ch->dev_ops->fwd_complete(ch->id, ch->ctxt, ch->dci_read_ptr, ch->dci_read_len, 0); } } Loading @@ -134,7 +146,8 @@ int diagfwd_bridge_register(int id, int ctxt, struct diag_remote_dev_ops *ops) char wq_name[DIAG_BRIDGE_NAME_SZ + 10]; if (!ops) { pr_err("diag: Invalid pointers ops: %pK ctxt: %d\n", ops, ctxt); pr_err("diag: Invalid pointers ops: %pK ctxt: %d id: %d\n", ops, ctxt, id); return -EINVAL; } Loading Loading @@ -201,7 +214,7 @@ int diag_remote_dev_read_done(int id, unsigned char *buf, int len) if (ch->type == DIAG_DATA_TYPE) { err = diag_mux_write(BRIDGE_TO_MUX(id), buf, len, id); if (ch->dev_ops && ch->dev_ops->queue_read) ch->dev_ops->queue_read(ch->ctxt); ch->dev_ops->queue_read(id, ch->ctxt); return err; } /* Loading Loading @@ -277,7 +290,7 @@ int diagfwd_bridge_close(int id) if (id < 0 || id >= NUM_REMOTE_DEV) return -EINVAL; if (bridge_info[id].dev_ops && bridge_info[id].dev_ops->close) return bridge_info[id].dev_ops->close(bridge_info[id].ctxt); return bridge_info[id].dev_ops->close(id, bridge_info[id].ctxt); return 0; } Loading @@ -286,7 +299,7 @@ int diagfwd_bridge_write(int id, unsigned char *buf, int len) if (id < 0 || id >= NUM_REMOTE_DEV) return -EINVAL; if (bridge_info[id].dev_ops && bridge_info[id].dev_ops->write) { return bridge_info[id].dev_ops->write(bridge_info[id].ctxt, return bridge_info[id].dev_ops->write(id, bridge_info[id].ctxt, buf, len, 0); } return 0; Loading @@ -301,7 +314,7 @@ uint16_t diag_get_remote_device_mask(void) if (bridge_info[i].inited && bridge_info[i].type == DIAG_DATA_TYPE && (bridge_info[i].dev_ops->remote_proc_check && bridge_info[i].dev_ops->remote_proc_check())) { bridge_info[i].dev_ops->remote_proc_check(i))) { remote_dev |= 1 << i; } } Loading
drivers/char/diag/diagfwd_bridge.h +12 −9 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (c) 2012-2014, 2017-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2014, 2017-2019, The Linux Foundation. All rights reserved. */ #ifndef DIAGFWD_BRIDGE_H Loading @@ -10,22 +10,25 @@ * bottom half of this list. */ #define DIAGFWD_MDM 0 #define DIAGFWD_SMUX 1 #define DIAGFWD_MDM2 1 #define NUM_REMOTE_DATA_DEV 2 #define DIAGFWD_MDM_DCI NUM_REMOTE_DATA_DEV #define NUM_REMOTE_DCI_DEV (DIAGFWD_MDM_DCI - NUM_REMOTE_DATA_DEV + 1) #define DIAGFWD_MDM_DCI_2 (NUM_REMOTE_DATA_DEV + 1) #define NUM_REMOTE_DCI_DEV (DIAGFWD_MDM_DCI_2 - NUM_REMOTE_DATA_DEV + 1) #define NUM_REMOTE_DEV (NUM_REMOTE_DATA_DEV + NUM_REMOTE_DCI_DEV) #define DIAG_BRIDGE_NAME_SZ 24 #define DIAG_BRIDGE_GET_NAME(x) (bridge_info[x].name) struct diag_remote_dev_ops { int (*open)(int id); int (*close)(int id); int (*queue_read)(int id); int (*write)(int id, unsigned char *buf, int len, int ctxt); int (*fwd_complete)(int id, unsigned char *buf, int len, int ctxt); int (*remote_proc_check)(void); int (*open)(int id, int ch); int (*close)(int id, int ch); int (*queue_read)(int id, int ch); int (*write)(int id, int ch, unsigned char *buf, int len, int ctxt); int (*fwd_complete)(int id, int ch, unsigned char *buf, int len, int ctxt); int (*remote_proc_check)(int id); }; struct diagfwd_bridge_info { Loading