int diag_device_write(void *buf, int proc_num) { int i, err = 0; if (driver->logging_mode == USB_MODE) { if (proc_num == APPS_DATA) { driver->usb_write_ptr_svc = (struct diag_request *) (diagmem_alloc(driver, sizeof(struct diag_request), POOL_TYPE_USB_STRUCT)); driver->usb_write_ptr_svc->length = driver->used; driver->usb_write_ptr_svc->buf = buf; err = diag_write(driver->usb_write_ptr_svc); } else if (proc_num == MODEM_DATA) { driver->usb_write_ptr->buf = buf; #ifdef DIAG_DEBUG printk(KERN_INFO "writing data to USB," " pkt length %d \n", driver->usb_write_ptr->length); print_hex_dump(KERN_DEBUG, "Written Packet Data" " to USB: ", 16, 1, DUMP_PREFIX_ ADDRESS, buf, driver-> usb_write_ptr->length, 1); #endif err = diag_write(driver->usb_write_ptr); } else if (proc_num == QDSP_DATA) { driver->usb_write_ptr_qdsp->buf = buf; err = diag_write(driver->usb_write_ptr_qdsp); } APPEND_DEBUG('k'); } else if (driver->logging_mode == MEMORY_DEVICE_MODE) { if (proc_num == APPS_DATA) { for (i = 0; i < driver->poolsize_usb_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 printk(KERN_INFO "\n 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] == driver->logging_process_id) break; if (i < driver->num_clients) { driver->data_ready[i] |= MEMORY_DEVICE_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 = 0; queue_work(driver->diag_wq, &(driver-> diag_read_smd_work)); } else if (proc_num == QDSP_DATA) { driver->in_busy_qdsp = 0; queue_work(driver->diag_wq, &(driver-> diag_read_smd_qdsp_work)); } err = -1; } return err; }
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 printk(KERN_INFO "\n 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] |= MEMORY_DEVICE_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)); } 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; #ifdef CONFIG_SH_USB_CUST err = diag_write(driver->write_ptr_svc); #else /* CONFIG_SH_USB_CUST */ err = usb_diag_write(driver->legacy_ch, driver->write_ptr_svc); #endif /* CONFIG_SH_USB_CUST */ } 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 */ #ifdef CONFIG_SH_USB_CUST err = diag_write(write_ptr); #else /* CONFIG_SH_USB_CUST */ err = usb_diag_write(driver->legacy_ch, write_ptr); #endif /* CONFIG_SH_USB_CUST */ } else if (proc_num == QDSP_DATA) { write_ptr->buf = buf; #ifdef CONFIG_SH_USB_CUST err = diag_write(write_ptr); #else /* CONFIG_SH_USB_CUST */ err = usb_diag_write(driver->legacy_ch, write_ptr); #endif /* CONFIG_SH_USB_CUST */ } #ifdef CONFIG_DIAG_SDIO_PIPE else if (proc_num == SDIO_DATA) { /* COORDINATOR Qualcomm4040 MERGE start */ #ifdef CONFIG_SH_USB_CUST write_ptr->buf = buf; diag_write(write_ptr); #else /* CONFIG_SH_USB_CUST */ if (machine_is_msm8x60_charm_surf() || machine_is_msm8x60_charm_ffa()) { write_ptr->buf = buf; err = usb_diag_write(driver->mdm_ch, write_ptr); } else pr_err("diag: Incorrect data while USB write"); #endif /* CONFIG_SH_USB_CUST */ /* COORDINATOR Qualcomm4040 MERGE end */ } #endif APPEND_DEBUG('d'); } #endif /* DIAG OVER USB */ return err; }