diff +requires kdsetmode_kdgetmode diff -urNX dontdiff linux-2.6.5/drivers/char/vt.c linux/drivers/char/vt.c --- linux-2.6.5/drivers/char/vt.c 2004-04-03 22:38:04.000000000 -0500 +++ linux/drivers/char/vt.c 2004-05-02 20:48:06.000000000 -0400 @@ -2657,11 +2657,23 @@ { int i, j = -1; const char *desc; + unsigned char saved_kdmode[MAX_NR_CONSOLES]; acquire_console_sem(); + for (i = first; i <= last; i++) { + if (vc_cons[i].d && vc_cons[i].d->vc_sw && CON_IS_VISIBLE(vc_cons[i].d)) { + saved_kdmode[i] = vt_kdgetmode(i); + vt_kdsetmode(i, KD_GRAPHICS); + } + } + desc = csw->con_startup(); if (!desc) { + for (i = first; i <= last; i++) { + if (vc_cons[i].d && vc_cons[i].d->vc_sw && CON_IS_VISIBLE(vc_cons[i].d)) + vt_kdsetmode(i, saved_kdmode[i]); + } release_console_sem(); return; } @@ -2670,7 +2682,6 @@ for (i = first; i <= last; i++) { int old_was_color; - int currcons = i; con_driver_map[i] = csw; @@ -2678,8 +2689,6 @@ continue; j = i; - if (IS_VISIBLE) - save_screen(i); old_was_color = vc_cons[i].d->vc_can_do_color; vc_cons[i].d->vc_sw->con_deinit(vc_cons[i].d); visual_init(i, 0); @@ -2692,8 +2701,8 @@ if (old_was_color != vc_cons[i].d->vc_can_do_color) clear_buffer_attributes(i); - if (IS_VISIBLE) - update_screen(i); + if (CON_IS_VISIBLE(vc_cons[i].d)) + vt_kdsetmode(i, saved_kdmode[i]); } printk("Console: switching "); if (!deflt)