Module Name:    src
Committed By:   tsutsui
Date:           Fri Apr  9 17:38:43 UTC 2010

Modified Files:
        src/sys/arch/atari/atari: locore.s vectors.s
        src/sys/arch/atari/dev: zs.c zsvar.h

Log Message:
- establish zs interrupts via common intr_establish() function rather than
  hardcording them in locore.s and vector.s
- also make interrupt handlers take per unit softc and put a softint cookie
  into softc (though atari machines have only one zs)
- tweak some structures as per MI z8530sc driver

Tested on TT030 using sl(4) on zs.


To generate a diff of this commit:
cvs rdiff -u -r1.104 -r1.105 src/sys/arch/atari/atari/locore.s
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/atari/atari/vectors.s
cvs rdiff -u -r1.71 -r1.72 src/sys/arch/atari/dev/zs.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/atari/dev/zsvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/atari/atari/locore.s
diff -u src/sys/arch/atari/atari/locore.s:1.104 src/sys/arch/atari/atari/locore.s:1.105
--- src/sys/arch/atari/atari/locore.s:1.104	Wed Dec  2 15:53:34 2009
+++ src/sys/arch/atari/atari/locore.s	Fri Apr  9 17:38:43 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.104 2009/12/02 15:53:34 tsutsui Exp $	*/
+/*	$NetBSD: locore.s,v 1.105 2010/04/09 17:38:43 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1980, 1990 The Regents of the University of California.
@@ -756,23 +756,6 @@
 	jra	_ASM_LABEL(rei)
 #endif /* NNCRSCSI > 0 */
 
-#if NZS > 0
-	/* SCC Interrupt --- modem2/serial2 --- */
-ASENTRY_NOPROFILE(sccint)
-	addql	#1,_C_LABEL(idepth)
-	addql	#1,_C_LABEL(intrcnt)+32	|  add another SCC interrupt
-
-	moveml	%d0-%d1/%a0-%a1,%...@-	|  Save scratch registers
-	movw	%sp@(16),%...@-		|  push previous SR value
-	clrw	%...@-			|     padded to longword
-	jbsr	_C_LABEL(zshard)	|  handle interrupt
-	addql	#4,%sp			|  pop SR
-	moveml	%...@+,%d0-%d1/%a0-%a1
-	addql	#1,_C_LABEL(uvmexp)+UVMEXP_INTRS
-	subql	#1,_C_LABEL(idepth)
-	jra	_ASM_LABEL(rei)
-#endif /* NZS > 0 */
-
 #ifdef _ATARIHW_
 	/* Level 1 (Software) interrupt handler */
 ENTRY_NOPROFILE(lev1intr)

Index: src/sys/arch/atari/atari/vectors.s
diff -u src/sys/arch/atari/atari/vectors.s:1.21 src/sys/arch/atari/atari/vectors.s:1.22
--- src/sys/arch/atari/atari/vectors.s:1.21	Sun Dec 11 12:16:54 2005
+++ src/sys/arch/atari/atari/vectors.s	Fri Apr  9 17:38:43 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vectors.s,v 1.21 2005/12/11 12:16:54 christos Exp $	*/
+/*	$NetBSD: vectors.s,v 1.22 2010/04/09 17:38:43 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1990 Regents of the University of California.
@@ -212,44 +212,25 @@
 	VECTOR(badmfpint)	|  95:
 #endif /* NNCRSCSI > 0 */
 
-#if NZS > 0
 	/*
 	 * Interrupts from the 8530 SCC
 	 */
-	ASVECTOR(sccint)	|  96: SCC Tx empty channel B
+	VECTOR(badtrap)		|  96: SCC Tx empty channel B
 	VECTOR(badtrap)		|  97: Not used
-	ASVECTOR(sccint)	|  98: SCC Ext./Status Channel B
+	VECTOR(badtrap)		|  98: SCC Ext./Status Channel B
 	VECTOR(badtrap)		|  99: Not used
-	ASVECTOR(sccint)	| 100: SCC Rx Channel B
+	VECTOR(badtrap)		| 100: SCC Rx Channel B
 	VECTOR(badtrap)		| 101: Not used
-	ASVECTOR(sccint)	| 102: SCC Special Rx cond.  Channel B
+	VECTOR(badtrap)		| 102: SCC Special Rx cond.  Channel B
 	VECTOR(badtrap)		| 103: Not used
