1/*	$NecBSD: nsp.c,v 1.21.12.6 2001/06/29 06:27:52 honda Exp $	*/
2/*	$NetBSD$	*/
3
4#define	NSP_DEBUG
5#define	NSP_STATICS
6#define	NSP_IO_CONTROL_FLAGS \
7	(NSP_READ_SUSPEND_IO | NSP_WRITE_SUSPEND_IO | \
8	 NSP_READ_FIFO_INTERRUPTS | NSP_WRITE_FIFO_INTERRUPTS | \
9	 NSP_USE_MEMIO | NSP_WAIT_FOR_SELECT)
10
11/*-
12 * SPDX-License-Identifier: BSD-3-Clause
13 *
14 *  Copyright (c) 1998, 1999, 2000, 2001
15 *	NetBSD/pc98 porting staff. All rights reserved.
16 *
17 *  Copyright (c) 1998, 1999, 2000, 2001
18 *	Naofumi HONDA. All rights reserved.
19 *
20 *  Redistribution and use in source and binary forms, with or without
21 *  modification, are permitted provided that the following conditions
22 *  are met:
23 *  1. Redistributions of source code must retain the above copyright
24 *     notice, this list of conditions and the following disclaimer.
25 *  2. Redistributions in binary form must reproduce the above copyright
26 *     notice, this list of conditions and the following disclaimer in the
27 *     documentation and/or other materials provided with the distribution.
28 *  3. The name of the author may not be used to endorse or promote products
29 *     derived from this software without specific prior written permission.
30 *
31 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
32 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
33 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
34 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
35 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
36 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
37 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
40 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGE.
42 */
43
44#include <sys/cdefs.h>
45__FBSDID("$FreeBSD$");
46
47#include <sys/param.h>
48#include <sys/systm.h>
49#include <sys/kernel.h>
50#include <sys/bio.h>
51#include <sys/buf.h>
52#include <sys/queue.h>
53#include <sys/malloc.h>
54#include <sys/errno.h>
55#include <sys/rman.h>
56
57#include <machine/cpu.h>
58#include <machine/bus.h>
59
60#include <cam/scsi/scsi_low.h>
61#include <dev/nsp/nspreg.h>
62#include <dev/nsp/nspvar.h>
63
64/***************************************************
65 * USER SETTINGS
66 ***************************************************/
67/* DEVICE CONFIGURATION FLAGS (MINOR)
68 *
69 * 0x01   DISCONNECT OFF
70 * 0x02   PARITY LINE OFF
71 * 0x04   IDENTIFY MSG OFF ( = single lun)
72 * 0x08   SYNC TRANSFER OFF
73 */
74
75/***************************************************
76 * PARAMS
77 ***************************************************/
78#define	NSP_NTARGETS	8
79#define	NSP_NLUNS	8
80
81#define	NSP_MAX_DATA_SIZE	(64 * 1024)
82#define	NSP_SELTIMEOUT		(200)
83#define	NSP_DELAY_MAX		(2 * 1000 * 1000)
84#define	NSP_DELAY_INTERVAL	(1)
85#define	NSP_TIMER_1MS		(1000 / 51)
86
87/***************************************************
88 * DEBUG
89 ***************************************************/
90#ifdef	NSP_DEBUG
91int nsp_debug;
92#endif	/* NSP_DEBUG */
93
94#ifdef	NSP_STATICS
95struct nsp_statics {
96	int arbit_conflict_1;
97	int arbit_conflict_2;
98	int device_data_write;
99	int device_busy;
100	int disconnect;
101	int reselect;
102	int data_phase_bypass;
103} nsp_statics;
104#endif	/* NSP_STATICS */
105
106/***************************************************
107 * IO control
108 ***************************************************/
109#define	NSP_READ_SUSPEND_IO		0x0001
110#define	NSP_WRITE_SUSPEND_IO		0x0002
111#define	NSP_USE_MEMIO			0x0004
112#define	NSP_READ_FIFO_INTERRUPTS	0x0010
113#define	NSP_WRITE_FIFO_INTERRUPTS	0x0020
114#define	NSP_WAIT_FOR_SELECT		0x0100
115
116u_int nsp_io_control = NSP_IO_CONTROL_FLAGS;
117int nsp_read_suspend_bytes = DEV_BSIZE;
118int nsp_write_suspend_bytes = DEV_BSIZE;
119int nsp_read_interrupt_bytes = 4096;
120int nsp_write_interrupt_bytes = 4096;
121
122/***************************************************
123 * DEVICE STRUCTURE
124 ***************************************************/
125extern struct cfdriver nsp_cd;
126
127/**************************************************************
128 * DECLARE
129 **************************************************************/
130#define	NSP_FIFO_ON	1
131#define	NSP_FIFO_OFF	0
132static void nsp_pio_read(struct nsp_softc *, int);
133static void nsp_pio_write(struct nsp_softc *, int);
134static int nsp_xfer(struct nsp_softc *, u_int8_t *, int, int, int);
135static int nsp_msg(struct nsp_softc *, struct targ_info *, u_int);
136static int nsp_reselected(struct nsp_softc *);
137static int nsp_disconnected(struct nsp_softc *, struct targ_info *);
138static void nsp_pdma_end(struct nsp_softc *, struct targ_info *);
139static void nsphw_init(struct nsp_softc *);
140static int nsp_target_nexus_establish(struct nsp_softc *);
141static int nsp_lun_nexus_establish(struct nsp_softc *);
142static int nsp_ccb_nexus_establish(struct nsp_softc *);
143static int nsp_world_start(struct nsp_softc *, int);
144static int nsphw_start_selection(struct nsp_softc *sc, struct slccb *);
145static void nsphw_bus_reset(struct nsp_softc *);
146static void nsphw_attention(struct nsp_softc *);
147static u_int nsp_fifo_count(struct nsp_softc *);
148static u_int nsp_request_count(struct nsp_softc *);
149static int nsp_negate_signal(struct nsp_softc *, u_int8_t, u_char *);
150static int nsp_expect_signal(struct nsp_softc *, u_int8_t, u_int8_t);
151static void nsp_start_timer(struct nsp_softc *, int);
152static void nsp_setup_fifo(struct nsp_softc *, int, int, int);
153static int nsp_targ_init(struct nsp_softc *, struct targ_info *, int);
154static void nsphw_selection_done_and_expect_msgout(struct nsp_softc *);
155static void nsp_data_padding(struct nsp_softc *, int, u_int);
156static int nsp_timeout(struct nsp_softc *);
157static int nsp_read_fifo(struct nsp_softc *, int);
158static int nsp_write_fifo(struct nsp_softc *, int);
159static int nsp_phase_match(struct nsp_softc *, u_int8_t, u_int8_t);
160static int nsp_wait_interrupt(struct nsp_softc *);
161
162struct scsi_low_funcs nspfuncs = {
163	SC_LOW_INIT_T nsp_world_start,
164	SC_LOW_BUSRST_T nsphw_bus_reset,
165	SC_LOW_TARG_INIT_T nsp_targ_init,
166	SC_LOW_LUN_INIT_T NULL,
167
168	SC_LOW_SELECT_T nsphw_start_selection,
169	SC_LOW_NEXUS_T nsp_lun_nexus_establish,
170	SC_LOW_NEXUS_T nsp_ccb_nexus_establish,
171
172	SC_LOW_ATTEN_T nsphw_attention,
173	SC_LOW_MSG_T nsp_msg,
174
175	SC_LOW_TIMEOUT_T nsp_timeout,
176	SC_LOW_POLL_T nspintr,
177
178	NULL,
179};
180
181/****************************************************
182 * hwfuncs
183 ****************************************************/
184static __inline uint8_t
185nsp_cr_read_1(struct resource *res, bus_addr_t ofs)
186{
187
188	bus_write_1(res, nsp_idxr, ofs);
189	return bus_read_1(res, nsp_datar);
190}
191
192static __inline void
193nsp_cr_write_1(struct resource *res, bus_addr_t ofs, uint8_t va)
194{
195
196	bus_write_1(res, nsp_idxr, ofs);
197	bus_write_1(res, nsp_datar, va);
198}
199
200static int
201nsp_expect_signal(struct nsp_softc *sc, u_int8_t curphase, u_int8_t mask)
202{
203	struct scsi_low_softc *slp = &sc->sc_sclow;
204	int wc;
205	u_int8_t ph, isrc;
206
207	for (wc = 0; wc < NSP_DELAY_MAX / NSP_DELAY_INTERVAL; wc ++)
208	{
209		ph = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
210		if (ph == (u_int8_t) -1)
211			return -1;
212
213		isrc = bus_read_1(sc->port_res, nsp_irqsr);
214		if (isrc & IRQSR_SCSI)
215			return 0;
216
217		if ((ph & mask) != 0 && (ph & SCBUSMON_PHMASK) == curphase)
218			return 1;
219
220		DELAY(NSP_DELAY_INTERVAL);
221	}
222
223	device_printf(slp->sl_dev, "nsp_expect_signal timeout\n");
224	return -1;
225}
226
227static void
228nsphw_init(sc)
229	struct nsp_softc *sc;
230{
231
232	/* block all interrupts */
233	bus_write_1(sc->port_res, nsp_irqcr, IRQCR_ALLMASK);
234
235	/* setup SCSI interface */
236	bus_write_1(sc->port_res, nsp_ifselr, IFSELR_IFSEL);
237
238	nsp_cr_write_1(sc->port_res, NSPR_SCIENR, 0);
239
240	nsp_cr_write_1(sc->port_res, NSPR_XFERMR, XFERMR_IO8);
241	nsp_cr_write_1(sc->port_res, NSPR_CLKDIVR, sc->sc_iclkdiv);
242
243	nsp_cr_write_1(sc->port_res, NSPR_SCIENR, sc->sc_icr);
244	nsp_cr_write_1(sc->port_res, NSPR_PARITYR, sc->sc_parr);
245	nsp_cr_write_1(sc->port_res, NSPR_PTCLRR,
246		       PTCLRR_ACK | PTCLRR_REQ | PTCLRR_HOST | PTCLRR_RSS);
247
248	/* setup fifo asic */
249	bus_write_1(sc->port_res, nsp_ifselr, IFSELR_REGSEL);
250	nsp_cr_write_1(sc->port_res, NSPR_TERMPWRC, 0);
251	if ((nsp_cr_read_1(sc->port_res, NSPR_OCR) & OCR_TERMPWRS) == 0)
252		nsp_cr_write_1(sc->port_res, NSPR_TERMPWRC, TERMPWRC_POWON);
253
254	nsp_cr_write_1(sc->port_res, NSPR_XFERMR, XFERMR_IO8);
255	nsp_cr_write_1(sc->port_res, NSPR_CLKDIVR, sc->sc_clkdiv);
256	nsp_cr_write_1(sc->port_res, NSPR_TIMERCNT, 0);
257	nsp_cr_write_1(sc->port_res, NSPR_TIMERCNT, 0);
258
259	nsp_cr_write_1(sc->port_res, NSPR_SYNCR, 0);
260	nsp_cr_write_1(sc->port_res, NSPR_ACKWIDTH, 0);
261
262	/* enable interrupts and ack them */
263	nsp_cr_write_1(sc->port_res, NSPR_SCIENR, sc->sc_icr);
264	bus_write_1(sc->port_res, nsp_irqcr, IRQSR_MASK);
265
266	nsp_setup_fifo(sc, NSP_FIFO_OFF, SCSI_LOW_READ, 0);
267}
268
269/****************************************************
270 * scsi low interface
271 ****************************************************/
272static void
273nsphw_attention(sc)
274	struct nsp_softc *sc;
275{
276	u_int8_t cr;
277
278	cr = nsp_cr_read_1(sc->port_res, NSPR_SCBUSCR)/*  & ~SCBUSCR_ACK */;
279	nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, cr | SCBUSCR_ATN);
280	DELAY(10);
281}
282
283static void
284nsphw_bus_reset(sc)
285	struct nsp_softc *sc;
286{
287	int i;
288
289	bus_write_1(sc->port_res, nsp_irqcr, IRQCR_ALLMASK);
290
291	nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, SCBUSCR_RST);
292	DELAY(100 * 1000);	/* 100ms */
293	nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, 0);
294	for (i = 0; i < 5; i ++)
295		(void) nsp_cr_read_1(sc->port_res, NSPR_IRQPHS);
296
297	bus_write_1(sc->port_res, nsp_irqcr, IRQSR_MASK);
298}
299
300static void
301nsphw_selection_done_and_expect_msgout(sc)
302	struct nsp_softc *sc;
303{
304	struct scsi_low_softc *slp = &sc->sc_sclow;
305
306	/* clear ack counter */
307	sc->sc_cnt = 0;
308	nsp_cr_write_1(sc->port_res, NSPR_PTCLRR, PTCLRR_PT | PTCLRR_ACK |
309			PTCLRR_REQ | PTCLRR_HOST);
310
311	/* deassert sel and assert atten */
312	sc->sc_seltout = 0;
313	nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, sc->sc_busc);
314	DELAY(1);
315	nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR,
316			sc->sc_busc | SCBUSCR_ADIR | SCBUSCR_ACKEN);
317	SCSI_LOW_ASSERT_ATN(slp);
318}
319
320static int
321nsphw_start_selection(sc, cb)
322	struct nsp_softc *sc;
323	struct slccb *cb;
324{
325	struct scsi_low_softc *slp = &sc->sc_sclow;
326	struct targ_info *ti = cb->ti;
327	register u_int8_t arbs, ph;
328	int wc;
329
330	wc = sc->sc_tmaxcnt = cb->ccb_tcmax * 1000 * 1000;
331	sc->sc_dataout_timeout = 0;
332
333	/* check bus free */
334	ph = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
335	if (ph != SCBUSMON_FREE)
336	{
337#ifdef	NSP_STATICS
338		nsp_statics.arbit_conflict_1 ++;
339#endif	/* NSP_STATICS */
340		return SCSI_LOW_START_FAIL;
341	}
342
343	/* start arbitration */
344	nsp_cr_write_1(sc->port_res, NSPR_ARBITS, ARBITS_EXEC);
345
346	SCSI_LOW_SETUP_PHASE(ti, PH_ARBSTART);
347	do
348	{
349		/* XXX: what a stupid chip! */
350		arbs = nsp_cr_read_1(sc->port_res, NSPR_ARBITS);
351		DELAY(1);
352	}
353	while ((arbs & (ARBITS_WIN | ARBITS_FAIL)) == 0 && wc -- > 0);
354
355	if ((arbs & ARBITS_WIN) == 0)
356	{
357		nsp_cr_write_1(sc->port_res, NSPR_ARBITS, ARBITS_CLR);
358#ifdef	NSP_STATICS
359		nsp_statics.arbit_conflict_2 ++;
360#endif	/* NSP_STATICS */
361		return SCSI_LOW_START_FAIL;
362	}
363
364	/* assert select line */
365	SCSI_LOW_SETUP_PHASE(ti, PH_SELSTART);
366	scsi_low_arbit_win(slp);
367
368	DELAY(3);
369	nsp_cr_write_1(sc->port_res, NSPR_DATA,
370		       sc->sc_idbit | (1 << ti->ti_id));
371	nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR,
372			SCBUSCR_SEL | SCBUSCR_BSY | sc->sc_busc);
373	DELAY(3);
374	nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, SCBUSCR_SEL |
375			SCBUSCR_BSY | SCBUSCR_DOUT | sc->sc_busc);
376	nsp_cr_write_1(sc->port_res, NSPR_ARBITS, ARBITS_CLR);
377	DELAY(3);
378	nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR,
379		       SCBUSCR_SEL | SCBUSCR_DOUT | sc->sc_busc);
380	DELAY(1);
381
382	if ((nsp_io_control & NSP_WAIT_FOR_SELECT) != 0)
383	{
384#define	NSP_FIRST_SEL_WAIT	300
385#define	NSP_SEL_CHECK_INTERVAL	10
386
387		/* wait for a selection response */
388		for (wc = 0; wc < NSP_FIRST_SEL_WAIT / NSP_SEL_CHECK_INTERVAL;
389		     wc ++)
390		{
391			ph = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
392			if ((ph & SCBUSMON_BSY) == 0)
393			{
394				DELAY(NSP_SEL_CHECK_INTERVAL);
395				continue;
396			}
397
398			DELAY(1);
399			ph = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
400			if ((ph & SCBUSMON_BSY) != 0)
401			{
402				nsphw_selection_done_and_expect_msgout(sc);
403
404				SCSI_LOW_SETUP_PHASE(ti, PH_SELECTED);
405				return SCSI_LOW_START_OK;
406			}
407		}
408	}
409
410	/* check a selection timeout */
411	nsp_start_timer(sc, NSP_TIMER_1MS);
412	sc->sc_seltout = 1;
413	return SCSI_LOW_START_OK;
414}
415
416static int
417nsp_world_start(sc, fdone)
418	struct nsp_softc *sc;
419	int fdone;
420{
421	struct scsi_low_softc *slp = &sc->sc_sclow;
422
423	sc->sc_cnt = 0;
424	sc->sc_seltout = 0;
425
426	if ((slp->sl_cfgflags & CFG_NOATTEN) == 0)
427		sc->sc_busc = SCBUSCR_ATN;
428	else
429		sc->sc_busc = 0;
430
431	if ((slp->sl_cfgflags & CFG_NOPARITY) == 0)
432		sc->sc_parr = PARITYR_ENABLE | PARITYR_CLEAR;
433	else
434		sc->sc_parr = 0;
435
436	sc->sc_icr = (SCIENR_SCCHG | SCIENR_RESEL | SCIENR_RST);
437
438	nsphw_init(sc);
439	scsi_low_bus_reset(slp);
440
441	return 0;
442}
443
444struct ncp_synch_data {
445	u_int min_period;
446	u_int max_period;
447	u_int chip_period;
448	u_int ack_width;
449};
450
451static struct ncp_synch_data ncp_sync_data_40M[] = {
452	{0x0c,0x0c,0x1,0},	/* 20MB  50ns*/
453	{0x19,0x19,0x3,1}, 	/* 10MB  100ns*/
454	{0x1a,0x25,0x5,2},	/* 7.5MB 150ns*/
455	{0x26,0x32,0x7,3},	/* 5MB   200ns*/
456	{0x0, 0, 0, 0}
457};
458
459static struct ncp_synch_data ncp_sync_data_20M[] = {
460	{0x19,0x19,0x1,0}, 	/* 10MB  100ns*/
461	{0x1a,0x25,0x2,0},	/* 7.5MB 150ns*/
462	{0x26,0x32,0x3,1},	/* 5MB   200ns*/
463	{0x0, 0, 0, 0}
464};
465
466static int
467nsp_msg(sc, ti, msg)
468	struct nsp_softc *sc;
469	struct targ_info *ti;
470	u_int msg;
471{
472	struct ncp_synch_data *sdp;
473	struct nsp_targ_info *nti = (void *) ti;
474	u_int period, offset;
475	int i, error;
476
477	if ((msg & SCSI_LOW_MSG_WIDE) != 0)
478	{
479		if (ti->ti_width != SCSI_LOW_BUS_WIDTH_8)
480		{
481			ti->ti_width = SCSI_LOW_BUS_WIDTH_8;
482			return EINVAL;
483		}
484		return 0;
485	}
486
487	if ((msg & SCSI_LOW_MSG_SYNCH) == 0)
488		return 0;
489
490	period = ti->ti_maxsynch.period;
491	offset = ti->ti_maxsynch.offset;
492	if (sc->sc_iclkdiv == CLKDIVR_20M)
493		sdp = &ncp_sync_data_20M[0];
494	else
495		sdp = &ncp_sync_data_40M[0];
496
497	for (i = 0; sdp->max_period != 0; i ++, sdp ++)
498	{
499		if (period >= sdp->min_period && period <= sdp->max_period)
500			break;
501	}
502
503	if (period != 0 && sdp->max_period == 0)
504	{
505		/*
506		 * NO proper period/offset found,
507		 * Retry neg with the target.
508		 */
509		ti->ti_maxsynch.period = 0;
510		ti->ti_maxsynch.offset = 0;
511		nti->nti_reg_syncr = 0;
512		nti->nti_reg_ackwidth = 0;
513		error = EINVAL;
514	}
515	else
516	{
517		nti->nti_reg_syncr = (sdp->chip_period << SYNCR_PERS) |
518				      (offset & SYNCR_OFFM);
519		nti->nti_reg_ackwidth = sdp->ack_width;
520		error = 0;
521	}
522
523	nsp_cr_write_1(sc->port_res, NSPR_SYNCR, nti->nti_reg_syncr);
524	nsp_cr_write_1(sc->port_res, NSPR_ACKWIDTH, nti->nti_reg_ackwidth);
525	return error;
526}
527
528static int
529nsp_targ_init(sc, ti, action)
530	struct nsp_softc *sc;
531	struct targ_info *ti;
532	int action;
533{
534	struct nsp_targ_info *nti = (void *) ti;
535
536	if (action == SCSI_LOW_INFO_ALLOC || action == SCSI_LOW_INFO_REVOKE)
537	{
538		ti->ti_width = SCSI_LOW_BUS_WIDTH_8;
539		ti->ti_maxsynch.period = 100 / 4;
540		ti->ti_maxsynch.offset = 15;
541		nti->nti_reg_syncr = 0;
542		nti->nti_reg_ackwidth = 0;
543	}
544	return 0;
545}
546
547static void
548nsp_start_timer(sc, time)
549	struct nsp_softc *sc;
550	int time;
551{
552
553	sc->sc_timer = time;
554	nsp_cr_write_1(sc->port_res, NSPR_TIMERCNT, time);
555}
556
557/**************************************************************
558 * General probe attach
559 **************************************************************/
560int
561nspprobesubr(struct resource *res, u_int dvcfg)
562{
563	u_int8_t regv;
564
565	regv = bus_read_1(res, nsp_fifosr);
566	if (regv < 0x11 || regv >= 0x20)
567		return 0;
568	return 1;
569}
570
571void
572nspattachsubr(sc)
573	struct nsp_softc *sc;
574{
575	struct scsi_low_softc *slp = &sc->sc_sclow;
576
577	sc->sc_idbit = (1 << slp->sl_hostid);
578	slp->sl_flags |= HW_READ_PADDING;
579	slp->sl_funcs = &nspfuncs;
580	sc->sc_tmaxcnt = SCSI_LOW_MIN_TOUT * 1000 * 1000; /* default */
581
582	(void) scsi_low_attach(slp, 0, NSP_NTARGETS, NSP_NLUNS,
583			       sizeof(struct nsp_targ_info), 0);
584}
585
586/**************************************************************
587 * PDMA functions
588 **************************************************************/
589static u_int
590nsp_fifo_count(sc)
591	struct nsp_softc *sc;
592{
593	u_int count;
594
595	nsp_cr_write_1(sc->port_res, NSPR_PTCLRR, PTCLRR_RSS_ACK | PTCLRR_PT);
596	count = bus_read_1(sc->port_res, nsp_datar);
597	count += (((u_int) bus_read_1(sc->port_res, nsp_datar)) << 8);
598	count += (((u_int) bus_read_1(sc->port_res, nsp_datar)) << 16);
599	return count;
600}
601
602static u_int
603nsp_request_count(sc)
604	struct nsp_softc *sc;
605{
606	u_int count;
607
608	nsp_cr_write_1(sc->port_res, NSPR_PTCLRR, PTCLRR_RSS_REQ | PTCLRR_PT);
609	count = bus_read_1(sc->port_res, nsp_datar);
610	count += (((u_int) bus_read_1(sc->port_res, nsp_datar)) << 8);
611	count += (((u_int) bus_read_1(sc->port_res, nsp_datar)) << 16);
612	return count;
613}
614
615static void
616nsp_setup_fifo(sc, on, direction, datalen)
617	struct nsp_softc *sc;
618	int on;
619	int direction;
620	int datalen;
621{
622	u_int8_t xfermode;
623
624	sc->sc_suspendio = 0;
625	if (on == NSP_FIFO_OFF)
626	{
627		xfermode = XFERMR_IO8;
628		goto out;
629	}
630
631	/* check if suspend io OK ? */
632	if (datalen > 0)
633	{
634		if (direction == SCSI_LOW_READ)
635		{
636			if ((nsp_io_control & NSP_READ_SUSPEND_IO) != 0 &&
637			    (datalen % nsp_read_suspend_bytes) == 0)
638				sc->sc_suspendio = nsp_read_suspend_bytes;
639		}
640		else
641		{
642			if ((nsp_io_control & NSP_WRITE_SUSPEND_IO) != 0 &&
643			    (datalen % nsp_write_suspend_bytes) == 0)
644				sc->sc_suspendio = nsp_write_suspend_bytes;
645		}
646	}
647
648	/* determine a transfer type */
649	if (datalen < DEV_BSIZE || (datalen & 3) != 0)
650	{
651		if (sc->mem_res != NULL &&
652		    (nsp_io_control & NSP_USE_MEMIO) != 0)
653			xfermode = XFERMR_XEN | XFERMR_MEM8;
654		else
655			xfermode = XFERMR_XEN | XFERMR_IO8;
656	}
657	else
658	{
659		if (sc->mem_res != NULL &&
660		    (nsp_io_control & NSP_USE_MEMIO) != 0)
661			xfermode = XFERMR_XEN | XFERMR_MEM32;
662		else
663			xfermode = XFERMR_XEN | XFERMR_IO32;
664
665		if (sc->sc_suspendio > 0)
666			xfermode |= XFERMR_FIFOEN;
667	}
668
669out:
670	sc->sc_xfermr = xfermode;
671	nsp_cr_write_1(sc->port_res, NSPR_XFERMR, sc->sc_xfermr);
672}
673
674static void
675nsp_pdma_end(sc, ti)
676	struct nsp_softc *sc;
677	struct targ_info *ti;
678{
679	struct scsi_low_softc *slp = &sc->sc_sclow;
680	struct slccb *cb = slp->sl_Qnexus;
681	u_int len = 0, cnt;
682
683	sc->sc_dataout_timeout = 0;
684	slp->sl_flags &= ~HW_PDMASTART;
685	nsp_setup_fifo(sc, NSP_FIFO_OFF, SCSI_LOW_READ, 0);
686	if ((sc->sc_icr & SCIENR_FIFO) != 0)
687	{
688		sc->sc_icr &= ~SCIENR_FIFO;
689		nsp_cr_write_1(sc->port_res, NSPR_SCIENR, sc->sc_icr);
690	}
691
692	if (cb == NULL)
693	{
694		slp->sl_error |= PDMAERR;
695		return;
696	}
697
698	if (ti->ti_phase == PH_DATA)
699	{
700		cnt = nsp_fifo_count(sc);
701		if (slp->sl_scp.scp_direction  == SCSI_LOW_WRITE)
702		{
703			len = sc->sc_cnt - cnt;
704			if (sc->sc_cnt >= cnt &&
705			    slp->sl_scp.scp_datalen + len <=
706			    cb->ccb_scp.scp_datalen)
707			{
708				slp->sl_scp.scp_data -= len;
709				slp->sl_scp.scp_datalen += len;
710			}
711			else
712			{
713				slp->sl_error |= PDMAERR;
714				device_printf(slp->sl_dev,
715					"len %x >= datalen %x\n",
716					len, slp->sl_scp.scp_datalen);
717			}
718		}
719		else if (slp->sl_scp.scp_direction == SCSI_LOW_READ)
720		{
721			if (sc->sc_cnt != cnt ||
722			    sc->sc_cnt > cb->ccb_scp.scp_datalen)
723			{
724				slp->sl_error |= PDMAERR;
725				device_printf(slp->sl_dev,
726					"data read count error %x != %x (%x)\n",
727					sc->sc_cnt, cnt,
728					cb->ccb_scp.scp_datalen);
729			}
730		}
731		sc->sc_cnt = cnt;
732		scsi_low_data_finish(slp);
733	}
734	else
735	{
736
737		device_printf(slp->sl_dev, "data phase miss\n");
738		slp->sl_error |= PDMAERR;
739	}
740}
741
742#define	RFIFO_CRIT	64
743#define	WFIFO_CRIT	32
744
745static void
746nsp_data_padding(sc, direction, count)
747	struct nsp_softc *sc;
748	int direction;
749	u_int count;
750{
751
752	if (count > NSP_MAX_DATA_SIZE)
753		count = NSP_MAX_DATA_SIZE;
754
755	nsp_cr_write_1(sc->port_res, NSPR_XFERMR, XFERMR_XEN | XFERMR_IO8);
756	if (direction == SCSI_LOW_READ)
757	{
758		while (count -- > 0)
759			(void) bus_read_1(sc->port_res, nsp_fifodr);
760	}
761	else
762	{
763		while (count -- > 0)
764			(void) bus_write_1(sc->port_res, nsp_fifodr, 0);
765	}
766	nsp_cr_write_1(sc->port_res, NSPR_XFERMR, sc->sc_xfermr);
767}
768
769static int
770nsp_read_fifo(sc, suspendio)
771	struct nsp_softc *sc;
772	int suspendio;
773{
774	struct scsi_low_softc *slp = &sc->sc_sclow;
775	u_int res;
776
777	res = nsp_fifo_count(sc);
778	if (res == sc->sc_cnt)
779		return 0;
780
781#ifdef	NSP_DEBUG
782	if (res < sc->sc_cnt || res == (u_int) -1)
783	{
784		device_printf(slp->sl_dev,
785		    "strange fifo ack count 0x%x < 0x%x\n", res, sc->sc_cnt);
786		return 0;
787	}
788#endif	/* NSP_DEBUG */
789
790	res = res - sc->sc_cnt;
791	if (res > slp->sl_scp.scp_datalen)
792	{
793		if ((slp->sl_error & PDMAERR) == 0)
794		{
795			device_printf(slp->sl_dev, "data overrun 0x%x > 0x%x\n",
796			    res, slp->sl_scp.scp_datalen);
797		}
798
799		slp->sl_error |= PDMAERR;
800		slp->sl_scp.scp_datalen = 0;
801
802		if ((slp->sl_flags & HW_READ_PADDING) == 0)
803		{
804			device_printf(slp->sl_dev, "read padding required\n");
805			return 0;
806		}
807
808		nsp_data_padding(sc, SCSI_LOW_READ, res);
809		sc->sc_cnt += res;
810		return 1;	/* padding start */
811	}
812
813	if (suspendio > 0 && slp->sl_scp.scp_datalen >= suspendio)
814		res = suspendio;
815
816	if ((sc->sc_xfermr & (XFERMR_MEM32 | XFERMR_MEM8)) != 0)
817	{
818		if ((sc->sc_xfermr & XFERMR_MEM32) != 0)
819		{
820			res &= ~3;
821			bus_read_region_4(sc->mem_res, 0,
822				(u_int32_t *) slp->sl_scp.scp_data, res >> 2);
823		}
824		else
825		{
826			bus_read_region_1(sc->mem_res, 0,
827				(u_int8_t *) slp->sl_scp.scp_data, res);
828		}
829	}
830	else
831	{
832		if ((sc->sc_xfermr & XFERMR_IO32) != 0)
833		{
834			res &= ~3;
835			bus_read_multi_4(sc->port_res, nsp_fifodr,
836				(u_int32_t *) slp->sl_scp.scp_data, res >> 2);
837		}
838		else
839		{
840			bus_read_multi_1(sc->port_res, nsp_fifodr,
841				(u_int8_t *) slp->sl_scp.scp_data, res);
842		}
843	}
844
845	if (nsp_cr_read_1(sc->port_res, NSPR_PARITYR) & PARITYR_PE)
846	{
847		nsp_cr_write_1(sc->port_res, NSPR_PARITYR,
848			       PARITYR_ENABLE | PARITYR_CLEAR);
849		scsi_low_assert_msg(slp, slp->sl_Tnexus, SCSI_LOW_MSG_ERROR, 1);
850	}
851
852	slp->sl_scp.scp_data += res;
853	slp->sl_scp.scp_datalen -= res;
854	sc->sc_cnt += res;
855	return 0;
856}
857
858static int
859nsp_write_fifo(sc, suspendio)
860	struct nsp_softc *sc;
861	int suspendio;
862{
863	struct scsi_low_softc *slp = &sc->sc_sclow;
864	u_int res;
865	register u_int8_t stat;
866
867	if (suspendio > 0)
868	{
869#ifdef	NSP_DEBUG
870		if ((slp->sl_scp.scp_datalen % WFIFO_CRIT) != 0)
871		{
872			device_printf(slp->sl_dev,
873			    "strange write length 0x%x\n",
874			    slp->sl_scp.scp_datalen);
875		}
876#endif	/* NSP_DEBUG */
877		res = slp->sl_scp.scp_datalen % suspendio;
878		if (res == 0)
879		{
880			res = suspendio;
881		}
882	}
883	else
884	{
885		res = WFIFO_CRIT;
886	}
887
888	if (res > slp->sl_scp.scp_datalen)
889		res = slp->sl_scp.scp_datalen;
890
891	/* XXX: reconfirm! */
892	stat = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON) & SCBUSMON_PHMASK;
893	if (stat != PHASE_DATAOUT)
894		return 0;
895
896	if ((sc->sc_xfermr & (XFERMR_MEM32 | XFERMR_MEM8)) != 0)
897	{
898		if ((sc->sc_xfermr & XFERMR_MEM32) != 0)
899		{
900			bus_write_region_4(sc->mem_res, 0,
901				(u_int32_t *) slp->sl_scp.scp_data, res >> 2);
902		}
903		else
904		{
905			bus_write_region_1(sc->mem_res, 0,
906				(u_int8_t *) slp->sl_scp.scp_data, res);
907		}
908	}
909	else
910	{
911		if ((sc->sc_xfermr & XFERMR_IO32) != 0)
912		{
913			bus_write_multi_4(sc->port_res, nsp_fifodr,
914				(u_int32_t *) slp->sl_scp.scp_data, res >> 2);
915		}
916		else
917		{
918			bus_write_multi_1(sc->port_res, nsp_fifodr,
919				(u_int8_t *) slp->sl_scp.scp_data, res);
920		}
921	}
922
923	slp->sl_scp.scp_datalen -= res;
924	slp->sl_scp.scp_data += res;
925	sc->sc_cnt += res;
926	return 0;
927}
928
929static int
930nsp_wait_interrupt(sc)
931	struct nsp_softc *sc;
932{
933	int tout;
934	register u_int8_t isrc;
935
936	for (tout = 0; tout < DEV_BSIZE / 10; tout ++)
937	{
938		isrc = bus_read_1(sc->port_res, nsp_irqsr);
939		if ((isrc & (IRQSR_SCSI | IRQSR_FIFO)) != 0)
940		{
941			if ((isrc & IRQSR_FIFO) != 0)
942			{
943				bus_write_1(sc->port_res,
944					nsp_irqcr, IRQCR_FIFOCL);
945			}
946			return 1;
947		}
948		DELAY(1);
949	}
950	return 0;
951}
952
953static void
954nsp_pio_read(sc, suspendio)
955	struct nsp_softc *sc;
956	int suspendio;
957{
958	struct scsi_low_softc *slp = &sc->sc_sclow;
959	int tout, padding, datalen;
960	register u_int8_t stat, fstat;
961
962	padding = 0;
963	tout = sc->sc_tmaxcnt;
964	slp->sl_flags |= HW_PDMASTART;
965	datalen = slp->sl_scp.scp_datalen;
966
967ReadLoop:
968	while (1)
969	{
970		stat = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
971		if (stat == (u_int8_t) -1)
972			return;
973
974		/* out of data phase */
975		if ((stat & SCBUSMON_PHMASK) != PHASE_DATAIN)
976		{
977			nsp_read_fifo(sc, 0);
978			return;
979		}
980
981		/* data phase */
982		fstat = bus_read_1(sc->port_res, nsp_fifosr);
983		if ((fstat & FIFOSR_FULLEMP) != 0)
984		{
985			if ((sc->sc_icr & SCIENR_FIFO) != 0)
986			{
987				bus_write_1(sc->port_res, nsp_irqcr,
988						  IRQCR_FIFOCL);
989			}
990
991			if (suspendio > 0)
992			{
993				padding |= nsp_read_fifo(sc, suspendio);
994			}
995			else
996			{
997				padding |= nsp_read_fifo(sc, 0);
998			}
999
1000			if ((sc->sc_icr & SCIENR_FIFO) != 0)
1001				break;
1002		}
1003		else
1004		{
1005			if (padding == 0 && slp->sl_scp.scp_datalen <= 0)
1006				return;
1007
1008			if ((sc->sc_icr & SCIENR_FIFO) != 0)
1009				break;
1010
1011			DELAY(1);
1012		}
1013
1014		if ((-- tout) <= 0)
1015		{
1016			device_printf(slp->sl_dev, "nsp_pio_read: timeout\n");
1017			return;
1018		}
1019	}
1020
1021
1022	if (slp->sl_scp.scp_datalen > 0 &&
1023	    slp->sl_scp.scp_datalen > datalen - nsp_read_interrupt_bytes)
1024	{
1025		if (nsp_wait_interrupt(sc) != 0)
1026			goto ReadLoop;
1027	}
1028}
1029
1030static void
1031nsp_pio_write(sc, suspendio)
1032	struct nsp_softc *sc;
1033	int suspendio;
1034{
1035	struct scsi_low_softc *slp = &sc->sc_sclow;
1036	u_int rcount, acount;
1037	int tout, datalen;
1038	register u_int8_t stat, fstat;
1039
1040	tout = sc->sc_tmaxcnt;
1041	slp->sl_flags |= HW_PDMASTART;
1042	datalen = slp->sl_scp.scp_datalen;
1043
1044WriteLoop:
1045	while (1)
1046	{
1047		stat = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON) & SCBUSMON_PHMASK;
1048		if (stat != PHASE_DATAOUT)
1049			return;
1050
1051		if (slp->sl_scp.scp_datalen <= 0)
1052		{
1053			if (sc->sc_dataout_timeout == 0)
1054				sc->sc_dataout_timeout = SCSI_LOW_TIMEOUT_HZ;
1055			return;
1056		}
1057
1058		fstat = bus_read_1(sc->port_res, nsp_fifosr);
1059		if ((fstat & FIFOSR_FULLEMP) != 0)
1060		{
1061			if ((sc->sc_icr & SCIENR_FIFO) != 0)
1062			{
1063				bus_write_1(sc->port_res, nsp_irqcr,
1064						  IRQCR_FIFOCL);
1065			}
1066
1067			if (suspendio > 0)
1068			{
1069				/* XXX:IMPORTANT:
1070				 * To avoid timeout of pcmcia bus
1071				 * (not scsi bus!), we should check
1072				 * the scsi device sends us request
1073				 * signals, which means the scsi device
1074				 * is ready to receive data without
1075				 * heavy delays.
1076				 */
1077				if ((slp->sl_scp.scp_datalen % suspendio) == 0)
1078				{
1079					/* Step I:
1080					 * fill the nsp fifo, and waiting for
1081					 * the fifo empty.
1082					 */
1083					nsp_write_fifo(sc, 0);
1084				}
1085				else
1086				{
1087					/* Step II:
1088					 * check the request singals.
1089					 */
1090					acount = nsp_fifo_count(sc);
1091					rcount = nsp_request_count(sc);
1092					if (rcount <= acount)
1093					{
1094						nsp_write_fifo(sc, 0);
1095#ifdef	NSP_STATICS
1096						nsp_statics.device_busy ++;
1097#endif	/* NSP_STATICS */
1098					}
1099					else
1100					{
1101						nsp_write_fifo(sc, suspendio);
1102#ifdef	NSP_STATICS
1103						nsp_statics.device_data_write ++;
1104#endif	/* NSP_STATICS */
1105					}
1106				}
1107			}
1108			else
1109			{
1110				nsp_write_fifo(sc, 0);
1111			}
1112
1113			if ((sc->sc_icr & SCIENR_FIFO) != 0)
1114				break;
1115		}
1116		else
1117		{
1118			if ((sc->sc_icr & SCIENR_FIFO) != 0)
1119				break;
1120
1121			DELAY(1);
1122		}
1123
1124		if ((-- tout) <= 0)
1125		{
1126			device_printf(slp->sl_dev, "nsp_pio_write: timeout\n");
1127			return;
1128		}
1129	}
1130
1131	if (slp->sl_scp.scp_datalen > 0 &&
1132	    slp->sl_scp.scp_datalen > datalen - nsp_write_interrupt_bytes)
1133	{
1134		if (nsp_wait_interrupt(sc) != 0)
1135			goto WriteLoop;
1136	}
1137}
1138
1139static int
1140nsp_negate_signal(struct nsp_softc *sc, u_int8_t mask, u_char *s)
1141{
1142	struct scsi_low_softc *slp = &sc->sc_sclow;
1143	int wc;
1144	u_int8_t regv;
1145
1146	for (wc = 0; wc < NSP_DELAY_MAX / NSP_DELAY_INTERVAL; wc ++)
1147	{
1148		regv = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
1149		if (regv == (u_int8_t) -1)
1150			return -1;
1151		if ((regv & mask) == 0)
1152			return 1;
1153		DELAY(NSP_DELAY_INTERVAL);
1154	}
1155
1156	device_printf(slp->sl_dev, "%s nsp_negate_signal timeout\n", s);
1157	return -1;
1158}
1159
1160static int
1161nsp_xfer(sc, buf, len, phase, clear_atn)
1162	struct nsp_softc *sc;
1163	u_int8_t *buf;
1164	int len;
1165	int phase;
1166	int clear_atn;
1167{
1168	int ptr, rv;
1169
1170	for (ptr = 0; len > 0; len --, ptr ++)
1171	{
1172		rv = nsp_expect_signal(sc, phase, SCBUSMON_REQ);
1173		if (rv <= 0)
1174			goto out;
1175
1176		if (len == 1 && clear_atn != 0)
1177		{
1178			nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR,
1179				       SCBUSCR_ADIR | SCBUSCR_ACKEN);
1180			SCSI_LOW_DEASSERT_ATN(&sc->sc_sclow);
1181		}
1182
1183		if (phase & SCBUSMON_IO)
1184		{
1185			buf[ptr] = nsp_cr_read_1(sc->port_res, NSPR_DATAACK);
1186		}
1187		else
1188		{
1189			nsp_cr_write_1(sc->port_res, NSPR_DATAACK, buf[ptr]);
1190		}
1191		nsp_negate_signal(sc, SCBUSMON_ACK, "xfer<ACK>");
1192	}
1193
1194out:
1195	return len;
1196}
1197
1198/**************************************************************
1199 * disconnect & reselect (HW low)
1200 **************************************************************/
1201static int
1202nsp_reselected(sc)
1203	struct nsp_softc *sc;
1204{
1205	struct scsi_low_softc *slp = &sc->sc_sclow;
1206	struct targ_info *ti;
1207	u_int sid;
1208	u_int8_t cr;
1209
1210	sid = (u_int) nsp_cr_read_1(sc->port_res, NSPR_RESELR);
1211	sid &= ~sc->sc_idbit;
1212	sid = ffs(sid) - 1;
1213	if ((ti = scsi_low_reselected(slp, sid)) == NULL)
1214		return EJUSTRETURN;
1215
1216	nsp_negate_signal(sc, SCBUSMON_SEL, "reselect<SEL>");
1217
1218	cr = nsp_cr_read_1(sc->port_res, NSPR_SCBUSCR);
1219	cr &= ~(SCBUSCR_BSY | SCBUSCR_ATN);
1220	nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, cr);
1221	cr |= SCBUSCR_ADIR | SCBUSCR_ACKEN;
1222	nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, cr);
1223
1224#ifdef	NSP_STATICS
1225	nsp_statics.reselect ++;
1226#endif	/* NSP_STATCIS */
1227	return EJUSTRETURN;
1228}
1229
1230static int
1231nsp_disconnected(sc, ti)
1232	struct nsp_softc *sc;
1233	struct targ_info *ti;
1234{
1235	struct scsi_low_softc *slp = &sc->sc_sclow;
1236
1237	nsp_cr_write_1(sc->port_res, NSPR_PTCLRR, PTCLRR_PT | PTCLRR_ACK |
1238			PTCLRR_REQ | PTCLRR_HOST);
1239	if ((sc->sc_icr & SCIENR_FIFO) != 0)
1240	{
1241		sc->sc_icr &= ~SCIENR_FIFO;
1242		nsp_cr_write_1(sc->port_res, NSPR_SCIENR, sc->sc_icr);
1243	}
1244	sc->sc_cnt = 0;
1245	sc->sc_dataout_timeout = 0;
1246#ifdef	NSP_STATICS
1247	nsp_statics.disconnect ++;
1248#endif	/* NSP_STATICS */
1249	scsi_low_disconnected(slp, ti);
1250	return 1;
1251}
1252
1253/**************************************************************
1254 * SEQUENCER
1255 **************************************************************/
1256static void nsp_error(struct nsp_softc *, u_char *, u_int8_t, u_int8_t, u_int8_t);
1257
1258static void
1259nsp_error(struct nsp_softc * sc, u_char *s, u_int8_t isrc, u_int8_t ph,
1260    u_int8_t irqphs)
1261{
1262	struct scsi_low_softc *slp = &sc->sc_sclow;
1263
1264	device_printf(slp->sl_dev, "%s\n", s);
1265	device_printf(slp->sl_dev, "isrc 0x%x scmon 0x%x irqphs 0x%x\n",
1266	    (u_int) isrc, (u_int) ph, (u_int) irqphs);
1267}
1268
1269static int
1270nsp_target_nexus_establish(sc)
1271	struct nsp_softc *sc;
1272{
1273	struct scsi_low_softc *slp = &sc->sc_sclow;
1274	struct targ_info *ti = slp->sl_Tnexus;
1275	struct nsp_targ_info *nti = (void *) ti;
1276
1277	/* setup synch transfer registers */
1278	nsp_cr_write_1(sc->port_res, NSPR_SYNCR, nti->nti_reg_syncr);
1279	nsp_cr_write_1(sc->port_res, NSPR_ACKWIDTH, nti->nti_reg_ackwidth);
1280
1281	/* setup pdma fifo (minimum) */
1282	nsp_setup_fifo(sc, NSP_FIFO_ON, SCSI_LOW_READ, 0);
1283	return 0;
1284}
1285
1286static int
1287nsp_lun_nexus_establish(sc)
1288	struct nsp_softc *sc;
1289{
1290
1291	return 0;
1292}
1293
1294static int
1295nsp_ccb_nexus_establish(sc)
1296	struct nsp_softc *sc;
1297{
1298	struct scsi_low_softc *slp = &sc->sc_sclow;
1299	struct slccb *cb = slp->sl_Qnexus;
1300
1301	sc->sc_tmaxcnt = cb->ccb_tcmax * 1000 * 1000;
1302
1303	/* setup pdma fifo */
1304	nsp_setup_fifo(sc, NSP_FIFO_ON,
1305		       slp->sl_scp.scp_direction, slp->sl_scp.scp_datalen);
1306
1307	if (slp->sl_scp.scp_direction == SCSI_LOW_READ)
1308	{
1309		if (sc->sc_suspendio > 0 &&
1310		    (nsp_io_control & NSP_READ_FIFO_INTERRUPTS) != 0)
1311		{
1312			sc->sc_icr |= SCIENR_FIFO;
1313			nsp_cr_write_1(sc->port_res,
1314				       NSPR_SCIENR, sc->sc_icr);
1315		}
1316	}
1317	else
1318	{
1319		if (sc->sc_suspendio > 0 &&
1320		    (nsp_io_control & NSP_WRITE_FIFO_INTERRUPTS) != 0)
1321		{
1322			sc->sc_icr |= SCIENR_FIFO;
1323			nsp_cr_write_1(sc->port_res,
1324				       NSPR_SCIENR, sc->sc_icr);
1325		}
1326	}
1327	return 0;
1328}
1329
1330static int
1331nsp_phase_match(struct nsp_softc *sc, u_int8_t phase, u_int8_t stat)
1332{
1333	struct scsi_low_softc *slp = &sc->sc_sclow;
1334
1335	if ((stat & SCBUSMON_PHMASK) != phase)
1336	{
1337		device_printf(slp->sl_dev, "phase mismatch 0x%x != 0x%x\n",
1338		    (u_int) phase, (u_int) stat);
1339		return EINVAL;
1340	}
1341
1342	if ((stat & SCBUSMON_REQ) == 0)
1343		return EINVAL;
1344
1345	return 0;
1346}
1347
1348int
1349nspintr(arg)
1350	void *arg;
1351{
1352	struct nsp_softc *sc = arg;
1353	struct scsi_low_softc *slp = &sc->sc_sclow;
1354	struct targ_info *ti;
1355	struct buf *bp;
1356	u_int derror, flags;
1357	int len, rv;
1358	u_int8_t isrc, ph, irqphs, cr, regv;
1359
1360	/*******************************************
1361	 * interrupt check
1362	 *******************************************/
1363	if (slp->sl_flags & HW_INACTIVE)
1364		return 0;
1365
1366	bus_write_1(sc->port_res, nsp_irqcr, IRQCR_IRQDIS);
1367	isrc = bus_read_1(sc->port_res, nsp_irqsr);
1368	if (isrc == (u_int8_t) -1 || (isrc & IRQSR_MASK) == 0)
1369	{
1370		bus_write_1(sc->port_res, nsp_irqcr, 0);
1371		return 0;
1372	}
1373
1374	/* XXX: IMPORTANT
1375 	 * Do not read an irqphs register if no scsi phase interrupt.
1376	 * Unless, you should lose a scsi phase interrupt.
1377	 */
1378	ph = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
1379	if ((isrc & IRQSR_SCSI) != 0)
1380	{
1381		irqphs = nsp_cr_read_1(sc->port_res, NSPR_IRQPHS);
1382	}
1383	else
1384		irqphs = 0;
1385
1386	/*
1387 	 * timer interrupt handler (scsi vs timer interrupts)
1388	 */
1389	if (sc->sc_timer != 0)
1390	{
1391		nsp_cr_write_1(sc->port_res, NSPR_TIMERCNT, 0);
1392		nsp_cr_write_1(sc->port_res, NSPR_TIMERCNT, 0);
1393		sc->sc_timer = 0;
1394	}
1395
1396	/* check a timer interrupt */
1397	regv = 0;
1398	if ((isrc & IRQSR_TIMER) != 0)
1399	{
1400		if ((isrc & IRQSR_MASK) == IRQSR_TIMER && sc->sc_seltout == 0)
1401		{
1402			bus_write_1(sc->port_res, nsp_irqcr, IRQCR_TIMERCL);
1403			return 1;
1404		}
1405		regv |= IRQCR_TIMERCL;
1406	}
1407
1408	/* check a fifo interrupt */
1409	if ((isrc & IRQSR_FIFO) != 0)
1410	{
1411		regv |= IRQCR_FIFOCL;
1412	}
1413
1414	/* OK. enable all interrupts */
1415	bus_write_1(sc->port_res, nsp_irqcr, regv);
1416
1417	/*******************************************
1418	 * debug section
1419	 *******************************************/
1420#ifdef	NSP_DEBUG
1421	if (nsp_debug)
1422	{
1423		nsp_error(sc, "current status", isrc, ph, irqphs);
1424		scsi_low_print(slp, NULL);
1425#ifdef	KDB
1426		if (nsp_debug > 1)
1427			kdb_enter(KDB_WHY_CAM, "nsp");
1428#endif	/* KDB */
1429	}
1430#endif	/* NSP_DEBUG */
1431
1432	/*******************************************
1433	 * Parse hardware SCSI irq reasons register
1434	 *******************************************/
1435	if ((isrc & IRQSR_SCSI) != 0)
1436	{
1437 		if ((irqphs & IRQPHS_RST) != 0)
1438		{
1439			scsi_low_restart(slp, SCSI_LOW_RESTART_SOFT,
1440					 "bus reset (power off?)");
1441			return 1;
1442		}
1443
1444		if ((irqphs & IRQPHS_RSEL) != 0)
1445		{
1446			bus_write_1(sc->port_res, nsp_irqcr, IRQCR_RESCL);
1447			if (nsp_reselected(sc) == EJUSTRETURN)
1448				return 1;
1449		}
1450
1451		if ((irqphs & (IRQPHS_PCHG | IRQPHS_LBF)) == 0)
1452			return 1;
1453	}
1454
1455	/*******************************************
1456	 * nexus check
1457	 *******************************************/
1458	if ((ti = slp->sl_Tnexus) == NULL)
1459	{
1460		/* unknown scsi phase changes */
1461		nsp_error(sc, "unknown scsi phase changes", isrc, ph, irqphs);
1462		return 0;
1463	}
1464
1465	/*******************************************
1466	 * aribitration & selection
1467	 *******************************************/
1468	switch (ti->ti_phase)
1469	{
1470	case PH_SELSTART:
1471		if ((ph & SCBUSMON_BSY) == 0)
1472		{
1473			if (sc->sc_seltout >= NSP_SELTIMEOUT)
1474			{
1475				sc->sc_seltout = 0;
1476				nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, 0);
1477				return nsp_disconnected(sc, ti);
1478			}
1479			sc->sc_seltout ++;
1480			nsp_start_timer(sc, NSP_TIMER_1MS);
1481			return 1;
1482		}
1483
1484		SCSI_LOW_SETUP_PHASE(ti, PH_SELECTED);
1485		nsphw_selection_done_and_expect_msgout(sc);
1486		return 1;
1487
1488	case PH_SELECTED:
1489		if ((isrc & IRQSR_SCSI) == 0)
1490			return 1;
1491
1492		nsp_target_nexus_establish(sc);
1493		break;
1494
1495	case PH_RESEL:
1496		if ((isrc & IRQSR_SCSI) == 0)
1497			return 1;
1498
1499		nsp_target_nexus_establish(sc);
1500		if ((ph & SCBUSMON_PHMASK) != PHASE_MSGIN)
1501		{
1502			device_printf(slp->sl_dev,
1503			    "unexpected phase after reselect\n");
1504			slp->sl_error |= FATALIO;
1505			scsi_low_assert_msg(slp, ti, SCSI_LOW_MSG_ABORT, 1);
1506			return 1;
1507		}
1508		break;
1509
1510	case PH_DATA:
1511		if ((isrc & IRQSR_SCSI) != 0)
1512			break;
1513		if ((isrc & IRQSR_FIFO) != 0)
1514		{
1515			if (NSP_IS_PHASE_DATA(ph) == 0)
1516				return 1;
1517			irqphs = (ph & IRQPHS_PHMASK);
1518			break;
1519		}
1520		return 1;
1521
1522	default:
1523		if ((isrc & IRQSR_SCSI) == 0)
1524			return 1;
1525		break;
1526	}
1527
1528	/*******************************************
1529	 * data phase control
1530	 *******************************************/
1531	if (slp->sl_flags & HW_PDMASTART)
1532	{
1533		if ((isrc & IRQSR_SCSI) != 0 &&
1534		     NSP_IS_IRQPHS_DATA(irqphs) == 0)
1535		{
1536			if (slp->sl_scp.scp_direction == SCSI_LOW_READ)
1537				nsp_pio_read(sc, 0);
1538			nsp_pdma_end(sc, ti);
1539		}
1540	}
1541
1542	/*******************************************
1543	 * scsi seq
1544	 *******************************************/
1545	if (slp->sl_msgphase != 0 && (irqphs & IRQPHS_LBF) != 0)
1546		return nsp_disconnected(sc, ti);
1547
1548	/* check unexpected bus free state */
1549	if (ph == 0)
1550	{
1551		nsp_error(sc, "unexpected bus free", isrc, ph, irqphs);
1552		return nsp_disconnected(sc, ti);
1553	}
1554
1555	/* check normal scsi phase */
1556	switch (irqphs & IRQPHS_PHMASK)
1557	{
1558	case IRQPHS_CMD:
1559		if (nsp_phase_match(sc, PHASE_CMD, ph) != 0)
1560			return 1;
1561
1562		SCSI_LOW_SETUP_PHASE(ti, PH_CMD);
1563		if (scsi_low_cmd(slp, ti) != 0)
1564		{
1565			scsi_low_attention(slp);
1566		}
1567
1568		nsp_cr_write_1(sc->port_res, NSPR_CMDCR, CMDCR_PTCLR);
1569		for (len = 0; len < slp->sl_scp.scp_cmdlen; len ++)
1570			nsp_cr_write_1(sc->port_res, NSPR_CMDDR,
1571				       slp->sl_scp.scp_cmd[len]);
1572
1573		nsp_cr_write_1(sc->port_res, NSPR_CMDCR, CMDCR_PTCLR | CMDCR_EXEC);
1574		break;
1575
1576	case IRQPHS_DATAOUT:
1577		SCSI_LOW_SETUP_PHASE(ti, PH_DATA);
1578		if (scsi_low_data(slp, ti, &bp, SCSI_LOW_WRITE) != 0)
1579		{
1580			scsi_low_attention(slp);
1581		}
1582
1583		nsp_pio_write(sc, sc->sc_suspendio);
1584		break;
1585
1586	case IRQPHS_DATAIN:
1587		SCSI_LOW_SETUP_PHASE(ti, PH_DATA);
1588		if (scsi_low_data(slp, ti, &bp, SCSI_LOW_READ) != 0)
1589		{
1590			scsi_low_attention(slp);
1591		}
1592
1593		nsp_pio_read(sc, sc->sc_suspendio);
1594		break;
1595
1596	case IRQPHS_STATUS:
1597		if (nsp_phase_match(sc, PHASE_STATUS, ph) != 0)
1598			return 1;
1599
1600		SCSI_LOW_SETUP_PHASE(ti, PH_STAT);
1601		regv = nsp_cr_read_1(sc->port_res, NSPR_DATA);
1602		if (nsp_cr_read_1(sc->port_res, NSPR_PARITYR) & PARITYR_PE)
1603		{
1604			nsp_cr_write_1(sc->port_res, NSPR_PARITYR,
1605				       PARITYR_ENABLE | PARITYR_CLEAR);
1606			derror = SCSI_LOW_DATA_PE;
1607		}
1608		else
1609			derror = 0;
1610
1611		/* assert ACK */
1612		cr = SCBUSCR_ACK | nsp_cr_read_1(sc->port_res, NSPR_SCBUSCR);
1613		nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, cr);
1614
1615		if (scsi_low_statusin(slp, ti, derror | regv) != 0)
1616		{
1617			scsi_low_attention(slp);
1618		}
1619
1620		/* check REQ nagated */
1621		nsp_negate_signal(sc, SCBUSMON_REQ, "statin<REQ>");
1622
1623		/* deassert ACK */
1624		cr = nsp_cr_read_1(sc->port_res, NSPR_SCBUSCR) & (~SCBUSCR_ACK);
1625		nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, cr);
1626		break;
1627
1628	case IRQPHS_MSGOUT:
1629		if (nsp_phase_match(sc, PHASE_MSGOUT, ph) != 0)
1630			return 1;
1631
1632#ifdef	NSP_MSGOUT_SERIALIZE
1633		/*
1634		 * XXX: NSP QUIRK
1635		 * NSP invoke interrupts only in the case of scsi phase changes,
1636		 * therefore we should poll the scsi phase here to catch
1637		 * the next "msg out" if exists (no scsi phase changes).
1638		 */
1639		rv = len = 16;
1640		do {
1641			SCSI_LOW_SETUP_PHASE(ti, PH_MSGOUT);
1642			flags = (ti->ti_ophase != ti->ti_phase) ?
1643					SCSI_LOW_MSGOUT_INIT : 0;
1644			len = scsi_low_msgout(slp, ti, flags);
1645
1646			if (len > 1 && slp->sl_atten == 0)
1647			{
1648				scsi_low_attention(slp);
1649			}
1650
1651			if (nsp_xfer(sc, ti->ti_msgoutstr, len, PHASE_MSGOUT,
1652			             slp->sl_clear_atten) != 0)
1653			{
1654				slp->sl_error |= FATALIO;
1655				nsp_error(sc, "MSGOUT: xfer short",
1656						    isrc, ph, irqphs);
1657			}
1658
1659			/* catch a next signal */
1660			rv = nsp_expect_signal(sc, PHASE_MSGOUT, SCBUSMON_REQ);
1661		}
1662		while (rv > 0 && len -- > 0);
1663
1664#else	/* !NSP_MSGOUT_SERIALIZE */
1665		SCSI_LOW_SETUP_PHASE(ti, PH_MSGOUT);
1666		flags = SCSI_LOW_MSGOUT_UNIFY;
1667		if (ti->ti_ophase != ti->ti_phase)
1668			flags |= SCSI_LOW_MSGOUT_INIT;
1669		len = scsi_low_msgout(slp, ti, flags);
1670
1671		if (len > 1 && slp->sl_atten == 0)
1672		{
1673			scsi_low_attention(slp);
1674		}
1675
1676		if (nsp_xfer(sc, ti->ti_msgoutstr, len, PHASE_MSGOUT,
1677			     slp->sl_clear_atten) != 0)
1678		{
1679			nsp_error(sc, "MSGOUT: xfer short", isrc, ph, irqphs);
1680		}
1681
1682#endif	/* !NSP_MSGOUT_SERIALIZE */
1683		break;
1684
1685	case IRQPHS_MSGIN:
1686		if (nsp_phase_match(sc, PHASE_MSGIN, ph) != 0)
1687			return 1;
1688
1689		/*
1690		 * XXX: NSP QUIRK
1691		 * NSP invoke interrupts only in the case of scsi phase changes,
1692		 * therefore we should poll the scsi phase here to catch
1693		 * the next "msg in" if exists (no scsi phase changes).
1694		 */
1695		rv = len = 16;
1696		do {
1697			SCSI_LOW_SETUP_PHASE(ti, PH_MSGIN);
1698
1699			/* read a data */
1700			regv = nsp_cr_read_1(sc->port_res, NSPR_DATA);
1701			if (nsp_cr_read_1(sc->port_res, NSPR_PARITYR) & PARITYR_PE)
1702			{
1703				nsp_cr_write_1(sc->port_res,
1704					       NSPR_PARITYR,
1705					       PARITYR_ENABLE | PARITYR_CLEAR);
1706				derror = SCSI_LOW_DATA_PE;
1707			}
1708			else
1709			{
1710				derror = 0;
1711			}
1712
1713			/* assert ack */
1714			cr = nsp_cr_read_1(sc->port_res, NSPR_SCBUSCR) | SCBUSCR_ACK;
1715			nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, cr);
1716
1717			if (scsi_low_msgin(slp, ti, regv | derror) == 0)
1718			{
1719				if (scsi_low_is_msgout_continue(ti, 0) != 0)
1720				{
1721					scsi_low_attention(slp);
1722				}
1723			}
1724
1725			/* check REQ nagated */
1726			nsp_negate_signal(sc, SCBUSMON_REQ, "msgin<REQ>");
1727
1728			/* deassert ack */
1729			cr = nsp_cr_read_1(sc->port_res, NSPR_SCBUSCR) & (~SCBUSCR_ACK);
1730			nsp_cr_write_1(sc->port_res, NSPR_SCBUSCR, cr);
1731
1732			/* catch a next signal */
1733			rv = nsp_expect_signal(sc, PHASE_MSGIN, SCBUSMON_REQ);
1734		}
1735		while (rv > 0 && len -- > 0);
1736		break;
1737
1738	default:
1739		slp->sl_error |= FATALIO;
1740		nsp_error(sc, "unknown scsi phase", isrc, ph, irqphs);
1741		break;
1742	}
1743
1744	return 1;
1745
1746#if	0
1747timerout:
1748	nsp_start_timer(sc, NSP_TIMER_1MS);
1749	return 0;
1750#endif
1751}
1752
1753static int
1754nsp_timeout(sc)
1755	struct nsp_softc *sc;
1756{
1757	struct scsi_low_softc *slp = &sc->sc_sclow;
1758	int tout;
1759	u_int8_t ph, regv;
1760
1761	if (slp->sl_Tnexus == NULL)
1762		return 0;
1763
1764	ph = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
1765	switch (ph & SCBUSMON_PHMASK)
1766	{
1767	case PHASE_DATAOUT:
1768		if (sc->sc_dataout_timeout == 0)
1769			break;
1770
1771		/* check a fifo empty */
1772		regv = bus_read_1(sc->port_res, nsp_fifosr);
1773		if ((regv & FIFOSR_FULLEMP) == 0)
1774			break;
1775		bus_write_1(sc->port_res, nsp_irqcr, IRQCR_FIFOCL);
1776
1777		/* check still requested */
1778		ph = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
1779		if ((ph & SCBUSMON_REQ) == 0)
1780			break;
1781		/* check timeout */
1782		if ((-- sc->sc_dataout_timeout) > 0)
1783			break;
1784
1785	        slp->sl_error |= PDMAERR;
1786		if ((slp->sl_flags & HW_WRITE_PADDING) == 0)
1787		{
1788			device_printf(slp->sl_dev, "write padding required\n");
1789			break;
1790		}
1791
1792		tout = NSP_DELAY_MAX;
1793		while (tout -- > 0)
1794		{
1795			ph = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
1796			if ((ph & SCBUSMON_PHMASK) != PHASE_DATAOUT)
1797				break;
1798			regv = bus_read_1(sc->port_res, nsp_fifosr);
1799			if ((regv & FIFOSR_FULLEMP) == 0)
1800			{
1801				DELAY(1);
1802				continue;
1803			}
1804
1805			bus_write_1(sc->port_res, nsp_irqcr, IRQCR_FIFOCL);
1806			nsp_data_padding(sc, SCSI_LOW_WRITE, 32);
1807		}
1808		ph = nsp_cr_read_1(sc->port_res, NSPR_SCBUSMON);
1809		if ((ph & SCBUSMON_PHMASK) == PHASE_DATAOUT)
1810			sc->sc_dataout_timeout = SCSI_LOW_TIMEOUT_HZ;
1811		break;
1812
1813	default:
1814		break;
1815	}
1816	return 0;
1817}
1818