From e921bb961dd464115f73677937fc87b1fbd02660 Mon Sep 17 00:00:00 2001 From: eeh Date: Sun, 25 Apr 1999 16:16:31 +0000 Subject: [PATCH] Defer final console attach to zs_attach(). --- sys/arch/sparc64/dev/kd.c | 63 ++++++++++++++++-------------- sys/arch/sparc64/dev/zs.c | 80 +++++++++++---------------------------- 2 files changed, 57 insertions(+), 86 deletions(-) diff --git a/sys/arch/sparc64/dev/kd.c b/sys/arch/sparc64/dev/kd.c index cc897c2a4b41..6719274b4b30 100644 --- a/sys/arch/sparc64/dev/kd.c +++ b/sys/arch/sparc64/dev/kd.c @@ -1,4 +1,4 @@ -/* $NetBSD: kd.c,v 1.1.1.1 1998/06/20 04:58:51 eeh Exp $ */ +/* $NetBSD: kd.c,v 1.2 1999/04/25 16:16:31 eeh Exp $ */ /*- * Copyright (c) 1996 The NetBSD Foundation, Inc. @@ -517,35 +517,40 @@ kdcngetc(dev) struct kbd_state *ks = &kdcn_state; int code, class, data, keysym; - for (;;) { - code = zs_getc(zs_conschan); - keysym = kbd_code_to_keysym(ks, code); - class = KEYSYM_CLASS(keysym); - - switch (class) { - case KEYSYM_ASCII: - goto out; - - case KEYSYM_CLRMOD: - case KEYSYM_SETMOD: - data = (keysym & 0x1F); - /* Only allow ctrl or shift. */ - if (data > KBMOD_SHIFT_R) + if (!zs_conschan) { + /* Not initialized yet */ + return -1; + } else { + for (;;) { + code = zs_getc(zs_conschan); + keysym = kbd_code_to_keysym(ks, code); + class = KEYSYM_CLASS(keysym); + + switch (class) { + case KEYSYM_ASCII: + goto out; + + case KEYSYM_CLRMOD: + case KEYSYM_SETMOD: + data = (keysym & 0x1F); + /* Only allow ctrl or shift. */ + if (data > KBMOD_SHIFT_R) + break; + data = 1 << data; + if (class == KEYSYM_SETMOD) + ks->kbd_modbits |= data; + else + ks->kbd_modbits &= ~data; break; - data = 1 << data; - if (class == KEYSYM_SETMOD) - ks->kbd_modbits |= data; - else - ks->kbd_modbits &= ~data; - break; - - case KEYSYM_ALL_UP: - /* No toggle keys here. */ - ks->kbd_modbits = 0; - break; - - default: /* ignore all other keysyms */ - break; + + case KEYSYM_ALL_UP: + /* No toggle keys here. */ + ks->kbd_modbits = 0; + break; + + default: /* ignore all other keysyms */ + break; + } } } out: diff --git a/sys/arch/sparc64/dev/zs.c b/sys/arch/sparc64/dev/zs.c index bbf7bca75191..fe45870f66b9 100644 --- a/sys/arch/sparc64/dev/zs.c +++ b/sys/arch/sparc64/dev/zs.c @@ -1,4 +1,4 @@ -/* $NetBSD: zs.c,v 1.10 1999/04/24 21:08:12 eeh Exp $ */ +/* $NetBSD: zs.c,v 1.11 1999/04/25 16:16:31 eeh Exp $ */ /*- * Copyright (c) 1996 The NetBSD Foundation, Inc. @@ -169,6 +169,12 @@ zs_get_chan_addr(zs_unit, channel) if (zs_unit >= NZS) return (NULL); addr = zsaddr[zs_unit]; +#ifdef DEBUG + if (addr == NULL) { + db_printf("zs_get_chan_addr(): unit %d channel %d not found\n", zs_unit, channel); + Debugger(); + } +#endif if (addr == NULL) return (NULL); if (channel == 0) { @@ -342,7 +348,8 @@ zs_attach_sbus(parent, self, aux) self->dv_xname); return; } - zsaddr[zs_unit] = (struct zsdevice *)kvaddr; + zsaddr[zs_unit] = (struct zsdevice *) + (long)kvaddr; } } zs_attach(zsc, sa->sa_pri); @@ -411,6 +418,9 @@ zs_attach(zsc, pri) cs->cs_brg_clk = PCLK / 16; zc = zs_get_chan_addr(zs_unit, channel); + if (zs_hwflags[zs_unit][channel] == ZS_HWFLAG_CONSOLE) { + zs_conschan = (struct zschan *)zc; + } cs->cs_reg_csr = &zc->zc_csr; cs->cs_reg_data = &zc->zc_data; @@ -1033,38 +1043,16 @@ consinit() OF_getprop(node, "stdin", &stdin, sizeof(stdin)); DBPRINT(("stdin instance = %x\r\n", stdin)); - node = OF_instance_to_package(stdin); + if ((node = OF_instance_to_package(stdin)) == 0) + goto setup_output; DBPRINT(("stdin package = %x\r\n", node)); if (OF_getproplen(node,"keyboard") >= 0) { inSource = PROMDEV_KBD; - goto setup_output; - } - if (strcmp(getpropstring(node,"device_type"),"serial") != 0) { + } else if (strcmp(getpropstring(node,"device_type"),"serial") != 0) { /* not a serial, not keyboard. what is it?!? */ inSource = -1; - goto setup_output; } - /* - * At this point we assume the device path is in the form - * ....device@x,y:a for ttya and ...device@x,y:b for ttyb. - * If it isn't, we defer to the ROM - */ - if(OF_instance_to_path(stdin, buffer, sizeof(buffer)) <= 0) { - printf("consinit: bogus stdin path.\n"); - goto setup_output; - } - cp = buffer; - while (*cp) - cp++; - cp -= 2; -#ifdef DEBUG - if (cp < buffer) - panic("consinit: bad stdin path %s",buffer); -#endif - /* XXX: only allows tty's a->z, assumes PROMDEV_TTYx contig */ - if (cp[0]==':' && cp[1] >= 'a' && cp[1] <= 'z') - inSource = PROMDEV_TTYA + (cp[1] - 'a'); - /* else use rom */ + setup_output: DBPRINT(("setting up stdout\r\n")); node = OF_finddevice("/chosen"); @@ -1082,29 +1070,6 @@ setup_output: != 0) { /* not screen, not serial. Whatzit? */ outSink = -1; - } else { /* serial console. which? */ - /* - * At this point we assume the device path is in the - * form: - * ....device@x,y:a for ttya, etc. - * If it isn't, we defer to the ROM - */ - if(OF_instance_to_path(stdout, buffer, sizeof(buffer)) <= 0) { - printf("consinit: bogus stdin path.\n"); - goto setup_output; - } - cp = buffer; - while (*cp) - cp++; - cp -= 2; -#ifdef DEBUG - if (cp < buffer) - panic("consinit: bad stdout path %s",buffer); -#endif - /* XXX: only allows tty's a->z, assumes PROMDEV_TTYx contig */ - if (cp[0]==':' && cp[1] >= 'a' && cp[1] <= 'z') - outSink = PROMDEV_TTYA + (cp[1] - 'a'); - else outSink = -1; } if (inSource != outSink) { printf("cninit: mismatched PROM output selector\n"); @@ -1145,16 +1110,17 @@ setup_output: /* Now that inSource has been validated, print it. */ printf("console is %s\n", prom_inSrc_name[inSource]); - zc = zs_get_chan_addr(zs_unit, channel); - if (zc == NULL) { - printf("cninit: zs not mapped.\n"); - return; - } - zs_conschan = zc; + /* + * We'll just mark this as the future console, but still + * use the PROM until the zs driver attaches. + */ zs_hwflags[zs_unit][channel] = ZS_HWFLAG_CONSOLE; + zs_conschan = NULL; cn_tab = cn; + (*cn->cn_init)(cn); #ifdef KGDB zs_kgdb_init(); #endif + /* Defer the rest to zs_attach */ }