Home | History | Annotate | Line # | Download | only in hpc
pi1ppc.c revision 1.9
      1 /* $NetBSD: pi1ppc.c,v 1.9 2011/02/16 23:44:20 jmcneill Exp $ */
      2 
      3 /*
      4  * Copyright (c) 2001 Alcove - Nicolas Souchu
      5  * Copyright (c) 2003, 2004 Gary Thorpe <gathorpe (at) users.sourceforge.net>
      6  * Copyright (c) 2005 Joe Britt <britt (at) danger.com> - SGI PI1 version
      7  * All rights reserved.
      8  *
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     29  * SUCH DAMAGE.
     30  *
     31  * FreeBSD: src/sys/isa/ppc.c,v 1.26.2.5 2001/10/02 05:21:45 nsouch Exp
     32  *
     33  */
     34 
     35 #include <sys/cdefs.h>
     36 __KERNEL_RCSID(0, "$NetBSD: pi1ppc.c,v 1.9 2011/02/16 23:44:20 jmcneill Exp $");
     37 
     38 #include "opt_pi1ppc.h"
     39 
     40 #include <sys/types.h>
     41 #include <sys/param.h>
     42 #include <sys/kernel.h>
     43 #include <sys/device.h>
     44 #include <sys/malloc.h>
     45 #include <sys/proc.h>
     46 #include <sys/systm.h>
     47 #include <sys/vnode.h>
     48 #include <sys/syslog.h>
     49 
     50 #include <machine/bus.h>
     51 /*#include <machine/intr.h>*/
     52 
     53 #include <dev/ppbus/ppbus_conf.h>
     54 #include <dev/ppbus/ppbus_msq.h>
     55 #include <dev/ppbus/ppbus_io.h>
     56 #include <dev/ppbus/ppbus_var.h>
     57 
     58 #include <machine/autoconf.h>
     59 #include <machine/machtype.h>
     60 
     61 #include <sgimips/ioc/iocreg.h>
     62 
     63 #include <sgimips/hpc/hpcvar.h>
     64 #include <sgimips/hpc/hpcreg.h>
     65 
     66 #include <sgimips/hpc/pi1ppcreg.h>
     67 #include <sgimips/hpc/pi1ppcvar.h>
     68 
     69 #ifdef PI1PPC_DEBUG
     70 int pi1ppc_debug = 1;
     71 #endif
     72 
     73 #ifdef PI1PPC_VERBOSE
     74 int pi1ppc_verbose = 1;
     75 #endif
     76 
     77 
     78 /* Prototypes for functions. */
     79 
     80 /* PC-style register emulation */
     81 static uint8_t r_reg(int reg, struct pi1ppc_softc *pi1ppc);
     82 static void w_reg(int reg, struct pi1ppc_softc *pi1ppc, uint8_t byte);
     83 
     84 #define	AT_DATA_REG	0
     85 #define	AT_STAT_REG	1
     86 #define	AT_CTL_REG	2
     87 
     88 #define pi1ppc_r_str(_x)	r_reg(AT_STAT_REG,_x)
     89 #define	pi1ppc_r_ctr(_x)	r_reg(AT_CTL_REG,_x)
     90 #define	pi1ppc_r_dtr(_x)	r_reg(AT_DATA_REG,_x)
     91 
     92 #define	pi1ppc_w_str(_x,_y)
     93 #define	pi1ppc_w_ctr(_x,_y)	w_reg(AT_CTL_REG,_x,_y)
     94 #define	pi1ppc_w_dtr(_x,_y)	w_reg(AT_DATA_REG,_x,_y)
     95 
     96 /* do we need to do these? */
     97 #define	pi1ppc_barrier_r(_x) bus_space_barrier(_x->sc_iot,_x->sc_ioh, \
     98 					0,4,BUS_SPACE_BARRIER_READ)
     99 #define	pi1ppc_barrier_w(_x) bus_space_barrier(_x->sc_iot,_x->sc_ioh, \
    100 					0,4,BUS_SPACE_BARRIER_WRITE)
    101 #define	pi1ppc_barrier(_x)  pi1ppc_barrier_r(_x)
    102 
    103 
    104 /* Print function for config_found() */
    105 static int pi1ppc_print(void *, const char *);
    106 
    107 /* Routines for ppbus interface (bus + device) */
    108 static int pi1ppc_read(device_t, char *, int, int, size_t *);
    109 static int pi1ppc_write(device_t, char *, int, int, size_t *);
    110 static int pi1ppc_setmode(device_t, int);
    111 static int pi1ppc_getmode(device_t);
    112 static int pi1ppc_exec_microseq(device_t, struct ppbus_microseq * *);
    113 static uint8_t pi1ppc_io(device_t, int, u_char *, int, u_char);
    114 static int pi1ppc_read_ivar(device_t, int, unsigned int *);
    115 static int pi1ppc_write_ivar(device_t, int, unsigned int *);
    116 static int pi1ppc_add_handler(device_t, void (*)(void *), void *);
    117 static int pi1ppc_remove_handler(device_t, void (*)(void *));
    118 
    119 /* no-ops, do any IOC machines have ECP/EPP-capable ports? */
    120 static void pi1ppc_reset_epp_timeout(device_t);
    121 static void pi1ppc_ecp_sync(device_t);
    122 
    123 /* Utility functions */
    124 
    125 /* Functions to read bytes into device's input buffer */
    126 static void pi1ppc_nibble_read(struct pi1ppc_softc * const);
    127 static void pi1ppc_byte_read(struct pi1ppc_softc * const);
    128 
    129 /* Functions to write bytes to device's output buffer */
    130 static void pi1ppc_std_write(struct pi1ppc_softc * const);
    131 
    132 /* Miscellaneous */
    133 static void pi1ppc_set_intr_mask(struct pi1ppc_softc * const, uint8_t);
    134 static uint8_t pi1ppc_get_intr_stat(struct pi1ppc_softc * const);
    135 
    136 #ifdef USE_INDY_ACK_HACK
    137 static uint8_t pi1ppc_get_intr_mask(struct pi1ppc_softc * const);
    138 #endif
    139 
    140 static int pi1ppc_poll_str(struct pi1ppc_softc * const, const uint8_t,
    141 	const uint8_t);
    142 static int pi1ppc_wait_interrupt(struct pi1ppc_softc * const, const void *,
    143 	const uint8_t);
    144 
    145 static int pi1ppc_poll_interrupt_stat(struct pi1ppc_softc * const,
    146 	const uint8_t);
    147 
    148 static int pi1ppc_match(device_t parent, cfdata_t match, void *aux);
    149 static void pi1ppc_attach(device_t parent, device_t self, void *aux);
    150 
    151 CFATTACH_DECL_NEW(pi1ppc, sizeof(struct pi1ppc_softc),
    152 				pi1ppc_match,
    153 				pi1ppc_attach,
    154 				NULL,
    155 				NULL);
    156 
    157 /* Currently only matching on Indy, though I think the Indigo1 also
    158    uses PI1.  If it does, then the driver should work (if it is attached
    159    at the appropriate base addr).
    160  */
    161 
    162 static int
    163 pi1ppc_match(device_t parent, cfdata_t match, void *aux)
    164 {
    165 	struct hpc_attach_args *ha = aux;
    166 
    167 	if (strcmp(ha->ha_name, match->cf_name) != 0)
    168 		return 0;
    169 
    170 	if (mach_type == MACH_SGI_IP22)
    171 		return 1;
    172 
    173 	return 0;
    174 }
    175 
    176 static void
    177 pi1ppc_attach(device_t parent, device_t self, void *aux)
    178 {
    179 	struct pi1ppc_softc *sc;
    180 	struct hpc_attach_args *haa;
    181 
    182 	sc = device_private(self);
    183 	sc->sc_dev = self;
    184 	haa = aux;
    185 	sc->sc_iot = haa->ha_st;
    186 
    187 	if (bus_space_subregion(haa->ha_st, haa->ha_sh, haa->ha_devoff,
    188 			0x28, 		/* # bytes in par port regs */
    189 			&sc->sc_ioh)) {
    190 		aprint_error(": unable to map control registers\n");
    191 		return;
    192 	}
    193 
    194 	pi1ppc_sc_attach(sc);
    195 }
    196 
    197 /*
    198  * Generic attach and detach functions for pi1ppc device.
    199  *
    200  * If sc_dev_ok in soft configuration data is not ATPPC_ATTACHED, these should
    201  * be skipped altogether.
    202  */
    203 
    204 /* Soft configuration attach for pi1ppc */
    205 void
    206 pi1ppc_sc_attach(struct pi1ppc_softc *lsc)
    207 {
    208 	/* Adapter used to configure ppbus device */
    209 	struct parport_adapter sc_parport_adapter;
    210 	char buf[64];
    211 
    212 	PI1PPC_LOCK_INIT(lsc);
    213 
    214 	/* For a PC, this is where the installed chipset is probed.
    215 	 * We *know* what we have, no need to probe.
    216 	 */
    217 	lsc->sc_type = PI1PPC_TYPE_INDY;
    218 	lsc->sc_model = GENERIC;
    219 
    220 	/* XXX Once we support Interrupts & DMA, update this */
    221 	lsc->sc_has = PI1PPC_HAS_PS2;
    222 
    223         /* Print out chipset capabilities */
    224 	snprintb(buf, sizeof(buf), "\20\1INTR\2DMA\3FIFO\4PS2\5ECP\6EPP",
    225 	    lsc->sc_has);
    226 	printf("\n%s: capabilities=%s\n", device_xname(lsc->sc_dev), buf);
    227 
    228 	/* Initialize device's buffer pointers */
    229 	lsc->sc_outb = lsc->sc_outbstart = lsc->sc_inb = lsc->sc_inbstart
    230 		= NULL;
    231 	lsc->sc_inb_nbytes = lsc->sc_outb_nbytes = 0;
    232 
    233 	/* Last configuration step: set mode to standard mode */
    234 	if (pi1ppc_setmode(lsc->sc_dev, PPBUS_COMPATIBLE) != 0) {
    235 		PI1PPC_DPRINTF(("%s: unable to initialize mode.\n",
    236                                 device_xname(lsc->sc_dev)));
    237 	}
    238 
    239 #if defined (MULTIPROCESSOR) || defined (LOCKDEBUG)
    240 	/* Initialize lock structure */
    241 	simple_lock_init(&(lsc->sc_lock));
    242 #endif
    243 
    244 	/* Set up parport_adapter structure */
    245 
    246 	/* Set capabilites */
    247 	sc_parport_adapter.capabilities = 0;
    248 	if (lsc->sc_has & PI1PPC_HAS_INTR) {
    249 		sc_parport_adapter.capabilities |= PPBUS_HAS_INTR;
    250 	}
    251 	if (lsc->sc_has & PI1PPC_HAS_DMA) {
    252 		sc_parport_adapter.capabilities |= PPBUS_HAS_DMA;
    253 	}
    254 	if (lsc->sc_has & PI1PPC_HAS_FIFO) {
    255 		sc_parport_adapter.capabilities |= PPBUS_HAS_FIFO;
    256 	}
    257 	if (lsc->sc_has & PI1PPC_HAS_PS2) {
    258 		sc_parport_adapter.capabilities |= PPBUS_HAS_PS2;
    259 	}
    260 
    261 	/* Set function pointers */
    262 	sc_parport_adapter.parport_io = pi1ppc_io;
    263 	sc_parport_adapter.parport_exec_microseq = pi1ppc_exec_microseq;
    264 	sc_parport_adapter.parport_setmode = pi1ppc_setmode;
    265 	sc_parport_adapter.parport_getmode = pi1ppc_getmode;
    266 	sc_parport_adapter.parport_read = pi1ppc_read;
    267 	sc_parport_adapter.parport_write = pi1ppc_write;
    268 	sc_parport_adapter.parport_read_ivar = pi1ppc_read_ivar;
    269 	sc_parport_adapter.parport_write_ivar = pi1ppc_write_ivar;
    270 	sc_parport_adapter.parport_dma_malloc = lsc->sc_dma_malloc;
    271 	sc_parport_adapter.parport_dma_free = lsc->sc_dma_free;
    272 	sc_parport_adapter.parport_add_handler = pi1ppc_add_handler;
    273 	sc_parport_adapter.parport_remove_handler = pi1ppc_remove_handler;
    274 
    275 	/* these are no-ops (does later machines have ECP/EPP support?) */
    276 	sc_parport_adapter.parport_ecp_sync = pi1ppc_ecp_sync;
    277 	sc_parport_adapter.parport_reset_epp_timeout =
    278 		pi1ppc_reset_epp_timeout;
    279 
    280 	/* Initialize handler list, may be added to by grandchildren */
    281 	SLIST_INIT(&(lsc->sc_handler_listhead));
    282 
    283 	/* Initialize interrupt state */
    284 	lsc->sc_irqstat = PI1PPC_IRQ_NONE;
    285 	lsc->sc_ecr_intr = lsc->sc_ctr_intr = lsc->sc_str_intr = 0;
    286 
    287 	/* Disable DMA/interrupts (each ppbus driver selects usage itself) */
    288 	lsc->sc_use = 0;
    289 
    290 	/* Configure child of the device. */
    291 	lsc->child = config_found(lsc->sc_dev, &(sc_parport_adapter),
    292 		pi1ppc_print);
    293 
    294 	return;
    295 }
    296 
    297 /* Soft configuration detach */
    298 int
    299 pi1ppc_sc_detach(struct pi1ppc_softc *lsc, int flag)
    300 {
    301 	device_t dev = lsc->sc_dev;
    302 
    303 	/* Detach children devices */
    304 	if (config_detach(lsc->child, flag) && !(flag & DETACH_QUIET)) {
    305 		printf("%s not able to detach child device, ", device_xname(dev));
    306 
    307 		if (!(flag & DETACH_FORCE)) {
    308 			printf("cannot detach\n");
    309 			return 1;
    310 		} else {
    311 			printf("continuing (DETACH_FORCE)\n");
    312 		}
    313 	}
    314 
    315 	if (!(flag & DETACH_QUIET))
    316 		printf("%s detached", device_xname(dev));
    317 
    318 	return 0;
    319 }
    320 
    321 /* Used by config_found() to print out device information */
    322 static int
    323 pi1ppc_print(void *aux, const char *name)
    324 {
    325 	/* Print out something on failure. */
    326 	if (name != NULL) {
    327 		printf("%s: child devices", name);
    328 		return UNCONF;
    329 	}
    330 
    331 	return QUIET;
    332 }
    333 
    334 /* Interrupt handler for pi1ppc device: wakes up read/write functions */
    335 int
    336 pi1ppcintr(void *arg)
    337 {
    338 /* NO INTERRUPTS YET */
    339 #if 0
    340 	device_t dev = arg;
    341 	struct pi1ppc_softc *pi1ppc = device_private(dev);
    342 	int claim = 1;
    343 	enum { NONE, READER, WRITER } wake_up = NONE;
    344 	int s;
    345 
    346 	s = splpi1ppc();
    347 	PI1PPC_LOCK(pi1ppc);
    348 
    349 	/* Record registers' status */
    350 	pi1ppc->sc_str_intr = pi1ppc_r_str(pi1ppc);
    351 	pi1ppc->sc_ctr_intr = pi1ppc_r_ctr(pi1ppc);
    352 	pi1ppc_barrier_r(pi1ppc);
    353 
    354 	/* Determine cause of interrupt and wake up top half */
    355 	switch (atppc->sc_mode) {
    356 	case ATPPC_MODE_STD:
    357 		/* nAck pulsed for 5 usec, too fast to check reliably, assume */
    358 		atppc->sc_irqstat = ATPPC_IRQ_nACK;
    359 		if (atppc->sc_outb)
    360 			wake_up = WRITER;
    361 		else
    362 			claim = 0;
    363 		break;
    364 
    365 	case ATPPC_MODE_NIBBLE:
    366 	case ATPPC_MODE_PS2:
    367 		/* nAck is set low by device and then high on ack */
    368 		if (!(atppc->sc_str_intr & nACK)) {
    369 			claim = 0;
    370 			break;
    371 		}
    372 		atppc->sc_irqstat = ATPPC_IRQ_nACK;
    373 		if (atppc->sc_inb)
    374 			wake_up = READER;
    375 		break;
    376 
    377 	case ATPPC_MODE_ECP:
    378 	case ATPPC_MODE_FAST:
    379 		/* Confirm interrupt cause: these are not pulsed as in nAck. */
    380 		if (atppc->sc_ecr_intr & ATPPC_SERVICE_INTR) {
    381 			if (atppc->sc_ecr_intr & ATPPC_ENABLE_DMA)
    382 				atppc->sc_irqstat |= ATPPC_IRQ_DMA;
    383 			else
    384 				atppc->sc_irqstat |= ATPPC_IRQ_FIFO;
    385 
    386 			/* Decide where top half will be waiting */
    387 			if (atppc->sc_mode & ATPPC_MODE_ECP) {
    388 				if (atppc->sc_ctr_intr & PCD) {
    389 					if (atppc->sc_inb)
    390 						wake_up = READER;
    391 					else
    392 						claim = 0;
    393 				} else {
    394 					if (atppc->sc_outb)
    395 						wake_up = WRITER;
    396 					else
    397 						claim = 0;
    398 				}
    399 			} else {
    400 				if (atppc->sc_outb)
    401 					wake_up = WRITER;
    402 				else
    403 					claim = 0;
    404 			}
    405 		}
    406 		/* Determine if nFault has occurred */
    407 		if ((atppc->sc_mode & ATPPC_MODE_ECP) &&
    408 			(atppc->sc_ecr_intr & ATPPC_nFAULT_INTR) &&
    409 			!(atppc->sc_str_intr & nFAULT)) {
    410 
    411 			/* Device is requesting the channel */
    412 			atppc->sc_irqstat |= ATPPC_IRQ_nFAULT;
    413 			claim = 1;
    414 		}
    415 		break;
    416 
    417 	case ATPPC_MODE_EPP:
    418 		/* nAck pulsed for 5 usec, too fast to check reliably */
    419 		atppc->sc_irqstat = ATPPC_IRQ_nACK;
    420 		if (atppc->sc_inb)
    421 			wake_up = WRITER;
    422 		else if (atppc->sc_outb)
    423 			wake_up = READER;
    424 		else
    425 			claim = 0;
    426 		break;
    427 
    428 	default:
    429 		panic("%s: chipset is in invalid mode.", device_xname(dev));
    430 	}
    431 
    432 	if (claim) {
    433 		switch (wake_up) {
    434 		case NONE:
    435 			break;
    436 
    437 		case READER:
    438 			wakeup(atppc->sc_inb);
    439 			break;
    440 
    441 		case WRITER:
    442 			wakeup(atppc->sc_outb);
    443 			break;
    444 		}
    445 	}
    446 
    447 	PI1PPC_UNLOCK(atppc);
    448 
    449 	/* Call all of the installed handlers */
    450 	if (claim) {
    451 		struct atppc_handler_node * callback;
    452 		SLIST_FOREACH(callback, &(atppc->sc_handler_listhead),
    453 			entries) {
    454 				(*callback->func)(callback->arg);
    455 		}
    456 	}
    457 
    458 	splx(s);
    459 
    460 	return claim;
    461 #else
    462 	return 0;		/* NO INTERRUPTS YET */
    463 #endif
    464 }
    465 
    466 /* Functions which support ppbus interface */
    467 
    468 static void
    469 pi1ppc_reset_epp_timeout(device_t dev)
    470 {
    471 	return;
    472 }
    473 
    474 /* Read from pi1ppc device: returns 0 on success. */
    475 static int
    476 pi1ppc_read(device_t dev, char *buf, int len, int ioflag,
    477 	size_t *cnt)
    478 {
    479 	struct pi1ppc_softc *pi1ppc = device_private(dev);
    480 	int error = 0;
    481 	int s;
    482 
    483 	s = splpi1ppc();
    484 	PI1PPC_LOCK(pi1ppc);
    485 
    486 	*cnt = 0;
    487 
    488 	/* Initialize buffer */
    489 	pi1ppc->sc_inb = pi1ppc->sc_inbstart = buf;
    490 	pi1ppc->sc_inb_nbytes = len;
    491 
    492 	/* Initialize device input error state for new operation */
    493 	pi1ppc->sc_inerr = 0;
    494 
    495 	/* Call appropriate function to read bytes */
    496 	switch(pi1ppc->sc_mode) {
    497 	case PI1PPC_MODE_STD:
    498 		error = ENODEV;
    499 		break;
    500 
    501 	case PI1PPC_MODE_NIBBLE:
    502 		pi1ppc_nibble_read(pi1ppc);
    503 		break;
    504 
    505 	case PI1PPC_MODE_PS2:
    506 		pi1ppc_byte_read(pi1ppc);
    507 		break;
    508 
    509 	default:
    510 		panic("%s(%s): chipset in invalid mode.\n", __func__,
    511                       device_xname(dev));
    512 	}
    513 
    514 	/* Update counter*/
    515 	*cnt = (pi1ppc->sc_inbstart - pi1ppc->sc_inb);
    516 
    517 	/* Reset buffer */
    518 	pi1ppc->sc_inb = pi1ppc->sc_inbstart = NULL;
    519 	pi1ppc->sc_inb_nbytes = 0;
    520 
    521 	if (!(error))
    522 		error = pi1ppc->sc_inerr;
    523 
    524 	PI1PPC_UNLOCK(pi1ppc);
    525 	splx(s);
    526 
    527 	return (error);
    528 }
    529 
    530 /* Write to pi1ppc device: returns 0 on success. */
    531 static int
    532 pi1ppc_write(device_t dev, char *buf, int len, int ioflag, size_t *cnt)
    533 {
    534 	struct pi1ppc_softc * const pi1ppc = device_private(dev);
    535 	int error = 0;
    536 	int s;
    537 
    538 	*cnt = 0;
    539 
    540 	s = splpi1ppc();
    541 	PI1PPC_LOCK(pi1ppc);
    542 
    543 	/* Set up line buffer */
    544 	pi1ppc->sc_outb = pi1ppc->sc_outbstart = buf;
    545 	pi1ppc->sc_outb_nbytes = len;
    546 
    547 	/* Initialize device output error state for new operation */
    548 	pi1ppc->sc_outerr = 0;
    549 
    550 	/* Call appropriate function to write bytes */
    551 	switch (pi1ppc->sc_mode) {
    552 	case PI1PPC_MODE_STD:
    553 		pi1ppc_std_write(pi1ppc);
    554 		break;
    555 
    556 	case PI1PPC_MODE_NIBBLE:
    557 	case PI1PPC_MODE_PS2:
    558 		error = ENODEV;
    559 		break;
    560 
    561 	default:
    562 		panic("%s(%s): chipset in invalid mode.\n", __func__,
    563                       device_xname(dev));
    564 	}
    565 
    566 	/* Update counter*/
    567 	*cnt = (pi1ppc->sc_outbstart - pi1ppc->sc_outb);
    568 
    569 	/* Reset output buffer */
    570 	pi1ppc->sc_outb = pi1ppc->sc_outbstart = NULL;
    571 	pi1ppc->sc_outb_nbytes = 0;
    572 
    573 	if (!(error))
    574 		error = pi1ppc->sc_outerr;
    575 
    576 	PI1PPC_UNLOCK(pi1ppc);
    577 	splx(s);
    578 
    579 	return (error);
    580 }
    581 
    582 /*
    583  * Set mode of chipset to mode argument. Modes not supported are ignored. If
    584  * multiple modes are flagged, the mode is not changed. Modes are those
    585  * defined for ppbus_softc.sc_mode in ppbus_conf.h. Only ECP-capable chipsets
    586  * can change their mode of operation. However, ALL operation modes support
    587  * centronics mode and nibble mode. Modes determine both hardware AND software
    588  * behaviour.
    589  * NOTE: the mode for ECP should only be changed when the channel is in
    590  * forward idle mode. This function does not make sure FIFO's have flushed or
    591  * any consistency checks.
    592  */
    593 static int
    594 pi1ppc_setmode(device_t dev, int mode)
    595 {
    596 	struct pi1ppc_softc *pi1ppc = device_private(dev);
    597 	uint8_t ecr;
    598 	uint8_t chipset_mode;
    599 	int s;
    600 	int rval = 0;
    601 
    602 	s = splpi1ppc();
    603 	PI1PPC_LOCK(pi1ppc);
    604 
    605 	switch (mode) {
    606 	case PPBUS_PS2:
    607 		/* Indy has this, other PI1 machines do too? */
    608 		chipset_mode = PI1PPC_MODE_PS2;
    609 		break;
    610 
    611 	case PPBUS_NIBBLE:
    612 		/* Set nibble mode (virtual) */
    613 		chipset_mode = PI1PPC_MODE_NIBBLE;
    614 		break;
    615 
    616 	case PPBUS_COMPATIBLE:
    617 		chipset_mode = PI1PPC_MODE_STD;
    618 		break;
    619 
    620 	case PPBUS_ECP:
    621 	case PPBUS_EPP:
    622 		rval = ENODEV;
    623 		goto end;
    624 
    625 	default:
    626 		PI1PPC_DPRINTF(("%s(%s): invalid mode passed as "
    627                                 "argument.\n", __func__, device_xname(dev)));
    628 		rval = ENODEV;
    629 		goto end;
    630 	}
    631 
    632 	pi1ppc->sc_mode = chipset_mode;
    633 	if (chipset_mode == PI1PPC_MODE_PS2) {
    634 		/* Set direction bit to reverse */
    635 		ecr = pi1ppc_r_ctr(pi1ppc);
    636 		pi1ppc_barrier_r(pi1ppc);
    637 		ecr |= PCD;			/* data is INPUT */
    638 		pi1ppc_w_ctr(pi1ppc, ecr);
    639 		pi1ppc_barrier_w(pi1ppc);
    640 	}
    641 
    642 end:
    643 	PI1PPC_UNLOCK(pi1ppc);
    644 	splx(s);
    645 
    646 	return rval;
    647 }
    648 
    649 /* Get the current mode of chipset */
    650 static int
    651 pi1ppc_getmode(device_t dev)
    652 {
    653 	struct pi1ppc_softc *pi1ppc = device_private(dev);
    654 	int mode;
    655 	int s;
    656 
    657 	s = splpi1ppc();
    658 	PI1PPC_LOCK(pi1ppc);
    659 
    660 	/* The chipset can only be in one mode at a time logically */
    661 	switch (pi1ppc->sc_mode) {
    662 	case PI1PPC_MODE_PS2:
    663 		mode = PPBUS_PS2;
    664 		break;
    665 
    666 	case PI1PPC_MODE_STD:
    667 		mode = PPBUS_COMPATIBLE;
    668 		break;
    669 
    670 	case PI1PPC_MODE_NIBBLE:
    671 		mode = PPBUS_NIBBLE;
    672 		break;
    673 
    674 	default:
    675 		panic("%s(%s): device is in invalid mode!", __func__,
    676                       device_xname(dev));
    677 		break;
    678 	}
    679 
    680 	PI1PPC_UNLOCK(pi1ppc);
    681 	splx(s);
    682 
    683 	return mode;
    684 }
    685 
    686 
    687 /* Wait for FIFO buffer to empty for ECP-capable chipset */
    688 static void
    689 pi1ppc_ecp_sync(device_t dev)
    690 {
    691 	return;
    692 }
    693 
    694 /* Execute a microsequence to handle fast I/O operations. */
    695 
    696 /* microsequence registers are equivalent to PC-like port registers */
    697 /* therefore, translate bit positions & polarities */
    698 
    699 /* Bit 4 of ctl_reg_int_en is used to emulate the PC's int enable
    700    bit.  Without it, lpt doesn't like the port.
    701  */
    702 static uint8_t ctl_reg_int_en = 0;
    703 
    704 static uint8_t
    705 r_reg(int reg, struct pi1ppc_softc *pi1ppc)
    706 {
    707 	int val = 0;
    708 
    709 	/* if we read the status reg, make it look like the PC */
    710 	if(reg == AT_STAT_REG) {
    711 		val = bus_space_read_4((pi1ppc)->sc_iot,
    712 				(pi1ppc)->sc_ioh, IOC_PLP_STAT);
    713 		val &= 0xff;
    714 
    715 		/* invert /BUSY */
    716 		val ^= 0x80;
    717 
    718 		/* bit 2 reads as '1' on Indy (why?) */
    719 		val &= 0xf8;
    720 
    721 		return val;
    722 	}
    723 
    724 	/* if we read the ctl reg, make it look like the PC */
    725 	if(reg == AT_CTL_REG) {
    726 		val = bus_space_read_4((pi1ppc)->sc_iot,
    727 				(pi1ppc)->sc_ioh, IOC_PLP_CTL);
    728 		val &= 0xff;
    729 
    730 		/* get the dir bit in the right place */
    731 		val = ((val >> 1) & 0x20) | (val & 0x0f);
    732 
    733 		/* invert /SEL, /AUTOFD, and /STB */
    734 		val ^= 0x0b;
    735 
    736 		/* emulate the PC's int enable ctl bit */
    737 		val |= (ctl_reg_int_en & 0x10);
    738 
    739 		return val;
    740 	}
    741 
    742 	if(reg == AT_DATA_REG) {
    743 		val = bus_space_read_4((pi1ppc)->sc_iot,
    744 				(pi1ppc)->sc_ioh, IOC_PLP_DATA);
    745 		val &= 0xff;
    746 
    747 		return val;
    748 	}
    749 
    750 	return 0;
    751 }
    752 
    753 static void
    754 w_reg(int reg, struct pi1ppc_softc *pi1ppc, uint8_t byte)
    755 {
    756 	/* don't try to write to the status reg */
    757 
    758 	/* if we are writing the ctl reg, adjust PC style -> IOC style */
    759 	if(reg == AT_CTL_REG) {
    760 		/* preserve pc-style int enable bit */
    761 		ctl_reg_int_en = (byte & 0x10);
    762 
    763 		/* get the dir bit in the right place */
    764 		byte = ((byte << 1) & 0x40) | (byte & 0x0f);
    765 
    766 		/* invert /SEL, /AUTOFD, and /STB */
    767 		byte ^= 0x0b;
    768 
    769 		bus_space_write_4((pi1ppc)->sc_iot,
    770 				(pi1ppc)->sc_ioh, IOC_PLP_CTL, byte);
    771 	}
    772 
    773 	if(reg == AT_DATA_REG) {
    774 		bus_space_write_4((pi1ppc)->sc_iot,
    775 				(pi1ppc)->sc_ioh, IOC_PLP_DATA, byte);
    776 	}
    777 }
    778 
    779 static int
    780 pi1ppc_exec_microseq(device_t dev, struct ppbus_microseq **p_msq)
    781 {
    782 	struct pi1ppc_softc *pi1ppc = device_private(dev);
    783 	struct ppbus_microseq *mi = *p_msq;
    784 	char cc, *p;
    785 	int i, iter, len;
    786 	int error;
    787 	int s;
    788 	register int reg;
    789 	register unsigned char mask;
    790 	register int accum = 0;
    791 	register char *ptr = NULL;
    792 	struct ppbus_microseq *stack = NULL;
    793 
    794 	s = splpi1ppc();
    795 	PI1PPC_LOCK(pi1ppc);
    796 
    797 	/* Loop until microsequence execution finishes (ending op code) */
    798 	for (;;) {
    799 		switch (mi->opcode) {
    800 		case MS_OP_RSET:
    801 			cc = r_reg(mi->arg[0].i, pi1ppc);
    802 			pi1ppc_barrier_r(pi1ppc);
    803 			cc &= (char)mi->arg[2].i;	/* clear mask */
    804 			cc |= (char)mi->arg[1].i;	/* assert mask */
    805 			w_reg(mi->arg[0].i, pi1ppc, cc);
    806 			pi1ppc_barrier_w(pi1ppc);
    807 			mi++;
    808                        	break;
    809 
    810 		case MS_OP_RASSERT_P:
    811 			reg = mi->arg[1].i;
    812 			ptr = pi1ppc->sc_ptr;
    813 
    814 			if ((len = mi->arg[0].i) == MS_ACCUM) {
    815 				accum = pi1ppc->sc_accum;
    816 				for (; accum; accum--) {
    817 					w_reg(reg, pi1ppc, *ptr++);
    818 					pi1ppc_barrier_w(pi1ppc);
    819 				}
    820 				pi1ppc->sc_accum = accum;
    821 			} else {
    822 				for (i = 0; i < len; i++) {
    823 					w_reg(reg, pi1ppc, *ptr++);
    824 					pi1ppc_barrier_w(pi1ppc);
    825 				}
    826 			}
    827 
    828 			pi1ppc->sc_ptr = ptr;
    829 			mi++;
    830 			break;
    831 
    832        	        case MS_OP_RFETCH_P:
    833 			reg = mi->arg[1].i;
    834 			mask = (char)mi->arg[2].i;
    835 			ptr = pi1ppc->sc_ptr;
    836 
    837 			if ((len = mi->arg[0].i) == MS_ACCUM) {
    838 				accum = pi1ppc->sc_accum;
    839 				for (; accum; accum--) {
    840 					*ptr++ = r_reg(reg, pi1ppc) & mask;
    841 					pi1ppc_barrier_r(pi1ppc);
    842 				}
    843 				pi1ppc->sc_accum = accum;
    844 			} else {
    845 				for (i = 0; i < len; i++) {
    846 					*ptr++ = r_reg(reg, pi1ppc) & mask;
    847 					pi1ppc_barrier_r(pi1ppc);
    848 				}
    849 			}
    850 
    851 			pi1ppc->sc_ptr = ptr;
    852 			mi++;
    853 			break;
    854 
    855                 case MS_OP_RFETCH:
    856 			*((char *)mi->arg[2].p) = r_reg(mi->arg[0].i, pi1ppc) &
    857 				(char)mi->arg[1].i;
    858 			pi1ppc_barrier_r(pi1ppc);
    859 			mi++;
    860        	                break;
    861 
    862 		case MS_OP_RASSERT:
    863                 case MS_OP_DELAY:
    864 			/* let's suppose the next instr. is the same */
    865 			do {
    866 				for (;mi->opcode == MS_OP_RASSERT; mi++) {
    867 					w_reg(mi->arg[0].i, pi1ppc,
    868 						(char)mi->arg[1].i);
    869 					pi1ppc_barrier_w(pi1ppc);
    870 				}
    871 
    872 				for (;mi->opcode == MS_OP_DELAY; mi++) {
    873 					delay(mi->arg[0].i);
    874 				}
    875 			} while (mi->opcode == MS_OP_RASSERT);
    876 			break;
    877 
    878 		case MS_OP_ADELAY:
    879 			if (mi->arg[0].i) {
    880 				tsleep(pi1ppc, PPBUSPRI, "pi1ppcdelay",
    881 					mi->arg[0].i * (hz/1000));
    882 			}
    883 			mi++;
    884 			break;
    885 
    886 		case MS_OP_TRIG:
    887 			reg = mi->arg[0].i;
    888 			iter = mi->arg[1].i;
    889 			p = (char *)mi->arg[2].p;
    890 
    891 			/* XXX delay limited to 255 us */
    892 			for (i = 0; i < iter; i++) {
    893 				w_reg(reg, pi1ppc, *p++);
    894 				pi1ppc_barrier_w(pi1ppc);
    895 				delay((unsigned char)*p++);
    896 			}
    897 
    898 			mi++;
    899 			break;
    900 
    901 		case MS_OP_SET:
    902                         pi1ppc->sc_accum = mi->arg[0].i;
    903 			mi++;
    904                        	break;
    905 
    906 		case MS_OP_DBRA:
    907                        	if (--pi1ppc->sc_accum > 0) {
    908                                	mi += mi->arg[0].i;
    909 			}
    910 
    911 			mi++;
    912 			break;
    913 
    914 		case MS_OP_BRSET:
    915 			cc = pi1ppc_r_str(pi1ppc);
    916 			pi1ppc_barrier_r(pi1ppc);
    917 			if ((cc & (char)mi->arg[0].i) == (char)mi->arg[0].i) {
    918 				mi += mi->arg[1].i;
    919 			}
    920 			mi++;
    921 			break;
    922 
    923 		case MS_OP_BRCLEAR:
    924 			cc = pi1ppc_r_str(pi1ppc);
    925 			pi1ppc_barrier_r(pi1ppc);
    926 			if ((cc & (char)mi->arg[0].i) == 0) {
    927 				mi += mi->arg[1].i;
    928 			}
    929 			mi++;
    930 			break;
    931 
    932 		case MS_OP_BRSTAT:
    933 			cc = pi1ppc_r_str(pi1ppc);
    934 			pi1ppc_barrier_r(pi1ppc);
    935 			if ((cc & ((char)mi->arg[0].i | (char)mi->arg[1].i)) ==
    936 				(char)mi->arg[0].i) {
    937 				mi += mi->arg[2].i;
    938 			}
    939 			mi++;
    940 			break;
    941 
    942 		case MS_OP_C_CALL:
    943 			/*
    944 			 * If the C call returns !0 then end the microseq.
    945 			 * The current state of ptr is passed to the C function
    946 			 */
    947 			if ((error = mi->arg[0].f(mi->arg[1].p,
    948 				pi1ppc->sc_ptr))) {
    949 				PI1PPC_UNLOCK(pi1ppc);
    950 				splx(s);
    951 				return (error);
    952 			}
    953 			mi++;
    954 			break;
    955 
    956 		case MS_OP_PTR:
    957 			pi1ppc->sc_ptr = (char *)mi->arg[0].p;
    958 			mi++;
    959 			break;
    960 
    961 		case MS_OP_CALL:
    962 			if (stack) {
    963 				panic("%s - %s: too many calls", device_xname(dev),
    964 					__func__);
    965 			}
    966 
    967 			if (mi->arg[0].p) {
    968 				/* store state of the actual microsequence */
    969 				stack = mi;
    970 
    971 				/* jump to the new microsequence */
    972 				mi = (struct ppbus_microseq *)mi->arg[0].p;
    973 			} else {
    974 				mi++;
    975 			}
    976 			break;
    977 
    978 		case MS_OP_SUBRET:
    979 			/* retrieve microseq and pc state before the call */
    980 			mi = stack;
    981 
    982 			/* reset the stack */
    983 			stack = 0;
    984 
    985 			/* XXX return code */
    986 
    987 			mi++;
    988 			break;
    989 
    990 		case MS_OP_PUT:
    991 		case MS_OP_GET:
    992 		case MS_OP_RET:
    993 			/*
    994 			 * Can't return to pi1ppc level during the execution
    995 			 * of a submicrosequence.
    996 			 */
    997 			if (stack) {
    998 				panic("%s: cannot return to pi1ppc level",
    999 					__func__);
   1000 			}
   1001 			/* update pc for pi1ppc level of execution */
   1002 			*p_msq = mi;
   1003 
   1004 			PI1PPC_UNLOCK(pi1ppc);
   1005 			splx(s);
   1006 			return (0);
   1007 			break;
   1008 
   1009 		default:
   1010 			panic("%s: unknown microsequence "
   1011 				"opcode 0x%x", __func__, mi->opcode);
   1012 			break;
   1013 		}
   1014 	}
   1015 
   1016 	/* Should not be reached! */
   1017 #ifdef PI1PPC_DEBUG
   1018 	panic("%s: unexpected code reached!\n", __func__);
   1019 #endif
   1020 }
   1021 
   1022 /* General I/O routine */
   1023 static uint8_t
   1024 pi1ppc_io(device_t dev, int iop, u_char *addr, int cnt, u_char byte)
   1025 {
   1026 	struct pi1ppc_softc *pi1ppc = device_private(dev);
   1027 	uint8_t val = 0;
   1028 	int s;
   1029 
   1030 	s = splpi1ppc();
   1031 	PI1PPC_LOCK(pi1ppc);
   1032 
   1033 	switch (iop) {
   1034 	case PPBUS_RDTR:
   1035 		val = r_reg(AT_DATA_REG, pi1ppc);
   1036 		break;
   1037 	case PPBUS_RSTR:
   1038 		val = r_reg(AT_STAT_REG, pi1ppc);
   1039 		break;
   1040 	case PPBUS_RCTR:
   1041 		val = r_reg(AT_CTL_REG, pi1ppc);
   1042 		break;
   1043 	case PPBUS_WDTR:
   1044 		w_reg(AT_DATA_REG, pi1ppc, byte);
   1045 		break;
   1046 	case PPBUS_WSTR:
   1047 		/* writing to the status register is weird */
   1048 		break;
   1049 	case PPBUS_WCTR:
   1050 		w_reg(AT_CTL_REG, pi1ppc, byte);
   1051 		break;
   1052 	default:
   1053 		panic("%s(%s): unknown I/O operation", device_xname(dev),
   1054 			__func__);
   1055 		break;
   1056 	}
   1057 
   1058 	pi1ppc_barrier(pi1ppc);
   1059 
   1060 	PI1PPC_UNLOCK(pi1ppc);
   1061 	splx(s);
   1062 
   1063 	return val;
   1064 }
   1065 
   1066 /* Read "instance variables" of pi1ppc device */
   1067 static int
   1068 pi1ppc_read_ivar(device_t dev, int index, unsigned int *val)
   1069 {
   1070 	struct pi1ppc_softc *pi1ppc = device_private(dev);
   1071 	int rval = 0;
   1072 	int s;
   1073 
   1074 	s = splpi1ppc();
   1075 	PI1PPC_LOCK(pi1ppc);
   1076 
   1077 	switch(index) {
   1078 	case PPBUS_IVAR_INTR:
   1079 		*val = ((pi1ppc->sc_use & PI1PPC_USE_INTR) != 0);
   1080 		break;
   1081 
   1082 	case PPBUS_IVAR_DMA:
   1083 		*val = ((pi1ppc->sc_use & PI1PPC_USE_DMA) != 0);
   1084 		break;
   1085 
   1086 	default:
   1087 		rval = ENODEV;
   1088 	}
   1089 
   1090 	PI1PPC_UNLOCK(pi1ppc);
   1091 	splx(s);
   1092 
   1093 	return rval;
   1094 }
   1095 
   1096 /* Write "instance varaibles" of pi1ppc device */
   1097 static int
   1098 pi1ppc_write_ivar(device_t dev, int index, unsigned int *val)
   1099 {
   1100 	struct pi1ppc_softc *pi1ppc = device_private(dev);
   1101 	int rval = 0;
   1102 	int s;
   1103 
   1104 	s = splpi1ppc();
   1105 	PI1PPC_LOCK(pi1ppc);
   1106 
   1107 	switch(index) {
   1108 	case PPBUS_IVAR_INTR:
   1109 		if (*val == 0)
   1110 			pi1ppc->sc_use &= ~PI1PPC_USE_INTR;
   1111 		else if (pi1ppc->sc_has & PI1PPC_HAS_INTR)
   1112 			pi1ppc->sc_use |= PI1PPC_USE_INTR;
   1113 		else
   1114 			rval = ENODEV;
   1115 		break;
   1116 
   1117 	case PPBUS_IVAR_DMA:
   1118 		if (*val == 0)
   1119 			pi1ppc->sc_use &= ~PI1PPC_USE_DMA;
   1120 		else if (pi1ppc->sc_has & PI1PPC_HAS_DMA)
   1121 			pi1ppc->sc_use |= PI1PPC_USE_DMA;
   1122 		else
   1123 			rval = ENODEV;
   1124 		break;
   1125 
   1126 	default:
   1127 		rval = ENODEV;
   1128 	}
   1129 
   1130 	PI1PPC_UNLOCK(pi1ppc);
   1131 	splx(s);
   1132 
   1133 	return rval;
   1134 }
   1135 
   1136 /* Add a handler routine to be called by the interrupt handler */
   1137 static int
   1138 pi1ppc_add_handler(device_t dev, void (*handler)(void *), void *arg)
   1139 {
   1140 	struct pi1ppc_softc *pi1ppc = device_private(dev);
   1141 	struct pi1ppc_handler_node *callback;
   1142 	int rval = 0;
   1143 	int s;
   1144 
   1145 	s = splpi1ppc();
   1146 	PI1PPC_LOCK(pi1ppc);
   1147 
   1148 	if (handler == NULL) {
   1149 		PI1PPC_DPRINTF(("%s(%s): attempt to register NULL handler.\n",
   1150 			__func__, device_xname(dev)));
   1151 		rval = EINVAL;
   1152 	} else {
   1153 		callback = malloc(sizeof(struct pi1ppc_handler_node), M_DEVBUF,
   1154 			M_NOWAIT);
   1155 		if (callback) {
   1156 			callback->func = handler;
   1157 			callback->arg = arg;
   1158 			SLIST_INSERT_HEAD(&(pi1ppc->sc_handler_listhead),
   1159 				callback, entries);
   1160 		} else {
   1161 			rval = ENOMEM;
   1162 		}
   1163 	}
   1164 
   1165 	PI1PPC_UNLOCK(pi1ppc);
   1166 	splx(s);
   1167 
   1168 	return rval;
   1169 }
   1170 
   1171 /* Remove a handler added by pi1ppc_add_handler() */
   1172 static int
   1173 pi1ppc_remove_handler(device_t dev, void (*handler)(void *))
   1174 {
   1175 	struct pi1ppc_softc *pi1ppc = device_private(dev);
   1176 	struct pi1ppc_handler_node *callback;
   1177 	int rval = EINVAL;
   1178 	int s;
   1179 
   1180 	s = splpi1ppc();
   1181 	PI1PPC_LOCK(pi1ppc);
   1182 
   1183 	if (SLIST_EMPTY(&(pi1ppc->sc_handler_listhead)))
   1184 		panic("%s(%s): attempt to remove handler from empty list.\n",
   1185 			__func__, device_xname(dev));
   1186 
   1187 	/* Search list for handler */
   1188 	SLIST_FOREACH(callback, &(pi1ppc->sc_handler_listhead), entries) {
   1189 		if (callback->func == handler) {
   1190 			SLIST_REMOVE(&(pi1ppc->sc_handler_listhead), callback,
   1191 				pi1ppc_handler_node, entries);
   1192 			free(callback, M_DEVBUF);
   1193 			rval = 0;
   1194 			break;
   1195 		}
   1196 	}
   1197 
   1198 	PI1PPC_UNLOCK(pi1ppc);
   1199 	splx(s);
   1200 
   1201 	return rval;
   1202 }
   1203 
   1204 /* Utility functions */
   1205 
   1206 /*
   1207  * Functions that read bytes from port into buffer: called from interrupt
   1208  * handler depending on current chipset mode and cause of interrupt. Return
   1209  * value: number of bytes moved.
   1210  */
   1211 
   1212 /* note: BUSY is inverted in the PC world, but not on Indy, but the r_reg()
   1213 	 and w_reg() functions make the Indy look like the PC. */
   1214 
   1215 /* Only the lower 4 bits of the final value are valid */
   1216 #define nibble2char(s) ((((s) & ~nACK) >> 3) | (~(s) & nBUSY) >> 4)
   1217 
   1218 
   1219 /* Read bytes in nibble mode */
   1220 static void
   1221 pi1ppc_nibble_read(struct pi1ppc_softc *pi1ppc)
   1222 {
   1223 	int i;
   1224 	uint8_t nibble[2];
   1225 	uint8_t ctr;
   1226 	uint8_t str;
   1227 
   1228 	/* Enable interrupts if needed */
   1229 	if (pi1ppc->sc_use & PI1PPC_USE_INTR) {
   1230 
   1231 		/* XXX JOE - need code to enable interrupts
   1232 				--> emulate PC behavior in r_reg/w_reg
   1233 		*/
   1234 #if 0
   1235 		ctr = pi1ppc_r_ctr(pi1ppc);
   1236 		pi1ppc_barrier_r(ioppc);
   1237 		if (!(ctr & IRQENABLE)) {
   1238 			ctr |= IRQENABLE;
   1239 			pi1ppc_w_ctr(pi1ppc, ctr);
   1240 			pi1ppc_barrier_w(pi1ppc);
   1241 		}
   1242 #endif
   1243 	}
   1244 
   1245 	while (pi1ppc->sc_inbstart < (pi1ppc->sc_inb + pi1ppc->sc_inb_nbytes)) {
   1246 		/* Check if device has data to send in idle phase */
   1247 		str = pi1ppc_r_str(pi1ppc);
   1248 		pi1ppc_barrier_r(pi1ppc);
   1249 		if (str & nDATAVAIL) {
   1250 			return;
   1251 		}
   1252 
   1253 		/* Nibble-mode handshake transfer */
   1254 		for (i = 0; i < 2; i++) {
   1255 			/* Event 7 - ready to take data (HOSTBUSY low) */
   1256 			ctr = pi1ppc_r_ctr(pi1ppc);
   1257 			pi1ppc_barrier_r(pi1ppc);
   1258 			ctr |= HOSTBUSY;
   1259 			pi1ppc_w_ctr(pi1ppc, ctr);
   1260 			pi1ppc_barrier_w(pi1ppc);
   1261 
   1262 			/* Event 8 - peripheral writes the first nibble */
   1263 
   1264 			/* Event 9 - peripheral set nAck low */
   1265 			pi1ppc->sc_inerr = pi1ppc_poll_str(pi1ppc, 0, PTRCLK);
   1266 			if (pi1ppc->sc_inerr)
   1267 				return;
   1268 
   1269 			/* read nibble */
   1270 			nibble[i] = pi1ppc_r_str(pi1ppc);
   1271 
   1272 			/* Event 10 - ack, nibble received */
   1273 			ctr &= ~HOSTBUSY;
   1274 			pi1ppc_w_ctr(pi1ppc, ctr);
   1275 
   1276 			/* Event 11 - wait ack from peripherial */
   1277 			if (pi1ppc->sc_use & PI1PPC_USE_INTR)
   1278 				pi1ppc->sc_inerr = pi1ppc_wait_interrupt(pi1ppc,
   1279 					pi1ppc->sc_inb, PI1PPC_IRQ_nACK);
   1280 			else
   1281 				pi1ppc->sc_inerr = pi1ppc_poll_str(pi1ppc, PTRCLK,
   1282 					PTRCLK);
   1283 			if (pi1ppc->sc_inerr)
   1284 				return;
   1285 		}
   1286 
   1287 		/* Store byte transfered */
   1288 		*(pi1ppc->sc_inbstart) = ((nibble2char(nibble[1]) << 4) & 0xf0) |
   1289 			(nibble2char(nibble[0]) & 0x0f);
   1290 		pi1ppc->sc_inbstart++;
   1291 	}
   1292 }
   1293 
   1294 /* Read bytes in bidirectional mode */
   1295 static void
   1296 pi1ppc_byte_read(struct pi1ppc_softc * const pi1ppc)
   1297 {
   1298 	uint8_t ctr;
   1299 	uint8_t str;
   1300 
   1301 	/* Check direction bit */
   1302 	ctr = pi1ppc_r_ctr(pi1ppc);
   1303 	pi1ppc_barrier_r(pi1ppc);
   1304 	if (!(ctr & PCD)) {
   1305 		PI1PPC_DPRINTF(("%s: byte-mode read attempted without direction "
   1306                                 "bit set.", device_xname(pi1ppc->sc_dev)));
   1307 		pi1ppc->sc_inerr = ENODEV;
   1308 		return;
   1309 	}
   1310 	/* Enable interrupts if needed */
   1311 
   1312 		/* XXX JOE - need code to enable interrupts */
   1313 #if 0
   1314 	if (pi1ppc->sc_use & PI1PPC_USE_INTR) {
   1315 		if (!(ctr & IRQENABLE)) {
   1316 			ctr |= IRQENABLE;
   1317 			pi1ppc_w_ctr(pi1ppc, ctr);
   1318 			pi1ppc_barrier_w(pi1ppc);
   1319 		}
   1320 	}
   1321 #endif
   1322 
   1323 	/* Byte-mode handshake transfer */
   1324 	while (pi1ppc->sc_inbstart < (pi1ppc->sc_inb + pi1ppc->sc_inb_nbytes)) {
   1325 		/* Check if device has data to send */
   1326 		str = pi1ppc_r_str(pi1ppc);
   1327 		pi1ppc_barrier_r(pi1ppc);
   1328 		if (str & nDATAVAIL) {
   1329 			return;
   1330 		}
   1331 
   1332 		/* Event 7 - ready to take data (nAUTO low) */
   1333 		ctr |= HOSTBUSY;
   1334 		pi1ppc_w_ctr(pi1ppc, ctr);
   1335 		pi1ppc_barrier_w(pi1ppc);
   1336 
   1337 		/* Event 9 - peripheral set nAck low */
   1338 		pi1ppc->sc_inerr = pi1ppc_poll_str(pi1ppc, 0, PTRCLK);
   1339 		if (pi1ppc->sc_inerr)
   1340 			return;
   1341 
   1342 		/* Store byte transfered */
   1343 		*(pi1ppc->sc_inbstart) = pi1ppc_r_dtr(pi1ppc);
   1344 		pi1ppc_barrier_r(pi1ppc);
   1345 
   1346 		/* Event 10 - data received, can't accept more */
   1347 		ctr &= ~HOSTBUSY;
   1348 		pi1ppc_w_ctr(pi1ppc, ctr);
   1349 		pi1ppc_barrier_w(pi1ppc);
   1350 
   1351 		/* Event 11 - peripheral ack */
   1352 		if (pi1ppc->sc_use & PI1PPC_USE_INTR)
   1353 			pi1ppc->sc_inerr = pi1ppc_wait_interrupt(pi1ppc,
   1354 				pi1ppc->sc_inb, PI1PPC_IRQ_nACK);
   1355 		else
   1356 			pi1ppc->sc_inerr = pi1ppc_poll_str(pi1ppc, PTRCLK, PTRCLK);
   1357 		if (pi1ppc->sc_inerr)
   1358 			return;
   1359 
   1360 		/* Event 16 - strobe */
   1361 		str |= HOSTCLK;
   1362 		pi1ppc_w_str(pi1ppc, str);
   1363 		pi1ppc_barrier_w(pi1ppc);
   1364 		DELAY(1);
   1365 		str &= ~HOSTCLK;
   1366 		pi1ppc_w_str(pi1ppc, str);
   1367 		pi1ppc_barrier_w(pi1ppc);
   1368 
   1369 		/* Update counter */
   1370 		pi1ppc->sc_inbstart++;
   1371 	}
   1372 }
   1373 
   1374 /*
   1375  * Functions that write bytes to port from buffer: called from pi1ppc_write()
   1376  * function depending on current chipset mode. Returns number of bytes moved.
   1377  */
   1378 
   1379 static void
   1380 pi1ppc_set_intr_mask(struct pi1ppc_softc * const pi1ppc, uint8_t mask)
   1381 {
   1382 	/* invert valid bits (0 = enabled) */
   1383 	mask = ~mask;
   1384 	mask &= 0xfc;
   1385 
   1386 	bus_space_write_4((pi1ppc)->sc_iot, (pi1ppc)->sc_ioh, IOC_PLP_INTMASK, mask);
   1387 	pi1ppc_barrier_w(pi1ppc);
   1388 }
   1389 
   1390 
   1391 #ifdef USE_INDY_ACK_HACK
   1392 static uint8_t
   1393 pi1ppc_get_intr_mask(struct pi1ppc_softc * const pi1ppc)
   1394 {
   1395 	int val;
   1396 	val = bus_space_read_4((pi1ppc)->sc_iot, (pi1ppc)->sc_ioh, IOC_PLP_INTMASK);
   1397 	pi1ppc_barrier_r(pi1ppc);
   1398 
   1399 	/* invert (0 = enabled) */
   1400 	val = ~val;
   1401 
   1402 	return (val & 0xfc);
   1403 }
   1404 #endif
   1405 
   1406 static uint8_t
   1407 pi1ppc_get_intr_stat(struct pi1ppc_softc * const pi1ppc)
   1408 {
   1409 	int val;
   1410 	val = bus_space_read_4((pi1ppc)->sc_iot, (pi1ppc)->sc_ioh, IOC_PLP_INTSTAT);
   1411 	pi1ppc_barrier_r(pi1ppc);
   1412 
   1413 	return (val & 0xfc);
   1414 }
   1415 
   1416 /* Write bytes in std/bidirectional mode */
   1417 static void
   1418 pi1ppc_std_write(struct pi1ppc_softc * const pi1ppc)
   1419 {
   1420 	unsigned char ctr;
   1421 
   1422 	ctr = pi1ppc_r_ctr(pi1ppc);
   1423 	pi1ppc_barrier_r(pi1ppc);
   1424 
   1425 	/* Ensure that the data lines are in OUTPUT mode */
   1426 	ctr &= ~PCD;
   1427 	pi1ppc_w_ctr(pi1ppc, ctr);
   1428 	pi1ppc_barrier_w(pi1ppc);
   1429 
   1430 	/* XXX JOE - need code to enable interrupts */
   1431 #if 0
   1432 	/* Enable interrupts if needed */
   1433 	if (pi1ppc->sc_use & PI1PPC_USE_INTR) {
   1434 		if (!(ctr & IRQENABLE)) {
   1435 			ctr |= IRQENABLE;
   1436 			pi1ppc_w_ctr(pi1ppc, ctr);
   1437 			pi1ppc_barrier_w(pi1ppc);
   1438 		}
   1439 	}
   1440 #endif
   1441 
   1442 	while (pi1ppc->sc_outbstart < (pi1ppc->sc_outb + pi1ppc->sc_outb_nbytes)) {
   1443 
   1444 		/* Wait for peripheral to become ready for MAXBUSYWAIT */
   1445 		pi1ppc->sc_outerr = pi1ppc_poll_str(pi1ppc, SPP_READY, SPP_MASK);
   1446 		if (pi1ppc->sc_outerr) {
   1447 			printf("pi1ppc: timeout waiting for peripheral to become ready\n");
   1448 			return;
   1449 		}
   1450 
   1451 		/* Put data in data register */
   1452 		pi1ppc_w_dtr(pi1ppc, *(pi1ppc->sc_outbstart));
   1453 		pi1ppc_barrier_w(pi1ppc);
   1454 		DELAY(1);
   1455 
   1456 		/* If no intr, prepare to catch the rising edge of nACK */
   1457 		if (!(pi1ppc->sc_use & PI1PPC_USE_INTR)) {
   1458 			pi1ppc_get_intr_stat(pi1ppc);	/* clear any pending intr */
   1459 			pi1ppc_set_intr_mask(pi1ppc, PI1_PLP_ACK_INTR);
   1460 		}
   1461 
   1462 		/* Pulse strobe to indicate valid data on lines */
   1463 		ctr |= STROBE;
   1464 		pi1ppc_w_ctr(pi1ppc, ctr);
   1465 		pi1ppc_barrier_w(pi1ppc);
   1466 		DELAY(1);
   1467 		ctr &= ~STROBE;
   1468 		pi1ppc_w_ctr(pi1ppc, ctr);
   1469 		pi1ppc_barrier_w(pi1ppc);
   1470 
   1471 		/* Wait for nACK for MAXBUSYWAIT */
   1472 		if (pi1ppc->sc_use & PI1PPC_USE_INTR) {
   1473 			pi1ppc->sc_outerr = pi1ppc_wait_interrupt(pi1ppc,
   1474 				pi1ppc->sc_outb, PI1PPC_IRQ_nACK);
   1475 			if (pi1ppc->sc_outerr)
   1476 				return;
   1477 		} else {
   1478 			/* Try to catch the pulsed acknowledgement */
   1479 			pi1ppc->sc_outerr = pi1ppc_poll_interrupt_stat(pi1ppc,
   1480 				PI1_PLP_ACK_INTR);
   1481 
   1482 			if (pi1ppc->sc_outerr) {
   1483 				printf("pi1ppc: timeout waiting for ACK: %02x\n",pi1ppc_r_str(pi1ppc));
   1484 				return;
   1485 			}
   1486 		}
   1487 
   1488 		/* Update buffer position, byte count and counter */
   1489 		pi1ppc->sc_outbstart++;
   1490 	}
   1491 }
   1492 
   1493 
   1494 /*
   1495  * Poll status register using mask and status for MAXBUSYWAIT.
   1496  * Returns 0 if device ready, error value otherwise.
   1497  */
   1498 static int
   1499 pi1ppc_poll_str(struct pi1ppc_softc * const pi1ppc, const uint8_t status,
   1500 	const uint8_t mask)
   1501 {
   1502 	unsigned int timecount;
   1503 	uint8_t str;
   1504 	int error = EIO;
   1505 
   1506 	/* Wait for str to have status for MAXBUSYWAIT */
   1507 	for (timecount = 0; timecount < ((MAXBUSYWAIT/hz)*1000000);
   1508 		timecount++) {
   1509 
   1510 		str = pi1ppc_r_str(pi1ppc);
   1511 		pi1ppc_barrier_r(pi1ppc);
   1512 		if ((str & mask) == status) {
   1513 			error = 0;
   1514 			break;
   1515 		}
   1516 		DELAY(1);
   1517 	}
   1518 
   1519 	return error;
   1520 }
   1521 
   1522 /* Wait for interrupt for MAXBUSYWAIT: returns 0 if acknowledge received. */
   1523 static int
   1524 pi1ppc_wait_interrupt(struct pi1ppc_softc * const pi1ppc, const void *where,
   1525 	const uint8_t irqstat)
   1526 {
   1527 	int error = EIO;
   1528 
   1529 	pi1ppc->sc_irqstat &= ~irqstat;
   1530 
   1531 	/* Wait for interrupt for MAXBUSYWAIT */
   1532 	error = ltsleep(where, PPBUSPRI | PCATCH, __func__, MAXBUSYWAIT,
   1533 		PI1PPC_SC_LOCK(pi1ppc));
   1534 
   1535 	if (!(error) && (pi1ppc->sc_irqstat & irqstat)) {
   1536 		pi1ppc->sc_irqstat &= ~irqstat;
   1537 		error = 0;
   1538 	}
   1539 
   1540 	return error;
   1541 }
   1542 
   1543 /*
   1544 	INDY ACK HACK DESCRIPTION
   1545 
   1546 	There appears to be a bug in the Indy's PI1 hardware - it sometimes
   1547 	*misses* the rising edge of /ACK.  Ugh!
   1548 
   1549 	(Also, unlike the other status bits, /ACK doesn't generate an
   1550 	 interrupt on its falling edge.)
   1551 
   1552 	So, we do something kind of skanky here.  We use a shorter timeout,
   1553 	and, if we timeout, we first check BUSY.  If BUSY is high, we go
   1554 	back to waiting for /ACK (because maybe this really is just a slow
   1555 	peripheral).
   1556 
   1557 	If it's a normal printer, it will raise BUSY from when it sees our
   1558 	/STROBE until it raises its /ACK:
   1559 		_____   _____________________
   1560 	/STB	     \_/
   1561 		________________   __________
   1562 	/ACK	                \_/
   1563 		       ___________
   1564 	BUSY	______/           \__________
   1565 
   1566 	So, if we time out and see BUSY low, then we probably just missed
   1567 	the /ACK.
   1568 
   1569 	In that case, we then check /ERROR and SELECTIN.  If both are hi,
   1570 	(the peripheral thinks it is selected, and is not asserting /ERROR)
   1571 	we assume that the Indy's parallel port missed the /ACK, and return
   1572 	success.
   1573  */
   1574 
   1575 #ifdef USE_INDY_ACK_HACK
   1576 	#define	ACK_TIMEOUT_SCALER	1000
   1577 #else
   1578 	#define ACK_TIMEOUT_SCALER	1000000
   1579 #endif
   1580 
   1581 static int
   1582 pi1ppc_poll_interrupt_stat(struct pi1ppc_softc * const pi1ppc,
   1583 	const uint8_t match)
   1584 {
   1585 	unsigned int timecount;
   1586 	uint8_t cur;
   1587 	int error = EIO;
   1588 
   1589 #ifdef USE_INDY_ACK_HACK
   1590 	/* retry 10000x */
   1591 	int retry_count = 10000;
   1592 
   1593 retry:
   1594 #endif
   1595 
   1596 	/* Wait for intr status to have match bits set for MAXBUSYWAIT */
   1597 	for (timecount = 0; timecount < ((MAXBUSYWAIT/hz)*ACK_TIMEOUT_SCALER);
   1598 		timecount++) {
   1599 		cur = pi1ppc_get_intr_stat(pi1ppc);
   1600 		if ((cur & match) == match) {
   1601 			error = 0;
   1602 			break;
   1603 		}
   1604 		DELAY(1);
   1605 	}
   1606 
   1607 #ifdef USE_INDY_ACK_HACK
   1608 	if(error != 0) {
   1609 		cur = pi1ppc_r_str(pi1ppc);
   1610 
   1611 		/* retry if BUSY is hi (inverted, so lo) and we haven't
   1612 			waited the usual amt */
   1613 
   1614 		if(((cur&nBUSY) == 0) && retry_count) {
   1615 			retry_count--;
   1616 			goto retry;
   1617 		}
   1618 
   1619 		/* if /ERROR and SELECT are high, and the peripheral isn't
   1620 	   		BUSY, assume that we just missed the /ACK.
   1621 			(Remember, we emulate the PC's inverted BUSY!)
   1622 		*/
   1623 
   1624 		if((cur&(nFAULT|SELECT|nBUSY)) == (nFAULT|SELECT|nBUSY))
   1625 			error = 0;
   1626 
   1627 		/* if things still look bad, print out some info */
   1628 		if(error!=0)
   1629 			printf("int mask=%02x, int stat=%02x, str=%02x\n",
   1630 						pi1ppc_get_intr_mask(pi1ppc),
   1631 						pi1ppc_get_intr_stat(pi1ppc),
   1632 						cur);
   1633 	}
   1634 #endif
   1635 
   1636 	return error;
   1637 }
   1638 
   1639