static long errhandler_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int rv = 0; int ret; if (hidden_reset_enable) return 0; switch(cmd) { case ERRHANDLER_IOCTL_LEVEL2 : if (BLUE_ERROR_HANDLER_LEVEL <= 1) { break; } case ERRHANDLER_IOCTL_LEVEL1 : memset(android_buf,0,sizeof(android_buf)); if (copy_from_user(android_buf, (void __user *)arg, sizeof(android_buf))) { rv = -EFAULT; goto err1; } ret = LGE_ErrorHandler_Main(ANDROID_CRASH, (char *)android_buf); smsm_reset_modem(ret); while(1) ; break; default: rv = -EINVAL; break; } err1: return rv; }
int msm_proc_comm(unsigned cmd, unsigned *data1, unsigned *data2) { unsigned base = (unsigned)MSM_SHARED_RAM_BASE; unsigned long flags; int ret; spin_lock_irqsave(&proc_comm_lock, flags); #ifdef CONFIG_LGE_BLUE_ERROR_HANDLER if (proc_comm_wait_for(base + MDM_STATUS, PCOM_READY)) goto crash; #else if (msm_proc_comm_disable) { ret = -EIO; goto end; } again: if (proc_comm_wait_for(base + MDM_STATUS, PCOM_READY)) goto again; #endif writel(cmd, base + APP_COMMAND); writel(data1 ? *data1 : 0, base + APP_DATA1); writel(data2 ? *data2 : 0, base + APP_DATA2); /* Make sure the writes complete before notifying the other side */ dsb(); notify_other_proc_comm(); if (proc_comm_wait_for(base + APP_COMMAND, PCOM_CMD_DONE)) #ifdef CONFIG_LGE_BLUE_ERROR_HANDLER goto crash; #else goto again; #endif if (readl(base + APP_STATUS) == PCOM_CMD_SUCCESS) { if (data1) *data1 = readl(base + APP_DATA1); if (data2) *data2 = readl(base + APP_DATA2); ret = 0; } else { ret = -EIO; } writel(PCOM_CMD_IDLE, base + APP_COMMAND); switch (cmd) { case PCOM_RESET_CHIP: case PCOM_RESET_CHIP_IMM: case PCOM_RESET_APPS: msm_proc_comm_disable = 1; printk(KERN_ERR "msm: proc_comm: proc comm disabled\n"); break; } end: /* Make sure the writes complete before returning */ dsb(); spin_unlock_irqrestore(&proc_comm_lock, flags); return ret; #ifdef CONFIG_LGE_BLUE_ERROR_HANDLER /* LGE_CHANGE_S [[email protected]] 2009-07-06 <For Error Handler > */ crash: { extern char * error_modem_message ; extern int LG_ErrorHandler_enable; // extern int get_status_hidden_reset(); int ret; spin_unlock_irqrestore(&proc_comm_lock, flags); if (LG_ErrorHandler_enable) // check using proc_comm after arm9 crash return 0; // if(get_status_hidden_reset()==0 ) { ret = LGE_ErrorHandler_Main(MODEM_CRASH, error_modem_message); smsm_reset_modem(ret); // } else { // smsm_reset_modem(SMSM_SYSTEM_REBOOT); // } while(1) ; } /* LGE_CHANGE_E [[email protected]] 2009-07-06 <For Error Handler > */ #endif }
int msm_proc_comm(unsigned cmd, unsigned *data1, unsigned *data2) { unsigned base = (unsigned)MSM_SHARED_RAM_BASE; unsigned long flags; int ret; spin_lock_irqsave(&proc_comm_lock, flags); //LGE_CHANGE_S [[email protected]] 2009-04-01 <For Error Handler> /* again :*/ if (proc_comm_wait_for(base + MDM_STATUS, PCOM_READY)) { goto crash; } //LGE_CHANGE_E [[email protected]] 2009-04-01 <For Error Handler> writel(cmd, base + APP_COMMAND); writel(data1 ? *data1 : 0, base + APP_DATA1); writel(data2 ? *data2 : 0, base + APP_DATA2); notify_other_proc_comm(); //LGE_CHANGE_S [[email protected]] 2009-04-01 <For Error Handler> if (proc_comm_wait_for(base + APP_COMMAND, PCOM_CMD_DONE)) { goto crash; } //LGE_CHANGE_E [[email protected]] 2009-04-01 <For Error Handler> if (readl(base + APP_STATUS) == PCOM_CMD_SUCCESS) { if (data1) *data1 = readl(base + APP_DATA1); if (data2) *data2 = readl(base + APP_DATA2); ret = 0; } else { ret = -EIO; } writel(PCOM_CMD_IDLE, base + APP_COMMAND); spin_unlock_irqrestore(&proc_comm_lock, flags); return ret; /* LGE_CHANGE_S [[email protected]] 2009-07-06 <For Error Handler > */ crash: { extern char * error_modem_message ; extern int LG_ErrorHandler_enable; // extern int get_status_hidden_reset(); int ret; spin_unlock_irqrestore(&proc_comm_lock, flags); if (LG_ErrorHandler_enable) // check using proc_comm after arm9 crash return 0; // if(get_status_hidden_reset()==0 ) { ret = LGE_ErrorHandler_Main(MODEM_CRASH, error_modem_message); smsm_reset_modem(ret); // } else { // smsm_reset_modem(SMSM_SYSTEM_REBOOT); // } while(1) ; } /* LGE_CHANGE_E [[email protected]] 2009-07-06 <For Error Handler > */ }