Home | History | Annotate | Download | only in kb8042
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*	Copyright (c) 1990, 1991 UNIX System Laboratories, Inc.	*/
     22 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T	*/
     23 /*	  All Rights Reserved  	*/
     24 
     25 /*
     26  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     27  * Use is subject to license terms.
     28  */
     29 
     30 #define	KEYMAP_SIZE_VARIABLE
     31 
     32 #include <sys/types.h>
     33 #include <sys/errno.h>
     34 #include <sys/inline.h>
     35 #include <sys/termio.h>
     36 #include <sys/stropts.h>
     37 #include <sys/termios.h>
     38 #include <sys/stream.h>
     39 #include <sys/strtty.h>
     40 #include <sys/strsubr.h>
     41 #include <sys/strsun.h>
     42 #include <sys/ddi.h>
     43 #include <sys/sunddi.h>
     44 #include <sys/note.h>
     45 #include "sys/consdev.h"
     46 #include <sys/kbd.h>
     47 #include <sys/kbtrans.h>
     48 #include "kb8042.h"
     49 
     50 #include <sys/i8042.h>
     51 
     52 #include "sys/kbio.h"		/* for KIOCSLAYOUT */
     53 #include "sys/stat.h"
     54 #include "sys/reboot.h"
     55 #include <sys/promif.h>
     56 #include <sys/beep.h>
     57 #include <sys/inttypes.h>
     58 #include <sys/policy.h>
     59 
     60 /*
     61  * For any keyboard, there is a unique code describing the position
     62  * of the key on a keyboard. We refer to the code as "station number".
     63  * The following table is used to map the station numbers from ps2
     64  * AT/XT keyboards to that of a USB one.
     65  *
     66  * A mapping was added for entry K8042_STOP, to map to USB key code 120 (which
     67  * maps to the STOP key) when in KB_USB mode, and maps to a HOLE entry
     68  * when in KB_PC mode.  Note that this does not need to be made conditional
     69  * on the architecture for which this module is complied because there are no
     70  * keys that map to K8042_STOP on non-SPARC platforms.
     71  */
     72 static kbtrans_key_t keytab_pc2usb[KBTRANS_KEYNUMS_MAX] = {
     73 /*  0 */	0,	53,	30,	31,	32,	33,	34,	35,
     74 /*  8 */	36,	37,	38,	39,	45,	46,	137,	42,
     75 /* 16 */	43,	20,	26,	8,	21,	23,	28,	24,
     76 /* 24 */	12,	18,	19,	47,	48,	49,	57,	4,
     77 /* 32 */	22,	7,	9,	10,	11,	13,	14,	15,
     78 /* 40 */	51,	52,	50,	40,	225,	100,	29,	27,
     79 /* 48 */	6,	25,	5,	17,	16,	54,	55,	56,
     80 /* 56 */	135,	229,	224,	227,	226,	44,	230,	231,
     81 /* 64 */	228,	101,	0,	0,	0,	0,	0,	0,
     82 /* 72 */	0,	0,	0,	73,	76,	0,	0,	80,
     83 /* 80 */	74,	77,	0,	82,	81,	75,	78,	0,
     84 /* 88 */	0,	79,	83,	95,	92,	89,	0,	84,
     85 /* 96 */	96,	93,	90,	98,	85,	97,	94,	91,
     86 /* 104 */	99,	86,	87,	133,	88,	0,	41,	0,
     87 /* 112 */	58,	59,	60,	61,	62,	63,	64,	65,
     88 /* 120 */	66,	67,	68,	69,	70,	71,	72,	0,
     89 /* 128 */	0,	0,	0,	139,	138,	136,	0,	0,
     90 /* 136 */	0,	0,	0,	0,	0,	0,	0,	0,
     91 /* 144 */	0,	0,	0,	0,	0,	0,	0,	0,
     92 /* 152 */	0,	0,	0,	0,	0,	0,	0,	0,
     93 /* 160 */	120,	0,	0,	0,	0,	0,	0,	0,
     94 /* 168 */	0,	0,	0,	0,	0,	0,	0,	0,
     95 /* 176 */	0,	0,	0,	0,	0,	0,	0,	0,
     96 /* 184 */	0,	0,	0,	0,	0,	0,	0,	0,
     97 /* 192 */	0,	0,	0,	0,	0,	0,	0,	0,
     98 /* 200 */	0,	0,	0,	0,	0,	0,	0,	0,
     99 /* 208 */	0,	0,	0,	0,	0,	0,	0,	0,
    100 /* 216 */	0,	0,	0,	0,	0,	0,	0,	0,
    101 /* 224 */	0,	0,	0,	0,	0,	0,	0,	0,
    102 /* 232 */	0,	128,	129,	127,	0,	0,	0,	0,
    103 /* 240 */	0,	0,	0,	0,	0,	0,	0,	0,
    104 /* 248 */	0,	0,	0,	0
    105 };
    106 
    107 #ifdef __sparc
    108 #define	USECS_PER_WAIT 100
    109 #define	MAX_WAIT_USECS 100000 /* in usecs = 100 ms */
    110 #define	MIN_DELAY_USECS USECS_PER_WAIT
    111 
    112 boolean_t kb8042_warn_unknown_scanset = B_TRUE;
    113 int kb8042_default_scanset = 2;
    114 
    115 #endif
    116 
    117 #define	MAX_KB8042_WAIT_MAX_MS	500		/* 500ms total */
    118 #define	MAX_KB8042_RETRIES	5
    119 
    120 enum state_return { STATE_NORMAL, STATE_INTERNAL };
    121 
    122 static void kb8042_init(struct kb8042 *kb8042, boolean_t from_resume);
    123 static uint_t kb8042_intr(caddr_t arg);
    124 static void kb8042_wait_poweron(struct kb8042 *kb8042);
    125 static void kb8042_send_to_keyboard(struct kb8042 *, int, boolean_t);
    126 static int kb8042_xlate_leds(int);
    127 static void kb8042_setled(struct kb8042 *, int led_state, boolean_t polled);
    128 static void kb8042_streams_setled(struct kbtrans_hardware *hw, int led_state);
    129 static void kb8042_polled_setled(struct kbtrans_hardware *hw, int led_state);
    130 static boolean_t kb8042_polled_keycheck(
    131 			struct kbtrans_hardware *hw, int *key,
    132 			enum keystate *state);
    133 static void kb8042_get_initial_leds(struct kb8042 *, int *, int *);
    134 static boolean_t kb8042_autorepeat_detect(struct kb8042 *kb8042, int key_pos,
    135 			enum keystate state);
    136 static void kb8042_type4_cmd(struct kb8042 *kb8042, int cmd);
    137 static void kb8042_ioctlmsg(struct kb8042 *kb8042, queue_t *, mblk_t *);
    138 static void kb8042_iocdatamsg(queue_t *, mblk_t *);
    139 static void kb8042_process_key(struct kb8042 *, kbtrans_key_t, enum keystate);
    140 static int kb8042_polled_ischar(cons_polledio_arg_t arg);
    141 static int kb8042_polled_getchar(cons_polledio_arg_t arg);
    142 static void kb8042_cleanup(struct kb8042 *kb8042);
    143 
    144 static struct kbtrans_callbacks kb8042_callbacks = {
    145 	kb8042_streams_setled,
    146 	kb8042_polled_setled,
    147 	kb8042_polled_keycheck,
    148 };
    149 
    150 extern struct keyboard keyindex_pc;
    151 
    152 #define	DRIVER_NAME(dip) ddi_driver_name(dip)
    153 
    154 static	char	module_name[] = "kb8042";
    155 
    156 static int kb8042_open(queue_t *qp, dev_t *devp, int flag, int sflag,
    157 			cred_t *credp);
    158 static int kb8042_close(queue_t *qp, int flag, cred_t *credp);
    159 static int kb8042_wsrv();
    160 
    161 struct module_info kb8042_sinfo = {
    162 	42,		/* Module ID */
    163 	module_name,
    164 	0, 32,		/* Minimum and maximum packet sizes */
    165 	256, 128	/* High and low water marks */
    166 };
    167 
    168 static struct qinit kb8042_rinit = {
    169 	NULL, NULL, kb8042_open, kb8042_close, NULL, &kb8042_sinfo, NULL
    170 };
    171 
    172 static struct qinit kb8042_winit = {
    173 	putq, kb8042_wsrv, kb8042_open, kb8042_close, NULL, &kb8042_sinfo, NULL
    174 };
    175 
    176 struct streamtab
    177 	kb8042_str_info = { &kb8042_rinit, &kb8042_winit, NULL, NULL };
    178 
    179 struct kb8042	Kdws = {0};
    180 static dev_info_t *kb8042_dip = NULL;
    181 
    182 static int kb8042_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
    183 		void **result);
    184 static int kb8042_attach(dev_info_t *, ddi_attach_cmd_t);
    185 static int kb8042_detach(dev_info_t *, ddi_detach_cmd_t);
    186 
    187 static 	struct cb_ops cb_kb8042_ops = {
    188 	nulldev,		/* cb_open */
    189 	nulldev,		/* cb_close */
    190 	nodev,			/* cb_strategy */
    191 	nodev,			/* cb_print */
    192 	nodev,			/* cb_dump */
    193 	nodev,			/* cb_read */
    194 	nodev,			/* cb_write */
    195 	nodev,			/* cb_ioctl */
    196 	nodev,			/* cb_devmap */
    197 	nodev,			/* cb_mmap */
    198 	nodev,			/* cb_segmap */
    199 	nochpoll,		/* cb_chpoll */
    200 	ddi_prop_op,		/* cb_prop_op */
    201 	&kb8042_str_info,	/* cb_stream */
    202 	D_MP
    203 };
    204 
    205 struct dev_ops kb8042_ops = {
    206 	DEVO_REV,		/* devo_rev */
    207 	0,			/* devo_refcnt */
    208 	kb8042_getinfo,		/* devo_getinfo */
    209 	nulldev,		/* devo_identify */
    210 	nulldev,		/* devo_probe */
    211 	kb8042_attach,		/* devo_attach */
    212 	kb8042_detach,		/* devo_detach */
    213 	nodev,			/* devo_reset */
    214 	&cb_kb8042_ops,		/* devo_cb_ops */
    215 	(struct bus_ops *)NULL,	/* devo_bus_ops */
    216 	NULL,			/* devo_power */
    217 	ddi_quiesce_not_needed,	/* devo_quiesce */
    218 };
    219 
    220 
    221 /*
    222  * This is the loadable module wrapper.
    223  */
    224 #include <sys/modctl.h>
    225 
    226 /*
    227  * Module linkage information for the kernel.
    228  */
    229 static struct modldrv modldrv = {
    230 	&mod_driverops, /* Type of module.  This one is a driver */
    231 	"PS/2 keyboard driver",
    232 	&kb8042_ops,	/* driver ops */
    233 };
    234 
    235 static struct modlinkage modlinkage = {
    236 	MODREV_1,
    237 	(void *) &modldrv,
    238 	NULL
    239 };
    240 
    241 int
    242 _init(void)
    243 {
    244 	int	rv;
    245 
    246 	rv = mod_install(&modlinkage);
    247 	return (rv);
    248 }
    249 
    250 
    251 int
    252 _fini(void)
    253 {
    254 	return (mod_remove(&modlinkage));
    255 }
    256 
    257 int
    258 _info(struct modinfo *modinfop)
    259 {
    260 	return (mod_info(&modlinkage, modinfop));
    261 }
    262 
    263 #ifdef __sparc
    264 static boolean_t
    265 kb8042_is_input_avail(struct kb8042 *kb8042, int timeout_usec, boolean_t polled)
    266 {
    267 	int i;
    268 	int port = (polled == B_TRUE) ? I8042_POLL_INPUT_AVAIL :
    269 	    I8042_INT_INPUT_AVAIL;
    270 	int reps = timeout_usec / USECS_PER_WAIT;
    271 
    272 	for (i = 0; i < reps; i++) {
    273 		if (ddi_get8(kb8042->handle, kb8042->addr + port) != 0)
    274 			return (B_TRUE);
    275 
    276 		if (i < (reps - 1))
    277 			drv_usecwait(USECS_PER_WAIT);
    278 	}
    279 	return (B_FALSE);
    280 }
    281 
    282 static void
    283 kb8042_clear_input_buffer(struct kb8042 *kb8042, boolean_t polled)
    284 {
    285 	int port = (polled == B_TRUE) ? I8042_POLL_INPUT_DATA :
    286 	    I8042_INT_INPUT_DATA;
    287 
    288 	while (kb8042_is_input_avail(kb8042, MIN_DELAY_USECS, polled)) {
    289 		(void) ddi_get8(kb8042->handle, kb8042->addr + port);
    290 	}
    291 }
    292 
    293 /*
    294  * kb8042_send_and_expect does all its I/O via polling interfaces
    295  */
    296 static boolean_t
    297 kb8042_send_and_expect(struct kb8042 *kb8042, uint8_t send, uint8_t expect,
    298     int timeout, int *error, uint8_t *got)
    299 {
    300 	uint8_t datab;
    301 	int err;
    302 	boolean_t rval;
    303 
    304 	ddi_put8(kb8042->handle,
    305 	    kb8042->addr + I8042_POLL_OUTPUT_DATA, send);
    306 
    307 	if (kb8042_is_input_avail(kb8042, timeout, B_TRUE)) {
    308 		err = 0;
    309 		datab = ddi_get8(kb8042->handle,
    310 		    kb8042->addr + I8042_POLL_INPUT_DATA);
    311 		rval = ((datab == expect) ? B_TRUE : B_FALSE);
    312 	} else {
    313 		err = EAGAIN;
    314 		rval = B_FALSE;
    315 	}
    316 
    317 	if (error != NULL)
    318 		*error = err;
    319 	if (got != NULL)
    320 		*got = datab;
    321 	return (rval);
    322 }
    323 
    324 static const char *
    325 kb8042_error_string(int errcode)
    326 {
    327 	switch (errcode) {
    328 	case EAGAIN:
    329 		return ("Timed out");
    330 	default:
    331 		return ("Unknown error");
    332 	}
    333 }
    334 
    335 /*
    336  * kb8042_read_scanset works properly because it is called before ddi_add_intr
    337  * (if it is called after ddi_add_intr, i8042_intr would call kb8042_intr
    338  * instead of just storing the data that comes in from the keyboard, which
    339  * would prevent the code here from getting it.)
    340  */
    341 static int
    342 kb8042_read_scanset(struct kb8042 *kb8042)
    343 {
    344 	int scanset = -1;
    345 	int err;
    346 	uint8_t got;
    347 
    348 	kb8042_clear_input_buffer(kb8042, B_TRUE);
    349 
    350 	/*
    351 	 * Send a "change scan code set" command to the keyboard.
    352 	 * It should respond with an ACK.
    353 	 */
    354 	if (kb8042_send_and_expect(kb8042, KB_SET_SCAN, KB_ACK, MAX_WAIT_USECS,
    355 	    &err, &got) != B_TRUE) {
    356 		goto fail_read_scanset;
    357 	}
    358 
    359 	/*
    360 	 * Send a 0.  The keyboard should ACK the 0, then it should send the
    361 	 * scan code set in use.
    362 	 */
    363 	if (kb8042_send_and_expect(kb8042, 0, KB_ACK, MAX_WAIT_USECS, &err,
    364 	    &got) != B_TRUE) {
    365 		goto fail_read_scanset;
    366 	}
    367 
    368 	/*
    369 	 * The next input byte from the keyboard should be the scan code
    370 	 * set in use, though some keyboards like to send a few more acks
    371 	 * just for fun, so blow past those to get the keyboard scan code.
    372 	 */
    373 	while (kb8042_is_input_avail(kb8042, MAX_WAIT_USECS, B_TRUE) &&
    374 	    (scanset = ddi_get8(kb8042->handle,
    375 	    kb8042->addr + I8042_POLL_INPUT_DATA)) == KB_ACK)
    376 		;
    377 
    378 #ifdef DEBUG
    379 	cmn_err(CE_NOTE, "!Scan code set from keyboard is `%d'.",
    380 	    scanset);
    381 #endif
    382 
    383 	return (scanset);
    384 
    385 fail_read_scanset:
    386 #ifdef DEBUG
    387 	if (err == 0)
    388 		cmn_err(CE_NOTE, "Could not read current scan set from "
    389 		    "keyboard: %s. (Expected 0x%x, but got 0x%x).",
    390 		    kb8042_error_string(err), KB_ACK, got);
    391 	else
    392 		cmn_err(CE_NOTE, "Could not read current scan set from "
    393 		    "keyboard: %s.", kb8042_error_string(err));
    394 #endif
    395 	return (-1);
    396 }
    397 #endif
    398 
    399 static int
    400 kb8042_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
    401 {
    402 	int	rc;
    403 	int	scanset;
    404 	int	leds;
    405 
    406 	struct kb8042	*kb8042 = &Kdws;
    407 	static ddi_device_acc_attr_t attr = {
    408 		DDI_DEVICE_ATTR_V0,
    409 		DDI_NEVERSWAP_ACC,
    410 		DDI_STRICTORDER_ACC,
    411 	};
    412 
    413 	switch (cmd) {
    414 	case DDI_RESUME:
    415 		leds = kb8042->leds.commanded;
    416 		kb8042->w_init = 0;
    417 		kb8042_init(kb8042, B_TRUE);
    418 		kb8042_setled(kb8042, leds, B_FALSE);
    419 		mutex_enter(&kb8042->w_hw_mutex);
    420 		kb8042->suspended = B_FALSE;
    421 		if (kb8042->w_qp != NULL) {
    422 			enableok(WR(kb8042->w_qp));
    423 			qenable(WR(kb8042->w_qp));
    424 		}
    425 		cv_broadcast(&kb8042->suspend_cv);
    426 		mutex_exit(&kb8042->w_hw_mutex);
    427 		return (DDI_SUCCESS);
    428 
    429 	case DDI_ATTACH:
    430 		if (kb8042_dip != NULL)
    431 			return (DDI_FAILURE);
    432 		/* The rest of the function is for attach */
    433 		break;
    434 
    435 	default:
    436 		return (DDI_FAILURE);
    437 	}
    438 
    439 	kb8042->debugger.mod1 = 58;	/* Left Ctrl */
    440 	kb8042->debugger.mod2 = 60;	/* Left Alt */
    441 	kb8042->debugger.trigger = 33;	/* D */
    442 	kb8042->debugger.mod1_down = B_FALSE;
    443 	kb8042->debugger.mod2_down = B_FALSE;
    444 	kb8042->debugger.enabled = B_FALSE;
    445 
    446 	kb8042_dip = devi;
    447 	kb8042->init_state = KB8042_UNINITIALIZED;
    448 
    449 	kb8042->polled_synthetic_release_pending = B_FALSE;
    450 
    451 	if (ddi_create_minor_node(devi, module_name, S_IFCHR, 0,
    452 	    DDI_NT_KEYBOARD, 0) == DDI_FAILURE) {
    453 		goto failure;
    454 	}
    455 
    456 	kb8042->init_state |= KB8042_MINOR_NODE_CREATED;
    457 
    458 	rc = ddi_regs_map_setup(devi, 0, (caddr_t *)&kb8042->addr,
    459 	    (offset_t)0, (offset_t)0, &attr, &kb8042->handle);
    460 	if (rc != DDI_SUCCESS) {
    461 #ifdef DEBUG
    462 		cmn_err(CE_WARN, "kb8042_attach:  can't map registers");
    463 #endif
    464 		goto failure;
    465 	}
    466 
    467 	kb8042->init_state |= KB8042_REGS_MAPPED;
    468 
    469 	if (ddi_get_iblock_cookie(devi, 0, &kb8042->w_iblock) !=
    470 	    DDI_SUCCESS) {
    471 		cmn_err(CE_WARN, "kb8042_attach:  Can't get iblock cookie");
    472 		goto failure;
    473 	}
    474 
    475 	mutex_init(&kb8042->w_hw_mutex, NULL, MUTEX_DRIVER, kb8042->w_iblock);
    476 	cv_init(&kb8042->ops_cv, NULL, CV_DRIVER, NULL);
    477 	cv_init(&kb8042->suspend_cv, NULL, CV_DRIVER, NULL);
    478 	cv_init(&kb8042->cmd_cv, NULL, CV_DRIVER, NULL);
    479 	kb8042->init_state |= KB8042_HW_MUTEX_INITTED;
    480 
    481 	kb8042_init(kb8042, B_FALSE);
    482 
    483 #ifdef __sparc
    484 	/* Detect the scan code set currently in use */
    485 	scanset = kb8042_read_scanset(kb8042);
    486 
    487 	if (scanset < 0 && kb8042_warn_unknown_scanset) {
    488 
    489 		cmn_err(CE_WARN, "Cannot determine keyboard scan code set ");
    490 		cmn_err(CE_CONT, "(is the keyboard plugged in?). ");
    491 		cmn_err(CE_CONT, "Defaulting to scan code set %d.  If the "
    492 		    "keyboard does not ", kb8042_default_scanset);
    493 		cmn_err(CE_CONT, "work properly, add "
    494 		    "`set kb8042:kb8042_default_scanset=%d' to /etc/system ",
    495 		    (kb8042_default_scanset == 1) ? 2 : 1);
    496 		cmn_err(CE_CONT, "(via network or with a USB keyboard) and "
    497 		    "restart the system.  If you ");
    498 		cmn_err(CE_CONT, "do not want to see this message in the "
    499 		    "future, add ");
    500 		cmn_err(CE_CONT, "`set kb8042:kb8042_warn_unknown_scanset=0' "
    501 		    "to /etc/system.\n");
    502 
    503 		/* Use the default scan code set. */
    504 		scanset = kb8042_default_scanset;
    505 	}
    506 #else
    507 	/* x86 systems use scan code set 1 -- no detection required */
    508 	scanset = 1;
    509 #endif
    510 	if (KeyboardConvertScan_init(kb8042, scanset) != DDI_SUCCESS) {
    511 		cmn_err(CE_WARN, "Cannot initialize keyboard scan converter: "
    512 		    "Unknown scan code set `%d'.", scanset);
    513 		/* Scan code set is not supported */
    514 		goto failure;
    515 	}
    516 
    517 	/*
    518 	 * Turn on interrupts...
    519 	 */
    520 	if (ddi_add_intr(devi, 0,
    521 	    &kb8042->w_iblock, (ddi_idevice_cookie_t *)NULL,
    522 	    kb8042_intr, (caddr_t)kb8042) != DDI_SUCCESS) {
    523 		cmn_err(CE_WARN, "kb8042_attach: cannot add interrupt");
    524 		goto failure;
    525 	}
    526 
    527 	kb8042->init_state |= KB8042_INTR_ADDED;
    528 
    529 	ddi_report_dev(devi);
    530 
    531 #ifdef DEBUG
    532 	cmn_err(CE_CONT, "?%s instance #%d READY\n",
    533 	    DRIVER_NAME(devi), ddi_get_instance(devi));
    534 #endif
    535 
    536 	return (DDI_SUCCESS);
    537 
    538 failure:
    539 	kb8042_cleanup(kb8042);
    540 	return (DDI_FAILURE);
    541 }
    542 
    543 static int
    544 kb8042_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
    545 {
    546 	struct kb8042 *kb8042 = &Kdws;
    547 
    548 	switch (cmd) {
    549 	case DDI_SUSPEND:
    550 		mutex_enter(&kb8042->w_hw_mutex);
    551 		ASSERT(kb8042->ops >= 0);
    552 		while (kb8042->ops > 0)
    553 			cv_wait(&kb8042->ops_cv, &kb8042->w_hw_mutex);
    554 		kb8042->suspended = B_TRUE;
    555 		mutex_exit(&kb8042->w_hw_mutex);
    556 		return (DDI_SUCCESS);
    557 
    558 	case DDI_DETACH:
    559 		/* If someone has a stream open, fail to detach */
    560 		if (kb8042->w_qp != NULL)
    561 			return (DDI_FAILURE);
    562 
    563 		ASSERT(kb8042_dip == dip);
    564 
    565 		kb8042_cleanup(kb8042);
    566 
    567 		return (DDI_SUCCESS);
    568 
    569 	default:
    570 		return (DDI_FAILURE);
    571 	}
    572 }
    573 
    574 /*ARGSUSED*/
    575 static int
    576 kb8042_getinfo(
    577     dev_info_t *dip,
    578     ddi_info_cmd_t infocmd,
    579     void *arg,
    580     void **result)
    581 {
    582 	register int error;
    583 
    584 	switch (infocmd) {
    585 	case DDI_INFO_DEVT2DEVINFO:
    586 		if (kb8042_dip == NULL) {
    587 			error = DDI_FAILURE;
    588 		} else {
    589 			*result = (void *) kb8042_dip;
    590 			error = DDI_SUCCESS;
    591 		}
    592 		break;
    593 	case DDI_INFO_DEVT2INSTANCE:
    594 		*result = (void *)0;
    595 		error = DDI_SUCCESS;
    596 		break;
    597 	default:
    598 		error = DDI_FAILURE;
    599 		break;
    600 	}
    601 	return (error);
    602 }
    603 
    604 static void
    605 kb8042_cleanup(struct kb8042 *kb8042)
    606 {
    607 	ASSERT(kb8042_dip != NULL);
    608 
    609 	if (kb8042->init_state & KB8042_INTR_ADDED)
    610 		ddi_remove_intr(kb8042_dip, 0, kb8042->w_iblock);
    611 
    612 	if (kb8042->init_state & KB8042_HW_MUTEX_INITTED) {
    613 		cv_destroy(&kb8042->cmd_cv);
    614 		cv_destroy(&kb8042->suspend_cv);
    615 		cv_destroy(&kb8042->ops_cv);
    616 		mutex_destroy(&kb8042->w_hw_mutex);
    617 	}
    618 
    619 	if (kb8042->init_state & KB8042_REGS_MAPPED)
    620 		ddi_regs_map_free(&kb8042->handle);
    621 
    622 	if (kb8042->init_state & KB8042_MINOR_NODE_CREATED)
    623 		ddi_remove_minor_node(kb8042_dip, NULL);
    624 
    625 	kb8042->init_state = KB8042_UNINITIALIZED;
    626 	kb8042_dip = NULL;
    627 }
    628 
    629 static void
    630 kb8042_init(struct kb8042 *kb8042, boolean_t from_resume)
    631 {
    632 	if (kb8042->w_init)
    633 		return;
    634 
    635 	if (!from_resume) {
    636 		kb8042->w_kblayout = 0;	/* Default to US */
    637 		kb8042->w_qp = (queue_t *)NULL;
    638 		kb8042->simulated_kbd_type = KB_PC;
    639 		kb8042->leds.commanded = -1;	/* Unknown initial state */
    640 		kb8042->leds.desired = -1;	/* Unknown initial state */
    641 	}
    642 
    643 	kb8042_wait_poweron(kb8042);
    644 
    645 	kb8042->kb_old_key_pos = 0;
    646 
    647 	/*
    648 	 * Explicitly grab and release the 8042 lock outside of
    649 	 * kb8042_send_to_keyboard, because this is the only situation
    650 	 * where a polling interface is used with locking required.
    651 	 */
    652 	(void) ddi_get8(kb8042->handle, kb8042->addr + I8042_LOCK);
    653 	/* Set up the command state machine and start it running. */
    654 	kb8042_send_to_keyboard(kb8042, KB_ENABLE, B_TRUE);
    655 	(void) ddi_get8(kb8042->handle, kb8042->addr + I8042_UNLOCK);
    656 
    657 	kb8042->w_init++;
    658 
    659 	(void) drv_setparm(SYSRINT, 1);	/* reset keyboard interrupts */
    660 }
    661 
    662 /*ARGSUSED2*/
    663 static int
    664 kb8042_open(queue_t *qp, dev_t *devp, int flag, int sflag, cred_t *credp)
    665 {
    666 	struct kb8042	*kb8042;
    667 	int err = 0;
    668 	int initial_leds;
    669 	int initial_led_mask;
    670 
    671 	kb8042 = &Kdws;
    672 
    673 	mutex_enter(&kb8042->w_hw_mutex);
    674 	if (qp->q_ptr) {
    675 		kb8042->w_dev = *devp;
    676 		mutex_exit(&kb8042->w_hw_mutex);
    677 		return (0);
    678 	}
    679 
    680 	if (secpolicy_console(credp) != 0) {
    681 		mutex_exit(&kb8042->w_hw_mutex);
    682 		return (EPERM);
    683 	}
    684 
    685 	while (kb8042->suspended) {
    686 		if (cv_wait_sig(&kb8042->suspend_cv, &kb8042->w_hw_mutex) ==
    687 		    0) {
    688 			mutex_exit(&kb8042->w_hw_mutex);
    689 			return (EINTR);
    690 		}
    691 	}
    692 
    693 	kb8042->w_dev = *devp;
    694 	qp->q_ptr = (caddr_t)kb8042;
    695 	WR(qp)->q_ptr = qp->q_ptr;
    696 	if (!kb8042->w_qp)
    697 		kb8042->w_qp = qp;
    698 
    699 	ASSERT(kb8042->ops >= 0);
    700 	kb8042->ops++;
    701 	mutex_exit(&kb8042->w_hw_mutex);
    702 
    703 	kb8042_get_initial_leds(kb8042, &initial_leds, &initial_led_mask);
    704 	err = kbtrans_streams_init(qp, sflag,
    705 	    (struct kbtrans_hardware *)kb8042, &kb8042_callbacks,
    706 	    &kb8042->hw_kbtrans,
    707 	    initial_leds, initial_led_mask);
    708 	if (err != 0)
    709 		goto out;
    710 
    711 	kbtrans_streams_set_keyboard(kb8042->hw_kbtrans, KB_PC, &keyindex_pc);
    712 
    713 	kb8042->polledio.cons_polledio_version = CONSPOLLEDIO_V1;
    714 	kb8042->polledio.cons_polledio_argument =
    715 	    (cons_polledio_arg_t)kb8042;
    716 	kb8042->polledio.cons_polledio_putchar = NULL;
    717 	kb8042->polledio.cons_polledio_getchar =
    718 	    (int (*)(cons_polledio_arg_t))kb8042_polled_getchar;
    719 	kb8042->polledio.cons_polledio_ischar =
    720 	    (boolean_t (*)(cons_polledio_arg_t))kb8042_polled_ischar;
    721 	kb8042->polledio.cons_polledio_enter = NULL;
    722 	kb8042->polledio.cons_polledio_exit = NULL;
    723 	kb8042->polledio.cons_polledio_setled =
    724 	    (void (*)(cons_polledio_arg_t, int))kb8042_polled_setled;
    725 	kb8042->polledio.cons_polledio_keycheck =
    726 	    (boolean_t (*)(cons_polledio_arg_t, int *,
    727 	    enum keystate *))kb8042_polled_keycheck;
    728 
    729 	qprocson(qp);
    730 
    731 	kbtrans_streams_enable(kb8042->hw_kbtrans);
    732 
    733 out:
    734 	mutex_enter(&kb8042->w_hw_mutex);
    735 	ASSERT(kb8042->ops > 0);
    736 	kb8042->ops--;
    737 	if (kb8042->ops == 0)
    738 		cv_broadcast(&kb8042->ops_cv);
    739 	mutex_exit(&kb8042->w_hw_mutex);
    740 
    741 	return (err);
    742 }
    743 
    744 /*ARGSUSED1*/
    745 static int
    746 kb8042_close(queue_t *qp, int flag, cred_t *credp)
    747 {
    748 	struct kb8042	*kb8042;
    749 
    750 	/* If a beep is in progress, stop that */
    751 	(void) beeper_off();
    752 
    753 	kb8042 = (struct kb8042 *)qp->q_ptr;
    754 
    755 	mutex_enter(&kb8042->w_hw_mutex);
    756 	while (kb8042->suspended) {
    757 		if (cv_wait_sig(&kb8042->suspend_cv, &kb8042->w_hw_mutex) ==
    758 		    0) {
    759 			mutex_exit(&kb8042->w_hw_mutex);
    760 			return (EINTR);
    761 		}
    762 	}
    763 
    764 	ASSERT(kb8042->ops >= 0);
    765 	kb8042->ops++;
    766 	mutex_exit(&kb8042->w_hw_mutex);
    767 
    768 	(void) kbtrans_streams_fini(kb8042->hw_kbtrans);
    769 
    770 	kb8042->w_qp = (queue_t *)NULL;
    771 	qprocsoff(qp);
    772 
    773 	mutex_enter(&kb8042->w_hw_mutex);
    774 	ASSERT(kb8042->ops > 0);
    775 	kb8042->ops--;
    776 	if (kb8042->ops == 0)
    777 		cv_broadcast(&kb8042->ops_cv);
    778 	mutex_exit(&kb8042->w_hw_mutex);
    779 
    780 	return (0);
    781 }
    782 
    783 static int
    784 kb8042_wsrv(queue_t *qp)
    785 {
    786 	struct kb8042 *kb8042;
    787 
    788 	mblk_t	*mp;
    789 	boolean_t suspended;
    790 
    791 	kb8042 = (struct kb8042 *)qp->q_ptr;
    792 
    793 	mutex_enter(&kb8042->w_hw_mutex);
    794 	suspended = kb8042->suspended;
    795 	ASSERT(kb8042->ops >= 0);
    796 	if (!suspended)
    797 		kb8042->ops++;
    798 	mutex_exit(&kb8042->w_hw_mutex);
    799 
    800 #ifdef NO_KB_DEBUG
    801 	while (!suspended && (mp = getq(qp)) != NULL) {
    802 #else
    803 	/*
    804 	 * Not taking keyboard input while suspending can make debugging
    805 	 * difficult.  However, we still do the ops counting so that we
    806 	 * don't suspend at a bad time.
    807 	 */
    808 	while ((mp = getq(qp))) {
    809 #endif
    810 		switch (kbtrans_streams_message(kb8042->hw_kbtrans, mp)) {
    811 		case KBTRANS_MESSAGE_HANDLED:
    812 			continue;
    813 		case KBTRANS_MESSAGE_NOT_HANDLED:
    814 			break;
    815 		}
    816 		switch (mp->b_datap->db_type) {
    817 		case M_IOCTL:
    818 			kb8042_ioctlmsg(kb8042, qp, mp);
    819 			continue;
    820 		case M_IOCDATA:
    821 			kb8042_iocdatamsg(qp, mp);
    822 			continue;
    823 		case M_DELAY:
    824 		case M_STARTI:
    825 		case M_STOPI:
    826 		case M_READ:	/* ignore, no buffered data */
    827 			freemsg(mp);
    828 			continue;
    829 		case M_FLUSH:
    830 			*mp->b_rptr &= ~FLUSHW;
    831 			if (*mp->b_rptr & FLUSHR)
    832 				qreply(qp, mp);
    833 			else
    834 				freemsg(mp);
    835 			continue;
    836 		default:
    837 			cmn_err(CE_NOTE, "kb8042_wsrv: bad msg %x",
    838 			    mp->b_datap->db_type);
    839 			freemsg(mp);
    840 			continue;
    841 		}
    842 	}
    843 
    844 	mutex_enter(&kb8042->w_hw_mutex);
    845 	if (!suspended) {
    846 		ASSERT(kb8042->ops > 0);
    847 		kb8042->ops--;
    848 		if (kb8042->ops == 0)
    849 			cv_broadcast(&kb8042->ops_cv);
    850 	}
    851 	mutex_exit(&kb8042->w_hw_mutex);
    852 
    853 	return (0);
    854 }
    855 
    856 static void
    857 kb8042_ioctlmsg(struct kb8042 *kb8042, queue_t *qp, mblk_t *mp)
    858 {
    859 	struct iocblk	*iocp;
    860 	mblk_t		*datap;
    861 	int		error;
    862 	int		tmp;
    863 	int		cycles;
    864 	int		frequency;
    865 	int		msecs;
    866 
    867 	iocp = (struct iocblk *)mp->b_rptr;
    868 
    869 	switch (iocp->ioc_cmd) {
    870 
    871 	case CONSOPENPOLLEDIO:
    872 		error = miocpullup(mp, sizeof (struct cons_polledio *));
    873 		if (error != 0) {
    874 			miocnak(qp, mp, 0, error);
    875 			return;
    876 		}
    877 
    878 		/*
    879 		 * We are given an appropriate-sized data block,
    880 		 * and return a pointer to our structure in it.
    881 		 */
    882 		*(struct cons_polledio **)mp->b_cont->b_rptr =
    883 		    &kb8042->polledio;
    884 		mp->b_datap->db_type = M_IOCACK;
    885 		iocp->ioc_error = 0;
    886 		qreply(qp, mp);
    887 		break;
    888 
    889 	case CONSCLOSEPOLLEDIO:
    890 		miocack(qp, mp, 0, 0);
    891 		break;
    892 
    893 	case CONSSETABORTENABLE:
    894 		if (iocp->ioc_count != TRANSPARENT) {
    895 			miocnak(qp, mp, 0, EINVAL);
    896 			return;
    897 		}
    898 
    899 		kb8042->debugger.enabled = *(intptr_t *)mp->b_cont->b_rptr;
    900 		miocack(qp, mp, 0, 0);
    901 		break;
    902 
    903 	/*
    904 	 * Valid only in TR_UNTRANS_MODE mode.
    905 	 */
    906 	case CONSSETKBDTYPE:
    907 		error = miocpullup(mp, sizeof (int));
    908 		if (error != 0) {
    909 			miocnak(qp, mp, 0, error);
    910 			return;
    911 		}
    912 		tmp =  *(int *)mp->b_cont->b_rptr;
    913 		if (tmp != KB_PC && tmp != KB_USB) {
    914 			miocnak(qp, mp, 0, EINVAL);
    915 			break;
    916 		}
    917 		kb8042->simulated_kbd_type = tmp;
    918 		miocack(qp, mp, 0, 0);
    919 		break;
    920 
    921 	case KIOCLAYOUT:
    922 		if (kb8042->w_kblayout == -1) {
    923 			miocnak(qp, mp, 0, EINVAL);
    924 			return;
    925 		}
    926 
    927 		if ((datap = allocb(sizeof (int), BPRI_HI)) == NULL) {
    928 			miocnak(qp, mp, 0, ENOMEM);
    929 			return;
    930 		}
    931 
    932 		if (kb8042->simulated_kbd_type == KB_USB)
    933 			*(int *)datap->b_wptr = KBTRANS_USBKB_DEFAULT_LAYOUT;
    934 		else
    935 			*(int *)datap->b_wptr = kb8042->w_kblayout;
    936 
    937 		datap->b_wptr += sizeof (int);
    938 		if (mp->b_cont)
    939 			freemsg(mp->b_cont);
    940 		mp->b_cont = datap;
    941 		iocp->ioc_count = sizeof (int);
    942 		mp->b_datap->db_type = M_IOCACK;
    943 		iocp->ioc_error = 0;
    944 		qreply(qp, mp);
    945 		break;
    946 
    947 	case KIOCSLAYOUT:
    948 		if (iocp->ioc_count != TRANSPARENT) {
    949 			miocnak(qp, mp, 0, EINVAL);
    950 			return;
    951 		}
    952 
    953 		kb8042->w_kblayout = *(intptr_t *)mp->b_cont->b_rptr;
    954 		miocack(qp, mp, 0, 0);
    955 		break;
    956 
    957 	case KIOCCMD:
    958 		error = miocpullup(mp, sizeof (int));
    959 		if (error != 0) {
    960 			miocnak(qp, mp, 0, error);
    961 			return;
    962 		}
    963 
    964 		kb8042_type4_cmd(kb8042, *(int *)mp->b_cont->b_rptr);
    965 		miocack(qp, mp, 0, 0);
    966 		break;
    967 
    968 	case KIOCMKTONE:
    969 		if (iocp->ioc_count != TRANSPARENT) {
    970 			miocnak(qp, mp, 0, EINVAL);
    971 			return;
    972 		}
    973 
    974 		tmp = (int)(*(intptr_t *)mp->b_cont->b_rptr);
    975 		cycles = tmp & 0xffff;
    976 		msecs = (tmp >> 16) & 0xffff;
    977 
    978 		if (cycles == 0)
    979 			frequency = UINT16_MAX;
    980 		else if (cycles == UINT16_MAX)
    981 			frequency = 0;
    982 		else {
    983 			frequency = (PIT_HZ + cycles / 2) / cycles;
    984 			if (frequency > UINT16_MAX)
    985 				frequency = UINT16_MAX;
    986 		}
    987 
    988 		error = beep_mktone(frequency, msecs);
    989 		if (error != 0)
    990 			miocnak(qp, mp, 0, error);
    991 		else
    992 			miocack(qp, mp, 0, 0);
    993 		break;
    994 
    995 	default:
    996 #ifdef DEBUG1
    997 		cmn_err(CE_NOTE, "!kb8042_ioctlmsg %x", iocp->ioc_cmd);
    998 #endif
    999 		miocnak(qp, mp, 0, EINVAL);
   1000 		return;
   1001 	}
   1002 }
   1003 
   1004 /*
   1005  * Process a byte received from the keyboard
   1006  */
   1007 static void
   1008 kb8042_received_byte(
   1009 	struct kb8042	*kb8042,
   1010 	int		scancode)	/* raw scan code */
   1011 {
   1012 	boolean_t	legit;		/* is this a legit key pos'n? */
   1013 	int		key_pos = -1;
   1014 	enum keystate	state;
   1015 	boolean_t	synthetic_release_needed;
   1016 
   1017 	/*
   1018 	 * Intercept ACK and RESEND and signal the condition that
   1019 	 * kb8042_send_and_wait is waiting for.
   1020 	 */
   1021 	if (scancode == KB_ACK) {
   1022 		mutex_enter(&kb8042->w_hw_mutex);
   1023 		kb8042->acked = 1;
   1024 		cv_signal(&kb8042->cmd_cv);
   1025 		mutex_exit(&kb8042->w_hw_mutex);
   1026 		return;
   1027 	} else if (scancode == KB_RESEND) {
   1028 		mutex_enter(&kb8042->w_hw_mutex);
   1029 		kb8042->need_retry = 1;
   1030 		cv_signal(&kb8042->cmd_cv);
   1031 		mutex_exit(&kb8042->w_hw_mutex);
   1032 		return;
   1033 	}
   1034 
   1035 	if (!kb8042->w_init)	/* can't do anything anyway */
   1036 		return;
   1037 
   1038 	legit = KeyboardConvertScan(kb8042, scancode, &key_pos, &state,
   1039 	    &synthetic_release_needed);
   1040 
   1041 	if (legit == 0) {
   1042 		/* Eaten by translation */
   1043 		return;
   1044 	}
   1045 
   1046 	/*
   1047 	 * Don't know if we want this permanently, but it seems interesting
   1048 	 * for the moment.
   1049 	 */
   1050 	if (key_pos == kb8042->debugger.mod1) {
   1051 		kb8042->debugger.mod1_down = (state == KEY_PRESSED);
   1052 	}
   1053 	if (key_pos == kb8042->debugger.mod2) {
   1054 		kb8042->debugger.mod2_down = (state == KEY_PRESSED);
   1055 	}
   1056 	if (kb8042->debugger.enabled &&
   1057 	    key_pos == kb8042->debugger.trigger &&
   1058 	    kb8042->debugger.mod1_down &&
   1059 	    kb8042->debugger.mod2_down) {
   1060 		/*
   1061 		 * Require new presses of the modifiers.
   1062 		 */
   1063 		kb8042->debugger.mod1_down = B_FALSE;
   1064 		kb8042->debugger.mod2_down = B_FALSE;
   1065 		abort_sequence_enter(NULL);
   1066 		return;
   1067 	}
   1068 
   1069 	/*
   1070 	 * If there's no queue above us - as can happen if we've been
   1071 	 * attached but not opened - drop the keystroke.
   1072 	 * Note that we do this here instead of above so that
   1073 	 * Ctrl-Alt-D still works.
   1074 	 */
   1075 	if (kb8042->w_qp == NULL) {
   1076 		return;
   1077 	}
   1078 
   1079 	/*
   1080 	 * This is to filter out auto repeat since it can't be
   1081 	 * turned off at the hardware.  (Yeah, yeah, PS/2 keyboards
   1082 	 * can.  Don't know whether they've taken over the world.
   1083 	 * Don't think so.)
   1084 	 */
   1085 	if (kb8042_autorepeat_detect(kb8042, key_pos, state)) {
   1086 		return;
   1087 	}
   1088 
   1089 
   1090 	kb8042_process_key(kb8042, key_pos, state);
   1091 
   1092 	/*
   1093 	 * This is a total hack.  For some stupid reason, the two additional
   1094 	 * keys on Korean keyboards (Hangul and Hangul/Hanja) report press
   1095 	 * only.  We synthesize a release immediately.
   1096 	 */
   1097 	if (synthetic_release_needed) {
   1098 		(void) kb8042_autorepeat_detect(kb8042, key_pos, KEY_RELEASED);
   1099 		kb8042_process_key(kb8042, key_pos, state);
   1100 	}
   1101 }
   1102 
   1103 
   1104 static void
   1105 kb8042_process_key(struct kb8042 *kb8042, kbtrans_key_t key_pos,
   1106     enum keystate state)
   1107 {
   1108 	kbtrans_key_t key;
   1109 
   1110 	ASSERT(key_pos >= 0 && key_pos <= 255);
   1111 	if (kb8042->simulated_kbd_type == KB_PC) {
   1112 		kbtrans_streams_key(kb8042->hw_kbtrans, key_pos, state);
   1113 	} else if (kb8042->simulated_kbd_type == KB_USB) {
   1114 		key = keytab_pc2usb[key_pos];
   1115 		if (key != 0) {
   1116 			kbtrans_streams_key(kb8042->hw_kbtrans, key, state);
   1117 		}
   1118 	}
   1119 }
   1120 
   1121 /*
   1122  * Called from interrupt handler when keyboard interrupt occurs.
   1123  */
   1124 static uint_t
   1125 kb8042_intr(caddr_t arg)
   1126 {
   1127 	uchar_t scancode;	/* raw scan code */
   1128 	int rc;
   1129 	struct kb8042 *kb8042 = (struct kb8042 *)arg;
   1130 
   1131 	rc = DDI_INTR_UNCLAIMED;
   1132 
   1133 	if (kb8042->init_state == KB8042_UNINITIALIZED)
   1134 		return (DDI_INTR_UNCLAIMED);
   1135 
   1136 	/* don't care if drv_setparm succeeds */
   1137 	(void) drv_setparm(SYSRINT, 1);
   1138 
   1139 	while (ddi_get8(kb8042->handle, kb8042->addr + I8042_INT_INPUT_AVAIL)
   1140 	    != 0) {
   1141 		rc = DDI_INTR_CLAIMED;
   1142 
   1143 		scancode = ddi_get8(kb8042->handle,
   1144 		    kb8042->addr + I8042_INT_INPUT_DATA);
   1145 
   1146 		kb8042_received_byte(kb8042, scancode);
   1147 	}
   1148 
   1149 	return (rc);
   1150 }
   1151 
   1152 static void
   1153 kb8042_iocdatamsg(queue_t *qp, mblk_t *mp)
   1154 {
   1155 	struct copyresp	*csp;
   1156 
   1157 	csp = (struct copyresp *)mp->b_rptr;
   1158 	if (csp->cp_rval) {
   1159 		freemsg(mp);
   1160 		return;
   1161 	}
   1162 
   1163 	switch (csp->cp_cmd) {
   1164 	default:
   1165 		miocack(qp, mp, 0, 0);
   1166 		break;
   1167 	}
   1168 }
   1169 
   1170 static boolean_t
   1171 kb8042_polled_keycheck(
   1172     struct kbtrans_hardware *hw,
   1173     int *key,
   1174     enum keystate *state)
   1175 {
   1176 	struct kb8042 *kb8042 = (struct kb8042 *)hw;
   1177 	int	scancode;
   1178 	boolean_t	legit;
   1179 	boolean_t	synthetic_release_needed;
   1180 
   1181 	if (kb8042->polled_synthetic_release_pending) {
   1182 		*key = kb8042->polled_synthetic_release_key;
   1183 		*state = KEY_RELEASED;
   1184 		kb8042->polled_synthetic_release_pending = B_FALSE;
   1185 		(void) kb8042_autorepeat_detect(kb8042, *key, *state);
   1186 		return (B_TRUE);
   1187 	}
   1188 
   1189 	for (;;) {
   1190 		if (ddi_get8(kb8042->handle,
   1191 		    kb8042->addr + I8042_POLL_INPUT_AVAIL) == 0) {
   1192 			return (B_FALSE);
   1193 		}
   1194 
   1195 		scancode = ddi_get8(kb8042->handle,
   1196 		    kb8042->addr + I8042_POLL_INPUT_DATA);
   1197 
   1198 		legit = KeyboardConvertScan(kb8042, scancode, key, state,
   1199 		    &synthetic_release_needed);
   1200 		if (!legit) {
   1201 			continue;
   1202 		}
   1203 		/*
   1204 		 * For the moment at least, we rely on hardware autorepeat
   1205 		 * for polled I/O autorepeat.  However, for coordination
   1206 		 * with the interrupt-driven code, maintain the last key
   1207 		 * pressed.
   1208 		 */
   1209 		(void) kb8042_autorepeat_detect(kb8042, *key, *state);
   1210 
   1211 		/*
   1212 		 * This is a total hack to support two additional keys
   1213 		 * on Korean keyboards.  They report only on press, and
   1214 		 * so we synthesize a release.  Most likely this will
   1215 		 * never be important to polled  I/O, but if I do it
   1216 		 * "right" the first time it _won't_ be an issue.
   1217 		 */
   1218 		if (synthetic_release_needed) {
   1219 			kb8042->polled_synthetic_release_pending = B_TRUE;
   1220 			kb8042->polled_synthetic_release_key = *key;
   1221 		}
   1222 
   1223 		if (kb8042->simulated_kbd_type == KB_USB) {
   1224 			*key = keytab_pc2usb[*key];
   1225 		}
   1226 		return (B_TRUE);
   1227 	}
   1228 }
   1229 
   1230 static void
   1231 kb8042_setled(struct kb8042 *kb8042, int led_state, boolean_t polled)
   1232 {
   1233 	kb8042->leds.desired = led_state;
   1234 
   1235 	if (!polled)
   1236 		mutex_enter(&kb8042->w_hw_mutex);
   1237 
   1238 	if (kb8042->leds.desired != kb8042->leds.commanded) {
   1239 		kb8042_send_to_keyboard(kb8042, KB_SET_LED, polled);
   1240 	}
   1241 
   1242 	if (!polled)
   1243 		mutex_exit(&kb8042->w_hw_mutex);
   1244 }
   1245 
   1246 static void
   1247 kb8042_polled_setled(struct kbtrans_hardware *hw, int led_state)
   1248 {
   1249 	struct kb8042 *kb8042 = (struct kb8042 *)hw;
   1250 	kb8042_setled(kb8042, led_state, B_TRUE);
   1251 }
   1252 
   1253 static void
   1254 kb8042_streams_setled(struct kbtrans_hardware *hw, int led_state)
   1255 {
   1256 	struct kb8042 *kb8042 = (struct kb8042 *)hw;
   1257 	kb8042_setled(kb8042, led_state, B_FALSE);
   1258 }
   1259 
   1260 
   1261 static int
   1262 kb8042_send_and_wait(struct kb8042 *kb8042, uint8_t u8, boolean_t polled)
   1263 {
   1264 	uint8_t *outp = kb8042->addr +
   1265 	    (polled ? I8042_POLL_OUTPUT_DATA : I8042_INT_OUTPUT_DATA);
   1266 	uint8_t *inavp = kb8042->addr +
   1267 	    (polled ? I8042_POLL_INPUT_AVAIL : I8042_INT_INPUT_AVAIL);
   1268 	uint8_t *inp = kb8042->addr +
   1269 	    (polled ? I8042_POLL_INPUT_DATA : I8042_INT_INPUT_DATA);
   1270 	uint8_t b;
   1271 	int ms_waited;
   1272 	int timedout;
   1273 	int expire;
   1274 	int retries = 0;
   1275 
   1276 	do {
   1277 		kb8042->acked = 0;
   1278 		kb8042->need_retry = 0;
   1279 		ms_waited = 0;		/* Zero it whether polled or not */
   1280 		timedout = 0;
   1281 
   1282 		ddi_put8(kb8042->handle, outp, u8);
   1283 
   1284 		while (!kb8042->acked && !kb8042->need_retry && !timedout) {
   1285 
   1286 			if (polled) {
   1287 				if (ddi_get8(kb8042->handle, inavp)) {
   1288 					b = ddi_get8(kb8042->handle, inp);
   1289 					switch (b) {
   1290 					case KB_ACK:
   1291 						kb8042->acked = 1;
   1292 						break;
   1293 					case KB_RESEND:
   1294 						kb8042->need_retry = 1;
   1295 						break;
   1296 					default:
   1297 						/*
   1298 						 * drop it: We should never
   1299 						 * get scancodes while
   1300 						 * we're in the middle of a
   1301 						 * command anyway.
   1302 						 */
   1303 #ifdef DEBUG
   1304 						cmn_err(CE_WARN, "!Unexpected "
   1305 						    " byte 0x%x", b);
   1306 #endif
   1307 						break;
   1308 					}
   1309 				}
   1310 
   1311 				/*
   1312 				 * Wait 1ms if an ACK wasn't received yet
   1313 				 */
   1314 				if (!kb8042->acked) {
   1315 					drv_usecwait(1000);
   1316 					ms_waited++;
   1317 					if (ms_waited >= MAX_KB8042_WAIT_MAX_MS)
   1318 						timedout = B_TRUE;
   1319 				}
   1320 			} else {
   1321 				/* Interrupt-driven */
   1322 				expire = ddi_get_lbolt() +
   1323 				    drv_usectohz(MAX_KB8042_WAIT_MAX_MS * 1000);
   1324 
   1325 				/*
   1326 				 * If cv_timedwait returned -1 and we neither
   1327 				 * received an ACK nor a RETRY response, then
   1328 				 * we timed out.
   1329 				 */
   1330 				if (cv_timedwait(&kb8042->cmd_cv,
   1331 				    &kb8042->w_hw_mutex, expire) == -1 &&
   1332 				    !kb8042->acked && !kb8042->need_retry) {
   1333 					timedout = B_TRUE;
   1334 				}
   1335 			}
   1336 
   1337 		}
   1338 	} while ((kb8042->need_retry || timedout) &&
   1339 	    ++retries < MAX_KB8042_RETRIES);
   1340 
   1341 	return (kb8042->acked);
   1342 }
   1343 
   1344 /*
   1345  * kb8042_send_to_keyboard should be called with w_hw_mutex held if
   1346  * polled is FALSE.
   1347  */
   1348 static void
   1349 kb8042_send_to_keyboard(struct kb8042 *kb8042, int byte, boolean_t polled)
   1350 {
   1351 
   1352 	/*
   1353 	 * KB_SET_LED and KB_ENABLE are special commands which require blocking
   1354 	 * other 8042 consumers while executing.
   1355 	 *
   1356 	 * Other commands/data are sent using the single put8 I/O access
   1357 	 * function.
   1358 	 */
   1359 	if (byte == KB_SET_LED) {
   1360 
   1361 		if (!polled) {
   1362 			(void) ddi_get8(kb8042->handle, kb8042->addr +
   1363 			    I8042_LOCK);
   1364 		}
   1365 
   1366 		if (kb8042_send_and_wait(kb8042, KB_SET_LED, polled)) {
   1367 			/*
   1368 			 * Ignore return value, as there's nothing we can
   1369 			 * do about it if the SET LED command fails.
   1370 			 */
   1371 			(void) kb8042_send_and_wait(kb8042,
   1372 			    kb8042_xlate_leds(kb8042->leds.desired), polled);
   1373 		}
   1374 
   1375 		if (!polled) {
   1376 			(void) ddi_get8(kb8042->handle, kb8042->addr +
   1377 			    I8042_UNLOCK);
   1378 		}
   1379 		kb8042->leds.commanded = kb8042->leds.desired;
   1380 
   1381 	} else if (byte == KB_ENABLE) {
   1382 
   1383 		if (!polled) {
   1384 			(void) ddi_get8(kb8042->handle, kb8042->addr +
   1385 			    I8042_LOCK);
   1386 		}
   1387 
   1388 		(void) kb8042_send_and_wait(kb8042, KB_ENABLE, polled);
   1389 
   1390 		if (!polled) {
   1391 			(void) ddi_get8(kb8042->handle, kb8042->addr +
   1392 			    I8042_UNLOCK);
   1393 		}
   1394 
   1395 	} else {
   1396 		/* All other commands use the "normal" virtual output port */
   1397 		if (polled) {
   1398 			ddi_put8(kb8042->handle,
   1399 			    kb8042->addr + I8042_POLL_OUTPUT_DATA, byte);
   1400 		} else {
   1401 			ddi_put8(kb8042->handle,
   1402 			    kb8042->addr + I8042_INT_OUTPUT_DATA, byte);
   1403 		}
   1404 	}
   1405 }
   1406 
   1407 /*
   1408  * Wait until the keyboard is fully up, maybe.
   1409  * We may be the first person to talk to the keyboard, in which case
   1410  * it's patiently waiting to say "AA" to us to tell us it's up.
   1411  * In theory it sends the AA in 300ms < n < 9s, but it's a pretty
   1412  * good bet that we've already spent that long getting to that point,
   1413  * so we'll only wait long enough for the communications electronics to
   1414  * run.
   1415  */
   1416 static void
   1417 kb8042_wait_poweron(struct kb8042 *kb8042)
   1418 {
   1419 	int cnt;
   1420 	int ready;
   1421 
   1422 	/* wait for up to 250 ms for a response */
   1423 	for (cnt = 0; cnt < 250; cnt++) {
   1424 		ready = ddi_get8(kb8042->handle,
   1425 		    kb8042->addr + I8042_INT_INPUT_AVAIL);
   1426 		if (ready != 0)
   1427 			break;
   1428 		drv_usecwait(1000);
   1429 	}
   1430 
   1431 	/*
   1432 	 * If there's something pending, read and discard it.  If not,
   1433 	 * assume things are OK anyway - maybe somebody else ate it
   1434 	 * already.  (On a PC, the BIOS almost certainly did.)
   1435 	 */
   1436 	if (ready != 0) {
   1437 		(void) ddi_get8(kb8042->handle,
   1438 		    kb8042->addr + I8042_INT_INPUT_DATA);
   1439 	}
   1440 }
   1441 
   1442 static int
   1443 kb8042_xlate_leds(int led)
   1444 {
   1445 	int res;
   1446 
   1447 	res = 0;
   1448 
   1449 	if (led & LED_NUM_LOCK)
   1450 		res |= LED_NUM;
   1451 	if (led & LED_SCROLL_LOCK)
   1452 		res |= LED_SCR;
   1453 	if (led & LED_CAPS_LOCK)
   1454 		res |= LED_CAP;
   1455 
   1456 	return (res);
   1457 }
   1458 
   1459 /*ARGSUSED*/
   1460 static void
   1461 kb8042_get_initial_leds(
   1462     struct kb8042 *kb8042,
   1463     int *initial_leds,
   1464     int *initial_led_mask)
   1465 {
   1466 #if defined(__i386) || defined(__amd64)
   1467 	extern caddr_t	p0_va;
   1468 	uint8_t		bios_kb_flag;
   1469 
   1470 	bios_kb_flag = p0_va[BIOS_KB_FLAG];
   1471 
   1472 	*initial_led_mask = LED_CAPS_LOCK | LED_NUM_LOCK | LED_SCROLL_LOCK;
   1473 	*initial_leds = 0;
   1474 	if (bios_kb_flag & BIOS_CAPS_STATE)
   1475 		*initial_leds |= LED_CAPS_LOCK;
   1476 	if (bios_kb_flag & BIOS_NUM_STATE)
   1477 		*initial_leds |= LED_NUM_LOCK;
   1478 	if (bios_kb_flag & BIOS_SCROLL_STATE)
   1479 		*initial_leds |= LED_SCROLL_LOCK;
   1480 #else
   1481 	*initial_leds = 0;
   1482 	*initial_led_mask = 0;
   1483 #endif
   1484 }
   1485 
   1486 static boolean_t
   1487 kb8042_autorepeat_detect(
   1488     struct kb8042 *kb8042,
   1489     int key_pos,
   1490     enum keystate state)
   1491 {
   1492 	if (state == KEY_RELEASED) {
   1493 		if (kb8042->kb_old_key_pos == key_pos)
   1494 			kb8042->kb_old_key_pos = 0;
   1495 	} else {
   1496 		if (kb8042->kb_old_key_pos == key_pos) {
   1497 			return (B_TRUE);
   1498 		}
   1499 		kb8042->kb_old_key_pos = key_pos;
   1500 	}
   1501 	return (B_FALSE);
   1502 }
   1503 
   1504 /* ARGSUSED */
   1505 static void
   1506 kb8042_type4_cmd(struct kb8042 *kb8042, int cmd)
   1507 {
   1508 	switch (cmd) {
   1509 	case KBD_CMD_BELL:
   1510 		(void) beeper_on(BEEP_TYPE4);
   1511 		break;
   1512 	case KBD_CMD_NOBELL:
   1513 		(void) beeper_off();
   1514 		break;
   1515 	}
   1516 }
   1517 
   1518 
   1519 /*
   1520  * This is a pass-thru routine to get a character at poll time.
   1521  */
   1522 static int
   1523 kb8042_polled_getchar(cons_polledio_arg_t arg)
   1524 {
   1525 	struct kb8042	*kb8042;
   1526 
   1527 	kb8042 = (struct kb8042 *)arg;
   1528 
   1529 	return (kbtrans_getchar(kb8042->hw_kbtrans));
   1530 }
   1531 
   1532 /*
   1533  * This is a pass-thru routine to get a character at poll time.
   1534  */
   1535 static int
   1536 kb8042_polled_ischar(cons_polledio_arg_t arg)
   1537 {
   1538 	struct kb8042	*kb8042;
   1539 
   1540 	kb8042 = (struct kb8042 *)arg;
   1541 
   1542 	return (kbtrans_ischar(kb8042->hw_kbtrans));
   1543 }
   1544