xref: /freebsd/sys/dev/arcmsr/arcmsr.c (revision 87569f75a91f298c52a71823c04d41cf53c88889)
1 /*
2 ******************************************************************************************
3 **        O.S   : FreeBSD
4 **   FILE NAME  : arcmsr.c
5 **        BY    : Erich Chen
6 **   Description: SCSI RAID Device Driver for
7 **                ARECA (ARC1110/1120/1160/1210/1220/1260) SATA RAID HOST Adapter
8 **                ARCMSR RAID Host adapter[RAID controller:INTEL 331(PCI-X) 341(PCI-EXPRESS) chip set]
9 ******************************************************************************************
10 ************************************************************************
11 **
12 ** Copyright (c) 2004-2006 ARECA Co. Ltd.
13 **        Erich Chen, Taipei Taiwan All rights reserved.
14 **
15 ** Redistribution and use in source and binary forms,with or without
16 ** modification,are permitted provided that the following conditions
17 ** are met:
18 ** 1. Redistributions of source code must retain the above copyright
19 **    notice,this list of conditions and the following disclaimer.
20 ** 2. Redistributions in binary form must reproduce the above copyright
21 **    notice,this list of conditions and the following disclaimer in the
22 **    documentation and/or other materials provided with the distribution.
23 ** 3. The name of the author may not be used to endorse or promote products
24 **    derived from this software without specific prior written permission.
25 **
26 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 ** IMPLIED WARRANTIES,INCLUDING,BUT NOT LIMITED TO,THE IMPLIED WARRANTIES
28 ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,INDIRECT,
30 ** INCIDENTAL,SPECIAL,EXEMPLARY,OR CONSEQUENTIAL DAMAGES(INCLUDING,BUT
31 ** NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA,OR PROFITS; OR BUSINESS INTERRUPTION)HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY,WHETHER IN CONTRACT,STRICT LIABILITY,OR TORT
34 **(INCLUDING NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF
35 ** THIS SOFTWARE,EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 **************************************************************************
37 ** History
38 **
39 **        REV#         DATE	            NAME	         DESCRIPTION
40 **     1.00.00.00    3/31/2004	       Erich Chen	     First release
41 **     1.20.00.02   11/29/2004         Erich Chen        bug fix with arcmsr_bus_reset when PHY error
42 ******************************************************************************************
43 ** $FreeBSD$
44 */
45 #define ARCMSR_DEBUG0           0
46 /*
47 **********************************
48 */
49 #include <sys/param.h>
50 #include <sys/systm.h>
51 #include <sys/malloc.h>
52 #include <sys/kernel.h>
53 #include <sys/bus.h>
54 #include <sys/queue.h>
55 #include <sys/stat.h>
56 #include <sys/devicestat.h>
57 #include <sys/kthread.h>
58 #include <sys/module.h>
59 #include <sys/proc.h>
60 #include <sys/lock.h>
61 #include <sys/sysctl.h>
62 #include <sys/poll.h>
63 #include <sys/ioccom.h>
64 #include <vm/vm.h>
65 #include <vm/vm_param.h>
66 #include <vm/pmap.h>
67 
68 #include <isa/rtc.h>
69 
70 #include <machine/bus.h>
71 #include <machine/clock.h>
72 #include <machine/resource.h>
73 #include <machine/atomic.h>
74 #include <sys/conf.h>
75 #include <sys/rman.h>
76 
77 #include <cam/cam.h>
78 #include <cam/cam_ccb.h>
79 #include <cam/cam_sim.h>
80 #include <cam/cam_xpt_sim.h>
81 #include <cam/cam_debug.h>
82 #include <cam/scsi/scsi_all.h>
83 #include <cam/scsi/scsi_message.h>
84 /*
85 **************************************************************************
86 ** Define the OS version specific locks
87 **************************************************************************
88 */
89 #if __FreeBSD_version >= 500005
90     #include <sys/selinfo.h>
91 	#include <sys/mutex.h>
92     #include <dev/pci/pcivar.h>
93     #include <dev/pci/pcireg.h>
94 	#define ARCMSR_LOCK_INIT(l, s)	        mtx_init(l, s,NULL, MTX_DEF|MTX_RECURSE)
95 	#define ARCMSR_LOCK_ACQUIRE(l)	        mtx_lock(l)
96 	#define ARCMSR_LOCK_RELEASE(l)	        mtx_unlock(l)
97 	typedef struct mtx                      arcmsr_lock_t;
98 #else
99     #include <sys/select.h>
100     #include <pci/pcivar.h>
101     #include <pci/pcireg.h>
102 	#define ARCMSR_LOCK_INIT(l, s)	        simple_lock_init(l)
103 	#define ARCMSR_LOCK_ACQUIRE(l)	        simple_lock(l)
104 	#define ARCMSR_LOCK_RELEASE(l)	        simple_unlock(l)
105 	typedef struct simplelock               arcmsr_lock_t;
106 #endif
107 #include <dev/arcmsr/arcmsr.h>
108 /*
109 **************************************************************************
110 ** __FreeBSD_version 502010
111 **************************************************************************
112 */
113 static VOID arcmsr_interrupt(VOID *arg);
114 static LONG arcmsr_probe(device_t dev);
115 static LONG arcmsr_attach(device_t dev);
116 static LONG arcmsr_detach(device_t dev);
117 static VOID arcmsr_shutdown(device_t dev);
118 #if 0
119 ULONG arcmsr_make_timespec(ULONG year,ULONG mon,ULONG day,ULONG hour,ULONG min,ULONG sec);
120 ULONG arcmsr_getcmos_time(VOID);
121 #endif
122 LONG arcmsr_queue_dpc(PACB pACB,DPCFUN dpcfun,VOID *arg);
123 LONG arcmsr_iop_ioctlcmd(PACB pACB,ULONG ioctl_cmd,caddr_t arg);
124 BOOLEAN arcmsr_seek_cmd2abort(union ccb * pabortccb);
125 BOOLEAN arcmsr_wait_msgint_ready(PACB pACB);
126 PSRB arcmsr_get_freesrb(PACB pACB);
127 VOID arcmsr_free_resource(PACB pACB);
128 VOID arcmsr_bus_reset(PACB pACB);
129 VOID arcmsr_stop_adapter_bgrb(PACB pACB);
130 VOID arcmsr_start_adapter_bgrb(PACB pACB);
131 VOID arcmsr_iop_init(PACB pACB);
132 VOID arcmsr_do_dpcQ(PACB pACB);
133 VOID arcmsr_flush_adapter_cache(PACB pACB);
134 VOID arcmsr_do_thread_works(VOID *arg);
135 VOID arcmsr_queue_wait2go_srb(PACB pACB,PSRB pSRB);
136 VOID arcmsr_post_wait2go_srb(PACB pACB);
137 VOID arcmsr_post_Qbuffer(PACB pACB);
138 VOID arcmsr_abort_allcmd(PACB pACB);
139 VOID arcmsr_srb_complete(PSRB pSRB);
140 VOID arcmsr_iop_reset(PACB pACB);
141 VOID arcmsr_report_SenseInfoBuffer(PSRB pSRB);
142 VOID arcmsr_build_srb(PSRB pSRB, bus_dma_segment_t *dm_segs, LONG nseg);
143 /*
144 *****************************************************************************************
145 ** Character device switch table
146 **struct cdevsw {
147 **	d_open_t		*d_open;
148 **	d_close_t		*d_close;
149 **	d_read_t		*d_read;
150 **	d_write_t		*d_write;
151 **	d_ioctl_t		*d_ioctl;
152 **	d_poll_t		*d_poll;
153 **	d_mmap_t		*d_mmap;
154 **	d_strategy_t	*d_strategy;
155 **	const char	    *d_name;	   "" base device name, e.g. 'vn'
156 **	int		         d_maj;
157 **	d_dump_t	    *d_dump;
158 **	d_psize_t	    *d_psize;
159 **	u_int		     d_flags;
160 **	int		         d_bmaj;
161 **	d_kqfilter_t	*d_kqfilter;   "" additions below are not binary compatible with 4.2 and below
162 **};
163 ******************************************************************************************
164 */
165 /*
166 **************************************************************************
167 ** Insert a delay in micro-seconds and milli-seconds.
168 ** static void MDELAY(LONG ms) { while (ms--) UDELAY(1000); }
169 **************************************************************************
170 */
171 static VOID UDELAY(LONG us) { DELAY(us); }
172 /*
173 **************************************************************************
174 **
175 **************************************************************************
176 */
177 static bus_dmamap_callback_t arcmsr_map_freesrb;
178 static bus_dmamap_callback_t arcmsr_executesrb;
179 /*
180 **************************************************************************
181 **
182 **************************************************************************
183 */
184 static d_open_t	arcmsr_open;
185 static d_close_t arcmsr_close;
186 static d_ioctl_t arcmsr_ioctl;
187 
188 static device_method_t arcmsr_methods[]={
189 	DEVMETHOD(device_probe,		arcmsr_probe),
190 	DEVMETHOD(device_attach,	arcmsr_attach),
191 	DEVMETHOD(device_detach,	arcmsr_detach),
192     DEVMETHOD(device_shutdown,	arcmsr_shutdown),
193 	{ 0,0 }
194 };
195 
196 static driver_t arcmsr_driver={
197 	"arcmsr",arcmsr_methods,sizeof(struct _ACB)
198 };
199 
200 static devclass_t arcmsr_devclass;
201 DRIVER_MODULE(arcmsr,pci,arcmsr_driver,arcmsr_devclass,0,0);
202 
203 #if __FreeBSD_version >= 502010
204 	static struct cdevsw arcmsr_cdevsw={
205 	    .d_version = D_VERSION,
206 	    .d_flags   = D_NEEDGIANT,
207 		.d_open    = arcmsr_open,		/* open     */
208 		.d_close   = arcmsr_close,		/* close    */
209 		.d_ioctl   = arcmsr_ioctl,		/* ioctl    */
210 		.d_name    = "arcmsr",			/* name     */
211 	};
212 #else
213 	#define ARCMSR_CDEV_MAJOR	180
214 
215 	static struct cdevsw arcmsr_cdevsw = {
216 		arcmsr_open,		        /* open     */
217 		arcmsr_close,		        /* close    */
218 		noread,			            /* read     */
219 		nowrite,		            /* write    */
220 		arcmsr_ioctl,		        /* ioctl    */
221 		nopoll,		                /* poll     */
222 		nommap,			            /* mmap     */
223 		nostrategy,		            /* strategy */
224 		"arcmsr",			        /* name     */
225 		ARCMSR_CDEV_MAJOR,		    /* major    */
226 		nodump,			            /* dump     */
227 		nopsize,		            /* psize    */
228 		0			                /* flags    */
229 	};
230 #endif
231 
232 #if __FreeBSD_version < 500005
233     static int arcmsr_open(dev_t dev, int flags, int fmt, struct proc *proc)
234 #else
235     #if __FreeBSD_version < 503000
236         static int arcmsr_open(dev_t dev, int flags, int fmt, struct thread *proc)
237     #else
238         static int arcmsr_open(struct cdev *dev, int flags, int fmt, d_thread_t *proc)
239     #endif
240 #endif
241 {
242 	#if __FreeBSD_version < 503000
243 	    PACB pACB=dev->si_drv1;
244     #else
245 		int	unit = minor(dev);
246 		PACB pACB = devclass_get_softc(arcmsr_devclass, unit);
247     #endif
248 
249 	if(pACB==NULL)
250 	{
251 		return ENXIO;
252 	}
253 	/* Check to make sure the device isn't already open */
254 	if (pACB->acb_flags & ACB_F_IOCTL_OPEN)
255 	{
256 		return EBUSY;
257 	}
258 	pACB->acb_flags |= ACB_F_IOCTL_OPEN;
259 	return 0;
260 }
261 /*
262 **************************************************************************
263 **************************************************************************
264 */
265 #if __FreeBSD_version < 500005
266     static int arcmsr_close(dev_t dev, int flags, int fmt, struct proc *proc)
267 #else
268     #if __FreeBSD_version < 503000
269         static int arcmsr_close(dev_t dev, int flags, int fmt, struct thread *proc)
270     #else
271         static int arcmsr_close(struct cdev *dev, int flags, int fmt, d_thread_t *proc)
272     #endif
273 #endif
274 {
275 	#if __FreeBSD_version < 503000
276 	    PACB pACB=dev->si_drv1;
277     #else
278 		int	unit = minor(dev);
279 		PACB pACB = devclass_get_softc(arcmsr_devclass, unit);
280     #endif
281 
282 	if(pACB==NULL)
283 	{
284 		return ENXIO;
285 	}
286 	pACB->acb_flags &= ~ACB_F_IOCTL_OPEN;
287 	return 0;
288 }
289 /*
290 **************************************************************************
291 **ENOENT
292 **ENOIOCTL
293 **ENOMEM
294 **EINVAL
295 **************************************************************************
296 */
297 #if __FreeBSD_version < 500005
298     static int arcmsr_ioctl(dev_t dev, u_long ioctl_cmd, caddr_t arg, int flags, struct proc *proc)
299 #else
300     #if __FreeBSD_version < 503000
301         static int arcmsr_ioctl(dev_t dev, u_long ioctl_cmd, caddr_t arg, int flags, struct thread *proc)
302     #else
303         static int arcmsr_ioctl(struct cdev *dev, u_long ioctl_cmd, caddr_t arg,int flags, d_thread_t *proc)
304     #endif
305 #endif
306 {
307 	#if __FreeBSD_version < 503000
308 	    PACB pACB=dev->si_drv1;
309     #else
310 		int	unit = minor(dev);
311 		PACB pACB = devclass_get_softc(arcmsr_devclass, unit);
312     #endif
313 
314 	if(pACB==NULL)
315 	{
316 		return ENXIO;
317 	}
318     return(arcmsr_iop_ioctlcmd(pACB,ioctl_cmd,arg));
319 }
320 /*
321 **************************************************************************
322 **************************************************************************
323 */
324 LONG arcmsr_queue_dpc(PACB pACB,DPCFUN dpcfun,VOID *arg)
325 {
326 	ULONG s;
327 	UCHAR index_pointer;
328 
329 	#if ARCMSR_DEBUG0
330 	printf("arcmsr_queue_dpc................. \n");
331 	#endif
332 
333     s=splcam();
334 	index_pointer=(pACB->dpcQ_tail + 1) % ARCMSR_MAX_DPC;
335 	if(index_pointer==pACB->dpcQ_head)
336 	{
337         splx(s);
338 		printf("DPC Queue full!\n");
339 		return -1;
340 	}
341 	pACB->dpcQ[pACB->dpcQ_tail].dpcfun=dpcfun;
342 	pACB->dpcQ[pACB->dpcQ_tail].arg=arg;
343 	pACB->dpcQ_tail=index_pointer;
344 	/*
345 	*********************************************************
346 	*********************************************************
347 	*/
348 	wakeup(pACB->kthread_proc);
349 
350     splx(s);
351 	return 0;
352 }
353 /*
354 **************************************************************************
355 **         arcmsr_do_dpcQ
356 **    execute dpc routine by kernel thread
357 ***************************************************************************
358 */
359 VOID arcmsr_do_dpcQ(PACB pACB)
360 {
361 	#if ARCMSR_DEBUG0
362 	printf("arcmsr_do_dpcQ................. \n");
363 	#endif
364 	/*
365 	******************************************
366 	******************************************
367 	*/
368 	while (pACB->dpcQ_head!=pACB->dpcQ_tail)
369 	{
370 		ULONG s;
371 		DPC dpc;
372 
373 		/* got a "dpc routine" */
374         s=splcam();
375 		dpc=pACB->dpcQ[pACB->dpcQ_head];
376 		pACB->dpcQ_head++;
377 		pACB->dpcQ_head %=ARCMSR_MAX_DPC;
378         splx(s);
379 		/* execute this "dpc routine" */
380 		dpc.dpcfun(dpc.arg);
381 	}
382 	return;
383 }
384 #if 0
385 /*
386 **********************************************************************
387 ** <second> bit 05,04,03,02,01,00: 0 - 59
388 ** <minute> bit 11,10,09,08,07,06: 0 - 59
389 ** <month>  bit       15,14,13,12: 1 - 12
390 ** <hour>   bit 21,20,19,18,17,16: 0 - 59
391 ** <day>    bit    26,25,24,23,22: 1 - 31
392 ** <year>   bit    31,30,29,28,27: 0=2000,31=2031
393 **********************************************************************
394 */
395 ULONG arcmsr_make_timespec(ULONG year,ULONG mon,ULONG day,ULONG hour,ULONG min,ULONG sec)
396 {
397     return((year<<27)|(day<<22)|(hour<<16)|(mon<<12)|(min<<6)|(sec));
398 }
399 /*
400 ********************************************************************
401 ********************************************************************
402 */
403 ULONG arcmsr_getcmos_time(VOID)
404 {
405 	ULONG year,mon,day,hour,min,sec;
406 
407     #if ARCMSR_DEBUG0
408     printf("arcmsr_getcmos_time \n");
409     #endif
410 	sec=bcd2bin(rtcin(RTC_SEC));
411 	min=bcd2bin(rtcin(RTC_MIN));
412 	hour=bcd2bin(rtcin(RTC_HRS));
413 	day=bcd2bin(rtcin(RTC_DAY));
414 	mon=bcd2bin(rtcin(RTC_MONTH));
415 	year=bcd2bin(rtcin(RTC_YEAR));
416 	if((year +=1900) < 1970)
417 		year +=100;
418 	return arcmsr_make_timespec(year,mon,day,hour,min,sec);
419 }
420 #endif
421 /*
422 *********************************************************************************
423 **  Asynchronous notification handler.
424 *********************************************************************************
425 */
426 static VOID arcmsr_async(VOID *cb_arg, ULONG code, struct cam_path *path, VOID *arg)
427 {
428 	PACB pACB;
429 	UCHAR target_id,target_lun;
430 	struct cam_sim *sim;
431 	ULONG s;
432     #if ARCMSR_DEBUG0
433     printf("arcmsr_async.......................................... \n");
434     #endif
435 	s=splcam();
436 
437 	sim=(struct cam_sim *) cb_arg;
438 	pACB =(PACB) cam_sim_softc(sim);
439 	switch (code)
440 	{
441 	case AC_LOST_DEVICE:
442 		target_id=xpt_path_target_id(path);
443         target_lun=xpt_path_lun_id(path);
444 		if((target_id > ARCMSR_MAX_TARGETID) || (target_lun > ARCMSR_MAX_TARGETLUN))
445 		{
446 			break;
447 		}
448         printf("%s:scsi id%d lun%d device lost \n",device_get_name(pACB->pci_dev),target_id,target_lun);
449 		break;
450 	default:
451 		break;
452 	}
453 	splx(s);
454 }
455 /*
456 **************************************************************************
457 *         arcmsr_do_thread_works
458 *    execute programs schedule by kernel thread
459 *    execute programs schedule by kernel thread
460 *      :do background rebuilding
461 *
462 * tsleep(void *ident,int priority,const char *wmesg,int timo)
463 * tsleep()
464 * General sleep call.  Suspends the current process until a wakeup is
465 * performed on the specified identifier.  The process will then be made
466 * runnable with the specified priority.  Sleeps at most timo/hz seconds
467 * (0 means no timeout).  If pri includes PCATCH flag, signals are checked
468 * before and after sleeping, else signals are not checked.  Returns 0 if
469 * awakened, EWOULDBLOCK if the timeout expires.  If PCATCH is set and a
470 * signal needs to be delivered, ERESTART is returned if the current system
471 * call should be restarted if possible, and EINTR is returned if the system
472 * call should be interrupted by the signal (return EINTR).
473 *
474 * await(int priority, int timo)
475 * await() - wait for async condition to occur.   The process blocks until
476 * wakeup() is called on the most recent asleep() address.  If wakeup is called
477 * priority to await(), await() winds up being a NOP.
478 *
479 * If await() is called more then once (without an intervening asleep() call),
480 * await() is still effectively a NOP but it calls mi_switch() to give other
481 * processes some cpu before returning.  The process is left runnable.
482 *
483 * <<<<<<<< EXPERIMENTAL, UNTESTED >>>>>>>>>>
484 * asleep(void *ident, int priority, const char *wmesg, int timo)
485 * asleep() - async sleep call.  Place process on wait queue and return
486 * immediately without blocking.  The process stays runnable until await()
487 * is called.  If ident is NULL, remove process from wait queue if it is still
488 * on one.
489 *
490 * Only the most recent sleep condition is effective when making successive
491 * calls to asleep() or when calling tsleep().
492 *
493 * The timeout, if any, is not initiated until await() is called.  The sleep
494 * priority, signal, and timeout is specified in the asleep() call but may be
495 * overriden in the await() call.
496 *
497 * <<<<<<<< EXPERIMENTAL, UNTESTED >>>>>>>>>>
498 *      :do background rebuilding
499 ***************************************************************************
500 */
501 VOID arcmsr_do_thread_works(VOID *arg)
502 {
503 	PACB pACB=(PACB) arg;
504 	ARCMSR_LOCK_INIT(&pACB->arcmsr_kthread_lock, "arcmsr kthread lock");
505 
506 	#if ARCMSR_DEBUG0
507 	printf("arcmsr_do_thread_works................. \n");
508 	#endif
509 
510 	ARCMSR_LOCK_ACQUIRE(&pACB->arcmsr_kthread_lock);
511 	while(1)
512 	{
513 		tsleep((caddr_t)pACB->kthread_proc, PRIBIO | PWAIT, "arcmsr",  hz/4);/*.25 sec*/
514 		/*
515 		** if do_dpcQ_semaphore is signal
516 		** do following works
517 		*/
518         arcmsr_do_dpcQ(pACB); /*see if there were some dpc routine need to execute*/
519 		if(pACB->acb_flags & ACB_F_STOP_THREAD)
520 		{
521 			ARCMSR_LOCK_RELEASE(&pACB->arcmsr_kthread_lock);
522 			break;
523 		}
524 	}
525 	kthread_exit(0);
526 	return;
527 }
528 /*
529 ************************************************************************
530 **
531 **
532 ************************************************************************
533 */
534 VOID arcmsr_flush_adapter_cache(PACB pACB)
535 {
536     #if ARCMSR_DEBUG0
537     printf("arcmsr_flush_adapter_cache..............\n");
538     #endif
539 	CHIP_REG_WRITE32(&pACB->pmu->inbound_msgaddr0,ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
540 	return;
541 }
542 /*
543 **********************************************************************
544 **
545 **
546 **
547 **********************************************************************
548 */
549 BOOLEAN arcmsr_wait_msgint_ready(PACB pACB)
550 {
551 	ULONG Index;
552 	UCHAR Retries=0x00;
553 	do
554 	{
555 		for(Index=0; Index < 500000; Index++)
556 		{
557 			if(CHIP_REG_READ32(&pACB->pmu->outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT)
558 			{
559 				CHIP_REG_WRITE32(&pACB->pmu->outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);/*clear interrupt*/
560 				return TRUE;
561 			}
562 			/* one us delay	*/
563 			UDELAY(10);
564 		}/*max 5 seconds*/
565 	}while(Retries++ < 24);/*max 2 minutes*/
566 	return FALSE;
567 }
568 /*
569 **********************************************************************
570 **
571 **  Q back this SRB into ACB ArraySRB
572 **
573 **********************************************************************
574 */
575 VOID arcmsr_srb_complete(PSRB pSRB)
576 {
577 	ULONG s;
578 	PACB pACB=pSRB->pACB;
579     union ccb *pccb=pSRB->pccb;
580 
581 	#if ARCMSR_DEBUG0
582 	printf("arcmsr_srb_complete: pSRB=%p srb_doneindex=%x srb_startindex=%x\n",pSRB,pACB->srb_doneindex,pACB->srb_startindex);
583 	#endif
584 
585 	if ((pccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE)
586 	{
587 		bus_dmasync_op_t op;
588 
589 		if ((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)
590 		{
591 			op = BUS_DMASYNC_POSTREAD;
592 		}
593 		else
594 		{
595 			op = BUS_DMASYNC_POSTWRITE;
596 		}
597 		bus_dmamap_sync(pACB->buffer_dmat, pSRB->dmamap, op);
598 		bus_dmamap_unload(pACB->buffer_dmat, pSRB->dmamap);
599 	}
600     s=splcam();
601 	atomic_subtract_int(&pACB->srboutstandingcount,1);
602 	pSRB->startdone=ARCMSR_SRB_DONE;
603 	pSRB->srb_flags=0;
604 	pACB->psrbringQ[pACB->srb_doneindex]=pSRB;
605     pACB->srb_doneindex++;
606     pACB->srb_doneindex %= ARCMSR_MAX_FREESRB_NUM;
607     splx(s);
608     xpt_done(pccb);
609 	return;
610 }
611 /*
612 **********************************************************************
613 **       if scsi error do auto request sense
614 **********************************************************************
615 */
616 VOID arcmsr_report_SenseInfoBuffer(PSRB pSRB)
617 {
618 	union ccb *pccb=pSRB->pccb;
619 	PSENSE_DATA  psenseBuffer=(PSENSE_DATA)&pccb->csio.sense_data;
620 	#if ARCMSR_DEBUG0
621     printf("arcmsr_report_SenseInfoBuffer...........\n");
622 	#endif
623 
624     pccb->ccb_h.status|=CAM_REQ_CMP;
625     if(psenseBuffer)
626 	{
627 		memset(psenseBuffer, 0, sizeof(pccb->csio.sense_data));
628 		memcpy(psenseBuffer,pSRB->arcmsr_cdb.SenseData,get_min(sizeof(struct _SENSE_DATA),sizeof(pccb->csio.sense_data)));
629 	    psenseBuffer->ErrorCode=0x70;
630         psenseBuffer->Valid=1;
631 		pccb->ccb_h.status|=CAM_AUTOSNS_VALID;
632     }
633     return;
634 }
635 /*
636 *********************************************************************
637 ** to insert pSRB into tail of pACB wait exec srbQ
638 *********************************************************************
639 */
640 VOID arcmsr_queue_wait2go_srb(PACB pACB,PSRB pSRB)
641 {
642     ULONG s;
643 	LONG i=0;
644     #if ARCMSR_DEBUG0
645 	printf("arcmsr_qtail_wait2go_srb:......................................... \n");
646     #endif
647 
648 	s=splcam();
649 	while(1)
650 	{
651 		if(pACB->psrbwait2go[i]==NULL)
652 		{
653 			pACB->psrbwait2go[i]=pSRB;
654         	atomic_add_int(&pACB->srbwait2gocount,1);
655             splx(s);
656 			return;
657 		}
658 		i++;
659 		i%=ARCMSR_MAX_OUTSTANDING_CMD;
660 	}
661 	return;
662 }
663 /*
664 *********************************************************************
665 **
666 *********************************************************************
667 */
668 VOID arcmsr_abort_allcmd(PACB pACB)
669 {
670 	CHIP_REG_WRITE32(&pACB->pmu->inbound_msgaddr0,ARCMSR_INBOUND_MESG0_ABORT_CMD);
671 	return;
672 }
673 
674 /*
675 ****************************************************************************
676 ** Routine Description: Reset 80331 iop.
677 **           Arguments:
678 **        Return Value: Nothing.
679 ****************************************************************************
680 */
681 VOID arcmsr_iop_reset(PACB pACB)
682 {
683 	PSRB pSRB,pfreesrb;
684 	ULONG intmask_org,mask;
685     LONG i=0;
686 
687 	#if ARCMSR_DEBUG0
688 	printf("arcmsr_iop_reset: reset iop controller......................................\n");
689 	#endif
690 	if(pACB->srboutstandingcount!=0)
691 	{
692 		/* Q back all outstanding srb into wait exec psrb Q*/
693 		#if ARCMSR_DEBUG0
694 		printf("arcmsr_iop_reset: srboutstandingcount=%d ...\n",pACB->srboutstandingcount);
695 		#endif
696         /* disable all outbound interrupt */
697 		intmask_org=CHIP_REG_READ32(&pACB->pmu->outbound_intmask);
698         CHIP_REG_WRITE32(&pACB->pmu->outbound_intmask,intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE);
699         /* talk to iop 331 outstanding command aborted*/
700 		arcmsr_abort_allcmd(pACB);
701 		if(arcmsr_wait_msgint_ready(pACB)!=TRUE)
702 		{
703             printf("arcmsr_iop_reset: wait 'abort all outstanding command' timeout.................in \n");
704 		}
705 		/*clear all outbound posted Q*/
706 		for(i=0;i<ARCMSR_MAX_OUTSTANDING_CMD;i++)
707 		{
708 			CHIP_REG_READ32(&pACB->pmu->outbound_queueport);
709 		}
710 		pfreesrb=pACB->pfreesrb;
711 		for(i=0;i<ARCMSR_MAX_FREESRB_NUM;i++)
712 		{
713 	    	pSRB=&pfreesrb[i];
714 			if(pSRB->startdone==ARCMSR_SRB_START)
715 			{
716 				pSRB->startdone=ARCMSR_SRB_ABORTED;
717                 pSRB->pccb->ccb_h.status=CAM_REQ_ABORTED;
718                 arcmsr_srb_complete(pSRB);
719 			}
720 		}
721 		/* enable all outbound interrupt */
722 		mask=~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE|ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE);
723         CHIP_REG_WRITE32(&pACB->pmu->outbound_intmask,intmask_org & mask);
724 		atomic_set_int(&pACB->srboutstandingcount,0);
725 		/* post abort all outstanding command message to RAID controller */
726 	}
727 	i=0;
728 	while(pACB->srbwait2gocount > 0)
729 	{
730 		pSRB=pACB->psrbwait2go[i];
731 		if(pSRB!=NULL)
732 		{
733 			#if ARCMSR_DEBUG0
734 			printf("arcmsr_iop_reset:abort command... srbwait2gocount=%d ...\n",pACB->srbwait2gocount);
735 			#endif
736 		    pACB->psrbwait2go[i]=NULL;
737             pSRB->startdone=ARCMSR_SRB_ABORTED;
738 			pSRB->pccb->ccb_h.status=CAM_REQ_ABORTED;
739             arcmsr_srb_complete(pSRB);
740 			atomic_subtract_int(&pACB->srbwait2gocount,1);
741 		}
742 		i++;
743 		i%=ARCMSR_MAX_OUTSTANDING_CMD;
744 	}
745 	return;
746 }
747 /*
748 **********************************************************************
749 **
750 ** PAGE_SIZE=4096 or 8192,PAGE_SHIFT=12
751 **********************************************************************
752 */
753 VOID arcmsr_build_srb(PSRB pSRB, bus_dma_segment_t *dm_segs, LONG nseg)
754 {
755     PARCMSR_CDB pARCMSR_CDB=&pSRB->arcmsr_cdb;
756 	PCHAR psge=(PCHAR)&pARCMSR_CDB->u;
757 	ULONG address_lo,address_hi;
758 	union ccb *pccb=pSRB->pccb;
759 	struct ccb_scsiio *pcsio=&pccb->csio;
760 	LONG arccdbsize=0x30;
761 
762 	#if ARCMSR_DEBUG0
763 	printf("arcmsr_build_srb........................... \n");
764 	#endif
765 	memset(pARCMSR_CDB,0,sizeof(struct _ARCMSR_CDB));
766     pARCMSR_CDB->Bus=0;
767     pARCMSR_CDB->TargetID=pccb->ccb_h.target_id;
768     pARCMSR_CDB->LUN=pccb->ccb_h.target_lun;
769     pARCMSR_CDB->Function=1;
770 	pARCMSR_CDB->CdbLength=(UCHAR)pcsio->cdb_len;
771     pARCMSR_CDB->Context=(CPT2INT)pARCMSR_CDB;
772 	bcopy(pcsio->cdb_io.cdb_bytes, pARCMSR_CDB->Cdb, pcsio->cdb_len);
773 	if(nseg != 0)
774 	{
775 		PACB pACB=pSRB->pACB;
776 		bus_dmasync_op_t   op;
777 		LONG length,i,cdb_sgcount=0;
778 
779 		/* map stor port SG list to our iop SG List.*/
780 		for(i=0;i<nseg;i++)
781 		{
782 			/* Get the physical address of the current data pointer */
783 			length=(ULONG) dm_segs[i].ds_len;
784             address_lo=dma_addr_lo32(dm_segs[i].ds_addr);
785 			address_hi=dma_addr_hi32(dm_segs[i].ds_addr);
786 			if(address_hi==0)
787 			{
788 				PSG32ENTRY pdma_sg=(PSG32ENTRY)psge;
789 				pdma_sg->address=address_lo;
790 				pdma_sg->length=length;
791 				psge += sizeof(SG32ENTRY);
792 				arccdbsize += sizeof(SG32ENTRY);
793 			}
794 			else
795 			{
796 				LONG sg64s_size=0,tmplength=length;
797 
798      			#if ARCMSR_DEBUG0
799 				printf("arcmsr_build_srb: !!!!!!!!!!!......address_hi=%x.... \n",address_hi);
800 				#endif
801 				while(1)
802 				{
803 					LONG64 span4G,length0;
804 					PSG64ENTRY pdma_sg=(PSG64ENTRY)psge;
805 
806 					span4G=(LONG64)address_lo + tmplength;
807 					pdma_sg->addresshigh=address_hi;
808 					pdma_sg->address=address_lo;
809 					if(span4G > 0x100000000)
810 					{
811 						/*see if cross 4G boundary*/
812 						length0=0x100000000-address_lo;
813 						pdma_sg->length=(ULONG)length0|IS_SG64_ADDR;
814 						address_hi=address_hi+1;
815 						address_lo=0;
816 						tmplength=tmplength-(LONG)length0;
817 						sg64s_size += sizeof(SG64ENTRY);
818 						psge += sizeof(SG64ENTRY);
819 						cdb_sgcount++;
820 					}
821 					else
822 					{
823     					pdma_sg->length=tmplength|IS_SG64_ADDR;
824 						sg64s_size += sizeof(SG64ENTRY);
825 						psge += sizeof(SG64ENTRY);
826 						break;
827 					}
828 				}
829 				arccdbsize += sg64s_size;
830 			}
831 			cdb_sgcount++;
832 		}
833 		pARCMSR_CDB->sgcount=(UCHAR)cdb_sgcount;
834 		pARCMSR_CDB->DataLength=pcsio->dxfer_len;
835 		if( arccdbsize > 256)
836 		{
837 			pARCMSR_CDB->Flags|=ARCMSR_CDB_FLAG_SGL_BSIZE;
838 		}
839 		if((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)
840 		{
841 			op=BUS_DMASYNC_PREREAD;
842 		}
843 		else
844 		{
845 			op=BUS_DMASYNC_PREWRITE;
846 			pARCMSR_CDB->Flags|=ARCMSR_CDB_FLAG_WRITE;
847 			pSRB->srb_flags|=SRB_FLAG_WRITE;
848 		}
849     	bus_dmamap_sync(pACB->buffer_dmat, pSRB->dmamap, op);
850 	}
851 	#if ARCMSR_DEBUG0
852 	printf("arcmsr_build_srb: pSRB=%p cmd=%x xferlength=%d arccdbsize=%d sgcount=%d\n",pSRB,pcsio->cdb_io.cdb_bytes[0],pARCMSR_CDB->DataLength,arccdbsize,pARCMSR_CDB->sgcount);
853 	#endif
854     return;
855 }
856 /*
857 **************************************************************************
858 **
859 **	arcmsr_post_srb - Send a protocol specific ARC send postcard to a AIOC .
860 **	handle: Handle of registered ARC protocol driver
861 **	adapter_id: AIOC unique identifier(integer)
862 **	pPOSTCARD_SEND: Pointer to ARC send postcard
863 **
864 **	This routine posts a ARC send postcard to the request post FIFO of a
865 **	specific ARC adapter.
866 **
867 **************************************************************************
868 */
869 static VOID arcmsr_post_srb(PACB pACB,PSRB pSRB)
870 {
871 	ULONG cdb_shifted_phyaddr=(ULONG) pSRB->cdb_shifted_phyaddr;
872 	PARCMSR_CDB pARCMSR_CDB=(PARCMSR_CDB)&pSRB->arcmsr_cdb;
873 
874 	#if ARCMSR_DEBUG0
875 	printf("arcmsr_post_srb: pSRB=%p  cdb_shifted_phyaddr=%x\n",pSRB,cdb_shifted_phyaddr);
876 	#endif
877     atomic_add_int(&pACB->srboutstandingcount,1);
878 	pSRB->startdone=ARCMSR_SRB_START;
879 	if(pARCMSR_CDB->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE)
880 	{
881 	    CHIP_REG_WRITE32(&pACB->pmu->inbound_queueport,cdb_shifted_phyaddr|ARCMSR_SRBPOST_FLAG_SGL_BSIZE);
882 	}
883 	else
884 	{
885 	    CHIP_REG_WRITE32(&pACB->pmu->inbound_queueport,cdb_shifted_phyaddr);
886 	}
887 	return;
888 }
889 /*
890 **************************************************************************
891 **
892 **
893 **************************************************************************
894 */
895 VOID arcmsr_post_wait2go_srb(PACB pACB)
896 {
897 	ULONG s;
898 	PSRB pSRB;
899 	LONG i=0;
900 	#if ARCMSR_DEBUG0
901 	printf("arcmsr_post_wait2go_srb:srbwait2gocount=%d srboutstandingcount=%d\n",pACB->srbwait2gocount,pACB->srboutstandingcount);
902 	#endif
903     s=splcam();
904 	while((pACB->srbwait2gocount > 0) && (pACB->srboutstandingcount < ARCMSR_MAX_OUTSTANDING_CMD))
905 	{
906 		pSRB=pACB->psrbwait2go[i];
907 		if(pSRB!=NULL)
908 		{
909 			pACB->psrbwait2go[i]=NULL;
910 			arcmsr_post_srb(pACB,pSRB);
911 			atomic_subtract_int(&pACB->srbwait2gocount,1);
912 		}
913 		i++;
914 		i%=ARCMSR_MAX_OUTSTANDING_CMD;
915 	}
916 	splx(s);
917 	return;
918 }
919 /*
920 **********************************************************************
921 **   Function: arcmsr_post_Qbuffer
922 **     Output:
923 **********************************************************************
924 */
925 VOID arcmsr_post_Qbuffer(PACB pACB)
926 {
927     ULONG s;
928 	PUCHAR pQbuffer;
929 	PQBUFFER pwbuffer=(PQBUFFER)&pACB->pmu->ioctl_wbuffer;
930     PUCHAR iop_data=(PUCHAR)pwbuffer->data;
931 	LONG allxfer_len=0;
932 
933     s=splcam();
934 	while((pACB->wqbuf_firstindex!=pACB->wqbuf_lastindex) && (allxfer_len<124))
935 	{
936 		pQbuffer=&pACB->wqbuffer[pACB->wqbuf_firstindex];
937 		memcpy(iop_data,pQbuffer,1);
938 		pACB->wqbuf_firstindex++;
939 		pACB->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER; /*if last index number set it to 0 */
940 		iop_data++;
941 		allxfer_len++;
942 	}
943 	pwbuffer->data_len=allxfer_len;
944 	/*
945 	** push inbound doorbell and wait reply at hwinterrupt routine for next Qbuffer post
946 	*/
947  	CHIP_REG_WRITE32(&pACB->pmu->inbound_doorbell,ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
948 	splx(s);
949 	return;
950 }
951 /*
952 ************************************************************************
953 **
954 **
955 ************************************************************************
956 */
957 VOID arcmsr_stop_adapter_bgrb(PACB pACB)
958 {
959     #if ARCMSR_DEBUG0
960     printf("arcmsr_stop_adapter_bgrb..............\n");
961     #endif
962 	pACB->acb_flags |= ACB_F_MSG_STOP_BGRB;
963 	pACB->acb_flags &= ~ACB_F_MSG_START_BGRB;
964 	CHIP_REG_WRITE32(&pACB->pmu->inbound_msgaddr0,ARCMSR_INBOUND_MESG0_STOP_BGRB);
965 	return;
966 }
967 /*
968 ************************************************************************
969 **
970 **
971 ************************************************************************
972 */
973 static VOID arcmsr_poll(struct cam_sim * psim)
974 {
975 	arcmsr_interrupt(cam_sim_softc(psim));
976 	return;
977 }
978 /*
979 **********************************************************************
980 **   Function:  arcmsr_interrupt
981 **     Output:  VOID
982 **   CAM  Status field values
983 **typedef enum {
984 **	CAM_REQ_INPROG,		   CCB request is in progress
985 **	CAM_REQ_CMP,		   CCB request completed without error
986 **	CAM_REQ_ABORTED,	   CCB request aborted by the host
987 **	CAM_UA_ABORT,		   Unable to abort CCB request
988 **	CAM_REQ_CMP_ERR,	   CCB request completed with an error
989 **	CAM_BUSY,		       CAM subsytem is busy
990 **	CAM_REQ_INVALID,	   CCB request was invalid
991 **	CAM_PATH_INVALID,	   Supplied Path ID is invalid
992 **	CAM_DEV_NOT_THERE,	   SCSI Device Not Installed/there
993 **	CAM_UA_TERMIO,		   Unable to terminate I/O CCB request
994 **	CAM_SEL_TIMEOUT,	   Target Selection Timeout
995 **	CAM_CMD_TIMEOUT,	   Command timeout
996 **	CAM_SCSI_STATUS_ERROR,	   SCSI error, look at error code in CCB
997 **	CAM_MSG_REJECT_REC,	   Message Reject Received
998 **	CAM_SCSI_BUS_RESET,	   SCSI Bus Reset Sent/Received
999 **	CAM_UNCOR_PARITY,	   Uncorrectable parity error occurred
1000 **	CAM_AUTOSENSE_FAIL=0x10,   Autosense: request sense cmd fail
1001 **	CAM_NO_HBA,		   No HBA Detected error
1002 **	CAM_DATA_RUN_ERR,	   Data Overrun error
1003 **	CAM_UNEXP_BUSFREE,	   Unexpected Bus Free
1004 **	CAM_SEQUENCE_FAIL,	   Target Bus Phase Sequence Failure
1005 **	CAM_CCB_LEN_ERR,	   CCB length supplied is inadequate
1006 **	CAM_PROVIDE_FAIL,	   Unable to provide requested capability
1007 **	CAM_BDR_SENT,		   A SCSI BDR msg was sent to target
1008 **	CAM_REQ_TERMIO,		   CCB request terminated by the host
1009 **	CAM_UNREC_HBA_ERROR,	   Unrecoverable Host Bus Adapter Error
1010 **	CAM_REQ_TOO_BIG,	   The request was too large for this host
1011 **	CAM_REQUEUE_REQ,
1012 **				 * This request should be requeued to preserve
1013 **				 * transaction ordering.  This typically occurs
1014 **				 * when the SIM recognizes an error that should
1015 **				 * freeze the queue and must place additional
1016 **				 * requests for the target at the sim level
1017 **				 * back into the XPT queue.
1018 **
1019 **	CAM_IDE=0x33,		   Initiator Detected Error
1020 **	CAM_RESRC_UNAVAIL,	   Resource Unavailable
1021 **	CAM_UNACKED_EVENT,	   Unacknowledged Event by Host
1022 **	CAM_MESSAGE_RECV,	   Message Received in Host Target Mode
1023 **	CAM_INVALID_CDB,	   Invalid CDB received in Host Target Mode
1024 **	CAM_LUN_INVALID,	   Lun supplied is invalid
1025 **	CAM_TID_INVALID,	   Target ID supplied is invalid
1026 **	CAM_FUNC_NOTAVAIL,	   The requested function is not available
1027 **	CAM_NO_NEXUS,		   Nexus is not established
1028 **	CAM_IID_INVALID,	   The initiator ID is invalid
1029 **	CAM_CDB_RECVD,		   The SCSI CDB has been received
1030 **	CAM_LUN_ALRDY_ENA,	   The LUN is already eanbeld for target mode
1031 **	CAM_SCSI_BUSY,		   SCSI Bus Busy
1032 **
1033 **	CAM_DEV_QFRZN=0x40,	   The DEV queue is frozen w/this err
1034 **
1035 **				   Autosense data valid for target
1036 **	CAM_AUTOSNS_VALID=0x80,
1037 **	CAM_RELEASE_SIMQ=0x100,   SIM ready to take more commands
1038 **	CAM_SIM_QUEUED  =0x200,   SIM has this command in it's queue
1039 **
1040 **	CAM_STATUS_MASK=0x3F,	   Mask bits for just the status #
1041 **
1042 **				   Target Specific Adjunct Status
1043 **	CAM_SENT_SENSE=0x40000000	   sent sense with status
1044 **} cam_status;
1045 **********************************************************************
1046 */
1047 static VOID arcmsr_interrupt(VOID *arg)
1048 {
1049 	PACB pACB=(PACB)arg;
1050 	PSRB pSRB;
1051 	ULONG flagpsrb,outbound_intstatus,outbound_doorbell;
1052 
1053     #if ARCMSR_DEBUG0
1054     printf("arcmsr_interrupt..............\n");
1055     #endif
1056 	/*
1057 	*********************************************
1058 	**   check outbound intstatus �˹�L�l�t�����a
1059 	*********************************************
1060 	*/
1061 	outbound_intstatus=CHIP_REG_READ32(&pACB->pmu->outbound_intstatus) & pACB->outbound_int_enable;
1062     CHIP_REG_WRITE32(&pACB->pmu->outbound_intstatus, outbound_intstatus);/*clear interrupt*/
1063 	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_DOORBELL_INT)
1064 	{
1065 		#if ARCMSR_DEBUG0
1066 		printf("arcmsr_interrupt:..........ARCMSR_MU_OUTBOUND_DOORBELL_INT\n");
1067 		#endif
1068 		/*
1069 		*********************************************
1070 		**  DOORBELL �m��! �O�_���l��nñ��
1071 		*********************************************
1072 		*/
1073 		outbound_doorbell=CHIP_REG_READ32(&pACB->pmu->outbound_doorbell);
1074 		CHIP_REG_WRITE32(&pACB->pmu->outbound_doorbell,outbound_doorbell);/*clear interrupt */
1075 		if(outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_WRITE_OK)
1076 		{
1077 			PQBUFFER prbuffer=(PQBUFFER)&pACB->pmu->ioctl_rbuffer;
1078 			PUCHAR iop_data=(PUCHAR)prbuffer->data;
1079 			PUCHAR pQbuffer;
1080 			LONG my_empty_len,iop_len,rqbuf_firstindex,rqbuf_lastindex;
1081 			ULONG s;
1082             /*check this iop data if overflow my rqbuffer*/
1083             s=splcam();
1084 			rqbuf_lastindex=pACB->rqbuf_lastindex;
1085 			rqbuf_firstindex=pACB->rqbuf_firstindex;
1086 			iop_len=prbuffer->data_len;
1087             my_empty_len=(rqbuf_firstindex-rqbuf_lastindex-1)&(ARCMSR_MAX_QBUFFER-1);
1088 			if(my_empty_len>=iop_len)
1089 			{
1090 				while(iop_len > 0)
1091 				{
1092 					pQbuffer=&pACB->rqbuffer[pACB->rqbuf_lastindex];
1093 					memcpy(pQbuffer,iop_data,1);
1094 					pACB->rqbuf_lastindex++;
1095 					pACB->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;/*if last index number set it to 0 */
1096 					iop_data++;
1097 					iop_len--;
1098 				}
1099 				CHIP_REG_WRITE32(&pACB->pmu->inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);/*signature, let IOP331 know data has been readed */
1100 			}
1101 			else
1102 			{
1103 				pACB->acb_flags|=ACB_F_IOPDATA_OVERFLOW;
1104 			}
1105 			splx(s);
1106 		}
1107 		if(outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_READ_OK)
1108 		{
1109 			ULONG s;
1110 			/*
1111 			*********************************************
1112 			**           �ݬݬO�_�٦��l��n���D�H�X
1113 			*********************************************
1114 			*/
1115 			s=splcam();
1116 			if(pACB->wqbuf_firstindex!=pACB->wqbuf_lastindex)
1117 			{
1118 				PUCHAR pQbuffer;
1119 				PQBUFFER pwbuffer=(PQBUFFER)&pACB->pmu->ioctl_wbuffer;
1120 				PUCHAR iop_data=(PUCHAR)pwbuffer->data;
1121 				LONG allxfer_len=0;
1122 
1123 				while((pACB->wqbuf_firstindex!=pACB->wqbuf_lastindex) && (allxfer_len<124))
1124 				{
1125 					pQbuffer=&pACB->wqbuffer[pACB->wqbuf_firstindex];
1126    					memcpy(iop_data,pQbuffer,1);
1127 					pACB->wqbuf_firstindex++;
1128 					pACB->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER; /*if last index number set it to 0 */
1129 					iop_data++;
1130 					allxfer_len++;
1131 				}
1132 				pwbuffer->data_len=allxfer_len;
1133 				/*
1134 				** push inbound doorbell tell iop driver data write ok and wait reply on next hwinterrupt for next Qbuffer post
1135 				*/
1136 				CHIP_REG_WRITE32(&pACB->pmu->inbound_doorbell,ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
1137  			}
1138 			else
1139 			{
1140 				pACB->acb_flags |= ACB_F_IOCTL_WQBUFFER_CLEARED;
1141 			}
1142 			splx(s);
1143 		}
1144 	}
1145 	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_POSTQUEUE_INT)
1146 	{
1147  		/*
1148 		*****************************************************************************
1149 		**               areca cdb command done
1150 		*****************************************************************************
1151 		*/
1152 		while(1)
1153 		{
1154 			if((flagpsrb=CHIP_REG_READ32(&pACB->pmu->outbound_queueport)) == 0xFFFFFFFF)
1155 			{
1156 				break;/*chip FIFO no srb for completion already*/
1157 			}
1158 			/* check if command done with no error*/
1159 			pSRB=(PSRB)(CINT2P)(pACB->vir2phy_offset+(flagpsrb << 5));/*frame must be 32 bytes aligned*/
1160 			if((pSRB->pACB!=pACB) || (pSRB->startdone!=ARCMSR_SRB_START))
1161 			{
1162 				if(pSRB->startdone==ARCMSR_SRB_ABORTED)
1163 				{
1164 					pSRB->pccb->ccb_h.status=CAM_REQ_ABORTED;
1165 					arcmsr_srb_complete(pSRB);
1166 					break;
1167 				}
1168   				printf("arcmsr_interrupt:got an illegal srb command done ...pACB=%p pSRB=%p srboutstandingcount=%d .....\n",pACB,pSRB,pACB->srboutstandingcount);
1169 				break;
1170 			}
1171 			if((flagpsrb & ARCMSR_SRBREPLY_FLAG_ERROR)==0)
1172 			{
1173 				pSRB->pccb->ccb_h.status=CAM_REQ_CMP;
1174 				arcmsr_srb_complete(pSRB);
1175 			}
1176 			else
1177 			{
1178 				switch(pSRB->arcmsr_cdb.DeviceStatus)
1179 				{
1180 				case ARCMSR_DEV_SELECT_TIMEOUT:
1181 					{
1182 						#if ARCMSR_DEBUG0
1183 						printf("pSRB=%p ......ARCMSR_DEV_SELECT_TIMEOUT\n",pSRB);
1184 						#endif
1185  						pSRB->pccb->ccb_h.status=CAM_SEL_TIMEOUT;
1186 						arcmsr_srb_complete(pSRB);
1187 					}
1188 					break;
1189 				case ARCMSR_DEV_ABORTED:
1190 					{
1191 						#if ARCMSR_DEBUG0
1192 						printf("pSRB=%p ......ARCMSR_DEV_ABORTED\n",pSRB);
1193 						#endif
1194 						pSRB->pccb->ccb_h.status=CAM_DEV_NOT_THERE;
1195 						arcmsr_srb_complete(pSRB);
1196 					}
1197 					break;
1198 				case ARCMSR_DEV_INIT_FAIL:
1199 					{
1200 						#if ARCMSR_DEBUG0
1201 						printf("pSRB=%p .....ARCMSR_DEV_INIT_FAIL\n",pSRB);
1202 						#endif
1203  						pSRB->pccb->ccb_h.status=CAM_DEV_NOT_THERE;
1204 						arcmsr_srb_complete(pSRB);
1205 					}
1206 					break;
1207 				case SCSISTAT_CHECK_CONDITION:
1208 					{
1209 						#if ARCMSR_DEBUG0
1210 						printf("pSRB=%p .....SCSISTAT_CHECK_CONDITION\n",pSRB);
1211 						#endif
1212                         arcmsr_report_SenseInfoBuffer(pSRB);
1213 						arcmsr_srb_complete(pSRB);
1214 					}
1215 					break;
1216 				default:
1217 					/* error occur Q all error srb to errorsrbpending Q*/
1218  					printf("arcmsr_interrupt:command error done ......but got unknow DeviceStatus=%x....\n",pSRB->arcmsr_cdb.DeviceStatus);
1219 					pSRB->pccb->ccb_h.status=CAM_UNCOR_PARITY;/*unknow error or crc error just for retry*/
1220 					arcmsr_srb_complete(pSRB);
1221 					break;
1222 				}
1223 			}
1224 		}	/*drain reply FIFO*/
1225 	}
1226 	if(pACB->srbwait2gocount != 0)
1227 	{
1228     	arcmsr_post_wait2go_srb(pACB);/*try to post all pending srb*/
1229  	}
1230 	return;
1231 }
1232 /*
1233 ***********************************************************************
1234 **
1235 **int	copyin __P((const void *udaddr, void *kaddr, size_t len));
1236 **int	copyout __P((const void *kaddr, void *udaddr, size_t len));
1237 **
1238 **ENOENT     "" No such file or directory ""
1239 **ENOIOCTL   "" ioctl not handled by this layer ""
1240 **ENOMEM     "" Cannot allocate memory ""
1241 **EINVAL     "" Invalid argument ""
1242 ************************************************************************
1243 */
1244 LONG arcmsr_iop_ioctlcmd(PACB pACB,ULONG ioctl_cmd,caddr_t arg)
1245 {
1246 	PCMD_IO_CONTROL pccbioctl=(PCMD_IO_CONTROL) arg;
1247 
1248  	#if ARCMSR_DEBUG0
1249 	printf("arcmsr_iop_ioctlcmd................. \n");
1250 	#endif
1251 
1252 	if(memcmp(pccbioctl->Signature,"ARCMSR",6)!=0)
1253     {
1254         return EINVAL;
1255 	}
1256 	switch(ioctl_cmd)
1257 	{
1258 	case ARCMSR_IOCTL_READ_RQBUFFER:
1259 		{
1260 			ULONG s;
1261 			PCMD_IOCTL_FIELD pccbioctlfld=(PCMD_IOCTL_FIELD)arg;
1262 			PUCHAR pQbuffer,ptmpQbuffer=pccbioctlfld->ioctldatabuffer;
1263 			LONG allxfer_len=0;
1264 
1265             s=splcam();
1266 			while((pACB->rqbuf_firstindex!=pACB->rqbuf_lastindex) && (allxfer_len<1031))
1267 			{
1268 				/*copy READ QBUFFER to srb*/
1269                 pQbuffer=&pACB->rqbuffer[pACB->rqbuf_firstindex];
1270 				memcpy(ptmpQbuffer,pQbuffer,1);
1271 				pACB->rqbuf_firstindex++;
1272 				pACB->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER; /*if last index number set it to 0 */
1273 				ptmpQbuffer++;
1274 				allxfer_len++;
1275 			}
1276 			if(pACB->acb_flags & ACB_F_IOPDATA_OVERFLOW)
1277 			{
1278                 PQBUFFER prbuffer=(PQBUFFER)&pACB->pmu->ioctl_rbuffer;
1279                 PUCHAR pQbuffer;
1280 				PUCHAR iop_data=(PUCHAR)prbuffer->data;
1281                 LONG iop_len;
1282 
1283                 pACB->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1284 			    iop_len=(LONG)prbuffer->data_len;
1285 				/*this iop data does no chance to make me overflow again here, so just do it*/
1286 				while(iop_len>0)
1287 				{
1288                     pQbuffer=&pACB->rqbuffer[pACB->rqbuf_lastindex];
1289 					memcpy(pQbuffer,iop_data,1);
1290 					pACB->rqbuf_lastindex++;
1291 					pACB->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;/*if last index number set it to 0 */
1292 					iop_data++;
1293 					iop_len--;
1294 				}
1295 				CHIP_REG_WRITE32(&pACB->pmu->inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);/*signature, let IOP331 know data has been readed */
1296 			}
1297 			pccbioctl->Length=allxfer_len;
1298 			pccbioctl->ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK;
1299 			splx(s);
1300 			return ARC_IOCTL_SUCCESS;
1301  		}
1302 		break;
1303 	case ARCMSR_IOCTL_WRITE_WQBUFFER:
1304 		{
1305 			ULONG s;
1306             PCMD_IOCTL_FIELD pccbioctlfld=(PCMD_IOCTL_FIELD)arg;
1307 			LONG my_empty_len,user_len,wqbuf_firstindex,wqbuf_lastindex;
1308 			PUCHAR pQbuffer,ptmpuserbuffer=pccbioctlfld->ioctldatabuffer;
1309 
1310             s=splcam();
1311             user_len=pccbioctl->Length;
1312 
1313  			/*check if data xfer length of this request will overflow my array qbuffer */
1314 			wqbuf_lastindex=pACB->wqbuf_lastindex;
1315 			wqbuf_firstindex=pACB->wqbuf_firstindex;
1316 			my_empty_len=(wqbuf_firstindex-wqbuf_lastindex-1)&(ARCMSR_MAX_QBUFFER-1);
1317 			if(my_empty_len>=user_len)
1318 			{
1319 				while(user_len>0)
1320 				{
1321 					/*copy srb data to wqbuffer*/
1322 					pQbuffer=&pACB->wqbuffer[pACB->wqbuf_lastindex];
1323 					memcpy(pQbuffer,ptmpuserbuffer,1);
1324 					pACB->wqbuf_lastindex++;
1325 					pACB->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER;/*if last index number set it to 0 */
1326  					ptmpuserbuffer++;
1327 					user_len--;
1328 				}
1329 				/*post fist Qbuffer*/
1330 				if(pACB->acb_flags & ACB_F_IOCTL_WQBUFFER_CLEARED)
1331 				{
1332 					pACB->acb_flags &=~ACB_F_IOCTL_WQBUFFER_CLEARED;
1333  					arcmsr_post_Qbuffer(pACB);
1334 				}
1335 				pccbioctl->ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK;
1336 			}
1337 			else
1338 			{
1339 				pccbioctl->ReturnCode=ARCMSR_IOCTL_RETURNCODE_ERROR;
1340 			}
1341 			splx(s);
1342 			return ARC_IOCTL_SUCCESS;
1343 		}
1344 		break;
1345 	case ARCMSR_IOCTL_CLEAR_RQBUFFER:
1346 		{
1347 			ULONG s;
1348 			PUCHAR pQbuffer=pACB->rqbuffer;
1349             s=splcam();
1350 			if(pACB->acb_flags & ACB_F_IOPDATA_OVERFLOW)
1351 			{
1352                 pACB->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1353                 CHIP_REG_WRITE32(&pACB->pmu->inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);/*signature, let IOP331 know data has been readed */
1354 			}
1355             pACB->acb_flags |= ACB_F_IOCTL_RQBUFFER_CLEARED;
1356 			pACB->rqbuf_firstindex=0;
1357 			pACB->rqbuf_lastindex=0;
1358             memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
1359 			pccbioctl->ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK;
1360 			splx(s);
1361 			return ARC_IOCTL_SUCCESS;
1362 		}
1363 		break;
1364 	case ARCMSR_IOCTL_CLEAR_WQBUFFER:
1365 		{
1366 			ULONG s;
1367 			PUCHAR pQbuffer=pACB->wqbuffer;
1368 
1369             s=splcam();
1370 			if(pACB->acb_flags & ACB_F_IOPDATA_OVERFLOW)
1371 			{
1372                 pACB->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1373                 CHIP_REG_WRITE32(&pACB->pmu->inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);/*signature, let IOP331 know data has been readed */
1374 			}
1375 			pACB->acb_flags |= ACB_F_IOCTL_WQBUFFER_CLEARED;
1376 			pACB->wqbuf_firstindex=0;
1377 			pACB->wqbuf_lastindex=0;
1378             memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
1379 			pccbioctl->ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK;
1380 			splx(s);
1381 			return ARC_IOCTL_SUCCESS;
1382 		}
1383 		break;
1384 	case ARCMSR_IOCTL_CLEAR_ALLQBUFFER:
1385 		{
1386 			ULONG s;
1387 			PUCHAR pQbuffer;
1388 
1389             s=splcam();
1390 			if(pACB->acb_flags & ACB_F_IOPDATA_OVERFLOW)
1391 			{
1392                 pACB->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1393                 CHIP_REG_WRITE32(&pACB->pmu->inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);/*signature, let IOP331 know data has been readed */
1394 			}
1395 			pACB->acb_flags |= (ACB_F_IOCTL_WQBUFFER_CLEARED|ACB_F_IOCTL_RQBUFFER_CLEARED);
1396 			pACB->rqbuf_firstindex=0;
1397 			pACB->rqbuf_lastindex=0;
1398 			pACB->wqbuf_firstindex=0;
1399 			pACB->wqbuf_lastindex=0;
1400 			pQbuffer=pACB->rqbuffer;
1401             memset(pQbuffer, 0, sizeof(struct _QBUFFER));
1402 			pQbuffer=pACB->wqbuffer;
1403             memset(pQbuffer, 0, sizeof(struct _QBUFFER));
1404 			pccbioctl->ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK;
1405 			splx(s);
1406 			return ARC_IOCTL_SUCCESS;
1407 		}
1408 		break;
1409 	case ARCMSR_IOCTL_RETURN_CODE_3F:
1410 		{
1411 			pccbioctl->ReturnCode=ARCMSR_IOCTL_RETURNCODE_3F;
1412 			return ARC_IOCTL_SUCCESS;
1413 		}
1414 		break;
1415 	case ARCMSR_IOCTL_SAY_HELLO:
1416 		{
1417 			PCMD_IOCTL_FIELD pccbioctlfld=(PCMD_IOCTL_FIELD)arg;
1418 			PCHAR hello_string="Hello! I am ARCMSR";
1419 			PCHAR puserbuffer=(PUCHAR)pccbioctlfld->ioctldatabuffer;
1420 
1421 			if(memcpy(puserbuffer,hello_string,(SHORT)strlen(hello_string)))
1422 			{
1423 				pccbioctl->ReturnCode=ARCMSR_IOCTL_RETURNCODE_ERROR;
1424                 return ENOIOCTL;
1425 			}
1426             pccbioctl->ReturnCode=ARCMSR_IOCTL_RETURNCODE_OK;
1427 		    return ARC_IOCTL_SUCCESS;
1428 		}
1429 		break;
1430 	}
1431     return EINVAL;
1432 }
1433 /*
1434 **************************************************************************
1435 **
1436 **************************************************************************
1437 */
1438 PSRB arcmsr_get_freesrb(PACB pACB)
1439 {
1440     PSRB pSRB=NULL;
1441   	ULONG s;
1442 	LONG srb_startindex,srb_doneindex;
1443 
1444     #if ARCMSR_DEBUG0
1445 	printf("arcmsr_get_freesrb: srb_startindex=%d srb_doneindex=%d\n",pACB->srb_startindex,pACB->srb_doneindex);
1446     #endif
1447 
1448 	s=splcam();
1449 	srb_doneindex=pACB->srb_doneindex;
1450 	srb_startindex=pACB->srb_startindex;
1451 	pSRB=pACB->psrbringQ[srb_startindex];
1452 	srb_startindex++;
1453 	srb_startindex %= ARCMSR_MAX_FREESRB_NUM;
1454 	if(srb_doneindex!=srb_startindex)
1455 	{
1456   		pACB->srb_startindex=srb_startindex;
1457   	}
1458 	else
1459 	{
1460         pSRB=NULL;
1461 	}
1462 	splx(s);
1463 	return(pSRB);
1464 }
1465 /*
1466 *********************************************************************
1467 **
1468 **
1469 **
1470 *********************************************************************
1471 */
1472 static VOID arcmsr_executesrb(VOID *arg,bus_dma_segment_t *dm_segs,LONG nseg,LONG error)
1473 {
1474 	PSRB	  pSRB=(PSRB)arg;
1475     PACB      pACB;
1476 	union ccb *pccb;
1477 
1478     #if ARCMSR_DEBUG0
1479     printf("arcmsr_executesrb........................................ \n" );
1480     #endif
1481 
1482 	pccb=pSRB->pccb;
1483    	pACB=(PACB)pSRB->pACB;
1484 	if(error != 0)
1485 	{
1486 		if(error != EFBIG)
1487 		{
1488 			printf("arcmsr_executesrb:%d Unexepected error %x returned from "  "bus_dmamap_load\n",pACB->pci_unit,error);
1489 		}
1490 		if(pccb->ccb_h.status == CAM_REQ_INPROG)
1491 		{
1492 			xpt_freeze_devq(pccb->ccb_h.path,/*count*/1);
1493 			pccb->ccb_h.status=CAM_REQ_TOO_BIG|CAM_DEV_QFRZN;
1494 		}
1495 		xpt_done(pccb);
1496 		return;
1497 	}
1498     arcmsr_build_srb(pSRB,dm_segs,nseg);
1499 	if((pccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_INPROG)
1500 	{
1501 		if(nseg != 0)
1502 		{
1503 			bus_dmamap_unload(pACB->buffer_dmat,pSRB->dmamap);
1504 		}
1505 		xpt_done(pccb);
1506 		return;
1507 	}
1508 	pccb->ccb_h.status |= CAM_SIM_QUEUED;
1509 	if(pACB->srboutstandingcount < ARCMSR_MAX_OUTSTANDING_CMD)
1510 	{
1511 		/*
1512 		******************************************************************
1513 		** and we can make sure there were no pending srb in this duration
1514 		******************************************************************
1515 		*/
1516     	arcmsr_post_srb(pACB,pSRB);
1517 	}
1518 	else
1519 	{
1520 		/*
1521 		******************************************************************
1522 		** Q of srbwaitexec will be post out when any outstanding command complete
1523 		******************************************************************
1524 		*/
1525 		arcmsr_queue_wait2go_srb(pACB,pSRB);
1526 	}
1527 	return;
1528 }
1529 /*
1530 *****************************************************************************************
1531 **
1532 *****************************************************************************************
1533 */
1534 BOOLEAN arcmsr_seek_cmd2abort(union ccb * pabortccb)
1535 {
1536  	PSRB pSRB,pfreesrb;
1537     PACB pACB=(PACB) pabortccb->ccb_h.arcmsr_ccbacb_ptr;
1538 	ULONG s,intmask_org,mask;
1539     LONG i=0;
1540 
1541     #if ARCMSR_DEBUG0
1542     printf("arcmsr_seek_cmd2abort.................. \n");
1543     #endif
1544 
1545 	s=splcam();
1546 	/*
1547 	** It is the upper layer do abort command this lock just prior to calling us.
1548 	** First determine if we currently own this command.
1549 	** Start by searching the device queue. If not found
1550 	** at all,and the system wanted us to just abort the
1551 	** command return success.
1552 	*/
1553 	if(pACB->srboutstandingcount!=0)
1554 	{
1555 		/* Q back all outstanding srb into wait exec psrb Q*/
1556 		pfreesrb=pACB->pfreesrb;
1557 		for(i=0;i<ARCMSR_MAX_FREESRB_NUM;i++)
1558 		{
1559 	    	pSRB=&pfreesrb[i];
1560 			if(pSRB->startdone==ARCMSR_SRB_START)
1561 			{
1562 				if(pSRB->pccb==pabortccb)
1563 				{
1564 					/* disable all outbound interrupt */
1565 					intmask_org=CHIP_REG_READ32(&pACB->pmu->outbound_intmask);
1566 					CHIP_REG_WRITE32(&pACB->pmu->outbound_intmask,intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE);
1567 				    /* talk to iop 331 outstanding command aborted*/
1568 					arcmsr_abort_allcmd(pACB);
1569 					if(arcmsr_wait_msgint_ready(pACB)!=TRUE)
1570 					{
1571 						printf("arcmsr_seek_cmd2abort: wait 'abort all outstanding command' timeout.................in \n");
1572 					}
1573 					/*clear all outbound posted Q*/
1574 					for(i=0;i<ARCMSR_MAX_OUTSTANDING_CMD;i++)
1575 					{
1576 						CHIP_REG_READ32(&pACB->pmu->outbound_queueport);
1577 					}
1578 					pfreesrb=pACB->pfreesrb;
1579 					for(i=0;i<ARCMSR_MAX_FREESRB_NUM;i++)
1580 					{
1581 	    				pSRB=&pfreesrb[i];
1582 						if(pSRB->startdone==ARCMSR_SRB_START)
1583 						{
1584 							pSRB->startdone=ARCMSR_SRB_ABORTED;
1585 							pSRB->pccb->ccb_h.status=CAM_REQ_ABORTED;
1586 							arcmsr_srb_complete(pSRB);
1587 						}
1588 					}
1589     			    /* enable all outbound interrupt */
1590 			        mask=~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE|ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE);
1591                     CHIP_REG_WRITE32(&pACB->pmu->outbound_intmask,intmask_org & mask);
1592 					splx(s);
1593 					return(TRUE);
1594 				}
1595 			}
1596 		}
1597 	}
1598 	/*
1599 	** seek this command at our command list
1600 	** if command found then remove,abort it and free this SRB
1601 	*/
1602 	if(pACB->srbwait2gocount!=0)
1603 	{
1604 		for(i=0;i<ARCMSR_MAX_OUTSTANDING_CMD;i++)
1605 		{
1606 			pSRB=pACB->psrbwait2go[i];
1607 			if(pSRB!=NULL)
1608 			{
1609 				if(pSRB->pccb==pabortccb)
1610 				{
1611 					pACB->psrbwait2go[i]=NULL;
1612 					pSRB->startdone=ARCMSR_SRB_ABORTED;
1613 					pSRB->pccb->ccb_h.status=CAM_REQ_ABORTED;
1614 					arcmsr_srb_complete(pSRB);
1615 	    			atomic_subtract_int(&pACB->srbwait2gocount,1);
1616                     splx(s);
1617 					return(TRUE);
1618 				}
1619 			}
1620 		}
1621 	}
1622  	splx(s);
1623 	return (FALSE);
1624 }
1625 /*
1626 ****************************************************************************
1627 **
1628 ****************************************************************************
1629 */
1630 VOID arcmsr_bus_reset(PACB pACB)
1631 {
1632 	#if ARCMSR_DEBUG0
1633 	printf("arcmsr_bus_reset.......................... \n");
1634 	#endif
1635 
1636 	arcmsr_iop_reset(pACB);
1637  	return;
1638 }
1639 /*
1640 *********************************************************************
1641 **
1642 **   CAM  Status field values
1643 **typedef enum {
1644 **	CAM_REQ_INPROG,		   CCB request is in progress
1645 **	CAM_REQ_CMP,		   CCB request completed without error
1646 **	CAM_REQ_ABORTED,	   CCB request aborted by the host
1647 **	CAM_UA_ABORT,		   Unable to abort CCB request
1648 **	CAM_REQ_CMP_ERR,	   CCB request completed with an error
1649 **	CAM_BUSY,		       CAM subsytem is busy
1650 **	CAM_REQ_INVALID,	   CCB request was invalid
1651 **	CAM_PATH_INVALID,	   Supplied Path ID is invalid
1652 **	CAM_DEV_NOT_THERE,	   SCSI Device Not Installed/there
1653 **	CAM_UA_TERMIO,		   Unable to terminate I/O CCB request
1654 **	CAM_SEL_TIMEOUT,	   Target Selection Timeout
1655 **	CAM_CMD_TIMEOUT,	   Command timeout
1656 **	CAM_SCSI_STATUS_ERROR,	   SCSI error, look at error code in CCB
1657 **	CAM_MSG_REJECT_REC,	   Message Reject Received
1658 **	CAM_SCSI_BUS_RESET,	   SCSI Bus Reset Sent/Received
1659 **	CAM_UNCOR_PARITY,	   Uncorrectable parity error occurred
1660 **	CAM_AUTOSENSE_FAIL=0x10,   Autosense: request sense cmd fail
1661 **	CAM_NO_HBA,		   No HBA Detected error
1662 **	CAM_DATA_RUN_ERR,	   Data Overrun error
1663 **	CAM_UNEXP_BUSFREE,	   Unexpected Bus Free
1664 **	CAM_SEQUENCE_FAIL,	   Target Bus Phase Sequence Failure
1665 **	CAM_CCB_LEN_ERR,	   CCB length supplied is inadequate
1666 **	CAM_PROVIDE_FAIL,	   Unable to provide requested capability
1667 **	CAM_BDR_SENT,		   A SCSI BDR msg was sent to target
1668 **	CAM_REQ_TERMIO,		   CCB request terminated by the host
1669 **	CAM_UNREC_HBA_ERROR,	   Unrecoverable Host Bus Adapter Error
1670 **	CAM_REQ_TOO_BIG,	   The request was too large for this host
1671 **	CAM_REQUEUE_REQ,
1672 **				 * This request should be requeued to preserve
1673 **				 * transaction ordering.  This typically occurs
1674 **				 * when the SIM recognizes an error that should
1675 **				 * freeze the queue and must place additional
1676 **				 * requests for the target at the sim level
1677 **				 * back into the XPT queue.
1678 **
1679 **	CAM_IDE=0x33,		   Initiator Detected Error
1680 **	CAM_RESRC_UNAVAIL,	   Resource Unavailable
1681 **	CAM_UNACKED_EVENT,	   Unacknowledged Event by Host
1682 **	CAM_MESSAGE_RECV,	   Message Received in Host Target Mode
1683 **	CAM_INVALID_CDB,	   Invalid CDB received in Host Target Mode
1684 **	CAM_LUN_INVALID,	   Lun supplied is invalid
1685 **	CAM_TID_INVALID,	   Target ID supplied is invalid
1686 **	CAM_FUNC_NOTAVAIL,	   The requested function is not available
1687 **	CAM_NO_NEXUS,		   Nexus is not established
1688 **	CAM_IID_INVALID,	   The initiator ID is invalid
1689 **	CAM_CDB_RECVD,		   The SCSI CDB has been received
1690 **	CAM_LUN_ALRDY_ENA,	   The LUN is already eanbeld for target mode
1691 **	CAM_SCSI_BUSY,		   SCSI Bus Busy
1692 **
1693 **	CAM_DEV_QFRZN=0x40,	   The DEV queue is frozen w/this err
1694 **
1695 **				   Autosense data valid for target
1696 **	CAM_AUTOSNS_VALID=0x80,
1697 **	CAM_RELEASE_SIMQ=0x100,   SIM ready to take more commands
1698 **	CAM_SIM_QUEUED  =0x200,   SIM has this command in it's queue
1699 **
1700 **	CAM_STATUS_MASK=0x3F,	   Mask bits for just the status #
1701 **
1702 **				   Target Specific Adjunct Status
1703 **	CAM_SENT_SENSE=0x40000000	   sent sense with status
1704 **} cam_status;
1705 **
1706 **union ccb {
1707 **			struct	ccb_hdr			ccb_h;	 For convenience
1708 **			struct	ccb_scsiio		csio;
1709 **			struct	ccb_getdev		cgd;
1710 **			struct	ccb_getdevlist		cgdl;
1711 **			struct	ccb_pathinq		cpi;
1712 **			struct	ccb_relsim		crs;
1713 **			struct	ccb_setasync		csa;
1714 **			struct	ccb_setdev		csd;
1715 **			struct	ccb_pathstats		cpis;
1716 **			struct	ccb_getdevstats		cgds;
1717 **			struct	ccb_dev_match		cdm;
1718 **			struct	ccb_trans_settings	cts;
1719 **			struct	ccb_calc_geometry	ccg;
1720 **			struct	ccb_abort		cab;
1721 **			struct	ccb_resetbus		crb;
1722 **			struct	ccb_resetdev		crd;
1723 **			struct	ccb_termio		tio;
1724 **			struct	ccb_accept_tio		atio;
1725 **			struct	ccb_scsiio		ctio;
1726 **			struct	ccb_en_lun		cel;
1727 **			struct	ccb_immed_notify	cin;
1728 **			struct	ccb_notify_ack		cna;
1729 **			struct	ccb_eng_inq		cei;
1730 **			struct	ccb_eng_exec		cee;
1731 **			struct 	ccb_rescan		crcn;
1732 **			struct  ccb_debug		cdbg;
1733 **          }
1734 **
1735 **struct ccb_hdr {
1736 **	cam_pinfo	    pinfo;	                                    "" Info for priority scheduling
1737 **	camq_entry	    xpt_links;	                                "" For chaining in the XPT layer
1738 **	camq_entry	    sim_links;	                                "" For chaining in the SIM layer
1739 **	camq_entry	    periph_links;                               "" For chaining in the type driver
1740 **	u_int32_t	    retry_count;
1741 **	void		    (*cbfcnp)(struct cam_periph *, union ccb *);"" Callback on completion function
1742 **	xpt_opcode	    func_code;	                                "" XPT function code
1743 **	u_int32_t	    status;	                                    "" Status returned by CAM subsystem
1744 **	struct		    cam_path *path;                             "" Compiled path for this ccb
1745 **	path_id_t	    path_id;	                                "" Path ID for the request
1746 **	target_id_t	    target_id;	                                "" Target device ID
1747 **	lun_id_t	    target_lun;                              	"" Target LUN number
1748 **	u_int32_t	    flags;
1749 **	ccb_ppriv_area	periph_priv;
1750 **	ccb_spriv_area	sim_priv;
1751 **	u_int32_t	    timeout;	                                "" Timeout value
1752 **	struct		    callout_handle timeout_ch;                  "" Callout handle used for timeouts
1753 **};
1754 **
1755 **typedef union {
1756 **	u_int8_t  *cdb_ptr;		               "" Pointer to the CDB bytes to send
1757 **	u_int8_t  cdb_bytes[IOCDBLEN];         "" Area for the CDB send
1758 **} cdb_t;
1759 **
1760 ** SCSI I/O Request CCB used for the XPT_SCSI_IO and XPT_CONT_TARGET_IO
1761 ** function codes.
1762 **
1763 **struct ccb_scsiio {
1764 **	struct	   ccb_hdr ccb_h;
1765 **	union	   ccb *next_ccb;	           "" Ptr for next CCB for action
1766 **	u_int8_t   *req_map;		           "" Ptr to mapping info
1767 **	u_int8_t   *data_ptr;		           "" Ptr to the data buf/SG list
1768 **	u_int32_t  dxfer_len;		           "" Data transfer length
1769 **	struct     scsi_sense_data sense_data; "" Autosense storage
1770 **	u_int8_t   sense_len;		           "" Number of bytes to autosense
1771 **	u_int8_t   cdb_len;		               "" Number of bytes for the CDB
1772 **	u_int16_t  sglist_cnt;		           "" Number of SG list entries
1773 **	u_int8_t   scsi_status;		           "" Returned SCSI status
1774 **	u_int8_t   sense_resid;		           "" Autosense resid length: 2's comp
1775 **	u_int32_t  resid;		               "" Transfer residual length: 2's comp
1776 **	cdb_t	   cdb_io;		               "" Union for CDB bytes/pointer
1777 **	u_int8_t   *msg_ptr;		           "" Pointer to the message buffer
1778 **	u_int16_t  msg_len;		               "" Number of bytes for the Message
1779 **	u_int8_t   tag_action;		           "" What to do for tag queueing
1780 **#define	CAM_TAG_ACTION_NONE	0x00       "" The tag action should be either the define below (to send a non-tagged transaction) or one of the defined scsi tag messages from scsi_message.h.
1781 **	u_int	   tag_id;		               "" tag id from initator (target mode)
1782 **	u_int	   init_id;		               "" initiator id of who selected
1783 **}
1784 *********************************************************************
1785 */
1786 static VOID arcmsr_action(struct cam_sim * psim,union ccb * pccb)
1787 {
1788 	PACB  pACB;
1789 
1790 	#if ARCMSR_DEBUG0
1791     printf("arcmsr_action ..................................\n" );
1792     #endif
1793 
1794 	pACB=(PACB) cam_sim_softc(psim);
1795 	if(pACB==NULL)
1796 	{
1797     	pccb->ccb_h.status=CAM_REQ_INVALID;
1798 		xpt_done(pccb);
1799 		return;
1800 	}
1801 	switch (pccb->ccb_h.func_code)
1802 	{
1803 	case XPT_SCSI_IO:
1804 		{
1805 	    	PSRB pSRB;
1806 			#if ARCMSR_DEBUG0
1807 			printf("arcmsr_action: XPT_SCSI_IO......................\n" );
1808 			#endif
1809 
1810 			if((pSRB=arcmsr_get_freesrb(pACB)) == NULL)
1811 			{
1812 				pccb->ccb_h.status=CAM_RESRC_UNAVAIL;
1813 				xpt_done(pccb);
1814 				return;
1815 			}
1816 			pccb->ccb_h.arcmsr_ccbsrb_ptr=pSRB;
1817 			pccb->ccb_h.arcmsr_ccbacb_ptr=pACB;
1818 			pSRB->pccb=pccb;
1819 			if((pccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE)
1820 			{
1821 				if((pccb->ccb_h.flags & CAM_SCATTER_VALID) == 0)
1822 				{
1823 					if((pccb->ccb_h.flags & CAM_DATA_PHYS) == 0)
1824 					{
1825 						LONG error,s;
1826 
1827 						s=splsoftvm();
1828 						error =	bus_dmamap_load(pACB->buffer_dmat,pSRB->dmamap,pccb->csio.data_ptr,pccb->csio.dxfer_len,arcmsr_executesrb,pSRB,/*flags*/0);
1829 	         			if(error == EINPROGRESS)
1830 						{
1831 							xpt_freeze_simq(pACB->psim,1);
1832 							pccb->ccb_h.status |= CAM_RELEASE_SIMQ;
1833 						}
1834 						splx(s);
1835 					}
1836 					else
1837 					{
1838 						panic("arcmsr: CAM_DATA_PHYS not supported");
1839 					}
1840 				}
1841 				else
1842 				{
1843 					struct bus_dma_segment *segs;
1844 
1845 					if((pccb->ccb_h.flags & CAM_SG_LIST_PHYS) == 0 || (pccb->ccb_h.flags & CAM_DATA_PHYS) != 0)
1846 					{
1847 						pccb->ccb_h.status=CAM_PROVIDE_FAIL;
1848 						xpt_done(pccb);
1849 						free(pSRB,M_DEVBUF);
1850 						return;
1851 					}
1852 					segs=(struct bus_dma_segment *)pccb->csio.data_ptr;
1853 					arcmsr_executesrb(pSRB,segs,pccb->csio.sglist_cnt,0);
1854 				}
1855 			}
1856 			else
1857 			{
1858 				arcmsr_executesrb(pSRB,NULL,0,0);
1859 			}
1860 			break;
1861 		}
1862 	case XPT_TARGET_IO:
1863 		{
1864 			#if ARCMSR_DEBUG0
1865 			printf("arcmsr_action: XPT_TARGET_IO\n" );
1866 			#endif
1867 			/*
1868 			** target mode not yet support vendor specific commands.
1869 			*/
1870   			pccb->ccb_h.status=CAM_REQ_CMP;
1871 			xpt_done(pccb);
1872 			break;
1873 		}
1874 	case XPT_PATH_INQ:
1875 		{
1876 			struct ccb_pathinq *cpi=&pccb->cpi;
1877 
1878 			#if ARCMSR_DEBUG0
1879 			printf("arcmsr_action: XPT_PATH_INQ\n" );
1880 			#endif
1881 			cpi->version_num=1;
1882 			cpi->hba_inquiry=PI_SDTR_ABLE | PI_TAG_ABLE;
1883 			cpi->target_sprt=0;
1884 			cpi->hba_misc=0;
1885 			cpi->hba_eng_cnt=0;
1886 			cpi->max_target=ARCMSR_MAX_TARGETID;
1887 			cpi->max_lun=ARCMSR_MAX_TARGETLUN;	/* 7 or 0 */
1888 			cpi->initiator_id=ARCMSR_SCSI_INITIATOR_ID;
1889 			cpi->bus_id=cam_sim_bus(psim);
1890 			strncpy(cpi->sim_vid,"FreeBSD",SIM_IDLEN);
1891 			strncpy(cpi->hba_vid,"ARCMSR",HBA_IDLEN);
1892 			strncpy(cpi->dev_name,cam_sim_name(psim),DEV_IDLEN);
1893 			cpi->unit_number=cam_sim_unit(psim);
1894 			cpi->ccb_h.status=CAM_REQ_CMP;
1895 			xpt_done(pccb);
1896 			break;
1897 		}
1898 	case XPT_ABORT:
1899 		{
1900 			union ccb *pabort_ccb;
1901 
1902 			#if ARCMSR_DEBUG0
1903 			printf("arcmsr_action: XPT_ABORT\n" );
1904 			#endif
1905 			pabort_ccb=pccb->cab.abort_ccb;
1906 			switch (pabort_ccb->ccb_h.func_code)
1907 			{
1908 			case XPT_ACCEPT_TARGET_IO:
1909 			case XPT_IMMED_NOTIFY:
1910 			case XPT_CONT_TARGET_IO:
1911 				if(arcmsr_seek_cmd2abort(pabort_ccb)==TRUE)
1912 				{
1913 					pabort_ccb->ccb_h.status=CAM_REQ_ABORTED;
1914 					xpt_done(pabort_ccb);
1915 					pccb->ccb_h.status=CAM_REQ_CMP;
1916 				}
1917 				else
1918 				{
1919 					xpt_print_path(pabort_ccb->ccb_h.path);
1920 					printf("Not found\n");
1921 					pccb->ccb_h.status=CAM_PATH_INVALID;
1922 				}
1923 				break;
1924 			case XPT_SCSI_IO:
1925 				pccb->ccb_h.status=CAM_UA_ABORT;
1926 				break;
1927 			default:
1928 				pccb->ccb_h.status=CAM_REQ_INVALID;
1929 				break;
1930 			}
1931 			xpt_done(pccb);
1932 			break;
1933 		}
1934 	case XPT_RESET_BUS:
1935 	case XPT_RESET_DEV:
1936 		{
1937 			LONG     i;
1938 
1939 			#if ARCMSR_DEBUG0
1940 			printf("arcmsr_action: XPT_RESET_BUS\n" );
1941 			#endif
1942             arcmsr_bus_reset(pACB);
1943 			for (i=0; i < 500; i++)
1944 			{
1945 				DELAY(1000);
1946 			}
1947 			pccb->ccb_h.status=CAM_REQ_CMP;
1948 			xpt_done(pccb);
1949 			break;
1950 		}
1951 	case XPT_TERM_IO:
1952 		{
1953 			#if ARCMSR_DEBUG0
1954 			printf("arcmsr_action: XPT_TERM_IO\n" );
1955 			#endif
1956 			pccb->ccb_h.status=CAM_REQ_INVALID;
1957 			xpt_done(pccb);
1958 			break;
1959 		}
1960 	case XPT_GET_TRAN_SETTINGS:
1961 		{
1962 			struct ccb_trans_settings *cts;
1963 			ULONG s;
1964 
1965 			#if ARCMSR_DEBUG0
1966 			printf("arcmsr_action: XPT_GET_TRAN_SETTINGS\n" );
1967 			#endif
1968 
1969 			cts=&pccb->cts;
1970 			s=splcam();
1971 			cts->flags=(CCB_TRANS_DISC_ENB | CCB_TRANS_TAG_ENB);
1972 			cts->sync_period=3;
1973 			cts->sync_offset=32;
1974 			cts->bus_width=MSG_EXT_WDTR_BUS_16_BIT;
1975             cts->valid=CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID | CCB_TRANS_BUS_WIDTH_VALID | CCB_TRANS_DISC_VALID | CCB_TRANS_TQ_VALID;
1976 			splx(s);
1977 			pccb->ccb_h.status=CAM_REQ_CMP;
1978 			xpt_done(pccb);
1979 			break;
1980 		}
1981 	case XPT_SET_TRAN_SETTINGS:
1982 		{
1983 			#if ARCMSR_DEBUG0
1984 			printf("arcmsr_action: XPT_SET_TRAN_SETTINGS\n" );
1985 			#endif
1986 		    pccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
1987 		    xpt_done(pccb);
1988 			break;
1989 		}
1990 	case XPT_CALC_GEOMETRY:
1991 		{
1992 			struct ccb_calc_geometry *ccg;
1993 			ULONG size_mb;
1994 			ULONG secs_per_cylinder;
1995 
1996 			#if ARCMSR_DEBUG0
1997 			printf("arcmsr_action: XPT_CALC_GEOMETRY\n" );
1998 			#endif
1999 			ccg=&pccb->ccg;
2000 			size_mb=ccg->volume_size/((1024L * 1024L)/ccg->block_size);
2001 			if(size_mb > 1024 )
2002 			{
2003 				ccg->heads=255;
2004 				ccg->secs_per_track=63;
2005 			}
2006 			else
2007 			{
2008 				ccg->heads=64;
2009 				ccg->secs_per_track=32;
2010 			}
2011 			secs_per_cylinder=ccg->heads * ccg->secs_per_track;
2012 			ccg->cylinders=ccg->volume_size / secs_per_cylinder;
2013 			pccb->ccb_h.status=CAM_REQ_CMP;
2014 			xpt_done(pccb);
2015 			break;
2016 		}
2017 	default:
2018 		#if ARCMSR_DEBUG0
2019 			printf("arcmsr_action: invalid XPT function CAM_REQ_INVALID\n" );
2020 			#endif
2021     	pccb->ccb_h.status=CAM_REQ_INVALID;
2022 		xpt_done(pccb);
2023 		break;
2024 	}
2025 	return;
2026 }
2027 /*
2028 **********************************************************************
2029 **
2030 **  start background rebulid
2031 **
2032 **********************************************************************
2033 */
2034 VOID arcmsr_start_adapter_bgrb(PACB pACB)
2035 {
2036 	#if ARCMSR_DEBUG0
2037 	printf("arcmsr_start_adapter_bgrb.................................. \n");
2038 	#endif
2039 	pACB->acb_flags |= ACB_F_MSG_START_BGRB;
2040 	pACB->acb_flags &= ~ACB_F_MSG_STOP_BGRB;
2041     CHIP_REG_WRITE32(&pACB->pmu->inbound_msgaddr0,ARCMSR_INBOUND_MESG0_START_BGRB);
2042 	return;
2043 }
2044 /*
2045 **********************************************************************
2046 **
2047 **  start background rebulid
2048 **
2049 **********************************************************************
2050 */
2051 VOID arcmsr_iop_init(PACB pACB)
2052 {
2053     ULONG intmask_org,mask,outbound_doorbell,firmware_state=0;
2054 
2055 	#if ARCMSR_DEBUG0
2056 	printf("arcmsr_iop_init.................................. \n");
2057 	#endif
2058 	do
2059 	{
2060         firmware_state=CHIP_REG_READ32(&pACB->pmu->outbound_msgaddr1);
2061 	}while((firmware_state & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK)==0);
2062     /* disable all outbound interrupt */
2063     intmask_org=CHIP_REG_READ32(&pACB->pmu->outbound_intmask);
2064     CHIP_REG_WRITE32(&pACB->pmu->outbound_intmask,intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE);
2065 	/*start background rebuild*/
2066 	arcmsr_start_adapter_bgrb(pACB);
2067 	if(arcmsr_wait_msgint_ready(pACB)!=TRUE)
2068 	{
2069 		printf("arcmsr_HwInitialize: wait 'start adapter background rebulid' timeout................. \n");
2070 	}
2071 	/* clear Qbuffer if door bell ringed */
2072 	outbound_doorbell=CHIP_REG_READ32(&pACB->pmu->outbound_doorbell);
2073 	if(outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_WRITE_OK)
2074 	{
2075 		CHIP_REG_WRITE32(&pACB->pmu->outbound_doorbell,outbound_doorbell);/*clear interrupt */
2076         CHIP_REG_WRITE32(&pACB->pmu->inbound_doorbell,ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
2077 	}
2078 	/* enable outbound Post Queue,outbound message0,outbell doorbell Interrupt */
2079 	mask=~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE|ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE);
2080     CHIP_REG_WRITE32(&pACB->pmu->outbound_intmask,intmask_org & mask);
2081 	pACB->outbound_int_enable = ~(intmask_org & mask) & 0x000000ff;
2082 	pACB->acb_flags |=ACB_F_IOP_INITED;
2083 	return;
2084 }
2085 /*
2086 **********************************************************************
2087 **
2088 **  map freesrb
2089 **
2090 **********************************************************************
2091 */
2092 static void arcmsr_map_freesrb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
2093 {
2094 	PACB pACB=arg;
2095 	PSRB psrb_tmp,pfreesrb;
2096 	ULONG cdb_phyaddr;
2097 	LONG i;
2098 
2099     pfreesrb=(PSRB)pACB->uncacheptr;
2100 	cdb_phyaddr=segs->ds_addr; /* We suppose bus_addr_t high part always 0 here*/
2101 	if(((CPT2INT)pACB->uncacheptr & 0x1F)!=0)
2102 	{
2103 		pfreesrb=pfreesrb+(0x20-((CPT2INT)pfreesrb & 0x1F));
2104 		cdb_phyaddr=cdb_phyaddr+(0x20-((CPT2INT)cdb_phyaddr & 0x1F));
2105 	}
2106 	/*
2107 	********************************************************************
2108 	** here we need to tell iop 331 our freesrb.HighPart
2109 	** if freesrb.HighPart is not zero
2110 	********************************************************************
2111 	*/
2112 	for(i=0;i<ARCMSR_MAX_FREESRB_NUM;i++)
2113 	{
2114 		psrb_tmp=&pfreesrb[i];
2115 		if(((CPT2INT)psrb_tmp & 0x1F)==0) /*srb address must 32 (0x20) boundary*/
2116 		{
2117             if(bus_dmamap_create(pACB->buffer_dmat, /*flags*/0, &psrb_tmp->dmamap)!=0)
2118 			{
2119 				pACB->acb_flags |= ACB_F_MAPFREESRB_FAILD;
2120 			    printf(" arcmsr_map_freesrb: (pSRB->dmamap) bus_dmamap_create ..............error\n");
2121 			    return;
2122 			}
2123 			psrb_tmp->cdb_shifted_phyaddr=cdb_phyaddr >> 5;
2124             psrb_tmp->pACB=pACB;
2125 			pACB->psrbringQ[i]=psrb_tmp;
2126 			cdb_phyaddr=cdb_phyaddr+sizeof(struct _SRB);
2127  		}
2128 		else
2129 		{
2130 			pACB->acb_flags |= ACB_F_MAPFREESRB_FAILD;
2131 			printf(" arcmsr_map_freesrb:pfreesrb=%p i=%d this srb cross 32 bytes boundary ignored ......psrb_tmp=%p \n",pfreesrb,i,psrb_tmp);
2132 			return;
2133 		}
2134 	}
2135  	pACB->pfreesrb=pfreesrb;
2136 	pACB->vir2phy_offset=(CPT2INT)psrb_tmp-(cdb_phyaddr-sizeof(struct _SRB));
2137     return;
2138 }
2139 /*
2140 ************************************************************************
2141 **
2142 **
2143 ************************************************************************
2144 */
2145 VOID arcmsr_free_resource(PACB pACB)
2146 {
2147 	/* remove the control device */
2148 	if (pACB->ioctl_dev != NULL)
2149 	{
2150 		destroy_dev(pACB->ioctl_dev);
2151 	}
2152     bus_dmamap_unload(pACB->srb_dmat, pACB->srb_dmamap);
2153     bus_dmamap_destroy(pACB->srb_dmat, pACB->srb_dmamap);
2154     bus_dma_tag_destroy(pACB->srb_dmat);
2155 	bus_dma_tag_destroy(pACB->buffer_dmat);
2156 	bus_dma_tag_destroy(pACB->parent_dmat);
2157 	return;
2158 }
2159 /*
2160 ************************************************************************
2161 ** PCI config header registers for all devices
2162 **
2163 ** #define PCIR_COMMAND	        0x04
2164 ** #define PCIM_CMD_PORTEN		0x0001
2165 ** #define PCIM_CMD_MEMEN		0x0002
2166 ** #define PCIM_CMD_BUSMASTEREN	0x0004
2167 ** #define PCIM_CMD_MWRICEN	    0x0010
2168 ** #define PCIM_CMD_PERRESPEN	0x0040
2169 **
2170 ** Function      : arcmsr_initialize
2171 ** Purpose       : initialize the internal structures for a given SCSI host
2172 ** Inputs        : host - pointer to this host adapter's structure
2173 ** Preconditions : when this function is called,the chip_type
2174 **	               field of the pACB structure MUST have been set.
2175 **
2176 ** 10h Base Address register #0
2177 ** 14h Base Address register #1
2178 ** 18h Base Address register #2
2179 ** 1Ch Base Address register #3
2180 ** 20h Base Address register #4
2181 ** 24h Base Address register #5
2182 ************************************************************************
2183 */
2184 static LONG arcmsr_initialize(device_t dev)
2185 {
2186 	PACB pACB=device_get_softc(dev);
2187 	LONG rid=PCI_BASE_ADDR0;
2188 	vm_offset_t	mem_base;
2189 	USHORT pci_command;
2190 
2191 	#if ARCMSR_DEBUG0
2192 	printf("arcmsr_initialize..............................\n");
2193 	#endif
2194 #if __FreeBSD_version >= 502010
2195 	if (bus_dma_tag_create( /*parent*/NULL,
2196 		                    /*alignemnt*/1,
2197 				   			/*boundary*/0,
2198 			       			/*lowaddr*/BUS_SPACE_MAXADDR,
2199 			       			/*highaddr*/BUS_SPACE_MAXADDR,
2200 			       			/*filter*/NULL,
2201 							/*filterarg*/NULL,
2202 			       			/*maxsize*/BUS_SPACE_MAXSIZE_32BIT,
2203 			       			/*nsegments*/BUS_SPACE_UNRESTRICTED,
2204 			       			/*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT,
2205 			       			/*flags*/0,
2206 							/*lockfunc*/NULL,
2207 							/*lockarg*/NULL,
2208 							&pACB->parent_dmat) != 0)
2209 #else
2210 	if (bus_dma_tag_create( /*parent*/NULL,
2211 		                    /*alignemnt*/1,
2212 				   			/*boundary*/0,
2213 			       			/*lowaddr*/BUS_SPACE_MAXADDR,
2214 			       			/*highaddr*/BUS_SPACE_MAXADDR,
2215 			       			/*filter*/NULL,
2216 							/*filterarg*/NULL,
2217 			       			/*maxsize*/BUS_SPACE_MAXSIZE_32BIT,
2218 			       			/*nsegments*/BUS_SPACE_UNRESTRICTED,
2219 			       			/*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT,
2220 			       			/*flags*/0,
2221 							&pACB->parent_dmat) != 0)
2222 #endif
2223 	{
2224 		printf("arcmsr_initialize: bus_dma_tag_create .......................failure!\n");
2225 		return ENOMEM;
2226 	}
2227     /* Create a single tag describing a region large enough to hold all of the s/g lists we will need. */
2228 #if __FreeBSD_version >= 502010
2229 	if(bus_dma_tag_create( /*parent_dmat*/pACB->parent_dmat,
2230 		                   /*alignment*/1,
2231 			               /*boundary*/0,
2232 			               /*lowaddr*/BUS_SPACE_MAXADDR,
2233 			               /*highaddr*/BUS_SPACE_MAXADDR,
2234 			               /*filter*/NULL,
2235 						   /*filterarg*/NULL,
2236 			               /*maxsize*/MAXBSIZE,
2237 						   /*nsegments*/ARCMSR_MAX_SG_ENTRIES,
2238 			               /*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT,
2239 			               /*flags*/BUS_DMA_ALLOCNOW,
2240 						   /*lockfunc*/busdma_lock_mutex,
2241 						   /*lockarg*/&Giant,
2242 			               &pACB->buffer_dmat) != 0)
2243 #else
2244 	if(bus_dma_tag_create( /*parent_dmat*/pACB->parent_dmat,
2245 		                   /*alignment*/1,
2246 			               /*boundary*/0,
2247 			               /*lowaddr*/BUS_SPACE_MAXADDR,
2248 			               /*highaddr*/BUS_SPACE_MAXADDR,
2249 			               /*filter*/NULL,
2250 						   /*filterarg*/NULL,
2251 			               /*maxsize*/MAXBSIZE,
2252 						   /*nsegments*/ARCMSR_MAX_SG_ENTRIES,
2253 			               /*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT,
2254 			               /*flags*/BUS_DMA_ALLOCNOW,
2255 			               &pACB->buffer_dmat) != 0)
2256 #endif
2257 	{
2258 		bus_dma_tag_destroy(pACB->parent_dmat);
2259 		printf("arcmsr_initialize: bus_dma_tag_create ............................failure!\n");
2260 		return ENOMEM;
2261     }
2262 	/* DMA tag for our srb structures.... Allocate the pfreesrb memory */
2263 #if __FreeBSD_version >= 502010
2264 	if (bus_dma_tag_create( /*parent_dmat*/pACB->parent_dmat,
2265 		                    /*alignment*/1,
2266 		                    /*boundary*/0,
2267 			       			/*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
2268 			       			/*highaddr*/BUS_SPACE_MAXADDR,
2269 			       			/*filter*/NULL,
2270 				   			/*filterarg*/NULL,
2271 			       			/*maxsize*/((sizeof(struct _SRB) * ARCMSR_MAX_FREESRB_NUM)+0x20),
2272 			       			/*nsegments*/1,
2273 			       			/*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT,
2274 			       			/*flags*/0,
2275 							/*lockfunc*/NULL,
2276 							/*lockarg*/NULL,
2277 							&pACB->srb_dmat) != 0)
2278 #else
2279 	if (bus_dma_tag_create( /*parent_dmat*/pACB->parent_dmat,
2280 		                    /*alignment*/1,
2281 		                    /*boundary*/0,
2282 			       			/*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
2283 			       			/*highaddr*/BUS_SPACE_MAXADDR,
2284 			       			/*filter*/NULL,
2285 				   			/*filterarg*/NULL,
2286 			       			/*maxsize*/((sizeof(struct _SRB) * ARCMSR_MAX_FREESRB_NUM)+0x20),
2287 			       			/*nsegments*/1,
2288 			       			/*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT,
2289 			       			/*flags*/0,
2290 							&pACB->srb_dmat) != 0)
2291 #endif
2292 	{
2293 		bus_dma_tag_destroy(pACB->buffer_dmat);
2294 		bus_dma_tag_destroy(pACB->parent_dmat);
2295 		printf("arcmsr_initialize: pACB->srb_dmat bus_dma_tag_create .....................failure!\n");
2296 		return ENXIO;
2297     }
2298 	/* Allocation for our srbs */
2299 	if (bus_dmamem_alloc(pACB->srb_dmat, (void **)&pACB->uncacheptr, BUS_DMA_WAITOK | BUS_DMA_COHERENT, &pACB->srb_dmamap) != 0)
2300 	{
2301         bus_dma_tag_destroy(pACB->srb_dmat);
2302 		bus_dma_tag_destroy(pACB->buffer_dmat);
2303 		bus_dma_tag_destroy(pACB->parent_dmat);
2304 		printf("arcmsr_initialize: pACB->srb_dmat bus_dma_tag_create ...............failure!\n");
2305 		return ENXIO;
2306 	}
2307 	/* And permanently map them */
2308 	if(bus_dmamap_load(pACB->srb_dmat, pACB->srb_dmamap,pACB->uncacheptr,(sizeof(struct _SRB) * ARCMSR_MAX_FREESRB_NUM)+0x20,arcmsr_map_freesrb, pACB, /*flags*/0))
2309 	{
2310         bus_dma_tag_destroy(pACB->srb_dmat);
2311 		bus_dma_tag_destroy(pACB->buffer_dmat);
2312 		bus_dma_tag_destroy(pACB->parent_dmat);
2313 		printf("arcmsr_initialize: bus_dmamap_load................... failure!\n");
2314 		return ENXIO;
2315 	}
2316 	pci_command=pci_read_config(dev,PCIR_COMMAND,2);
2317 	pci_command |= PCIM_CMD_BUSMASTEREN;
2318 	pci_command |= PCIM_CMD_PERRESPEN;
2319 	pci_command |= PCIM_CMD_MWRICEN;
2320 	/* Enable Busmaster/Mem */
2321 	pci_command |= PCIM_CMD_MEMEN;
2322 	pci_write_config(dev,PCIR_COMMAND,pci_command,2);
2323 	pACB->sys_res_arcmsr=bus_alloc_resource(dev,SYS_RES_MEMORY,&rid,0,~0,0x1000,RF_ACTIVE);
2324 	if(pACB->sys_res_arcmsr == NULL)
2325 	{
2326 		arcmsr_free_resource(pACB);
2327 		printf("arcmsr_initialize: bus_alloc_resource .....................failure!\n");
2328 		return ENOMEM;
2329 	}
2330 	if(rman_get_start(pACB->sys_res_arcmsr) <= 0)
2331 	{
2332 		arcmsr_free_resource(pACB);
2333 		printf("arcmsr_initialize: rman_get_start ...........................failure!\n");
2334         return ENXIO;
2335 	}
2336 	mem_base=(vm_offset_t) rman_get_virtual(pACB->sys_res_arcmsr);
2337 	if(mem_base==0)
2338 	{
2339 		arcmsr_free_resource(pACB);
2340 		printf("arcmsr_initialize: rman_get_virtual ..........................failure!\n");
2341 		return ENXIO;
2342 	}
2343 	if(pACB->acb_flags &  ACB_F_MAPFREESRB_FAILD)
2344 	{
2345 		arcmsr_free_resource(pACB);
2346 		printf("arcmsr_initialize: arman_get_virtual ..........................failure!\n");
2347 		return ENXIO;
2348 	}
2349 	pACB->btag=rman_get_bustag(pACB->sys_res_arcmsr);
2350 	pACB->bhandle=rman_get_bushandle(pACB->sys_res_arcmsr);
2351     pACB->pmu=(PMU)mem_base;
2352     pACB->acb_flags |= (ACB_F_IOCTL_WQBUFFER_CLEARED|ACB_F_IOCTL_RQBUFFER_CLEARED);
2353 	pACB->acb_flags &= ~ACB_F_SCSISTOPADAPTER;
2354 	arcmsr_iop_init(pACB);
2355     return(0);
2356 }
2357 /*
2358 ************************************************************************
2359 **
2360 **        attach and init a host adapter
2361 **
2362 ************************************************************************
2363 */
2364 static LONG arcmsr_attach(device_t dev)
2365 {
2366 	PACB pACB=device_get_softc(dev);
2367 	LONG unit=device_get_unit(dev);
2368 	struct ccb_setasync csa;
2369 	struct cam_devq	*devq;	/* Device Queue to use for this SIM */
2370 	struct resource	*irqres;
2371 	int	rid;
2372 
2373     #if ARCMSR_DEBUG0
2374     printf("arcmsr_attach .............................\n" );
2375     #endif
2376 
2377 	if(arcmsr_initialize(dev))
2378 	{
2379 		printf("arcmsr_attach: arcmsr_initialize failure!\n");
2380 		return ENXIO;
2381 	}
2382 	/* After setting up the adapter,map our interrupt */
2383 	rid=0;
2384 	irqres=bus_alloc_resource(dev,SYS_RES_IRQ,&rid,0,~0,1,RF_SHAREABLE | RF_ACTIVE);
2385 	if(irqres == NULL || bus_setup_intr(dev,irqres,INTR_TYPE_CAM,arcmsr_interrupt,pACB,&pACB->ih))
2386 	{
2387 		arcmsr_free_resource(pACB);
2388 		printf("arcmsr%d: unable to register interrupt handler!\n",unit);
2389 		return ENXIO;
2390 	}
2391 	pACB->irqres=irqres;
2392 	pACB->pci_dev=dev;
2393 	pACB->pci_unit=unit;
2394 	/*
2395 	 * Now let the CAM generic SCSI layer find the SCSI devices on
2396 	 * the bus *  start queue to reset to the idle loop. *
2397 	 * Create device queue of SIM(s) *  (MAX_START_JOB - 1) :
2398 	 * max_sim_transactions
2399 	*/
2400 	devq=cam_simq_alloc(ARCMSR_MAX_START_JOB);
2401 	if(devq == NULL)
2402 	{
2403 	    arcmsr_free_resource(pACB);
2404 		bus_release_resource(dev, SYS_RES_IRQ, 0, pACB->irqres);
2405 		printf("arcmsr_attach: cam_simq_alloc failure!\n");
2406 		return ENXIO;
2407 	}
2408 	pACB->psim=cam_sim_alloc(arcmsr_action,arcmsr_poll,"arcmsr",pACB,pACB->pci_unit,1,ARCMSR_MAX_OUTSTANDING_CMD,devq);
2409 	if(pACB->psim == NULL)
2410 	{
2411 		arcmsr_free_resource(pACB);
2412 		bus_release_resource(dev, SYS_RES_IRQ, 0, pACB->irqres);
2413 		cam_simq_free(devq);
2414 		printf("arcmsr_attach: cam_sim_alloc ..................failure!\n");
2415 		return ENXIO;
2416 	}
2417 	if(xpt_bus_register(pACB->psim,0) != CAM_SUCCESS)
2418 	{
2419 		arcmsr_free_resource(pACB);
2420 		bus_release_resource(dev, SYS_RES_IRQ, 0, pACB->irqres);
2421 		cam_sim_free(pACB->psim,/*free_devq*/TRUE);
2422 		printf("arcmsr_attach: xpt_bus_register .......................failure!\n");
2423 		return ENXIO;
2424 	}
2425  	if(xpt_create_path(&pACB->ppath,/* periph */ NULL,cam_sim_path(pACB->psim),CAM_TARGET_WILDCARD,CAM_LUN_WILDCARD) != CAM_REQ_CMP)
2426 	{
2427 		arcmsr_free_resource(pACB);
2428 		bus_release_resource(dev, SYS_RES_IRQ, 0, pACB->irqres);
2429 		xpt_bus_deregister(cam_sim_path(pACB->psim));
2430 		cam_sim_free(pACB->psim,/* free_simq */ TRUE);
2431 		printf("arcmsr_attach: xpt_create_path .....................failure!\n");
2432 		return ENXIO;
2433 	}
2434     /*
2435 	****************************************************
2436 	*/
2437  	xpt_setup_ccb(&csa.ccb_h,pACB->ppath,/*priority*/5);
2438 	csa.ccb_h.func_code=XPT_SASYNC_CB;
2439 	csa.event_enable=AC_FOUND_DEVICE|AC_LOST_DEVICE;
2440 	csa.callback=arcmsr_async;
2441 	csa.callback_arg=pACB->psim;
2442 	xpt_action((union ccb *)&csa);
2443     /* Create the control device.  */
2444     pACB->ioctl_dev=make_dev(&arcmsr_cdevsw, unit, UID_ROOT, GID_WHEEL /* GID_OPERATOR */, S_IRUSR | S_IWUSR, "arcmsr%d", unit);
2445 #if __FreeBSD_version < 503000
2446 	pACB->ioctl_dev->si_drv1=pACB;
2447 #endif
2448 #if __FreeBSD_version > 500005
2449 	(void)make_dev_alias(pACB->ioctl_dev, "arc%d", unit);
2450 #endif
2451 
2452 #if 0
2453 	#if __FreeBSD_version > 500005
2454 		if(kthread_create(arcmsr_do_thread_works, pACB, &pACB->kthread_proc,0,"arcmsr%d: kthread",pACB->pci_unit))
2455 		{
2456 			device_printf(pACB->pci_dev,"cannot create kernel thread for this host adapetr\n");
2457 			xpt_bus_deregister(cam_sim_path(pACB->psim));
2458 			cam_sim_free(pACB->psim,/* free_simq */ TRUE);
2459 			panic("arcmsr plunge kernel thread fail");
2460 		}
2461 	#else
2462 		if(kthread_create(arcmsr_do_thread_works, pACB, &pACB->kthread_proc,"arcmsr%d: kthread", pACB->pci_unit))
2463 		{
2464 			device_printf(pACB->pci_dev,"cannot create kernel thread for this host adapetr\n");
2465 			xpt_bus_deregister(cam_sim_path(pACB->psim));
2466 			cam_sim_free(pACB->psim,/* free_simq */ TRUE);
2467 			panic("arcmsr plunge kernel thread fail");
2468 		}
2469 	#endif
2470 #endif
2471  	return 0;
2472 }
2473 /*
2474 ************************************************************************
2475 **
2476 **
2477 **
2478 ************************************************************************
2479 */
2480 static LONG arcmsr_probe(device_t dev)
2481 {
2482 	ULONG id;
2483 	#if ARCMSR_DEBUG0
2484 	printf("arcmsr_probe................. \n");
2485 	#endif
2486     switch(id=pci_get_devid(dev))
2487 	{
2488 	case PCIDevVenIDARC1110:
2489 		device_set_desc(dev,"ARECA ARC1110 PCI-X 4 PORTS SATA RAID CONTROLLER \n" ARCMSR_DRIVER_VERSION );
2490 	    return 0;
2491     case PCIDevVenIDARC1120:
2492 		device_set_desc(dev,"ARECA ARC1120 PCI-X 8 PORTS SATA RAID CONTROLLER (RAID6-ENGINE Inside) \n" ARCMSR_DRIVER_VERSION);
2493 		return 0;
2494     case PCIDevVenIDARC1130:
2495 		device_set_desc(dev,"ARECA ARC1130 PCI-X 12 PORTS SATA RAID CONTROLLER (RAID6-ENGINE Inside) \n" ARCMSR_DRIVER_VERSION);
2496 		return 0;
2497     case PCIDevVenIDARC1160:
2498 		device_set_desc(dev,"ARECA ARC1160 PCI-X 16 PORTS SATA RAID CONTROLLER (RAID6-ENGINE Inside) \n" ARCMSR_DRIVER_VERSION);
2499 		return 0;
2500     case PCIDevVenIDARC1210:
2501 		device_set_desc(dev,"ARECA ARC1210 PCI-EXPRESS 4 PORTS SATA RAID CONTROLLER \n" ARCMSR_DRIVER_VERSION);
2502 		return 0;
2503     case PCIDevVenIDARC1220:
2504 		device_set_desc(dev,"ARECA ARC1220 PCI-EXPRESS 8 PORTS SATA RAID CONTROLLER (RAID6-ENGINE Inside) \n" ARCMSR_DRIVER_VERSION);
2505 		return 0;
2506    case PCIDevVenIDARC1230:
2507 		device_set_desc(dev,"ARECA ARC1230 PCI-EXPRESS 12 PORTS SATA RAID CONTROLLER (RAID6-ENGINE Inside) \n" ARCMSR_DRIVER_VERSION);
2508 		return 0;
2509     case PCIDevVenIDARC1260:
2510 		device_set_desc(dev,"ARECA ARC1260 PCI-EXPRESS 16 PORTS SATA RAID CONTROLLER (RAID6-ENGINE Inside) \n" ARCMSR_DRIVER_VERSION);
2511 		return 0;
2512 	}
2513 	return ENXIO;
2514 }
2515 /*
2516 ************************************************************************
2517 **
2518 **
2519 **
2520 ************************************************************************
2521 */
2522 static VOID arcmsr_shutdown(device_t dev)
2523 {
2524 	LONG  i,abort_cmd_cnt=0;
2525 	ULONG s,intmask_org;
2526 	PSRB pSRB;
2527     PACB pACB=device_get_softc(dev);
2528 
2529 	#if ARCMSR_DEBUG0
2530 	printf("arcmsr_shutdown................. \n");
2531 	#endif
2532 	s=splcam();
2533     /* disable all outbound interrupt */
2534     intmask_org=CHIP_REG_READ32(&pACB->pmu->outbound_intmask);
2535     CHIP_REG_WRITE32(&pACB->pmu->outbound_intmask,(intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE));
2536 	/* stop adapter background rebuild */
2537 	arcmsr_stop_adapter_bgrb(pACB);
2538 	if(arcmsr_wait_msgint_ready(pACB)!=TRUE)
2539 	{
2540 		printf("arcmsr_pcidev_disattach: wait 'stop adapter rebulid' timeout.... \n");
2541 	}
2542 	arcmsr_flush_adapter_cache(pACB);
2543 	if(arcmsr_wait_msgint_ready(pACB)!=TRUE)
2544 	{
2545 		printf("arcmsr_pcidev_disattach: wait 'flush adapter cache' timeout.... \n");
2546 	}
2547 	/* abort all outstanding command */
2548 	pACB->acb_flags |= ACB_F_SCSISTOPADAPTER;
2549 	pACB->acb_flags &= ~ACB_F_IOP_INITED;
2550 	if(pACB->srboutstandingcount!=0)
2551 	{
2552 		PSRB pfreesrb;
2553 	#if ARCMSR_DEBUG0
2554 	printf("arcmsr_pcidev_disattach: .....pACB->srboutstandingcount!=0 \n");
2555     #endif
2556 		/* Q back all outstanding srb into wait exec psrb Q*/
2557         pfreesrb=pACB->pfreesrb;
2558 		for(i=0;i<ARCMSR_MAX_FREESRB_NUM;i++)
2559 		{
2560 	    	pSRB=&pfreesrb[i];
2561 			if(pSRB->startdone==ARCMSR_SRB_START)
2562 			{
2563 				pSRB->srb_flags|=SRB_FLAG_MASTER_ABORTED;
2564 				pSRB->pccb->ccb_h.status=CAM_REQ_ABORTED;
2565 				abort_cmd_cnt++;
2566 			}
2567 		}
2568 		if(abort_cmd_cnt!=0)
2569 		{
2570 	#if ARCMSR_DEBUG0
2571 	printf("arcmsr_pcidev_disattach: .....abort_cmd_cnt!=0 \n");
2572     #endif
2573 			arcmsr_abort_allcmd(pACB);
2574 			if(arcmsr_wait_msgint_ready(pACB)!=TRUE)
2575 			{
2576 				printf("arcmsr_pcidev_disattach: wait 'abort all outstanding command' timeout.................in \n");
2577 			}
2578 		}
2579 		atomic_set_int(&pACB->srboutstandingcount,0);
2580  	}
2581 	if(pACB->srbwait2gocount!=0)
2582 	{	/*remove first wait2go srb and abort it*/
2583 		for(i=0;i<ARCMSR_MAX_OUTSTANDING_CMD;i++)
2584 		{
2585 			pSRB=pACB->psrbwait2go[i];
2586 			if(pSRB!=NULL)
2587 			{
2588 				pACB->psrbwait2go[i]=NULL;
2589 				atomic_subtract_int(&pACB->srbwait2gocount,1);
2590 				pSRB->pccb->ccb_h.status=CAM_REQ_ABORTED;
2591 				arcmsr_srb_complete(pSRB);
2592 			}
2593 		}
2594 	}
2595 	splx(s);
2596 #if 0
2597 	pACB->acb_flags |= ACB_F_STOP_THREAD;
2598 	wakeup(pACB->kthread_proc);/* signal to kernel thread do_dpcQ: "stop thread" */
2599 #endif
2600     return;
2601 }
2602 /*
2603 ************************************************************************
2604 **
2605 **
2606 **
2607 ************************************************************************
2608 */
2609 static LONG arcmsr_detach(device_t dev)
2610 {
2611 	PACB pACB=device_get_softc(dev);
2612 
2613 	arcmsr_shutdown(dev);
2614 	arcmsr_free_resource(pACB);
2615 	bus_release_resource(dev, SYS_RES_MEMORY, PCI_BASE_ADDR0, pACB->sys_res_arcmsr);
2616 	bus_teardown_intr(dev, pACB->irqres, pACB->ih);
2617 	bus_release_resource(dev, SYS_RES_IRQ, 0, pACB->irqres);
2618 	xpt_async(AC_LOST_DEVICE, pACB->ppath, NULL);
2619 	xpt_free_path(pACB->ppath);
2620 	xpt_bus_deregister(cam_sim_path(pACB->psim));
2621 	cam_sim_free(pACB->psim, TRUE);
2622 	return (0);
2623 }
2624 
2625 
2626 
2627