-	ASVECTOR(sccint)	| 104: SCC Tx empty channel A
+	VECTOR(badtrap)		| 104: SCC Tx empty channel A
 	VECTOR(badtrap)		| 105: Not used
-	ASVECTOR(sccint)	| 106: SCC Ext./Status Channel A
+	VECTOR(badtrap)		| 106: SCC Ext./Status Channel A
 	VECTOR(badtrap)		| 107: Not used
-	ASVECTOR(sccint)	| 108: SCC Rx Channel A
+	VECTOR(badtrap)		| 108: SCC Rx Channel A
 	VECTOR(badtrap)		| 109: Not used
-	ASVECTOR(sccint)	| 110: SCC Special Rx cond.  Channel A
+	VECTOR(badtrap)		| 110: SCC Special Rx cond.  Channel A
 	VECTOR(badtrap)		| 111: Not used
-#else
-	VECTOR(badtrap)		|  96: Not used
-	VECTOR(badtrap)		|  97: Not used
-	VECTOR(badtrap)		|  98: Not used
-	VECTOR(badtrap)		|  99: Not used
-	VECTOR(badtrap)		| 100: Not used
-	VECTOR(badtrap)		| 101: Not used
-	VECTOR(badtrap)		| 102: Not used
-	VECTOR(badtrap)		| 103: Not used
-	VECTOR(badtrap)		| 104: Not used
-	VECTOR(badtrap)		| 105: Not used
-	VECTOR(badtrap)		| 106: Not used
-	VECTOR(badtrap)		| 107: Not used
-	VECTOR(badtrap)		| 108: Not used
-	VECTOR(badtrap)		| 109: Not used
-	VECTOR(badtrap)		| 110: Not used
-	VECTOR(badtrap)		| 111: Not used
-#endif /* NZS > 0 */
 
 #define BADTRAP16	VECTOR(badtrap) ; VECTOR(badtrap) ; \
 			VECTOR(badtrap) ; VECTOR(badtrap) ; \

Index: src/sys/arch/atari/dev/zs.c
diff -u src/sys/arch/atari/dev/zs.c:1.71 src/sys/arch/atari/dev/zs.c:1.72
--- src/sys/arch/atari/dev/zs.c:1.71	Fri Apr  9 17:06:31 2010
+++ src/sys/arch/atari/dev/zs.c	Fri Apr  9 17:38:43 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: zs.c,v 1.71 2010/04/09 17:06:31 tsutsui Exp $	*/
+/*	$NetBSD: zs.c,v 1.72 2010/04/09 17:38:43 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -79,7 +79,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.71 2010/04/09 17:06:31 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: zs.c,v 1.72 2010/04/09 17:38:43 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -123,11 +123,12 @@
  */
 struct zs_softc {
 	device_t sc_dev;		/* base device */
-	struct zsdevice *sc_zs;		/* chip registers */
-	struct zs_chanstate sc_cs[2];	/* chan A and B software state */
+	struct zs_chanstate *sc_cs[2];	/* chan A and B software state */
+
+	struct zs_chanstate sc_cs_store[2];
+	void *sc_sicookie;		/* for callback */
 };
 
-static void	*zs_softint_cookie;	/* for callback */
 /*
  * Define the registers for a closed port
  */
@@ -242,14 +243,12 @@
 };
 
 /* Interrupt handlers. */
-int		zshard(long);
-static int	zssoft(long);
+static int	zshard(void *);
+static int	zssoft(void *);
 static int	zsrint(struct zs_chanstate *, struct zschan *);
 static int	zsxint(struct zs_chanstate *, struct zschan *);
 static int	zssint(struct zs_chanstate *, struct zschan *);
 
-static struct zs_chanstate *zslist;
-
 /* Routines called from other code. */
 static void	zsstart(struct tty *);
 
