xref: /netbsd-src/sys/arch/sgimips/hpc/pi1ppc.c (revision daf6c4152fcddc27c445489775ed1f66ab4ea9a9)
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@users.sourceforge.net>
6  * Copyright (c) 2005 Joe Britt <britt@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