int chk_config_get_id(void) { /* For all Fusion targets, Modem will always be present */ if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) return 0; if (driver->use_device_tree) { if (machine_is_msm8974()) return MSM8974_TOOLS_ID; else return 0; } else { switch (socinfo_get_msm_cpu()) { case MSM_CPU_8X60: return APQ8060_TOOLS_ID; case MSM_CPU_8960: case MSM_CPU_8960AB: return AO8960_TOOLS_ID; case MSM_CPU_8064: case MSM_CPU_8064AB: case MSM_CPU_8064AA: return APQ8064_TOOLS_ID; case MSM_CPU_8930: case MSM_CPU_8930AA: case MSM_CPU_8930AB: return MSM8930_TOOLS_ID; case MSM_CPU_8974: return MSM8974_TOOLS_ID; case MSM_CPU_8625: return MSM8625_TOOLS_ID; default: return 0; } } }
int diagfwd_connect(void) { int err; int i; printk(KERN_DEBUG "diag: USB connected\n"); err = usb_diag_alloc_req(driver->legacy_ch, N_LEGACY_WRITE, N_LEGACY_READ); if (err) printk(KERN_ERR "diag: unable to alloc USB req on legacy ch"); driver->usb_connected = 1; for (i = 0; i < NUM_SMD_DATA_CHANNELS; i++) { driver->smd_data[i].in_busy_1 = 0; driver->smd_data[i].in_busy_2 = 0; /* Poll SMD data channels to check for data */ queue_work(driver->diag_wq, &(driver->smd_data[i].diag_read_smd_work)); /* Poll SMD CNTL channels to check for data */ diag_smd_notify(&(driver->smd_cntl[i]), SMD_EVENT_DATA); } /* Poll USB channel to check for data*/ queue_work(driver->diag_wq, &(driver->diag_read_work)); #ifdef CONFIG_DIAG_SDIO_PIPE if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { if (driver->mdm_ch && !IS_ERR(driver->mdm_ch)) diagfwd_connect_sdio(); else printk(KERN_INFO "diag: No USB MDM ch"); } #endif return 0; }
void diag_sdio_fn(int type) { if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { if (type == INIT) diagfwd_sdio_init(); else if (type == EXIT) diagfwd_sdio_exit(); } }
void diag_sdio_fn(int type) { if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa() #ifdef CONFIG_MACH_MSM8X60_PORORO || machine_is_msm8x60_pororo() #endif ) { if (type == INIT) diagfwd_sdio_init(); else if (type == EXIT) diagfwd_sdio_exit(); } }
void diag_sdio_fn(int type) { if ( #ifdef CONFIG_MACH_LGE_325_BOARD machine_is_lge_325_board() || #endif #ifdef CONFIG_MACH_LGE_I_BOARD machine_is_lge_i_board() || #endif machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { if (type == INIT) diagfwd_sdio_init(); else if (type == EXIT) diagfwd_sdio_exit(); } }
int diagfwd_write_complete(struct diag_request *diag_write_ptr) { unsigned char *buf = diag_write_ptr->buf; int found_it = 0; int i; /* Determine if the write complete is for data from modem/apps/q6 */ /* Need a context variable here instead */ for (i = 0; i < NUM_SMD_DATA_CHANNELS; i++) { struct diag_smd_info *data = &(driver->smd_data[i]); if (buf == (void *)data->buf_in_1) { data->in_busy_1 = 0; queue_work(driver->diag_wq, &(data->diag_read_smd_work)); found_it = 1; break; } else if (buf == (void *)data->buf_in_2) { data->in_busy_2 = 0; queue_work(driver->diag_wq, &(data->diag_read_smd_work)); found_it = 1; break; } } #ifdef CONFIG_DIAG_SDIO_PIPE if (!found_it) { if (buf == (void *)driver->buf_in_sdio) { if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) diagfwd_write_complete_sdio(); else pr_err("diag: Incorrect buffer pointer while WRITE"); found_it = 1; } } #endif if (!found_it) { diagmem_free(driver, (unsigned char *)buf, POOL_TYPE_HDLC); diagmem_free(driver, (unsigned char *)diag_write_ptr, POOL_TYPE_WRITE_STRUCT); } return 0; }
int diagfwd_write_complete(struct diag_request *diag_write_ptr) { unsigned char *buf = diag_write_ptr->buf; /*Determine if the write complete is for data from modem/apps/q6 */ /* Need a context variable here instead */ if (buf == (void *)driver->buf_in_1) { driver->in_busy_1 = 0; APPEND_DEBUG('o'); queue_work(driver->diag_wq, &(driver->diag_read_smd_work)); } else if (buf == (void *)driver->buf_in_2) { driver->in_busy_2 = 0; APPEND_DEBUG('O'); queue_work(driver->diag_wq, &(driver->diag_read_smd_work)); } else if (buf == (void *)driver->buf_in_qdsp_1) { driver->in_busy_qdsp_1 = 0; APPEND_DEBUG('p'); queue_work(driver->diag_wq, &(driver->diag_read_smd_qdsp_work)); } else if (buf == (void *)driver->buf_in_qdsp_2) { driver->in_busy_qdsp_2 = 0; APPEND_DEBUG('P'); queue_work(driver->diag_wq, &(driver->diag_read_smd_qdsp_work)); } else if (buf == (void *)driver->buf_in_wcnss) { driver->in_busy_wcnss = 0; APPEND_DEBUG('R'); queue_work(driver->diag_wq, &(driver->diag_read_smd_wcnss_work)); } #ifdef CONFIG_DIAG_SDIO_PIPE else if (buf == (void *)driver->buf_in_sdio) if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) diagfwd_write_complete_sdio(); else pr_err("diag: Incorrect buffer pointer while WRITE"); #endif else { diagmem_free(driver, (unsigned char *)buf, POOL_TYPE_HDLC); diagmem_free(driver, (unsigned char *)diag_write_ptr, POOL_TYPE_WRITE_STRUCT); APPEND_DEBUG('q'); } return 0; }
int diagfwd_disconnect(void) { printk(KERN_DEBUG "diag: USB disconnected\n"); driver->usb_connected = 0; driver->debug_flag = 1; usb_diag_free_req(driver->legacy_ch); if (driver->logging_mode == USB_MODE) { driver->in_busy_1 = 1; driver->in_busy_2 = 1; driver->in_busy_qdsp_1 = 1; driver->in_busy_qdsp_2 = 1; driver->in_busy_wcnss = 1; } #ifdef CONFIG_DIAG_SDIO_PIPE if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) if (driver->mdm_ch && !IS_ERR(driver->mdm_ch)) diagfwd_disconnect_sdio(); #endif /* TBD - notify and flow control SMD */ return 0; }
int diagfwd_read_complete(struct diag_request *diag_read_ptr) { int status = diag_read_ptr->status; unsigned char *buf = diag_read_ptr->buf; /* Determine if the read complete is for data on legacy/mdm ch */ if (buf == (void *)driver->usb_buf_out) { driver->read_len_legacy = diag_read_ptr->actual; APPEND_DEBUG('s'); #ifdef DIAG_DEBUG printk(KERN_INFO "read data from USB, pkt length %d", diag_read_ptr->actual); print_hex_dump(KERN_DEBUG, "Read Packet Data from USB: ", 16, 1, DUMP_PREFIX_ADDRESS, diag_read_ptr->buf, diag_read_ptr->actual, 1); #endif /* DIAG DEBUG */ if (driver->logging_mode == USB_MODE) { if (status != -ECONNRESET && status != -ESHUTDOWN) queue_work(driver->diag_wq, &(driver->diag_proc_hdlc_work)); else queue_work(driver->diag_wq, &(driver->diag_read_work)); } } #ifdef CONFIG_DIAG_SDIO_PIPE else if (buf == (void *)driver->usb_buf_mdm_out) { if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { driver->read_len_mdm = diag_read_ptr->actual; diagfwd_read_complete_sdio(); } else pr_err("diag: Incorrect buffer pointer while READ"); } #endif else printk(KERN_ERR "diag: Unknown buffer ptr from USB"); return 0; }
int diagfwd_disconnect(void) { int i; printk(KERN_DEBUG "diag: USB disconnected\n"); driver->usb_connected = 0; driver->debug_flag = 1; usb_diag_free_req(driver->legacy_ch); if (driver->logging_mode == USB_MODE) { for (i = 0; i < NUM_SMD_DATA_CHANNELS; i++) { driver->smd_data[i].in_busy_1 = 1; driver->smd_data[i].in_busy_2 = 1; } } #ifdef CONFIG_DIAG_SDIO_PIPE if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) if (driver->mdm_ch && !IS_ERR(driver->mdm_ch)) diagfwd_disconnect_sdio(); #endif /* TBD - notify and flow control SMD */ return 0; }
int diagfwd_connect(void) { int err; printk(KERN_DEBUG "diag: USB connected\n"); err = usb_diag_alloc_req(driver->legacy_ch, N_LEGACY_WRITE, N_LEGACY_READ); if (err) printk(KERN_ERR "diag: unable to alloc USB req on legacy ch"); driver->usb_connected = 1; driver->in_busy_1 = 0; driver->in_busy_2 = 0; driver->in_busy_qdsp_1 = 0; driver->in_busy_qdsp_2 = 0; driver->in_busy_wcnss = 0; /* Poll SMD channels to check for data*/ queue_work(driver->diag_wq, &(driver->diag_read_smd_work)); queue_work(driver->diag_wq, &(driver->diag_read_smd_qdsp_work)); queue_work(driver->diag_wq, &(driver->diag_read_smd_wcnss_work)); /* Poll SMD CNTL channels to check for data */ queue_work(driver->diag_wq, &(driver->diag_read_smd_cntl_work)); queue_work(driver->diag_wq, &(driver->diag_read_smd_qdsp_cntl_work)); queue_work(driver->diag_wq, &(driver->diag_read_smd_wcnss_cntl_work)); /* Poll USB channel to check for data*/ queue_work(driver->diag_wq, &(driver->diag_read_work)); #ifdef CONFIG_DIAG_SDIO_PIPE if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { if (driver->mdm_ch && !IS_ERR(driver->mdm_ch)) diagfwd_connect_sdio(); else printk(KERN_INFO "diag: No USB MDM ch"); } #endif return 0; }
int diag_device_write(void *buf, int proc_num, struct diag_request *write_ptr) { int i, err = 0; if (driver->logging_mode == MEMORY_DEVICE_MODE) { if (proc_num == APPS_DATA) { for (i = 0; i < driver->poolsize_write_struct; i++) if (driver->buf_tbl[i].length == 0) { driver->buf_tbl[i].buf = buf; driver->buf_tbl[i].length = driver->used; #ifdef DIAG_DEBUG pr_debug("diag: ENQUEUE buf ptr" " and length is %x , %d\n", (unsigned int)(driver->buf_ tbl[i].buf), driver->buf_tbl[i].length); #endif break; } } for (i = 0; i < driver->num_clients; i++) if (driver->client_map[i].pid == driver->logging_process_id) break; if (i < driver->num_clients) { driver->data_ready[i] |= USER_SPACE_LOG_TYPE; wake_up_interruptible(&driver->wait_q); } else return -EINVAL; } else if (driver->logging_mode == NO_LOGGING_MODE) { if (proc_num == MODEM_DATA) { driver->in_busy_1 = 0; driver->in_busy_2 = 0; queue_work(driver->diag_wq, &(driver-> diag_read_smd_work)); } else if (proc_num == QDSP_DATA) { driver->in_busy_qdsp_1 = 0; driver->in_busy_qdsp_2 = 0; queue_work(driver->diag_wq, &(driver-> diag_read_smd_qdsp_work)); } else if (proc_num == WCNSS_DATA) { driver->in_busy_wcnss = 0; queue_work(driver->diag_wq, &(driver-> diag_read_smd_wcnss_work)); } err = -1; } #ifdef CONFIG_DIAG_OVER_USB else if (driver->logging_mode == USB_MODE) { if (proc_num == APPS_DATA) { driver->write_ptr_svc = (struct diag_request *) (diagmem_alloc(driver, sizeof(struct diag_request), POOL_TYPE_WRITE_STRUCT)); if (driver->write_ptr_svc) { driver->write_ptr_svc->length = driver->used; driver->write_ptr_svc->buf = buf; err = usb_diag_write(driver->legacy_ch, driver->write_ptr_svc); } else err = -1; } else if (proc_num == MODEM_DATA) { write_ptr->buf = buf; #ifdef DIAG_DEBUG printk(KERN_INFO "writing data to USB," "pkt length %d\n", write_ptr->length); print_hex_dump(KERN_DEBUG, "Written Packet Data to" " USB: ", 16, 1, DUMP_PREFIX_ADDRESS, buf, write_ptr->length, 1); #endif /* DIAG DEBUG */ err = usb_diag_write(driver->legacy_ch, write_ptr); } else if (proc_num == QDSP_DATA) { write_ptr->buf = buf; err = usb_diag_write(driver->legacy_ch, write_ptr); } else if (proc_num == WCNSS_DATA) { write_ptr->buf = buf; err = usb_diag_write(driver->legacy_ch, write_ptr); } #ifdef CONFIG_DIAG_SDIO_PIPE else if (proc_num == SDIO_DATA) { if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { write_ptr->buf = buf; err = usb_diag_write(driver->mdm_ch, write_ptr); } else pr_err("diag: Incorrect data while USB write"); } #endif APPEND_DEBUG('d'); } #endif /* DIAG OVER USB */ return err; }
int diag_device_write(void *buf, int data_type, struct diag_request *write_ptr) { int i, err = 0, index; index = 0; if (driver->logging_mode == MEMORY_DEVICE_MODE) { int hsic_updated = 0; if (data_type == APPS_DATA) { for (i = 0; i < driver->poolsize_write_struct; i++) if (driver->buf_tbl[i].length == 0) { driver->buf_tbl[i].buf = buf; driver->buf_tbl[i].length = driver->used; #ifdef DIAG_DEBUG pr_debug("diag: ENQUEUE buf ptr" " and length is %x , %d\n", (unsigned int)(driver->buf_ tbl[i].buf), driver->buf_tbl[i].length); #endif break; } } #ifdef CONFIG_DIAGFWD_BRIDGE_CODE else if (data_type == HSIC_DATA || data_type == HSIC_2_DATA) { unsigned long flags; int foundIndex = -1; hsic_updated = 1; index = data_type - HSIC_DATA; spin_lock_irqsave(&diag_hsic[index].hsic_spinlock, flags); for (i = 0; i < diag_hsic[index].poolsize_hsic_write; i++) { if (diag_hsic[index].hsic_buf_tbl[i].length == 0) { diag_hsic[index].hsic_buf_tbl[i].buf = buf; diag_hsic[index].hsic_buf_tbl[i].length = diag_bridge[index].write_len; diag_hsic[index]. num_hsic_buf_tbl_entries++; foundIndex = i; break; } } spin_unlock_irqrestore(&diag_hsic[index].hsic_spinlock, flags); if (foundIndex == -1) err = -1; else pr_debug("diag: ENQUEUE HSIC buf ptr and length is %x , %d, ch %d\n", (unsigned int)buf, diag_bridge[index].write_len, index); } #endif for (i = 0; i < driver->num_clients; i++) if (driver->client_map[i].pid == driver->logging_process_id) break; if (i < driver->num_clients) { diag_mem_dev_mode_ready_update(i, hsic_updated); pr_debug("diag: wake up logging process\n"); wake_up_interruptible(&driver->wait_q); } else return -EINVAL; } else if (driver->logging_mode == NO_LOGGING_MODE) { if ((data_type >= 0) && (data_type < NUM_SMD_DATA_CHANNELS)) { driver->smd_data[data_type].in_busy_1 = 0; driver->smd_data[data_type].in_busy_2 = 0; queue_work(driver->diag_wq, &(driver->smd_data[data_type]. diag_read_smd_work)); } #ifdef CONFIG_DIAG_SDIO_PIPE else if (data_type == SDIO_DATA) { driver->in_busy_sdio = 0; queue_work(driver->diag_sdio_wq, &(driver->diag_read_sdio_work)); } #endif #ifdef CONFIG_DIAGFWD_BRIDGE_CODE else if (data_type == HSIC_DATA || data_type == HSIC_2_DATA) { index = data_type - HSIC_DATA; if (diag_hsic[index].hsic_ch) queue_work(diag_bridge[index].wq, &(diag_hsic[index]. diag_read_hsic_work)); } #endif err = -1; } #ifdef CONFIG_DIAG_OVER_USB else if (driver->logging_mode == USB_MODE) { if (data_type == APPS_DATA) { driver->write_ptr_svc = (struct diag_request *) (diagmem_alloc(driver, sizeof(struct diag_request), POOL_TYPE_WRITE_STRUCT)); if (driver->write_ptr_svc) { driver->write_ptr_svc->length = driver->used; driver->write_ptr_svc->buf = buf; err = usb_diag_write(driver->legacy_ch, driver->write_ptr_svc); } else err = -1; } else if ((data_type >= 0) && (data_type < NUM_SMD_DATA_CHANNELS)) { write_ptr->buf = buf; #ifdef DIAG_DEBUG printk(KERN_INFO "writing data to USB," "pkt length %d\n", write_ptr->length); print_hex_dump(KERN_DEBUG, "Written Packet Data to" " USB: ", 16, 1, DUMP_PREFIX_ADDRESS, buf, write_ptr->length, 1); #endif /* DIAG DEBUG */ err = usb_diag_write(driver->legacy_ch, write_ptr); } #ifdef CONFIG_DIAG_SDIO_PIPE else if (data_type == SDIO_DATA) { if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) { write_ptr->buf = buf; err = usb_diag_write(driver->mdm_ch, write_ptr); } else pr_err("diag: Incorrect sdio data " "while USB write\n"); } #endif #ifdef CONFIG_DIAGFWD_BRIDGE_CODE else if (data_type == HSIC_DATA || data_type == HSIC_2_DATA) { index = data_type - HSIC_DATA; if (diag_hsic[index].hsic_device_enabled) { struct diag_request *write_ptr_mdm; write_ptr_mdm = (struct diag_request *) diagmem_alloc(driver, sizeof(struct diag_request), index + POOL_TYPE_HSIC_WRITE); if (write_ptr_mdm) { write_ptr_mdm->buf = buf; write_ptr_mdm->length = diag_bridge[index].write_len; write_ptr_mdm->context = (void *)index; err = usb_diag_write( diag_bridge[index].ch, write_ptr_mdm); /* Return to the pool immediately */ if (err) { diagmem_free(driver, write_ptr_mdm, index + POOL_TYPE_HSIC_WRITE); pr_err_ratelimited("diag: HSIC write failure, err: %d, ch %d\n", err, index); } } else { pr_err("diag: allocate write fail\n"); err = -1; } } else { pr_err("diag: Incorrect HSIC data " "while USB write\n"); err = -1; } } else if (data_type == SMUX_DATA) { write_ptr->buf = buf; write_ptr->context = (void *)SMUX; pr_debug("diag: writing SMUX data\n"); err = usb_diag_write(diag_bridge[SMUX].ch, write_ptr); } #endif APPEND_DEBUG('d'); } #endif /* DIAG OVER USB */ return err; }