diff --git a/drivers/soc/qcom/lge/lge_handle_panic.c b/drivers/soc/qcom/lge/lge_handle_panic.c index e2d1d43d229a8580c7710fd9d02cfbe835cf7070..75958e7f4d8e336b05c60b0942c6a75d1a7ad3fc 100644 --- a/drivers/soc/qcom/lge/lge_handle_panic.c +++ b/drivers/soc/qcom/lge/lge_handle_panic.c @@ -402,7 +402,7 @@ extern void __iomem *wdt_timer_get_timer0_base(void); static int gen_wdt_bark(const char *val, struct kernel_param *kp) { - void __iomem *msm_tmr0_base; + /*void __iomem *msm_tmr0_base; msm_tmr0_base = wdt_timer_get_timer0_base(); pr_info("%s\n", __func__); @@ -416,14 +416,15 @@ static int gen_wdt_bark(const char *val, struct kernel_param *kp) pr_err("%s failed\n", __func__); - return -EIO; + return -EIO;*/ + return 0; } module_param_call(gen_wdt_bark, gen_wdt_bark, param_get_bool, &dummy_arg, S_IWUSR | S_IRUGO); static int gen_wdt_bite(const char *val, struct kernel_param *kp) { - void __iomem *msm_tmr0_base; + /*void __iomem *msm_tmr0_base; msm_tmr0_base = wdt_timer_get_timer0_base(); pr_info("%s\n", __func__); @@ -437,7 +438,8 @@ static int gen_wdt_bite(const char *val, struct kernel_param *kp) pr_err("%s failed\n", __func__); - return -EIO; + return -EIO;*/ + return 0; } module_param_call(gen_wdt_bite, gen_wdt_bite, param_get_bool, &dummy_arg, S_IWUSR | S_IRUGO); @@ -583,7 +585,7 @@ module_param_call(gen_unknown_reset, gen_unknown_reset, param_get_bool, void lge_disable_watchdog(void) { - static int once = 1; + /*static int once = 1; void __iomem *msm_tmr0_base; if (once > 1) @@ -597,7 +599,7 @@ void lge_disable_watchdog(void) mb(); once++; - pr_info("%s\n", __func__); + pr_info("%s\n", __func__);*/ } void lge_panic_handler_fb_free_page(unsigned long mem_addr, unsigned long size) diff --git a/drivers/tty/serial/kgdboc.c b/drivers/tty/serial/kgdboc.c index 10020547c60b5735d4cbf667956c911aa06a1030..1c8cf79165f2e5c86314b0107ebd597064003687 100644 --- a/drivers/tty/serial/kgdboc.c +++ b/drivers/tty/serial/kgdboc.c @@ -29,6 +29,7 @@ static struct kgdb_io kgdboc_io_ops; static int configured = -1; static char config[MAX_CONFIG_LEN]; +static int config_retry_time = 0; static struct kparam_string kps = { .string = config, .maxlen = MAX_CONFIG_LEN, @@ -153,6 +154,28 @@ static void cleanup_kgdboc(void) kgdb_unregister_io_module(&kgdboc_io_ops); } +static int kgdbretry_option_setup(char *opt) +{ + if (strlen(opt) > MAX_CONFIG_LEN) { + printk(KERN_ERR "kgdbretry: config string too long\n"); + return -ENOSPC; + } + config_retry_time = simple_strtoul(opt, NULL, 10); + + return 0; +} + +__setup("kgdbretry=", kgdbretry_option_setup); + +static int configure_kgdboc(void); +static void ttycheck_func(struct work_struct *work) +{ + config_retry_time = 0; + configure_kgdboc(); +} + +static DECLARE_DELAYED_WORK(ttycheck_work, ttycheck_func); + static int configure_kgdboc(void) { struct tty_driver *p; @@ -179,8 +202,15 @@ static int configure_kgdboc(void) goto do_register; p = tty_find_polling_driver(cptr, &tty_line); - if (!p) + if (!p) { + printk(KERN_INFO "kgdb will retry in %d secs\n", config_retry_time); + if (config_retry_time > 0) { + INIT_DELAYED_WORK(&ttycheck_work, ttycheck_func); + schedule_delayed_work(&ttycheck_work, config_retry_time * HZ); + return -ENODEV; + } goto noconfig; + } cons = console_drivers; while (cons) { @@ -212,6 +242,7 @@ do_register: nmi_con_failed: kgdb_unregister_io_module(&kgdboc_io_ops); noconfig: + printk(KERN_ERR "kgdb failed to initialise\n"); kgdboc_unregister_kbd(); config[0] = 0; configured = 0; @@ -335,5 +366,6 @@ module_init(init_kgdboc); module_exit(cleanup_kgdboc); module_param_call(kgdboc, param_set_kgdboc_var, param_get_string, &kps, 0644); MODULE_PARM_DESC(kgdboc, "<serial_device>[,baud]"); +MODULE_PARM_DESC(kgdbretry, "<delay in seconds> before retrying tty"); MODULE_DESCRIPTION("KGDB Console TTY Driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/tty/serial/msm_serial_hs_lite.c b/drivers/tty/serial/msm_serial_hs_lite.c index f570cff5a0bcca6eb870bd654d5065f4f623b604..de8fd06c68729a4ec613e6a0aa4bfbe0d2fb08a0 100644 --- a/drivers/tty/serial/msm_serial_hs_lite.c +++ b/drivers/tty/serial/msm_serial_hs_lite.c @@ -821,6 +821,9 @@ static void msm_hsl_reset(struct uart_port *port) msm_hsl_write(port, RESET_BREAK_INT, regmap[vid][UARTDM_CR]); msm_hsl_write(port, RESET_CTS, regmap[vid][UARTDM_CR]); msm_hsl_write(port, RFR_LOW, regmap[vid][UARTDM_CR]); + + /* Disable DM modes */ + msm_hsl_write(port, 0, regmap[vid][UARTDM_DMEN]); } static unsigned int msm_hsl_get_mctrl(struct uart_port *port) @@ -1372,7 +1375,7 @@ static int msm_poll_init(struct uart_port *port) /* Enable single character mode on RX FIFO */ /* A later patch from David Boyd suggests this causes problems... */ - /* msm_hsl_write(port, UARTDM_DMEN_RX_SC_ENABLE, regmap[vid][UARTDM_DMEN]); */ + //msm_hsl_write(port, UARTDM_DMEN_RX_SC_ENABLE, regmap[vid][UARTDM_DMEN]); return 0; } @@ -1465,8 +1468,9 @@ static void msm_poll_put_char(struct uart_port *port, unsigned char c) imr = msm_hsl_read(port, regmap[vid][UARTDM_IMR]); msm_hsl_write(port, 0, regmap[vid][UARTDM_IMR]); - /*if (msm_port->is_uartdm)*/ - reset_dm_count(port, 1); + //if (UART_TO_MSM(port)->is_uartdm) + // reset_dm_count(port, 1); + reset_dm_count(port, 1); /* Wait until FIFO is empty */ while (!(msm_hsl_read(port, regmap[vid][UARTDM_SR]) & UARTDM_SR_TXRDY_BMSK)) diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index ba0266c65054d229d05037140dcb29b63fd5c144..ccfe1e9c9eeb32e7ab33a1e83ebc4ebe580b7f29 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -371,6 +371,8 @@ struct tty_driver *tty_find_polling_driver(char *name, int *line) mutex_lock(&tty_mutex); /* Search through the tty devices to look for a match */ list_for_each_entry(p, &tty_drivers, tty_drivers) { + pr_info("name: %s p->name: %s p->driver_name: %s\n", name, p->name, p->driver_name); + if (strncmp(name, p->name, len) != 0) continue; stp = str; diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c index d9e098df2ef31cb65087ce26c28d5e1e28b73e9b..cff5d31a9862c570331282c6e23000d40f9a92be 100644 --- a/kernel/debug/debug_core.c +++ b/kernel/debug/debug_core.c @@ -1020,11 +1020,15 @@ int dbg_io_get_char(void) */ void kgdb_breakpoint(void) { + printk("Enter KGDB breakpoint.\n"); + atomic_inc(&kgdb_setting_breakpoint); wmb(); /* Sync point before breakpoint */ arch_kgdb_breakpoint(); wmb(); /* Sync point after breakpoint */ atomic_dec(&kgdb_setting_breakpoint); + + printk("Exit KGDB breakpoint.\n"); } EXPORT_SYMBOL_GPL(kgdb_breakpoint);