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