From 061c1d085f021352fd3b1566d425e7da5bd7b2ad Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Sun, 11 Dec 2016 18:08:20 -0800 Subject: [PATCH] kernel - Re-fix chromebook keyboard * The elantec commit broke the chromebook keyboard. Re-fix it. hopefully elantec support still works. --- sys/dev/misc/kbd/atkbd.c | 230 ++++++------------------------------------- sys/dev/misc/kbd/atkbdc.c | 63 ------------ sys/dev/misc/kbd/atkbdcreg.h | 8 -- sys/dev/misc/kbd/atkbdreg.h | 1 - sys/dev/misc/kbd/kbd.c | 16 +-- sys/dev/misc/psm/psm.c | 84 +++++++--------- 6 files changed, 71 insertions(+), 331 deletions(-) diff --git a/sys/dev/misc/kbd/atkbd.c b/sys/dev/misc/kbd/atkbd.c index 1e8b9a3377..b04b6cf65a 100644 --- a/sys/dev/misc/kbd/atkbd.c +++ b/sys/dev/misc/kbd/atkbd.c @@ -61,28 +61,6 @@ static timeout_t atkbd_timeout; -typedef struct atkbd_state { - KBDC kbdc; /* keyboard controller */ - int ks_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */ - int ks_flags; /* flags */ -#define COMPOSE (1 << 0) - int ks_polling; - int ks_state; /* shift/lock key state */ - int ks_accents; /* accent key index (> 0) */ - u_int ks_composed_char; /* composed char code (> 0) */ - u_char ks_prefix; /* AT scan code prefix */ - struct callout ks_timer; -} atkbd_state_t; - -static int atkbd_reset(KBDC kbdc, int flags, int c); - -#define HAS_QUIRK(p, q) (((atkbdc_softc_t *)(p))->quirks & q) -#define ALLOW_DISABLE_KBD(kbdc) !HAS_QUIRK(kbdc, KBDC_QUIRK_KEEP_ACTIVATED) - -#define DEFAULT_DELAY 0x1 /* 500ms */ -#define DEFAULT_RATE 0x10 /* 14Hz */ - - #if 0 static int atkbd_setmuxmode(KBDC kbdc, int value, int *mux_version); #endif @@ -114,7 +92,6 @@ atkbd_attach_unit(int unit, keyboard_t **kbd, int ctlr, int irq, int flags) keyboard_switch_t *sw; int args[2]; int error; - atkbd_state_t *state; sw = kbd_get_switch(ATKBD_DRIVER_NAME); if (sw == NULL) { @@ -147,8 +124,6 @@ atkbd_attach_unit(int unit, keyboard_t **kbd, int ctlr, int irq, int flags) * This is a kludge to compensate for lost keyboard interrupts. * A similar code used to be in syscons. See below. XXX */ - state = (atkbd_state_t *)(*kbd)->kb_data; - callout_init(&state->ks_timer); atkbd_timeout(*kbd); if (bootverbose) @@ -160,7 +135,6 @@ atkbd_attach_unit(int unit, keyboard_t **kbd, int ctlr, int irq, int flags) static void atkbd_timeout(void *arg) { - atkbd_state_t *state; keyboard_t *kbd; /* @@ -200,9 +174,8 @@ atkbd_timeout(void *arg) if (kbd_check_char(kbd)) kbd_intr(kbd, NULL); } + callout_reset(&kbd->kb_atkbd_timeout_ch, hz / 10, atkbd_timeout, arg); crit_exit(); - state = (atkbd_state_t *)kbd->kb_data; - callout_reset(&state->ks_timer, hz / 10, atkbd_timeout, arg); } /* LOW-LEVEL */ @@ -212,6 +185,17 @@ atkbd_timeout(void *arg) #define ATKBD_DEFAULT 0 +typedef struct atkbd_state { + KBDC kbdc; /* keyboard controller */ + int ks_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */ + int ks_flags; /* flags */ +#define COMPOSE (1 << 0) + int ks_polling; + int ks_state; /* shift/lock key state */ + int ks_accents; /* accent key index (> 0) */ + u_int ks_composed_char; /* composed char code (> 0) */ + u_char ks_prefix; /* AT scan code prefix */ +} atkbd_state_t; /* keyboard driver declaration */ static int atkbd_configure(int flags); @@ -258,8 +242,7 @@ keyboard_switch_t atkbdsw = { KEYBOARD_DRIVER(atkbd, atkbdsw, atkbd_configure); /* local functions */ -static int set_typematic(keyboard_t *kbd); /* replaces get_typematic() */ -/* static int get_typematic(keyboard_t *kbd); */ +static int get_typematic(keyboard_t *kbd); static int setup_kbd_port(KBDC kbdc, int port, int intr); static int get_kbd_echo(KBDC kbdc); static int probe_keyboard(KBDC kbdc, int flags); @@ -313,7 +296,7 @@ atkbd_configure(int flags) kbd = kbd_get_keyboard(i); KBD_ALWAYS_LOCK(kbd); kbd_unregister(kbd); - kbd->kb_flags &= ~KB_REGISTERED; + kbd = NULL; /* huh? */ } return 0; } @@ -378,7 +361,6 @@ atkbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) int fkeymap_size; int delay[2]; int *data = (int *)arg; /* data[0]: controller, data[1]: irq */ - int error, needfree; /* XXX */ if (unit == ATKBD_DEFAULT) { @@ -391,7 +373,6 @@ atkbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) accmap = &default_accentmap; fkeymap = default_fkeytab; fkeymap_size = NELEM(default_fkeytab); - needfree = 0; } else if (*kbdp == NULL) { *kbdp = kbd = kmalloc(sizeof(*kbd), M_DEVBUF, M_WAITOK|M_ZERO); state = kmalloc(sizeof(*state), M_DEVBUF, M_WAITOK|M_ZERO); @@ -399,13 +380,6 @@ atkbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) accmap = kmalloc(sizeof(accent_map), M_DEVBUF, M_WAITOK); fkeymap = kmalloc(sizeof(fkey_tab), M_DEVBUF, M_WAITOK); fkeymap_size = NELEM(fkey_tab); - needfree = 1; - if ((kbd == NULL) || (state == NULL) || (keymap == NULL) - || (accmap == NULL) || (fkeymap == NULL)) { - error = ENOMEM; - goto bad; - } - } else if (KBD_IS_INITIALIZED(*kbdp) && KBD_IS_CONFIGURED(*kbdp)) { return 0; } else { @@ -416,14 +390,12 @@ atkbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) accmap = kbd->kb_accentmap; fkeymap = kbd->kb_fkeytab; fkeymap_size = kbd->kb_fkeytab_size; - needfree = 0; } if (!KBD_IS_PROBED(kbd)) { state->kbdc = atkbdc_open(data[0]); if (state->kbdc == NULL) { - error = ENXIO; - goto bad; + return ENXIO; } kbd_init_struct(kbd, ATKBD_DRIVER_NAME, KB_OTHER, unit, flags, KB_PRI_ATKBD, 0, 0); @@ -436,8 +408,7 @@ atkbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) if (probe_keyboard(state->kbdc, flags)) { /* shouldn't happen */ if (flags & KB_CONF_FAIL_IF_NO_KBD) { - error = ENXIO; - goto bad; + return ENXIO; } } else { KBD_FOUND_DEVICE(kbd); @@ -455,12 +426,10 @@ atkbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) if (!KBD_HAS_DEVICE(kbd) && init_keyboard(state->kbdc, &kbd->kb_type, kbd->kb_config) && (kbd->kb_config & KB_CONF_FAIL_IF_NO_KBD)) { - kbd_unregister(kbd); - error = ENXIO; - goto bad; + return ENXIO; } atkbd_ioctl(kbd, KDSETLED, (caddr_t)&state->ks_state); - set_typematic(kbd); + get_typematic(kbd); delay[0] = kbd->kb_delay1; delay[1] = kbd->kb_delay2; atkbd_ioctl(kbd, KDSETREPEAT, (caddr_t)delay); @@ -469,40 +438,19 @@ atkbd_init(int unit, keyboard_t **kbdp, void *arg, int flags) } if (!KBD_IS_CONFIGURED(kbd)) { if (kbd_register(kbd) < 0) { - error = ENXIO; - goto bad; + return ENXIO; } KBD_CONFIG_DONE(kbd); } return 0; -bad: - if (needfree) { - if (state != NULL) - kfree(state, M_DEVBUF); - if (keymap != NULL) - kfree(keymap, M_DEVBUF); - if (accmap != NULL) - kfree(accmap, M_DEVBUF); - if (fkeymap != NULL) - kfree(fkeymap, M_DEVBUF); - if (kbd != NULL) { - kfree(kbd, M_DEVBUF); - *kbdp = NULL; /* insure ref doesn't leak to caller */ - } - } - return error; - } /* finish using this keyboard */ static int atkbd_term(keyboard_t *kbd) { - atkbd_state_t *state = (atkbd_state_t *)kbd->kb_data; - kbd_unregister(kbd); - callout_stop_sync(&state->ks_timer); return 0; } @@ -510,40 +458,6 @@ atkbd_term(keyboard_t *kbd) static int atkbd_intr(keyboard_t *kbd, void *arg) { - atkbd_state_t *state = (atkbd_state_t *)kbd->kb_data; - int delay[2]; - int c; - - if (!KBD_HAS_DEVICE(kbd)) { - /* - * The keyboard was not detected before; - * it must have been reconnected! - */ - init_keyboard(state->kbdc, &kbd->kb_type, kbd->kb_config); - KBD_FOUND_DEVICE(kbd); - atkbd_ioctl(kbd, KDSETLED, (caddr_t)&state->ks_state); - set_typematic(kbd); - delay[0] = kbd->kb_delay1; - delay[1] = kbd->kb_delay2; - atkbd_ioctl(kbd, KDSETREPEAT, (caddr_t)delay); - } - - if (state->ks_polling) - return 0; - - if (KBD_IS_ACTIVE(kbd) && KBD_IS_BUSY(kbd)) { - /* let the callback function to process the input */ - (*kbd->kb_callback.kc_func)(kbd, KBDIO_KEYINPUT, - kbd->kb_callback.kc_arg); - } else { - /* read and discard the input; no one is waiting for input */ - do { - c = atkbd_read_char(kbd, FALSE); - } while (c != NOKEY); - } - return 0; - -#if 0 atkbd_state_t *state; int delay[2]; int c; @@ -576,10 +490,8 @@ atkbd_intr(keyboard_t *kbd, void *arg) } return 0; -#endif } - /* test the interface to the device */ static int atkbd_test_if(keyboard_t *kbd) @@ -781,16 +693,6 @@ next_code: case 0x5d: /* menu key */ keycode = 0x6b; break; - case 0x5e: /* power key */ - keycode = 0x6d; - break; - case 0x5f: /* sleep key */ - keycode = 0x6e; - break; - case 0x63: /* wake key */ - keycode = 0x6f; - break; - default: /* ignore everything else */ goto next_code; } @@ -1112,43 +1014,8 @@ atkbd_poll(keyboard_t *kbd, int on) return 0; } -static int -atkbd_reset(KBDC kbdc, int flags, int c) -{ - /* reset keyboard hardware */ - if (!(flags & KB_CONF_NO_RESET) && !reset_kbd(kbdc)) { - /* - * KEYBOARD ERROR - * Keyboard reset may fail either because the keyboard - * doen't exist, or because the keyboard doesn't pass - * the self-test, or the keyboard controller on the - * motherboard and the keyboard somehow fail to shake hands. - * It is just possible, particularly in the last case, - * that the keyboard controller may be left in a hung state. - * test_controller() and test_kbd_port() appear to bring - * the keyboard controller back (I don't know why and how, - * though.) - */ - empty_both_buffers(kbdc, 10); - test_controller(kbdc); - test_kbd_port(kbdc); - /* - * We could disable the keyboard port and interrupt... but, - * the keyboard may still exist (see above). - */ - set_controller_command_byte(kbdc, - ALLOW_DISABLE_KBD(kbdc) ? 0xff : KBD_KBD_CONTROL_BITS, c); - if (bootverbose) - kprintf("atkbd: failed to reset the keyboard.\n"); - return (EIO); - } - return (0); -} - - /* local functions */ -#if 0 /* replaced by set_typematic() */ static int get_typematic(keyboard_t *kbd) { @@ -1165,7 +1032,7 @@ get_typematic(keyboard_t *kbd) vm86_intcall(0x15, &vmf); if ((vmf.vmf_eflags & PSL_C) || vmf.vmf_ah) return ENODEV; - p = BIOS_PADDRTOVADDR(((u_int32_t)vmf.vmf_es << 4) + vmf.vmf_bx); + p = BIOS_PADDRTOVADDR(((u_int32_t)vmf.vmf_es << 4) + vmf.vmf_bx); if ((readb(p + 6) & 0x40) == 0) /* int 16, function 0x09 supported? */ return ENODEV; vmf.vmf_ax = 0x0900; @@ -1181,23 +1048,6 @@ get_typematic(keyboard_t *kbd) return ENODEV; #endif /* __i386__ */ } -#endif - -static int -set_typematic(keyboard_t *kbd) -{ - int val, error; - atkbd_state_t *state = kbd->kb_data; - - val = typematic(DEFAULT_DELAY, DEFAULT_RATE); - error = write_kbd(state->kbdc, KBDC_SET_TYPEMATIC, val); - if (error == 0) { - kbd->kb_delay1 = typematic_delay(val); - kbd->kb_delay2 = typematic_rate(val); - } - - return (error); -} static int setup_kbd_port(KBDC kbdc, int port, int intr) @@ -1248,7 +1098,6 @@ probe_keyboard(KBDC kbdc, int flags) */ int err; int c; - int m; if (!kbdc_lock(kbdc, TRUE)) { /* driver error? */ @@ -1266,11 +1115,9 @@ probe_keyboard(KBDC kbdc, int flags) empty_both_buffers(kbdc, 100); /* save the current keyboard controller command byte */ - m = kbdc_get_device_mask(kbdc) & ~KBD_KBD_CONTROL_BITS; c = get_controller_command_byte(kbdc); if (c == -1) { /* CONTROLLER ERROR */ - kbdc_set_device_mask(kbdc, m); kbdc_lock(kbdc, FALSE); return ENXIO; } @@ -1283,8 +1130,7 @@ probe_keyboard(KBDC kbdc, int flags) * to set the command byte to particular values. */ test_controller(kbdc); - if (!(flags & KB_CONF_NO_PROBE_TEST)) - test_kbd_port(kbdc); + test_kbd_port(kbdc); err = get_kbd_echo(kbdc); @@ -1295,7 +1141,6 @@ probe_keyboard(KBDC kbdc, int flags) * to the system later. It is NOT recommended to hot-plug * the AT keyboard, but many people do so... */ - kbdc_set_device_mask(kbdc, m | KBD_KBD_CONTROL_BITS); setup_kbd_port(kbdc, TRUE, TRUE); #if 0 if (err) { @@ -1305,7 +1150,7 @@ probe_keyboard(KBDC kbdc, int flags) #endif kbdc_lock(kbdc, FALSE); - return (HAS_QUIRK(kbdc, KBDC_QUIRK_IGNORE_PROBE_RESULT) ? 0 : err); + return err; } static int @@ -1366,12 +1211,6 @@ init_keyboard(KBDC kbdc, int *type, int flags) return EIO; } - if (HAS_QUIRK(kbdc, KBDC_QUIRK_RESET_AFTER_PROBE) && - atkbd_reset(kbdc, flags, c)) { - kbdc_lock(kbdc, FALSE); - return EIO; - } - /* default codeset */ codeset = -1; @@ -1450,12 +1289,6 @@ init_keyboard(KBDC kbdc, int *type, int flags) if (bootverbose) kprintf("atkbd: keyboard ID 0x%x (%d)\n", id, *type); - if (!HAS_QUIRK(kbdc, KBDC_QUIRK_RESET_AFTER_PROBE) && - atkbd_reset(kbdc, flags, c)) { - kbdc_lock(kbdc, FALSE); - return EIO; - } - /* * Allow us to set the XT_KEYBD flag in UserConfig so that keyboards * such as those on the IBM ThinkPad laptop computers can be used @@ -1472,8 +1305,8 @@ init_keyboard(KBDC kbdc, int *type, int flags) * The XT kbd isn't usable unless the proper scan * code set is selected. */ - set_controller_command_byte(kbdc, ALLOW_DISABLE_KBD(kbdc) - ? 0xff : KBD_KBD_CONTROL_BITS, c); + set_controller_command_byte(kbdc, + KBD_KBD_CONTROL_BITS, c); kbdc_lock(kbdc, FALSE); kprintf("atkbd: unable to set the XT keyboard mode.\n"); return EIO; @@ -1513,9 +1346,7 @@ init_keyboard(KBDC kbdc, int *type, int flags) */ if (send_kbd_command_and_data(kbdc, ATKBD_CMD_SETLEDS, 0) != KBD_ACK) kprintf("atkbd: setleds failed\n"); - if (!ALLOW_DISABLE_KBD(kbdc)) - send_kbd_command(kbdc, KBDC_ENABLE_KBD); - /* used to be: send_kbd_command(kbdc, ATKBD_CMD_ENABLE); */ + send_kbd_command(kbdc, ATKBD_CMD_ENABLE); #if 0 /* DEBUGGING */ @@ -1552,9 +1383,10 @@ init_keyboard(KBDC kbdc, int *type, int flags) * This is serious; we are left with the disabled * keyboard intr. */ - set_controller_command_byte(kbdc, ALLOW_DISABLE_KBD(kbdc) - ? 0xff : (KBD_KBD_CONTROL_BITS | KBD_TRANSLATION | - KBD_OVERRIDE_KBD_LOCK | mux_mask), c); + set_controller_command_byte(kbdc, + KBD_KBD_CONTROL_BITS | KBD_TRANSLATION | + KBD_OVERRIDE_KBD_LOCK | mux_mask, + c); kbdc_lock(kbdc, FALSE); kprintf("atkbd: unable to enable the keyboard port and intr.\n"); return EIO; @@ -1634,7 +1466,7 @@ write_kbd(KBDC kbdc, int command, int data) KBD_KBD_CONTROL_BITS, KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT)) { /* CONTROLLER ERROR */ - kbdc_lock(kbdc, FALSE); + kbdc_lock(kbdc, FALSE); crit_exit(); return EIO; } @@ -1649,7 +1481,7 @@ write_kbd(KBDC kbdc, int command, int data) #endif if (send_kbd_command_and_data(kbdc, command, data) != KBD_ACK) - send_kbd_command(kbdc, KBDC_ENABLE_KBD); + send_kbd_command(kbdc, KBDC_ENABLE_KBD); #if 0 /* restore the interrupts */ diff --git a/sys/dev/misc/kbd/atkbdc.c b/sys/dev/misc/kbd/atkbdc.c index e970ca9c66..0e615068dd 100644 --- a/sys/dev/misc/kbd/atkbdc.c +++ b/sys/dev/misc/kbd/atkbdc.c @@ -106,42 +106,6 @@ static int wait_for_kbd_ack(atkbdc_softc_t *kbdc); static int wait_for_aux_data(atkbdc_softc_t *kbdc); static int wait_for_aux_ack(atkbdc_softc_t *kbdc); -struct atkbdc_quirks { - const char* bios_vendor; - const char* maker; - const char* product; - int quirk; -}; - -static struct atkbdc_quirks quirks[] = { - {"coreboot", "Acer", "Peppy", - KBDC_QUIRK_KEEP_ACTIVATED | KBDC_QUIRK_IGNORE_PROBE_RESULT | - KBDC_QUIRK_RESET_AFTER_PROBE | KBDC_QUIRK_SETLEDS_ON_INIT}, - - {NULL, NULL, NULL, 0} -}; - -#define QUIRK_STR_MATCH(s1, s2) (s1 == NULL || \ - (s2 != NULL && !strcmp(s1, s2))) - -static int -atkbdc_getquirks(void) -{ - int i; - char* bios_vendor = kgetenv("smbios.bios.vendor"); - char* maker = kgetenv("smbios.system.maker"); - char* product = kgetenv("smbios.system.product"); - - for (i=0; quirks[i].quirk != 0; ++i) - if (QUIRK_STR_MATCH(quirks[i].bios_vendor, bios_vendor) && - QUIRK_STR_MATCH(quirks[i].maker, maker) && - QUIRK_STR_MATCH(quirks[i].product, product)) - return (quirks[i].quirk); - - return (0); -} - - atkbdc_softc_t * atkbdc_get_softc(int unit) { @@ -251,9 +215,6 @@ atkbdc_setup(atkbdc_softc_t *sc, bus_space_tag_t tag, bus_space_handle_t h0, sc->iot = tag; sc->ioh0 = h0; sc->ioh1 = h1; - - sc->quirks = atkbdc_getquirks(); - return 0; } @@ -883,7 +844,6 @@ empty_both_buffers(KBDC p, int wait) int c2 = 0; #endif int delta = 2; - int waited = 0; for (t = wait; t > 0; ) { if ((f = read_status(kbdcp(p))) & KBDS_ANY_BUFFER_FULL) { @@ -899,15 +859,6 @@ empty_both_buffers(KBDC p, int wait) } else { t -= delta; } - /* - * Some systems (Intel/IBM blades) do not have keyboard devices and - * will thus hang in this procedure. Time out after delta seconds to - * avoid this hang -- the keyboard attach will fail later on. - */ - waited += (delta * 1000); - if (waited == (delta * 1000000)) - return; - DELAY(delta*1000); } #if KBDIO_DEBUG >= 2 @@ -1091,20 +1042,6 @@ test_aux_port(KBDC p) } int -kbdc_get_device_mask(KBDC p) -{ - return kbdcp(p)->command_mask; -} - -void -kbdc_set_device_mask(KBDC p, int mask) -{ - kbdcp(p)->command_mask = - mask & (((kbdcp(p)->quirks & KBDC_QUIRK_KEEP_ACTIVATED) - ? 0 : KBD_KBD_CONTROL_BITS) | KBD_AUX_CONTROL_BITS); -} - -int get_controller_command_byte(KBDC p) { if (kbdcp(p)->command_byte != -1) diff --git a/sys/dev/misc/kbd/atkbdcreg.h b/sys/dev/misc/kbd/atkbdcreg.h index 8eb374592c..b8960d6060 100644 --- a/sys/dev/misc/kbd/atkbdcreg.h +++ b/sys/dev/misc/kbd/atkbdcreg.h @@ -234,11 +234,6 @@ typedef struct atkbdc_softc { int lock; /* FIXME: XXX not quite a semaphore... */ kbdkqueue kbd; /* keyboard data queue */ kbdkqueue aux; /* auxiliary data queue */ - int quirks; -#define KBDC_QUIRK_KEEP_ACTIVATED (1 << 0) -#define KBDC_QUIRK_IGNORE_PROBE_RESULT (1 << 1) -#define KBDC_QUIRK_RESET_AFTER_PROBE (1 << 2) -#define KBDC_QUIRK_SETLEDS_ON_INIT (1 << 3) } atkbdc_softc_t; enum kbdc_device_ivar { @@ -295,9 +290,6 @@ int test_controller(KBDC kbdc); int test_kbd_port(KBDC kbdc); int test_aux_port(KBDC kbdc); -int kbdc_get_device_mask(KBDC kbdc); -void kbdc_set_device_mask(KBDC kbdc, int mask); - int get_controller_command_byte(KBDC kbdc); int set_controller_command_byte(KBDC kbdc, int command, int flag); diff --git a/sys/dev/misc/kbd/atkbdreg.h b/sys/dev/misc/kbd/atkbdreg.h index e9a7db89b0..5e6dca6145 100644 --- a/sys/dev/misc/kbd/atkbdreg.h +++ b/sys/dev/misc/kbd/atkbdreg.h @@ -36,7 +36,6 @@ #define KB_CONF_FAIL_IF_NO_KBD (1 << 0) /* don't install if no kbd is found */ #define KB_CONF_NO_RESET (1 << 1) /* don't reset the keyboard */ #define KB_CONF_ALT_SCANCODESET (1 << 2) /* assume the XT type keyboard */ -#define KB_CONF_NO_PROBE_TEST (1 << 3) /* don't test keyboard during probe */ #ifdef _KERNEL diff --git a/sys/dev/misc/kbd/kbd.c b/sys/dev/misc/kbd/kbd.c index f05320af8c..87eadfd3e4 100644 --- a/sys/dev/misc/kbd/kbd.c +++ b/sys/dev/misc/kbd/kbd.c @@ -333,7 +333,7 @@ kbd_unregister(keyboard_t *kbd) return 0; } -/* find a function table by the driver name */ +/* find a funciton table by the driver name */ keyboard_switch_t * kbd_get_switch(char *driver) { @@ -795,7 +795,7 @@ genkbdread(struct dev_read_args *ap) return ENXIO; } while (sc->gkb_q_length == 0) { - if (ap->a_ioflag & O_NONBLOCK) { /* used to be IO_NDELAY */ + if (ap->a_ioflag & IO_NDELAY) { /* O_NONBLOCK? */ lwkt_reltoken(&tty_token); crit_exit(); return EWOULDBLOCK; @@ -923,15 +923,15 @@ genkbdfilter(struct knote *kn, long hint) crit_enter(); lwkt_gettoken(&tty_token); sc = dev->si_drv1; - kbd = kbd_get_keyboard(KBD_INDEX(dev)); + kbd = kbd_get_keyboard(KBD_INDEX(dev)); if ((sc == NULL) || (kbd == NULL) || !KBD_IS_VALID(kbd)) { /* The keyboard has gone */ kn->kn_flags |= (EV_EOF | EV_NODATA); ready = 1; } else { if (sc->gkb_q_length > 0) - ready = 1; - } + ready = 1; + } lwkt_reltoken(&tty_token); crit_exit(); @@ -1405,13 +1405,7 @@ genkbd_keyaction(keyboard_t *kbd, int keycode, int up, int *shiftstate, state &= ~NLKDOWN; break; case CLK: -#ifndef PC98 state &= ~CLKDOWN; -#else - state &= ~CLKED; - i = state & LOCK_MASK; - (void)kbdd_ioctl(kbd, KDSETLED, (caddr_t)&i); -#endif break; case SLK: state &= ~SLKDOWN; diff --git a/sys/dev/misc/psm/psm.c b/sys/dev/misc/psm/psm.c index 6931dc9f9f..050880e104 100644 --- a/sys/dev/misc/psm/psm.c +++ b/sys/dev/misc/psm/psm.c @@ -498,8 +498,6 @@ enum { #define PSM_FLAGS_FINGERDOWN 0x0001 /* VersaPad finger down */ #define kbdcp(p) ((atkbdc_softc_t *)(p)) -#define ALWAYS_RESTORE_CONTROLLER(kbdc) !(kbdcp(kbdc)->quirks \ - & KBDC_QUIRK_KEEP_ACTIVATED) /* Tunables */ static int tap_enabled = -1; @@ -1155,8 +1153,7 @@ doopen(struct psm_softc *sc, int command_byte) /* enable the aux port and interrupt */ if (!set_controller_command_byte(sc->kbdc, - kbdc_get_device_mask(sc->kbdc), - (command_byte & KBD_KBD_CONTROL_BITS) | + KBD_AUX_CONTROL_BITS, KBD_ENABLE_AUX_PORT | KBD_ENABLE_AUX_INT)) { /* CONTROLLER ERROR */ disable_aux_dev(sc->kbdc); @@ -1201,9 +1198,8 @@ reinitialize(struct psm_softc *sc, int doinit) /* enable the aux port but disable the aux interrupt and the keyboard */ if ((c == -1) || !set_controller_command_byte(sc->kbdc, - kbdc_get_device_mask(sc->kbdc), - KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT | - KBD_ENABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { + KBD_AUX_CONTROL_BITS, + KBD_ENABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { /* CONTROLLER ERROR */ crit_exit(); kbdc_lock(sc->kbdc, FALSE); @@ -1309,13 +1305,14 @@ psmidentify(driver_t *driver, device_t parent) bus_delete_resource(psmc, SYS_RES_IRQ, 0); bus_set_resource(psm, SYS_RES_IRQ, KBDC_RID_AUX, irq, 1, - machintr_legacy_intr_cpuid(irq)); + machintr_legacy_intr_cpuid(irq)); } #define endprobe(v) do { \ if (bootverbose) \ --verbose; \ - kbdc_set_device_mask(sc->kbdc, mask); \ + set_controller_command_byte(sc->kbdc, \ + KBD_AUX_CONTROL_BITS, KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT); \ kbdc_lock(sc->kbdc, FALSE); \ return (v); \ } while (0) @@ -1329,7 +1326,6 @@ psmprobe(device_t dev) int stat[3]; int command_byte; /* int rid; */ - int mask; int i; uintptr_t irq; uintptr_t flags; @@ -1377,7 +1373,6 @@ psmprobe(device_t dev) empty_both_buffers(sc->kbdc, 10); /* save the current command byte; it will be used later */ - mask = kbdc_get_device_mask(sc->kbdc) & ~KBD_AUX_CONTROL_BITS; command_byte = get_controller_command_byte(sc->kbdc); if (verbose) kprintf("psm%d: current command byte:%04x\n", unit, @@ -1410,15 +1405,12 @@ psmprobe(device_t dev) * enabled during this routine */ if (!set_controller_command_byte(sc->kbdc, - KBD_KBD_CONTROL_BITS | KBD_AUX_CONTROL_BITS, - KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT | + KBD_AUX_CONTROL_BITS, KBD_ENABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { /* * this is CONTROLLER ERROR; I don't know how to recover * from this error... */ - if (ALWAYS_RESTORE_CONTROLLER(sc->kbdc)) - restore_controller(sc->kbdc, command_byte); kprintf("psm%d: unable to set the command byte.\n", unit); endprobe(ENXIO); } @@ -1464,8 +1456,6 @@ psmprobe(device_t dev) recover_from_error(sc->kbdc); if (sc->config & PSM_CONFIG_IGNPORTERROR) break; - if (ALWAYS_RESTORE_CONTROLLER(sc->kbdc)) - restore_controller(sc->kbdc, command_byte); if (verbose) kprintf("psm%d: the aux port is not " @@ -1490,8 +1480,6 @@ psmprobe(device_t dev) */ if (!reset_aux_dev(sc->kbdc)) { recover_from_error(sc->kbdc); - if (ALWAYS_RESTORE_CONTROLLER(sc->kbdc)) - restore_controller(sc->kbdc, command_byte); if (verbose) kprintf("psm%d: failed to reset the aux " "device.\n", unit); @@ -1513,8 +1501,6 @@ psmprobe(device_t dev) if (!enable_aux_dev(sc->kbdc) || !disable_aux_dev(sc->kbdc)) { /* MOUSE ERROR */ recover_from_error(sc->kbdc); - if (ALWAYS_RESTORE_CONTROLLER(sc->kbdc)) - restore_controller(sc->kbdc, command_byte); if (verbose) kprintf("psm%d: failed to enable the aux device.\n", unit); @@ -1536,8 +1522,6 @@ psmprobe(device_t dev) /* verify the device is a mouse */ sc->hw.hwid = get_aux_id(sc->kbdc); if (!is_a_mouse(sc->hw.hwid)) { - if (ALWAYS_RESTORE_CONTROLLER(sc->kbdc)) - restore_controller(sc->kbdc, command_byte); if (verbose) kprintf("psm%d: unknown device type (%d).\n", unit, sc->hw.hwid); @@ -1636,22 +1620,17 @@ psmprobe(device_t dev) /* disable the aux port for now... */ if (!set_controller_command_byte(sc->kbdc, - KBD_KBD_CONTROL_BITS | KBD_AUX_CONTROL_BITS, - (command_byte & KBD_KBD_CONTROL_BITS) | + KBD_AUX_CONTROL_BITS, KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { /* * this is CONTROLLER ERROR; I don't know the proper way to * recover from this error... */ - if (ALWAYS_RESTORE_CONTROLLER(sc->kbdc)) - restore_controller(sc->kbdc, command_byte); - kprintf("psm%d: unable to set the command byte.\n", unit); endprobe(ENXIO); } /* done */ - kbdc_set_device_mask(sc->kbdc, mask | KBD_AUX_CONTROL_BITS); kbdc_lock(sc->kbdc, FALSE); return (0); } @@ -1811,10 +1790,10 @@ psmopen(struct dev_open_args *ap) command_byte = get_controller_command_byte(sc->kbdc); /* enable the aux port and temporalily disable the keyboard */ - if (command_byte == -1 || !set_controller_command_byte(sc->kbdc, - kbdc_get_device_mask(sc->kbdc), - KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT | - KBD_ENABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { + if (command_byte == -1 || + !set_controller_command_byte(sc->kbdc, + KBD_AUX_CONTROL_BITS, + KBD_ENABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { /* CONTROLLER ERROR; do you know how to get out of this? */ kbdc_lock(sc->kbdc, FALSE); crit_exit(); @@ -1866,9 +1845,8 @@ psmclose(struct dev_close_args *ap) /* disable the aux interrupt and temporalily disable the keyboard */ if (!set_controller_command_byte(sc->kbdc, - kbdc_get_device_mask(sc->kbdc), - KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT | - KBD_ENABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { + KBD_AUX_CONTROL_BITS, + KBD_ENABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { log(LOG_ERR, "psm%d: failed to disable the aux int (psmclose).\n", sc->unit); @@ -1908,9 +1886,8 @@ psmclose(struct dev_close_args *ap) } if (!set_controller_command_byte(sc->kbdc, - kbdc_get_device_mask(sc->kbdc), - (command_byte & KBD_KBD_CONTROL_BITS) | - KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { + KBD_AUX_CONTROL_BITS, + KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { /* * CONTROLLER ERROR; * we shall ignore this error; see the above comment. @@ -2064,8 +2041,7 @@ block_mouse_data(struct psm_softc *sc, int *c) *c = get_controller_command_byte(sc->kbdc); if ((*c == -1) || !set_controller_command_byte(sc->kbdc, - kbdc_get_device_mask(sc->kbdc), - KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT | + KBD_AUX_CONTROL_BITS, KBD_ENABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) { /* this is CONTROLLER ERROR */ crit_exit(); @@ -2129,8 +2105,7 @@ unblock_mouse_data(struct psm_softc *sc, int c) /* restore ports and interrupt */ if (!set_controller_command_byte(sc->kbdc, - kbdc_get_device_mask(sc->kbdc), - c & (KBD_KBD_CONTROL_BITS | KBD_AUX_CONTROL_BITS))) { + KBD_AUX_CONTROL_BITS, c & KBD_AUX_CONTROL_BITS)) { /* * CONTROLLER ERROR; this is serious, we may have * been left with the inaccessible keyboard and @@ -6631,7 +6606,8 @@ create_a_copy(device_t atkbdc, device_t me) /* move our resource to the found device */ irq = bus_get_resource_start(me, SYS_RES_IRQ, 0); bus_delete_resource(me, SYS_RES_IRQ, 0); - bus_set_resource(psm, SYS_RES_IRQ, KBDC_RID_AUX, irq, 1); + bus_set_resource(psm, SYS_RES_IRQ, KBDC_RID_AUX, irq, 1, + machintr_legacy_intr_cpuid(irq)); /* ...then probe and attach it */ return (device_probe_and_attach(psm)); @@ -6662,9 +6638,10 @@ psmcpnp_probe(device_t dev) irq = 12; /* XXX */ device_printf(dev, "irq resource info is missing; " "assuming irq %ld\n", irq); - bus_set_resource(dev, SYS_RES_IRQ, rid, irq, 1); + bus_set_resource(dev, SYS_RES_IRQ, rid, irq, 1, + machintr_legacy_intr_cpuid(irq)); } - res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, 0); + res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_SHAREABLE); bus_release_resource(dev, SYS_RES_IRQ, rid, res); /* keep quiet */ @@ -6682,14 +6659,23 @@ psmcpnp_attach(device_t dev) /* find the keyboard controller, which may be on acpi* or isa* bus */ atkbdc = devclass_get_device(devclass_find(ATKBDC_DRIVER_NAME), device_get_unit(dev)); - if ((atkbdc != NULL) && (device_get_state(atkbdc) == DS_ATTACHED)) + if ((atkbdc != NULL) && (device_get_state(atkbdc) == DS_ATTACHED)) { create_a_copy(atkbdc, dev); + } else { + /* + * If we don't have the AT keyboard controller yet, + * just reserve the IRQ for later use... + * (See psmidentify() above.) + */ + rid = 0; + bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_SHAREABLE); + } return (0); } -DRIVER_MODULE(psmcpnp, isa, psmcpnp_driver, psmcpnp_devclass, 0, 0); -DRIVER_MODULE(psmcpnp, acpi, psmcpnp_driver, psmcpnp_devclass, 0, 0); +DRIVER_MODULE(psmcpnp, isa, psmcpnp_driver, psmcpnp_devclass, NULL, NULL); +DRIVER_MODULE(psmcpnp, acpi, psmcpnp_driver, psmcpnp_devclass, NULL, NULL); #endif #endif /* DEV_ISA */ -- 2.11.4.GIT