xref: /openbsd/sys/dev/ic/trm.c (revision 73471bf0)
1 /*	$OpenBSD: trm.c,v 1.43 2020/09/22 19:32:52 krw Exp $
2  * ------------------------------------------------------------
3  *   O.S       : OpenBSD
4  *   File Name : trm.c
5  *   Device Driver for Tekram DC395U/UW/F,DC315/U
6  *   PCI SCSI Bus Master Host Adapter
7  *   (SCSI chip set used Tekram ASIC TRM-S1040)
8  *
9  * (C)Copyright 1995-1999 Tekram Technology Co., Ltd.
10  * (C)Copyright 2001-2002 Ashley R. Martens and Kenneth R Westerback
11  * ------------------------------------------------------------
12  *    HISTORY:
13  *
14  *  REV#   DATE      NAME                  DESCRIPTION
15  *  1.00   05/01/99  ERICH CHEN            First released for NetBSD 1.4.x
16  *  1.01   00/00/00  MARTIN AKESSON        Port to OpenBSD 2.8
17  *  1.02   09/19/01  ASHLEY MARTENS        Cleanup and formatting
18  *  2.00   01/00/02  KENNETH R WESTERBACK  Rewrite of the bus and code logic
19  * ------------------------------------------------------------
20  *
21  * Redistribution and use in source and binary forms, with or without
22  * modification, are permitted provided that the following conditions
23  * are met:
24  * 1. Redistributions of source code must retain the above copyright
25  *    notice, this list of conditions and the following disclaimer.
26  * 2. Redistributions in binary form must reproduce the above copyright
27  *    notice, this list of conditions and the following disclaimer in the
28  *    documentation and/or other materials provided with the distribution.
29  * 3. The name of the author may not be used to endorse or promote products
30  *    derived from this software without specific prior written permission.
31  *
32  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
33  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
34  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
35  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
36  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
37  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
38  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
39  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
40  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
41  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42  *
43  * ------------------------------------------------------------
44  */
45 
46 #include <sys/param.h>
47 #include <sys/systm.h>
48 #include <sys/kernel.h>
49 #include <sys/malloc.h>
50 #include <sys/buf.h>
51 #include <sys/device.h>
52 
53 #include <machine/bus.h>
54 
55 #include <scsi/scsi_all.h>
56 #include <scsi/scsiconf.h>
57 #include <scsi/scsi_message.h>
58 
59 #include <dev/pci/pcidevs.h>
60 #include <dev/ic/trm.h>
61 
62 /* #define TRM_DEBUG0 */
63 
64 void	trm_initSRB(struct trm_scsi_req_q *);
65 
66 void	trm_check_eeprom(struct trm_adapter_nvram *, bus_space_tag_t, bus_space_handle_t);
67 void	trm_read_all    (struct trm_adapter_nvram *, bus_space_tag_t, bus_space_handle_t);
68 void	trm_write_all   (struct trm_adapter_nvram *, bus_space_tag_t, bus_space_handle_t);
69 
70 void	trm_set_data (bus_space_tag_t, bus_space_handle_t, u_int8_t, u_int8_t);
71 void	trm_write_cmd(bus_space_tag_t, bus_space_handle_t, u_int8_t, u_int8_t);
72 
73 u_int8_t trm_get_data(bus_space_tag_t, bus_space_handle_t, u_int8_t);
74 
75 void	trm_wait_30us(bus_space_tag_t, bus_space_handle_t);
76 
77 void	*trm_srb_alloc(void *);
78 
79 void	trm_DataOutPhase0(struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
80 void	trm_DataInPhase0 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
81 void	trm_StatusPhase0 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
82 void	trm_MsgOutPhase0 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
83 void	trm_MsgInPhase0  (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
84 void	trm_DataOutPhase1(struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
85 void	trm_DataInPhase1 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
86 void	trm_CommandPhase1(struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
87 void	trm_StatusPhase1 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
88 void	trm_MsgOutPhase1 (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
89 void	trm_MsgInPhase1  (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
90 void	trm_Nop          (struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
91 
92 void	trm_SetXferParams  (struct trm_softc *, struct trm_dcb *, int);
93 
94 void	trm_DataIO_transfer(struct trm_softc *, struct trm_scsi_req_q *, u_int16_t);
95 
96 int	trm_StartSRB    (struct trm_softc *, struct trm_scsi_req_q *);
97 void	trm_srb_reinit	(struct trm_softc *, struct trm_scsi_req_q *);
98 void	trm_srb_free    (void *, void *);
99 void	trm_RewaitSRB   (struct trm_softc *, struct trm_scsi_req_q *);
100 void	trm_FinishSRB   (struct trm_softc *, struct trm_scsi_req_q *);
101 void	trm_RequestSense(struct trm_softc *, struct trm_scsi_req_q *);
102 
103 void	trm_initAdapter     (struct trm_softc *);
104 void	trm_Disconnect      (struct trm_softc *);
105 void	trm_Reselect        (struct trm_softc *);
106 void	trm_GoingSRB_Done   (struct trm_softc *, struct trm_dcb *);
107 void	trm_ScsiRstDetect   (struct trm_softc *);
108 void	trm_ResetSCSIBus    (struct trm_softc *);
109 void	trm_reset           (struct trm_softc *);
110 void	trm_StartWaitingSRB (struct trm_softc *);
111 void	trm_ResetAllDevParam(struct trm_softc *);
112 void	trm_RecoverSRB      (struct trm_softc *);
113 void	trm_linkSRB         (struct trm_softc *);
114 
115 void	trm_initACB(struct trm_softc *, int);
116 
117 void    trm_ResetDevParam(struct trm_softc *, struct trm_dcb *, u_int8_t);
118 
119 void	trm_EnableMsgOut(struct trm_softc *, u_int8_t);
120 
121 void	trm_timeout(void *);
122 
123 void	trm_print_info(struct trm_softc *, struct trm_dcb *);
124 
125 /*
126  * ------------------------------------------------------------
127  *
128  *          stateV = (void *) trm_SCSI_phase0[phase]
129  *
130  * ------------------------------------------------------------
131  */
132 static void *trm_SCSI_phase0[8] = {
133 	trm_DataOutPhase0,    /* phase:0 */
134 	trm_DataInPhase0,     /* phase:1 */
135 	trm_Nop,              /* phase:2 */
136 	trm_StatusPhase0,     /* phase:3 */
137 	trm_Nop,              /* phase:4 */
138 	trm_Nop,              /* phase:5 */
139 	trm_MsgOutPhase0,     /* phase:6 */
140 	trm_MsgInPhase0,      /* phase:7 */
141 };
142 
143 /*
144  * ------------------------------------------------------------
145  *
146  *          stateV = (void *) trm_SCSI_phase1[phase]
147  *
148  * ------------------------------------------------------------
149  */
150 static void *trm_SCSI_phase1[8] = {
151 	trm_DataOutPhase1,    /* phase:0 */
152 	trm_DataInPhase1,     /* phase:1 */
153 	trm_CommandPhase1,    /* phase:2 */
154 	trm_StatusPhase1,     /* phase:3 */
155 	trm_Nop,              /* phase:4 */
156 	trm_Nop,              /* phase:5 */
157 	trm_MsgOutPhase1,     /* phase:6 */
158 	trm_MsgInPhase1,      /* phase:7 */
159 };
160 
161 
162 struct trm_adapter_nvram trm_eepromBuf[TRM_MAX_ADAPTER_NUM];
163 /*
164  *Fast20:  000     50ns, 20.0 Mbytes/s
165  *         001     75ns, 13.3 Mbytes/s
166  *         010    100ns, 10.0 Mbytes/s
167  *         011    125ns,  8.0 Mbytes/s
168  *         100    150ns,  6.6 Mbytes/s
169  *         101    175ns,  5.7 Mbytes/s
170  *         110    200ns,  5.0 Mbytes/s
171  *         111    250ns,  4.0 Mbytes/s
172  *
173  *Fast40:  000     25ns, 40.0 Mbytes/s
174  *         001     50ns, 20.0 Mbytes/s
175  *         010     75ns, 13.3 Mbytes/s
176  *         011    100ns, 10.0 Mbytes/s
177  *         100    125ns,  8.0 Mbytes/s
178  *         101    150ns,  6.6 Mbytes/s
179  *         110    175ns,  5.7 Mbytes/s
180  *         111    200ns,  5.0 Mbytes/s
181  */
182 
183 /*
184  * real period:
185  */
186 u_int8_t trm_clock_period[8] = {
187 	/* nanosecond divided by 4 */
188 	12,	/*  48 ns 20   MB/sec */
189 	18,	/*  72 ns 13.3 MB/sec */
190 	25,	/* 100 ns 10.0 MB/sec */
191 	31,	/* 124 ns  8.0 MB/sec */
192 	37,	/* 148 ns  6.6 MB/sec */
193 	43,	/* 172 ns  5.7 MB/sec */
194 	50,	/* 200 ns  5.0 MB/sec */
195 	62	/* 248 ns  4.0 MB/sec */
196 };
197 
198 /*
199  * ------------------------------------------------------------
200  * Function : trm_srb_alloc
201  * Purpose  : Get the first free SRB
202  * Inputs   :
203  * Return   : NULL or a free SCSI Request block
204  * ------------------------------------------------------------
205  */
206 void *
207 trm_srb_alloc(void *xsc)
208 {
209 	struct trm_softc *sc = xsc;
210 	struct trm_scsi_req_q *pSRB;
211 
212 	mtx_enter(&sc->sc_srb_mtx);
213 	pSRB = TAILQ_FIRST(&sc->freeSRB);
214 	if (pSRB != NULL)
215 		TAILQ_REMOVE(&sc->freeSRB, pSRB, link);
216 	mtx_leave(&sc->sc_srb_mtx);
217 
218 #ifdef TRM_DEBUG0
219 	printf("%s: trm_srb_alloc. pSRB = %p, next pSRB = %p\n",
220 	    sc->sc_device.dv_xname, pSRB, TAILQ_FIRST(&sc->freeSRB));
221 #endif
222 
223 	return pSRB;
224 }
225 
226 /*
227  * ------------------------------------------------------------
228  * Function : trm_RewaitSRB
229  * Purpose  : Q back to pending Q
230  * Inputs   : struct trm_dcb * -
231  *            struct trm_scsi_req_q * -
232  * ------------------------------------------------------------
233  */
234 void
235 trm_RewaitSRB(struct trm_softc *sc, struct trm_scsi_req_q *pSRB)
236 {
237 	int intflag;
238 
239 	intflag = splbio();
240 
241 	if ((pSRB->SRBFlag & TRM_ON_WAITING_SRB) != 0) {
242 		pSRB->SRBFlag &= ~TRM_ON_WAITING_SRB;
243 		TAILQ_REMOVE(&sc->waitingSRB, pSRB, link);
244 	}
245 
246 	if ((pSRB->SRBFlag & TRM_ON_GOING_SRB) != 0) {
247 		pSRB->SRBFlag &= ~TRM_ON_GOING_SRB;
248 		TAILQ_REMOVE(&sc->goingSRB, pSRB, link);
249 	}
250 
251 	pSRB->SRBState     = TRM_READY;
252 	pSRB->TargetStatus = SCSI_OK;
253 	pSRB->AdaptStatus  = TRM_STATUS_GOOD;
254 
255 	pSRB->SRBFlag |= TRM_ON_WAITING_SRB;
256 	TAILQ_INSERT_HEAD(&sc->waitingSRB, pSRB, link);
257 
258 	splx(intflag);
259 }
260 
261 /*
262  * ------------------------------------------------------------
263  * Function : trm_StartWaitingSRB
264  * Purpose  : If there is no active DCB then run robin through
265  *            the DCB's to find the next waiting SRB
266  *            and move it to the going list.
267  * Inputs   : struct trm_softc * -
268  * ------------------------------------------------------------
269  */
270 void
271 trm_StartWaitingSRB(struct trm_softc *sc)
272 {
273 	struct trm_scsi_req_q *pSRB, *next;
274 	int intflag;
275 
276 	intflag = splbio();
277 
278 	if ((sc->pActiveDCB != NULL) ||
279 	    (TAILQ_EMPTY(&sc->waitingSRB)) ||
280 	    (sc->sc_Flag & (RESET_DETECT | RESET_DONE | RESET_DEV)) != 0)
281 		goto out;
282 
283 	for (pSRB = TAILQ_FIRST(&sc->waitingSRB); pSRB != NULL; pSRB = next) {
284 		next = TAILQ_NEXT(pSRB, link);
285 		if (trm_StartSRB(sc, pSRB) == 0) {
286 			pSRB->SRBFlag &= ~TRM_ON_WAITING_SRB;
287 			TAILQ_REMOVE(&sc->waitingSRB, pSRB, link);
288 			pSRB->SRBFlag |= TRM_ON_GOING_SRB;
289 			TAILQ_INSERT_TAIL(&sc->goingSRB, pSRB, link);
290 			break;
291 		}
292 	}
293 
294 out:
295 	splx(intflag);
296 }
297 
298 /*
299  * ------------------------------------------------------------
300  * Function : trm_scsi_cmd
301  * Purpose  : enqueues a SCSI command
302  * Inputs   :
303  * Call By  : GENERIC SCSI driver
304  * ------------------------------------------------------------
305  */
306 void
307 trm_scsi_cmd(struct scsi_xfer *xs)
308 {
309 	struct trm_scsi_req_q *pSRB;
310 	bus_space_handle_t ioh;
311 	struct trm_softc *sc;
312 	bus_space_tag_t	iot;
313 	struct trm_dcb *pDCB;
314 	u_int8_t target, lun;
315 	int i, error, intflag, timeout, xferflags;
316 
317 	target = xs->sc_link->target;
318 	lun    = xs->sc_link->lun;
319 
320 	sc  = xs->sc_link->bus->sb_adapter_softc;
321 	ioh = sc->sc_iohandle;
322 	iot = sc->sc_iotag;
323 
324 #ifdef TRM_DEBUG0
325 	if ((xs->flags & SCSI_POLL) != 0) {
326  		sc_print_addr(xs->sc_link);
327 		printf("trm_scsi_cmd. sc = %p, xs = %p, opcode = 0x%02x\n",
328 		    sc, xs, lun, xs->cmd.opcode);
329 	}
330 #endif
331 
332 	if (target >= TRM_MAX_TARGETS) {
333  		sc_print_addr(xs->sc_link);
334 		printf("target >= %d\n", TRM_MAX_TARGETS);
335 		xs->error = XS_DRIVER_STUFFUP;
336 		scsi_done(xs);
337 		return;
338 	}
339 	if (lun >= TRM_MAX_LUNS) {
340  		sc_print_addr(xs->sc_link);
341 		printf("lun >= %d\n", TRM_MAX_LUNS);
342 		xs->error = XS_DRIVER_STUFFUP;
343 		scsi_done(xs);
344 		return;
345 	}
346 
347 	pDCB = sc->pDCB[target][lun];
348 	if (pDCB == NULL) {
349 		/* Removed as a result of INQUIRY proving no device present */
350 		xs->error = XS_DRIVER_STUFFUP;
351 		scsi_done(xs);
352 		return;
353  	}
354 
355 	xferflags = xs->flags;
356 	if (xferflags & SCSI_RESET) {
357 #ifdef TRM_DEBUG0
358  		sc_print_addr(xs->sc_link);
359 		printf("trm_reset via SCSI_RESET\n");
360 #endif
361 		trm_reset(sc);
362 		xs->error = XS_NOERROR;
363 		scsi_done(xs);
364 		return;
365 	}
366 
367 	pSRB = xs->io;
368 	trm_srb_reinit(sc, pSRB);
369 
370 	xs->error  = XS_NOERROR;
371 	xs->status = SCSI_OK;
372 	xs->resid  = 0;
373 
374 	intflag = splbio();
375 
376 	/*
377 	 * BuildSRB(pSRB,pDCB);
378 	 */
379 	if (xs->datalen != 0) {
380 #ifdef TRM_DEBUG0
381  		sc_print_addr(xs->sc_link);
382 		printf("xs->datalen=%x\n", (u_int32_t)&xs->datalen);
383  		sc_print_addr(xs->sc_link);
384 		printf("sc->sc_dmatag=0x%x\n", (u_int32_t)sc->sc_dmatag);
385  		sc_print_addr(xs->sc_link);
386 		printf("pSRB->dmamapxfer=0x%x\n", (u_int32_t)pSRB->dmamapxfer);
387  		sc_print_addr(xs->sc_link);
388 		printf("xs->data=0x%x\n", (u_int32_t)&xs->data);
389 #endif
390 		if ((error = bus_dmamap_load(sc->sc_dmatag, pSRB->dmamapxfer,
391 		    xs->data, xs->datalen, NULL,
392 		    (xferflags & SCSI_NOSLEEP) ? BUS_DMA_NOWAIT :
393 		    BUS_DMA_WAITOK)) != 0) {
394 			sc_print_addr(xs->sc_link);
395 			printf("DMA transfer map unable to load, error = %d\n",
396 			    error);
397 			xs->error = XS_DRIVER_STUFFUP;
398 			splx(intflag);
399 			scsi_done(xs);
400 			return;
401 		}
402 
403 		bus_dmamap_sync(sc->sc_dmatag, pSRB->dmamapxfer,
404 		    0, pSRB->dmamapxfer->dm_mapsize,
405 		    (xferflags & SCSI_DATA_IN) ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
406 
407 		/*
408 		 * Set up the scatter gather list
409 		 */
410 		for (i = 0; i < pSRB->dmamapxfer->dm_nsegs; i++) {
411 			pSRB->SegmentX[i].address = pSRB->dmamapxfer->dm_segs[i].ds_addr;
412 			pSRB->SegmentX[i].length  = pSRB->dmamapxfer->dm_segs[i].ds_len;
413 		}
414 		pSRB->SRBTotalXferLength = xs->datalen;
415 		pSRB->SRBSGCount         = pSRB->dmamapxfer->dm_nsegs;
416 	}
417 
418 	pSRB->pSRBDCB    = pDCB;
419 	pSRB->xs         = xs;
420 	pSRB->ScsiCmdLen = xs->cmdlen;
421 
422 	memcpy(pSRB->CmdBlock, &xs->cmd, xs->cmdlen);
423 
424 	timeout_set(&xs->stimeout, trm_timeout, pSRB);
425 
426 	pSRB->SRBFlag |= TRM_ON_WAITING_SRB;
427 	TAILQ_INSERT_TAIL(&sc->waitingSRB, pSRB, link);
428 	trm_StartWaitingSRB(sc);
429 
430 	if ((xferflags & SCSI_POLL) == 0) {
431 		timeout_add_msec(&xs->stimeout, xs->timeout);
432 		splx(intflag);
433 		return;
434 	}
435 
436 	splx(intflag);
437 	for (timeout = xs->timeout; timeout > 0; timeout--) {
438 		intflag = splbio();
439 		trm_Interrupt(sc);
440 		splx(intflag);
441 		if (ISSET(xs->flags, ITSDONE))
442 			break;
443 		DELAY(1000);
444 	}
445 
446 	if (!ISSET(xs->flags, ITSDONE) && timeout == 0)
447 		trm_timeout(pSRB);
448 
449 	scsi_done(xs);
450 }
451 
452 /*
453  * ------------------------------------------------------------
454  * Function : trm_ResetAllDevParam
455  * Purpose  :
456  * Inputs   : struct trm_softc *
457  * ------------------------------------------------------------
458  */
459 void
460 trm_ResetAllDevParam(struct trm_softc *sc)
461 {
462 	struct trm_adapter_nvram *pEEpromBuf;
463 	int target, quirks;
464 
465 	pEEpromBuf = &trm_eepromBuf[sc->sc_AdapterUnit];
466 
467 	for (target = 0; target < TRM_MAX_TARGETS; target++) {
468 		if (target == sc->sc_AdaptSCSIID || sc->pDCB[target][0] == NULL)
469 			continue;
470 
471 		if ((sc->pDCB[target][0]->DCBFlag & TRM_QUIRKS_VALID) == 0)
472 			quirks = SDEV_NOWIDE | SDEV_NOSYNC | SDEV_NOTAGS;
473 		else if (sc->pDCB[target][0]->sc_link != NULL)
474 			quirks = sc->pDCB[target][0]->sc_link->quirks;
475 
476 		trm_ResetDevParam(sc, sc->pDCB[target][0], quirks);
477 	}
478 }
479 
480 /*
481  * ------------------------------------------------------------
482  * Function : trm_ResetDevParam
483  * Purpose  :
484  * Inputs   :
485  * ------------------------------------------------------------
486  */
487 void
488 trm_ResetDevParam(struct trm_softc *sc, struct trm_dcb *pDCB, u_int8_t quirks)
489 {
490 	struct trm_adapter_nvram *pEEpromBuf = &trm_eepromBuf[sc->sc_AdapterUnit];
491 	u_int8_t PeriodIndex;
492 	const int target = pDCB->target;
493 
494 	pDCB->DCBFlag &= TRM_QUIRKS_VALID;
495 	pDCB->DCBFlag |= (TRM_WIDE_NEGO_ENABLE | TRM_SYNC_NEGO_ENABLE);
496 
497 	pDCB->SyncPeriod    = 0;
498 	pDCB->SyncOffset    = 0;
499 	pDCB->MaxNegoPeriod = 0;
500 
501 	pDCB->DevMode = pEEpromBuf->NvramTarget[target].NvmTarCfg0;
502 
503 	pDCB->IdentifyMsg = MSG_IDENTIFY(pDCB->lun, ((pDCB->DevMode & TRM_DISCONNECT) != 0));
504 
505 	if (((quirks & SDEV_NOWIDE) == 0) &&
506 	    (pDCB->DevMode & TRM_WIDE) &&
507 	    ((sc->sc_config & HCC_WIDE_CARD) != 0))
508 		pDCB->DCBFlag |= TRM_WIDE_NEGO_16BIT;
509 
510 	if (((quirks & SDEV_NOSYNC) == 0) &&
511 	    ((pDCB->DevMode & TRM_SYNC) != 0)) {
512 		PeriodIndex   = pEEpromBuf->NvramTarget[target].NvmTarPeriod & 0x07;
513 		pDCB->MaxNegoPeriod = trm_clock_period[PeriodIndex];
514 	}
515 
516 	if (((quirks & SDEV_NOTAGS) == 0) &&
517 	    ((pDCB->DevMode & TRM_TAG_QUEUING) != 0) &&
518 	    ((pDCB->DevMode & TRM_DISCONNECT) != 0))
519 		/* TODO XXXX: Every device(lun) gets to queue TagMaxNum commands? */
520 		pDCB->DCBFlag |= TRM_USE_TAG_QUEUING;
521 
522 	trm_SetXferParams(sc, pDCB, 0);
523 }
524 
525 /*
526  * ------------------------------------------------------------
527  * Function : trm_RecoverSRB
528  * Purpose  : Moves all SRBs from Going to Waiting for all the Link DCBs
529  * Inputs   : struct trm_softc * -
530  * ------------------------------------------------------------
531  */
532 void
533 trm_RecoverSRB(struct trm_softc *sc)
534 {
535 	struct trm_scsi_req_q *pSRB;
536 
537 	/* ASSUME we are inside splbio()/splx() */
538 
539 	while ((pSRB = TAILQ_FIRST(&sc->goingSRB)) != NULL) {
540 		pSRB->SRBFlag &= ~TRM_ON_GOING_SRB;
541 		TAILQ_REMOVE(&sc->goingSRB, pSRB, link);
542 		pSRB->SRBFlag |= TRM_ON_WAITING_SRB;
543 		TAILQ_INSERT_HEAD(&sc->waitingSRB, pSRB, link);
544 	}
545 }
546 
547 /*
548  * ------------------------------------------------------------
549  * Function : trm_reset
550  * Purpose  : perform a hard reset on the SCSI bus (and TRM_S1040 chip).
551  * Inputs   :
552  * ------------------------------------------------------------
553  */
554 void
555 trm_reset (struct trm_softc *sc)
556 {
557 	const bus_space_handle_t ioh = sc->sc_iohandle;
558 	const bus_space_tag_t iot = sc->sc_iotag;
559 	int i, intflag;
560 
561 	intflag = splbio();
562 
563 	bus_space_write_1(iot, ioh, TRM_S1040_DMA_INTEN,  0);
564 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_INTEN, 0);
565 
566 	trm_ResetSCSIBus(sc);
567 	for (i = 0; i < 500; i++)
568 		DELAY(1000);
569 
570 	/*
571 	 * Enable all SCSI interrupts except EN_SCAM
572 	 */
573 	bus_space_write_1(iot, ioh,
574 	    TRM_S1040_SCSI_INTEN,
575 	    (EN_SELECT | EN_SELTIMEOUT | EN_DISCONNECT | EN_RESELECTED |
576 		EN_SCSIRESET | EN_BUSSERVICE | EN_CMDDONE));
577 	/*
578 	 * Enable DMA interrupt
579 	 */
580 	bus_space_write_1(iot, ioh, TRM_S1040_DMA_INTEN, EN_SCSIINTR);
581 	/*
582 	 * Clear DMA FIFO
583 	 */
584 	bus_space_write_1(iot, ioh, TRM_S1040_DMA_CONTROL, CLRXFIFO);
585 	/*
586 	 * Clear SCSI FIFO
587 	 */
588 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO);
589 
590 	trm_ResetAllDevParam(sc);
591 	trm_GoingSRB_Done(sc, NULL);
592 	sc->pActiveDCB = NULL;
593 
594 	/*
595 	 * RESET_DETECT, RESET_DONE, RESET_DEV
596 	 */
597 	sc->sc_Flag = 0;
598 	trm_StartWaitingSRB(sc);
599 
600 	splx(intflag);
601 }
602 
603 /*
604  * ------------------------------------------------------------
605  * Function : trm_timeout
606  * Purpose  : Prints a timeout message and aborts the timed out SCSI request
607  * Inputs   : void * - A struct trm_scsi_req_q * structure pointer
608  * ------------------------------------------------------------
609  */
610 void
611 trm_timeout(void *arg1)
612 {
613 	struct trm_scsi_req_q *pSRB;
614  	struct scsi_xfer *xs;
615  	struct trm_softc *sc;
616 
617  	pSRB = (struct trm_scsi_req_q *)arg1;
618  	xs   = pSRB->xs;
619 
620  	if (xs != NULL) {
621  		sc = xs->sc_link->bus->sb_adapter_softc;
622  		sc_print_addr(xs->sc_link);
623  		printf("SCSI OpCode 0x%02x ", xs->cmd.opcode);
624 		if (pSRB->SRBFlag & TRM_AUTO_REQSENSE)
625 			printf("REQUEST SENSE ");
626 		printf("timed out\n");
627 		pSRB->SRBFlag |= TRM_SCSI_TIMED_OUT;
628  		trm_FinishSRB(sc, pSRB);
629 #ifdef TRM_DEBUG0
630  		sc_print_addr(xs->sc_link);
631 		printf("trm_reset via trm_timeout()\n");
632 #endif
633 		trm_reset(sc);
634 		trm_StartWaitingSRB(sc);
635  	}
636 }
637 
638 /*
639  * ------------------------------------------------------------
640  * Function : trm_StartSRB
641  * Purpose  : Send the commands in the SRB to the device
642  * Inputs   : struct trm_softc * -
643  *            struct trm_scsi_req_q * -
644  * Return   : 0 - SCSI processor is unoccupied
645  *            1 - SCSI processor is occupied with an SRB
646  * ------------------------------------------------------------
647  */
648 int
649 trm_StartSRB(struct trm_softc *sc, struct trm_scsi_req_q *pSRB)
650 {
651 	const bus_space_handle_t ioh = sc->sc_iohandle;
652 	const bus_space_tag_t iot = sc->sc_iotag;
653 	struct trm_dcb *pDCB = pSRB->pSRBDCB;
654 	u_int32_t tag_mask;
655 	u_int8_t tag_id, scsicommand;
656 
657 #ifdef TRM_DEBUG0
658 	printf("%s: trm_StartSRB. sc = %p, pDCB = %p, pSRB = %p\n",
659 	    sc->sc_device.dv_xname, sc, pDCB, pSRB);
660 #endif
661 	/*
662 	 * If the queue is full or the SCSI processor has a pending interrupt
663 	 * then try again later.
664 	 */
665 	if ((pDCB->DCBFlag & TRM_QUEUE_FULL) || (bus_space_read_2(iot, ioh,
666 	    TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT))
667 		return (1);
668 
669 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_HOSTID, sc->sc_AdaptSCSIID);
670 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_TARGETID, pDCB->target);
671 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_SYNC, pDCB->SyncPeriod);
672 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_OFFSET, pDCB->SyncOffset);
673 
674 	if ((sc->pDCB[pDCB->target][0]->sc_link != NULL) &&
675 	    ((sc->pDCB[pDCB->target][0]->DCBFlag & TRM_QUIRKS_VALID) == 0)) {
676 		sc->pDCB[pDCB->target][0]->DCBFlag |= TRM_QUIRKS_VALID;
677 		trm_ResetDevParam(sc, sc->pDCB[pDCB->target][0], sc->pDCB[pDCB->target][0]->sc_link->quirks);
678 	}
679 
680 	/*
681 	 * Flush FIFO
682 	 */
683 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO);
684 
685 	sc->MsgCnt = 1;
686 	sc->MsgBuf[0] = pDCB->IdentifyMsg;
687 	if (((pSRB->xs->flags & SCSI_POLL) != 0) ||
688 	    (pSRB->CmdBlock[0] == INQUIRY) ||
689 	    (pSRB->CmdBlock[0] == REQUEST_SENSE))
690 		sc->MsgBuf[0] &= ~MSG_IDENTIFY_DISCFLAG;
691 
692 	scsicommand = SCMD_SEL_ATN;
693 
694 	if ((pDCB->DCBFlag & (TRM_WIDE_NEGO_ENABLE | TRM_SYNC_NEGO_ENABLE)) != 0) {
695 		scsicommand = SCMD_SEL_ATNSTOP;
696 		pSRB->SRBState = TRM_MSGOUT;
697 
698 	} else if ((pDCB->DCBFlag & TRM_USE_TAG_QUEUING) == 0) {
699 		pDCB->DCBFlag |= TRM_QUEUE_FULL;
700 
701 	} else if ((sc->MsgBuf[0] & MSG_IDENTIFY_DISCFLAG) != 0) {
702 		if (pSRB->TagNumber == TRM_NO_TAG) {
703 			for (tag_id=1, tag_mask=2; tag_id < 32; tag_id++, tag_mask <<= 1)
704 				if ((tag_mask & pDCB->TagMask) == 0) {
705 					pDCB->TagMask  |= tag_mask;
706 					pSRB->TagNumber = tag_id;
707 					break;
708 				}
709 
710 			if (tag_id >= 32) {
711 				pDCB->DCBFlag |= TRM_QUEUE_FULL;
712 				sc->MsgCnt = 0;
713 				return 1;
714 			}
715 		}
716 
717 		/* TODO XXXX: Should send ORDERED_Q_TAG if metadata (non-block) i/o!? */
718 		sc->MsgBuf[sc->MsgCnt++] = MSG_SIMPLE_Q_TAG;
719 		sc->MsgBuf[sc->MsgCnt++] = pSRB->TagNumber;
720 
721 		scsicommand = SCMD_SEL_ATN3;
722 	}
723 
724 	pSRB->SRBState = TRM_START;
725 	pSRB->ScsiPhase = PH_BUS_FREE; /* SCSI bus free Phase */
726 	sc->pActiveDCB = pDCB;
727 	pDCB->pActiveSRB = pSRB;
728 
729 	if (sc->MsgCnt > 0) {
730 		bus_space_write_1(iot, ioh, TRM_S1040_SCSI_FIFO, sc->MsgBuf[0]);
731 		if (sc->MsgCnt > 1) {
732 			DELAY(30);
733 			bus_space_write_multi_1(iot, ioh, TRM_S1040_SCSI_FIFO, &sc->MsgBuf[1], sc->MsgCnt - 1);
734 		}
735 		sc->MsgCnt = 0;
736 	}
737 
738 	/*
739 	 * it's important for atn stop
740 	 */
741 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH | DO_HWRESELECT);
742 	/*
743 	 * SCSI command
744 	 */
745 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, scsicommand);
746 
747 	return 0;
748 }
749 
750 /*
751  * ------------------------------------------------------------
752  * Function : trm_Interrupt
753  * Purpose  : Catch an interrupt from the adapter
754  *            Process pending device interrupts.
755  * Inputs   : void * - struct trm_softc * structure pointer
756  * ------------------------------------------------------------
757  */
758 int
759 trm_Interrupt(void *vsc)
760 {
761 	void   (*stateV)(struct trm_softc *, struct trm_scsi_req_q *, u_int8_t *);
762 	struct trm_scsi_req_q *pSRB;
763 	bus_space_handle_t ioh;
764 	struct trm_softc *sc = (struct trm_softc *)vsc;
765 	bus_space_tag_t	iot;
766 	u_int16_t phase;
767 	u_int8_t scsi_status, scsi_intstatus;
768 
769 	if (sc == NULL)
770 		return 0;
771 
772 	ioh = sc->sc_iohandle;
773 	iot = sc->sc_iotag;
774 
775 	scsi_status = bus_space_read_2(iot, ioh, TRM_S1040_SCSI_STATUS);
776 	if (!(scsi_status & SCSIINTERRUPT))
777 		return 0;
778 	scsi_intstatus = bus_space_read_1(iot, ioh, TRM_S1040_SCSI_INTSTATUS);
779 
780 #ifdef TRM_DEBUG0
781 	printf("%s: trm_interrupt - scsi_status=0x%02x, scsi_intstatus=0x%02x\n",
782 	    sc->sc_device.dv_xname, scsi_status, scsi_intstatus);
783 #endif
784 	if ((scsi_intstatus & (INT_SELTIMEOUT | INT_DISCONNECT)) != 0)
785 		trm_Disconnect(sc);
786 
787 	else if ((scsi_intstatus &  INT_RESELECTED) != 0)
788 		trm_Reselect(sc);
789 
790 	else if ((scsi_intstatus &  INT_SCSIRESET) != 0)
791 		trm_ScsiRstDetect(sc);
792 
793 	else if ((sc->pActiveDCB != NULL) && ((scsi_intstatus & (INT_BUSSERVICE | INT_CMDDONE)) != 0)) {
794 		pSRB = sc->pActiveDCB->pActiveSRB;
795 		/*
796 		 * software sequential machine
797 		 */
798 		phase = (u_int16_t) pSRB->ScsiPhase;  /* phase: */
799 		/*
800 		 * 62037 or 62137
801 		 * call  trm_SCSI_phase0[]... "phase entry"
802 		 * handle every phase before start transfer
803 		 */
804 		stateV = trm_SCSI_phase0[phase];
805 		stateV(sc, pSRB, &scsi_status);
806 		/*
807 		 * if any exception occurred
808 		 * scsi_status will be modified to bus free phase
809 		 * new scsi_status transfer out from previous stateV
810 		 */
811 		/*
812 		 * phase:0,1,2,3,4,5,6,7
813 		 */
814 		pSRB->ScsiPhase = scsi_status & PHASEMASK;
815 		phase = (u_int16_t) scsi_status & PHASEMASK;
816 		/*
817 		 * call  trm_SCSI_phase1[]... "phase entry"
818 		 * handle every phase do transfer
819 		 */
820 		stateV = trm_SCSI_phase1[phase];
821 		stateV(sc, pSRB, &scsi_status);
822 
823 	} else {
824 		return 0;
825 	}
826 
827 	return 1;
828 }
829 
830 /*
831  * ------------------------------------------------------------
832  * Function : trm_MsgOutPhase0
833  * Purpose  : Check the state machine before sending a message out
834  * Inputs   : struct trm_softc * -
835  *            struct trm_scsi_req_q * -
836  *            u_int8_t * - scsi status, set to PH_BUS_FREE if not ready
837  * ------------------------------------------------------------
838  */
839 void
840 trm_MsgOutPhase0(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
841 {
842 	switch (pSRB->SRBState) {
843 	case TRM_UNEXPECT_RESEL:
844 	case TRM_ABORT_SENT:
845 		*pscsi_status = PH_BUS_FREE; /* initial phase */
846 		break;
847 
848 	default:
849 		break;
850 	}
851 }
852 
853 /*
854  * ------------------------------------------------------------
855  * Function : trm_MsgOutPhase1
856  * Purpose  : Write the message out to the bus
857  * Inputs   : struct trm_softc * -
858  *            struct trm_scsi_req_q * -
859  *            u_int8_t * - unused
860  * ------------------------------------------------------------
861  */
862 void
863 trm_MsgOutPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
864 {
865 	const bus_space_handle_t ioh = sc->sc_iohandle;
866 	const bus_space_tag_t iot = sc->sc_iotag;
867 	struct trm_dcb *pDCB = sc->pActiveDCB;
868 
869 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO);
870 
871 	if ((pDCB->DCBFlag & TRM_WIDE_NEGO_ENABLE) != 0) {
872 		/*
873 		 * WIDE DATA TRANSFER REQUEST code (03h)
874 		 */
875 		pDCB->DCBFlag &= ~TRM_WIDE_NEGO_ENABLE;
876 		pDCB->DCBFlag |=  TRM_DOING_WIDE_NEGO;
877 
878 		sc->MsgBuf[0] = pDCB->IdentifyMsg & ~MSG_IDENTIFY_DISCFLAG;
879 		sc->MsgBuf[1] = MSG_EXTENDED;
880 		sc->MsgBuf[2] = MSG_EXT_WDTR_LEN;
881 		sc->MsgBuf[3] = MSG_EXT_WDTR;
882 
883 		if ((pDCB->DCBFlag & TRM_WIDE_NEGO_16BIT) == 0)
884 			sc->MsgBuf[4] = MSG_EXT_WDTR_BUS_8_BIT;
885 		else
886 			sc->MsgBuf[4] = MSG_EXT_WDTR_BUS_16_BIT;
887 
888 		sc->MsgCnt = 5;
889 
890 	} else if ((pDCB->DCBFlag & TRM_SYNC_NEGO_ENABLE) != 0) {
891 
892 		pDCB->DCBFlag &= ~TRM_SYNC_NEGO_ENABLE;
893 		pDCB->DCBFlag |= TRM_DOING_SYNC_NEGO;
894 
895 		sc->MsgCnt = 0;
896 
897 		if ((pDCB->DCBFlag & TRM_WIDE_NEGO_DONE) == 0)
898 			sc->MsgBuf[sc->MsgCnt++] = pDCB->IdentifyMsg & ~MSG_IDENTIFY_DISCFLAG;
899 
900 		sc->MsgBuf[sc->MsgCnt++] = MSG_EXTENDED;
901 		sc->MsgBuf[sc->MsgCnt++] = MSG_EXT_SDTR_LEN;
902 		sc->MsgBuf[sc->MsgCnt++] = MSG_EXT_SDTR;
903 		sc->MsgBuf[sc->MsgCnt++] = pDCB->MaxNegoPeriod;
904 
905 		if (pDCB->MaxNegoPeriod > 0)
906 			sc->MsgBuf[sc->MsgCnt++] = TRM_MAX_SYNC_OFFSET;
907 		else
908 			sc->MsgBuf[sc->MsgCnt++] = 0;
909 	}
910 
911 	if (sc->MsgCnt > 0) {
912 		bus_space_write_multi_1(iot, ioh, TRM_S1040_SCSI_FIFO, &sc->MsgBuf[0], sc->MsgCnt);
913 		if (sc->MsgBuf[0] == MSG_ABORT)
914 			pSRB->SRBState = TRM_ABORT_SENT;
915 		sc->MsgCnt = 0;
916 	}
917 	/*
918 	 * it's important for atn stop
919 	 */
920 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
921 	/*
922 	 * Transfer information out
923 	 */
924 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT);
925 }
926 
927 /*
928  * ------------------------------------------------------------
929  * Function : trm_CommandPhase1
930  * Purpose  : Send commands to bus
931  * Inputs   :
932  * ------------------------------------------------------------
933  */
934 void
935 trm_CommandPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
936 {
937 	const bus_space_handle_t ioh = sc->sc_iohandle;
938 	const bus_space_tag_t iot = sc->sc_iotag;
939 
940 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRATN | DO_CLRFIFO);
941 
942 	bus_space_write_multi_1(iot, ioh, TRM_S1040_SCSI_FIFO, &pSRB->CmdBlock[0], pSRB->ScsiCmdLen);
943 
944 	pSRB->SRBState = TRM_COMMAND;
945 	/*
946 	 * it's important for atn stop
947 	 */
948 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
949 	/*
950 	 * Transfer information out
951 	 */
952 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT);
953 }
954 
955 /*
956  * ------------------------------------------------------------
957  * Function : trm_DataOutPhase0
958  * Purpose  : Ready for Data Out, clear FIFO
959  * Inputs   : u_int8_t * - SCSI status, used but not set
960  * ------------------------------------------------------------
961  */
962 void
963 trm_DataOutPhase0(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
964 {
965 	const bus_space_handle_t ioh = sc->sc_iohandle;
966 	const bus_space_tag_t iot = sc->sc_iotag;
967 	struct SGentry *pseg;
968 	struct trm_dcb *pDCB;
969 	u_int32_t dLeftCounter, TempSRBXferredLength;
970 	u_int16_t scsi_status;
971 	u_int8_t TempDMAstatus, SGIndexTemp;
972 
973 	dLeftCounter = 0;
974 
975 	pDCB = pSRB->pSRBDCB;
976 	scsi_status = *pscsi_status;
977 
978 	if (pSRB->SRBState != TRM_XFERPAD) {
979 		if ((scsi_status & PARITYERROR) != 0)
980 			pSRB->SRBFlag |= TRM_PARITY_ERROR;
981 		if ((scsi_status & SCSIXFERDONE) == 0) {
982 			/*
983 			 * when data transfer from DMA FIFO to SCSI FIFO
984 			 * if there was some data left in SCSI FIFO
985 			 */
986 			dLeftCounter = (u_int32_t)(bus_space_read_1(
987 			    iot, ioh, TRM_S1040_SCSI_FIFOCNT) & 0x1F);
988 			if (pDCB->SyncPeriod & WIDE_SYNC) {
989 				/*
990 				 * if WIDE scsi SCSI FIFOCNT unit is word
991 				 * so need to * 2
992 				 */
993 				dLeftCounter <<= 1;
994 			}
995 		}
996 		/*
997 		 * calculate all the residue data that not yet transferred
998 		 * SCSI transfer counter + left in SCSI FIFO data
999 		 *
1000 		 * .....TRM_S1040_SCSI_COUNTER (24bits)
1001 		 * The counter always decrement by one for every SCSI byte
1002 		 * transfer.
1003 		 * .....TRM_S1040_SCSI_FIFOCNT ( 5bits)
1004 		 * The counter is SCSI FIFO offset counter
1005 		 */
1006 		dLeftCounter += bus_space_read_4(iot, ioh,
1007 		    TRM_S1040_SCSI_COUNTER);
1008 		if (dLeftCounter == 1) {
1009 			dLeftCounter = 0;
1010 			bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL,
1011 			    DO_CLRFIFO);
1012 		}
1013 		if (dLeftCounter == 0 ||
1014 		    (scsi_status & SCSIXFERCNT_2_ZERO) != 0) {
1015 			TempDMAstatus = bus_space_read_1(iot,
1016 			    ioh, TRM_S1040_DMA_STATUS);
1017 			while ((TempDMAstatus & DMAXFERCOMP) == 0) {
1018 				TempDMAstatus = bus_space_read_1(iot,
1019 				    ioh, TRM_S1040_DMA_STATUS);
1020 			}
1021 			pSRB->SRBTotalXferLength = 0;
1022 		} else {
1023 			/*
1024 			 * Update SG list
1025 			 */
1026 			/*
1027 			 * if transfer not yet complete
1028 			 * there were some data residue in SCSI FIFO or
1029 			 * SCSI transfer counter not empty
1030 			 */
1031 			if (pSRB->SRBTotalXferLength != dLeftCounter) {
1032 				/*
1033 				 * data that had transferred length
1034 				 */
1035 				TempSRBXferredLength = pSRB->SRBTotalXferLength
1036 				    - dLeftCounter;
1037 				/*
1038 				 * next time to be transferred length
1039 				 */
1040 				pSRB->SRBTotalXferLength = dLeftCounter;
1041 				/*
1042 				 * parsing from last time disconnect SRBSGIndex
1043 				 */
1044 				pseg = &pSRB->SegmentX[pSRB->SRBSGIndex];
1045 				for (SGIndexTemp = pSRB->SRBSGIndex;
1046 				    SGIndexTemp < pSRB->SRBSGCount;
1047 				    SGIndexTemp++) {
1048 					/*
1049 					 * find last time which SG transfer be
1050 					 * disconnect
1051 					 */
1052 					if (TempSRBXferredLength >= pseg->length)
1053 						TempSRBXferredLength -= pseg->length;
1054 					else {
1055 						/*
1056 						 * update last time disconnected
1057 						 * SG list
1058 						 */
1059 						/*
1060 						 * residue data length
1061 						 */
1062 						pseg->length -=
1063 						    TempSRBXferredLength;
1064 						/*
1065 						 * residue data pointer
1066 						 */
1067 						pseg->address +=
1068 						    TempSRBXferredLength;
1069 						pSRB->SRBSGIndex = SGIndexTemp;
1070 						break;
1071 					}
1072 					pseg++;
1073 				}
1074 			}
1075 		}
1076 	}
1077 	bus_space_write_1(iot, ioh, TRM_S1040_DMA_CONTROL, STOPDMAXFER);
1078 }
1079 
1080 /*
1081  * ------------------------------------------------------------
1082  * Function : trm_DataOutPhase1
1083  * Purpose  : Transfers data out, calls trm_DataIO_transfer
1084  * Inputs   :
1085  * ------------------------------------------------------------
1086  */
1087 void
1088 trm_DataOutPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
1089 {
1090 	trm_DataIO_transfer(sc, pSRB, XFERDATAOUT);
1091 }
1092 
1093 /*
1094  * ------------------------------------------------------------
1095  * Function : trm_DataInPhase0
1096  * Purpose  : Prepare for reading data in from bus
1097  * Inputs   :
1098  * ------------------------------------------------------------
1099  */
1100 void
1101 trm_DataInPhase0(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
1102 {
1103 	const bus_space_handle_t ioh = sc->sc_iohandle;
1104 	const bus_space_tag_t iot = sc->sc_iotag;
1105 	struct SGentry *pseg;
1106 	u_int32_t TempSRBXferredLength, dLeftCounter;
1107 	u_int16_t scsi_status;
1108 	u_int8_t SGIndexTemp;
1109 
1110 	dLeftCounter = 0;
1111 
1112 	scsi_status = *pscsi_status;
1113 	if (pSRB->SRBState != TRM_XFERPAD) {
1114 		if ((scsi_status & PARITYERROR) != 0)
1115 			pSRB->SRBFlag |= TRM_PARITY_ERROR;
1116 		dLeftCounter += bus_space_read_4(iot, ioh,
1117 		    TRM_S1040_SCSI_COUNTER);
1118 		if (dLeftCounter == 0 ||
1119 		    (scsi_status & SCSIXFERCNT_2_ZERO) != 0) {
1120 			while ((bus_space_read_1(iot, ioh, TRM_S1040_DMA_STATUS) & DMAXFERCOMP) == 0)
1121 				;
1122 			pSRB->SRBTotalXferLength = 0;
1123 		} else {
1124 			/*
1125 			 * phase changed
1126 			 *
1127 			 * parsing the case:
1128 			 * when a transfer not yet complete
1129 			 * but be disconnected by uper layer
1130 			 * if transfer not yet complete
1131 			 * there were some data residue in SCSI FIFO or
1132 			 * SCSI transfer counter not empty
1133 			 */
1134 			if (pSRB->SRBTotalXferLength != dLeftCounter) {
1135 				/*
1136 				 * data that had transferred length
1137 				 */
1138 				TempSRBXferredLength = pSRB->SRBTotalXferLength
1139 				    - dLeftCounter;
1140 				/*
1141 				 * next time to be transferred length
1142 				 */
1143 				pSRB->SRBTotalXferLength = dLeftCounter;
1144 				/*
1145 				 * parsing from last time disconnect SRBSGIndex
1146 				 */
1147 				pseg = &pSRB->SegmentX[pSRB->SRBSGIndex];
1148 				for (SGIndexTemp = pSRB->SRBSGIndex;
1149 				    SGIndexTemp < pSRB->SRBSGCount;
1150 				    SGIndexTemp++) {
1151 					/*
1152 					 * find last time which SG transfer be
1153 					 * disconnect
1154 					 */
1155 					if (TempSRBXferredLength >=
1156 					    pseg->length) {
1157 						TempSRBXferredLength -= pseg->length;
1158 					} else {
1159 						/*
1160 						 * update last time disconnected
1161 						 * SG list
1162 						 *
1163 						 * residue data length
1164 						 */
1165 						pseg->length -= TempSRBXferredLength;
1166 						/*
1167 						 * residue data pointer
1168 						 */
1169 						pseg->address += TempSRBXferredLength;
1170 						pSRB->SRBSGIndex = SGIndexTemp;
1171 						break;
1172 					}
1173 					pseg++;
1174 				}
1175 			}
1176 		}
1177 	}
1178 }
1179 
1180 /*
1181  * ------------------------------------------------------------
1182  * Function : trm_DataInPhase1
1183  * Purpose  : Transfer data in from bus, calls trm_DataIO_transfer
1184  * Inputs   :
1185  * ------------------------------------------------------------
1186  */
1187 void
1188 trm_DataInPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
1189 {
1190 	trm_DataIO_transfer(sc, pSRB, XFERDATAIN);
1191 }
1192 
1193 /*
1194  * ------------------------------------------------------------
1195  * Function : trm_DataIO_transfer
1196  * Purpose  :
1197  * Inputs   :
1198  * ------------------------------------------------------------
1199  */
1200 void
1201 trm_DataIO_transfer(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int16_t ioDir)
1202 {
1203 	const bus_space_handle_t ioh = sc->sc_iohandle;
1204 	const bus_space_tag_t iot = sc->sc_iotag;
1205 	struct trm_dcb *pDCB = pSRB->pSRBDCB;
1206 	u_int8_t bval;
1207 
1208 	if (pSRB->SRBSGIndex < pSRB->SRBSGCount) {
1209 		if (pSRB->SRBTotalXferLength != 0) {
1210 			/*
1211 			 * load what physical address of Scatter/Gather list
1212 			 * table want to be transfer
1213 			 */
1214 			pSRB->SRBState = TRM_DATA_XFER;
1215 			bus_space_write_4(iot, ioh, TRM_S1040_DMA_XHIGHADDR, 0);
1216 			bus_space_write_4(iot, ioh,
1217 			    TRM_S1040_DMA_XLOWADDR, (pSRB->SRBSGPhyAddr +
1218 			    ((u_int32_t)pSRB->SRBSGIndex << 3)));
1219 			/*
1220 			 * load how many bytes in the Scatter/Gather list table
1221 			 */
1222 			bus_space_write_4(iot, ioh, TRM_S1040_DMA_XCNT,
1223 			    ((u_int32_t)(pSRB->SRBSGCount -
1224 			    pSRB->SRBSGIndex) << 3));
1225 			/*
1226 			 * load total transfer length (24bits,
1227 			 * pSRB->SRBTotalXferLength) max value 16Mbyte
1228 			 */
1229 			bus_space_write_4(iot, ioh,
1230 			    TRM_S1040_SCSI_COUNTER, pSRB->SRBTotalXferLength);
1231 			/*
1232 			 * Start DMA transfer
1233 			 */
1234 			bus_space_write_2(iot,ioh,TRM_S1040_DMA_COMMAND, ioDir);
1235 			/* bus_space_write_2(iot, ioh,
1236 			    TRM_S1040_DMA_CONTROL, STARTDMAXFER);*/
1237 			/*
1238 			 * Set the transfer bus and direction
1239 			 */
1240 			bval = ioDir == XFERDATAOUT ? SCMD_DMA_OUT :SCMD_DMA_IN;
1241 		} else {
1242 			/*
1243 			 * xfer pad
1244 			 */
1245 			if (pSRB->SRBSGCount)
1246 				pSRB->AdaptStatus = TRM_OVER_UNDER_RUN;
1247 
1248 			if (pDCB->SyncPeriod & WIDE_SYNC) {
1249 				bus_space_write_4(iot, ioh,
1250 				    TRM_S1040_SCSI_COUNTER, 2);
1251 			} else {
1252 				bus_space_write_4(iot, ioh,
1253 				    TRM_S1040_SCSI_COUNTER, 1);
1254 			}
1255 
1256 			if (ioDir == XFERDATAOUT) {
1257 				bus_space_write_2(iot,
1258 				    ioh, TRM_S1040_SCSI_FIFO, 0);
1259 			} else {
1260 				bus_space_read_2(iot,
1261 				    ioh, TRM_S1040_SCSI_FIFO);
1262 			}
1263 			pSRB->SRBState = TRM_XFERPAD;
1264 			/*
1265 			 * Set the transfer bus and direction
1266 			 */
1267 			bval = ioDir == XFERDATAOUT ? SCMD_FIFO_OUT : SCMD_FIFO_IN;
1268 		}
1269 		/*
1270 		 * it's important for atn stop
1271 		 */
1272 		bus_space_write_2(iot,ioh,TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
1273 		/*
1274 		 * Tell the bus to do the transfer
1275 		 */
1276 		bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, bval);
1277 	}
1278 }
1279 
1280 /*
1281  * ------------------------------------------------------------
1282  * Function : trm_StatusPhase0
1283  * Purpose  : Update Target Status with data from SCSI FIFO
1284  * Inputs   : u_int8_t * - Set to PH_BUS_FREE
1285  * ------------------------------------------------------------
1286  */
1287 void
1288 trm_StatusPhase0(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
1289 {
1290 	const bus_space_handle_t ioh = sc->sc_iohandle;
1291 	const bus_space_tag_t iot = sc->sc_iotag;
1292 
1293 	pSRB->TargetStatus = bus_space_read_1(iot, ioh, TRM_S1040_SCSI_FIFO);
1294 
1295 	pSRB->SRBState = TRM_COMPLETED;
1296 	/*
1297 	 * initial phase
1298 	 */
1299 	*pscsi_status = PH_BUS_FREE;
1300 	/*
1301 	 * it's important for atn stop
1302 	 */
1303 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
1304 	/*
1305 	 * Tell bus that the message was accepted
1306 	 */
1307 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT);
1308 }
1309 
1310 /*
1311  * ------------------------------------------------------------
1312  * Function : trm_StatusPhase1
1313  * Purpose  : Clear FIFO of DMA and SCSI
1314  * Inputs   :
1315  * ------------------------------------------------------------
1316  */
1317 void
1318 trm_StatusPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
1319 {
1320 	const bus_space_handle_t ioh = sc->sc_iohandle;
1321 	const bus_space_tag_t iot = sc->sc_iotag;
1322 
1323 	if ((bus_space_read_2(iot, ioh, TRM_S1040_DMA_COMMAND) & 0x0001) != 0) {
1324 		if ((bus_space_read_1(iot, ioh, TRM_S1040_SCSI_FIFOCNT) & 0x40)
1325 		    == 0) {
1326 			bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL,
1327 			    DO_CLRFIFO);
1328 		}
1329 		if ((bus_space_read_2(iot, ioh,
1330 		    TRM_S1040_DMA_FIFOCNT) & 0x8000) == 0) {
1331 			bus_space_write_1(iot, ioh,
1332 			    TRM_S1040_DMA_CONTROL, CLRXFIFO);
1333 		}
1334 	} else {
1335 		if ((bus_space_read_2(iot, ioh,
1336 		    TRM_S1040_DMA_FIFOCNT) & 0x8000) == 0) {
1337 			bus_space_write_1(iot, ioh,
1338 			    TRM_S1040_DMA_CONTROL, CLRXFIFO);
1339 		}
1340 		if ((bus_space_read_1(iot, ioh,
1341 		    TRM_S1040_SCSI_FIFOCNT) & 0x40) == 0) {
1342 			bus_space_write_2(iot, ioh,
1343 			    TRM_S1040_SCSI_CONTROL, DO_CLRFIFO);
1344 		}
1345 	}
1346 	pSRB->SRBState = TRM_STATUS;
1347 	/*
1348 	 * it's important for atn stop
1349 	 */
1350 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
1351 	/*
1352 	 * Tell the bus that the command is complete
1353 	 */
1354 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_COMP);
1355 }
1356 
1357 /*
1358  * ------------------------------------------------------------
1359  * Function : trm_MsgInPhase0
1360  * Purpose  :
1361  * Inputs   :
1362  *
1363  * extended message codes:
1364  *   code        description
1365  *   ----        -----------
1366  *    02h        Reserved
1367  *    00h        MODIFY DATA POINTER
1368  *    01h        SYNCHRONOUS DATA TRANSFER REQUEST
1369  *    03h        WIDE DATA TRANSFER REQUEST
1370  * 04h - 7Fh     Reserved
1371  * 80h - FFh     Vendor specific
1372  *
1373  * ------------------------------------------------------------
1374  */
1375 void
1376 trm_MsgInPhase0(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
1377 {
1378 	const bus_space_handle_t ioh = sc->sc_iohandle;
1379 	const bus_space_tag_t iot = sc->sc_iotag;
1380 	struct trm_dcb *pDCB;
1381 	u_int8_t message_in_code, bIndex, message_in_tag_id;
1382 
1383 	pDCB = sc->pActiveDCB;
1384 
1385 	message_in_code = bus_space_read_1(iot, ioh, TRM_S1040_SCSI_FIFO);
1386 
1387 	if (pSRB->SRBState != TRM_EXTEND_MSGIN) {
1388 		switch (message_in_code) {
1389 		case MSG_DISCONNECT:
1390 			pSRB->SRBState = TRM_DISCONNECTED;
1391 			break;
1392 
1393 		case MSG_EXTENDED:
1394 		case MSG_SIMPLE_Q_TAG:
1395 		case MSG_HEAD_OF_Q_TAG:
1396 		case MSG_ORDERED_Q_TAG:
1397 			pSRB->SRBState = TRM_EXTEND_MSGIN;
1398 			/*
1399 			 * extended message      (01h)
1400 			 */
1401 			bzero(&sc->MsgBuf[0], sizeof(sc->MsgBuf));
1402 			sc->MsgBuf[0] = message_in_code;
1403 			sc->MsgCnt    = 1;
1404 			/*
1405 			 * extended message length (n)
1406 			 */
1407 			break;
1408 
1409 		case MSG_MESSAGE_REJECT:
1410 			/*
1411 			 * Reject message
1412 			 */
1413 			if ((pDCB->DCBFlag & TRM_DOING_WIDE_NEGO) != 0) {
1414 				/*
1415 				 * do wide nego reject
1416 				 */
1417 				pDCB = pSRB->pSRBDCB;
1418 
1419 				pDCB->DCBFlag &= ~TRM_DOING_WIDE_NEGO;
1420 				pDCB->DCBFlag |= TRM_WIDE_NEGO_DONE;
1421 
1422 				if ((pDCB->DCBFlag & TRM_SYNC_NEGO_ENABLE) != 0) {
1423 					/*
1424 					 * Set ATN, in case ATN was clear
1425 					 */
1426 					pSRB->SRBState = TRM_MSGOUT;
1427 					bus_space_write_2(iot, ioh,
1428 					    TRM_S1040_SCSI_CONTROL, DO_SETATN);
1429 				} else {
1430 					/*
1431 					 * Clear ATN
1432 					 */
1433 					bus_space_write_2(iot, ioh,
1434 					    TRM_S1040_SCSI_CONTROL, DO_CLRATN);
1435 				}
1436 
1437 			} else if ((pDCB->DCBFlag & TRM_DOING_SYNC_NEGO) != 0) {
1438 				/*
1439 				 * do sync nego reject
1440 				 */
1441 				pDCB = pSRB->pSRBDCB;
1442 
1443 				pDCB->DCBFlag &= ~TRM_DOING_SYNC_NEGO;
1444 
1445 				pDCB->SyncPeriod = 0;
1446 				pDCB->SyncOffset = 0;
1447 
1448 				bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRATN);
1449 				goto  re_prog;
1450 			}
1451 			break;
1452 
1453 		case MSG_IGN_WIDE_RESIDUE:
1454 			bus_space_write_4(iot, ioh, TRM_S1040_SCSI_COUNTER, 1);
1455 			bus_space_read_1(iot, ioh, TRM_S1040_SCSI_FIFO);
1456 			break;
1457 
1458 		default:
1459 			break;
1460 		}
1461 
1462 	} else {
1463 
1464 		/*
1465 		 * We are collecting an extended message. Save the latest byte and then
1466 		 * check to see if the message is complete. If so, process it.
1467 		 */
1468 		sc->MsgBuf[sc->MsgCnt++] = message_in_code;
1469 #ifdef TRM_DEBUG0
1470 		printf("%s: sc->MsgBuf = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
1471 		    sc->sc_device.dv_xname,
1472 		    sc->MsgBuf[0], sc->MsgBuf[1], sc->MsgBuf[2], sc->MsgBuf[3], sc->MsgBuf[4], sc->MsgBuf[5] );
1473 #endif
1474 		switch (sc->MsgBuf[0]) {
1475 		case MSG_SIMPLE_Q_TAG:
1476 		case MSG_HEAD_OF_Q_TAG:
1477 		case MSG_ORDERED_Q_TAG:
1478 			if (sc->MsgCnt == 2) {
1479 				pSRB->SRBState = TRM_FREE;
1480 				message_in_tag_id = sc->MsgBuf[1];
1481 				sc->MsgCnt = 0;
1482 				TAILQ_FOREACH(pSRB, &sc->goingSRB, link) {
1483 					if ((pSRB->pSRBDCB == pDCB) && (pSRB->TagNumber == message_in_tag_id))
1484 						break;
1485 				}
1486 				if ((pSRB != NULL) && (pSRB->SRBState == TRM_DISCONNECTED)) {
1487 					pDCB->pActiveSRB = pSRB;
1488 					pSRB->SRBState = TRM_DATA_XFER;
1489 				} else {
1490 #ifdef TRM_DEBUG0
1491 					printf("%s: TRM_UNEXPECT_RESEL!\n",
1492 					    sc->sc_device.dv_xname);
1493 #endif
1494 					pSRB = &sc->SRB[0];
1495 					trm_srb_reinit(sc, pSRB);
1496 					pSRB->SRBState = TRM_UNEXPECT_RESEL;
1497 					pDCB->pActiveSRB = pSRB;
1498 					trm_EnableMsgOut(sc, MSG_ABORT_TAG);
1499 				}
1500 			}
1501 			break;
1502 
1503 		case  MSG_EXTENDED:
1504 			/* TODO XXXX: Correctly handling target initiated negotiations? */
1505 			if ((sc->MsgBuf[2] == MSG_EXT_WDTR) && (sc->MsgCnt == 4)) {
1506 				/*
1507 				 * ======================================
1508 				 * WIDE DATA TRANSFER REQUEST
1509 				 * ======================================
1510 				 * byte 0 :  Extended message (01h)
1511 				 * byte 1 :  Extended message length (02h)
1512 				 * byte 2 :  WIDE DATA TRANSFER code (03h)
1513 				 * byte 3 :  Transfer width exponent
1514 				 */
1515 
1516 				pSRB->SRBState  = TRM_FREE;
1517 				pDCB->DCBFlag  &= ~(TRM_WIDE_NEGO_ENABLE | TRM_DOING_WIDE_NEGO);
1518 
1519 				if (sc->MsgBuf[1] != MSG_EXT_WDTR_LEN)
1520 					goto reject_offer;
1521 
1522 				switch (sc->MsgBuf[3]) {
1523 				case MSG_EXT_WDTR_BUS_32_BIT:
1524 					if ((pDCB->DCBFlag & TRM_WIDE_NEGO_16BIT) == 0)
1525 						sc->MsgBuf[3] = MSG_EXT_WDTR_BUS_8_BIT;
1526 					else
1527 						sc->MsgBuf[3] = MSG_EXT_WDTR_BUS_16_BIT;
1528 					break;
1529 
1530 				case MSG_EXT_WDTR_BUS_16_BIT:
1531 					if ((pDCB->DCBFlag & TRM_WIDE_NEGO_16BIT) == 0) {
1532 						sc->MsgBuf[3] = MSG_EXT_WDTR_BUS_8_BIT;
1533 						break;
1534 					}
1535 					pDCB->SyncPeriod |= WIDE_SYNC;
1536 					/* FALL THROUGH == ACCEPT OFFER */
1537 
1538 				case MSG_EXT_WDTR_BUS_8_BIT:
1539 					pSRB->SRBState  =  TRM_MSGOUT;
1540 					pDCB->DCBFlag  |= (TRM_SYNC_NEGO_ENABLE | TRM_WIDE_NEGO_DONE);
1541 
1542 					if (pDCB->MaxNegoPeriod == 0) {
1543 						pDCB->SyncPeriod = 0;
1544 						pDCB->SyncOffset = 0;
1545 						goto re_prog;
1546 					}
1547 					break;
1548 
1549 				default:
1550 					pDCB->DCBFlag &= ~TRM_WIDE_NEGO_ENABLE;
1551 					pDCB->DCBFlag |= TRM_WIDE_NEGO_DONE;
1552 reject_offer:
1553 					sc->MsgCnt    = 1;
1554 					sc->MsgBuf[0] = MSG_MESSAGE_REJECT;
1555 					break;
1556 				}
1557 
1558 				/* Echo accepted offer, or send revised offer */
1559 				bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_SETATN);
1560 
1561 			} else if ((sc->MsgBuf[2] == MSG_EXT_SDTR) && (sc->MsgCnt == 5)) {
1562 				/*
1563 				 * =================================
1564 				 * SYNCHRONOUS DATA TRANSFER REQUEST
1565 				 * =================================
1566 				 * byte 0 :  Extended message (01h)
1567 				 * byte 1 :  Extended message length (03)
1568 				 * byte 2 :  SYNCHRONOUS DATA TRANSFER code (01h)
1569 				 * byte 3 :  Transfer period factor
1570 				 * byte 4 :  REQ/ACK offset
1571 				 */
1572 
1573 				pSRB->SRBState  = TRM_FREE;
1574 				pDCB->DCBFlag  &= ~(TRM_SYNC_NEGO_ENABLE | TRM_DOING_SYNC_NEGO);
1575 
1576 				if (sc->MsgBuf[1] != MSG_EXT_SDTR_LEN)
1577 					goto reject_offer;
1578 
1579 				if ((sc->MsgBuf[3] == 0) || (sc->MsgBuf[4] == 0)) {
1580 					/*
1581 					 * Asynchronous transfers
1582 					 */
1583 					pDCB->SyncPeriod  = 0;
1584 					pDCB->SyncOffset  = 0;
1585 
1586 				} else {
1587 					/*
1588 					 * Synchronous transfers
1589 					 */
1590 					/*
1591 					 * REQ/ACK offset
1592 					 */
1593 					pDCB->SyncOffset = sc->MsgBuf[4];
1594 
1595 					for (bIndex = 0; bIndex < 7; bIndex++)
1596 						if (sc->MsgBuf[3] <= trm_clock_period[bIndex])
1597 							break;
1598 
1599 					pDCB->SyncPeriod |= (bIndex | ALT_SYNC);
1600 				}
1601 
1602 re_prog:			/*
1603 				 *   program SCSI control register
1604 				 */
1605 				bus_space_write_1(iot, ioh, TRM_S1040_SCSI_SYNC, pDCB->SyncPeriod);
1606 				bus_space_write_1(iot, ioh, TRM_S1040_SCSI_OFFSET, pDCB->SyncOffset);
1607 
1608 				trm_SetXferParams(sc, pDCB, (pDCB->DCBFlag & TRM_QUIRKS_VALID));
1609 			}
1610 			break;
1611 
1612 		default:
1613 			break;
1614 		}
1615 	}
1616 
1617 	/*
1618 	 * initial phase
1619 	 */
1620 	*pscsi_status = PH_BUS_FREE;
1621 	/*
1622 	 * it's important for atn stop
1623 	 */
1624 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
1625 	/*
1626 	 * Tell bus that the message was accepted
1627 	 */
1628 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT);
1629 }
1630 
1631 /*
1632  * ------------------------------------------------------------
1633  * Function : trm_MsgInPhase1
1634  * Purpose  : Clear the FIFO
1635  * Inputs   :
1636  * ------------------------------------------------------------
1637  */
1638 void
1639 trm_MsgInPhase1(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
1640 {
1641 	const bus_space_handle_t ioh = sc->sc_iohandle;
1642 	const bus_space_tag_t iot = sc->sc_iotag;
1643 
1644 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO);
1645 	bus_space_write_4(iot, ioh, TRM_S1040_SCSI_COUNTER, 1);
1646 
1647 	/*
1648 	 * it's important for atn stop
1649 	 */
1650 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
1651 	/*
1652 	 * SCSI command
1653 	 */
1654 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_IN);
1655 }
1656 
1657 /*
1658  * ------------------------------------------------------------
1659  * Function : trm_Nop
1660  * Purpose  : EMPTY
1661  * Inputs   :
1662  * ------------------------------------------------------------
1663  */
1664 void
1665 trm_Nop(struct trm_softc *sc, struct trm_scsi_req_q *pSRB, u_int8_t *pscsi_status)
1666 {
1667 }
1668 
1669 /*
1670  * ------------------------------------------------------------
1671  * Function : trm_SetXferParams
1672  * Purpose  : Set the Sync period, offset and mode for each device that has
1673  *            the same target as the given one (struct trm_dcb *)
1674  * Inputs   :
1675  * ------------------------------------------------------------
1676  */
1677 void
1678 trm_SetXferParams(struct trm_softc *sc, struct trm_dcb *pDCB, int print_info)
1679 {
1680 	struct trm_dcb *pDCBTemp;
1681 	int lun, target;
1682 
1683 	/*
1684 	 * set all lun device's period, offset
1685 	 */
1686 #ifdef TRM_DEBUG0
1687 	printf("%s: trm_SetXferParams\n", sc->sc_device.dv_xname);
1688 #endif
1689 
1690 	target = pDCB->target;
1691 	for(lun = 0; lun < TRM_MAX_LUNS; lun++) {
1692 		pDCBTemp = sc->pDCB[target][lun];
1693 		if (pDCBTemp != NULL) {
1694 			pDCBTemp->DevMode       = pDCB->DevMode;
1695 			pDCBTemp->MaxNegoPeriod = pDCB->MaxNegoPeriod;
1696 			pDCBTemp->SyncPeriod    = pDCB->SyncPeriod;
1697 			pDCBTemp->SyncOffset    = pDCB->SyncOffset;
1698 			pDCBTemp->DCBFlag       = pDCB->DCBFlag;
1699 		}
1700 	}
1701 
1702 	if (print_info)
1703 		trm_print_info(sc, pDCB);
1704 }
1705 
1706 /*
1707  * ------------------------------------------------------------
1708  * Function : trm_Disconnect
1709  * Purpose  :
1710  * Inputs   :
1711  *
1712  *    ---SCSI bus phase
1713  *     PH_DATA_OUT          0x00     Data out phase
1714  *     PH_DATA_IN           0x01     Data in phase
1715  *     PH_COMMAND           0x02     Command phase
1716  *     PH_STATUS            0x03     Status phase
1717  *     PH_BUS_FREE          0x04     Invalid phase used as bus free
1718  *     PH_BUS_FREE          0x05     Invalid phase used as bus free
1719  *     PH_MSG_OUT           0x06     Message out phase
1720  *     PH_MSG_IN            0x07     Message in phase
1721  * ------------------------------------------------------------
1722  */
1723 void
1724 trm_Disconnect(struct trm_softc *sc)
1725 {
1726 	const bus_space_handle_t ioh = sc->sc_iohandle;
1727 	struct trm_scsi_req_q *pSRB;
1728 	const bus_space_tag_t iot = sc->sc_iotag;
1729 	struct trm_dcb *pDCB;
1730 	int j;
1731 
1732 #ifdef TRM_DEBUG0
1733 	printf("%s: trm_Disconnect\n", sc->sc_device.dv_xname);
1734 #endif
1735 
1736 	pDCB = sc->pActiveDCB;
1737 	if (pDCB == NULL) {
1738 		/* TODO: Why use a loop? Why not use DELAY(400)? */
1739 		for(j = 400; j > 0; --j)
1740 			DELAY(1); /* 1 msec */
1741 		bus_space_write_2(iot, ioh,
1742 		    TRM_S1040_SCSI_CONTROL, (DO_CLRFIFO | DO_HWRESELECT));
1743 		return;
1744 	}
1745 
1746 	pSRB = pDCB->pActiveSRB;
1747 	sc->pActiveDCB = NULL;
1748 	pSRB->ScsiPhase = PH_BUS_FREE; /* SCSI bus free Phase */
1749 	bus_space_write_2(iot, ioh,
1750 	    TRM_S1040_SCSI_CONTROL, (DO_CLRFIFO | DO_HWRESELECT));
1751 	DELAY(100);
1752 
1753 	switch (pSRB->SRBState) {
1754 	case TRM_UNEXPECT_RESEL:
1755 		pSRB->SRBState = TRM_FREE;
1756 		break;
1757 
1758 	case TRM_ABORT_SENT:
1759 		trm_GoingSRB_Done(sc, pDCB);
1760 		break;
1761 
1762 	case TRM_START:
1763 	case TRM_MSGOUT:
1764 		/*
1765 		 * Selection time out
1766 		 */
1767 		/* If not polling just keep trying until xs->stimeout expires */
1768 		if ((pSRB->xs->flags & SCSI_POLL) == 0) {
1769 			trm_RewaitSRB(sc, pSRB);
1770 		} else {
1771 			pSRB->TargetStatus = TRM_SCSI_SELECT_TIMEOUT;
1772 			goto  disc1;
1773 		}
1774 		break;
1775 
1776 	case TRM_COMPLETED:
1777 disc1:
1778 		/*
1779 		 * TRM_COMPLETED - remove id from mask of active tags
1780 		 */
1781 		pDCB->pActiveSRB = NULL;
1782 		trm_FinishSRB(sc, pSRB);
1783 		break;
1784 
1785 	default:
1786 		break;
1787 	}
1788 
1789 	trm_StartWaitingSRB(sc);
1790 }
1791 
1792 /*
1793  * ------------------------------------------------------------
1794  * Function : trm_Reselect
1795  * Purpose  :
1796  * Inputs   :
1797  * ------------------------------------------------------------
1798  */
1799 void
1800 trm_Reselect(struct trm_softc *sc)
1801 {
1802 	const bus_space_handle_t ioh = sc->sc_iohandle;
1803 	const bus_space_tag_t iot = sc->sc_iotag;
1804 	struct trm_scsi_req_q *pSRB;
1805 	struct trm_dcb *pDCB;
1806 	u_int16_t RselTarLunId;
1807 	u_int8_t target, lun;
1808 
1809 #ifdef TRM_DEBUG0
1810 	printf("%s: trm_Reselect\n", sc->sc_device.dv_xname);
1811 #endif
1812 
1813 	pDCB = sc->pActiveDCB;
1814 	if (pDCB != NULL) {
1815 		/*
1816 		 * Arbitration lost but Reselection win
1817 		 */
1818 		pSRB = pDCB->pActiveSRB;
1819 		trm_RewaitSRB(sc, pSRB);
1820 	}
1821 
1822 	/*
1823 	 * Read Reselected Target Id and LUN
1824 	 */
1825 	RselTarLunId = bus_space_read_2(iot, ioh, TRM_S1040_SCSI_TARGETID) & 0x1FFF;
1826 	/* TODO XXXX: Make endian independent! */
1827 	target = RselTarLunId & 0xff;
1828 	lun    = (RselTarLunId >> 8) & 0xff;
1829 
1830 #ifdef TRM_DEBUG0
1831 	printf("%s: reselect - target = %d, lun = %d\n",
1832 	    sc->sc_device.dv_xname, target, lun);
1833 #endif
1834 
1835 	if ((target < TRM_MAX_TARGETS) && (lun < TRM_MAX_LUNS))
1836 		pDCB = sc->pDCB[target][lun];
1837 	else
1838 		pDCB = NULL;
1839 
1840 	if (pDCB == NULL)
1841 		printf("%s: reselect - target = %d, lun = %d not found\n",
1842 		    sc->sc_device.dv_xname, target, lun);
1843 
1844 	sc->pActiveDCB = pDCB;
1845 
1846 	/* TODO XXXX: This will crash if pDCB is ever NULL */
1847 	if ((pDCB->DCBFlag & TRM_USE_TAG_QUEUING) != 0) {
1848 		pSRB = &sc->SRB[0];
1849 		pDCB->pActiveSRB = pSRB;
1850 	} else {
1851 		pSRB = pDCB->pActiveSRB;
1852 		if (pSRB == NULL || (pSRB->SRBState != TRM_DISCONNECTED)) {
1853 			/*
1854 			 * abort command
1855 			 */
1856 			pSRB = &sc->SRB[0];
1857 			pSRB->SRBState = TRM_UNEXPECT_RESEL;
1858 			pDCB->pActiveSRB = pSRB;
1859 			trm_EnableMsgOut(sc, MSG_ABORT);
1860 		} else
1861 			pSRB->SRBState = TRM_DATA_XFER;
1862 	}
1863 	pSRB->ScsiPhase = PH_BUS_FREE; /* SCSI bus free Phase */
1864 
1865 	/*
1866 	 * Program HA ID, target ID, period and offset
1867 	 */
1868 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_TARGETID, target);
1869 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_HOSTID, sc->sc_AdaptSCSIID);
1870 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_SYNC, pDCB->SyncPeriod);
1871 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_OFFSET, pDCB->SyncOffset);
1872 
1873 	/*
1874 	 * it's important for atn stop
1875 	 */
1876 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_DATALATCH);
1877 	DELAY(30);
1878 
1879 	/*
1880 	 * SCSI command
1881 	 * to rls the /ACK signal
1882 	 */
1883 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT);
1884 }
1885 
1886 /*
1887  * ------------------------------------------------------------
1888  * Function : trm_FinishSRB
1889  * Purpose  : Complete execution of a SCSI command
1890  * Inputs   :
1891  * ------------------------------------------------------------
1892  */
1893 void
1894 trm_FinishSRB(struct trm_softc *sc, struct trm_scsi_req_q *pSRB)
1895 {
1896 	struct scsi_inquiry_data *ptr;
1897 	struct scsi_sense_data *s1, *s2;
1898 	struct scsi_xfer *xs = pSRB->xs;
1899 	struct trm_dcb *pDCB = pSRB->pSRBDCB;
1900 	int target, lun, intflag;
1901 
1902 #ifdef TRM_DEBUG0
1903 	printf("%s: trm_FinishSRB. sc = %p, pSRB = %p\n",
1904 	    sc->sc_device.dv_xname, sc, pSRB);
1905 #endif
1906 	pDCB->DCBFlag &= ~TRM_QUEUE_FULL;
1907 
1908 	intflag = splbio();
1909 	if (pSRB->TagNumber != TRM_NO_TAG) {
1910 		pSRB->pSRBDCB->TagMask &= ~(1 << pSRB->TagNumber);
1911 		pSRB->TagNumber = TRM_NO_TAG;
1912 	}
1913 	/* SRB may have started & finished, or be waiting and timed out */
1914 	if ((pSRB->SRBFlag & TRM_ON_WAITING_SRB) != 0) {
1915 		pSRB->SRBFlag &= ~TRM_ON_WAITING_SRB;
1916 		TAILQ_REMOVE(&sc->waitingSRB, pSRB, link);
1917 	}
1918 	if ((pSRB->SRBFlag & TRM_ON_GOING_SRB) != 0) {
1919 		pSRB->SRBFlag &= ~TRM_ON_GOING_SRB;
1920 		TAILQ_REMOVE(&sc->goingSRB, pSRB, link);
1921 	}
1922 	splx(intflag);
1923 
1924 	if (xs == NULL) {
1925 		return;
1926 	}
1927 
1928 	timeout_del(&xs->stimeout);
1929 
1930 	xs->status = pSRB->TargetStatus;
1931 	if (xs->datalen != 0) {
1932 		bus_dmamap_sync(sc->sc_dmatag, pSRB->dmamapxfer,
1933 		    0, pSRB->dmamapxfer->dm_mapsize,
1934 		    (xs->flags & SCSI_DATA_IN) ? BUS_DMASYNC_POSTREAD :
1935 		    BUS_DMASYNC_POSTWRITE);
1936 		bus_dmamap_unload(sc->sc_dmatag, pSRB->dmamapxfer);
1937 	}
1938 
1939 	switch (xs->status) {
1940 	case SCSI_INTERM_COND_MET:
1941 	case SCSI_COND_MET:
1942 	case SCSI_INTERM:
1943 	case SCSI_OK:
1944 		switch (pSRB->AdaptStatus) {
1945 		case TRM_STATUS_GOOD:
1946 			if ((pSRB->SRBFlag & TRM_PARITY_ERROR) != 0) {
1947 #ifdef TRM_DEBUG0
1948 				sc_print_addr(xs->sc_link);
1949 				printf(" trm_FinishSRB. TRM_PARITY_ERROR\n");
1950 #endif
1951 				xs->error = XS_DRIVER_STUFFUP;
1952 
1953 			} else if ((pSRB->SRBFlag & TRM_SCSI_TIMED_OUT) != 0) {
1954 				if ((pSRB->SRBFlag & TRM_AUTO_REQSENSE) == 0)
1955 					xs->error = XS_TIMEOUT;
1956 				else {
1957 					bzero(&xs->sense, sizeof(xs->sense));
1958 					xs->status = SCSI_CHECK;
1959 					xs->error  = XS_SENSE;
1960 				}
1961 
1962 			} else if ((pSRB->SRBFlag & TRM_AUTO_REQSENSE) != 0) {
1963 				s1 = &pSRB->scsisense;
1964 				s2 = &xs->sense;
1965 
1966 				*s2 = *s1;
1967 
1968 				xs->status = SCSI_CHECK;
1969 				xs->error  = XS_SENSE;
1970 
1971 			} else
1972 				xs->error = XS_NOERROR;
1973 			break;
1974 
1975 		case TRM_OVER_UNDER_RUN:
1976 #ifdef TRM_DEBUG0
1977 			sc_print_addr(xs->sc_link);
1978 			printf("trm_FinishSRB. TRM_OVER_UNDER_RUN\n");
1979 #endif
1980 			xs->error = XS_DRIVER_STUFFUP;
1981 			break;
1982 
1983 		default:
1984 #ifdef TRM_DEBUG0
1985 			sc_print_addr(xs->sc_link);
1986 			printf("trm_FinishSRB. AdaptStatus Error = 0x%02x\n",
1987 			    pSRB->AdaptStatus);
1988 #endif
1989 			xs->error = XS_DRIVER_STUFFUP;
1990 			break;
1991 		}
1992 		break;
1993 
1994 	case SCSI_TERMINATED:
1995 	case SCSI_ACA_ACTIVE:
1996 	case SCSI_CHECK:
1997 		if ((pSRB->SRBFlag & TRM_AUTO_REQSENSE) != 0)
1998 			xs->error = XS_DRIVER_STUFFUP;
1999 		else {
2000 			trm_RequestSense(sc, pSRB);
2001 			return;
2002 		}
2003 		break;
2004 
2005 	case SCSI_QUEUE_FULL:
2006 		/* this says no more until someone completes */
2007 		pDCB->DCBFlag |= TRM_QUEUE_FULL;
2008 		trm_RewaitSRB(sc, pSRB);
2009 		return;
2010 
2011 	case SCSI_RESV_CONFLICT:
2012 	case SCSI_BUSY:
2013 		xs->error = XS_BUSY;
2014 		break;
2015 
2016 	case TRM_SCSI_UNEXP_BUS_FREE:
2017 		xs->status = SCSI_OK;
2018 		xs->error  = XS_DRIVER_STUFFUP;
2019 		break;
2020 
2021 	case TRM_SCSI_BUS_RST_DETECTED:
2022 		xs->status = SCSI_OK;
2023 		xs->error  = XS_RESET;
2024 		break;
2025 
2026 	case TRM_SCSI_SELECT_TIMEOUT:
2027 		xs->status = SCSI_OK;
2028 		xs->error  = XS_SELTIMEOUT;
2029 		break;
2030 
2031 	default:
2032 		xs->error = XS_DRIVER_STUFFUP;
2033 		break;
2034 	}
2035 
2036 	target = xs->sc_link->target;
2037 	lun    = xs->sc_link->lun;
2038 
2039 	if ((xs->flags & SCSI_POLL) != 0) {
2040 
2041 		if (xs->cmd.opcode == INQUIRY && pDCB->sc_link == NULL) {
2042 
2043 			ptr = (struct scsi_inquiry_data *) xs->data;
2044 
2045 			if ((xs->error != XS_NOERROR) ||
2046 			    ((ptr->device & SID_QUAL_BAD_LU) == SID_QUAL_BAD_LU)) {
2047 #ifdef TRM_DEBUG0
2048 				sc_print_addr(xs->sc_link);
2049 				printf("trm_FinishSRB NO Device\n");
2050 #endif
2051 				free(pDCB, M_DEVBUF, 0);
2052 				sc->pDCB[target][lun] = NULL;
2053 				pDCB = NULL;
2054 
2055 			} else
2056 				pDCB->sc_link = xs->sc_link;
2057 		}
2058 	}
2059 
2060 	/*
2061 	 * Notify cmd done
2062 	 */
2063 #ifdef TRM_DEBUG0
2064 	if ((xs->error != 0) || (xs->status != 0) ||
2065 	    ((xs->flags & SCSI_POLL) != 0)) {
2066 		sc_print_addr(xs->sc_link);
2067 		printf("trm_FinishSRB. xs->cmd.opcode = 0x%02x, xs->error = %d, xs->status = %d\n",
2068 		    xs->cmd.opcode, xs->error, xs->status);
2069 	}
2070 #endif
2071 
2072 	if (ISSET(xs->flags, SCSI_POLL))
2073 		SET(xs->flags, ITSDONE);
2074 	else
2075 		scsi_done(xs);
2076 }
2077 
2078 /*
2079  * ------------------------------------------------------------
2080  * Function : trm_srb_reinit
2081  * Purpose  :
2082  * Inputs   :
2083  * ------------------------------------------------------------
2084  */
2085 void
2086 trm_srb_reinit(struct trm_softc *sc, struct trm_scsi_req_q *pSRB)
2087 {
2088 	bzero(&pSRB->SegmentX[0], sizeof(pSRB->SegmentX));
2089 	bzero(&pSRB->CmdBlock[0], sizeof(pSRB->CmdBlock));
2090 	bzero(&pSRB->scsisense,   sizeof(pSRB->scsisense));
2091 
2092 	pSRB->SRBTotalXferLength = 0;
2093 	pSRB->SRBSGCount         = 0;
2094 	pSRB->SRBSGIndex         = 0;
2095 	pSRB->SRBFlag            = 0;
2096 
2097 	pSRB->SRBState     = TRM_FREE;
2098 	pSRB->AdaptStatus  = TRM_STATUS_GOOD;
2099 	pSRB->TargetStatus = SCSI_OK;
2100 	pSRB->ScsiPhase    = PH_BUS_FREE; /* SCSI bus free Phase */
2101 
2102 	pSRB->xs      = NULL;
2103 	pSRB->pSRBDCB = NULL;
2104 }
2105 
2106 /*
2107  * ------------------------------------------------------------
2108  * Function : trm_srb_free
2109  * Purpose  :
2110  * Inputs   :
2111  * ------------------------------------------------------------
2112  */
2113 void
2114 trm_srb_free(void *xsc, void *xpSRB)
2115 {
2116 	struct trm_softc *sc = xsc;
2117 	struct trm_scsi_req_q *pSRB = xpSRB;
2118 
2119 	trm_srb_reinit(sc, pSRB);
2120 
2121 	if (pSRB != &sc->SRB[0]) {
2122 		mtx_enter(&sc->sc_srb_mtx);
2123 		TAILQ_INSERT_TAIL(&sc->freeSRB, pSRB, link);
2124 		mtx_leave(&sc->sc_srb_mtx);
2125 	}
2126 }
2127 
2128 /*
2129  * ------------------------------------------------------------
2130  * Function : trm_GoingSRB_Done
2131  * Purpose  :
2132  * Inputs   :
2133  * ------------------------------------------------------------
2134  */
2135 void
2136 trm_GoingSRB_Done(struct trm_softc *sc, struct trm_dcb *pDCB)
2137 {
2138 	struct trm_scsi_req_q *pSRB, *pNextSRB;
2139 
2140 	/* ASSUME we are inside a splbio()/splx() pair */
2141 
2142 	pSRB = TAILQ_FIRST(&sc->goingSRB);
2143 	while (pSRB != NULL) {
2144 		/*
2145 		 * Need to save pNextSRB because trm_FinishSRB() puts
2146 		 * pSRB in freeSRB queue, and thus its links no longer
2147 		 * point to members of the goingSRB queue. This is why
2148 		 * TAILQ_FOREACH() will not work for this traversal.
2149 		 */
2150 		pNextSRB = TAILQ_NEXT(pSRB, link);
2151 		if (pDCB == NULL || pSRB->pSRBDCB == pDCB) {
2152 			/* TODO XXXX: Is TIMED_OUT the best state to report? */
2153 			pSRB->SRBFlag |= TRM_SCSI_TIMED_OUT;
2154 			trm_FinishSRB(sc, pSRB);
2155 		}
2156 		pSRB = pNextSRB;
2157 	}
2158 }
2159 
2160 /*
2161  * ------------------------------------------------------------
2162  * Function : trm_ResetSCSIBus
2163  * Purpose  : Reset the SCSI bus
2164  * Inputs   : struct trm_softc * -
2165  * ------------------------------------------------------------
2166  */
2167 void
2168 trm_ResetSCSIBus(struct trm_softc *sc)
2169 {
2170 	const bus_space_handle_t ioh = sc->sc_iohandle;
2171 	const bus_space_tag_t iot = sc->sc_iotag;
2172 	int intflag;
2173 
2174 	intflag = splbio();
2175 
2176 	sc->sc_Flag |= RESET_DEV;
2177 
2178 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_RSTSCSI);
2179 	while ((bus_space_read_2(iot, ioh,
2180 	    TRM_S1040_SCSI_INTSTATUS) & INT_SCSIRESET) == 0);
2181 
2182 	splx(intflag);
2183 }
2184 
2185 /*
2186  * ------------------------------------------------------------
2187  * Function : trm_ScsiRstDetect
2188  * Purpose  :
2189  * Inputs   :
2190  * ------------------------------------------------------------
2191  */
2192 void
2193 trm_ScsiRstDetect(struct trm_softc *sc)
2194 {
2195 	const bus_space_handle_t ioh = sc->sc_iohandle;
2196 	const bus_space_tag_t iot = sc->sc_iotag;
2197 	int wlval;
2198 
2199 #ifdef TRM_DEBUG0
2200 	printf("%s: trm_ScsiRstDetect\n", sc->sc_device.dv_xname);
2201 #endif
2202 
2203 	wlval = 1000;
2204 	/*
2205 	 * delay 1 sec
2206 	 */
2207 	while (--wlval != 0)
2208 		DELAY(1000);
2209 
2210 	bus_space_write_1(iot, ioh, TRM_S1040_DMA_CONTROL, STOPDMAXFER);
2211 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO);
2212 
2213 	if ((sc->sc_Flag & RESET_DEV) != 0)
2214 		sc->sc_Flag |= RESET_DONE;
2215 	else {
2216 		sc->sc_Flag |= RESET_DETECT;
2217 		trm_ResetAllDevParam(sc);
2218 		trm_RecoverSRB(sc);
2219 		sc->pActiveDCB = NULL;
2220 		sc->sc_Flag = 0;
2221 		trm_StartWaitingSRB(sc);
2222 	}
2223 }
2224 
2225 /*
2226  * ------------------------------------------------------------
2227  * Function : trm_RequestSense
2228  * Purpose  :
2229  * Inputs   :
2230  * ------------------------------------------------------------
2231  */
2232 void
2233 trm_RequestSense(struct trm_softc *sc, struct trm_scsi_req_q *pSRB)
2234 {
2235 	pSRB->SRBFlag |= TRM_AUTO_REQSENSE;
2236 
2237 	/*
2238 	 * Status of initiator/target
2239 	 */
2240 	pSRB->AdaptStatus  = TRM_STATUS_GOOD;
2241 	pSRB->TargetStatus = SCSI_OK;
2242 	/*
2243 	 * Status of initiator/target
2244 	 */
2245 
2246 	pSRB->SegmentX[0].address = pSRB->scsisensePhyAddr;
2247 	pSRB->SegmentX[0].length  = sizeof(struct scsi_sense_data);
2248 	pSRB->SRBTotalXferLength  = sizeof(struct scsi_sense_data);
2249 	pSRB->SRBSGCount          = 1;
2250 	pSRB->SRBSGIndex          = 0;
2251 
2252 	bzero(&pSRB->CmdBlock[0], sizeof(pSRB->CmdBlock));
2253 
2254 	pSRB->CmdBlock[0] = REQUEST_SENSE;
2255 	pSRB->CmdBlock[1] = (pSRB->xs->sc_link->lun) << 5;
2256 	pSRB->CmdBlock[4] = sizeof(struct scsi_sense_data);
2257 
2258 	pSRB->ScsiCmdLen = 6;
2259 
2260 	if ((pSRB->xs != NULL) && ((pSRB->xs->flags & SCSI_POLL) == 0))
2261 		timeout_add_msec(&pSRB->xs->stimeout, pSRB->xs->timeout);
2262 
2263 	if (trm_StartSRB(sc, pSRB) != 0)
2264 		trm_RewaitSRB(sc, pSRB);
2265 }
2266 
2267 /*
2268  * ------------------------------------------------------------
2269  * Function : trm_EnableMsgOut
2270  * Purpose  : set up MsgBuf to send out a single byte message
2271  * Inputs   :
2272  * ------------------------------------------------------------
2273  */
2274 void
2275 trm_EnableMsgOut(struct trm_softc *sc, u_int8_t msg)
2276 {
2277 	sc->MsgBuf[0] = msg;
2278 	sc->MsgCnt    = 1;
2279 
2280 	bus_space_write_2(sc->sc_iotag, sc->sc_iohandle, TRM_S1040_SCSI_CONTROL, DO_SETATN);
2281 }
2282 
2283 /*
2284  * ------------------------------------------------------------
2285  * Function : trm_linkSRB
2286  * Purpose  :
2287  * Inputs   :
2288  * ------------------------------------------------------------
2289  */
2290 void
2291 trm_linkSRB(struct trm_softc *sc)
2292 {
2293 	struct trm_scsi_req_q *pSRB;
2294 	int i, intflag;
2295 
2296 	intflag = splbio();
2297 
2298 	for (i = 0; i < TRM_MAX_SRB_CNT; i++) {
2299 		pSRB = &sc->SRB[i];
2300 
2301 		pSRB->PhysSRB = sc->sc_dmamap_control->dm_segs[0].ds_addr
2302 			+ i * sizeof(struct trm_scsi_req_q);
2303 
2304 		pSRB->SRBSGPhyAddr = sc->sc_dmamap_control->dm_segs[0].ds_addr
2305 			+ i * sizeof(struct trm_scsi_req_q)
2306 			+ offsetof(struct trm_scsi_req_q, SegmentX);
2307 
2308 		pSRB->scsisensePhyAddr = sc->sc_dmamap_control->dm_segs[0].ds_addr
2309 			+ i * sizeof(struct trm_scsi_req_q)
2310 			+ offsetof(struct trm_scsi_req_q, scsisense);
2311 
2312 		/*
2313 		 * map all SRB space
2314 		 */
2315 		if (bus_dmamap_create(sc->sc_dmatag, TRM_MAX_PHYSG_BYTE,
2316 		    TRM_MAX_SG_LISTENTRY, TRM_MAX_PHYSG_BYTE, 0,
2317 		    BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
2318 		    &pSRB->dmamapxfer) != 0) {
2319 			printf("%s: unable to create DMA transfer map\n",
2320 			    sc->sc_device.dv_xname);
2321 			splx(intflag);
2322 			return;
2323 		}
2324 
2325 		if (i > 0)
2326 			/* We use sc->SRB[0] directly, so *don't* link it */
2327 			TAILQ_INSERT_TAIL(&sc->freeSRB, pSRB, link);
2328 #ifdef TRM_DEBUG0
2329 		printf("pSRB = %p ", pSRB);
2330 #endif
2331 	}
2332 #ifdef TRM_DEBUG0
2333 	printf("\n ");
2334 #endif
2335 	splx(intflag);
2336 }
2337 
2338 /*
2339  * ------------------------------------------------------------
2340  * Function : trm_initACB
2341  * Purpose  : initialize the internal structures for a given SCSI host
2342  * Inputs   :
2343  * ------------------------------------------------------------
2344  */
2345 void
2346 trm_initACB(struct trm_softc *sc, int unit)
2347 {
2348 	const bus_space_handle_t ioh = sc->sc_iohandle;
2349 	const bus_space_tag_t iot = sc->sc_iotag;
2350 	struct trm_adapter_nvram *pEEpromBuf;
2351 	struct trm_dcb *pDCB;
2352 	int target, lun;
2353 
2354 	pEEpromBuf = &trm_eepromBuf[unit];
2355 	sc->sc_config = HCC_AUTOTERM | HCC_PARITY;
2356 
2357 	if ((bus_space_read_1(iot, ioh, TRM_S1040_GEN_STATUS) & WIDESCSI) != 0)
2358 		sc->sc_config |= HCC_WIDE_CARD;
2359 
2360 	if ((pEEpromBuf->NvramChannelCfg & NAC_POWERON_SCSI_RESET) != 0)
2361 		sc->sc_config |= HCC_SCSI_RESET;
2362 
2363 	TAILQ_INIT(&sc->freeSRB);
2364 	TAILQ_INIT(&sc->waitingSRB);
2365 	TAILQ_INIT(&sc->goingSRB);
2366 
2367 	mtx_init(&sc->sc_srb_mtx, IPL_BIO);
2368 	scsi_iopool_init(&sc->sc_iopool, sc, trm_srb_alloc, trm_srb_free);
2369 
2370 	sc->pActiveDCB     = NULL;
2371 	sc->sc_AdapterUnit = unit;
2372 	sc->sc_AdaptSCSIID = pEEpromBuf->NvramScsiId;
2373 	sc->sc_TagMaxNum   = 2 << pEEpromBuf->NvramMaxTag;
2374 	sc->sc_Flag        = 0;
2375 
2376 	/*
2377 	 * put all SRB's (except [0]) onto the freeSRB list
2378 	 */
2379 	trm_linkSRB(sc);
2380 
2381 	/*
2382 	 * allocate DCB array
2383 	 */
2384 	for (target = 0; target < TRM_MAX_TARGETS; target++) {
2385 		if (target == sc->sc_AdaptSCSIID)
2386 			continue;
2387 
2388 		for (lun = 0; lun < TRM_MAX_LUNS; lun++) {
2389 			pDCB = (struct trm_dcb *)malloc(sizeof(struct trm_dcb),
2390 			    M_DEVBUF, M_NOWAIT | M_ZERO);
2391 			sc->pDCB[target][lun] = pDCB;
2392 
2393 			if (pDCB == NULL)
2394 				continue;
2395 
2396 			pDCB->target     = target;
2397 			pDCB->lun        = lun;
2398 			pDCB->pActiveSRB = NULL;
2399 		}
2400 	}
2401 
2402 	trm_reset(sc);
2403 }
2404 
2405 /*
2406  * ------------------------------------------------------------
2407  * Function     : trm_write_all
2408  * Description  : write pEEpromBuf 128 bytes to seeprom
2409  * Input        : iot, ioh - chip's base address
2410  * Output       : none
2411  * ------------------------------------------------------------
2412  */
2413 void
2414 trm_write_all(struct trm_adapter_nvram *pEEpromBuf,  bus_space_tag_t iot,
2415     bus_space_handle_t ioh)
2416 {
2417 	u_int8_t *bpEeprom = (u_int8_t *)pEEpromBuf;
2418 	u_int8_t  bAddr;
2419 
2420 	/*
2421 	 * Enable SEEPROM
2422 	 */
2423 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_CONTROL,
2424 	    (bus_space_read_1(iot, ioh, TRM_S1040_GEN_CONTROL) | EN_EEPROM));
2425 	/*
2426 	 * Write enable
2427 	 */
2428 	trm_write_cmd(iot, ioh, 0x04, 0xFF);
2429 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 0);
2430 	trm_wait_30us(iot, ioh);
2431 	for (bAddr = 0; bAddr < 128; bAddr++, bpEeprom++)
2432 		trm_set_data(iot, ioh, bAddr, *bpEeprom);
2433 	/*
2434 	 * Write disable
2435 	 */
2436 	trm_write_cmd(iot, ioh, 0x04, 0x00);
2437 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 0);
2438 	trm_wait_30us(iot, ioh);
2439 	/*
2440 	 * Disable SEEPROM
2441 	 */
2442 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_CONTROL,
2443 	    (bus_space_read_1(iot, ioh, TRM_S1040_GEN_CONTROL) & ~EN_EEPROM));
2444 }
2445 
2446 /*
2447  * ------------------------------------------------------------
2448  * Function     : trm_set_data
2449  * Description  : write one byte to seeprom
2450  * Input        : iot, ioh - chip's base address
2451  *                  bAddr - address of SEEPROM
2452  *                  bData - data of SEEPROM
2453  * Output       : none
2454  * ------------------------------------------------------------
2455  */
2456 void
2457 trm_set_data(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t bAddr,
2458     u_int8_t bData)
2459 {
2460 	u_int8_t bSendData;
2461 	int i;
2462 
2463 	/*
2464 	 * Send write command & address
2465 	 */
2466 	trm_write_cmd(iot, ioh, 0x05, bAddr);
2467 	/*
2468 	 * Write data
2469 	 */
2470 	for (i = 0; i < 8; i++, bData <<= 1) {
2471 		bSendData = NVR_SELECT;
2472 		if ((bData & 0x80) != 0) {      /* Start from bit 7    */
2473 			bSendData |= NVR_BITOUT;
2474 		}
2475 		bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, bSendData);
2476 		trm_wait_30us(iot, ioh);
2477 		bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM,
2478 		    (bSendData | NVR_CLOCK));
2479 		trm_wait_30us(iot, ioh);
2480 	}
2481 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, NVR_SELECT);
2482 	trm_wait_30us(iot, ioh);
2483 	/*
2484 	 * Disable chip select
2485 	 */
2486 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 0);
2487 	trm_wait_30us(iot, ioh);
2488 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, NVR_SELECT);
2489 	trm_wait_30us(iot, ioh);
2490 	/*
2491 	 * Wait for write ready
2492 	 */
2493 	for (;;) {
2494 		bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM,
2495 		    (NVR_SELECT | NVR_CLOCK));
2496 		trm_wait_30us(iot, ioh);
2497 		bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, NVR_SELECT);
2498 		trm_wait_30us(iot, ioh);
2499 		if (bus_space_read_1(iot, ioh, TRM_S1040_GEN_NVRAM) & NVR_BITIN)
2500 			break;
2501 	}
2502 	/*
2503 	 * Disable chip select
2504 	 */
2505 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 0);
2506 }
2507 
2508 /*
2509  * ------------------------------------------------------------
2510  * Function     : trm_read_all
2511  * Description  : read seeprom 128 bytes to pEEpromBuf
2512  * Input        : pEEpromBuf, iot, ioh - chip's base address
2513  * Output       : none
2514  * ------------------------------------------------------------
2515  */
2516 void
2517 trm_read_all(struct trm_adapter_nvram *pEEpromBuf,  bus_space_tag_t iot,
2518     bus_space_handle_t ioh)
2519 {
2520 	u_int8_t *bpEeprom = (u_int8_t *)pEEpromBuf;
2521 	u_int8_t  bAddr;
2522 
2523 	/*
2524 	 * Enable SEEPROM
2525 	 */
2526 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_CONTROL,
2527 	    (bus_space_read_1(iot, ioh, TRM_S1040_GEN_CONTROL) | EN_EEPROM));
2528 
2529 	for (bAddr = 0; bAddr < 128; bAddr++, bpEeprom++)
2530 		*bpEeprom = trm_get_data(iot, ioh, bAddr);
2531 
2532 	/*
2533 	 * Disable SEEPROM
2534 	 */
2535 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_CONTROL,
2536 	    (bus_space_read_1(iot, ioh, TRM_S1040_GEN_CONTROL) & ~EN_EEPROM));
2537 }
2538 
2539 /*
2540  * ------------------------------------------------------------
2541  * Function     : trm_get_data
2542  * Description  : read one byte from seeprom
2543  * Input        : iot, ioh - chip's base address
2544  *                     bAddr - address of SEEPROM
2545  * Output       : bData - data of SEEPROM
2546  * ------------------------------------------------------------
2547  */
2548 u_int8_t
2549 trm_get_data( bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t bAddr)
2550 {
2551 	u_int8_t bReadData, bData;
2552 	int i;
2553 
2554 	bData = 0;
2555 
2556 	/*
2557 	 * Send read command & address
2558 	 */
2559 	trm_write_cmd(iot, ioh, 0x06, bAddr);
2560 
2561 	for (i = 0; i < 8; i++) {
2562 		/*
2563 		 * Read data
2564 		 */
2565 		bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM,
2566 		    (NVR_SELECT | NVR_CLOCK));
2567 		trm_wait_30us(iot, ioh);
2568 		bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, NVR_SELECT);
2569 		/*
2570 		 * Get data bit while falling edge
2571 		 */
2572 		bReadData = bus_space_read_1(iot, ioh, TRM_S1040_GEN_NVRAM);
2573 		bData <<= 1;
2574 		if ((bReadData & NVR_BITIN) != 0)
2575 			bData |= 1;
2576 		trm_wait_30us(iot, ioh);
2577 	}
2578 	/*
2579 	 * Disable chip select
2580 	 */
2581 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, 0);
2582 
2583 	return bData;
2584 }
2585 
2586 /*
2587  * ------------------------------------------------------------
2588  * Function     : trm_wait_30us
2589  * Description  : wait 30 us
2590  * Input        : iot, ioh - chip's base address
2591  * Output       : none
2592  * ------------------------------------------------------------
2593  */
2594 void
2595 trm_wait_30us(bus_space_tag_t iot, bus_space_handle_t ioh)
2596 {
2597 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_TIMER, 5);
2598 
2599 	while ((bus_space_read_1(iot, ioh, TRM_S1040_GEN_STATUS) & GTIMEOUT)
2600 	    == 0);
2601 }
2602 
2603 /*
2604  * ------------------------------------------------------------
2605  * Function     : trm_write_cmd
2606  * Description  : write SB and Op Code into seeprom
2607  * Input        : iot, ioh - chip's base address
2608  *                  bCmd     - SB + Op Code
2609  *                  bAddr    - address of SEEPROM
2610  * Output       : none
2611  * ------------------------------------------------------------
2612  */
2613 void
2614 trm_write_cmd( bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t bCmd,
2615     u_int8_t bAddr)
2616 {
2617 	u_int8_t bSendData;
2618 	int i;
2619 
2620 	for (i = 0; i < 3; i++, bCmd <<= 1) {
2621 		/*
2622 		 * Program SB + OP code
2623 		 */
2624 		bSendData = NVR_SELECT;
2625 		if (bCmd & 0x04)        /* Start from bit 2        */
2626 			bSendData |= NVR_BITOUT;
2627 		bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, bSendData);
2628 		trm_wait_30us(iot, ioh);
2629 		bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM,
2630 		    (bSendData | NVR_CLOCK));
2631 		trm_wait_30us(iot, ioh);
2632 	}
2633 
2634 	for (i = 0; i < 7; i++, bAddr <<= 1) {
2635 		/*
2636 		 * Program address
2637 		 */
2638 		bSendData = NVR_SELECT;
2639 		if (bAddr & 0x40) {        /* Start from bit 6        */
2640 			bSendData |= NVR_BITOUT;
2641 		}
2642 		bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, bSendData);
2643 		trm_wait_30us(iot, ioh);
2644 		bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM,
2645 		    (bSendData | NVR_CLOCK));
2646 		trm_wait_30us(iot, ioh);
2647 	}
2648 	bus_space_write_1(iot, ioh, TRM_S1040_GEN_NVRAM, NVR_SELECT);
2649 	trm_wait_30us(iot, ioh);
2650 }
2651 
2652 /*
2653  * ------------------------------------------------------------
2654  * Function     : trm_check_eeprom
2655  * Description  : read eeprom 128 bytes to pEEpromBuf and check
2656  *                  checksum. If it is wrong, updated with default value.
2657  * Input        : eeprom, iot, ioh - chip's base address
2658  * Output       : none
2659  * ------------------------------------------------------------
2660  */
2661 void
2662 trm_check_eeprom(struct trm_adapter_nvram *pEEpromBuf, bus_space_tag_t iot,
2663     bus_space_handle_t ioh)
2664 {
2665 	u_int32_t *dpEeprom = (u_int32_t *)pEEpromBuf->NvramTarget;
2666 	u_int32_t  dAddr;
2667 	u_int16_t *wpEeprom = (u_int16_t *)pEEpromBuf;
2668 	u_int16_t  wAddr, wCheckSum;
2669 
2670 #ifdef TRM_DEBUG0
2671 	printf("\ntrm_check_eeprom\n");
2672 #endif
2673 	trm_read_all(pEEpromBuf, iot, ioh);
2674 	wCheckSum = 0;
2675 	for (wAddr = 0; wAddr < 64; wAddr++, wpEeprom++)
2676 		wCheckSum += *wpEeprom;
2677 
2678 	if (wCheckSum != 0x1234) {
2679 #ifdef TRM_DEBUG0
2680 		printf("TRM_S1040 EEPROM Check Sum ERROR (load default)\n");
2681 #endif
2682 		/*
2683 		 * Checksum error, load default
2684 		 */
2685 		pEEpromBuf->NvramSubVendorID[0] = (u_int8_t)PCI_VENDOR_TEKRAM2;
2686 		pEEpromBuf->NvramSubVendorID[1] = (u_int8_t)(PCI_VENDOR_TEKRAM2
2687 		    >> 8);
2688 		pEEpromBuf->NvramSubSysID[0] = (u_int8_t)
2689 		    PCI_PRODUCT_TEKRAM2_DC3X5U;
2690 		pEEpromBuf->NvramSubSysID[1] = (u_int8_t)
2691 		    (PCI_PRODUCT_TEKRAM2_DC3X5U >> 8);
2692 		pEEpromBuf->NvramSubClass    = 0;
2693 		pEEpromBuf->NvramVendorID[0] = (u_int8_t)PCI_VENDOR_TEKRAM2;
2694 		pEEpromBuf->NvramVendorID[1] = (u_int8_t)(PCI_VENDOR_TEKRAM2
2695 		    >> 8);
2696 		pEEpromBuf->NvramDeviceID[0] = (u_int8_t)
2697 		    PCI_PRODUCT_TEKRAM2_DC3X5U;
2698 		pEEpromBuf->NvramDeviceID[1] = (u_int8_t)
2699 		    (PCI_PRODUCT_TEKRAM2_DC3X5U >> 8);
2700 		pEEpromBuf->NvramReserved    = 0;
2701 
2702 		for (dAddr = 0; dAddr < 16; dAddr++, dpEeprom++)
2703 			/*
2704 			 * NvmTarCfg3,NvmTarCfg2,NvmTarPeriod,NvmTarCfg0
2705 			 */
2706 			*dpEeprom = 0x00000077;
2707 
2708 		/*
2709 		 * NvramMaxTag,NvramDelayTime,NvramChannelCfg,NvramScsiId
2710 		 */
2711 		*dpEeprom++ = 0x04000F07;
2712 
2713 		/*
2714 		 * NvramReserved1,NvramBootLun,NvramBootTarget,NvramReserved0
2715 		 */
2716 		*dpEeprom++ = 0x00000015;
2717 		for (dAddr = 0; dAddr < 12; dAddr++, dpEeprom++)
2718 			*dpEeprom = 0;
2719 
2720 		pEEpromBuf->NvramCheckSum = 0;
2721 		for (wAddr = 0, wCheckSum =0; wAddr < 63; wAddr++, wpEeprom++)
2722 			wCheckSum += *wpEeprom;
2723 
2724 		*wpEeprom = 0x1234 - wCheckSum;
2725 		trm_write_all(pEEpromBuf, iot, ioh);
2726 	}
2727 }
2728 
2729 /*
2730  * ------------------------------------------------------------
2731  * Function : trm_initAdapter
2732  * Purpose  : initialize the SCSI chip ctrl registers
2733  * Inputs   : psh - pointer to this host adapter's structure
2734  * ------------------------------------------------------------
2735  */
2736 void
2737 trm_initAdapter(struct trm_softc *sc)
2738 {
2739 	const bus_space_handle_t ioh = sc->sc_iohandle;
2740 	const bus_space_tag_t iot = sc->sc_iotag;
2741 	u_int16_t wval;
2742 	u_int8_t bval;
2743 
2744 	/*
2745 	 * program configuration 0
2746 	 */
2747 	if ((sc->sc_config & HCC_PARITY) != 0) {
2748 		bval = PHASELATCH | INITIATOR | BLOCKRST | PARITYCHECK;
2749 	} else {
2750 		bval = PHASELATCH | INITIATOR | BLOCKRST;
2751 	}
2752 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_CONFIG0, bval);
2753 	/*
2754 	 * program configuration 1
2755 	 */
2756 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_CONFIG1, 0x13);
2757 	/*
2758 	 * 250ms selection timeout
2759 	 */
2760 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_TIMEOUT, TRM_SEL_TIMEOUT);
2761 	/*
2762 	 * Mask all the interrupt
2763 	 */
2764 	bus_space_write_1(iot, ioh, TRM_S1040_DMA_INTEN,  0);
2765 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_INTEN, 0);
2766 	/*
2767 	 * Reset SCSI module
2768 	 */
2769 	bus_space_write_2(iot, ioh, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE);
2770 	/*
2771 	 * program Host ID
2772 	 */
2773 	bval = sc->sc_AdaptSCSIID;
2774 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_HOSTID, bval);
2775 	/*
2776 	 * set ansynchronous transfer
2777 	 */
2778 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_OFFSET, 0);
2779 	/*
2780 	 * Turn LED control off
2781 	 */
2782 	wval = bus_space_read_2(iot, ioh, TRM_S1040_GEN_CONTROL) & 0x7F;
2783 	bus_space_write_2(iot, ioh, TRM_S1040_GEN_CONTROL, wval);
2784 	/*
2785 	 * DMA config
2786 	 */
2787 	wval = bus_space_read_2(iot, ioh, TRM_S1040_DMA_CONFIG) | DMA_ENHANCE;
2788 	bus_space_write_2(iot, ioh, TRM_S1040_DMA_CONFIG, wval);
2789 	/*
2790 	 * Clear pending interrupt status
2791 	 */
2792 	bus_space_read_1(iot, ioh, TRM_S1040_SCSI_INTSTATUS);
2793 	/*
2794 	 * Enable SCSI interrupts
2795 	 */
2796 	bus_space_write_1(iot, ioh, TRM_S1040_SCSI_INTEN,
2797 	    (EN_SELECT | EN_SELTIMEOUT | EN_DISCONNECT | EN_RESELECTED |
2798 		EN_SCSIRESET | EN_BUSSERVICE | EN_CMDDONE));
2799 	bus_space_write_1(iot, ioh, TRM_S1040_DMA_INTEN, EN_SCSIINTR);
2800 }
2801 
2802 /*
2803  * ------------------------------------------------------------
2804  * Function      : trm_init
2805  * Purpose       : initialize the internal structures for a given SCSI host
2806  * Inputs        : host - pointer to this host adapter's structure
2807  * Preconditions : when this function is called, the chip_type field of
2808  *                 the ACB structure MUST have been set.
2809  * ------------------------------------------------------------
2810  */
2811 int
2812 trm_init(struct trm_softc *sc, int unit)
2813 {
2814 	const bus_space_handle_t ioh = sc->sc_iohandle;
2815 	const bus_space_tag_t iot = sc->sc_iotag;
2816 	bus_dma_segment_t seg;
2817 	int error, rseg, all_srbs_size;
2818 
2819 	/*
2820 	 * EEPROM CHECKSUM
2821 	 */
2822 	trm_check_eeprom(&trm_eepromBuf[unit], iot, ioh);
2823 
2824 	/*
2825 	 * MEMORY ALLOCATE FOR ADAPTER CONTROL BLOCK
2826 	 */
2827 	/*
2828 	 * allocate the space for all SCSI control blocks (SRB) for DMA memory.
2829 	 */
2830 	all_srbs_size = TRM_MAX_SRB_CNT * sizeof(struct trm_scsi_req_q);
2831 
2832 	error = bus_dmamem_alloc(sc->sc_dmatag, all_srbs_size, NBPG, 0, &seg,
2833 	    1, &rseg, BUS_DMA_NOWAIT | BUS_DMA_ZERO);
2834 	if (error != 0) {
2835 		printf("%s: unable to allocate SCSI REQUEST BLOCKS, error = %d\n",
2836 		    sc->sc_device.dv_xname, error);
2837 		/*errx(error, "%s: unable to allocate SCSI request blocks",
2838 		    sc->sc_device.dv_xname);*/
2839 		return -1;
2840 	}
2841 
2842 	error = bus_dmamem_map(sc->sc_dmatag, &seg, rseg, all_srbs_size,
2843 	    (caddr_t *)&sc->SRB, BUS_DMA_NOWAIT|BUS_DMA_COHERENT);
2844 	if (error != 0) {
2845 		printf("%s: unable to map SCSI REQUEST BLOCKS, error = %d\n",
2846 		    sc->sc_device.dv_xname, error);
2847 		/*errx(error, "unable to map SCSI request blocks");*/
2848 		return -1;
2849 	}
2850 
2851 	error = bus_dmamap_create(sc->sc_dmatag, all_srbs_size, 1,
2852 	    all_srbs_size, 0, BUS_DMA_NOWAIT,&sc->sc_dmamap_control);
2853 	if (error != 0) {
2854 		printf("%s: unable to create SRB DMA maps, error = %d\n",
2855 		    sc->sc_device.dv_xname, error);
2856 		/*errx(error, "unable to create SRB DMA maps");*/
2857 		return -1;
2858 	}
2859 
2860 	error = bus_dmamap_load(sc->sc_dmatag, sc->sc_dmamap_control,
2861 	    sc->SRB, all_srbs_size, NULL, BUS_DMA_NOWAIT);
2862 	if (error != 0) {
2863 		printf("%s: unable to load SRB DMA maps, error = %d\n",
2864 		    sc->sc_device.dv_xname, error);
2865 		/*errx(error, "unable to load SRB DMA maps");*/
2866 		return -1;
2867 	}
2868 #ifdef TRM_DEBUG0
2869 	printf("\n\n%s: all_srbs_size=%x\n",
2870 	    sc->sc_device.dv_xname, all_srbs_size);
2871 #endif
2872 	trm_initACB(sc, unit);
2873 	trm_initAdapter(sc);
2874 
2875 	return 0;
2876 }
2877 
2878 /* ------------------------------------------------------------
2879  * Function : trm_print_info
2880  * Purpose  : Print the DCB negotiation information
2881  * Inputs   :
2882  * ------------------------------------------------------------
2883  */
2884 void
2885 trm_print_info(struct trm_softc *sc, struct trm_dcb *pDCB)
2886 {
2887 	int syncXfer, index;
2888 
2889 	index = pDCB->SyncPeriod & ~(WIDE_SYNC | ALT_SYNC);
2890 
2891 	printf("%s: target %d using ", sc->sc_device.dv_xname, pDCB->target);
2892 	if ((pDCB->SyncPeriod & WIDE_SYNC) != 0)
2893 		printf("16 bit ");
2894 	else
2895 		printf("8 bit ");
2896 
2897 	if (pDCB->SyncOffset == 0)
2898 		printf("Asynchronous ");
2899 	else {
2900 		syncXfer = 100000 / (trm_clock_period[index] * 4);
2901 		printf("%d.%01d MHz, Offset %d ",
2902 		    syncXfer / 100, syncXfer % 100, pDCB->SyncOffset);
2903 	}
2904 	printf("data transfers ");
2905 
2906 	if ((pDCB->DCBFlag & TRM_USE_TAG_QUEUING) != 0)
2907 		printf("with Tag Queuing");
2908 
2909 	printf("\n");
2910 }
2911