Index: sys/dev/wscons/wsdisplay.c
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wsdisplay.c,v
retrieving revision 1.135
diff -u -r1.135 wsdisplay.c
--- sys/dev/wscons/wsdisplay.c 2 Feb 2012 13:11:25 -0000 1.135
+++ sys/dev/wscons/wsdisplay.c 20 Jan 2014 19:36:46 -0000
@@ -884,6 +884,15 @@
wsdisplay_console_initted = 1;
}
+void
+wsdisplay_cndetach(void)
+{
+ KASSERT(wsdisplay_console_initted == 2);
+
+ cn_tab = NULL;
+ wsdisplay_console_initted = 0;
+}
+
/*
* Tty and cdevsw functions.
*/
Index: sys/dev/wscons/wsdisplay_vcons.c
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wsdisplay_vcons.c,v
retrieving revision 1.29
diff -u -r1.29 wsdisplay_vcons.c
--- sys/dev/wscons/wsdisplay_vcons.c 15 Sep 2013 16:12:00 -0000 1.29
+++ sys/dev/wscons/wsdisplay_vcons.c 20 Jan 2014 19:36:46 -0000
@@ -1262,10 +1262,15 @@
struct vcons_screen *scr = vd->active;
unsigned int dirty;
- if (scr && vd->use_intr == 1) {
+ if (scr && vd->use_intr) {
if (!SCREEN_IS_BUSY(scr)) {
dirty = atomic_swap_uint(&scr->scr_dirty, 0);
- if (dirty > 0) {
+ if (vd->use_intr == 2) {
+ if ((scr->scr_flags & VCONS_NO_REDRAW) == 0) {
+ vd->use_intr = 1;
+ vcons_redraw_screen(scr);
+ }
+ } else if (dirty > 0) {
if ((scr->scr_flags & VCONS_NO_REDRAW) == 0)
vcons_update_screen(scr);
}
@@ -1280,7 +1285,7 @@
{
/* the 'dev' arg we pass to config_interrupts isn't a device_t */
struct vcons_data *vd = (struct vcons_data *)dev;
- vd->use_intr = 1;
+ vd->use_intr = 2;
callout_schedule(&vd->intr, mstohz(33));
}
#endif /* VCONS_DRAW_INTR */
@@ -1309,7 +1314,7 @@
if (!vd->intr_valid)
return;
- vd->use_intr = 1;
+ vd->use_intr = 2;
if (scr)
atomic_inc_uint(&scr->scr_dirty);
#endif
Index: sys/dev/wscons/wsdisplayvar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wsdisplayvar.h,v
retrieving revision 1.50
diff -u -r1.50 wsdisplayvar.h
--- sys/dev/wscons/wsdisplayvar.h 31 Jan 2013 10:57:30 -0000 1.50
+++ sys/dev/wscons/wsdisplayvar.h 20 Jan 2014 19:36:47 -0000
@@ -163,6 +163,7 @@
long);
void wsdisplay_preattach(const struct wsscreen_descr *, void *, int, int,
long);
+void wsdisplay_cndetach(void);
int wsdisplaydevprint(void *, const char *);
int wsemuldisplaydevprint(void *, const char *);