static int check_modem_reset(struct modem_data *drv) { u32 size; int ret = -EPERM; struct lge_hw_smem_id2_type *smem_id2; smem_id2 = smem_get_entry(SMEM_ID_VENDOR2, &size); if (smem_id2 == NULL) { pr_err("%s: smem_id2 is NULL.\n", __func__); return ret; } printk("smem_id2->modem_reset : %d", smem_id2->modem_reset); if (smem_id2->modem_reset != 1) { ret = 1; } else { wmb(); drv->ignore_errors = true; subsys_modem_restart(); ret = 0; } return ret; }
static int check_modem_reset(struct modem_data *drv) { u32 size; char *smem_reason, reason[MAX_SSR_REASON_LEN]; int ret = -EPERM; smem_reason = smem_get_entry_no_rlock(SMEM_SSR_REASON_MSS0, &size); if (!smem_reason || !size) { pr_err("modem subsystem failure reason: (unknown, smem_get_entry_no_rlock failed).\n"); goto err; } if (!smem_reason[0]) { pr_err("modem subsystem failure reason: (unknown, empty string found).\n"); goto err; } strlcpy(reason, smem_reason, min(size, sizeof(reason))); if (strstr(reason,"forced modem reset")){ subsys_set_crash_status(drv->subsys, true); subsys_modem_restart(); ret = 0; } err: return ret; }
static int gen_modem_panic(const char *val, struct kernel_param *kp) { int ret = param_set_int(val, kp); if (ret) { pr_err("error setting value %d\n", ret); return ret; } pr_err("gen_modem_panic param to %d\n", gen_modem_panic_type); switch (gen_modem_panic_type) { case 2: subsys_modem_restart(); break; default: subsystem_restart("modem"); break; } return 0; }
static int check_modem_reset(void) { u32 size; int ret; struct lge_hw_smem_id2_type *smem_id2; smem_id2 = smem_get_entry(SMEM_ID_VENDOR2, &size); if(smem_id2->modem_reset != 1) { return 1; } printk("modem reset command is invoked.\n"); ret = subsys_modem_restart(); smem_id2->modem_reset = 0; wmb(); return ret; }
static int lge_dm_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) { short result; #ifdef CONFIG_DIAGFWD_BRIDGE_CODE short modem_number = Secondary_modem_chip; #else short modem_number = Primary_modem_chip; #endif /*CONFIG_DIAGFWD_BRIDGE_CODE*/ struct dm_tty *lge_dm_tty_drv = NULL; int status = 0; /* */ int i; int index=MODEM_DATA; #ifdef CONFIG_DIAGFWD_BRIDGE_CODE unsigned long spin_lock_flags; #endif result = 0; lge_dm_tty_drv = lge_dm_tty; tty->driver_data = lge_dm_tty_drv; lge_dm_tty_drv->tty_str = tty; if (_IOC_TYPE(cmd) != DM_TTY_IOCTL_MAGIC) return -EINVAL; switch (cmd) { case DM_TTY_MODEM_OPEN_SDM: if(lge_dm_tty_drv->logging_mode == DM_APP_SDM) { pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "already DM_TTY_MODEM_OPEN_SDM\n", __func__); result = TRUE; if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "already DM_TTY_MODEM_OPEN_SDM" "result = %d\n", __func__, result); break; } lge_dm_tty_drv->logging_mode = DM_APP_SDM; pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_OPEN_SDM\n", __func__); #ifdef CONFIG_DIAGFWD_BRIDGE_CODE if ((diag_bridge[index].usb_connected == 1) && (diag_hsic[index].count_hsic_pool == N_MDM_WRITE)) { spin_lock_irqsave(&diag_hsic[HSIC].hsic_spinlock,spin_lock_flags); diag_hsic[index].count_hsic_pool = 0; spin_unlock_irqrestore(&diag_hsic[HSIC].hsic_spinlock,spin_lock_flags); } diag_hsic[index].num_hsic_buf_tbl_entries = 0; for (i = 0; i < diag_hsic[index].poolsize_hsic_write; i++) { if (diag_hsic[index].hsic_buf_tbl[index].buf) { /* Return the buffer to the pool */ diagmem_free(driver, (unsigned char *) (diag_hsic[index].hsic_buf_tbl[index].buf), POOL_TYPE_HSIC); diag_hsic[index].hsic_buf_tbl[index].buf = 0; } diag_hsic[index].hsic_buf_tbl[index].length = 0; } diagfwd_disconnect_bridge(1); diagfwd_cancel_hsic(REOPEN_HSIC); // QCT 161032 migration - NEED TO CHECK diagfwd_connect_bridge(0); #endif /* CONFIG_DIAGFWD_BRIDGE_CODE */ /* change path to DM APP */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = DM_APP_MODE; mutex_unlock(&driver->diagchar_mutex); if (modem_number == Primary_modem_chip) { 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 channels to check for data*/ if (driver->smd_data[i].ch) queue_work(driver->diag_wq, &(driver->smd_data[i]. diag_read_smd_work)); }// end of for loop } else if (modem_number == Secondary_modem_chip) { #ifdef CONFIG_DIAGFWD_BRIDGE_CODE /* Read data from the hsic */ if (diag_hsic[index].hsic_ch) queue_work(diag_bridge[index].wq, &(diag_hsic[index]. diag_read_hsic_work)); #endif /* CONFIG_DIAGFWD_BRIDGE_CODE */ } else { pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_OPEN_SDM" "error modem_number = %d\n", __func__, modem_number); } result = TRUE; if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_OPEN_SDM" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_CLOSE_SDM: lge_dm_tty_drv->logging_mode = DM_APP_ODM; pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CLOSE_SDM, modem_number = %d\n", __func__, modem_number); lge_dm_tty_drv->set_logging = 0; /* change path to USB driver */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = USB_MODE; mutex_unlock(&driver->diagchar_mutex); if (driver->usb_connected == 0) diagfwd_disconnect(); else diagfwd_connect(); result = TRUE; #ifdef CONFIG_DIAGFWD_BRIDGE_CODE diag_hsic[index].num_hsic_buf_tbl_entries = 0; for (i = 0; i < diag_hsic[index].poolsize_hsic_write; i++) { if (diag_hsic[index].hsic_buf_tbl[index].buf) { /* Return the buffer to the pool */ diagmem_free(driver, (unsigned char *) (diag_hsic[index].hsic_buf_tbl[index].buf), POOL_TYPE_HSIC); diag_hsic[index].hsic_buf_tbl[index].buf = 0; } diag_hsic[index].hsic_buf_tbl[index].length = 0; } diagfwd_cancel_hsic(REOPEN_HSIC); // QCT 161032 migration - NEED TO CHECK diagfwd_connect_bridge(0); #endif if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CLOSE_SDM" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_OPEN_ODM: lge_dm_tty_drv->logging_mode = DM_APP_ODM; pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_OPEN_ODM\n", __func__); #ifdef CONFIG_DIAGFWD_BRIDGE_CODE if ((diag_bridge[index].usb_connected == 1) && (diag_hsic[index].count_hsic_pool == N_MDM_WRITE)) { spin_lock_irqsave(&diag_hsic[HSIC].hsic_spinlock,spin_lock_flags); diag_hsic[index].count_hsic_pool = 0; spin_unlock_irqrestore(&diag_hsic[HSIC].hsic_spinlock,spin_lock_flags); } diag_hsic[index].num_hsic_buf_tbl_entries = 0; for (i = 0; i < diag_hsic[index].poolsize_hsic_write; i++) { if (diag_hsic[index].hsic_buf_tbl[index].buf) { /* Return the buffer to the pool */ diagmem_free(driver, (unsigned char *) (diag_hsic[index].hsic_buf_tbl[index].buf), POOL_TYPE_HSIC); diag_hsic[index].hsic_buf_tbl[index].buf = 0; } diag_hsic[index].hsic_buf_tbl[index].length = 0; } diagfwd_disconnect_bridge(1); diagfwd_cancel_hsic(REOPEN_HSIC); // QCT 161032 migration - NEED TO CHECK diagfwd_connect_bridge(0); #endif /* CONFIG_DIAGFWD_BRIDGE_CODE */ /* change path to DM DEV */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = DM_APP_MODE; mutex_unlock(&driver->diagchar_mutex); if (modem_number == Primary_modem_chip) { 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 channels to check for data*/ if (driver->smd_data[i].ch) queue_work(driver->diag_wq, &(driver->smd_data[i]. diag_read_smd_work)); }// end of for loop } else if (modem_number == Secondary_modem_chip) { #ifdef CONFIG_DIAGFWD_BRIDGE_CODE /* Read data from the hsic */ if (diag_hsic[index].hsic_ch) queue_work(diag_bridge[index].wq, &(diag_hsic[index]. diag_read_hsic_work)); #endif /* CONFIG_DIAGFWD_BRIDGE_CODE */ } else { pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_OPEN_ODM" "error modem_number = %d\n", __func__, modem_number); } result = TRUE; if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_OPEN_ODM" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_CLOSE_ODM: lge_dm_tty_drv->logging_mode = DM_APP_ODM; pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CLOSE_ODM, modem_number = %d\n", __func__, modem_number); lge_dm_tty_drv->set_logging = 0; /* change path to USB driver */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = USB_MODE; mutex_unlock(&driver->diagchar_mutex); if (driver->usb_connected == 0) diagfwd_disconnect(); else diagfwd_connect(); result = TRUE; #ifdef CONFIG_DIAGFWD_BRIDGE_CODE diag_hsic[index].num_hsic_buf_tbl_entries = 0; for (i = 0; i < diag_hsic[index].poolsize_hsic_write; i++) { if (diag_hsic[index].hsic_buf_tbl[index].buf) { /* Return the buffer to the pool */ diagmem_free(driver, (unsigned char *) (diag_hsic[index].hsic_buf_tbl[index].buf), POOL_TYPE_HSIC); diag_hsic[index].hsic_buf_tbl[index].buf = 0; } diag_hsic[index].hsic_buf_tbl[index].length = 0; } diagfwd_cancel_hsic(REOPEN_HSIC); // QCT 161032 migration - NEED TO CHECK diagfwd_connect_bridge(0); #endif if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CLOSE_ODM" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_RESET: // not supported //status = subsys_modem_restart(); result = TRUE; if (copy_to_user((void *)arg, (const void *)&status, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_RESET" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_CRASH: #ifdef CONFIG_DIAG_BRIDGE_CODE status = subsys_modem_restart(); result = TRUE; #else subsystem_restart("modem"); result = TRUE; #endif if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CRASH" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_DEBUGGER: /* */ break; default: pr_info(DM_TTY_MODULE_NAME ": %s:" "lge_dm_tty_ioctl error\n", __func__); break; } return 0; }
static int lge_dm_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) { short modem_number, result; struct dm_tty *lge_dm_tty_drv = NULL; int status = 0; int is_all_closed, i; result = 0; lge_dm_tty_drv = lge_dm_tty; tty->driver_data = lge_dm_tty_drv; lge_dm_tty_drv->tty_str = tty; if (_IOC_TYPE(cmd) != DM_TTY_IOCTL_MAGIC) return -EINVAL; switch (cmd) { case DM_TTY_MODEM_OPEN: if (copy_from_user((void *)&modem_number, (const void *)arg, sizeof(modem_number)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_MODEM_OPEN modem_number = %d\n", __func__, modem_number); if (lge_dm_tty_drv->is_modem_open[modem_number] == FALSE) lge_dm_tty_drv->is_modem_open[modem_number] = TRUE; else pr_err(DM_TTY_MODULE_NAME ": %s: already open " "modem_number = %d", __func__, modem_number); /* change path to DM APP */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = DM_APP_MODE; mutex_unlock(&driver->diagchar_mutex); if (modem_number == Primary_modem_chip) { 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 channels to check for data*/ if (driver->smd_data[i].ch) queue_work(driver->diag_wq, &(driver->smd_data[i]. diag_read_smd_work)); }// end of for loop for (i = 0; i < NUM_SMD_CMD_CHANNELS; i++) { driver->smd_cmd[i].in_busy_1 = 0; driver->smd_cmd[i].in_busy_2 = 0; if (driver->smd_cmd[i].ch) queue_work(driver->diag_wq, &(driver->smd_cmd[i]. diag_read_smd_work)); } } else if (modem_number == Secondary_modem_chip) { //TBD... } else { pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_MODEM_OPEN" "error modem_number = %d\n", __func__, modem_number); } result = lge_dm_tty_drv->is_modem_open[modem_number]; if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_MODEM_OPEN" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_CLOSE: if (copy_from_user((void *)&modem_number, (const void *)arg, sizeof(modem_number)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_MODEM_CLOSE modem_number = %d\n", __func__, modem_number); if (modem_number == 0) { /* close all modem chip */ for (i = 0; i < NUM_MODEM_CHIP + 1; i++) lge_dm_tty_drv->is_modem_open[i] = FALSE; result = TRUE; pr_err(DM_TTY_MODULE_NAME ": %s: close all modem chip" , __func__); } else { if (lge_dm_tty_drv->is_modem_open[modem_number] == TRUE) lge_dm_tty_drv->is_modem_open[modem_number] = FALSE; else pr_err(DM_TTY_MODULE_NAME ": %s: " "already closed " "modem_number = %d", __func__, modem_number); /* check all modem chip closed */ is_all_closed = TRUE; for (i = 0; i < NUM_MODEM_CHIP + 1; i++) { if (lge_dm_tty_drv->is_modem_open[i] == TRUE) is_all_closed = FALSE; } result = is_all_closed; } if (result == TRUE) { lge_dm_tty->set_logging = 0; /* change path to USB driver */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = USB_MODE; mutex_unlock(&driver->diagchar_mutex); if (driver->usb_connected == 0) diagfwd_disconnect(); else diagfwd_connect(); } if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_MODEM_CLOSE" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_STATUS: if (copy_from_user((void *)&modem_number, (const void *)arg, sizeof(modem_number)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_MODEM_STATUS modem_number = %d\n", __func__, modem_number); result = lge_dm_tty_drv->is_modem_open[modem_number]; if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_MODEM_STATUS" "result = %d\n", __func__, result); break; case DM_TTY_DATA_TO_APP: if (copy_from_user((void *)&modem_number, (const void *)arg, sizeof(modem_number)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_DATA_TO_APP modem_number = %d\n", __func__, modem_number); if (copy_to_user((void *)arg, (const void*)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_DATA_TO_APP" "result = %d\n", __func__, result); break; case DM_TTY_DATA_TO_USB: if (copy_from_user((void *)&modem_number, (const void *)arg, sizeof(modem_number)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_DATA_TO_USB" "modem_number = %d\n", __func__, modem_number); if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_IOCTL_DATA_TO_USB" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_RESET: if (copy_from_user((void *)&modem_number, (const void *)arg, sizeof(modem_number)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_RESET" "modem_number = %d\n", __func__, modem_number); status = subsys_modem_restart(); if (copy_to_user((void *)arg, (const void *)&status, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_RESET" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_CRASH: if (copy_from_user((void *)&modem_number, (const void *)arg, sizeof(modem_number)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CRASH" "modem_number = %d\n", __func__, modem_number); #ifdef CONFIG_DIAG_BRIDGE_CODE subsystem_restart("external_modem"); result = TRUE; #else subsystem_restart("modem"); result = TRUE; #endif if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CRASH" "result = %d\n", __func__, result); break; default: pr_info(DM_TTY_MODULE_NAME ": %s:" "lge_dm_tty_ioctl error\n", __func__); break; } return 0; }
static int lge_dm_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) { short result; short modem_number = Primary_modem_chip; struct dm_tty *lge_dm_tty_drv = NULL; int status, i = 0; char rw_buf[300]; unsigned long flags; result = 0; lge_dm_tty_drv = lge_dm_tty; tty->driver_data = lge_dm_tty_drv; lge_dm_tty_drv->tty_str = tty; if (_IOC_TYPE(cmd) != DM_TTY_IOCTL_MAGIC) return -EINVAL; switch (cmd) { case DM_TTY_MODEM_OPEN_SDM: if(lge_dm_tty_drv->logging_mode == DM_APP_SDM) { pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "already DM_TTY_MODEM_OPEN_SDM\n", __func__); result = TRUE; if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "already DM_TTY_MODEM_OPEN_SDM" "result = %d\n", __func__, result); break; } lge_dm_tty_drv->logging_mode = DM_APP_SDM; pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_OPEN_SDM\n", __func__); /* change path to DM APP */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = DM_APP_MODE; mutex_unlock(&driver->diagchar_mutex); if (modem_number == Primary_modem_chip) { for (i = 0; i < NUM_SMD_DATA_CHANNELS; i++) { spin_lock_irqsave(&driver->smd_data[i].in_busy_lock, flags); driver->smd_data[i].in_busy_1 = 0; driver->smd_data[i].in_busy_2 = 0; spin_unlock_irqrestore(&driver->smd_data[i].in_busy_lock, flags); /* Poll SMD channels to check for data*/ if (driver->smd_data[i].ch) queue_work(driver->diag_wq, &(driver->smd_data[i]. diag_read_smd_work)); } for (i = 0; i < NUM_SMD_CMD_CHANNELS; i++) { spin_lock_irqsave(&driver->smd_cmd[i].in_busy_lock, flags); driver->smd_cmd[i].in_busy_1 = 0; driver->smd_cmd[i].in_busy_2 = 0; spin_unlock_irqrestore(&driver->smd_cmd[i].in_busy_lock, flags); if (driver->smd_cmd[i].ch) queue_work(driver->diag_wq, &(driver->smd_cmd[i]. diag_read_smd_work)); } } else if (modem_number == Secondary_modem_chip) { //TBD... } else { pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_OPEN_SDM" "error modem_number = %d\n", __func__, modem_number); } result = TRUE; if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_OPEN_SDM" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_CLOSE_SDM: lge_dm_tty_drv->logging_mode = DM_APP_ODM; pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CLOSE_SDM\n", __func__); lge_dm_tty_drv->set_logging = 0; /* change path to USB driver */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = USB_MODE; mutex_unlock(&driver->diagchar_mutex); if (driver->usb_connected == 0) diagfwd_disconnect(); else diagfwd_connect(); diag_ws_reset(); result = TRUE; if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CLOSE_SDM" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_OPEN_ODM: lge_dm_tty_drv->logging_mode = DM_APP_ODM; pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_OPEN_ODM\n", __func__); /* change path to DM DEV */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = DM_APP_MODE; mutex_unlock(&driver->diagchar_mutex); for (i = 0; i < NUM_SMD_DATA_CHANNELS; i++) { spin_lock_irqsave(&driver->smd_data[i].in_busy_lock, flags); driver->smd_data[i].in_busy_1 = 0; driver->smd_data[i].in_busy_2 = 0; spin_unlock_irqrestore(&driver->smd_data[i].in_busy_lock, flags); /* Poll SMD channels to check for data*/ if (driver->smd_data[i].ch) queue_work(driver->diag_wq, &(driver->smd_data[i]. diag_read_smd_work)); } break; case DM_TTY_MODEM_CLOSE_ODM: lge_dm_tty_drv->logging_mode = DM_APP_ODM; pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CLOSE_ODM\n", __func__); lge_dm_tty_drv->set_logging = 0; /* change path to USB driver */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = USB_MODE; mutex_unlock(&driver->diagchar_mutex); if (driver->usb_connected == 0) diagfwd_disconnect(); else diagfwd_connect(); diag_ws_reset(); break; case DM_TTY_MODEM_RESET: status = subsys_modem_restart(); result = TRUE; if (copy_to_user((void *)arg, (const void *)&status, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_RESET" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_CRASH: #ifdef CONFIG_DIAG_BRIDGE_CODE subsystem_restart("external_modem"); result = TRUE; #else subsystem_restart("modem"); result = TRUE; #endif if (copy_to_user((void *)arg, (const void *)&result, sizeof(result)) == 0) pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_CRASH" "result = %d\n", __func__, result); break; case DM_TTY_MODEM_DEBUGGER: // memset(rw_buf, 0, sizeof(rw_buf)); strcpy(rw_buf,ssr_noti); if (copy_to_user((void *)arg, &rw_buf, sizeof(rw_buf))){ pr_info(DM_TTY_MODULE_NAME ": %s: lge_dm_tty_ioctl " "DM_TTY_MODEM_DEBUGGER error! " "rw_buf = %s\n", __func__, rw_buf); return -EFAULT; } printk("rw_buf = %s\n", rw_buf); break; default: pr_info(DM_TTY_MODULE_NAME ": %s:" "lge_dm_tty_ioctl error\n", __func__); break; } return 0; }
/* START : gen_subsys_modem_restart */ static int gen_subsys_modem_restart(const char *val, struct kernel_param *kp) { subsys_modem_restart(); return 0; }
static int lge_dm_dev_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) { // int index=0; int index=MODEM_DATA; int i; #ifdef CONFIG_DIAGFWD_BRIDGE_CODE unsigned long spin_lock_flags; #endif struct dm_dev_tty *lge_dm_dev_tty_drv = NULL; lge_dm_dev_tty_drv = lge_dm_dev_tty; tty->driver_data = lge_dm_dev_tty_drv; lge_dm_dev_tty_drv->tty_str = tty; if (_IOC_TYPE(cmd) != DM_DEV_TTY_IOCTL_MAGIC) return -EINVAL; switch (cmd){ case DM_DEV_TTY_MODEM_OPEN: #ifdef CONFIG_DIAGFWD_BRIDGE_CODE if ((diag_bridge[index].usb_connected == 1) && (diag_hsic[index].count_hsic_pool == N_MDM_WRITE)) { spin_lock_irqsave(&diag_hsic[HSIC].hsic_spinlock,spin_lock_flags); diag_hsic[index].count_hsic_pool = 0; spin_unlock_irqrestore(&diag_hsic[HSIC].hsic_spinlock,spin_lock_flags); } diag_hsic[index].num_hsic_buf_tbl_entries = 0; for (i = 0; i < diag_hsic[index].poolsize_hsic_write; i++) { if (diag_hsic[index].hsic_buf_tbl[index].buf) { /* Return the buffer to the pool */ diagmem_free(driver, (unsigned char *) (diag_hsic[index].hsic_buf_tbl[index].buf), POOL_TYPE_HSIC); diag_hsic[index].hsic_buf_tbl[index].buf = 0; } diag_hsic[index].hsic_buf_tbl[index].length = 0; } diagfwd_disconnect_bridge(1); diagfwd_cancel_hsic(REOPEN_HSIC); // QCT 161032 migration - NEED TO CHECK diagfwd_connect_bridge(0); #endif /* CONFIG_DIAGFWD_BRIDGE_CODE */ /* change path to DM DEV */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = DM_DEV_MODE; mutex_unlock(&driver->diagchar_mutex); #ifdef CONFIG_DIAG_SDIO_PIPE driver->in_busy_sdio = 0; /* Poll SDIO channel to check for data */ if (driver->sdio_ch) queue_work(driver->diag_sdio_wq, &(driver->diag_read_sdio_work)); #endif #ifdef CONFIG_DIAGFWD_BRIDGE_CODE /* Read data from the hsic */ if (diag_hsic[index].hsic_ch) queue_work(diag_bridge[index].wq, &(diag_hsic[index]. diag_read_hsic_work)); #endif /* CONFIG_DIAGFWD_BRIDGE_CODE */ break; case DM_DEV_TTY_MODEM_CLOSE: lge_dm_dev_tty->set_logging = 0; /* change path to USB driver */ mutex_lock(&driver->diagchar_mutex); driver->logging_mode = USB_MODE; mutex_unlock(&driver->diagchar_mutex); if (driver->usb_connected == 0) diagfwd_disconnect(); else diagfwd_connect(); #ifdef CONFIG_DIAGFWD_BRIDGE_CODE diag_hsic[index].num_hsic_buf_tbl_entries = 0; for (i = 0; i < diag_hsic[index].poolsize_hsic_write; i++) { if (diag_hsic[index].hsic_buf_tbl[index].buf) { /* Return the buffer to the pool */ diagmem_free(driver, (unsigned char *) (diag_hsic[index].hsic_buf_tbl[index].buf), POOL_TYPE_HSIC); diag_hsic[index].hsic_buf_tbl[index].buf = 0; } diag_hsic[index].hsic_buf_tbl[index].length = 0; } diagfwd_cancel_hsic(REOPEN_HSIC); // QCT 161032 migration - NEED TO CHECK diagfwd_connect_bridge(0); #endif pr_info(DM_DEV_TTY_MODULE_NAME ": %s : lge_dm_dev_tty_ioctl " "DM_DEV_TTY_IOCTL_MODEM_CLOSE\n", __func__); break; case DM_DEV_TTY_ENABLE: /* change path to DM DEV */ mutex_lock(&driver->diagchar_mutex); pr_info(DM_DEV_TTY_MODULE_NAME ": %s:, Logging mode Change to DM_DEV_MODE\n",__func__); driver->logging_mode = DM_DEV_MODE; mutex_unlock(&driver->diagchar_mutex); break; #ifdef CONFIG_MACH_APQ8064_ALTEV case DM_DEV_TTY_MODEM_RESET: pr_info( "DM_TTY_MODEM_RESET\n"); subsys_modem_restart(); break; // kyle00.choi, 20140411, RF Device Check [START] case DM_TTY_MODEM_DEBUGGER: { char rw_buf[300]; memset(rw_buf, 0, sizeof(rw_buf)); strcpy(rw_buf,ssr_noti); if (copy_to_user((void *)arg, &rw_buf, sizeof(rw_buf))) { pr_info(DM_DEV_TTY_MODULE_NAME ": %s: DM_TTY_MODEM_DEBUGGER error! rw_buf = %s\n", __func__, rw_buf); return -EFAULT; } printk("rw_buf = %s\n",rw_buf); break; } // kyle00.choi, 20140411, RF Device Check [END] #endif default: pr_info(DM_DEV_TTY_MODULE_NAME ": %s:" "lge_dm_tty_ioctl error\n", __func__); break; } return 0; }