@@ -279,36 +278,45 @@
 zsattach(device_t parent, device_t self, void *aux)
 {
 	struct zs_softc *sc;
+	struct zsdevice *zs;
+	struct zschan *zc;
 	struct zs_chanstate *cs;
-	struct zsdevice *addr;
-	uint8_t tmp;
+	int channel;
 
-	addr      = (struct zsdevice *)AD_SCC;
-	sc        = device_private(self);
+	sc = device_private(self);
 	sc->sc_dev = self;
-	sc->sc_zs = addr;
-	cs        = sc->sc_cs;
 
-	/*
-	 * Get the command register into a known state.
-	 */
-	tmp = addr->zs_chan[ZS_CHAN_A].zc_csr;
-	tmp = addr->zs_chan[ZS_CHAN_A].zc_csr;
-	tmp = addr->zs_chan[ZS_CHAN_B].zc_csr;
-	tmp = addr->zs_chan[ZS_CHAN_B].zc_csr;
+	printf(": serial2 on channel a and modem2 on channel b\n");
 
-	/*
-	 * Do a hardware reset.
-	 */
-	ZS_WRITE(&addr->zs_chan[ZS_CHAN_A], 9, ZSWR9_HARD_RESET);
-	delay(50000);	/*enough ? */
-	ZS_WRITE(&addr->zs_chan[ZS_CHAN_A], 9, 0);
+	zs = (struct zsdevice *)AD_SCC;
 
-	/*
-	 * Initialize both channels
-	 */
-	zs_loadchannelregs(&addr->zs_chan[ZS_CHAN_A], zs_init_regs);
-	zs_loadchannelregs(&addr->zs_chan[ZS_CHAN_B], zs_init_regs);
+	for (channel = 0; channel < 2; channel++) {
+		cs = &sc->sc_cs_store[channel];
+		sc->sc_cs[channel] = cs;
+
+		cs->cs_unit = channel;
+		cs->cs_zc = zc =
+		    (channel == 0) ?  &zs->zs_chan_a : &zs->zs_chan_b;
+		/*
+		 * Get the command register into a known state.
+		 */
+		(void)zc->zc_csr;
+		(void)zc->zc_csr;
+
+		/*
+		 * Do a hardware reset.
+		 */
+		if (channel == 0) {
+			ZS_WRITE(zc, 9, ZSWR9_HARD_RESET);
+			delay(50000);	/* enough ? */
+			ZS_WRITE(zc, 9, 0);
+		}
+
+		/*
+		 * Initialize channel
+		 */
+		zs_loadchannelregs(zc, zs_init_regs);
+	}
 
 	if (machineid & ATARI_TT) {
 		/*
@@ -336,21 +344,33 @@
 		zs_frequencies = zs_freqs_generic;
 	}
 
-	/* link into interrupt list with order (A,B) (B=A+1) */
-	cs[0].cs_next = &cs[1];
-	cs[1].cs_next = zslist;
-	zslist        = cs;
-
-	cs->cs_unit  = 0;
-	cs->cs_zc    = &addr->zs_chan[ZS_CHAN_A];
-	cs++;
-	cs->cs_unit  = 1;
-	cs->cs_zc    = &addr->zs_chan[ZS_CHAN_B];
-
-	zs_softint_cookie = softint_establish(SOFTINT_SERIAL,
-	    (void (*)(void *))zssoft, 0);
+	if (intr_establish(36, USER_VEC, 0, (hw_ifun_t)zshard, sc) == NULL)
+		aprint_error_dev(self,
+		    "Can't establish interrupt (Rx chan B)\n");
+	if (intr_establish(32, USER_VEC, 0, (hw_ifun_t)zshard, sc) == NULL)
+		aprint_error_dev(self,
+		    "Can't establish interrupt (Tx empty chan B)\n");
+	if (intr_establish(34, USER_VEC, 0, (hw_ifun_t)zshard, sc) == NULL)
+		aprint_error_dev(self,
+		    "Can't establish interrupt (Ext./Status chan B)\n");
+	if (intr_establish(38, USER_VEC, 0, (hw_ifun_t)zshard, sc) == NULL)
+		aprint_error_dev(self,
+		    "Can't establish interrupt (Special Rx cond. chan B)\n");
+	if (intr_establish(44, USER_VEC, 0, (hw_ifun_t)zshard, sc) == NULL)
+		aprint_error_dev(self,
+		    "Can't establish interrupt (Rx chan A)\n");
+	if (intr_establish(40, USER_VEC, 0, (hw_ifun_t)zshard, sc) == NULL)
+		aprint_error_dev(self,
+		    "Can't establish interrupt (Tx empty chan A)\n");
+	if (intr_establish(42, USER_VEC, 0, (hw_ifun_t)zshard, sc) == NULL)
+		aprint_error_dev(self,
+		    "Can't establish interrupt (Ext./Status chan A)\n");
+	if (intr_establish(46, USER_VEC, 0, (hw_ifun_t)zshard, sc) == NULL)
+		aprint_error_dev(self,
+		    "Can't establish interrupt (Special Rx cond. chan A)\n");
 
-	printf(": serial2 on channel a and modem2 on channel b\n");
+	sc->sc_sicookie = softint_establish(SOFTINT_SERIAL,
+	    (void (*)(void *))zssoft, sc);
 }
 
 /*
@@ -369,7 +389,7 @@
 	sc = device_lookup_private(&zs_cd, zs);
 	if (sc == NULL)
 		return ENXIO;
-	cs = &sc->sc_cs[unit & 1];
+	cs = sc->sc_cs[unit & 1];
 
 	/*
 	 * When port A (ser02) is selected on the TT, make sure
@@ -462,7 +482,7 @@
 	int unit = ZS_UNIT(dev);
 
 	sc = device_lookup_private(&zs_cd, unit >> 1);
-	cs = &sc->sc_cs[unit & 1];
+	cs = sc->sc_cs[unit & 1];
 	tp = cs->cs_ttyp;
 
 	tp->t_linesw->l_close(tp, flags);
@@ -492,7 +512,7 @@
 
 	unit = ZS_UNIT(dev);
 	sc   = device_lookup_private(&zs_cd, unit >> 1);
-	cs   = &sc->sc_cs[unit & 1];
+	cs   = sc->sc_cs[unit & 1];
 	tp   = cs->cs_ttyp;
 
 	return (*tp->t_linesw->l_read)(tp, uio, flags);
@@ -508,7 +528,7 @@
 
 	unit = ZS_UNIT(dev);
 	sc   = device_lookup_private(&zs_cd, unit >> 1);
-	cs   = &sc->sc_cs[unit & 1];
+	cs   = sc->sc_cs[unit & 1];
 	tp   = cs->cs_ttyp;
 
 	return (*tp->t_linesw->l_write)(tp, uio, flags);
@@ -524,7 +544,7 @@
 
 	unit = ZS_UNIT(dev);
 	sc   = device_lookup_private(&zs_cd, unit >> 1);
-	cs   = &sc->sc_cs[unit & 1];
+	cs   = sc->sc_cs[unit & 1];
 	tp   = cs->cs_ttyp;
  
 	return (*tp->t_linesw->l_poll)(tp, events, l);
@@ -539,7 +559,7 @@
 
 	unit = ZS_UNIT(dev);
 	sc   = device_lookup_private(&zs_cd, unit >> 1);
-	cs   = &sc->sc_cs[unit & 1];
+	cs   = sc->sc_cs[unit & 1];
 	return cs->cs_ttyp;
 }
 
@@ -556,67 +576,68 @@
  */
 
 int
-zshard(long sr)
+zshard(void *arg)
 {
-	struct zs_chanstate *a;
-#define	b (a + 1)
+	struct zs_softc *sc;
+	struct zs_chanstate *cs0, *cs1;
 	struct zschan *zc;
-	int rr3, intflags = 0, v, i;
+	int intflags, v, i;
+	uint8_t rr3;
+
+	sc = arg;
+	intflags = 0;
+	cs0 = sc->sc_cs[0];
+	cs1 = sc->sc_cs[1];
 
 	do {
 		intflags &= ~4;
-		for (a = zslist; a != NULL; a = b->cs_next) {
-			rr3 = ZS_READ(a->cs_zc, 3);
-			if (rr3 & (ZSRR3_IP_A_RX | ZSRR3_IP_A_TX |
-			    ZSRR3_IP_A_STAT)) {
-				intflags |= 4 | 2;
-				zc = a->cs_zc;
-				i  = a->cs_rbput;
-				if ((rr3 & ZSRR3_IP_A_RX) != 0 &&
-				    (v = zsrint(a, zc)) != 0) {
-					a->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
-					intflags |= 1;
-				}
-				if ((rr3 & ZSRR3_IP_A_TX) != 0 &&
-				    (v = zsxint(a, zc)) != 0) {
-					a->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
-					intflags |= 1;
-				}
-				if ((rr3 & ZSRR3_IP_A_STAT) != 0 &&
-				    (v = zssint(a, zc)) != 0) {
-					a->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
-					intflags |= 1;
-				}
-				a->cs_rbput = i;
+		rr3 = ZS_READ(cs0->cs_zc, 3);
+		if (rr3 & (ZSRR3_IP_A_RX | ZSRR3_IP_A_TX | ZSRR3_IP_A_STAT)) {
+			intflags |= 4 | 2;
+			zc = cs0->cs_zc;
+			i  = cs0->cs_rbput;
+			if ((rr3 & ZSRR3_IP_A_RX) != 0 &&
+			    (v = zsrint(cs0, zc)) != 0) {
+				cs0->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
+				intflags |= 1;
 			}
-			if (rr3 & (ZSRR3_IP_B_RX | ZSRR3_IP_B_TX |
-			    ZSRR3_IP_B_STAT)) {
-				intflags |= 4 | 2;
-				zc = b->cs_zc;
-				i  = b->cs_rbput;
-				if ((rr3 & ZSRR3_IP_B_RX) != 0 &&
-				    (v = zsrint(b, zc)) != 0) {
-					b->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
-					intflags |= 1;
-				}
-				if ((rr3 & ZSRR3_IP_B_TX) != 0 &&
-				    (v = zsxint(b, zc)) != 0) {
-					b->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
-					intflags |= 1;
-				}
-				if ((rr3 & ZSRR3_IP_B_STAT) != 0 &&
-				    (v = zssint(b, zc)) != 0) {
-					b->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
-					intflags |= 1;
-				}
-				b->cs_rbput = i;
+			if ((rr3 & ZSRR3_IP_A_TX) != 0 &&
+			    (v = zsxint(cs0, zc)) != 0) {
+				cs0->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
+				intflags |= 1;
+			}
+			if ((rr3 & ZSRR3_IP_A_STAT) != 0 &&
+			    (v = zssint(cs0, zc)) != 0) {
+				cs0->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
+				intflags |= 1;
 			}
+			cs0->cs_rbput = i;
+		}
+		if (rr3 & (ZSRR3_IP_B_RX | ZSRR3_IP_B_TX | ZSRR3_IP_B_STAT)) {
+			intflags |= 4 | 2;
+			zc = cs1->cs_zc;
+			i  = cs1->cs_rbput;
+			if ((rr3 & ZSRR3_IP_B_RX) != 0 &&
+			    (v = zsrint(cs1, zc)) != 0) {
+				cs1->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
+				intflags |= 1;
+			}
+			if ((rr3 & ZSRR3_IP_B_TX) != 0 &&
+			    (v = zsxint(cs1, zc)) != 0) {
+				cs1->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
+				intflags |= 1;
+			}
+			if ((rr3 & ZSRR3_IP_B_STAT) != 0 &&
+			    (v = zssint(cs1, zc)) != 0) {
+				cs1->cs_rbuf[i++ & ZLRB_RING_MASK] = v;
+				intflags |= 1;
+			}
+			cs1->cs_rbput = i;
 		}
 	} while (intflags & 4);
-#undef b
 
 	if (intflags & 1)
-		softint_schedule(zs_softint_cookie);
+		softint_schedule(sc->sc_sicookie);
 
 	return intflags & 2;
 }
@@ -705,24 +726,26 @@
  * ZS software interrupt.  Scan all channels for deferred interrupts.
  */
 int
-zssoft(long sr)
+zssoft(void *arg)
 {
+	struct zs_softc *sc;
 	struct zs_chanstate *cs;
 	struct zschan *zc;
 	struct linesw *line;
 	struct tty *tp;
-	int get, n, c, cc, unit, s;
+	int chan, get, n, c, cc, s;
 	int retval = 0;
 
+	sc = arg;
 	s = spltty();
-	for (cs = zslist; cs != NULL; cs = cs->cs_next) {
+	for (chan = 0; chan < 2; chan++) {
+		cs = sc->sc_cs[chan];
 		get = cs->cs_rbget;
 again:
 		n = cs->cs_rbput;	/* atomic			*/
 		if (get == n)		/* nothing more on this line	*/
 			continue;
 		retval = 1;
-		unit   = cs->cs_unit;	/* set up to handle interrupts	*/
 		zc     = cs->cs_zc;
 		tp     = cs->cs_ttyp;
 		line   = tp->t_linesw;
@@ -737,7 +760,7 @@
 		 */
 		n -= get;
 		if (n > ZLRB_RING_SIZE) {
-			zsoverrun(unit, &cs->cs_rotime, "ring");
+			zsoverrun(chan, &cs->cs_rotime, "ring");
 			get += n - ZLRB_RING_SIZE;
 			n    = ZLRB_RING_SIZE;
 		}
@@ -749,7 +772,7 @@
 			case ZRING_RINT:
 				c = ZRING_VALUE(c);
 				if ((c & ZSRR1_DO) != 0)
-					zsoverrun(unit, &cs->cs_fotime, "fifo");
+					zsoverrun(chan, &cs->cs_fotime, "fifo");
 				cc = c >> 8;
 				if ((c & ZSRR1_FE) != 0)
 					cc |= TTY_FE;
@@ -810,7 +833,7 @@
 
 			default:
 				log(LOG_ERR, "zs%d%c: bad ZRING_TYPE (%x)\n",
-				    unit >> 1, (unit & 1) + 'a', c);
+				    chan >> 1, (chan & 1) + 'a', c);
 				break;
 			}
 		}
@@ -826,9 +849,9 @@
 {
 	int unit = ZS_UNIT(dev);
 	struct zs_softc *sc = device_lookup_private(&zs_cd, unit >> 1);
-	struct tty *tp = sc->sc_cs[unit & 1].cs_ttyp;
+	struct zs_chanstate *cs = sc->sc_cs[unit & 1];
+	struct tty *tp = cs->cs_ttyp;
 	int error, s;
-	struct zs_chanstate *cs = &sc->sc_cs[unit & 1];
 
 	error = tp->t_linesw->l_ioctl(tp, cmd, data, flag, l);
 	if (error != EPASSTHROUGH)
@@ -949,7 +972,7 @@
 	int unit = ZS_UNIT(tp->t_dev);
 	struct zs_softc *sc = device_lookup_private(&zs_cd, unit >> 1);
 
-	cs = &sc->sc_cs[unit & 1];
+	cs = sc->sc_cs[unit & 1];
 	s  = spltty();
 
 	/*
@@ -1001,7 +1024,7 @@
 	int s, unit = ZS_UNIT(tp->t_dev);
 	struct zs_softc *sc = device_lookup_private(&zs_cd, unit >> 1);
 
-	cs = &sc->sc_cs[unit & 1];
+	cs = sc->sc_cs[unit & 1];
 	s  = splzs();
 	if ((tp->t_state & TS_BUSY) != 0) {
 		/*
@@ -1056,7 +1079,7 @@
 {
 	int unit = ZS_UNIT(tp->t_dev);
 	struct zs_softc *sc = device_lookup_private(&zs_cd, unit >> 1);
-	struct zs_chanstate *cs = &sc->sc_cs[unit & 1];
+	struct zs_chanstate *cs = sc->sc_cs[unit & 1];
 	int cdiv = 0;	/* XXX gcc4 -Wuninitialized */
 	int clkm = 0;	/* XXX gcc4 -Wuninitialized */
 	int brgm = 0;	/* XXX gcc4 -Wuninitialized */

Index: src/sys/arch/atari/dev/zsvar.h
diff -u src/sys/arch/atari/dev/zsvar.h:1.15 src/sys/arch/atari/dev/zsvar.h:1.16
--- src/sys/arch/atari/dev/zsvar.h:1.15	Fri Apr  9 12:34:25 2010
+++ src/sys/arch/atari/dev/zsvar.h	Fri Apr  9 17:38:43 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: zsvar.h,v 1.15 2010/04/09 12:34:25 tsutsui Exp $	*/
+/*	$NetBSD: zsvar.h,v 1.16 2010/04/09 17:38:43 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -81,7 +81,8 @@
 };
 
 struct zsdevice {
-	struct	zschan zs_chan[2];
+	struct	zschan zs_chan_a;
+	struct	zschan zs_chan_b;
 };
 
 /*
@@ -118,7 +119,6 @@
 #define	ZRING_MAKE(t, v)	((t) | (v) << 8)
 
 struct zs_chanstate {
-	struct zs_chanstate	*cs_next;	/* linked list for zshard() */
 	struct zschan		*cs_zc;		/* points to hardware regs */
 	int			cs_unit;	/* unit number */
 	struct	tty		*cs_ttyp;	/* ### */
@@ -170,9 +170,6 @@
 	int		*cs_rbuf;	/* type, value pairs	*/
 };
 
-#define	ZS_CHAN_A	0
-#define	ZS_CHAN_B	1
-
 /*
  * Macros to read and write individual registers (except 0) in a channel.
  */

Reply via email to