xref: /dragonfly/sys/dev/disk/trm/trm.c (revision 521a7b05)
1 /*
2  *       O.S   : FreeBSD CAM
3  *	FILE NAME  : trm.c
4  *	     BY    : C.L. Huang 	(ching@tekram.com.tw)
5  *               Erich Chen     (erich@tekram.com.tw)
6  *	Description: Device Driver for Tekram DC395U/UW/F ,DC315/U
7  *		         PCI SCSI Bus Master Host Adapter
8  *               (SCSI chip set used Tekram ASIC TRM-S1040)
9  * (C)Copyright 1995-1999 Tekram Technology Co., Ltd.
10  */
11 
12 /*
13  *	HISTORY:
14  *
15  *	REV#	DATE	NAME    	DESCRIPTION
16  *  1.05   05/01/1999  ERICH CHEN  First released for 3.x.x (CAM)
17  *  1.06   07/29/1999  ERICH CHEN  Modify for NEW PCI
18  *  1.07   12/12/1999  ERICH CHEN  Modify for 3.3.x ,DCB no free
19  *  1.08   06/12/2000  ERICH CHEN  Modify for 4.x.x
20  */
21 
22 /*
23  *
24  *
25  * Redistribution and use in source and binary forms, with or without
26  * modification, are permitted provided that the following conditions
27  * are met:
28  * 1. Redistributions of source code must retain the above copyright
29  *    notice, this list of conditions and the following disclaimer.
30  * 2. Redistributions in binary form must reproduce the above copyright
31  *    notice, this list of conditions and the following disclaimer in the
32  *    documentation and/or other materials provided with the distribution.
33  * 3. The name of the author may not be used to endorse or promote products
34  *    derived from this software without specific prior written permission.
35  *
36  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
37  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
39  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
40  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
42  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
43  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
44  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
45  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46  *
47  * $FreeBSD: src/sys/dev/trm/trm.c,v 1.2.2.2 2002/12/19 20:34:45 cognet Exp $
48  * $DragonFly: src/sys/dev/disk/trm/trm.c,v 1.14 2006/12/22 23:26:17 swildner Exp $
49  */
50 
51 /*
52  * Imported into FreeBSD source repository, and updated to compile under
53  * FreeBSD-3.0-DEVELOPMENT, by Stefan Esser <se@FreeBSD.Org>, 1996-12-17
54  */
55 
56 /*
57  * Updated to compile under FreeBSD 5.0-CURRENT by Olivier Houchard
58  * <doginou@ci0.org>, 2002-03-04
59  */
60 
61 #include <sys/param.h>
62 
63 #include <sys/systm.h>
64 #include <sys/malloc.h>
65 #include <sys/queue.h>
66 #if defined(__FreeBSD__) && __FreeBSD_version >= 500000
67 #include <sys/bio.h>
68 #endif
69 #include <sys/buf.h>
70 #include <sys/bus.h>
71 #include <sys/kernel.h>
72 #include <sys/thread2.h>
73 
74 #include <vm/vm.h>
75 #include <vm/pmap.h>
76 
77 #include <bus/pci/pcivar.h>
78 #include <bus/pci/pcireg.h>
79 #include <machine/clock.h>
80 #include <sys/rman.h>
81 
82 #include <bus/cam/cam.h>
83 #include <bus/cam/cam_ccb.h>
84 #include <bus/cam/cam_sim.h>
85 #include <bus/cam/cam_xpt_sim.h>
86 #include <bus/cam/cam_debug.h>
87 
88 #include <bus/cam/scsi/scsi_all.h>
89 
90 #include "trm.h"
91 
92 #define trm_reg_read8(reg)	bus_space_read_1(pACB->tag, pACB->bsh, reg)
93 #define trm_reg_read16(reg)	bus_space_read_2(pACB->tag, pACB->bsh, reg)
94 #define trm_reg_read32(reg)	bus_space_read_4(pACB->tag, pACB->bsh, reg)
95 #define trm_reg_write8(value,reg)	bus_space_write_1(pACB->tag, pACB->bsh,\
96 		reg, value)
97 #define trm_reg_write16(value,reg)	bus_space_write_2(pACB->tag, pACB->bsh,\
98 		reg, value)
99 #define trm_reg_write32(value,reg)	bus_space_write_4(pACB->tag, pACB->bsh,\
100 		reg, value)
101 
102 #define PCI_Vendor_ID_TEKRAM	0x1DE1
103 #define PCI_Device_ID_TRM_S1040	0x0391
104 #define PCI_DEVICEID_TRMS1040	0x03911DE1
105 
106 #ifdef trm_DEBUG1
107 #define TRM_DPRINTF(fmt, arg...) kprintf("trm: " fmt, ##arg)
108 #else
109 #define TRM_DPRINTF(fmt, arg...) {}
110 #endif /* TRM_DEBUG */
111 
112 static void	trm_check_eeprom(PNVRAMTYPE pEEpromBuf,PACB pACB);
113 static void	TRM_read_all(PNVRAMTYPE pEEpromBuf,PACB pACB);
114 static u_int8_t	TRM_get_data(PACB pACB, u_int8_t bAddr);
115 static void	TRM_write_all(PNVRAMTYPE pEEpromBuf,PACB pACB);
116 static void	TRM_set_data(PACB pACB, u_int8_t bAddr, u_int8_t bData);
117 static void	TRM_write_cmd(PACB pACB, u_int8_t bCmd, u_int8_t bAddr);
118 static void	TRM_wait_30us(PACB pACB);
119 
120 static void	trm_Interrupt(void *vpACB);
121 static void	trm_DataOutPhase0(PACB pACB, PSRB pSRB,
122 					 u_int8_t * pscsi_status);
123 static void	trm_DataInPhase0(PACB pACB, PSRB pSRB,
124 					u_int8_t * pscsi_status);
125 static void	trm_CommandPhase0(PACB pACB, PSRB pSRB,
126 					 u_int8_t * pscsi_status);
127 static void	trm_StatusPhase0(PACB pACB, PSRB pSRB,
128 					u_int8_t * pscsi_status);
129 static void	trm_MsgOutPhase0(PACB pACB, PSRB pSRB,
130 					u_int8_t * pscsi_status);
131 static void	trm_MsgInPhase0(PACB pACB, PSRB pSRB,
132 					u_int8_t * pscsi_status);
133 static void	trm_DataOutPhase1(PACB pACB, PSRB pSRB,
134 					 u_int8_t * pscsi_status);
135 static void	trm_DataInPhase1(PACB pACB, PSRB pSRB,
136 					u_int8_t * pscsi_status);
137 static void	trm_CommandPhase1(PACB pACB, PSRB pSRB,
138 					 u_int8_t * pscsi_status);
139 static void	trm_StatusPhase1(PACB pACB, PSRB pSRB,
140 					u_int8_t * pscsi_status);
141 static void	trm_MsgOutPhase1(PACB pACB, PSRB pSRB,
142 					u_int8_t * pscsi_status);
143 static void	trm_MsgInPhase1(PACB pACB, PSRB pSRB,
144 					u_int8_t * pscsi_status);
145 static void	trm_Nop0(PACB pACB, PSRB pSRB, u_int8_t * pscsi_status);
146 static void	trm_Nop1(PACB pACB, PSRB pSRB, u_int8_t * pscsi_status);
147 static void	trm_SetXferRate(PACB pACB, PSRB pSRB,PDCB pDCB);
148 static void	trm_DataIO_transfer(PACB pACB, PSRB pSRB, u_int16_t ioDir);
149 static void	trm_Disconnect(PACB pACB);
150 static void	trm_Reselect(PACB pACB);
151 static void	trm_SRBdone(PACB pACB, PDCB pDCB, PSRB pSRB);
152 static void	trm_DoingSRB_Done(PACB pACB);
153 static void	trm_ScsiRstDetect(PACB pACB);
154 static void	trm_ResetSCSIBus(PACB pACB);
155 static void	trm_RequestSense(PACB pACB, PDCB pDCB, PSRB pSRB);
156 static void	trm_EnableMsgOutAbort2(PACB pACB, PSRB pSRB);
157 static void	trm_EnableMsgOutAbort1(PACB pACB, PSRB pSRB);
158 static void	trm_SendSRB(PACB pACB, PSRB pSRB);
159 static int	trm_probe(device_t tag);
160 static int	trm_attach(device_t tag);
161 static void	trm_reset(PACB pACB);
162 
163 static u_int16_t	trm_StartSCSI(PACB pACB, PDCB pDCB, PSRB pSRB);
164 
165 static int	trm_initAdapter(PACB pACB, u_int16_t unit,
166     					device_t pci_config_id);
167 static void	trm_initDCB(PACB pACB, PDCB pDCB, u_int16_t unit,
168     					u_int32_t i, u_int32_t j);
169 static void	trm_initSRB(PSRB psrb);
170 static void	trm_linkSRB(PACB pACB);
171 static void	trm_initACB(PACB pACB, u_int16_t unit);
172 /* CAM SIM entry points */
173 #define ccb_trmsrb_ptr spriv_ptr0
174 #define ccb_trmacb_ptr spriv_ptr1
175 static void	trm_action(struct cam_sim *psim, union ccb *pccb);
176 static void	trm_poll(struct cam_sim *psim);
177 
178 
179 static void * trm_SCSI_phase0[] = {
180 	trm_DataOutPhase0,    /* phase:0 */
181 	trm_DataInPhase0,     /* phase:1 */
182 	trm_CommandPhase0,    /* phase:2 */
183 	trm_StatusPhase0,     /* phase:3 */
184 	trm_Nop0,             /* phase:4 */
185 	trm_Nop1,             /* phase:5 */
186 	trm_MsgOutPhase0,     /* phase:6 */
187 	trm_MsgInPhase0,      /* phase:7 */
188 };
189 
190 /*
191  *
192  *          stateV = (void *) trm_SCSI_phase1[phase]
193  *
194  */
195 static void * trm_SCSI_phase1[] = {
196 	trm_DataOutPhase1,    /* phase:0 */
197 	trm_DataInPhase1,     /* phase:1 */
198 	trm_CommandPhase1,    /* phase:2 */
199 	trm_StatusPhase1,     /* phase:3 */
200 	trm_Nop0,             /* phase:4 */
201 	trm_Nop1,             /* phase:5 */
202 	trm_MsgOutPhase1,     /* phase:6 */
203 	trm_MsgInPhase1,      /* phase:7 */
204 };
205 
206 
207 NVRAMTYPE trm_eepromBuf[MAX_ADAPTER_NUM];
208 /*
209  *Fast20:  000	 50ns, 20.0 Mbytes/s
210  *	       001	 75ns, 13.3 Mbytes/s
211  *	       010	100ns, 10.0 Mbytes/s
212  *	       011	125ns,  8.0 Mbytes/s
213  *	       100	150ns,  6.6 Mbytes/s
214  *	       101	175ns,  5.7 Mbytes/s
215  *	       110	200ns,  5.0 Mbytes/s
216  *	       111	250ns,  4.0 Mbytes/s
217  *
218  *Fast40:  000	 25ns, 40.0 Mbytes/s
219  *	       001	 50ns, 20.0 Mbytes/s
220  *	       010	 75ns, 13.3 Mbytes/s
221  *	       011	100ns, 10.0 Mbytes/s
222  *	       100	125ns,  8.0 Mbytes/s
223  *	       101	150ns,  6.6 Mbytes/s
224  *	       110	175ns,  5.7 Mbytes/s
225  *	       111	200ns,  5.0 Mbytes/s
226  */
227                                              /* real period: */
228 u_int8_t dc395x_trm_clock_period[] = {
229 	12,/*  48  ns 20   MB/sec */
230 	18,/*  72  ns 13.3 MB/sec */
231 	25,/* 100  ns 10.0 MB/sec */
232 	31,/* 124  ns  8.0 MB/sec */
233 	37,/* 148  ns  6.6 MB/sec */
234 	43,/* 172  ns  5.7 MB/sec */
235 	50,/* 200  ns  5.0 MB/sec */
236 	62 /* 248  ns  4.0 MB/sec */
237 };
238 
239 u_int8_t dc395x_trm_tinfo_sync_period[] = {
240 	12,/* 20.0 MB/sec */
241 	18,/* 13.3 MB/sec */
242 	25,/* 10.0 MB/sec */
243 	31,/*  8.0 MB/sec */
244 	37,/*  6.6 MB/sec */
245 	43,/*  5.7 MB/sec */
246 	50,/*  5.0 MB/sec */
247 	62,/*  4.0 MB/sec */
248 };
249 
250 static PSRB
251 trm_GetSRB(PACB pACB)
252 {
253 	PSRB	pSRB;
254 
255 	crit_enter();
256     	pSRB = pACB->pFreeSRB;
257 	if (pSRB) {
258 		pACB->pFreeSRB = pSRB->pNextSRB;
259 		pSRB->pNextSRB = NULL;
260 	}
261 	crit_exit();
262     	return (pSRB);
263 }
264 
265 static void
266 trm_RewaitSRB0(PDCB pDCB, PSRB pSRB)
267 {
268 	PSRB	psrb1;
269 
270 	crit_enter();
271     	if ((psrb1 = pDCB->pWaitingSRB)) {
272 		pSRB->pNextSRB = psrb1;
273 		pDCB->pWaitingSRB = pSRB;
274 	} else {
275 	  	pSRB->pNextSRB = NULL;
276 		pDCB->pWaitingSRB = pSRB;
277 		pDCB->pWaitLastSRB = pSRB;
278 	}
279 	crit_exit();
280 }
281 
282 static void
283 trm_RewaitSRB(PDCB pDCB, PSRB pSRB)
284 {
285 	PSRB	psrb1;
286 	u_int8_t	bval;
287 
288 	crit_enter();
289     	pDCB->GoingSRBCnt--;
290 	psrb1 = pDCB->pGoingSRB;
291 	if (pSRB == psrb1)
292 		pDCB->pGoingSRB = psrb1->pNextSRB;
293 	else {
294 		while (pSRB != psrb1->pNextSRB)
295 			psrb1 = psrb1->pNextSRB;
296 		psrb1->pNextSRB = pSRB->pNextSRB;
297 		if (pSRB == pDCB->pGoingLastSRB)
298 			pDCB->pGoingLastSRB = psrb1;
299 	}
300 	if ((psrb1 = pDCB->pWaitingSRB)) {
301 		pSRB->pNextSRB = psrb1;
302 		pDCB->pWaitingSRB = pSRB;
303 	} else {
304 		pSRB->pNextSRB = NULL;
305 		pDCB->pWaitingSRB = pSRB;
306 		pDCB->pWaitLastSRB = pSRB;
307 	}
308 	bval = pSRB->TagNumber;
309 	pDCB->TagMask &= (~(1 << bval));	  /* Free TAG number */
310 	crit_exit();
311 }
312 
313 static void
314 trm_DoWaitingSRB(PACB pACB)
315 {
316 	PDCB	ptr, ptr1;
317 	PSRB	pSRB;
318 
319 	crit_enter();
320     	if (!(pACB->pActiveDCB) &&
321 	    !(pACB->ACBFlag & (RESET_DETECT+RESET_DONE+RESET_DEV))) {
322 		ptr = pACB->pDCBRunRobin;
323 		if (!ptr) {
324 			ptr = pACB->pLinkDCB;
325 			pACB->pDCBRunRobin = ptr;
326 		}
327 		ptr1 = ptr;
328 		for (;ptr1 ;) {
329 			pACB->pDCBRunRobin = ptr1->pNextDCB;
330 			if (!(ptr1->MaxCommand > ptr1->GoingSRBCnt)
331 			    || !(pSRB = ptr1->pWaitingSRB)) {
332 				if (pACB->pDCBRunRobin == ptr)
333 					break;
334 				ptr1 = ptr1->pNextDCB;
335 			} else {
336 				if (!trm_StartSCSI(pACB, ptr1, pSRB)) {
337 				/*
338 				 * If trm_StartSCSI return 0 :
339 				 * current interrupt status is interrupt enable
340 				 * It's said that SCSI processor is unoccupied
341 				 */
342 					ptr1->GoingSRBCnt++;
343 					if (ptr1->pWaitLastSRB == pSRB) {
344 						ptr1->pWaitingSRB = NULL;
345 						ptr1->pWaitLastSRB = NULL;
346 					} else
347 						ptr1->pWaitingSRB = pSRB->pNextSRB;
348 					pSRB->pNextSRB = NULL;
349 					if (ptr1->pGoingSRB)
350 						ptr1->pGoingLastSRB->pNextSRB = pSRB;
351 					else
352 						ptr1->pGoingSRB = pSRB;
353 					ptr1->pGoingLastSRB = pSRB;
354 				}
355 				break;
356 			}
357 		}
358 	}
359 	crit_exit();
360 	return;
361 }
362 
363 static void
364 trm_SRBwaiting(PDCB pDCB, PSRB pSRB)
365 {
366 
367 	if (pDCB->pWaitingSRB) {
368 		pDCB->pWaitLastSRB->pNextSRB = pSRB;
369 		pDCB->pWaitLastSRB = pSRB;
370 		pSRB->pNextSRB = NULL;
371 	} else {
372 		pDCB->pWaitingSRB = pSRB;
373 		pDCB->pWaitLastSRB = pSRB;
374 	}
375 }
376 
377 static void
378 trm_ExecuteSRB(void *arg, bus_dma_segment_t *dm_segs, int nseg, int vp)
379 {
380 	PACB		pACB;
381 	PSRB		pSRB;
382 	union ccb	*ccb;
383 	u_long		totalxferlen=0;
384 
385 	pSRB = (PSRB)arg;
386 	ccb = pSRB->pccb;
387 	pACB = (PACB)ccb->ccb_h.ccb_trmacb_ptr;
388 	TRM_DPRINTF("trm_ExecuteSRB..........\n");
389 	if (nseg != 0) {
390 		PSEG			psg;
391 		bus_dma_segment_t	*end_seg;
392 		bus_dmasync_op_t	op;
393 
394 		/* Copy the segments into our SG list */
395 		end_seg = dm_segs + nseg;
396 		psg = (PSEG) &pSRB->SegmentX[0];
397 		pSRB->SRBSGListPointer= psg;
398 		while (dm_segs < end_seg) {
399 			psg->address = vp?(u_long)vtophys(dm_segs->ds_addr)
400 			  :(u_long)dm_segs->ds_addr;
401 			psg->length = (u_long)dm_segs->ds_len;
402 			totalxferlen += dm_segs->ds_len;
403 			psg++;
404 			dm_segs++;
405 		}
406 		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
407 			op = BUS_DMASYNC_PREREAD;
408 		} else {
409 			op = BUS_DMASYNC_PREWRITE;
410 		}
411 		bus_dmamap_sync(pACB->buffer_dmat, pSRB->dmamap, op);
412 	}
413 	pSRB->RetryCnt = 0;
414 	pSRB->SRBTotalXferLength=totalxferlen;
415 	pSRB->SRBSGCount = nseg;
416 	pSRB->SRBSGIndex = 0;
417 	pSRB->AdaptStatus = 0;
418 	pSRB->TargetStatus = 0;
419 	pSRB->MsgCnt = 0;
420 	pSRB->SRBStatus = 0;
421 	pSRB->SRBFlag = 0;
422 	pSRB->SRBState = 0;
423 	pSRB->ScsiPhase = PH_BUS_FREE; /* SCSI bus free Phase */
424 
425 	crit_enter();
426 	if (ccb->ccb_h.status != CAM_REQ_INPROG) {
427 		if (nseg != 0)
428 			bus_dmamap_unload(pACB->buffer_dmat, pSRB->dmamap);
429 		pSRB->pNextSRB = pACB->pFreeSRB;
430 		pACB->pFreeSRB = pSRB;
431 		xpt_done(ccb);
432 		crit_exit();
433 		return;
434 	}
435 	ccb->ccb_h.status |= CAM_SIM_QUEUED;
436 #if 0
437 	/* XXX Need a timeout handler */
438 	callout_reset(&ccb->ccb_h.timeout_ch, (ccb->ccb_h.timeout * hz) / 1000,
439 		      trmtimeout, srb);
440 #endif
441 	trm_SendSRB(pACB, pSRB);
442 	crit_exit();
443 	return;
444 }
445 
446 static void
447 trm_SendSRB(PACB pACB, PSRB pSRB)
448 {
449 	PDCB	pDCB;
450 
451 	crit_enter();
452 	pDCB = pSRB->pSRBDCB;
453 	if (!(pDCB->MaxCommand > pDCB->GoingSRBCnt) || (pACB->pActiveDCB)
454 	    || (pACB->ACBFlag & (RESET_DETECT+RESET_DONE+RESET_DEV))) {
455 		TRM_DPRINTF("pDCB->MaxCommand=%d \n",pDCB->MaxCommand);
456 		TRM_DPRINTF("pDCB->GoingSRBCnt=%d \n",pDCB->GoingSRBCnt);
457 		TRM_DPRINTF("pACB->pActiveDCB=%8x \n",(u_int)pACB->pActiveDCB);
458 		TRM_DPRINTF("pACB->ACBFlag=%x \n",pACB->ACBFlag);
459 	    	trm_SRBwaiting(pDCB, pSRB);
460 		goto SND_EXIT;
461 	}
462 
463 	if (pDCB->pWaitingSRB) {
464 		trm_SRBwaiting(pDCB, pSRB);
465 		pSRB = pDCB->pWaitingSRB;
466 		pDCB->pWaitingSRB = pSRB->pNextSRB;
467 		pSRB->pNextSRB = NULL;
468 	}
469 
470 	if (!trm_StartSCSI(pACB, pDCB, pSRB)) {
471 	/*
472 	 * If trm_StartSCSI return 0 :
473 	 * current interrupt status is interrupt enable
474 	 * It's said that SCSI processor is unoccupied
475 	 */
476 		pDCB->GoingSRBCnt++; /* stack waiting SRB*/
477 		if (pDCB->pGoingSRB) {
478 			pDCB->pGoingLastSRB->pNextSRB = pSRB;
479 			pDCB->pGoingLastSRB = pSRB;
480 		} else {
481 			pDCB->pGoingSRB = pSRB;
482 			pDCB->pGoingLastSRB = pSRB;
483 		}
484 	} else {
485 	/*
486 	 * If trm_StartSCSI return 1 :
487 	 * current interrupt status is interrupt disreenable
488 	 * It's said that SCSI processor has more one SRB need to do
489 	 */
490 		trm_RewaitSRB0(pDCB, pSRB);
491 	}
492 SND_EXIT:
493 	crit_exit();
494 	/*
495 	 *	enable interrupt
496 	 */
497 	return;
498 }
499 
500 
501 static void
502 trm_action(struct cam_sim *psim, union ccb *pccb)
503 {
504 	PACB	pACB;
505 	u_int	target_id,target_lun;
506 
507 	CAM_DEBUG(pccb->ccb_h.path, CAM_DEBUG_TRACE, ("trm_action\n"));
508 
509 	pACB = (PACB) cam_sim_softc(psim);
510     	target_id  = pccb->ccb_h.target_id;
511 	target_lun = pccb->ccb_h.target_lun;
512 
513 	switch (pccb->ccb_h.func_code) {
514 		case XPT_NOOP:
515 			TRM_DPRINTF(" XPT_NOOP \n");
516 			pccb->ccb_h.status = CAM_REQ_INVALID;
517 			xpt_done(pccb);
518 			break;
519 		/*
520 		 * Execute the requested I/O operation
521 	 	 */
522 		case XPT_SCSI_IO: {
523 			PDCB			pDCB = NULL;
524 			PSRB			pSRB;
525 			struct ccb_scsiio	*pcsio;
526 
527 			pcsio = &pccb->csio;
528 			TRM_DPRINTF(" XPT_SCSI_IO \n");
529 			TRM_DPRINTF("trm: target_id= %d target_lun= %d \n"
530 			     ,target_id, target_lun);
531 			TRM_DPRINTF(
532 			    "pACB->scan_devices[target_id][target_lun]= %d \n"
533 			    ,pACB->scan_devices[target_id][target_lun]);
534 			pDCB = pACB->pDCB[target_id][target_lun];
535 			/*
536 			 * Assign an SRB and connect it with this ccb.
537 			 */
538 			pSRB = trm_GetSRB(pACB);
539 			if (!pSRB) {
540 				/* Freeze SIMQ */
541 				pccb->ccb_h.status = CAM_RESRC_UNAVAIL;
542 				xpt_done(pccb);
543 				return;
544 			}
545 	    		pSRB->pSRBDCB = pDCB;
546 	    		pccb->ccb_h.ccb_trmsrb_ptr = pSRB;
547 	    		pccb->ccb_h.ccb_trmacb_ptr = pACB;
548 		    	pSRB->pccb = pccb;
549 			pSRB->ScsiCmdLen = pcsio->cdb_len;
550 			/*
551 			 * move layer of CAM command block to layer of SCSI
552 			 * Request Block for SCSI processor command doing
553 			 */
554 			bcopy(pcsio->cdb_io.cdb_bytes,pSRB->CmdBlock
555 			    ,pcsio->cdb_len);
556 			if ((pccb->ccb_h.flags & CAM_DIR_MASK)
557 			    != CAM_DIR_NONE) {
558 				if ((pccb->ccb_h.flags &
559 				      CAM_SCATTER_VALID) == 0) {
560 					if ((pccb->ccb_h.flags
561 					      & CAM_DATA_PHYS) == 0) {
562 						int error;
563 
564 						crit_enter();
565 						error = bus_dmamap_load(
566 						    pACB->buffer_dmat,
567 						    pSRB->dmamap,
568 						    pcsio->data_ptr,
569 						    pcsio->dxfer_len,
570 						    trm_ExecuteSRB,
571 						    pSRB,
572 						    0);
573 						if (error == EINPROGRESS) {
574 							xpt_freeze_simq(
575 							    pACB->psim,
576 							    1);
577 							pccb->ccb_h.status |=
578 							  CAM_RELEASE_SIMQ;
579 						}
580 						crit_exit();
581 					} else {
582 						struct bus_dma_segment seg;
583 
584 						/* Pointer to physical buffer */
585 						seg.ds_addr =
586 						  (bus_addr_t)pcsio->data_ptr;
587 						seg.ds_len = pcsio->dxfer_len;
588 						trm_ExecuteSRB(pSRB, &seg, 1,
589 						    0);
590 					}
591 				} else {
592 					/*  CAM_SCATTER_VALID */
593 					struct bus_dma_segment *segs;
594 
595 					if ((pccb->ccb_h.flags &
596 					     CAM_SG_LIST_PHYS) == 0 ||
597 					     (pccb->ccb_h.flags
598 					     & CAM_DATA_PHYS) != 0) {
599 						pSRB->pNextSRB = pACB->pFreeSRB;
600 						pACB->pFreeSRB = pSRB;
601 						pccb->ccb_h.status =
602 						  CAM_PROVIDE_FAIL;
603 						xpt_done(pccb);
604 						return;
605 					}
606 
607 					/* cam SG list is physical,
608 					 *  cam data is virtual
609 					 */
610 					segs = (struct bus_dma_segment *)
611 					    pcsio->data_ptr;
612 					trm_ExecuteSRB(pSRB, segs,
613 					    pcsio->sglist_cnt, 1);
614 				}   /*  CAM_SCATTER_VALID */
615 			} else
616 				trm_ExecuteSRB(pSRB, NULL, 0, 0);
617 				  }
618 			break;
619 		case XPT_GDEV_TYPE:
620 			TRM_DPRINTF(" XPT_GDEV_TYPE \n");
621 	    		pccb->ccb_h.status = CAM_REQ_INVALID;
622 			xpt_done(pccb);
623 			break;
624 		case XPT_GDEVLIST:
625 			TRM_DPRINTF(" XPT_GDEVLIST \n");
626 			pccb->ccb_h.status = CAM_REQ_INVALID;
627 			xpt_done(pccb);
628 			break;
629 		/*
630 		 * Path routing inquiry
631 	       	 * Path Inquiry CCB
632 		 */
633 		case XPT_PATH_INQ: {
634 			struct ccb_pathinq *cpi = &pccb->cpi;
635 
636 			TRM_DPRINTF(" XPT_PATH_INQ \n");
637 			cpi->version_num = 1;
638 			cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16;
639 			cpi->target_sprt = 0;
640 			cpi->hba_misc = 0;
641 			cpi->hba_eng_cnt = 0;
642 			cpi->max_target = 15 ;
643 			cpi->max_lun = pACB->max_lun;        /* 7 or 0 */
644 			cpi->initiator_id = pACB->AdaptSCSIID;
645 			cpi->bus_id = cam_sim_bus(psim);
646 			strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
647 			strncpy(cpi->hba_vid, "Tekram_TRM", HBA_IDLEN);
648 			strncpy(cpi->dev_name, cam_sim_name(psim), DEV_IDLEN);
649 			cpi->unit_number = cam_sim_unit(psim);
650 			cpi->ccb_h.status = CAM_REQ_CMP;
651 			xpt_done(pccb);
652 				   }
653 			break;
654 		/*
655 		 * Release a frozen SIM queue
656 		 * Release SIM Queue
657 		 */
658 		case XPT_REL_SIMQ:
659 			TRM_DPRINTF(" XPT_REL_SIMQ \n");
660 			pccb->ccb_h.status = CAM_REQ_INVALID;
661 			xpt_done(pccb);
662 			break;
663 		/*
664 		 * Set Asynchronous Callback Parameters
665 		 * Set Asynchronous Callback CCB
666  		 */
667 		case XPT_SASYNC_CB:
668 			TRM_DPRINTF(" XPT_SASYNC_CB \n");
669 			pccb->ccb_h.status = CAM_REQ_INVALID;
670 			xpt_done(pccb);
671 			break;
672 		/*
673 		 * Set device type information
674 		 * Set Device Type CCB
675  		 */
676 		case XPT_SDEV_TYPE:
677 			TRM_DPRINTF(" XPT_SDEV_TYPE \n");
678 			pccb->ccb_h.status = CAM_REQ_INVALID;
679 			xpt_done(pccb);
680 			break;
681 		/*
682 		 * (Re)Scan the SCSI Bus
683 	 	 * Rescan the given bus, or bus/target/lun
684  		 */
685 		case XPT_SCAN_BUS:
686 			TRM_DPRINTF(" XPT_SCAN_BUS \n");
687 	    		pccb->ccb_h.status = CAM_REQ_INVALID;
688 			xpt_done(pccb);
689 			break;
690 		/*
691 		 * Get EDT entries matching the given pattern
692  		 */
693 		case XPT_DEV_MATCH:
694 			TRM_DPRINTF(" XPT_DEV_MATCH \n");
695 	    		pccb->ccb_h.status = CAM_REQ_INVALID;
696 			xpt_done(pccb);
697 			break;
698 		/*
699 		 * Turn on debugging for a bus, target or lun
700       		 */
701 		case XPT_DEBUG:
702 			TRM_DPRINTF(" XPT_DEBUG \n");
703 			pccb->ccb_h.status = CAM_REQ_INVALID;
704 			xpt_done(pccb);
705 			break;
706 			/*
707 			 * XPT_ABORT = 0x10, Abort the specified CCB
708 			 * Abort XPT request CCB
709 			 */
710 		case XPT_ABORT:
711 			TRM_DPRINTF(" XPT_ABORT \n");
712 			pccb->ccb_h.status = CAM_REQ_INVALID;
713 			xpt_done(pccb);
714 			break;
715 		/*
716 		 * Reset the specified SCSI bus
717 		 * Reset SCSI Bus CCB
718  		 */
719 		case XPT_RESET_BUS: {
720 			int i;
721 
722 			TRM_DPRINTF(" XPT_RESET_BUS \n");
723 	    		trm_reset(pACB);
724 			pACB->ACBFlag=0;
725 			for (i=0; i<500; i++)
726 				DELAY(1000);
727 			pccb->ccb_h.status = CAM_REQ_CMP;
728 			xpt_done(pccb);
729 				    }
730 			break;
731 		/*
732 		 * Bus Device Reset the specified SCSI device
733 		 * Reset SCSI Device CCB
734  		 */
735 		case XPT_RESET_DEV:
736 		/*
737 		 * Don't (yet?) support vendor
738 		 * specific commands.
739 		 */
740 			TRM_DPRINTF(" XPT_RESET_DEV \n");
741 	    		pccb->ccb_h.status = CAM_REQ_INVALID;
742 			xpt_done(pccb);
743 			break;
744 		/*
745 		 * Terminate the I/O process
746 		 * Terminate I/O Process Request CCB
747  		 */
748 		case XPT_TERM_IO:
749 			TRM_DPRINTF(" XPT_TERM_IO \n");
750 	    		pccb->ccb_h.status = CAM_REQ_INVALID;
751 			xpt_done(pccb);
752 			break;
753 		/*
754 		 * Scan Logical Unit
755 		 */
756 		case XPT_SCAN_LUN:
757 			TRM_DPRINTF(" XPT_SCAN_LUN \n");
758 			pccb->ccb_h.status = CAM_REQ_INVALID;
759 			xpt_done(pccb);
760 			break;
761 
762 		/*
763 		 * Get/Set transfer rate/width/disconnection/tag queueing
764 		 * settings
765 		 * (GET) default/user transfer settings for the target
766 	 	 */
767 		case XPT_GET_TRAN_SETTINGS: {
768 			struct	ccb_trans_settings *cts;
769 			struct	trm_transinfo *tinfo;
770 			PDCB	pDCB;
771 
772 			TRM_DPRINTF(" XPT_GET_TRAN_SETTINGS \n");
773 	    		cts = &pccb->cts;
774 			pDCB = pACB->pDCB[target_id][target_lun];
775 			crit_enter();
776 			/*
777 			 * disable interrupt
778 			 */
779 			if ((cts->flags & CCB_TRANS_CURRENT_SETTINGS) != 0) {
780 				/* current transfer settings */
781 				if (pDCB->tinfo.disc_tag & TRM_CUR_DISCENB)
782 					cts->flags = CCB_TRANS_DISC_ENB;
783 				else
784 					cts->flags = 0;/* no tag & disconnect */
785 				if (pDCB->tinfo.disc_tag & TRM_CUR_TAGENB)
786 					cts->flags |= CCB_TRANS_TAG_ENB;
787 				tinfo = &pDCB->tinfo.current;
788 				TRM_DPRINTF("CURRENT:  cts->flags= %2x \n",
789 				    cts->flags);
790 			} else {
791 		  	  /* default(user) transfer settings */
792 				if (pDCB->tinfo.disc_tag & TRM_USR_DISCENB)
793 					cts->flags = CCB_TRANS_DISC_ENB;
794 				else
795 					cts->flags = 0;
796 				if (pDCB->tinfo.disc_tag & TRM_USR_TAGENB)
797 					cts->flags |= CCB_TRANS_TAG_ENB;
798 				tinfo = &pDCB->tinfo.user;
799 				TRM_DPRINTF("USER: cts->flags= %2x \n",
800 					cts->flags);
801 			}
802 			cts->sync_period = tinfo->period;
803 			cts->sync_offset = tinfo->offset;
804 			cts->bus_width   = tinfo->width;
805 			TRM_DPRINTF("pDCB->SyncPeriod: %d  \n",
806 				pDCB->SyncPeriod);
807 			TRM_DPRINTF("period: %d  \n", tinfo->period);
808 			TRM_DPRINTF("offset: %d  \n", tinfo->offset);
809 			TRM_DPRINTF("width: %d  \n", tinfo->width);
810 
811 			crit_exit();
812 			cts->valid = CCB_TRANS_SYNC_RATE_VALID |
813 			    CCB_TRANS_SYNC_OFFSET_VALID |
814 			    CCB_TRANS_BUS_WIDTH_VALID |
815 			    CCB_TRANS_DISC_VALID |
816 			    CCB_TRANS_TQ_VALID;
817 			pccb->ccb_h.status = CAM_REQ_CMP;
818 			xpt_done(pccb);
819 					    }
820 			break;
821 		/*
822 		 * Get/Set transfer rate/width/disconnection/tag queueing
823 		 * settings
824 		 * (Set) transfer rate/width negotiation settings
825 		 */
826 		case XPT_SET_TRAN_SETTINGS: {
827 			struct	ccb_trans_settings *cts;
828 			u_int	update_type;
829 			PDCB	pDCB;
830 
831 			TRM_DPRINTF(" XPT_SET_TRAN_SETTINGS \n");
832 	    		cts = &pccb->cts;
833 			update_type = 0;
834 			if ((cts->flags & CCB_TRANS_CURRENT_SETTINGS) != 0)
835 				update_type |= TRM_TRANS_GOAL;
836 			if ((cts->flags & CCB_TRANS_USER_SETTINGS) != 0)
837 				update_type |= TRM_TRANS_USER;
838 			crit_enter();
839 	    		pDCB = pACB->pDCB[target_id][target_lun];
840 
841 			if ((cts->valid & CCB_TRANS_DISC_VALID) != 0) {
842 			  /*ccb disc enables */
843 				if (update_type & TRM_TRANS_GOAL) {
844 					if ((cts->flags & CCB_TRANS_DISC_ENB)
845 					    != 0)
846 				    		pDCB->tinfo.disc_tag
847 						    |= TRM_CUR_DISCENB;
848 					else
849 						pDCB->tinfo.disc_tag &=
850 						    ~TRM_CUR_DISCENB;
851 				}
852 				if (update_type & TRM_TRANS_USER) {
853 					if ((cts->flags & CCB_TRANS_DISC_ENB)
854 					    != 0)
855 						pDCB->tinfo.disc_tag
856 						    |= TRM_USR_DISCENB;
857 					else
858 						pDCB->tinfo.disc_tag &=
859 						    ~TRM_USR_DISCENB;
860 				}
861 			}
862 			if ((cts->valid & CCB_TRANS_TQ_VALID) != 0) {
863 			  /* if ccb tag q active */
864 				if (update_type & TRM_TRANS_GOAL) {
865 					if ((cts->flags & CCB_TRANS_TAG_ENB)
866 					    != 0)
867 						pDCB->tinfo.disc_tag |=
868 						    TRM_CUR_TAGENB;
869 					else
870 						pDCB->tinfo.disc_tag &=
871 						    ~TRM_CUR_TAGENB;
872 				}
873 				if (update_type & TRM_TRANS_USER) {
874 					if ((cts->flags & CCB_TRANS_TAG_ENB)
875 					    != 0)
876 				  		pDCB->tinfo.disc_tag |=
877 						    TRM_USR_TAGENB;
878 					else
879 						pDCB->tinfo.disc_tag &=
880 						    ~TRM_USR_TAGENB;
881 				}
882 			}
883 			/* Minimum sync period factor	*/
884 
885 			if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) {
886 				/* if ccb sync active */
887 				/* TRM-S1040 MinSyncPeriod = 4 clocks/byte */
888 				if ((cts->sync_period != 0) &&
889 				    (cts->sync_period < 125))
890 					cts->sync_period = 125;
891 				/* 1/(125*4) minsync 2 MByte/sec */
892 				if ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID)
893 				    != 0) {
894 					if (cts->sync_offset == 0)
895 				 		cts->sync_period = 0;
896 					/* TRM-S1040 MaxSyncOffset = 15 bytes*/
897 					if (cts->sync_offset > 15)
898 						cts->sync_offset = 15;
899 				}
900 			}
901 			if ((update_type & TRM_TRANS_USER) != 0) {
902 				pDCB->tinfo.user.period = cts->sync_period;
903 				pDCB->tinfo.user.offset = cts->sync_offset;
904 				pDCB->tinfo.user.width  = cts->bus_width;
905 			}
906 			if ((update_type & TRM_TRANS_GOAL) != 0) {
907 				pDCB->tinfo.goal.period = cts->sync_period;
908 				pDCB->tinfo.goal.offset = cts->sync_offset;
909 				pDCB->tinfo.goal.width  = cts->bus_width;
910 			}
911 			crit_exit();
912 			pccb->ccb_h.status = CAM_REQ_CMP;
913 			xpt_done(pccb);
914 			break;
915 					    }
916 		/*
917 		 * Calculate the geometry parameters for a device give
918 		 * the sector size and volume size.
919    		 */
920 		case XPT_CALC_GEOMETRY:	{
921 			struct		ccb_calc_geometry *ccg;
922 			u_int32_t	size_mb;
923 			u_int32_t	secs_per_cylinder;
924 			int		extended;
925 
926 			TRM_DPRINTF(" XPT_CALC_GEOMETRY \n");
927 			ccg = &pccb->ccg;
928 			size_mb = ccg->volume_size /
929 			    ((1024L * 1024L) / ccg->block_size);
930 			extended =  1;
931 			if (size_mb > 1024 && extended) {
932 				ccg->heads = 255;
933 				ccg->secs_per_track = 63;
934 			} else {
935 				ccg->heads = 64;
936 				ccg->secs_per_track = 32;
937 			}
938 			secs_per_cylinder = ccg->heads * ccg->secs_per_track;
939 			ccg->cylinders = ccg->volume_size / secs_per_cylinder;
940 			pccb->ccb_h.status = CAM_REQ_CMP;
941 			xpt_done(pccb);
942 					}
943 			break;
944 		case XPT_ENG_INQ:
945 			TRM_DPRINTF(" XPT_ENG_INQ \n");
946 	    		pccb->ccb_h.status = CAM_REQ_INVALID;
947 			xpt_done(pccb);
948 			break;
949 		/*
950 		 * HBA execute engine request
951 		 * This structure must match SCSIIO size
952 		 */
953 		case XPT_ENG_EXEC:
954 			TRM_DPRINTF(" XPT_ENG_EXEC \n");
955 	    		pccb->ccb_h.status = CAM_REQ_INVALID;
956 			xpt_done(pccb);
957 			break;
958 		/*
959 		 * XPT_EN_LUN = 0x30, Enable LUN as a target
960 		 * Target mode structures.
961 	 	 */
962 		case XPT_EN_LUN:
963 		/*
964 		 * Don't (yet?) support vendor
965 		 * specific commands.
966 		 */
967 			TRM_DPRINTF(" XPT_EN_LUN \n");
968 			pccb->ccb_h.status = CAM_REQ_INVALID;
969 			xpt_done(pccb);
970 			break;
971 		/*
972 		* Execute target I/O request
973 		*/
974 		case XPT_TARGET_IO:
975 		/*
976 		 * Don't (yet?) support vendor
977 		 * specific commands.
978 		 */
979 			TRM_DPRINTF(" XPT_TARGET_IO \n");
980 			pccb->ccb_h.status = CAM_REQ_INVALID;
981 			xpt_done(pccb);
982 			break;
983 		/*
984 		 * Accept Host Target Mode CDB
985        		 */
986 		case XPT_ACCEPT_TARGET_IO:
987 		/*
988 		 * Don't (yet?) support vendor
989 		 * specific commands.
990 		 */
991 			TRM_DPRINTF(" XPT_ACCEPT_TARGET_IO \n");
992 			pccb->ccb_h.status = CAM_REQ_INVALID;
993 			xpt_done(pccb);
994 			break;
995 		/*
996 		 * Continue Host Target I/O Connection
997  		 */
998 		case XPT_CONT_TARGET_IO:
999 		/*
1000 		 * Don't (yet?) support vendor
1001 		 * specific commands.
1002 		 */
1003 			TRM_DPRINTF(" XPT_CONT_TARGET_IO \n");
1004 			pccb->ccb_h.status = CAM_REQ_INVALID;
1005 			xpt_done(pccb);
1006 			break;
1007 		/*
1008 		 * Notify Host Target driver of event
1009  		 */
1010 		case XPT_IMMED_NOTIFY:
1011 			TRM_DPRINTF(" XPT_IMMED_NOTIFY \n");
1012 	    		pccb->ccb_h.status = CAM_REQ_INVALID;
1013 			xpt_done(pccb);
1014 			break;
1015 		/*
1016 		 * Acknowledgement of event
1017        		 */
1018 		case XPT_NOTIFY_ACK:
1019 			TRM_DPRINTF(" XPT_NOTIFY_ACK \n");
1020 	    		pccb->ccb_h.status = CAM_REQ_INVALID;
1021 			xpt_done(pccb);
1022 			break;
1023 		/*
1024 		 * XPT_VUNIQUE = 0x80
1025 		 */
1026 		case XPT_VUNIQUE:
1027 			pccb->ccb_h.status = CAM_REQ_INVALID;
1028 			xpt_done(pccb);
1029 			break;
1030 		default:
1031 			pccb->ccb_h.status = CAM_REQ_INVALID;
1032 			xpt_done(pccb);
1033 			break;
1034 	}
1035 }
1036 
1037 static void
1038 trm_poll(struct cam_sim *psim)
1039 {
1040 
1041 }
1042 
1043 static void
1044 trm_ResetDevParam(PACB pACB)
1045 {
1046 	PDCB		pDCB, pdcb;
1047 	PNVRAMTYPE 	pEEpromBuf;
1048 	u_int8_t	PeriodIndex;
1049 
1050 	pDCB = pACB->pLinkDCB;
1051 	if (pDCB == NULL)
1052 		return;
1053 	pdcb = pDCB;
1054 	do {
1055 		pDCB->SyncMode  &= ~(SYNC_NEGO_DONE+ WIDE_NEGO_DONE);
1056 		pDCB->SyncPeriod = 0;
1057 		pDCB->SyncOffset = 0;
1058 		pEEpromBuf = &trm_eepromBuf[pACB->AdapterUnit];
1059 		pDCB->DevMode =
1060 		  pEEpromBuf->NvramTarget[pDCB->TargetID].NvmTarCfg0;
1061 		pDCB->AdpMode = pEEpromBuf->NvramChannelCfg;
1062 		PeriodIndex =
1063 		   pEEpromBuf->NvramTarget[pDCB->TargetID].NvmTarPeriod & 0x07;
1064 		pDCB->MaxNegoPeriod = dc395x_trm_clock_period[PeriodIndex];
1065 		if ((pDCB->DevMode & NTC_DO_WIDE_NEGO) &&
1066 		    (pACB->Config & HCC_WIDE_CARD))
1067 			pDCB->SyncMode |= WIDE_NEGO_ENABLE;
1068 		pDCB = pDCB->pNextDCB;
1069 	}
1070 	while (pdcb != pDCB);
1071 }
1072 
1073 static void
1074 trm_RecoverSRB(PACB pACB)
1075 {
1076 	PDCB		pDCB, pdcb;
1077 	PSRB		psrb, psrb2;
1078        	u_int16_t	cnt, i;
1079 
1080 	pDCB = pACB->pLinkDCB;
1081 	if (pDCB == NULL)
1082 		return;
1083 	pdcb = pDCB;
1084 	do {
1085 		cnt = pdcb->GoingSRBCnt;
1086 		psrb = pdcb->pGoingSRB;
1087 		for (i = 0; i < cnt; i++) {
1088 			psrb2 = psrb;
1089 			psrb = psrb->pNextSRB;
1090 			if (pdcb->pWaitingSRB) {
1091 				psrb2->pNextSRB = pdcb->pWaitingSRB;
1092 				pdcb->pWaitingSRB = psrb2;
1093 			} else {
1094 				pdcb->pWaitingSRB = psrb2;
1095 				pdcb->pWaitLastSRB = psrb2;
1096 				psrb2->pNextSRB = NULL;
1097 			}
1098 		}
1099 		pdcb->GoingSRBCnt = 0;
1100 		pdcb->pGoingSRB = NULL;
1101 		pdcb->TagMask = 0;
1102 		pdcb = pdcb->pNextDCB;
1103 	}
1104 	while (pdcb != pDCB);
1105 }
1106 
1107 static void
1108 trm_reset(PACB pACB)
1109 {
1110 	u_int16_t	i;
1111 
1112     	TRM_DPRINTF("trm: RESET");
1113 	crit_enter();
1114 	trm_reg_write8(0x00, TRMREG_DMA_INTEN);
1115 	trm_reg_write8(0x00, TRMREG_SCSI_INTEN);
1116 
1117 	trm_ResetSCSIBus(pACB);
1118 	for (i = 0; i < 500; i++)
1119 		DELAY(1000);
1120     	trm_reg_write8(0x7F, TRMREG_SCSI_INTEN);
1121 	/* Enable DMA interrupt	*/
1122 	trm_reg_write8(EN_SCSIINTR, TRMREG_DMA_INTEN);
1123 	/* Clear DMA FIFO */
1124 	trm_reg_write8(CLRXFIFO, TRMREG_DMA_CONTROL);
1125 	/* Clear SCSI FIFO */
1126 	trm_reg_write16(DO_CLRFIFO,TRMREG_SCSI_CONTROL);
1127 	trm_ResetDevParam(pACB);
1128 	trm_DoingSRB_Done(pACB);
1129 	pACB->pActiveDCB = NULL;
1130 	pACB->ACBFlag = 0;/* RESET_DETECT, RESET_DONE ,RESET_DEV */
1131 	trm_DoWaitingSRB(pACB);
1132 	/* Tell the XPT layer that a bus reset occured    */
1133 	if (pACB->ppath != NULL)
1134 		xpt_async(AC_BUS_RESET, pACB->ppath, NULL);
1135 	crit_exit();
1136     	return;
1137 }
1138 
1139 static u_int16_t
1140 trm_StartSCSI(PACB pACB, PDCB pDCB, PSRB pSRB)
1141 {
1142 	u_int16_t	return_code;
1143 	u_int8_t	tag_number, scsicommand, i,command,identify_message;
1144 	u_int8_t *	ptr;
1145 	u_long		tag_mask;
1146 	union  ccb	*pccb;
1147 	struct ccb_scsiio *pcsio;
1148 
1149 	pccb  = pSRB->pccb;
1150 	pcsio = &pccb->csio;
1151 	pSRB->TagNumber = 31;
1152 
1153 	trm_reg_write8(pACB->AdaptSCSIID, TRMREG_SCSI_HOSTID);
1154 	trm_reg_write8(pDCB->TargetID, TRMREG_SCSI_TARGETID);
1155 	trm_reg_write8(pDCB->SyncPeriod, TRMREG_SCSI_SYNC);
1156 	trm_reg_write8(pDCB->SyncOffset, TRMREG_SCSI_OFFSET);
1157 	pSRB->ScsiPhase = PH_BUS_FREE;/* initial phase */
1158 	/* Flush FIFO */
1159 	trm_reg_write16(DO_CLRFIFO, TRMREG_SCSI_CONTROL);
1160 
1161 	identify_message = pDCB->IdentifyMsg;
1162 
1163    	if ((pSRB->CmdBlock[0] == INQUIRY) ||
1164 	    (pSRB->CmdBlock[0] == REQUEST_SENSE) ||
1165 	    (pSRB->SRBFlag & AUTO_REQSENSE)) {
1166 		if (((pDCB->SyncMode & WIDE_NEGO_ENABLE) &&
1167 		      !(pDCB->SyncMode & WIDE_NEGO_DONE)) \
1168 		|| ((pDCB->SyncMode & SYNC_NEGO_ENABLE) &&
1169 		  !(pDCB->SyncMode & SYNC_NEGO_DONE))) {
1170 			if (!(pDCB->IdentifyMsg & 7) ||
1171 			    (pSRB->CmdBlock[0] != INQUIRY)) {
1172 				scsicommand = SCMD_SEL_ATNSTOP;
1173 				pSRB->SRBState = SRB_MSGOUT;
1174 				goto polling;
1175 			}
1176 		}
1177        	/*
1178        	* Send identify message
1179        	*/
1180 		trm_reg_write8((identify_message & 0xBF) ,TRMREG_SCSI_FIFO);
1181 		scsicommand = SCMD_SEL_ATN;
1182 		pSRB->SRBState = SRB_START_;
1183 	} else {
1184 		/* not inquiry,request sense,auto request sense */
1185 		/*
1186 		 * Send identify message
1187 		 */
1188 		trm_reg_write8(identify_message,TRMREG_SCSI_FIFO);
1189 		scsicommand = SCMD_SEL_ATN;
1190 		pSRB->SRBState = SRB_START_;
1191 		if (pDCB->SyncMode & EN_TAG_QUEUING) {
1192 		  /* Send Tag message */
1193 	      	  /*
1194 	       	   * Get tag id
1195    		   */
1196 			tag_mask = 1;
1197 			tag_number = 0;
1198 			while (tag_mask & pDCB->TagMask) {
1199 				tag_mask = tag_mask << 1;
1200 				tag_number++;
1201 			}
1202 			/*
1203 			 * Send Tag id
1204 			 */
1205 			trm_reg_write8(MSG_SIMPLE_QTAG, TRMREG_SCSI_FIFO);
1206 			trm_reg_write8(tag_number, TRMREG_SCSI_FIFO);
1207 			pDCB->TagMask |= tag_mask;
1208 			pSRB->TagNumber = tag_number;
1209 			scsicommand = SCMD_SEL_ATN3;
1210 			pSRB->SRBState = SRB_START_;
1211 		}
1212 	}
1213 polling:
1214 	/*
1215 	 * 	 Send CDB ..command block .........
1216 	 */
1217    	if (pSRB->SRBFlag & AUTO_REQSENSE) {
1218 		trm_reg_write8(REQUEST_SENSE, TRMREG_SCSI_FIFO);
1219 		trm_reg_write8((pDCB->IdentifyMsg << 5), TRMREG_SCSI_FIFO);
1220 		trm_reg_write8(0, TRMREG_SCSI_FIFO);
1221 		trm_reg_write8(0, TRMREG_SCSI_FIFO);
1222 		trm_reg_write8(pcsio->sense_len, TRMREG_SCSI_FIFO);
1223 		trm_reg_write8(0, TRMREG_SCSI_FIFO);
1224 	} else {
1225 		ptr = (u_int8_t *) pSRB->CmdBlock;
1226 		for (i = 0; i < pSRB->ScsiCmdLen ; i++) {
1227 			command = *ptr++;
1228 			trm_reg_write8(command,TRMREG_SCSI_FIFO);
1229 		}
1230 	}
1231 	if (trm_reg_read16(TRMREG_SCSI_STATUS) & SCSIINTERRUPT) {
1232 	    /*
1233 	     * If trm_StartSCSI return 1 :
1234 	     * current interrupt status is interrupt disreenable
1235 	     * It's said that SCSI processor has more one SRB need to do,
1236      	     * SCSI processor has been occupied by one SRB.
1237 	     */
1238 		pSRB->SRBState = SRB_READY;
1239 		pDCB->TagMask &= ~(1 << pSRB->TagNumber);
1240 		return_code = 1;
1241 	} else {
1242 	  /*
1243 	   * If trm_StartSCSI return 0 :
1244 	   * current interrupt status is interrupt enable
1245 	   * It's said that SCSI processor is unoccupied
1246 	   */
1247 		pSRB->ScsiPhase  = SCSI_NOP1; /* SCSI bus free Phase */
1248 		pACB->pActiveDCB = pDCB;
1249 		pDCB->pActiveSRB = pSRB;
1250 		return_code = 0;
1251 		trm_reg_write16(DO_DATALATCH | DO_HWRESELECT,
1252 		    TRMREG_SCSI_CONTROL);/* it's important for atn stop*/
1253 		/*
1254 		 * SCSI cammand
1255 		 */
1256 		trm_reg_write8(scsicommand,TRMREG_SCSI_COMMAND);
1257 	}
1258 	return (return_code);
1259 }
1260 
1261 static void
1262 trm_Interrupt(void *vpACB)
1263 {
1264 	PACB		pACB;
1265 	PDCB		pDCB;
1266 	PSRB		pSRB;
1267 	u_int16_t	phase;
1268 	void		(*stateV)(PACB, PSRB, u_int8_t *);
1269 	u_int8_t	scsi_status=0, scsi_intstatus;
1270 
1271 	pACB = vpACB;
1272 
1273 	if (pACB == NULL) {
1274 		TRM_DPRINTF("trm_Interrupt: pACB NULL return......");
1275 	    	return;
1276 	}
1277 
1278 	scsi_status = trm_reg_read16(TRMREG_SCSI_STATUS);
1279 	if (!(scsi_status & SCSIINTERRUPT)) {
1280 		TRM_DPRINTF("trm_Interrupt: TRMREG_SCSI_STATUS scsi_status = NULL ,return......");
1281 	    	return;
1282 	}
1283 	TRM_DPRINTF("scsi_status=%2x,",scsi_status);
1284 
1285     	scsi_intstatus = trm_reg_read8(TRMREG_SCSI_INTSTATUS);
1286 
1287 	TRM_DPRINTF("scsi_intstatus=%2x,",scsi_intstatus);
1288 
1289     	if (scsi_intstatus & (INT_SELTIMEOUT | INT_DISCONNECT)) {
1290 		trm_Disconnect(pACB);
1291 		return;
1292 	}
1293 
1294 	if (scsi_intstatus & INT_RESELECTED) {
1295 		trm_Reselect(pACB);
1296 		return;
1297 	}
1298 	if (scsi_intstatus & INT_SCSIRESET) {
1299 		trm_ScsiRstDetect(pACB);
1300 		return;
1301 	}
1302 
1303 	if (scsi_intstatus & (INT_BUSSERVICE | INT_CMDDONE)) {
1304 		pDCB = pACB->pActiveDCB;
1305 		pSRB = pDCB->pActiveSRB;
1306 		if (pDCB) {
1307 			if (pDCB->DCBFlag & ABORT_DEV_)
1308 				trm_EnableMsgOutAbort1(pACB, pSRB);
1309 		}
1310 		phase = (u_int16_t) pSRB->ScsiPhase;  /* phase: */
1311 		stateV = (void *) trm_SCSI_phase0[phase];
1312 		stateV(pACB, pSRB, &scsi_status);
1313 		pSRB->ScsiPhase = scsi_status & PHASEMASK;
1314 		/* phase:0,1,2,3,4,5,6,7 */
1315 		phase = (u_int16_t) scsi_status & PHASEMASK;
1316 		stateV = (void *) trm_SCSI_phase1[phase];
1317 		stateV(pACB, pSRB, &scsi_status);
1318 	}
1319 }
1320 
1321 static void
1322 trm_MsgOutPhase0(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1323 {
1324 
1325 	if (pSRB->SRBState & (SRB_UNEXPECT_RESEL+SRB_ABORT_SENT))
1326 		*pscsi_status = PH_BUS_FREE;
1327 	/*.. initial phase*/
1328 }
1329 
1330 static void
1331 trm_MsgOutPhase1(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1332 {
1333 	u_int8_t	bval;
1334 	u_int16_t	i, cnt;
1335 	u_int8_t *	ptr;
1336 	PDCB		pDCB;
1337 
1338 	trm_reg_write16(DO_CLRFIFO, TRMREG_SCSI_CONTROL);
1339 	pDCB = pACB->pActiveDCB;
1340 	if (!(pSRB->SRBState & SRB_MSGOUT)) {
1341 		cnt = pSRB->MsgCnt;
1342 		if (cnt) {
1343 			ptr = (u_int8_t *) pSRB->MsgOutBuf;
1344 			for (i = 0; i < cnt; i++) {
1345 				trm_reg_write8(*ptr, TRMREG_SCSI_FIFO);
1346 				ptr++;
1347 			}
1348 			pSRB->MsgCnt = 0;
1349 			if ((pDCB->DCBFlag & ABORT_DEV_) &&
1350 			    (pSRB->MsgOutBuf[0] == MSG_ABORT)) {
1351 				pSRB->SRBState = SRB_ABORT_SENT;
1352 			}
1353 		} else {
1354 			bval = MSG_ABORT;
1355 			if ((pSRB->CmdBlock[0] == INQUIRY) ||
1356 					(pSRB->CmdBlock[0] == REQUEST_SENSE) ||
1357 					(pSRB->SRBFlag & AUTO_REQSENSE)) {
1358 				if (pDCB->SyncMode & SYNC_NEGO_ENABLE) {
1359 					goto  mop1;
1360 				}
1361 			}
1362 			trm_reg_write8(bval, TRMREG_SCSI_FIFO);
1363 		}
1364 	} else {
1365 mop1:   /* message out phase */
1366 		if (!(pSRB->SRBState & SRB_DO_WIDE_NEGO)
1367 		    && (pDCB->SyncMode & WIDE_NEGO_ENABLE)) {
1368 		  /*
1369 	   	   * WIDE DATA TRANSFER REQUEST code (03h)
1370 		   */
1371 			pDCB->SyncMode &= ~(SYNC_NEGO_DONE | EN_ATN_STOP);
1372 			trm_reg_write8((pDCB->IdentifyMsg & 0xBF),
1373 			    TRMREG_SCSI_FIFO);
1374 			trm_reg_write8(MSG_EXTENDED,TRMREG_SCSI_FIFO);
1375 			/* (01h) */
1376 			trm_reg_write8(2,TRMREG_SCSI_FIFO);
1377 			/* Message length (02h) */
1378 			trm_reg_write8(3,TRMREG_SCSI_FIFO);
1379 			/* wide data xfer (03h) */
1380 			trm_reg_write8(1,TRMREG_SCSI_FIFO);
1381 			/* width:0(8bit),1(16bit),2(32bit) */
1382 			pSRB->SRBState |= SRB_DO_WIDE_NEGO;
1383 		} else if (!(pSRB->SRBState & SRB_DO_SYNC_NEGO)
1384 		    && (pDCB->SyncMode & SYNC_NEGO_ENABLE)) {
1385 		  /*
1386 	   	   * SYNCHRONOUS DATA TRANSFER REQUEST code (01h)
1387 		   */
1388 			if (!(pDCB->SyncMode & WIDE_NEGO_DONE))
1389 				trm_reg_write8((pDCB->IdentifyMsg & 0xBF),
1390 						TRMREG_SCSI_FIFO);
1391 			trm_reg_write8(MSG_EXTENDED,TRMREG_SCSI_FIFO);
1392 		  /* (01h) */
1393 			trm_reg_write8(3,TRMREG_SCSI_FIFO);
1394 		  /* Message length (03h) */
1395 			trm_reg_write8(1,TRMREG_SCSI_FIFO);
1396 		  /* SYNCHRONOUS DATA TRANSFER REQUEST code (01h) */
1397 			trm_reg_write8(pDCB->MaxNegoPeriod,TRMREG_SCSI_FIFO);
1398 		  /* Transfer peeriod factor */
1399 			trm_reg_write8(SYNC_NEGO_OFFSET,TRMREG_SCSI_FIFO);
1400 		  /* REQ/ACK offset */
1401 			pSRB->SRBState |= SRB_DO_SYNC_NEGO;
1402 		}
1403 	}
1404 	trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
1405 	/* it's important for atn stop */
1406 	/*
1407 	 * SCSI cammand
1408 	 */
1409 	trm_reg_write8(SCMD_FIFO_OUT, TRMREG_SCSI_COMMAND);
1410 }
1411 
1412 static void
1413 trm_CommandPhase0(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1414 {
1415 
1416 }
1417 
1418 static void
1419 trm_CommandPhase1(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1420 {
1421 	PDCB			pDCB;
1422 	u_int8_t *		ptr;
1423 	u_int16_t		i, cnt;
1424 	union  ccb		*pccb;
1425 	struct ccb_scsiio	*pcsio;
1426 
1427 	pccb  = pSRB->pccb;
1428 	pcsio = &pccb->csio;
1429 
1430 	trm_reg_write16(DO_CLRATN | DO_CLRFIFO , TRMREG_SCSI_CONTROL);
1431 	if (!(pSRB->SRBFlag & AUTO_REQSENSE)) {
1432 		cnt = (u_int16_t) pSRB->ScsiCmdLen;
1433 		ptr = (u_int8_t *) pSRB->CmdBlock;
1434 		for (i = 0; i < cnt; i++) {
1435 			trm_reg_write8(*ptr, TRMREG_SCSI_FIFO);
1436 			ptr++;
1437 		}
1438 	} else {
1439 		trm_reg_write8(REQUEST_SENSE, TRMREG_SCSI_FIFO);
1440 		pDCB = pACB->pActiveDCB;
1441 		/* target id */
1442 		trm_reg_write8((pDCB->IdentifyMsg << 5), TRMREG_SCSI_FIFO);
1443 		trm_reg_write8(0, TRMREG_SCSI_FIFO);
1444 		trm_reg_write8(0, TRMREG_SCSI_FIFO);
1445 		/* sizeof(struct scsi_sense_data) */
1446 		trm_reg_write8(pcsio->sense_len, TRMREG_SCSI_FIFO);
1447 		trm_reg_write8(0, TRMREG_SCSI_FIFO);
1448 	}
1449 	pSRB->SRBState = SRB_COMMAND;
1450 	trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
1451 	/* it's important for atn stop*/
1452 	/*
1453 	 * SCSI cammand
1454 	 */
1455 	trm_reg_write8(SCMD_FIFO_OUT, TRMREG_SCSI_COMMAND);
1456 }
1457 
1458 static void
1459 trm_DataOutPhase0(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1460 {
1461 	PDCB		pDCB;
1462 	u_int8_t	TempDMAstatus,SGIndexTemp;
1463 	u_int16_t	scsi_status;
1464 	PSEG		pseg;
1465 	u_long		TempSRBXferredLength,dLeftCounter=0;
1466 
1467 	pDCB = pSRB->pSRBDCB;
1468 	scsi_status = *pscsi_status;
1469 
1470 	if (!(pSRB->SRBState & SRB_XFERPAD)) {
1471 		if (scsi_status & PARITYERROR)
1472 			pSRB->SRBStatus |= PARITY_ERROR;
1473 		if (!(scsi_status & SCSIXFERDONE)) {
1474       		  /*
1475 		   * when data transfer from DMA FIFO to SCSI FIFO
1476 		   * if there was some data left in SCSI FIFO
1477 		   */
1478   			dLeftCounter = (u_long)
1479 			  (trm_reg_read8(TRMREG_SCSI_FIFOCNT) & 0x1F);
1480 			if (pDCB->SyncPeriod & WIDE_SYNC) {
1481 			  /*
1482 		   	   * if WIDE scsi SCSI FIFOCNT unit is word
1483 	   		   * so need to * 2
1484    			   */
1485 				dLeftCounter <<= 1;
1486 			}
1487 		}
1488 		/*
1489 		 * caculate all the residue data that not yet tranfered
1490 		 * SCSI transfer counter + left in SCSI FIFO data
1491 		 *
1492 		 * .....TRM_SCSI_COUNTER (24bits)
1493 		 * The counter always decrement by one for every SCSI byte
1494 		 *transfer.
1495 		 * .....TRM_SCSI_FIFOCNT (5bits)
1496 		 * The counter is SCSI FIFO offset counter
1497 		 */
1498 		dLeftCounter += trm_reg_read32(TRMREG_SCSI_COUNTER);
1499 		if (dLeftCounter == 1) {
1500 			dLeftCounter = 0;
1501 			trm_reg_write16(DO_CLRFIFO,TRMREG_SCSI_CONTROL);
1502 		}
1503 		if ((dLeftCounter == 0) ||
1504 		    (scsi_status & SCSIXFERCNT_2_ZERO)) {
1505 			TempDMAstatus = trm_reg_read8(TRMREG_DMA_STATUS);
1506 			while (!(TempDMAstatus & DMAXFERCOMP)) {
1507 				TempDMAstatus =
1508 				  trm_reg_read8(TRMREG_DMA_STATUS);
1509 			}
1510 			pSRB->SRBTotalXferLength = 0;
1511 		} else {
1512 		  /* Update SG list		*/
1513 		  /*
1514 	   	   * if transfer not yet complete
1515    		   * there were some data residue in SCSI FIFO or
1516 		   * SCSI transfer counter not empty
1517 		   */
1518 			if (pSRB->SRBTotalXferLength != dLeftCounter) {
1519 			  /*
1520 		  	   * data that had transferred length
1521 	   		   */
1522 				TempSRBXferredLength =
1523 				  pSRB->SRBTotalXferLength - dLeftCounter;
1524 				/*
1525 				 * next time to be transferred length
1526 				 */
1527 				pSRB->SRBTotalXferLength = dLeftCounter;
1528 				/*
1529 				 * parsing from last time disconnect SRBSGIndex
1530 				 */
1531 				pseg =
1532 				  pSRB->SRBSGListPointer + pSRB->SRBSGIndex;
1533 				for (SGIndexTemp = pSRB->SRBSGIndex;
1534 				    SGIndexTemp < pSRB->SRBSGCount;
1535 				    SGIndexTemp++) {
1536 					/*
1537 					 * find last time which SG transfer be
1538 					 * disconnect
1539 					 */
1540 					if (TempSRBXferredLength >=
1541 					    pseg->length)
1542 						TempSRBXferredLength -=
1543 						  pseg->length;
1544 					else {
1545 				  	  /*
1546 			   		   * update last time disconnected SG
1547 					   * list
1548 				   	   */
1549 						pseg->length -=
1550 						  TempSRBXferredLength;
1551 						/* residue data length  */
1552 						pseg->address +=
1553 						  TempSRBXferredLength;
1554 						/* residue data pointer */
1555 						pSRB->SRBSGIndex = SGIndexTemp;
1556 						break;
1557 					}
1558 					pseg++;
1559 				}
1560 			}
1561 		}
1562 	}
1563 	trm_reg_write8(STOPDMAXFER ,TRMREG_DMA_CONTROL);
1564 }
1565 
1566 
1567 static void
1568 trm_DataOutPhase1(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1569 {
1570 	u_int16_t	ioDir;
1571 	/*
1572 	 * do prepare befor transfer when data out phase
1573 	 */
1574 
1575 	ioDir = XFERDATAOUT;
1576 	trm_DataIO_transfer(pACB, pSRB, ioDir);
1577 }
1578 
1579 static void
1580 trm_DataInPhase0(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1581 {
1582 	u_int8_t	bval,SGIndexTemp;
1583 	u_int16_t	scsi_status;
1584 	PSEG		pseg;
1585 	u_long		TempSRBXferredLength,dLeftCounter = 0;
1586 
1587     	scsi_status = *pscsi_status;
1588 	if (!(pSRB->SRBState & SRB_XFERPAD)) {
1589 		if (scsi_status & PARITYERROR)
1590 			pSRB->SRBStatus |= PARITY_ERROR;
1591 		dLeftCounter += trm_reg_read32(TRMREG_SCSI_COUNTER);
1592 		if ((dLeftCounter == 0) || (scsi_status & SCSIXFERCNT_2_ZERO)) {
1593 			bval = trm_reg_read8(TRMREG_DMA_STATUS);
1594 			while (!(bval & DMAXFERCOMP))
1595 				bval = trm_reg_read8(TRMREG_DMA_STATUS);
1596 			pSRB->SRBTotalXferLength = 0;
1597 		} else {
1598 	  	  /*
1599    		   * parsing the case:
1600 	   	   * when a transfer not yet complete
1601 	   	   * but be disconnected by uper layer
1602 	   	   * if transfer not yet complete
1603 	   	   * there were some data residue in SCSI FIFO or
1604 	   	   * SCSI transfer counter not empty
1605 	   	   */
1606 		  if (pSRB->SRBTotalXferLength != dLeftCounter) {
1607 				/*
1608 				 * data that had transferred length
1609 				 */
1610 		  	TempSRBXferredLength =
1611 			  pSRB->SRBTotalXferLength - dLeftCounter;
1612 				/*
1613 			 	 * next time to be transferred length
1614 				 */
1615 			pSRB->SRBTotalXferLength = dLeftCounter;
1616 				/*
1617 				 * parsing from last time disconnect SRBSGIndex
1618 				 */
1619 			pseg = pSRB->SRBSGListPointer + pSRB->SRBSGIndex;
1620 			for (SGIndexTemp = pSRB->SRBSGIndex;
1621 			    SGIndexTemp < pSRB->SRBSGCount;
1622 			    SGIndexTemp++) {
1623 			  /*
1624 	   		   * find last time which SG transfer be disconnect
1625 	   		   */
1626 	 			if (TempSRBXferredLength >= pseg->length)
1627 					TempSRBXferredLength -= pseg->length;
1628 				else {
1629 		  		  /*
1630    				   * update last time disconnected SG list
1631 				   */
1632 					pseg->length -= TempSRBXferredLength;
1633 					/* residue data length  */
1634 					pseg->address += TempSRBXferredLength;
1635 					/* residue data pointer */
1636 					pSRB->SRBSGIndex = SGIndexTemp;
1637 					break;
1638 				}
1639 				pseg++;
1640 			}
1641 	  	  }
1642 		}
1643 	}
1644 }
1645 
1646 static void
1647 trm_DataInPhase1(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1648 {
1649 	u_int16_t	ioDir;
1650 	/*
1651 	 * do prepare befor transfer when data in phase
1652 	 */
1653 
1654 	ioDir = XFERDATAIN;
1655 	trm_DataIO_transfer(pACB, pSRB, ioDir);
1656 }
1657 
1658 static void
1659 trm_DataIO_transfer(PACB pACB, PSRB pSRB, u_int16_t ioDir)
1660 {
1661 	u_int8_t	bval;
1662 	PDCB		pDCB;
1663 
1664 	pDCB = pSRB->pSRBDCB;
1665 	if (pSRB->SRBSGIndex < pSRB->SRBSGCount) {
1666 		if (pSRB->SRBTotalXferLength != 0) {
1667 			pSRB->SRBSGPhyAddr = vtophys(pSRB->SRBSGListPointer);
1668 			/*
1669 			 * load what physical address of Scatter/Gather list
1670 			 table want to be transfer
1671 			 */
1672 			pSRB->SRBState = SRB_DATA_XFER;
1673 			trm_reg_write32(0, TRMREG_DMA_XHIGHADDR);
1674 			trm_reg_write32(
1675 			    (pSRB->SRBSGPhyAddr +
1676 			     ((u_long)pSRB->SRBSGIndex << 3)),
1677 			    TRMREG_DMA_XLOWADDR);
1678 			/*
1679 			 * load how many bytes in the Scatter/Gather
1680 			 * list table
1681 			 */
1682 			trm_reg_write32(
1683 			    ((u_long)(pSRB->SRBSGCount - pSRB->SRBSGIndex) << 3),
1684 			    TRMREG_DMA_XCNT);
1685 			/*
1686 			 * load total transfer length (24bits) max value
1687 			 * 16Mbyte
1688 			 */
1689 			trm_reg_write32(pSRB->SRBTotalXferLength,
1690 			    TRMREG_SCSI_COUNTER);
1691 			/* Start DMA transfer */
1692 			trm_reg_write16(ioDir, TRMREG_DMA_COMMAND);
1693 			/* Start SCSI transfer */
1694 			trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
1695 			/* it's important for atn stop */
1696 			/*
1697 			 * SCSI cammand
1698 			 */
1699 			bval = (ioDir == XFERDATAOUT) ?
1700 			  SCMD_DMA_OUT : SCMD_DMA_IN;
1701 			trm_reg_write8(bval, TRMREG_SCSI_COMMAND);
1702 		} else {
1703 		  /* xfer pad */
1704 			if (pSRB->SRBSGCount) {
1705 				pSRB->AdaptStatus = H_OVER_UNDER_RUN;
1706 				pSRB->SRBStatus |= OVER_RUN;
1707 			}
1708 			if (pDCB->SyncPeriod & WIDE_SYNC)
1709 				trm_reg_write32(2,TRMREG_SCSI_COUNTER);
1710 			else
1711 				trm_reg_write32(1,TRMREG_SCSI_COUNTER);
1712 			if (ioDir == XFERDATAOUT)
1713 				trm_reg_write16(0, TRMREG_SCSI_FIFO);
1714 			else
1715 				trm_reg_read16(TRMREG_SCSI_FIFO);
1716 			pSRB->SRBState |= SRB_XFERPAD;
1717 			trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
1718 			/* it's important for atn stop */
1719 			/*
1720 			 * SCSI cammand
1721 			 */
1722 			bval = (ioDir == XFERDATAOUT) ?
1723 			  SCMD_FIFO_OUT : SCMD_FIFO_IN;
1724 			trm_reg_write8(bval, TRMREG_SCSI_COMMAND);
1725 		}
1726 	}
1727 }
1728 
1729 static void
1730 trm_StatusPhase0(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1731 {
1732 
1733 	pSRB->TargetStatus = trm_reg_read8(TRMREG_SCSI_FIFO);
1734 	pSRB->SRBState = SRB_COMPLETED;
1735 	*pscsi_status = PH_BUS_FREE;
1736 	/*.. initial phase*/
1737 	trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
1738 	/* it's important for atn stop */
1739 	/*
1740 	 * SCSI cammand
1741 	 */
1742 	trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
1743 }
1744 
1745 
1746 
1747 static void
1748 trm_StatusPhase1(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1749 {
1750 
1751 	if (trm_reg_read16(TRMREG_DMA_COMMAND) & 0x0001) {
1752 		if (!(trm_reg_read8(TRMREG_SCSI_FIFOCNT) & 0x40))
1753 	       		trm_reg_write16(DO_CLRFIFO, TRMREG_SCSI_CONTROL);
1754 		if (!(trm_reg_read16(TRMREG_DMA_FIFOCNT) & 0x8000))
1755 			trm_reg_write8(CLRXFIFO, TRMREG_DMA_CONTROL);
1756 	} else {
1757 		if (!(trm_reg_read16(TRMREG_DMA_FIFOCNT) & 0x8000))
1758 			trm_reg_write8(CLRXFIFO, TRMREG_DMA_CONTROL);
1759 		if (!(trm_reg_read8(TRMREG_SCSI_FIFOCNT) & 0x40))
1760 			trm_reg_write16(DO_CLRFIFO, TRMREG_SCSI_CONTROL);
1761 	}
1762 	pSRB->SRBState = SRB_STATUS;
1763 	trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
1764 	/* it's important for atn stop */
1765 	/*
1766 	 * SCSI cammand
1767 	 */
1768 	trm_reg_write8(SCMD_COMP, TRMREG_SCSI_COMMAND);
1769 }
1770 
1771 /*
1772  *scsiiom
1773  *       trm_MsgInPhase0: one of trm_SCSI_phase0[] vectors
1774  *            stateV = (void *) trm_SCSI_phase0[phase]
1775  *		           if phase =7
1776  * extended message codes:
1777  *
1778  *   code        description
1779  *
1780  *    02h        Reserved
1781  *    00h        MODIFY DATA  POINTER
1782  *    01h        SYNCHRONOUS DATA TRANSFER REQUEST
1783  *    03h        WIDE DATA TRANSFER REQUEST
1784  * 04h - 7Fh     Reserved
1785  * 80h - FFh     Vendor specific
1786  *
1787  */
1788 
1789 static void
1790 trm_MsgInPhase0(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
1791 {
1792 	u_int8_t	message_in_code,bIndex,message_in_tag_id;
1793 	PDCB		pDCB;
1794 	PSRB		pSRBTemp;
1795 
1796 	pDCB = pACB->pActiveDCB;
1797 
1798 	message_in_code = trm_reg_read8(TRMREG_SCSI_FIFO);
1799 	if (!(pSRB->SRBState & SRB_EXTEND_MSGIN)) {
1800 		if (message_in_code == MSG_DISCONNECT) {
1801 			pSRB->SRBState = SRB_DISCONNECT;
1802 			goto  min6;
1803 		} else if (message_in_code == MSG_SAVE_PTR) {
1804 			goto  min6;
1805 		} else if ((message_in_code == MSG_EXTENDED) ||
1806 		    ((message_in_code >= MSG_SIMPLE_QTAG) &&
1807 		     (message_in_code <= MSG_ORDER_QTAG))) {
1808 			pSRB->SRBState |= SRB_EXTEND_MSGIN;
1809 		    	pSRB->MsgInBuf[0] = message_in_code;
1810 			/* extended message      (01h) */
1811 			pSRB->MsgCnt = 1;
1812 			pSRB->pMsgPtr = &pSRB->MsgInBuf[1];
1813 			/* extended message length (n) */
1814 			goto  min6;
1815 		} else if (message_in_code == MSG_REJECT_) {
1816 			/* Reject message */
1817 			if (pDCB->SyncMode & WIDE_NEGO_ENABLE) {
1818 			  /* do wide nego reject */
1819 				pDCB = pSRB->pSRBDCB;
1820 				pDCB->SyncMode |= WIDE_NEGO_DONE;
1821 				pDCB->SyncMode &= ~(SYNC_NEGO_DONE |
1822 				    EN_ATN_STOP | WIDE_NEGO_ENABLE);
1823 				pSRB->SRBState &= ~(SRB_DO_WIDE_NEGO+SRB_MSGIN);
1824 				if ((pDCB->SyncMode & SYNC_NEGO_ENABLE)
1825 				    && !(pDCB->SyncMode & SYNC_NEGO_DONE)) {
1826 				  /* Set ATN, in case ATN was clear */
1827 					pSRB->SRBState |= SRB_MSGOUT;
1828 					trm_reg_write16(
1829 					    DO_SETATN,
1830 					    TRMREG_SCSI_CONTROL);
1831 				} else {
1832 			  	  /* Clear ATN */
1833 					trm_reg_write16(
1834 					    DO_CLRATN,
1835 					    TRMREG_SCSI_CONTROL);
1836 				}
1837 			} else if (pDCB->SyncMode & SYNC_NEGO_ENABLE) {
1838 			  /* do sync nego reject */
1839 				trm_reg_write16(DO_CLRATN,TRMREG_SCSI_CONTROL);
1840 				if (pSRB->SRBState & SRB_DO_SYNC_NEGO) {
1841 					pDCB = pSRB->pSRBDCB;
1842 					pDCB->SyncMode &=
1843 					  ~(SYNC_NEGO_ENABLE+SYNC_NEGO_DONE);
1844 					pDCB->SyncPeriod = 0;
1845 					pDCB->SyncOffset = 0;
1846 					goto  re_prog;
1847 				}
1848 			}
1849 			goto  min6;
1850 		} else if (message_in_code == MSG_IGNOREWIDE) {
1851 			trm_reg_write32(1, TRMREG_SCSI_COUNTER);
1852 			trm_reg_read8(TRMREG_SCSI_FIFO);
1853 			goto  min6;
1854 		} else {
1855 	  	  /* Restore data pointer message */
1856   		  /* Save data pointer message	  */
1857 		  /* Completion message		  */
1858 		  /* NOP message       	          */
1859 			goto  min6;
1860 		}
1861 	} else {
1862 	  /*
1863    	   * Parsing incomming extented messages
1864 	   */
1865 		*pSRB->pMsgPtr = message_in_code;
1866 		pSRB->MsgCnt++;
1867 		pSRB->pMsgPtr++;
1868 		TRM_DPRINTF("pSRB->MsgInBuf[0]=%2x \n ",pSRB->MsgInBuf[0]);
1869 		TRM_DPRINTF("pSRB->MsgInBuf[1]=%2x \n ",pSRB->MsgInBuf[1]);
1870 		TRM_DPRINTF("pSRB->MsgInBuf[2]=%2x \n ",pSRB->MsgInBuf[2]);
1871 		TRM_DPRINTF("pSRB->MsgInBuf[3]=%2x \n ",pSRB->MsgInBuf[3]);
1872 		TRM_DPRINTF("pSRB->MsgInBuf[4]=%2x \n ",pSRB->MsgInBuf[4]);
1873 	    	if ((pSRB->MsgInBuf[0] >= MSG_SIMPLE_QTAG)
1874 		    && (pSRB->MsgInBuf[0] <= MSG_ORDER_QTAG)) {
1875 		  /*
1876 	   	   * is QUEUE tag message :
1877    		   *
1878 	   	   * byte 0:
1879 	   	   * HEAD    QUEUE TAG (20h)
1880 	   	   * ORDERED QUEUE TAG (21h)
1881 	   	   * SIMPLE  QUEUE TAG (22h)
1882 	   	   * byte 1:
1883 	   	   * Queue tag (00h - FFh)
1884 	   	   */
1885 			if (pSRB->MsgCnt == 2) {
1886 				pSRB->SRBState = 0;
1887 				message_in_tag_id = pSRB->MsgInBuf[1];
1888 				pSRB = pDCB->pGoingSRB;
1889 				pSRBTemp = pDCB->pGoingLastSRB;
1890 				if (pSRB) {
1891 					for (;;) {
1892 						if (pSRB->TagNumber !=
1893 						    message_in_tag_id) {
1894 							if (pSRB == pSRBTemp) {
1895 								goto  mingx0;
1896 							}
1897 							pSRB = pSRB->pNextSRB;
1898 						} else
1899 							break;
1900 					}
1901 					if (pDCB->DCBFlag & ABORT_DEV_) {
1902 						pSRB->SRBState = SRB_ABORT_SENT;
1903 						trm_EnableMsgOutAbort1(
1904 						    pACB, pSRB);
1905 					}
1906 					if (!(pSRB->SRBState & SRB_DISCONNECT))
1907 						goto  mingx0;
1908 					pDCB->pActiveSRB = pSRB;
1909 					pSRB->SRBState = SRB_DATA_XFER;
1910 				} else {
1911 mingx0:
1912 	     				pSRB = pACB->pTmpSRB;
1913 					pSRB->SRBState = SRB_UNEXPECT_RESEL;
1914 					pDCB->pActiveSRB = pSRB;
1915 					pSRB->MsgOutBuf[0] = MSG_ABORT_TAG;
1916 					trm_EnableMsgOutAbort2(
1917 					    pACB,
1918 					    pSRB);
1919 				}
1920 			}
1921 		} else if ((pSRB->MsgInBuf[0] == MSG_EXTENDED) &&
1922 		    (pSRB->MsgInBuf[2] == 3) && (pSRB->MsgCnt == 4)) {
1923 		  /*
1924 	   	   * is Wide data xfer Extended message :
1925 	   	   * ======================================
1926 	   	   * WIDE DATA TRANSFER REQUEST
1927    		   * ======================================
1928 		   * byte 0 :  Extended message (01h)
1929 		   * byte 1 :  Extended message length (02h)
1930 		   * byte 2 :  WIDE DATA TRANSFER code (03h)
1931 		   * byte 3 :  Transfer width exponent
1932 		   */
1933 			pDCB = pSRB->pSRBDCB;
1934 			pSRB->SRBState &= ~(SRB_EXTEND_MSGIN+SRB_DO_WIDE_NEGO);
1935 			if ((pSRB->MsgInBuf[1] != 2)) {
1936 			  /* Length is wrong, reject it  */
1937 				pDCB->SyncMode &=
1938 				  ~(WIDE_NEGO_ENABLE+WIDE_NEGO_DONE);
1939 				pSRB->MsgCnt = 1;
1940 				pSRB->MsgInBuf[0] = MSG_REJECT_;
1941 				trm_reg_write16(DO_SETATN, TRMREG_SCSI_CONTROL);
1942 				goto  min6;
1943 			}
1944 			if (pDCB->SyncMode & WIDE_NEGO_ENABLE) {
1945 			  /* Do wide negoniation */
1946 				if (pSRB->MsgInBuf[3] > 2) {
1947 				  /* > 32 bit	*/
1948 				  /* reject_msg: */
1949 					pDCB->SyncMode &=
1950 					  ~(WIDE_NEGO_ENABLE+WIDE_NEGO_DONE);
1951 					pSRB->MsgCnt = 1;
1952 					pSRB->MsgInBuf[0] = MSG_REJECT_;
1953 					trm_reg_write16(DO_SETATN,
1954 					    TRMREG_SCSI_CONTROL);
1955 					goto  min6;
1956 				}
1957 				if (pSRB->MsgInBuf[3] == 2) {
1958 					pSRB->MsgInBuf[3] = 1;
1959 					/* do 16 bits	*/
1960 				} else {
1961 					if (!(pDCB->SyncMode
1962 					      & WIDE_NEGO_DONE)) {
1963 						pSRB->SRBState &=
1964 						  ~(SRB_DO_WIDE_NEGO+SRB_MSGIN);
1965 						pDCB->SyncMode |=
1966 						  WIDE_NEGO_DONE;
1967 						pDCB->SyncMode &=
1968 						  ~(SYNC_NEGO_DONE |
1969 						      EN_ATN_STOP |
1970 						      WIDE_NEGO_ENABLE);
1971 						if (pSRB->MsgInBuf[3] != 0) {
1972 						  /* is Wide data xfer */
1973 							pDCB->SyncPeriod |=
1974 							  WIDE_SYNC;
1975 							pDCB->tinfo.current.width
1976 							  = MSG_EXT_WDTR_BUS_16_BIT;
1977 							pDCB->tinfo.goal.width
1978 							  = MSG_EXT_WDTR_BUS_16_BIT;
1979 						}
1980 					}
1981 				}
1982 			} else
1983 				pSRB->MsgInBuf[3] = 0;
1984 			pSRB->SRBState |= SRB_MSGOUT;
1985 			trm_reg_write16(DO_SETATN,TRMREG_SCSI_CONTROL);
1986 			goto  min6;
1987 		} else if ((pSRB->MsgInBuf[0] == MSG_EXTENDED) &&
1988 		    (pSRB->MsgInBuf[2] == 1) && (pSRB->MsgCnt == 5)) {
1989 			/*
1990 			 * is 8bit transfer Extended message :
1991 			 * =================================
1992 			 * SYNCHRONOUS DATA TRANSFER REQUEST
1993 			 * =================================
1994 			 * byte 0 :  Extended message (01h)
1995 			 * byte 1 :  Extended message length (03)
1996 			 * byte 2 :  SYNCHRONOUS DATA TRANSFER code (01h)
1997 			 * byte 3 :  Transfer period factor
1998 			 * byte 4 :  REQ/ACK offset
1999 			 */
2000 			pSRB->SRBState &= ~(SRB_EXTEND_MSGIN+SRB_DO_SYNC_NEGO);
2001 			if ((pSRB->MsgInBuf[1] != 3) ||
2002 			    (pSRB->MsgInBuf[2] != 1)) {
2003 			  /* reject_msg: */
2004 				pSRB->MsgCnt = 1;
2005 				pSRB->MsgInBuf[0] = MSG_REJECT_;
2006 				trm_reg_write16(DO_SETATN, TRMREG_SCSI_CONTROL);
2007 			} else if (!(pSRB->MsgInBuf[3]) || !(pSRB->MsgInBuf[4])) {
2008 				/* set async */
2009 				pDCB = pSRB->pSRBDCB;
2010 				/* disable sync & sync nego */
2011 				pDCB->SyncMode &=
2012 				  ~(SYNC_NEGO_ENABLE+SYNC_NEGO_DONE);
2013 				pDCB->SyncPeriod = 0;
2014 				pDCB->SyncOffset = 0;
2015 				pDCB->tinfo.goal.period = 0;
2016 				pDCB->tinfo.goal.offset = 0;
2017 				pDCB->tinfo.current.period = 0;
2018 				pDCB->tinfo.current.offset = 0;
2019 				pDCB->tinfo.current.width =
2020 				  MSG_EXT_WDTR_BUS_8_BIT;
2021 				goto  re_prog;
2022 			} else {
2023 				/* set sync */
2024 				pDCB = pSRB->pSRBDCB;
2025 				pDCB->SyncMode |=
2026 				  SYNC_NEGO_ENABLE+SYNC_NEGO_DONE;
2027 				pDCB->MaxNegoPeriod = pSRB->MsgInBuf[3];
2028 				/* Transfer period factor */
2029 				pDCB->SyncOffset = pSRB->MsgInBuf[4];
2030 				/* REQ/ACK offset */
2031 				for (bIndex = 0; bIndex < 7; bIndex++) {
2032 				  if (pSRB->MsgInBuf[3] <=
2033 				      dc395x_trm_clock_period[bIndex]) {
2034 				  	break;
2035 				  }
2036 				}
2037 				pDCB->tinfo.goal.period =
2038 				  dc395x_trm_tinfo_sync_period[bIndex];
2039 				pDCB->tinfo.current.period =
2040 				  dc395x_trm_tinfo_sync_period[bIndex];
2041 				pDCB->tinfo.goal.offset = pDCB->SyncOffset;
2042 				pDCB->tinfo.current.offset = pDCB->SyncOffset;
2043 				pDCB->SyncPeriod |= (bIndex | ALT_SYNC);
2044 re_prog:
2045 				/*
2046 				 *
2047 	 			 *   program SCSI control register
2048 	 			 *
2049 	 			 */
2050 				trm_reg_write8(pDCB->SyncPeriod,
2051 				    TRMREG_SCSI_SYNC);
2052 				trm_reg_write8(pDCB->SyncOffset,
2053 				    TRMREG_SCSI_OFFSET);
2054 				trm_SetXferRate(pACB,pSRB,pDCB);
2055 			}
2056 		}
2057 	}
2058 min6:
2059 	*pscsi_status = PH_BUS_FREE;
2060 	/* .. initial phase */
2061 	trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
2062 	/* it's important for atn stop */
2063 	/*
2064 	 * SCSI cammand
2065 	 */
2066 	trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
2067 }
2068 
2069 static void
2070 trm_MsgInPhase1(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
2071 {
2072 
2073 	trm_reg_write16(DO_CLRFIFO, TRMREG_SCSI_CONTROL);
2074 	trm_reg_write32(1,TRMREG_SCSI_COUNTER);
2075 	if (!(pSRB->SRBState & SRB_MSGIN)) {
2076 		pSRB->SRBState &= SRB_DISCONNECT;
2077 		pSRB->SRBState |= SRB_MSGIN;
2078 	}
2079 	trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
2080 	/* it's important for atn stop*/
2081 	/*
2082 	 * SCSI cammand
2083 	 */
2084 	trm_reg_write8(SCMD_FIFO_IN, TRMREG_SCSI_COMMAND);
2085 }
2086 
2087 static void
2088 trm_Nop0(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
2089 {
2090 
2091 }
2092 
2093 static void
2094 trm_Nop1(PACB pACB, PSRB pSRB, u_int8_t *pscsi_status)
2095 {
2096 
2097 }
2098 
2099 static void
2100 trm_SetXferRate(PACB pACB,PSRB pSRB, PDCB pDCB)
2101 {
2102 	u_int16_t	cnt, i;
2103 	u_int8_t	bval;
2104 	PDCB		pDCBTemp;
2105 	u_int		target_id,target_lun;
2106 
2107 	/*
2108 	 * set all lun device's  period , offset
2109 	 */
2110 	target_id  = pSRB->pccb->ccb_h.target_id;
2111 	target_lun = pSRB->pccb->ccb_h.target_lun;
2112 	TRM_DPRINTF("trm_SetXferRate:target_id= %d ,target_lun= %d \n"
2113 	    ,target_id,target_lun);
2114 	if (!(pDCB->IdentifyMsg & 0x07)) {
2115 		if (!pACB->scan_devices[target_id][target_lun]) {
2116 			pDCBTemp = pACB->pLinkDCB;
2117 			cnt = pACB->DeviceCnt;
2118 			bval = pDCB->TargetID;
2119 			for (i = 0; i < cnt; i++) {
2120 				if (pDCBTemp->TargetID == bval) {
2121 					pDCBTemp->SyncPeriod = pDCB->SyncPeriod;
2122 					pDCBTemp->SyncOffset = pDCB->SyncOffset;
2123 					pDCBTemp->SyncMode = pDCB->SyncMode;
2124 				}
2125 				pDCBTemp = pDCBTemp->pNextDCB;
2126 			}
2127 		}
2128 	}
2129 	return;
2130 }
2131 
2132 /*
2133  * scsiiom
2134  *            trm_Interrupt
2135  *
2136  *
2137  *    ---SCSI bus phase
2138  *
2139  * 	PH_DATA_OUT	        0x00	 Data out phase
2140  * 	PH_DATA_IN	        0x01	 Data in phase
2141  * 	PH_COMMAND	        0x02	 Command phase
2142  * 	PH_STATUS	        0x03	 Status phase
2143  *	PH_BUS_FREE	        0x04	 Invalid phase used as bus free
2144  * 	PH_BUS_FREE	        0x05	 Invalid phase used as bus free
2145  * 	PH_MSG_OUT	        0x06	 Message out phase
2146  * 	PH_MSG_IN	        0x07	 Message in phase
2147  *
2148  */
2149 static void
2150 trm_Disconnect(PACB pACB)
2151 {
2152 	PDCB		pDCB;
2153 	PSRB		pSRB, psrb;
2154 	u_int16_t	i,j, cnt;
2155 	u_int8_t	bval;
2156 	u_int		target_id,target_lun;
2157 
2158 	TRM_DPRINTF("trm_Disconnect...............\n ");
2159 
2160 	crit_enter();
2161        	pDCB = pACB->pActiveDCB;
2162 	if (!pDCB) {
2163 		TRM_DPRINTF(" Exception Disconnect DCB=NULL..............\n ");
2164 		j = 400;
2165     		while (--j)
2166 			DELAY(1);
2167 		/* 1 msec */
2168 		trm_reg_write16((DO_CLRFIFO | DO_HWRESELECT),
2169 		    TRMREG_SCSI_CONTROL);
2170 		crit_exit();
2171 		return;
2172 	}
2173 	pSRB = pDCB->pActiveSRB;
2174 	/* bug pSRB=0 */
2175 	target_id  = pSRB->pccb->ccb_h.target_id;
2176 	target_lun = pSRB->pccb->ccb_h.target_lun;
2177 	TRM_DPRINTF(":pDCB->pActiveSRB= %8x \n ",(u_int) pDCB->pActiveSRB);
2178 	pACB->pActiveDCB = 0;
2179 	pSRB->ScsiPhase = PH_BUS_FREE;
2180 	/* SCSI bus free Phase */
2181 	trm_reg_write16((DO_CLRFIFO | DO_HWRESELECT), TRMREG_SCSI_CONTROL);
2182 	if (pSRB->SRBState & SRB_UNEXPECT_RESEL) {
2183 		pSRB->SRBState = 0;
2184 		trm_DoWaitingSRB(pACB);
2185 	} else if (pSRB->SRBState & SRB_ABORT_SENT) {
2186 		pDCB->TagMask = 0;
2187 		pDCB->DCBFlag = 0;
2188 		cnt = pDCB->GoingSRBCnt;
2189 		pDCB->GoingSRBCnt = 0;
2190 		pSRB = pDCB->pGoingSRB;
2191 		for (i = 0; i < cnt; i++) {
2192 			psrb = pSRB->pNextSRB;
2193 			pSRB->pNextSRB = pACB->pFreeSRB;
2194 			pACB->pFreeSRB = pSRB;
2195 			pSRB = psrb;
2196 		}
2197 		pDCB->pGoingSRB = 0;
2198 		trm_DoWaitingSRB(pACB);
2199 	} else {
2200 		if ((pSRB->SRBState & (SRB_START_+SRB_MSGOUT)) ||
2201 		    !(pSRB->SRBState & (SRB_DISCONNECT+SRB_COMPLETED))) {
2202 		  /* Selection time out */
2203 			if (!(pACB->scan_devices[target_id][target_lun])) {
2204 				pSRB->SRBState = SRB_READY;
2205 				trm_RewaitSRB(pDCB, pSRB);
2206 			} else {
2207 				pSRB->TargetStatus = SCSI_STAT_SEL_TIMEOUT;
2208 				goto  disc1;
2209 			}
2210 		} else if (pSRB->SRBState & SRB_DISCONNECT) {
2211 			/*
2212 			 * SRB_DISCONNECT
2213 			 */
2214 			trm_DoWaitingSRB(pACB);
2215 		} else if (pSRB->SRBState & SRB_COMPLETED) {
2216 disc1:
2217 		  /*
2218 		   * SRB_COMPLETED
2219 		   */
2220 			if (pDCB->MaxCommand > 1) {
2221 				bval = pSRB->TagNumber;
2222 				pDCB->TagMask &= (~(1 << bval));
2223 				/* free tag mask */
2224 			}
2225 			pDCB->pActiveSRB = 0;
2226 			pSRB->SRBState = SRB_FREE;
2227 			trm_SRBdone(pACB, pDCB, pSRB);
2228 		}
2229 	}
2230 	crit_exit();
2231 	return;
2232 }
2233 
2234 static void
2235 trm_Reselect(PACB pACB)
2236 {
2237 	PDCB		pDCB;
2238 	PSRB		pSRB;
2239 	u_int16_t	RselTarLunId;
2240 
2241 	TRM_DPRINTF("trm_Reselect................. \n");
2242 	pDCB = pACB->pActiveDCB;
2243 	if (pDCB) {
2244 	  /* Arbitration lost but Reselection win */
2245 		pSRB = pDCB->pActiveSRB;
2246 		pSRB->SRBState = SRB_READY;
2247 		trm_RewaitSRB(pDCB, pSRB);
2248 	}
2249 	/* Read Reselected Target Id and LUN */
2250 	RselTarLunId = trm_reg_read16(TRMREG_SCSI_TARGETID) & 0x1FFF;
2251 	pDCB = pACB->pLinkDCB;
2252 	while (RselTarLunId != *((u_int16_t *) &pDCB->TargetID)) {
2253 	  /* get pDCB of the reselect id */
2254 		pDCB = pDCB->pNextDCB;
2255 	}
2256 
2257 	pACB->pActiveDCB = pDCB;
2258 	if (pDCB->SyncMode & EN_TAG_QUEUING) {
2259 		pSRB = pACB->pTmpSRB;
2260 		pDCB->pActiveSRB = pSRB;
2261 	} else {
2262 		pSRB = pDCB->pActiveSRB;
2263 		if (!pSRB || !(pSRB->SRBState & SRB_DISCONNECT)) {
2264 		  /*
2265 	   	   * abort command
2266    		   */
2267 			pSRB = pACB->pTmpSRB;
2268 			pSRB->SRBState = SRB_UNEXPECT_RESEL;
2269 			pDCB->pActiveSRB = pSRB;
2270 			trm_EnableMsgOutAbort1(pACB, pSRB);
2271 		} else {
2272 			if (pDCB->DCBFlag & ABORT_DEV_) {
2273 				pSRB->SRBState = SRB_ABORT_SENT;
2274 				trm_EnableMsgOutAbort1(pACB, pSRB);
2275 			} else
2276 				pSRB->SRBState = SRB_DATA_XFER;
2277 		}
2278 	}
2279 	pSRB->ScsiPhase = PH_BUS_FREE;
2280 	/* SCSI bus free Phase */
2281 	/*
2282 	 * Program HA ID, target ID, period and offset
2283 	 */
2284 	trm_reg_write8((u_int8_t) RselTarLunId,TRMREG_SCSI_TARGETID);
2285 	/* target ID */
2286 	trm_reg_write8(pACB->AdaptSCSIID,TRMREG_SCSI_HOSTID);
2287 	/* host   ID */
2288 	trm_reg_write8(pDCB->SyncPeriod,TRMREG_SCSI_SYNC);
2289 	/* period    */
2290 	trm_reg_write8(pDCB->SyncOffset,TRMREG_SCSI_OFFSET);
2291 	/* offset    */
2292 	trm_reg_write16(DO_DATALATCH, TRMREG_SCSI_CONTROL);
2293 	/* it's important for atn stop*/
2294 	/*
2295 	 * SCSI cammand
2296 	 */
2297 	trm_reg_write8(SCMD_MSGACCEPT, TRMREG_SCSI_COMMAND);
2298 	/* to rls the /ACK signal */
2299 }
2300 
2301 static void
2302 trm_SRBdone(PACB pACB, PDCB pDCB, PSRB pSRB)
2303 {
2304 	PSRB			psrb;
2305 	u_int8_t		bval, bval1,status;
2306 	union ccb		*pccb;
2307 	struct ccb_scsiio	*pcsio;
2308 	PSCSI_INQDATA		ptr;
2309 	u_int			target_id,target_lun;
2310 	PDCB			pTempDCB;
2311 
2312 	pccb  = pSRB->pccb;
2313 	if (pccb == NULL)
2314 		return;
2315 	pcsio = &pccb->csio;
2316 	target_id  = pSRB->pccb->ccb_h.target_id;
2317 	target_lun = pSRB->pccb->ccb_h.target_lun;
2318 	if ((pccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
2319 		bus_dmasync_op_t op;
2320 		if ((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)
2321 			op = BUS_DMASYNC_POSTREAD;
2322 		else
2323 			op = BUS_DMASYNC_POSTWRITE;
2324 		bus_dmamap_sync(pACB->buffer_dmat, pSRB->dmamap, op);
2325 		bus_dmamap_unload(pACB->buffer_dmat, pSRB->dmamap);
2326 	}
2327     	/*
2328 	 *
2329 	 * target status
2330 	 *
2331 	 */
2332 	status = pSRB->TargetStatus;
2333 	pcsio->scsi_status=SCSI_STAT_GOOD;
2334 	pccb->ccb_h.status = CAM_REQ_CMP;
2335 	if (pSRB->SRBFlag & AUTO_REQSENSE) {
2336 	  /*
2337    	   * status of auto request sense
2338 	   */
2339 		pSRB->SRBFlag &= ~AUTO_REQSENSE;
2340 		pSRB->AdaptStatus = 0;
2341 		pSRB->TargetStatus = SCSI_STATUS_CHECK_COND;
2342 
2343 		if (status == SCSI_STATUS_CHECK_COND) {
2344 			pccb->ccb_h.status = CAM_SEL_TIMEOUT;
2345 			goto ckc_e;
2346 		}
2347 		*((u_long *) &(pSRB->CmdBlock[0])) = pSRB->Segment0[0];
2348 		*((u_long *) &(pSRB->CmdBlock[4])) = pSRB->Segment0[1];
2349 		pSRB->SRBTotalXferLength = pSRB->Segment1[1];
2350 		pSRB->SegmentX[0].address = pSRB->SgSenseTemp.address;
2351 		pSRB->SegmentX[0].length = pSRB->SgSenseTemp.length;
2352 		pcsio->scsi_status = SCSI_STATUS_CHECK_COND;
2353 		pccb->ccb_h.status = CAM_AUTOSNS_VALID;
2354 		goto ckc_e;
2355 	}
2356 	/*
2357 	 * target status
2358 	 */
2359 	if (status) {
2360 		if (status == SCSI_STATUS_CHECK_COND) {
2361 			if ((pcsio->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0) {
2362 			  TRM_DPRINTF("trm_RequestSense..................\n");
2363 			  trm_RequestSense(pACB, pDCB, pSRB);
2364 			  return;
2365 			}
2366 			pcsio->scsi_status = SCSI_STATUS_CHECK_COND;
2367 			pccb->ccb_h.status = CAM_AUTOSNS_VALID |
2368 			  CAM_SCSI_STATUS_ERROR;
2369 			goto ckc_e;
2370 		} else if (status == SCSI_STAT_QUEUEFULL) {
2371 			bval = (u_int8_t) pDCB->GoingSRBCnt;
2372 			bval--;
2373 			pDCB->MaxCommand = bval;
2374 			trm_RewaitSRB(pDCB, pSRB);
2375 			pSRB->AdaptStatus = 0;
2376 			pSRB->TargetStatus = 0;
2377 			pcsio->scsi_status = SCSI_STAT_QUEUEFULL;
2378 			pccb->ccb_h.status = CAM_SCSI_STATUS_ERROR;
2379 			goto ckc_e;
2380 		} else if (status == SCSI_STAT_SEL_TIMEOUT) {
2381 			pSRB->AdaptStatus  = H_SEL_TIMEOUT;
2382 			pSRB->TargetStatus = 0;
2383 			pcsio->scsi_status = SCSI_STAT_SEL_TIMEOUT;
2384 			pccb->ccb_h.status = CAM_SEL_TIMEOUT;
2385 		} else if (status == SCSI_STAT_BUSY) {
2386 			TRM_DPRINTF("trm: target busy at %s %d\n",
2387 				__FILE__, __LINE__);
2388 			pcsio->scsi_status = SCSI_STAT_BUSY;
2389 			pccb->ccb_h.status = CAM_SCSI_BUSY;
2390 		  /* The device busy, try again later?	  */
2391 		} else if (status == SCSI_STAT_RESCONFLICT) {
2392 			TRM_DPRINTF("trm: target reserved at %s %d\n",
2393 				__FILE__, __LINE__);
2394 			pcsio->scsi_status = SCSI_STAT_RESCONFLICT;
2395 			pccb->ccb_h.status = CAM_SCSI_STATUS_ERROR;	/*XXX*/
2396 		} else {
2397 			pSRB->AdaptStatus = 0;
2398 			if (pSRB->RetryCnt) {
2399 				pSRB->RetryCnt--;
2400 				pSRB->TargetStatus = 0;
2401 				pSRB->SRBSGIndex = 0;
2402 				pSRB->SRBSGListPointer = (PSEG)
2403 				  &pSRB->SegmentX[0];
2404 				if (trm_StartSCSI(pACB, pDCB, pSRB)) {
2405 				  /*
2406 				   * If trm_StartSCSI return 1 :
2407 				   * current interrupt status is interrupt
2408 				   * disreenable
2409 				   * It's said that SCSI processor has more
2410 				   * one SRB need to do
2411 				   */
2412 					trm_RewaitSRB(pDCB, pSRB);
2413 				}
2414 				return;
2415 			} else {
2416         			TRM_DPRINTF("trm: driver stuffup at %s %d\n",
2417 					__FILE__, __LINE__);
2418 		      		pccb->ccb_h.status = CAM_SCSI_STATUS_ERROR;
2419 			}
2420 		}
2421 	} else {
2422         /*
2423  	 * process initiator status..........................
2424 	 * Adapter (initiator) status
2425 	 */
2426 		status = pSRB->AdaptStatus;
2427 		if (status & H_OVER_UNDER_RUN) {
2428 			pSRB->TargetStatus = 0;
2429 			pccb->ccb_h.status = CAM_DATA_RUN_ERR;
2430 			/* Illegal length (over/under run) */
2431 		} else if (pSRB->SRBStatus & PARITY_ERROR) {
2432 			TRM_DPRINTF("trm: driver stuffup %s %d\n",
2433 				__FILE__, __LINE__);
2434 			pDCB->tinfo.goal.period = 0;
2435 			pDCB->tinfo.goal.offset = 0;
2436 			/* Driver failed to perform operation */
2437 			pccb->ccb_h.status = CAM_UNCOR_PARITY;
2438 		} else {
2439 		  /* no error */
2440 			pSRB->AdaptStatus = 0;
2441 			pSRB->TargetStatus = 0;
2442 			pccb->ccb_h.status = CAM_REQ_CMP;
2443 			/* there is no error, (sense is invalid) */
2444 		}
2445 	}
2446 ckc_e:
2447 	if (pACB->scan_devices[target_id][target_lun]) {
2448 	  /*
2449 	   *   if SCSI command in "scan devices" duty
2450 	   */
2451 		if (pSRB->CmdBlock[0] == TEST_UNIT_READY)
2452 			pACB->scan_devices[target_id][target_lun] = 0;
2453 		/* SCSI command phase :test unit ready */
2454 		else if (pSRB->CmdBlock[0] == INQUIRY) {
2455 		  /*
2456 		   * SCSI command phase :inquiry scsi device data
2457 		   * (type,capacity,manufacture....
2458 		   */
2459 			if (pccb->ccb_h.status == CAM_SEL_TIMEOUT)
2460 				goto NO_DEV;
2461 			ptr = (PSCSI_INQDATA) pcsio->data_ptr;
2462 			/* page fault */
2463 			TRM_DPRINTF("trm_SRBdone..PSCSI_INQDATA:%2x \n",
2464 			    ptr->DevType);
2465 		  	bval1 = ptr->DevType & SCSI_DEVTYPE;
2466 			if (bval1 == SCSI_NODEV) {
2467 NO_DEV:
2468 	  			TRM_DPRINTF("trm_SRBdone NO Device:target_id= %d ,target_lun= %d \n",
2469 				    target_id,
2470 				    target_lun);
2471 				crit_enter();
2472 				pACB->scan_devices[target_id][target_lun] = 0;
2473 				/* no device set scan device flag =0*/
2474 				/* pDCB Q link */
2475 				/* move the head of DCB to tempDCB*/
2476 				pTempDCB=pACB->pLinkDCB;
2477 				/* search current DCB for pass link */
2478 				while (pTempDCB->pNextDCB != pDCB) {
2479 					pTempDCB = pTempDCB->pNextDCB;
2480 				}
2481 				/*
2482 				 * when the current DCB found than connect
2483 				 * current DCB tail
2484 				 */
2485 				/* to the DCB tail that before current DCB */
2486 				pTempDCB->pNextDCB = pDCB->pNextDCB;
2487 				/*
2488 				 * if there was only one DCB ,connect his tail
2489 				 * to his head
2490 				 */
2491 				if (pACB->pLinkDCB == pDCB)
2492 					pACB->pLinkDCB = pTempDCB->pNextDCB;
2493 				if (pACB->pDCBRunRobin == pDCB)
2494 					pACB->pDCBRunRobin = pTempDCB->pNextDCB;
2495 				pACB->DeviceCnt--;
2496 				if (pACB->DeviceCnt == 0) {
2497 					pACB->pLinkDCB = NULL;
2498 					pACB->pDCBRunRobin = NULL;
2499 				}
2500 				crit_exit();
2501 			} else {
2502 #ifdef trm_DEBUG1
2503 				int j;
2504 				for (j = 0; j < 28; j++) {
2505 					TRM_DPRINTF("ptr=%2x ",
2506 						((u_int8_t *)ptr)[j]);
2507 				}
2508 #endif
2509 	      			pDCB->DevType = bval1;
2510 				if (bval1 == SCSI_DASD ||
2511 				    bval1 == SCSI_OPTICAL) {
2512 					if ((((ptr->Vers & 0x07) >= 2) ||
2513 					      ((ptr->RDF & 0x0F) == 2)) &&
2514 					    (ptr->Flags & SCSI_INQ_CMDQUEUE) &&
2515 					    (pDCB->DevMode & TAG_QUEUING_) &&
2516 					    (pDCB->DevMode & EN_DISCONNECT_)) {
2517 						if (pDCB->DevMode &
2518 						    TAG_QUEUING_) {
2519 							pDCB->MaxCommand =
2520 							  pACB->TagMaxNum;
2521 							pDCB->SyncMode |=
2522 							  EN_TAG_QUEUING;
2523 							pDCB->TagMask = 0;
2524 							pDCB->tinfo.disc_tag |=
2525 							  TRM_CUR_TAGENB;
2526 						} else {
2527 							pDCB->SyncMode |=
2528 							  EN_ATN_STOP;
2529 							pDCB->tinfo.disc_tag &=
2530 							  ~TRM_CUR_TAGENB;
2531 						}
2532 					}
2533 				}
2534 			}
2535 			/* pSRB->CmdBlock[0] == INQUIRY */
2536 		}
2537 		/* pACB->scan_devices[target_id][target_lun] */
2538 	}
2539 	crit_enter();
2540 	/*  ReleaseSRB(pDCB, pSRB); */
2541 	if (pSRB == pDCB->pGoingSRB)
2542 		pDCB->pGoingSRB = pSRB->pNextSRB;
2543 	else {
2544 		psrb = pDCB->pGoingSRB;
2545 		while (psrb->pNextSRB != pSRB) {
2546 			psrb = psrb->pNextSRB;
2547 		}
2548 		psrb->pNextSRB = pSRB->pNextSRB;
2549 		if (pSRB == pDCB->pGoingLastSRB) {
2550 			pDCB->pGoingLastSRB = psrb;
2551 		}
2552 	}
2553 	pSRB->pNextSRB = pACB->pFreeSRB;
2554 	pACB->pFreeSRB = pSRB;
2555 	pDCB->GoingSRBCnt--;
2556 	trm_DoWaitingSRB(pACB);
2557 
2558 	crit_exit();
2559 	/*  Notify cmd done */
2560 	xpt_done (pccb);
2561 }
2562 
2563 static void
2564 trm_DoingSRB_Done(PACB pACB)
2565 {
2566 	PDCB		pDCB, pdcb;
2567 	PSRB		psrb, psrb2;
2568 	u_int16_t	cnt, i;
2569 	union ccb 	*pccb;
2570 
2571 	pDCB = pACB->pLinkDCB;
2572 	if (pDCB == NULL)
2573   		return;
2574 	pdcb = pDCB;
2575     	do {
2576 		cnt = pdcb->GoingSRBCnt;
2577 		psrb = pdcb->pGoingSRB;
2578 		for (i = 0; i < cnt; i++) {
2579 			psrb2 = psrb->pNextSRB;
2580 		    	pccb = psrb->pccb;
2581 			pccb->ccb_h.status = CAM_SEL_TIMEOUT;
2582 			/*  ReleaseSRB(pDCB, pSRB); */
2583 			psrb->pNextSRB = pACB->pFreeSRB;
2584 			pACB->pFreeSRB = psrb;
2585 			xpt_done(pccb);
2586 			psrb  = psrb2;
2587 		}
2588 		pdcb->GoingSRBCnt = 0;
2589 		pdcb->pGoingSRB = NULL;
2590 		pdcb->TagMask = 0;
2591 		pdcb = pdcb->pNextDCB;
2592 	}
2593 	while (pdcb != pDCB);
2594 }
2595 
2596 static void
2597 trm_ResetSCSIBus(PACB pACB)
2598 {
2599 	crit_enter();
2600     	pACB->ACBFlag |= RESET_DEV;
2601 
2602 	trm_reg_write16(DO_RSTSCSI,TRMREG_SCSI_CONTROL);
2603 	while (!(trm_reg_read16(TRMREG_SCSI_INTSTATUS) & INT_SCSIRESET));
2604 	crit_exit();
2605 	return;
2606 }
2607 
2608 static void
2609 trm_ScsiRstDetect(PACB pACB)
2610 {
2611 	u_long	wlval;
2612 
2613 	TRM_DPRINTF("trm_ScsiRstDetect \n");
2614 	wlval = 1000;
2615 	while (--wlval)
2616 		DELAY(1000);
2617 	crit_enter();
2618     	trm_reg_write8(STOPDMAXFER,TRMREG_DMA_CONTROL);
2619 
2620 	trm_reg_write16(DO_CLRFIFO,TRMREG_SCSI_CONTROL);
2621 
2622 	if (pACB->ACBFlag & RESET_DEV)
2623 		pACB->ACBFlag |= RESET_DONE;
2624 	else {
2625 		pACB->ACBFlag |= RESET_DETECT;
2626 		trm_ResetDevParam(pACB);
2627 		/*	trm_DoingSRB_Done(pACB); ???? */
2628 		trm_RecoverSRB(pACB);
2629 		pACB->pActiveDCB = NULL;
2630 		pACB->ACBFlag = 0;
2631 		trm_DoWaitingSRB(pACB);
2632 	}
2633 	crit_exit();
2634     	return;
2635 }
2636 
2637 static void
2638 trm_RequestSense(PACB pACB, PDCB pDCB, PSRB pSRB)
2639 {
2640 	union ccb		*pccb;
2641 	struct ccb_scsiio	*pcsio;
2642 
2643 	pccb  = pSRB->pccb;
2644 	pcsio = &pccb->csio;
2645 
2646 	pSRB->SRBFlag |= AUTO_REQSENSE;
2647 	pSRB->Segment0[0] = *((u_long *) &(pSRB->CmdBlock[0]));
2648 	pSRB->Segment0[1] = *((u_long *) &(pSRB->CmdBlock[4]));
2649 	pSRB->Segment1[0] = (u_long) ((pSRB->ScsiCmdLen << 8) +
2650 	    pSRB->SRBSGCount);
2651 	pSRB->Segment1[1] = pSRB->SRBTotalXferLength; /* ?????????? */
2652 
2653 	/* $$$$$$ Status of initiator/target $$$$$$$$ */
2654 	pSRB->AdaptStatus = 0;
2655 	pSRB->TargetStatus = 0;
2656 	/* $$$$$$ Status of initiator/target $$$$$$$$ */
2657 
2658 	pSRB->SRBTotalXferLength = sizeof(pcsio->sense_data);
2659 	pSRB->SgSenseTemp.address = pSRB->SegmentX[0].address;
2660 	pSRB->SgSenseTemp.length  = pSRB->SegmentX[0].length;
2661 	pSRB->SegmentX[0].address = (u_long) vtophys(&pcsio->sense_data);
2662 	pSRB->SegmentX[0].length = (u_long) pcsio->sense_len;
2663 	pSRB->SRBSGListPointer = &pSRB->SegmentX[0];
2664 	pSRB->SRBSGCount = 1;
2665 	pSRB->SRBSGIndex = 0;
2666 
2667 	*((u_long *) &(pSRB->CmdBlock[0])) = 0x00000003;
2668 	pSRB->CmdBlock[1] = pDCB->IdentifyMsg << 5;
2669 	*((u_int16_t *) &(pSRB->CmdBlock[4])) = pcsio->sense_len;
2670 	pSRB->ScsiCmdLen = 6;
2671 
2672 	if (trm_StartSCSI(pACB, pDCB, pSRB))
2673 	   /*
2674 	    * If trm_StartSCSI return 1 :
2675 	    * current interrupt status is interrupt disreenable
2676 	    * It's said that SCSI processor has more one SRB need to do
2677 	    */
2678 		trm_RewaitSRB(pDCB, pSRB);
2679 }
2680 
2681 static void
2682 trm_EnableMsgOutAbort2(PACB pACB, PSRB pSRB)
2683 {
2684 
2685 	pSRB->MsgCnt = 1;
2686 	trm_reg_write16(DO_SETATN, TRMREG_SCSI_CONTROL);
2687 }
2688 
2689 static void
2690 trm_EnableMsgOutAbort1(PACB pACB, PSRB pSRB)
2691 {
2692 
2693 	pSRB->MsgOutBuf[0] = MSG_ABORT;
2694 	trm_EnableMsgOutAbort2(pACB, pSRB);
2695 }
2696 
2697 static void
2698 trm_initDCB(PACB pACB, PDCB pDCB, u_int16_t unit,u_int32_t i,u_int32_t j)
2699 {
2700 	PNVRAMTYPE 	pEEpromBuf;
2701 	u_int8_t	bval,PeriodIndex;
2702 	u_int		target_id,target_lun;
2703 	PDCB		pTempDCB;
2704 
2705     	target_id  = i;
2706 	target_lun = j;
2707 
2708 	crit_enter();
2709 	if (pACB->pLinkDCB == 0) {
2710 		pACB->pLinkDCB = pDCB;
2711 		/*
2712 		 * RunRobin impersonate the role
2713 		 * that let each device had good proportion
2714 		 * about SCSI command proceeding
2715 		 */
2716 		pACB->pDCBRunRobin = pDCB;
2717 		pDCB->pNextDCB = pDCB;
2718 	} else {
2719 		pTempDCB=pACB->pLinkDCB;
2720 		/* search the last nod of DCB link */
2721 		while (pTempDCB->pNextDCB != pACB->pLinkDCB)
2722 			pTempDCB = pTempDCB->pNextDCB;
2723 		/* connect current DCB with last DCB tail */
2724 		pTempDCB->pNextDCB = pDCB;
2725 		/* connect current DCB tail to this DCB Q head */
2726 		pDCB->pNextDCB=pACB->pLinkDCB;
2727 	}
2728 	crit_exit();
2729 
2730 	pACB->DeviceCnt++;
2731 	pDCB->pDCBACB = pACB;
2732 	pDCB->TargetID = target_id;
2733 	pDCB->TargetLUN =  target_lun;
2734 	pDCB->pWaitingSRB = NULL;
2735 	pDCB->pGoingSRB = NULL;
2736 	pDCB->GoingSRBCnt = 0;
2737 	pDCB->pActiveSRB = NULL;
2738 	pDCB->TagMask = 0;
2739 	pDCB->MaxCommand = 1;
2740 	pDCB->DCBFlag = 0;
2741 	/* $$$$$$$ */
2742 	pEEpromBuf = &trm_eepromBuf[unit];
2743 	pDCB->DevMode = pEEpromBuf->NvramTarget[target_id].NvmTarCfg0;
2744 	pDCB->AdpMode = pEEpromBuf->NvramChannelCfg;
2745 	/* $$$$$$$ */
2746 	/*
2747 	 * disconnect enable ?
2748 	 */
2749 	if (pDCB->DevMode & NTC_DO_DISCONNECT) {
2750 		bval = 0xC0;
2751 		pDCB->tinfo.disc_tag |= TRM_USR_DISCENB ;
2752 	} else {
2753 		bval = 0x80;
2754 		pDCB->tinfo.disc_tag &= ~(TRM_USR_DISCENB);
2755 	}
2756 	bval |= target_lun;
2757 	pDCB->IdentifyMsg = bval;
2758 	/* $$$$$$$ */
2759 	/*
2760 	 * tag Qing enable ?
2761 	 */
2762 	if (pDCB->DevMode & TAG_QUEUING_) {
2763 		pDCB->tinfo.disc_tag |= TRM_USR_TAGENB ;
2764 	} else
2765 		pDCB->tinfo.disc_tag &= ~(TRM_USR_TAGENB);
2766 	/* $$$$$$$ */
2767 	/*
2768 	 * wide nego ,sync nego enable ?
2769 	 */
2770 	pDCB->SyncPeriod = 0;
2771 	pDCB->SyncOffset = 0;
2772 	PeriodIndex = pEEpromBuf->NvramTarget[target_id].NvmTarPeriod & 0x07;
2773 	pDCB->MaxNegoPeriod = dc395x_trm_clock_period[ PeriodIndex ] ;
2774 	pDCB->SyncMode = 0;
2775 	if ((pDCB->DevMode & NTC_DO_WIDE_NEGO) &&
2776 	    (pACB->Config & HCC_WIDE_CARD))
2777 		pDCB->SyncMode |= WIDE_NEGO_ENABLE;
2778 	/* enable wide nego */
2779    	if (pDCB->DevMode & NTC_DO_SYNC_NEGO)
2780 		pDCB->SyncMode |= SYNC_NEGO_ENABLE;
2781 	/* enable sync nego */
2782 	/* $$$$$$$ */
2783 	/*
2784 	 *	Fill in tinfo structure.
2785 	 */
2786 	pDCB->tinfo.user.period = pDCB->MaxNegoPeriod;
2787 	pDCB->tinfo.user.offset = (pDCB->SyncMode & SYNC_NEGO_ENABLE) ? 15 : 0;
2788 	pDCB->tinfo.user.width  = (pDCB->SyncMode & WIDE_NEGO_ENABLE) ?
2789 	  MSG_EXT_WDTR_BUS_16_BIT : MSG_EXT_WDTR_BUS_8_BIT;
2790 
2791 	pDCB->tinfo.current.period = 0;
2792 	pDCB->tinfo.current.offset = 0;
2793 	pDCB->tinfo.current.width = MSG_EXT_WDTR_BUS_8_BIT;
2794 }
2795 
2796 static void
2797 trm_initSRB(PSRB psrb)
2798 {
2799 
2800 	psrb->PhysSRB = vtophys(psrb);
2801 }
2802 
2803 static void
2804 trm_linkSRB(PACB pACB)
2805 {
2806 	u_int16_t	i;
2807 
2808 	for (i = 0; i < MAX_SRB_CNT; i++) {
2809 		if (i != MAX_SRB_CNT - 1)
2810 			/*
2811 			 * link all SRB
2812 			 */
2813 			pACB->SRB_array[i].pNextSRB = &pACB->SRB_array[i+1];
2814     	else
2815 			/*
2816 			 * load NULL to NextSRB of the last SRB
2817 			 */
2818 		pACB->SRB_array[i].pNextSRB = NULL;
2819 	/*
2820  	 * convert and save physical address of SRB to pSRB->PhysSRB
2821 	 */
2822 	trm_initSRB((PSRB) &pACB->SRB_array[i]);
2823 	}
2824 }
2825 
2826 
2827 static void
2828 trm_initACB(PACB pACB, u_int16_t unit)
2829 {
2830 	PNVRAMTYPE	pEEpromBuf;
2831 	u_int16_t		i,j;
2832 
2833 	pEEpromBuf = &trm_eepromBuf[unit];
2834 	pACB->max_id = 15;
2835 
2836 	if (pEEpromBuf->NvramChannelCfg & NAC_SCANLUN)
2837   		pACB->max_lun = 7;
2838 	else
2839 		pACB->max_lun = 0;
2840 
2841 	TRM_DPRINTF("trm: pACB->max_id= %d pACB->max_lun= %d \n",
2842 	    pACB->max_id, pACB->max_lun);
2843 
2844 	pACB->pLinkDCB = NULL;
2845 	pACB->pDCBRunRobin = NULL;
2846 	pACB->pActiveDCB = NULL;
2847 	pACB->pFreeSRB = pACB->SRB_array;
2848 	pACB->AdapterUnit = unit;
2849 	pACB->AdaptSCSIID = pEEpromBuf->NvramScsiId;
2850 	pACB->AdaptSCSILUN = 0;
2851 	pACB->DeviceCnt = 0;
2852 	pACB->TagMaxNum = 2 << pEEpromBuf->NvramMaxTag ;
2853 	pACB->ACBFlag = 0;
2854 	/*
2855 	 * link all device's SRB Q of this adapter
2856 	 */
2857 	trm_linkSRB(pACB);
2858 	/*
2859 	 * temp SRB for Q tag used or abord command used
2860 	 */
2861 	pACB->pTmpSRB = &pACB->TmpSRB;
2862 	/*
2863 	 * convert and save physical address of SRB to pSRB->PhysSRB
2864 	 */
2865 	trm_initSRB(pACB->pTmpSRB);
2866 	/* allocate DCB array for scan device */
2867 	for (i = 0; i < (pACB->max_id +1); i++) {
2868 		if (pACB->AdaptSCSIID != i) {
2869 			for (j = 0; j < (pACB->max_lun +1); j++) {
2870 				pACB->scan_devices[i][j] = 1;
2871 				pACB->pDCB[i][j]= (PDCB) kmalloc (
2872 				    sizeof (struct _DCB), M_DEVBUF, M_WAITOK);
2873 				trm_initDCB(pACB,
2874 				    pACB->pDCB[i][j], unit, i, j);
2875 				TRM_DPRINTF("pDCB= %8x \n",
2876 					(u_int)pACB->pDCB[i][j]);
2877 			}
2878 		}
2879 	}
2880     	TRM_DPRINTF("sizeof(struct _DCB)= %8x \n",sizeof(struct _DCB));
2881 	TRM_DPRINTF("sizeof(struct _ACB)= %8x \n",sizeof(struct _ACB));
2882 	TRM_DPRINTF("sizeof(struct _SRB)= %8x \n",sizeof(struct _SRB));
2883 }
2884 
2885 static void
2886 TRM_write_all(PNVRAMTYPE pEEpromBuf,PACB pACB)
2887 {
2888 	u_int8_t	*bpEeprom = (u_int8_t *) pEEpromBuf;
2889 	u_int8_t	bAddr;
2890 
2891 	/* Enable SEEPROM */
2892 	trm_reg_write8((trm_reg_read8(TRMREG_GEN_CONTROL) | EN_EEPROM),
2893 	    TRMREG_GEN_CONTROL);
2894 	/*
2895 	 * Write enable
2896 	 */
2897 	TRM_write_cmd(pACB, 0x04, 0xFF);
2898 	trm_reg_write8(0, TRMREG_GEN_NVRAM);
2899 	TRM_wait_30us(pACB);
2900 	for (bAddr = 0; bAddr < 128; bAddr++, bpEeprom++) {
2901 		TRM_set_data(pACB, bAddr, *bpEeprom);
2902 	}
2903 	/*
2904 	 * Write disable
2905 	 */
2906 	TRM_write_cmd(pACB, 0x04, 0x00);
2907 	trm_reg_write8(0 , TRMREG_GEN_NVRAM);
2908 	TRM_wait_30us(pACB);
2909 	/* Disable SEEPROM */
2910 	trm_reg_write8((trm_reg_read8(TRMREG_GEN_CONTROL) & ~EN_EEPROM),
2911 	    TRMREG_GEN_CONTROL);
2912 	return;
2913 }
2914 
2915 static void
2916 TRM_set_data(PACB pACB, u_int8_t bAddr, u_int8_t bData)
2917 {
2918 	int		i;
2919 	u_int8_t	bSendData;
2920 	/*
2921 	 * Send write command & address
2922 	 */
2923 
2924 	TRM_write_cmd(pACB, 0x05, bAddr);
2925 	/*
2926 	 * Write data
2927 	 */
2928 	for (i = 0; i < 8; i++, bData <<= 1) {
2929 		bSendData = NVR_SELECT;
2930 		if (bData & 0x80)
2931 		  /* Start from bit 7	*/
2932 			bSendData |= NVR_BITOUT;
2933 		trm_reg_write8(bSendData , TRMREG_GEN_NVRAM);
2934 		TRM_wait_30us(pACB);
2935 		trm_reg_write8((bSendData | NVR_CLOCK), TRMREG_GEN_NVRAM);
2936 		TRM_wait_30us(pACB);
2937 	}
2938 	trm_reg_write8(NVR_SELECT , TRMREG_GEN_NVRAM);
2939 	TRM_wait_30us(pACB);
2940 	/*
2941 	 * Disable chip select
2942 	 */
2943 	trm_reg_write8(0 , TRMREG_GEN_NVRAM);
2944 	TRM_wait_30us(pACB);
2945 	trm_reg_write8(NVR_SELECT ,TRMREG_GEN_NVRAM);
2946 	TRM_wait_30us(pACB);
2947 	/*
2948 	 * Wait for write ready
2949 	 */
2950 	while (1) {
2951 		trm_reg_write8((NVR_SELECT | NVR_CLOCK), TRMREG_GEN_NVRAM);
2952 		TRM_wait_30us(pACB);
2953 		trm_reg_write8(NVR_SELECT, TRMREG_GEN_NVRAM);
2954 		TRM_wait_30us(pACB);
2955 		if (trm_reg_read8(TRMREG_GEN_NVRAM) & NVR_BITIN) {
2956 			break;
2957 		}
2958 	}
2959 	/*
2960 	 * Disable chip select
2961 	 */
2962 	trm_reg_write8(0, TRMREG_GEN_NVRAM);
2963 	return;
2964 }
2965 
2966 static void
2967 TRM_read_all(PNVRAMTYPE pEEpromBuf, PACB pACB)
2968 {
2969 	u_int8_t	*bpEeprom = (u_int8_t*) pEEpromBuf;
2970 	u_int8_t	bAddr;
2971 
2972 	/*
2973 	 * Enable SEEPROM
2974 	 */
2975 	trm_reg_write8((trm_reg_read8(TRMREG_GEN_CONTROL) | EN_EEPROM),
2976 	    TRMREG_GEN_CONTROL);
2977 	for (bAddr = 0; bAddr < 128; bAddr++, bpEeprom++)
2978 		*bpEeprom = TRM_get_data(pACB, bAddr);
2979 	/*
2980 	 * Disable SEEPROM
2981 	 */
2982 	trm_reg_write8((trm_reg_read8(TRMREG_GEN_CONTROL) & ~EN_EEPROM),
2983 	    TRMREG_GEN_CONTROL);
2984 	return;
2985 }
2986 
2987 static u_int8_t
2988 TRM_get_data(PACB pACB, u_int8_t bAddr)
2989 {
2990 	int		i;
2991 	u_int8_t	bReadData, bData = 0;
2992 	/*
2993 	* Send read command & address
2994 	*/
2995 
2996 	TRM_write_cmd(pACB, 0x06, bAddr);
2997 
2998 	for (i = 0; i < 8; i++) {
2999 	  /*
3000 	   * Read data
3001 	   */
3002 		trm_reg_write8((NVR_SELECT | NVR_CLOCK) , TRMREG_GEN_NVRAM);
3003 		TRM_wait_30us(pACB);
3004 		trm_reg_write8(NVR_SELECT , TRMREG_GEN_NVRAM);
3005 		/*
3006 		 * Get data bit while falling edge
3007 		 */
3008 		bReadData = trm_reg_read8(TRMREG_GEN_NVRAM);
3009 		bData <<= 1;
3010 		if (bReadData & NVR_BITIN) {
3011 			bData |= 1;
3012 		}
3013 		TRM_wait_30us(pACB);
3014 	}
3015 	/*
3016 	 * Disable chip select
3017 	 */
3018 	trm_reg_write8(0, TRMREG_GEN_NVRAM);
3019 	return (bData);
3020 }
3021 
3022 static void
3023 TRM_wait_30us(PACB pACB)
3024 {
3025 
3026 	/*    ScsiPortStallExecution(30);	 wait 30 us	*/
3027 	trm_reg_write8(5, TRMREG_GEN_TIMER);
3028 	while (!(trm_reg_read8(TRMREG_GEN_STATUS) & GTIMEOUT));
3029 	return;
3030 }
3031 
3032 static void
3033 TRM_write_cmd(PACB pACB, u_int8_t bCmd, u_int8_t bAddr)
3034 {
3035 	int		i;
3036 	u_int8_t	bSendData;
3037 
3038     	for (i = 0; i < 3; i++, bCmd <<= 1) {
3039 	  /*
3040    	   * Program SB+OP code
3041    	   */
3042      		bSendData = NVR_SELECT;
3043 		if (bCmd & 0x04)
3044 			bSendData |= NVR_BITOUT;
3045 		/* start from bit 2 */
3046 		trm_reg_write8(bSendData, TRMREG_GEN_NVRAM);
3047 		TRM_wait_30us(pACB);
3048 		trm_reg_write8((bSendData | NVR_CLOCK), TRMREG_GEN_NVRAM);
3049 		TRM_wait_30us(pACB);
3050 	}
3051 	for (i = 0; i < 7; i++, bAddr <<= 1) {
3052 	  /*
3053 	   * Program address
3054 	   */
3055 		bSendData = NVR_SELECT;
3056 		if (bAddr & 0x40)
3057 		  /* Start from bit 6	*/
3058 			bSendData |= NVR_BITOUT;
3059 		trm_reg_write8(bSendData , TRMREG_GEN_NVRAM);
3060 		TRM_wait_30us(pACB);
3061 		trm_reg_write8((bSendData | NVR_CLOCK), TRMREG_GEN_NVRAM);
3062 		TRM_wait_30us(pACB);
3063 	}
3064 	trm_reg_write8(NVR_SELECT, TRMREG_GEN_NVRAM);
3065 	TRM_wait_30us(pACB);
3066 }
3067 
3068 static void
3069 trm_check_eeprom(PNVRAMTYPE pEEpromBuf, PACB pACB)
3070 {
3071 	u_int16_t	*wpEeprom = (u_int16_t *) pEEpromBuf;
3072 	u_int16_t	wAddr, wCheckSum;
3073 	u_long	dAddr, *dpEeprom;
3074 
3075 	TRM_read_all(pEEpromBuf,pACB);
3076 	wCheckSum = 0;
3077 	for (wAddr = 0, wpEeprom = (u_int16_t *) pEEpromBuf;
3078 	    wAddr < 64; wAddr++, wpEeprom++) {
3079 		wCheckSum += *wpEeprom;
3080 	}
3081 	if (wCheckSum != 0x1234) {
3082 	  /*
3083    	   * Checksum error, load default
3084 	   */
3085 		pEEpromBuf->NvramSubVendorID[0]	= (u_int8_t) PCI_Vendor_ID_TEKRAM;
3086 		pEEpromBuf->NvramSubVendorID[1]	=
3087 		  (u_int8_t) (PCI_Vendor_ID_TEKRAM >> 8);
3088 		pEEpromBuf->NvramSubSysID[0] = (u_int8_t) PCI_Device_ID_TRM_S1040;
3089 		pEEpromBuf->NvramSubSysID[1] =
3090 		  (u_int8_t) (PCI_Device_ID_TRM_S1040 >> 8);
3091 		pEEpromBuf->NvramSubClass = 0x00;
3092 		pEEpromBuf->NvramVendorID[0] = (u_int8_t) PCI_Vendor_ID_TEKRAM;
3093 		pEEpromBuf->NvramVendorID[1] =
3094 		  (u_int8_t) (PCI_Vendor_ID_TEKRAM >> 8);
3095 		pEEpromBuf->NvramDeviceID[0] = (u_int8_t) PCI_Device_ID_TRM_S1040;
3096 		pEEpromBuf->NvramDeviceID[1] =
3097 		  (u_int8_t) (PCI_Device_ID_TRM_S1040 >> 8);
3098 		pEEpromBuf->NvramReserved = 0x00;
3099 
3100 		for (dAddr = 0, dpEeprom = (u_long *) pEEpromBuf->NvramTarget;
3101 		    dAddr < 16; dAddr++, dpEeprom++) {
3102 			*dpEeprom = 0x00000077;
3103 			/* NvmTarCfg3,NvmTarCfg2,NvmTarPeriod,NvmTarCfg0 */
3104 		}
3105 
3106 		*dpEeprom++ = 0x04000F07;
3107 		/* NvramMaxTag,NvramDelayTime,NvramChannelCfg,NvramScsiId */
3108 		*dpEeprom++ = 0x00000015;
3109 		/* NvramReserved1,NvramBootLun,NvramBootTarget,NvramReserved0 */
3110 		for (dAddr = 0; dAddr < 12; dAddr++, dpEeprom++)
3111 			*dpEeprom = 0x00;
3112 		pEEpromBuf->NvramCheckSum = 0x00;
3113 		for (wAddr = 0, wCheckSum = 0, wpEeprom = (u_int16_t *) pEEpromBuf;
3114 		    wAddr < 63; wAddr++, wpEeprom++)
3115 	      		wCheckSum += *wpEeprom;
3116 		*wpEeprom = 0x1234 - wCheckSum;
3117 		TRM_write_all(pEEpromBuf,pACB);
3118 	}
3119 	return;
3120 }
3121 static int
3122 trm_initAdapter(PACB pACB, u_int16_t unit, device_t pci_config_id)
3123 {
3124 	PNVRAMTYPE	pEEpromBuf;
3125 	u_int16_t	wval;
3126 	u_int8_t	bval;
3127 
3128 	pEEpromBuf = &trm_eepromBuf[unit];
3129 
3130 	/* 250ms selection timeout */
3131 	trm_reg_write8(SEL_TIMEOUT, TRMREG_SCSI_TIMEOUT);
3132 	/* Mask all the interrupt */
3133 	trm_reg_write8(0x00, TRMREG_DMA_INTEN);
3134 	trm_reg_write8(0x00, TRMREG_SCSI_INTEN);
3135 	/* Reset SCSI module */
3136 	trm_reg_write16(DO_RSTMODULE, TRMREG_SCSI_CONTROL);
3137 	/* program configuration 0 */
3138 	pACB->Config = HCC_AUTOTERM | HCC_PARITY;
3139 	if (trm_reg_read8(TRMREG_GEN_STATUS) & WIDESCSI)
3140 		pACB->Config |= HCC_WIDE_CARD;
3141 	if (pEEpromBuf->NvramChannelCfg & NAC_POWERON_SCSI_RESET)
3142 		pACB->Config |= HCC_SCSI_RESET;
3143 	if (pACB->Config & HCC_PARITY)
3144 		bval = PHASELATCH | INITIATOR | BLOCKRST | PARITYCHECK;
3145 	else
3146 		bval = PHASELATCH | INITIATOR | BLOCKRST ;
3147 	trm_reg_write8(bval,TRMREG_SCSI_CONFIG0);
3148 	/* program configuration 1 */
3149 	trm_reg_write8(0x13, TRMREG_SCSI_CONFIG1);
3150 	/* program Host ID */
3151 	bval = pEEpromBuf->NvramScsiId;
3152 	trm_reg_write8(bval, TRMREG_SCSI_HOSTID);
3153 	/* set ansynchronous transfer */
3154 	trm_reg_write8(0x00, TRMREG_SCSI_OFFSET);
3155 	/* Trun LED control off*/
3156 	wval = trm_reg_read16(TRMREG_GEN_CONTROL) & 0x7F;
3157 	trm_reg_write16(wval, TRMREG_GEN_CONTROL);
3158 	/* DMA config */
3159 	wval = trm_reg_read16(TRMREG_DMA_CONFIG) | DMA_ENHANCE;
3160 	trm_reg_write16(wval, TRMREG_DMA_CONFIG);
3161 	/* Clear pending interrupt status */
3162 	trm_reg_read8(TRMREG_SCSI_INTSTATUS);
3163 	/* Enable SCSI interrupt */
3164 	trm_reg_write8(0x7F, TRMREG_SCSI_INTEN);
3165 	trm_reg_write8(EN_SCSIINTR, TRMREG_DMA_INTEN);
3166 	return (0);
3167 }
3168 
3169 static PACB
3170 trm_init(u_int16_t unit, device_t pci_config_id)
3171 {
3172 	PACB		pACB;
3173 	int		rid = PCIR_MAPS;
3174 
3175  	pACB = (PACB) device_get_softc(pci_config_id);
3176    	if (!pACB) {
3177 		kprintf("trm%d: cannot allocate ACB !\n", unit);
3178 		return (NULL);
3179 	}
3180 	bzero (pACB, sizeof (struct _ACB));
3181 	pACB->iores = bus_alloc_resource(pci_config_id, SYS_RES_IOPORT,
3182 	    &rid, 0, ~0, 1, RF_ACTIVE);
3183     	if (pACB->iores == NULL) {
3184 		kprintf("trm_init: bus_alloc_resource failed!\n");
3185 		return (NULL);
3186 	}
3187 	pACB->tag = rman_get_bustag(pACB->iores);
3188 	pACB->bsh = rman_get_bushandle(pACB->iores);
3189 	if (bus_dma_tag_create(/*parent_dmat*/                 NULL,
3190 	      /*alignment*/                      1,
3191 	      /*boundary*/                       0,
3192 	      /*lowaddr*/  BUS_SPACE_MAXADDR_32BIT,
3193 	      /*highaddr*/       BUS_SPACE_MAXADDR,
3194 	      /*filter*/                      NULL,
3195 	      /*filterarg*/                   NULL,
3196 	      /*maxsize*/                 MAXBSIZE,
3197 	      /*nsegments*/               TRM_NSEG,
3198 	      /*maxsegsz*/    TRM_MAXTRANSFER_SIZE,
3199 	      /*flags*/           BUS_DMA_ALLOCNOW,
3200 	      &pACB->buffer_dmat) != 0)
3201 		goto bad;
3202 	trm_check_eeprom(&trm_eepromBuf[unit],pACB);
3203 	trm_initACB(pACB, unit);
3204    	if (trm_initAdapter(pACB, unit, pci_config_id)) {
3205 		kprintf("trm_initAdapter: initial ERROR\n");
3206 		goto bad;
3207 	}
3208 	return (pACB);
3209 bad:
3210 	if (pACB->iores)
3211 		bus_release_resource(pci_config_id, SYS_RES_IOPORT, PCIR_MAPS,
3212 		    pACB->iores);
3213 	if (pACB->buffer_dmat)
3214 		bus_dma_tag_destroy(pACB->buffer_dmat);
3215 	return (NULL);
3216 }
3217 
3218 static int
3219 trm_attach(device_t pci_config_id)
3220 {
3221 	struct	cam_devq *device_Q;
3222 	u_long	device_id;
3223 	PACB	pACB = 0;
3224 	int	rid = 0;
3225 	int unit = device_get_unit(pci_config_id);
3226 
3227 	device_id = pci_get_devid(pci_config_id);
3228 	/*
3229 	 * These cards do not allow memory mapped accesses
3230 	 */
3231 	if (device_id == PCI_DEVICEID_TRMS1040) {
3232 		if ((pACB=trm_init((u_int16_t) unit,
3233 			pci_config_id)) == NULL) {
3234 			kprintf("trm%d: trm_init error!\n",unit);
3235 			return (ENXIO);
3236 		}
3237 	} else
3238 		return (ENXIO);
3239 	/* After setting up the adapter, map our interrupt */
3240 	/*
3241 	 * Now let the CAM generic SCSI layer find the SCSI devices on the bus
3242 	 * start queue to reset to the idle loop.
3243 	 * Create device queue of SIM(s)
3244 	 * (MAX_START_JOB - 1) : max_sim_transactions
3245 	 */
3246 	pACB->irq = bus_alloc_resource(pci_config_id, SYS_RES_IRQ, &rid, 0,
3247 	    ~0, 1, RF_SHAREABLE | RF_ACTIVE);
3248     	if (pACB->irq == NULL ||
3249 	    bus_setup_intr(pci_config_id, pACB->irq,
3250 			   0, trm_Interrupt, pACB,
3251 			   &pACB->ih, NULL)) {
3252 		kprintf("trm%d: register Interrupt handler error!\n", unit);
3253 		goto bad;
3254 	}
3255 	device_Q = cam_simq_alloc(MAX_START_JOB);
3256 	if (device_Q == NULL){
3257 		kprintf("trm%d: device_Q == NULL !\n",unit);
3258 		goto bad;
3259 	}
3260 	/*
3261 	 * Now tell the generic SCSI layer
3262 	 * about our bus.
3263 	 * If this is the xpt layer creating a sim, then it's OK
3264 	 * to wait for an allocation.
3265 	 * XXX Should we pass in a flag to indicate that wait is OK?
3266 	 *
3267 	 *                    SIM allocation
3268 	 *
3269 	 *                 SCSI Interface Modules
3270 	 * The sim driver creates a sim for each controller.  The sim device
3271 	 * queue is separately created in order to allow resource sharing betwee
3272 	 * sims.  For instance, a driver may create one sim for each channel of
3273 	 * a multi-channel controller and use the same queue for each channel.
3274 	 * In this way, the queue resources are shared across all the channels
3275 	 * of the multi-channel controller.
3276 	 * trm_action     : sim_action_func
3277 	 * trm_poll       : sim_poll_func
3278 	 * "trm"        : sim_name ,if sim_name =  "xpt" ..M_DEVBUF,M_WAITOK
3279 	 * pACB         : *softc    if sim_name <> "xpt" ..M_DEVBUF,M_NOWAIT
3280 	 * pACB->unit   : unit
3281 	 * 1            : max_dev_transactions
3282 	 * MAX_TAGS     : max_tagged_dev_transactions
3283 	 *
3284 	 *  *******Construct our first channel SIM entry
3285 	 */
3286 	pACB->psim = cam_sim_alloc(trm_action,
3287 	    trm_poll,
3288 	    "trm",
3289 	    pACB,
3290 	    unit,
3291 	    1,
3292 	    MAX_TAGS_CMD_QUEUE,
3293 	    device_Q);
3294 	cam_simq_release(device_Q);  /* SIM allocate fault*/
3295 	if (pACB->psim == NULL) {
3296 		kprintf("trm%d: SIM allocate fault !\n",unit);
3297 		goto bad;
3298 	}
3299 	if (xpt_bus_register(pACB->psim, 0) != CAM_SUCCESS)  {
3300 		kprintf("trm%d: xpt_bus_register fault !\n",unit);
3301 		goto bad;
3302 	}
3303 	if (xpt_create_path(&pACB->ppath,
3304 	      NULL,
3305 	      cam_sim_path(pACB->psim),
3306 	      CAM_TARGET_WILDCARD,
3307 	      CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
3308 		kprintf("trm%d: xpt_create_path fault !\n",unit);
3309 		xpt_bus_deregister(cam_sim_path(pACB->psim));
3310 		goto bad;
3311 		/*
3312 		 * cam_sim_free(pACB->psim, TRUE);  free_devq
3313 		 * pACB->psim = NULL;
3314 		 */
3315 		return (ENXIO);
3316 	}
3317 	return (0);
3318 bad:
3319 	if (pACB->iores)
3320 		bus_release_resource(pci_config_id, SYS_RES_IOPORT, PCIR_MAPS,
3321 		    pACB->iores);
3322 	if (pACB->buffer_dmat)
3323 		bus_dma_tag_destroy(pACB->buffer_dmat);
3324 	if (pACB->ih)
3325 		bus_teardown_intr(pci_config_id, pACB->irq, pACB->ih);
3326 	if (pACB->irq)
3327 		bus_release_resource(pci_config_id, SYS_RES_IRQ, 0, pACB->irq);
3328 	if (pACB->psim)
3329 		cam_sim_free(pACB->psim);
3330 
3331 	return (ENXIO);
3332 
3333 }
3334 
3335 /*
3336 *                  pci_device
3337 *         trm_probe (device_t tag, pcidi_t type)
3338 *
3339 */
3340 static int
3341 trm_probe(device_t tag)
3342 {
3343 
3344 	if (pci_get_devid(tag) == PCI_DEVICEID_TRMS1040) {
3345 		device_set_desc(tag,
3346 		    "Tekram DC395U/UW/F DC315/U Fast20 Wide SCSI Adapter");
3347 		return (0);
3348 	} else
3349 		return (ENXIO);
3350 }
3351 
3352 static int
3353 trm_detach(device_t dev)
3354 {
3355 	PACB pACB = device_get_softc(dev);
3356 
3357 	bus_release_resource(dev, SYS_RES_IOPORT, PCIR_MAPS, pACB->iores);
3358 	bus_dma_tag_destroy(pACB->buffer_dmat);
3359 	bus_teardown_intr(dev, pACB->irq, pACB->ih);
3360 	bus_release_resource(dev, SYS_RES_IRQ, 0, pACB->irq);
3361 	xpt_async(AC_LOST_DEVICE, pACB->ppath, NULL);
3362 	xpt_free_path(pACB->ppath);
3363 	xpt_bus_deregister(cam_sim_path(pACB->psim));
3364 	cam_sim_free(pACB->psim);
3365 	return (0);
3366 }
3367 static device_method_t trm_methods[] = {
3368 	/* Device interface */
3369 	DEVMETHOD(device_probe,		trm_probe),
3370 	DEVMETHOD(device_attach,	trm_attach),
3371 	DEVMETHOD(device_detach,	trm_detach),
3372 	{ 0, 0 }
3373 };
3374 
3375 static driver_t trm_driver = {
3376 	"trm", trm_methods, sizeof(struct _ACB)
3377 };
3378 
3379 static devclass_t trm_devclass;
3380 DRIVER_MODULE(trm, pci, trm_driver, trm_devclass, 0, 0);
3381