Loading drivers/char/diag/diagchar.h +10 −0 Original line number Diff line number Diff line Loading @@ -144,6 +144,7 @@ #define DIAG_GET_DIAG_ID 0x222 #define DIAG_SWITCH_COMMAND 0x081B #define DIAG_BUFFERING_MODE 0x080C #define DIAG_QUERY_TRANSPORT 0x0064 #define DIAG_CMD_OP_LOG_DISABLE 0 #define DIAG_CMD_OP_GET_LOG_RANGE 1 Loading Loading @@ -401,6 +402,15 @@ struct diag_cmd_time_sync_switch_rsp_t { uint8_t persist_time_status; }; struct diag_query_transport_req_t { struct diag_pkt_header_t header; }; struct diag_query_transport_rsp_t { struct diag_pkt_header_t header; uint8_t transport; }; struct diag_cmd_reg_entry_t { uint16_t cmd_code; uint16_t subsys_id; Loading drivers/char/diag/diagfwd.c +36 −0 Original line number Diff line number Diff line Loading @@ -769,6 +769,30 @@ int diag_process_diag_id_query_cmd(unsigned char *src_buf, int src_len, memcpy(dest_buf, &rsp, rsp_len); return write_len; } int diag_process_diag_transport_query_cmd(unsigned char *src_buf, int src_len, unsigned char *dest_buf, int dest_len) { struct diag_query_transport_req_t *req; struct diag_query_transport_rsp_t rsp; if (!src_buf || !dest_buf || src_len <= 0 || dest_len <= 0 || src_len < sizeof(struct diag_query_transport_req_t) || sizeof(rsp) > dest_len) { pr_err("diag: Invalid input in %s, src_buf: %pK, src_len: %d, dest_buf: %pK, dest_len: %d", __func__, src_buf, src_len, dest_buf, dest_len); return -EINVAL; } req = (struct diag_query_transport_req_t *)src_buf; rsp.header.cmd_code = req->header.cmd_code; rsp.header.subsys_id = req->header.subsys_id; rsp.header.subsys_cmd_code = req->header.subsys_cmd_code; rsp.transport = driver->transport_set; memcpy(dest_buf, &rsp, sizeof(rsp)); return sizeof(rsp); } int diag_process_time_sync_switch_cmd(unsigned char *src_buf, int src_len, unsigned char *dest_buf, int dest_len) { Loading Loading @@ -1158,6 +1182,18 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) diag_send_rsp(driver->apps_rsp_buf, write_len, pid); return 0; } /* Check for transport command*/ else if ((len >= ((2 * sizeof(uint8_t)) + sizeof(uint16_t))) && (*buf == DIAG_CMD_DIAG_SUBSYS) && (*(buf+1) == DIAG_SS_DIAG) && (*(uint16_t *)(buf+2) == DIAG_QUERY_TRANSPORT)) { write_len = diag_process_diag_transport_query_cmd(buf, len, driver->apps_rsp_buf, DIAG_MAX_RSP_SIZE); if (write_len > 0) diag_send_rsp(driver->apps_rsp_buf, write_len, pid); return 0; } /* Check for download command */ else if ((len >= sizeof(uint8_t)) && (chk_apps_master()) && (*buf == 0x3A)) { Loading drivers/char/diag/diagfwd.h +2 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ int diag_cmd_log_on_demand(unsigned char *src_buf, int src_len, unsigned char *dest_buf, int dest_len); int diag_cmd_get_mobile_id(unsigned char *src_buf, int src_len, unsigned char *dest_buf, int dest_len); int diag_process_diag_transport_query_cmd(unsigned char *src_buf, int src_len, unsigned char *dest_buf, int dest_len); int diag_check_common_cmd(struct diag_pkt_header_t *header); void diag_update_userspace_clients(unsigned int type); void diag_update_sleeping_process(int process_id, int data_type); Loading Loading
drivers/char/diag/diagchar.h +10 −0 Original line number Diff line number Diff line Loading @@ -144,6 +144,7 @@ #define DIAG_GET_DIAG_ID 0x222 #define DIAG_SWITCH_COMMAND 0x081B #define DIAG_BUFFERING_MODE 0x080C #define DIAG_QUERY_TRANSPORT 0x0064 #define DIAG_CMD_OP_LOG_DISABLE 0 #define DIAG_CMD_OP_GET_LOG_RANGE 1 Loading Loading @@ -401,6 +402,15 @@ struct diag_cmd_time_sync_switch_rsp_t { uint8_t persist_time_status; }; struct diag_query_transport_req_t { struct diag_pkt_header_t header; }; struct diag_query_transport_rsp_t { struct diag_pkt_header_t header; uint8_t transport; }; struct diag_cmd_reg_entry_t { uint16_t cmd_code; uint16_t subsys_id; Loading
drivers/char/diag/diagfwd.c +36 −0 Original line number Diff line number Diff line Loading @@ -769,6 +769,30 @@ int diag_process_diag_id_query_cmd(unsigned char *src_buf, int src_len, memcpy(dest_buf, &rsp, rsp_len); return write_len; } int diag_process_diag_transport_query_cmd(unsigned char *src_buf, int src_len, unsigned char *dest_buf, int dest_len) { struct diag_query_transport_req_t *req; struct diag_query_transport_rsp_t rsp; if (!src_buf || !dest_buf || src_len <= 0 || dest_len <= 0 || src_len < sizeof(struct diag_query_transport_req_t) || sizeof(rsp) > dest_len) { pr_err("diag: Invalid input in %s, src_buf: %pK, src_len: %d, dest_buf: %pK, dest_len: %d", __func__, src_buf, src_len, dest_buf, dest_len); return -EINVAL; } req = (struct diag_query_transport_req_t *)src_buf; rsp.header.cmd_code = req->header.cmd_code; rsp.header.subsys_id = req->header.subsys_id; rsp.header.subsys_cmd_code = req->header.subsys_cmd_code; rsp.transport = driver->transport_set; memcpy(dest_buf, &rsp, sizeof(rsp)); return sizeof(rsp); } int diag_process_time_sync_switch_cmd(unsigned char *src_buf, int src_len, unsigned char *dest_buf, int dest_len) { Loading Loading @@ -1158,6 +1182,18 @@ int diag_process_apps_pkt(unsigned char *buf, int len, int pid) diag_send_rsp(driver->apps_rsp_buf, write_len, pid); return 0; } /* Check for transport command*/ else if ((len >= ((2 * sizeof(uint8_t)) + sizeof(uint16_t))) && (*buf == DIAG_CMD_DIAG_SUBSYS) && (*(buf+1) == DIAG_SS_DIAG) && (*(uint16_t *)(buf+2) == DIAG_QUERY_TRANSPORT)) { write_len = diag_process_diag_transport_query_cmd(buf, len, driver->apps_rsp_buf, DIAG_MAX_RSP_SIZE); if (write_len > 0) diag_send_rsp(driver->apps_rsp_buf, write_len, pid); return 0; } /* Check for download command */ else if ((len >= sizeof(uint8_t)) && (chk_apps_master()) && (*buf == 0x3A)) { Loading
drivers/char/diag/diagfwd.h +2 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ int diag_cmd_log_on_demand(unsigned char *src_buf, int src_len, unsigned char *dest_buf, int dest_len); int diag_cmd_get_mobile_id(unsigned char *src_buf, int src_len, unsigned char *dest_buf, int dest_len); int diag_process_diag_transport_query_cmd(unsigned char *src_buf, int src_len, unsigned char *dest_buf, int dest_len); int diag_check_common_cmd(struct diag_pkt_header_t *header); void diag_update_userspace_clients(unsigned int type); void diag_update_sleeping_process(int process_id, int data_type); Loading