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