xref: /dflybsd-src/sys/dev/raid/arcmsr/arcmsr.c (revision dcd5dd2ef4ecd2f3a28a1e860d8852ce68a991ac)
1 /*
2 *****************************************************************************************
3 **        O.S   : FreeBSD
4 **   FILE NAME  : arcmsr.c
5 **        BY    : Erich Chen, Ching Huang
6 **   Description: SCSI RAID Device Driver for
7 **                ARECA (ARC11XX/ARC12XX/ARC13XX/ARC16XX/ARC188x) SATA/SAS RAID HOST Adapter
8 **                ARCMSR RAID Host adapter
9 **                [RAID controller:INTEL 331(PCI-X) 341(PCI-EXPRESS) chip set]
10 ******************************************************************************************
11 ************************************************************************
12 **
13 ** Copyright (c) 2004-2010 ARECA Co. Ltd.
14 **        Erich Chen, Taipei Taiwan All rights reserved.
15 **
16 ** Redistribution and use in source and binary forms, with or without
17 ** modification, are permitted provided that the following conditions
18 ** are met:
19 ** 1. Redistributions of source code must retain the above copyright
20 **    notice, this list of conditions and the following disclaimer.
21 ** 2. Redistributions in binary form must reproduce the above copyright
22 **    notice, this list of conditions and the following disclaimer in the
23 **    documentation and/or other materials provided with the distribution.
24 ** 3. The name of the author may not be used to endorse or promote products
25 **    derived from this software without specific prior written permission.
26 **
27 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
28 ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
29 ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
30 ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
31 ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT
32 ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION)HOWEVER CAUSED AND ON ANY
34 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 **(INCLUDING NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF
36 ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 **************************************************************************
38 ** History
39 **
40 **        REV#         DATE	            NAME	         DESCRIPTION
41 **     1.00.00.00    3/31/2004	       Erich Chen	 First release
42 **     1.20.00.02   11/29/2004         Erich Chen        bug fix with arcmsr_bus_reset when PHY error
43 **     1.20.00.03    4/19/2005         Erich Chen        add SATA 24 Ports adapter type support
44 **                                                       clean unused function
45 **     1.20.00.12    9/12/2005         Erich Chen        bug fix with abort command handling,
46 **                                                       firmware version check
47 **                                                       and firmware update notify for hardware bug fix
48 **                                                       handling if none zero high part physical address
49 **                                                       of srb resource
50 **     1.20.00.13    8/18/2006         Erich Chen        remove pending srb and report busy
51 **                                                       add iop message xfer
52 **                                                       with scsi pass-through command
53 **                                                       add new device id of sas raid adapters
54 **                                                       code fit for SPARC64 & PPC
55 **     1.20.00.14   02/05/2007         Erich Chen        bug fix for incorrect ccb_h.status report
56 **                                                       and cause g_vfs_done() read write error
57 **     1.20.00.15   10/10/2007         Erich Chen        support new RAID adapter type ARC120x
58 **     1.20.00.16   10/10/2009         Erich Chen        Bug fix for RAID adapter type ARC120x
59 **                                                       bus_dmamem_alloc() with BUS_DMA_ZERO
60 **     1.20.00.17   07/15/2010         Ching Huang       Added support ARC1880
61 **							 report CAM_DEV_NOT_THERE instead of CAM_SEL_TIMEOUT when device failed,
62 **							 prevent cam_periph_error removing all LUN devices of one Target id
63 **							 for any one LUN device failed
64 **     1.20.00.18   10/14/2010         Ching Huang	 Fixed "inquiry data fails comparion at DV1 step"
65 **	   	    10/25/2010         Ching Huang	 Fixed bad range input in bus_alloc_resource for ADAPTER_TYPE_B
66 **     1.20.00.19   11/11/2010         Ching Huang	 Fixed arcmsr driver prevent arcsas support for Areca SAS HBA ARC13x0
67 ******************************************************************************************
68 * $FreeBSD: src/sys/dev/arcmsr/arcmsr.c,v 1.35 2010/11/13 08:58:36 delphij Exp $
69 */
70 #include <sys/param.h>
71 #include <sys/systm.h>
72 #include <sys/malloc.h>
73 #include <sys/kernel.h>
74 #include <sys/bus.h>
75 #include <sys/queue.h>
76 #include <sys/stat.h>
77 #include <sys/devicestat.h>
78 #include <sys/kthread.h>
79 #include <sys/module.h>
80 #include <sys/proc.h>
81 #include <sys/lock.h>
82 #include <sys/sysctl.h>
83 #include <sys/thread2.h>
84 #include <sys/poll.h>
85 #include <sys/device.h>
86 #include <vm/vm.h>
87 #include <vm/vm_param.h>
88 #include <vm/pmap.h>
89 
90 #include <machine/atomic.h>
91 #include <sys/conf.h>
92 #include <sys/rman.h>
93 
94 #include <bus/cam/cam.h>
95 #include <bus/cam/cam_ccb.h>
96 #include <bus/cam/cam_sim.h>
97 #include <bus/cam/cam_periph.h>
98 #include <bus/cam/cam_xpt_periph.h>
99 #include <bus/cam/cam_xpt_sim.h>
100 #include <bus/cam/cam_debug.h>
101 #include <bus/cam/scsi/scsi_all.h>
102 #include <bus/cam/scsi/scsi_message.h>
103 /*
104 **************************************************************************
105 **************************************************************************
106 */
107 #include <sys/endian.h>
108 #include <bus/pci/pcivar.h>
109 #include <bus/pci/pcireg.h>
110 #define ARCMSR_LOCK_INIT(l, s)	lockinit(l, s, 0, LK_CANRECURSE)
111 #define ARCMSR_LOCK_DESTROY(l)	lockuninit(l)
112 #define ARCMSR_LOCK_ACQUIRE(l)	lockmgr(l, LK_EXCLUSIVE)
113 #define ARCMSR_LOCK_RELEASE(l)	lockmgr(l, LK_RELEASE)
114 #define ARCMSR_LOCK_TRY(l)	lockmgr(&l, LK_EXCLUSIVE|LK_NOWAIT);
115 #define arcmsr_htole32(x)	htole32(x)
116 typedef struct lock		arcmsr_lock_t;
117 
118 #if !defined(CAM_NEW_TRAN_CODE)
119 #define	CAM_NEW_TRAN_CODE	1
120 #endif
121 
122 #define ARCMSR_DRIVER_VERSION			"Driver Version 1.20.00.19 2010-11-11"
123 #include <dev/raid/arcmsr/arcmsr.h>
124 #define ARCMSR_SRBS_POOL_SIZE           ((sizeof(struct CommandControlBlock) * ARCMSR_MAX_FREESRB_NUM))
125 /*
126 **************************************************************************
127 **************************************************************************
128 */
129 #define CHIP_REG_READ32(s, b, r)	bus_space_read_4(acb->btag[b], acb->bhandle[b], offsetof(struct s, r))
130 #define CHIP_REG_WRITE32(s, b, r, d)	bus_space_write_4(acb->btag[b], acb->bhandle[b], offsetof(struct s, r), d)
131 /*
132 **************************************************************************
133 **************************************************************************
134 */
135 static struct CommandControlBlock * arcmsr_get_freesrb(struct AdapterControlBlock *acb);
136 static u_int8_t arcmsr_seek_cmd2abort(union ccb * abortccb);
137 static int arcmsr_probe(device_t dev);
138 static int arcmsr_attach(device_t dev);
139 static int arcmsr_detach(device_t dev);
140 static u_int32_t arcmsr_iop_ioctlcmd(struct AdapterControlBlock *acb, u_int32_t ioctl_cmd, caddr_t arg);
141 static void arcmsr_iop_parking(struct AdapterControlBlock *acb);
142 static int arcmsr_shutdown(device_t dev);
143 static void arcmsr_interrupt(struct AdapterControlBlock *acb);
144 static void arcmsr_polling_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb);
145 static void arcmsr_free_resource(struct AdapterControlBlock *acb);
146 static void arcmsr_bus_reset(struct AdapterControlBlock *acb);
147 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb);
148 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb);
149 static void arcmsr_iop_init(struct AdapterControlBlock *acb);
150 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb);
151 static void arcmsr_post_ioctldata2iop(struct AdapterControlBlock *acb);
152 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb);
153 static void arcmsr_srb_complete(struct CommandControlBlock *srb, int stand_flag);
154 static void arcmsr_iop_reset(struct AdapterControlBlock *acb);
155 static void arcmsr_report_sense_info(struct CommandControlBlock *srb);
156 static void arcmsr_build_srb(struct CommandControlBlock *srb, bus_dma_segment_t * dm_segs, u_int32_t nseg);
157 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb * pccb);
158 static int arcmsr_resume(device_t dev);
159 static int arcmsr_suspend(device_t dev);
160 static void arcmsr_rescanLun_cb(struct cam_periph *periph, union ccb *ccb);
161 static void	arcmsr_polling_devmap(void* arg);
162 /*
163 **************************************************************************
164 **************************************************************************
165 */
166 static void UDELAY(u_int32_t us) { DELAY(us); }
167 /*
168 **************************************************************************
169 **************************************************************************
170 */
171 static bus_dmamap_callback_t arcmsr_map_free_srb;
172 static bus_dmamap_callback_t arcmsr_execute_srb;
173 /*
174 **************************************************************************
175 **************************************************************************
176 */
177 static d_open_t	arcmsr_open;
178 static d_close_t arcmsr_close;
179 static d_ioctl_t arcmsr_ioctl;
180 
181 static device_method_t arcmsr_methods[]={
182 	DEVMETHOD(device_probe,		arcmsr_probe),
183 	DEVMETHOD(device_attach,	arcmsr_attach),
184 	DEVMETHOD(device_detach,	arcmsr_detach),
185 	DEVMETHOD(device_shutdown,	arcmsr_shutdown),
186 	DEVMETHOD(device_suspend,	arcmsr_suspend),
187 	DEVMETHOD(device_resume,	arcmsr_resume),
188 	DEVMETHOD(bus_print_child,	bus_generic_print_child),
189 	DEVMETHOD(bus_driver_added,	bus_generic_driver_added),
190 	{ 0, 0 }
191 };
192 
193 static driver_t arcmsr_driver={
194 	"arcmsr", arcmsr_methods, sizeof(struct AdapterControlBlock)
195 };
196 
197 static devclass_t arcmsr_devclass;
198 DRIVER_MODULE(arcmsr, pci, arcmsr_driver, arcmsr_devclass, NULL, NULL);
199 MODULE_VERSION(arcmsr, 1);
200 MODULE_DEPEND(arcmsr, pci, 1, 1, 1);
201 MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
202 #ifndef BUS_DMA_COHERENT
203 	#define	BUS_DMA_COHERENT	0x04	/* hint: map memory in a coherent way */
204 #endif
205 
206 static struct dev_ops arcmsr_ops = {
207 	{ "arcmsr", 0, 0 },
208 	.d_open =	arcmsr_open,		        /* open     */
209 	.d_close =	arcmsr_close,		        /* close    */
210 	.d_ioctl =	arcmsr_ioctl,		        /* ioctl    */
211 };
212 
213 static int	arcmsr_msi_enable = 1;
214 TUNABLE_INT("hw.arcmsr.msi.enable", &arcmsr_msi_enable);
215 
216 
217 /*
218 **************************************************************************
219 **************************************************************************
220 */
221 
222 static int
223 arcmsr_open(struct dev_open_args *ap)
224 {
225 	cdev_t dev = ap->a_head.a_dev;
226 	struct AdapterControlBlock *acb=dev->si_drv1;
227 
228 	if(acb==NULL) {
229 		return ENXIO;
230 	}
231 	return 0;
232 }
233 
234 /*
235 **************************************************************************
236 **************************************************************************
237 */
238 
239 static int
240 arcmsr_close(struct dev_close_args *ap)
241 {
242 	cdev_t dev = ap->a_head.a_dev;
243 	struct AdapterControlBlock *acb=dev->si_drv1;
244 
245 	if(acb==NULL) {
246 		return ENXIO;
247 	}
248 	return 0;
249 }
250 
251 /*
252 **************************************************************************
253 **************************************************************************
254 */
255 
256 static int
257 arcmsr_ioctl(struct dev_ioctl_args *ap)
258 {
259 	cdev_t dev = ap->a_head.a_dev;
260 	u_long ioctl_cmd = ap->a_cmd;
261 	caddr_t arg = ap->a_data;
262 	struct AdapterControlBlock *acb=dev->si_drv1;
263 
264 	if(acb==NULL) {
265 		return ENXIO;
266 	}
267 	return(arcmsr_iop_ioctlcmd(acb, ioctl_cmd, arg));
268 }
269 
270 /*
271 **********************************************************************
272 **********************************************************************
273 */
274 static u_int32_t arcmsr_disable_allintr( struct AdapterControlBlock *acb)
275 {
276 	u_int32_t intmask_org=0;
277 
278 	switch (acb->adapter_type) {
279 	case ACB_ADAPTER_TYPE_A: {
280 			/* disable all outbound interrupt */
281 			intmask_org=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intmask); /* disable outbound message0 int */
282 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intmask, intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE);
283 		}
284 		break;
285 	case ACB_ADAPTER_TYPE_B: {
286 			/* disable all outbound interrupt */
287 			intmask_org=CHIP_REG_READ32(HBB_DOORBELL,
288 			0, iop2drv_doorbell_mask) & (~ARCMSR_IOP2DRV_MESSAGE_CMD_DONE); /* disable outbound message0 int */
289 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell_mask, 0); /* disable all interrupt */
290 		}
291 		break;
292 	case ACB_ADAPTER_TYPE_C: {
293 			/* disable all outbound interrupt */
294 			intmask_org=CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_mask)	; /* disable outbound message0 int */
295 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE);
296 		}
297 		break;
298 	}
299 	return(intmask_org);
300 }
301 /*
302 **********************************************************************
303 **********************************************************************
304 */
305 static void arcmsr_enable_allintr( struct AdapterControlBlock *acb, u_int32_t intmask_org)
306 {
307 	u_int32_t mask;
308 
309 	switch (acb->adapter_type) {
310 	case ACB_ADAPTER_TYPE_A: {
311 			/* enable outbound Post Queue, outbound doorbell Interrupt */
312 			mask=~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE|ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE);
313 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intmask, intmask_org & mask);
314 			acb->outbound_int_enable = ~(intmask_org & mask) & 0x000000ff;
315 		}
316 		break;
317 	case ACB_ADAPTER_TYPE_B: {
318 			/* enable ARCMSR_IOP2DRV_MESSAGE_CMD_DONE */
319 			mask=(ARCMSR_IOP2DRV_DATA_WRITE_OK|ARCMSR_IOP2DRV_DATA_READ_OK|ARCMSR_IOP2DRV_CDB_DONE|ARCMSR_IOP2DRV_MESSAGE_CMD_DONE);
320 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell_mask, intmask_org | mask); /*1=interrupt enable, 0=interrupt disable*/
321 			acb->outbound_int_enable = (intmask_org | mask) & 0x0000000f;
322 		}
323 		break;
324 	case ACB_ADAPTER_TYPE_C: {
325 			/* enable outbound Post Queue, outbound doorbell Interrupt */
326 			mask=~(ARCMSR_HBCMU_UTILITY_A_ISR_MASK | ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR_MASK | ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR_MASK);
327 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org & mask);
328 			acb->outbound_int_enable= ~(intmask_org & mask) & 0x0000000f;
329 		}
330 		break;
331 	}
332 	return;
333 }
334 /*
335 **********************************************************************
336 **********************************************************************
337 */
338 static u_int8_t arcmsr_hba_wait_msgint_ready(struct AdapterControlBlock *acb)
339 {
340 	u_int32_t Index;
341 	u_int8_t Retries=0x00;
342 
343 	do {
344 		for(Index=0; Index < 100; Index++) {
345 			if(CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
346 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);/*clear interrupt*/
347 				return TRUE;
348 			}
349 			UDELAY(10000);
350 		}/*max 1 seconds*/
351 	}while(Retries++ < 20);/*max 20 sec*/
352 	return FALSE;
353 }
354 /*
355 **********************************************************************
356 **********************************************************************
357 */
358 static u_int8_t arcmsr_hbb_wait_msgint_ready(struct AdapterControlBlock *acb)
359 {
360 	u_int32_t Index;
361 	u_int8_t Retries=0x00;
362 
363 	do {
364 		for(Index=0; Index < 100; Index++) {
365 			if(CHIP_REG_READ32(HBB_DOORBELL, 0, iop2drv_doorbell) & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
366 				CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);/*clear interrupt*/
367 				CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
368 				return TRUE;
369 			}
370 			UDELAY(10000);
371 		}/*max 1 seconds*/
372 	}while(Retries++ < 20);/*max 20 sec*/
373 	return FALSE;
374 }
375 /*
376 **********************************************************************
377 **********************************************************************
378 */
379 static u_int8_t arcmsr_hbc_wait_msgint_ready(struct AdapterControlBlock *acb)
380 {
381 	u_int32_t Index;
382 	u_int8_t Retries=0x00;
383 
384 	do {
385 		for(Index=0; Index < 100; Index++) {
386 			if(CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
387 				CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);/*clear interrupt*/
388 				return TRUE;
389 			}
390 			UDELAY(10000);
391 		}/*max 1 seconds*/
392 	}while(Retries++ < 20);/*max 20 sec*/
393 	return FALSE;
394 }
395 /*
396 ************************************************************************
397 ************************************************************************
398 */
399 static void arcmsr_flush_hba_cache(struct AdapterControlBlock *acb)
400 {
401 	int retry_count=30;/* enlarge wait flush adapter cache time: 10 minute */
402 
403 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
404 	do {
405 		if(arcmsr_hba_wait_msgint_ready(acb)) {
406 			break;
407 		} else {
408 			retry_count--;
409 		}
410 	}while(retry_count!=0);
411 	return;
412 }
413 /*
414 ************************************************************************
415 ************************************************************************
416 */
417 static void arcmsr_flush_hbb_cache(struct AdapterControlBlock *acb)
418 {
419 	int retry_count=30;/* enlarge wait flush adapter cache time: 10 minute */
420 
421 	CHIP_REG_WRITE32(HBB_DOORBELL,
422 	0, drv2iop_doorbell, ARCMSR_MESSAGE_FLUSH_CACHE);
423 	do {
424 		if(arcmsr_hbb_wait_msgint_ready(acb)) {
425 			break;
426 		} else {
427 			retry_count--;
428 		}
429 	}while(retry_count!=0);
430 	return;
431 }
432 /*
433 ************************************************************************
434 ************************************************************************
435 */
436 static void arcmsr_flush_hbc_cache(struct AdapterControlBlock *acb)
437 {
438 	int retry_count=30;/* enlarge wait flush adapter cache time: 10 minute */
439 
440 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
441 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
442 	do {
443 		if(arcmsr_hbc_wait_msgint_ready(acb)) {
444 			break;
445 		} else {
446 			retry_count--;
447 		}
448 	}while(retry_count!=0);
449 	return;
450 }
451 /*
452 ************************************************************************
453 ************************************************************************
454 */
455 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb)
456 {
457 	switch (acb->adapter_type) {
458 	case ACB_ADAPTER_TYPE_A: {
459 			arcmsr_flush_hba_cache(acb);
460 		}
461 		break;
462 	case ACB_ADAPTER_TYPE_B: {
463 			arcmsr_flush_hbb_cache(acb);
464 		}
465 		break;
466 	case ACB_ADAPTER_TYPE_C: {
467 			arcmsr_flush_hbc_cache(acb);
468 		}
469 		break;
470 	}
471 	return;
472 }
473 /*
474 *******************************************************************************
475 *******************************************************************************
476 */
477 static int arcmsr_suspend(device_t dev)
478 {
479 	struct AdapterControlBlock	*acb = device_get_softc(dev);
480 
481 	/* flush controller */
482 	arcmsr_iop_parking(acb);
483 	/* disable all outbound interrupt */
484 	arcmsr_disable_allintr(acb);
485 	return(0);
486 }
487 /*
488 *******************************************************************************
489 *******************************************************************************
490 */
491 static int arcmsr_resume(device_t dev)
492 {
493 	struct AdapterControlBlock	*acb = device_get_softc(dev);
494 
495 	arcmsr_iop_init(acb);
496 	return(0);
497 }
498 /*
499 *********************************************************************************
500 *********************************************************************************
501 */
502 static void arcmsr_async(void *cb_arg, u_int32_t code, struct cam_path *path, void *arg)
503 {
504 	struct AdapterControlBlock *acb;
505 	u_int8_t target_id, target_lun;
506 	struct cam_sim * sim;
507 
508 	sim=(struct cam_sim *) cb_arg;
509 	acb =(struct AdapterControlBlock *) cam_sim_softc(sim);
510 	switch (code) {
511 	case AC_LOST_DEVICE:
512 		target_id=xpt_path_target_id(path);
513 		target_lun=xpt_path_lun_id(path);
514 		if((target_id > ARCMSR_MAX_TARGETID) || (target_lun > ARCMSR_MAX_TARGETLUN)) {
515 			break;
516 		}
517 		kprintf("%s:scsi id=%d lun=%d device lost \n", device_get_name(acb->pci_dev), target_id, target_lun);
518 		break;
519 	default:
520 		break;
521 	}
522 }
523 /*
524 **********************************************************************
525 **********************************************************************
526 */
527 static void arcmsr_srb_complete(struct CommandControlBlock *srb, int stand_flag)
528 {
529 	struct AdapterControlBlock *acb=srb->acb;
530 	union ccb * pccb=srb->pccb;
531 
532 	if((pccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
533 		bus_dmasync_op_t op;
534 
535 		if((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
536 			op = BUS_DMASYNC_POSTREAD;
537 		} else {
538 			op = BUS_DMASYNC_POSTWRITE;
539 		}
540 		bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
541 		bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap);
542 	}
543 	if(stand_flag==1) {
544 		atomic_subtract_int(&acb->srboutstandingcount, 1);
545 		if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) && (
546 		acb->srboutstandingcount < ARCMSR_RELEASE_SIMQ_LEVEL)) {
547 			acb->acb_flags &= ~ACB_F_CAM_DEV_QFRZN;
548 			pccb->ccb_h.status |= CAM_RELEASE_SIMQ;
549 		}
550 	}
551 	srb->startdone=ARCMSR_SRB_DONE;
552 	srb->srb_flags=0;
553 	acb->srbworkingQ[acb->workingsrb_doneindex]=srb;
554 	acb->workingsrb_doneindex++;
555 	acb->workingsrb_doneindex %= ARCMSR_MAX_FREESRB_NUM;
556 	xpt_done(pccb);
557 	return;
558 }
559 /*
560 **********************************************************************
561 **********************************************************************
562 */
563 static void arcmsr_report_sense_info(struct CommandControlBlock *srb)
564 {
565 	union ccb * pccb=srb->pccb;
566 
567 	pccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR;
568 	pccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
569 	if(&pccb->csio.sense_data) {
570 		memset(&pccb->csio.sense_data, 0, sizeof(pccb->csio.sense_data));
571 		memcpy(&pccb->csio.sense_data, srb->arcmsr_cdb.SenseData,
572 		get_min(sizeof(struct SENSE_DATA), sizeof(pccb->csio.sense_data)));
573 		((u_int8_t *)&pccb->csio.sense_data)[0] = (0x1 << 7 | 0x70); /* Valid,ErrorCode */
574 		pccb->ccb_h.status |= CAM_AUTOSNS_VALID;
575 	}
576 	return;
577 }
578 /*
579 *********************************************************************
580 *********************************************************************
581 */
582 static void arcmsr_abort_hba_allcmd(struct AdapterControlBlock *acb)
583 {
584 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
585 	if(!arcmsr_hba_wait_msgint_ready(acb)) {
586 		kprintf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
587 	}
588 	return;
589 }
590 /*
591 *********************************************************************
592 *********************************************************************
593 */
594 static void arcmsr_abort_hbb_allcmd(struct AdapterControlBlock *acb)
595 {
596 	CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_MESSAGE_ABORT_CMD);
597 	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
598 		kprintf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
599 	}
600 	return;
601 }
602 /*
603 *********************************************************************
604 *********************************************************************
605 */
606 static void arcmsr_abort_hbc_allcmd(struct AdapterControlBlock *acb)
607 {
608 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
609 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
610 	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
611 		kprintf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
612 	}
613 	return;
614 }
615 /*
616 *********************************************************************
617 *********************************************************************
618 */
619 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb)
620 {
621 	switch (acb->adapter_type) {
622 	case ACB_ADAPTER_TYPE_A: {
623 			arcmsr_abort_hba_allcmd(acb);
624 		}
625 		break;
626 	case ACB_ADAPTER_TYPE_B: {
627 			arcmsr_abort_hbb_allcmd(acb);
628 		}
629 		break;
630 	case ACB_ADAPTER_TYPE_C: {
631 			arcmsr_abort_hbc_allcmd(acb);
632 		}
633 		break;
634 	}
635 	return;
636 }
637 /*
638 **************************************************************************
639 **************************************************************************
640 */
641 static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, struct CommandControlBlock *srb, u_int16_t error)
642 {
643 	int target, lun;
644 
645 	target=srb->pccb->ccb_h.target_id;
646 	lun=srb->pccb->ccb_h.target_lun;
647 	if(error == FALSE) {
648 		if(acb->devstate[target][lun]==ARECA_RAID_GONE) {
649 			acb->devstate[target][lun]=ARECA_RAID_GOOD;
650 		}
651 		srb->pccb->ccb_h.status |= CAM_REQ_CMP;
652 		arcmsr_srb_complete(srb, 1);
653 	} else {
654 		switch(srb->arcmsr_cdb.DeviceStatus) {
655 		case ARCMSR_DEV_SELECT_TIMEOUT: {
656 				if(acb->devstate[target][lun]==ARECA_RAID_GOOD) {
657 					kprintf( "arcmsr%d: Target=%x, Lun=%x, selection timeout, raid volume was lost\n", acb->pci_unit, target, lun);
658 				}
659 				acb->devstate[target][lun]=ARECA_RAID_GONE;
660 				srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
661 				arcmsr_srb_complete(srb, 1);
662 			}
663 			break;
664 		case ARCMSR_DEV_ABORTED:
665 		case ARCMSR_DEV_INIT_FAIL: {
666 				acb->devstate[target][lun]=ARECA_RAID_GONE;
667 				srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
668 				arcmsr_srb_complete(srb, 1);
669 			}
670 			break;
671 		case SCSISTAT_CHECK_CONDITION: {
672 				acb->devstate[target][lun]=ARECA_RAID_GOOD;
673 				arcmsr_report_sense_info(srb);
674 				arcmsr_srb_complete(srb, 1);
675 			}
676 			break;
677 		default:
678 			kprintf("arcmsr%d: scsi id=%d lun=%d isr got command error done,but got unknow DeviceStatus=0x%x \n"
679 					, acb->pci_unit, target, lun ,srb->arcmsr_cdb.DeviceStatus);
680 			acb->devstate[target][lun]=ARECA_RAID_GONE;
681 			srb->pccb->ccb_h.status |= CAM_UNCOR_PARITY;
682 			/*unknow error or crc error just for retry*/
683 			arcmsr_srb_complete(srb, 1);
684 			break;
685 		}
686 	}
687 	return;
688 }
689 /*
690 **************************************************************************
691 **************************************************************************
692 */
693 static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb, u_int16_t error)
694 {
695 	struct CommandControlBlock *srb;
696 
697 	/* check if command done with no error*/
698 	switch (acb->adapter_type) {
699 	case ACB_ADAPTER_TYPE_C:
700 		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFF0));/*frame must be 32 bytes aligned*/
701 		break;
702 	case ACB_ADAPTER_TYPE_A:
703 	case ACB_ADAPTER_TYPE_B:
704 	default:
705 		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
706 		break;
707 	}
708 	if((srb->acb!=acb) || (srb->startdone!=ARCMSR_SRB_START)) {
709 		if(srb->startdone==ARCMSR_SRB_ABORTED) {
710 			kprintf("arcmsr%d: srb='%p' isr got aborted command \n", acb->pci_unit, srb);
711 			srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
712 			arcmsr_srb_complete(srb, 1);
713 			return;
714 		}
715 		kprintf("arcmsr%d: isr get an illegal srb command done"
716 			"acb='%p' srb='%p' srbacb='%p' startdone=0x%xsrboutstandingcount=%d \n",
717 			acb->pci_unit, acb, srb, srb->acb,srb->startdone, acb->srboutstandingcount);
718 		return;
719 	}
720 	arcmsr_report_srb_state(acb, srb, error);
721 	return;
722 }
723 /*
724 **********************************************************************
725 **********************************************************************
726 */
727 static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb)
728 {
729 	int i=0;
730 	u_int32_t flag_srb;
731 	u_int16_t error;
732 
733 	switch (acb->adapter_type) {
734 	case ACB_ADAPTER_TYPE_A: {
735 			u_int32_t outbound_intstatus;
736 
737 			/*clear and abort all outbound posted Q*/
738 			outbound_intstatus=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
739 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intstatus);/*clear interrupt*/
740 			while(((flag_srb=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_queueport)) != 0xFFFFFFFF) && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
741                 error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
742 				arcmsr_drain_donequeue(acb, flag_srb, error);
743 			}
744 		}
745 		break;
746 	case ACB_ADAPTER_TYPE_B: {
747 			struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
748 
749 			/*clear all outbound posted Q*/
750 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ARCMSR_DOORBELL_INT_CLEAR_PATTERN); /* clear doorbell interrupt */
751 			for(i=0; i < ARCMSR_MAX_HBB_POSTQUEUE; i++) {
752 				if((flag_srb=phbbmu->done_qbuffer[i])!=0) {
753 					phbbmu->done_qbuffer[i]=0;
754 			error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
755 					arcmsr_drain_donequeue(acb, flag_srb, error);
756 				}
757 				phbbmu->post_qbuffer[i]=0;
758 			}/*drain reply FIFO*/
759 			phbbmu->doneq_index=0;
760 			phbbmu->postq_index=0;
761 		}
762 		break;
763 	case ACB_ADAPTER_TYPE_C: {
764 
765 			while((CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
766 				flag_srb=CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
767                 error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
768 				arcmsr_drain_donequeue(acb, flag_srb, error);
769 			}
770 		}
771 		break;
772 	}
773 	return;
774 }
775 /*
776 ****************************************************************************
777 ****************************************************************************
778 */
779 static void arcmsr_iop_reset(struct AdapterControlBlock *acb)
780 {
781 	struct CommandControlBlock *srb;
782 	u_int32_t intmask_org;
783 	u_int32_t i=0;
784 
785 	if(acb->srboutstandingcount>0) {
786 		/* disable all outbound interrupt */
787 		intmask_org=arcmsr_disable_allintr(acb);
788 		/*clear and abort all outbound posted Q*/
789 		arcmsr_done4abort_postqueue(acb);
790 		/* talk to iop 331 outstanding command aborted*/
791 		arcmsr_abort_allcmd(acb);
792 		for(i=0;i<ARCMSR_MAX_FREESRB_NUM;i++) {
793 			srb=acb->psrb_pool[i];
794 			if(srb->startdone==ARCMSR_SRB_START) {
795 				srb->startdone=ARCMSR_SRB_ABORTED;
796 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
797 				arcmsr_srb_complete(srb, 1);
798 			}
799 		}
800 		/* enable all outbound interrupt */
801 		arcmsr_enable_allintr(acb, intmask_org);
802 	}
803 	atomic_set_int(&acb->srboutstandingcount, 0);
804 	acb->workingsrb_doneindex=0;
805 	acb->workingsrb_startindex=0;
806 	return;
807 }
808 /*
809 **********************************************************************
810 **********************************************************************
811 */
812 static void arcmsr_build_srb(struct CommandControlBlock *srb,
813 		bus_dma_segment_t *dm_segs, u_int32_t nseg)
814 {
815 	struct ARCMSR_CDB * arcmsr_cdb= &srb->arcmsr_cdb;
816 	u_int8_t * psge=(u_int8_t *)&arcmsr_cdb->u;
817 	u_int32_t address_lo, address_hi;
818 	union ccb * pccb=srb->pccb;
819 	struct ccb_scsiio * pcsio= &pccb->csio;
820 	u_int32_t arccdbsize=0x30;
821 
822 	memset(arcmsr_cdb, 0, sizeof(struct ARCMSR_CDB));
823 	arcmsr_cdb->Bus=0;
824 	arcmsr_cdb->TargetID=pccb->ccb_h.target_id;
825 	arcmsr_cdb->LUN=pccb->ccb_h.target_lun;
826 	arcmsr_cdb->Function=1;
827 	arcmsr_cdb->CdbLength=(u_int8_t)pcsio->cdb_len;
828 	arcmsr_cdb->Context=0;
829 	bcopy(pcsio->cdb_io.cdb_bytes, arcmsr_cdb->Cdb, pcsio->cdb_len);
830 	if(nseg != 0) {
831 		struct AdapterControlBlock *acb=srb->acb;
832 		bus_dmasync_op_t op;
833 		u_int32_t length, i, cdb_sgcount=0;
834 
835 		if((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
836 			op=BUS_DMASYNC_PREREAD;
837 		} else {
838 			op=BUS_DMASYNC_PREWRITE;
839 			arcmsr_cdb->Flags|=ARCMSR_CDB_FLAG_WRITE;
840 			srb->srb_flags|=SRB_FLAG_WRITE;
841 		}
842 		bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
843 		for(i=0;i<nseg;i++) {
844 			/* Get the physical address of the current data pointer */
845 			length=arcmsr_htole32(dm_segs[i].ds_len);
846 			address_lo=arcmsr_htole32(dma_addr_lo32(dm_segs[i].ds_addr));
847 			address_hi=arcmsr_htole32(dma_addr_hi32(dm_segs[i].ds_addr));
848 			if(address_hi==0) {
849 				struct SG32ENTRY * pdma_sg=(struct SG32ENTRY *)psge;
850 				pdma_sg->address=address_lo;
851 				pdma_sg->length=length;
852 				psge += sizeof(struct SG32ENTRY);
853 				arccdbsize += sizeof(struct SG32ENTRY);
854 			} else {
855 				u_int32_t sg64s_size=0, tmplength=length;
856 
857 				while(1) {
858 					u_int64_t span4G, length0;
859 					struct SG64ENTRY * pdma_sg=(struct SG64ENTRY *)psge;
860 
861 					span4G=(u_int64_t)address_lo + tmplength;
862 					pdma_sg->addresshigh=address_hi;
863 					pdma_sg->address=address_lo;
864 					if(span4G > 0x100000000) {
865 						/*see if cross 4G boundary*/
866 						length0=0x100000000-address_lo;
867 						pdma_sg->length=(u_int32_t)length0|IS_SG64_ADDR;
868 						address_hi=address_hi+1;
869 						address_lo=0;
870 						tmplength=tmplength-(u_int32_t)length0;
871 						sg64s_size += sizeof(struct SG64ENTRY);
872 						psge += sizeof(struct SG64ENTRY);
873 						cdb_sgcount++;
874 					} else {
875 						pdma_sg->length=tmplength|IS_SG64_ADDR;
876 						sg64s_size += sizeof(struct SG64ENTRY);
877 						psge += sizeof(struct SG64ENTRY);
878 						break;
879 					}
880 				}
881 				arccdbsize += sg64s_size;
882 			}
883 			cdb_sgcount++;
884 		}
885 		arcmsr_cdb->sgcount=(u_int8_t)cdb_sgcount;
886 		arcmsr_cdb->DataLength=pcsio->dxfer_len;
887 		if( arccdbsize > 256) {
888 			arcmsr_cdb->Flags|=ARCMSR_CDB_FLAG_SGL_BSIZE;
889 		}
890 	} else {
891 		arcmsr_cdb->DataLength = 0;
892 	}
893     srb->arc_cdb_size=arccdbsize;
894 	return;
895 }
896 /*
897 **************************************************************************
898 **************************************************************************
899 */
900 static void arcmsr_post_srb(struct AdapterControlBlock *acb, struct CommandControlBlock *srb)
901 {
902 	u_int32_t cdb_shifted_phyaddr=(u_int32_t) srb->cdb_shifted_phyaddr;
903 	struct ARCMSR_CDB * arcmsr_cdb=(struct ARCMSR_CDB *)&srb->arcmsr_cdb;
904 
905 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, (srb->srb_flags & SRB_FLAG_WRITE) ? BUS_DMASYNC_POSTWRITE:BUS_DMASYNC_POSTREAD);
906 	atomic_add_int(&acb->srboutstandingcount, 1);
907 	srb->startdone=ARCMSR_SRB_START;
908 
909 	switch (acb->adapter_type) {
910 	case ACB_ADAPTER_TYPE_A: {
911 			if(arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) {
912 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_queueport, cdb_shifted_phyaddr|ARCMSR_SRBPOST_FLAG_SGL_BSIZE);
913 			} else {
914 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_queueport, cdb_shifted_phyaddr);
915 			}
916 		}
917 		break;
918 	case ACB_ADAPTER_TYPE_B: {
919 			struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
920 			int ending_index, index;
921 
922 			index=phbbmu->postq_index;
923 			ending_index=((index+1)%ARCMSR_MAX_HBB_POSTQUEUE);
924 			phbbmu->post_qbuffer[ending_index]=0;
925 			if(arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) {
926 				phbbmu->post_qbuffer[index]= cdb_shifted_phyaddr|ARCMSR_SRBPOST_FLAG_SGL_BSIZE;
927 			} else {
928 				phbbmu->post_qbuffer[index]= cdb_shifted_phyaddr;
929 			}
930 			index++;
931 			index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
932 			phbbmu->postq_index=index;
933 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_CDB_POSTED);
934 		}
935 		break;
936     case ACB_ADAPTER_TYPE_C:
937         {
938             u_int32_t ccb_post_stamp, arc_cdb_size, cdb_phyaddr_hi32;
939 
940             arc_cdb_size=(srb->arc_cdb_size>0x300)?0x300:srb->arc_cdb_size;
941             ccb_post_stamp=(cdb_shifted_phyaddr | ((arc_cdb_size-1) >> 6) | 1);
942 			cdb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
943             if(cdb_phyaddr_hi32)
944             {
945 			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_high, cdb_phyaddr_hi32);
946 			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
947             }
948             else
949             {
950 			    CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
951             }
952         }
953         break;
954 	}
955 	return;
956 }
957 /*
958 ************************************************************************
959 ************************************************************************
960 */
961 static struct QBUFFER * arcmsr_get_iop_rqbuffer( struct AdapterControlBlock *acb)
962 {
963 	struct QBUFFER *qbuffer=NULL;
964 
965 	switch (acb->adapter_type) {
966 	case ACB_ADAPTER_TYPE_A: {
967 			struct HBA_MessageUnit *phbamu=(struct HBA_MessageUnit *)acb->pmu;
968 
969 			qbuffer=(struct QBUFFER *)&phbamu->message_rbuffer;
970 		}
971 		break;
972 	case ACB_ADAPTER_TYPE_B: {
973 			struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
974 
975 			qbuffer=(struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_rbuffer;
976 		}
977 		break;
978 	case ACB_ADAPTER_TYPE_C: {
979 			struct HBC_MessageUnit *phbcmu=(struct HBC_MessageUnit *)acb->pmu;
980 
981 			qbuffer=(struct QBUFFER *)&phbcmu->message_rbuffer;
982 		}
983 		break;
984 	}
985 	return(qbuffer);
986 }
987 /*
988 ************************************************************************
989 ************************************************************************
990 */
991 static struct QBUFFER * arcmsr_get_iop_wqbuffer( struct AdapterControlBlock *acb)
992 {
993 	struct QBUFFER *qbuffer=NULL;
994 
995 	switch (acb->adapter_type) {
996 	case ACB_ADAPTER_TYPE_A: {
997 			struct HBA_MessageUnit *phbamu=(struct HBA_MessageUnit *)acb->pmu;
998 
999 			qbuffer=(struct QBUFFER *)&phbamu->message_wbuffer;
1000 		}
1001 		break;
1002 	case ACB_ADAPTER_TYPE_B: {
1003 			struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
1004 
1005 			qbuffer=(struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_wbuffer;
1006 		}
1007 		break;
1008 	case ACB_ADAPTER_TYPE_C: {
1009 			struct HBC_MessageUnit *phbcmu=(struct HBC_MessageUnit *)acb->pmu;
1010 
1011 			qbuffer=(struct QBUFFER *)&phbcmu->message_wbuffer;
1012 		}
1013 		break;
1014 	}
1015 	return(qbuffer);
1016 }
1017 /*
1018 **************************************************************************
1019 **************************************************************************
1020 */
1021 static void arcmsr_iop_message_read(struct AdapterControlBlock *acb)
1022 {
1023 	switch (acb->adapter_type) {
1024 	case ACB_ADAPTER_TYPE_A: {
1025 			/* let IOP know data has been read */
1026 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
1027 		}
1028 		break;
1029 	case ACB_ADAPTER_TYPE_B: {
1030 			/* let IOP know data has been read */
1031 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
1032 		}
1033 		break;
1034 	case ACB_ADAPTER_TYPE_C: {
1035 			/* let IOP know data has been read */
1036 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK);
1037 		}
1038 	}
1039 	return;
1040 }
1041 /*
1042 **************************************************************************
1043 **************************************************************************
1044 */
1045 static void arcmsr_iop_message_wrote(struct AdapterControlBlock *acb)
1046 {
1047 	switch (acb->adapter_type) {
1048 	case ACB_ADAPTER_TYPE_A: {
1049 			/*
1050 			** push inbound doorbell tell iop, driver data write ok
1051 			** and wait reply on next hwinterrupt for next Qbuffer post
1052 			*/
1053 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
1054 		}
1055 		break;
1056 	case ACB_ADAPTER_TYPE_B: {
1057 			/*
1058 			** push inbound doorbell tell iop, driver data write ok
1059 			** and wait reply on next hwinterrupt for next Qbuffer post
1060 			*/
1061 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_WRITE_OK);
1062 		}
1063 		break;
1064 	case ACB_ADAPTER_TYPE_C: {
1065 			/*
1066 			** push inbound doorbell tell iop, driver data write ok
1067 			** and wait reply on next hwinterrupt for next Qbuffer post
1068 			*/
1069 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_WRITE_OK);
1070 		}
1071 		break;
1072 	}
1073 }
1074 /*
1075 **********************************************************************
1076 **********************************************************************
1077 */
1078 static void arcmsr_post_ioctldata2iop(struct AdapterControlBlock *acb)
1079 {
1080 	u_int8_t *pQbuffer;
1081 	struct QBUFFER *pwbuffer;
1082 	u_int8_t * iop_data;
1083 	int32_t allxfer_len=0;
1084 
1085 	pwbuffer=arcmsr_get_iop_wqbuffer(acb);
1086 	iop_data=(u_int8_t *)pwbuffer->data;
1087 	if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READ) {
1088 		acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ);
1089 		while((acb->wqbuf_firstindex!=acb->wqbuf_lastindex)
1090 			&& (allxfer_len<124)) {
1091 			pQbuffer=&acb->wqbuffer[acb->wqbuf_firstindex];
1092 			memcpy(iop_data, pQbuffer, 1);
1093 			acb->wqbuf_firstindex++;
1094 			acb->wqbuf_firstindex %=ARCMSR_MAX_QBUFFER; /*if last index number set it to 0 */
1095 			iop_data++;
1096 			allxfer_len++;
1097 		}
1098 		pwbuffer->data_len=allxfer_len;
1099 		/*
1100 		** push inbound doorbell and wait reply at hwinterrupt routine for next Qbuffer post
1101 		*/
1102 		arcmsr_iop_message_wrote(acb);
1103 	}
1104 	return;
1105 }
1106 /*
1107 ************************************************************************
1108 ************************************************************************
1109 */
1110 static void arcmsr_stop_hba_bgrb(struct AdapterControlBlock *acb)
1111 {
1112 	acb->acb_flags &=~ACB_F_MSG_START_BGRB;
1113 	CHIP_REG_WRITE32(HBA_MessageUnit,
1114 	0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
1115 	if(!arcmsr_hba_wait_msgint_ready(acb)) {
1116 		kprintf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
1117 			, acb->pci_unit);
1118 	}
1119 	return;
1120 }
1121 /*
1122 ************************************************************************
1123 ************************************************************************
1124 */
1125 static void arcmsr_stop_hbb_bgrb(struct AdapterControlBlock *acb)
1126 {
1127 	acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1128 	CHIP_REG_WRITE32(HBB_DOORBELL,
1129 	0, drv2iop_doorbell, ARCMSR_MESSAGE_STOP_BGRB);
1130 	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
1131 		kprintf( "arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
1132 			, acb->pci_unit);
1133 	}
1134 	return;
1135 }
1136 /*
1137 ************************************************************************
1138 ************************************************************************
1139 */
1140 static void arcmsr_stop_hbc_bgrb(struct AdapterControlBlock *acb)
1141 {
1142 	acb->acb_flags &=~ACB_F_MSG_START_BGRB;
1143 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
1144 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
1145 	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
1146 		kprintf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit);
1147 	}
1148 	return;
1149 }
1150 /*
1151 ************************************************************************
1152 ************************************************************************
1153 */
1154 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb)
1155 {
1156 	switch (acb->adapter_type) {
1157 	case ACB_ADAPTER_TYPE_A: {
1158 			arcmsr_stop_hba_bgrb(acb);
1159 		}
1160 		break;
1161 	case ACB_ADAPTER_TYPE_B: {
1162 			arcmsr_stop_hbb_bgrb(acb);
1163 		}
1164 		break;
1165 	case ACB_ADAPTER_TYPE_C: {
1166 			arcmsr_stop_hbc_bgrb(acb);
1167 		}
1168 		break;
1169 	}
1170 	return;
1171 }
1172 /*
1173 ************************************************************************
1174 ************************************************************************
1175 */
1176 static void arcmsr_poll(struct cam_sim * psim)
1177 {
1178 	struct AdapterControlBlock *acb;
1179 
1180 	acb = (struct AdapterControlBlock *)cam_sim_softc(psim);
1181 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1182 	arcmsr_interrupt(acb);
1183 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1184 	return;
1185 }
1186 /*
1187 **************************************************************************
1188 **************************************************************************
1189 */
1190 static void arcmsr_iop2drv_data_wrote_handle(struct AdapterControlBlock *acb)
1191 {
1192 	struct QBUFFER *prbuffer;
1193 	u_int8_t *pQbuffer;
1194 	u_int8_t *iop_data;
1195 	int my_empty_len, iop_len, rqbuf_firstindex, rqbuf_lastindex;
1196 
1197 	/*check this iop data if overflow my rqbuffer*/
1198 	rqbuf_lastindex=acb->rqbuf_lastindex;
1199 	rqbuf_firstindex=acb->rqbuf_firstindex;
1200 	prbuffer=arcmsr_get_iop_rqbuffer(acb);
1201 	iop_data=(u_int8_t *)prbuffer->data;
1202 	iop_len=prbuffer->data_len;
1203 	my_empty_len=(rqbuf_firstindex-rqbuf_lastindex-1)&(ARCMSR_MAX_QBUFFER-1);
1204 	if(my_empty_len>=iop_len) {
1205 		while(iop_len > 0) {
1206 			pQbuffer=&acb->rqbuffer[rqbuf_lastindex];
1207 			memcpy(pQbuffer, iop_data, 1);
1208 			rqbuf_lastindex++;
1209 			rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;/*if last index number set it to 0 */
1210 			iop_data++;
1211 			iop_len--;
1212 		}
1213 		acb->rqbuf_lastindex=rqbuf_lastindex;
1214 		arcmsr_iop_message_read(acb);
1215 		/*signature, let IOP know data has been read */
1216 	} else {
1217 		acb->acb_flags|=ACB_F_IOPDATA_OVERFLOW;
1218 	}
1219 	return;
1220 }
1221 /*
1222 **************************************************************************
1223 **************************************************************************
1224 */
1225 static void arcmsr_iop2drv_data_read_handle(struct AdapterControlBlock *acb)
1226 {
1227 	acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_READ;
1228 	/*
1229 	*****************************************************************
1230 	**   check if there are any mail packages from user space program
1231 	**   in my post bag, now is the time to send them into Areca's firmware
1232 	*****************************************************************
1233 	*/
1234 	if(acb->wqbuf_firstindex!=acb->wqbuf_lastindex) {
1235 		u_int8_t *pQbuffer;
1236 		struct QBUFFER *pwbuffer;
1237 		u_int8_t *iop_data;
1238 		int allxfer_len=0;
1239 
1240 		acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ);
1241 		pwbuffer=arcmsr_get_iop_wqbuffer(acb);
1242 		iop_data=(u_int8_t *)pwbuffer->data;
1243 		while((acb->wqbuf_firstindex!=acb->wqbuf_lastindex)
1244 			&& (allxfer_len<124)) {
1245 			pQbuffer=&acb->wqbuffer[acb->wqbuf_firstindex];
1246 			memcpy(iop_data, pQbuffer, 1);
1247 			acb->wqbuf_firstindex++;
1248 			acb->wqbuf_firstindex %=ARCMSR_MAX_QBUFFER; /*if last index number set it to 0 */
1249 			iop_data++;
1250 			allxfer_len++;
1251 		}
1252 		pwbuffer->data_len=allxfer_len;
1253 		/*
1254 		** push inbound doorbell tell iop driver data write ok
1255 		** and wait reply on next hwinterrupt for next Qbuffer post
1256 		*/
1257 		arcmsr_iop_message_wrote(acb);
1258 	}
1259 	if(acb->wqbuf_firstindex==acb->wqbuf_lastindex) {
1260 		acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_CLEARED;
1261 	}
1262 	return;
1263 }
1264 
1265 static void arcmsr_rescanLun_cb(struct cam_periph *periph, union ccb *ccb)
1266 {
1267 /*
1268 	if (ccb->ccb_h.status != CAM_REQ_CMP)
1269 		kprintf("arcmsr_rescanLun_cb: Rescan Target=%x, lun=%x, failure status=%x\n",ccb->ccb_h.target_id,ccb->ccb_h.target_lun,ccb->ccb_h.status);
1270 	else
1271 		kprintf("arcmsr_rescanLun_cb: Rescan lun successfully!\n");
1272 */
1273 	xpt_free_path(ccb->ccb_h.path);
1274 }
1275 
1276 static void	arcmsr_rescan_lun(struct AdapterControlBlock *acb, int target, int lun)
1277 {
1278 	struct cam_path     *path;
1279 	union ccb            ccb;
1280 
1281 	if (xpt_create_path(&path, xpt_periph, cam_sim_path(acb->psim), target, lun) != CAM_REQ_CMP)
1282 		return;
1283 /*	kprintf("arcmsr_rescan_lun: Rescan Target=%x, Lun=%x\n", target, lun); */
1284 	bzero(&ccb, sizeof(union ccb));
1285 	xpt_setup_ccb(&ccb.ccb_h, path, 5);
1286 	ccb.ccb_h.func_code = XPT_SCAN_LUN;
1287 	ccb.ccb_h.cbfcnp = arcmsr_rescanLun_cb;
1288 	ccb.crcn.flags = CAM_FLAG_NONE;
1289 	xpt_action(&ccb);
1290 	return;
1291 }
1292 
1293 
1294 static void arcmsr_abort_dr_ccbs(struct AdapterControlBlock *acb, int target, int lun)
1295 {
1296 	struct CommandControlBlock *srb;
1297 	u_int32_t intmask_org;
1298 	int i;
1299 
1300 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1301 	/* disable all outbound interrupts */
1302 	intmask_org = arcmsr_disable_allintr(acb);
1303 	for (i = 0; i < ARCMSR_MAX_FREESRB_NUM; i++)
1304 	{
1305 		srb = acb->psrb_pool[i];
1306 		if (srb->startdone == ARCMSR_SRB_START)
1307 		{
1308 		if((target == srb->pccb->ccb_h.target_id) && (lun == srb->pccb->ccb_h.target_lun))
1309             {
1310 			srb->startdone = ARCMSR_SRB_ABORTED;
1311 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
1312 			arcmsr_srb_complete(srb, 1);
1313 		}
1314 		}
1315 	}
1316 	/* enable outbound Post Queue, outbound doorbell Interrupt */
1317 	arcmsr_enable_allintr(acb, intmask_org);
1318 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1319 }
1320 
1321 
1322 /*
1323 **************************************************************************
1324 **************************************************************************
1325 */
1326 static void arcmsr_dr_handle(struct AdapterControlBlock *acb) {
1327 	u_int32_t	devicemap;
1328 	u_int32_t	target, lun;
1329     u_int32_t	deviceMapCurrent[4]={0};
1330     u_int8_t	*pDevMap;
1331 
1332 	switch (acb->adapter_type) {
1333 	case ACB_ADAPTER_TYPE_A:
1334 			devicemap = offsetof(struct HBA_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1335 			for (target= 0; target < 4; target++)
1336 			{
1337 		deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
1338 		devicemap += 4;
1339 			}
1340 			break;
1341 
1342 	case ACB_ADAPTER_TYPE_B:
1343 			devicemap = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1344 			for (target= 0; target < 4; target++)
1345 			{
1346 		deviceMapCurrent[target]=bus_space_read_4(acb->btag[1], acb->bhandle[1],  devicemap);
1347 		devicemap += 4;
1348 			}
1349 			break;
1350 
1351 	case ACB_ADAPTER_TYPE_C:
1352 			devicemap = offsetof(struct HBC_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1353 			for (target= 0; target < 4; target++)
1354 			{
1355 		deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
1356 		devicemap += 4;
1357 			}
1358 			break;
1359 	}
1360 		if(acb->acb_flags & ACB_F_BUS_HANG_ON)
1361 		{
1362 			acb->acb_flags &= ~ACB_F_BUS_HANG_ON;
1363 		}
1364 		/*
1365 		** adapter posted CONFIG message
1366 		** copy the new map, note if there are differences with the current map
1367 		*/
1368 		pDevMap = (u_int8_t	*)&deviceMapCurrent[0];
1369 		for (target= 0; target < ARCMSR_MAX_TARGETID - 1; target++)
1370 		{
1371 			if (*pDevMap != acb->device_map[target])
1372 			{
1373                 u_int8_t difference, bit_check;
1374 
1375                 difference= *pDevMap ^ acb->device_map[target];
1376                 for(lun=0; lun < ARCMSR_MAX_TARGETLUN; lun++)
1377                 {
1378                     bit_check=(1 << lun);						/*check bit from 0....31*/
1379                     if(difference & bit_check)
1380                     {
1381                         if(acb->device_map[target] & bit_check)
1382                         {/* unit departed */
1383 							kprintf("arcmsr_dr_handle: Target=%x, lun=%x, GONE!!!\n",target,lun);
1384 							arcmsr_abort_dr_ccbs(acb, target, lun);
1385 				arcmsr_rescan_lun(acb, target, lun);
1386 						acb->devstate[target][lun] = ARECA_RAID_GONE;
1387                         }
1388                         else
1389                         {/* unit arrived */
1390 							kprintf("arcmsr_dr_handle: Target=%x, lun=%x, ARRIVING!!!\n",target,lun);
1391 				arcmsr_rescan_lun(acb, target, lun);
1392 						acb->devstate[target][lun] = ARECA_RAID_GOOD;
1393                         }
1394                     }
1395                 }
1396 /*				kprintf("arcmsr_dr_handle: acb->device_map[%x]=0x%x, deviceMapCurrent[%x]=%x\n",target,acb->device_map[target],target,*pDevMap); */
1397 				acb->device_map[target]= *pDevMap;
1398 			}
1399 			pDevMap++;
1400 		}
1401 }
1402 /*
1403 **************************************************************************
1404 **************************************************************************
1405 */
1406 static void arcmsr_hba_message_isr(struct AdapterControlBlock *acb) {
1407 	u_int32_t outbound_message;
1408 
1409 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);
1410 	outbound_message = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[0]);
1411 	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1412 		arcmsr_dr_handle( acb );
1413 }
1414 /*
1415 **************************************************************************
1416 **************************************************************************
1417 */
1418 static void arcmsr_hbb_message_isr(struct AdapterControlBlock *acb) {
1419 	u_int32_t outbound_message;
1420 
1421 	/* clear interrupts */
1422 	CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);
1423 	outbound_message = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[0]);
1424 	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1425 		arcmsr_dr_handle( acb );
1426 }
1427 /*
1428 **************************************************************************
1429 **************************************************************************
1430 */
1431 static void arcmsr_hbc_message_isr(struct AdapterControlBlock *acb) {
1432 	u_int32_t outbound_message;
1433 
1434 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);
1435 	outbound_message = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[0]);
1436 	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1437 		arcmsr_dr_handle( acb );
1438 }
1439 /*
1440 **************************************************************************
1441 **************************************************************************
1442 */
1443 static void arcmsr_hba_doorbell_isr(struct AdapterControlBlock *acb)
1444 {
1445 	u_int32_t outbound_doorbell;
1446 
1447 	/*
1448 	*******************************************************************
1449 	**  Maybe here we need to check wrqbuffer_lock is lock or not
1450 	**  DOORBELL: din! don!
1451 	**  check if there are any mail need to pack from firmware
1452 	*******************************************************************
1453 	*/
1454 	outbound_doorbell=CHIP_REG_READ32(HBA_MessageUnit,
1455 	0, outbound_doorbell);
1456 	CHIP_REG_WRITE32(HBA_MessageUnit,
1457 	0, outbound_doorbell, outbound_doorbell); /* clear doorbell interrupt */
1458 	if(outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_WRITE_OK) {
1459 		arcmsr_iop2drv_data_wrote_handle(acb);
1460 	}
1461 	if(outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_READ_OK) {
1462 		arcmsr_iop2drv_data_read_handle(acb);
1463 	}
1464 	return;
1465 }
1466 /*
1467 **************************************************************************
1468 **************************************************************************
1469 */
1470 static void arcmsr_hbc_doorbell_isr(struct AdapterControlBlock *acb)
1471 {
1472 	u_int32_t outbound_doorbell;
1473 
1474 	/*
1475 	*******************************************************************
1476 	**  Maybe here we need to check wrqbuffer_lock is lock or not
1477 	**  DOORBELL: din! don!
1478 	**  check if there are any mail need to pack from firmware
1479 	*******************************************************************
1480 	*/
1481 	outbound_doorbell=CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell);
1482 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, outbound_doorbell); /* clear doorbell interrupt */
1483 	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_DATA_WRITE_OK) {
1484 		arcmsr_iop2drv_data_wrote_handle(acb);
1485 	}
1486 	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_DATA_READ_OK) {
1487 		arcmsr_iop2drv_data_read_handle(acb);
1488 	}
1489 	if(outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
1490 		arcmsr_hbc_message_isr(acb);    /* messenger of "driver to iop commands" */
1491 	}
1492 	return;
1493 }
1494 /*
1495 **************************************************************************
1496 **************************************************************************
1497 */
1498 static void arcmsr_hba_postqueue_isr(struct AdapterControlBlock *acb)
1499 {
1500 	u_int32_t flag_srb;
1501 	u_int16_t error;
1502 
1503 	/*
1504 	*****************************************************************************
1505 	**               areca cdb command done
1506 	*****************************************************************************
1507 	*/
1508 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
1509 		BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1510 	while((flag_srb=CHIP_REG_READ32(HBA_MessageUnit,
1511 		0, outbound_queueport)) != 0xFFFFFFFF) {
1512 		/* check if command done with no error*/
1513         error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
1514 		arcmsr_drain_donequeue(acb, flag_srb, error);
1515 	}	/*drain reply FIFO*/
1516 	return;
1517 }
1518 /*
1519 **************************************************************************
1520 **************************************************************************
1521 */
1522 static void arcmsr_hbb_postqueue_isr(struct AdapterControlBlock *acb)
1523 {
1524 	struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
1525 	u_int32_t flag_srb;
1526 	int index;
1527 	u_int16_t error;
1528 
1529 	/*
1530 	*****************************************************************************
1531 	**               areca cdb command done
1532 	*****************************************************************************
1533 	*/
1534 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
1535 		BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1536 	index=phbbmu->doneq_index;
1537 	while((flag_srb=phbbmu->done_qbuffer[index]) != 0) {
1538 		phbbmu->done_qbuffer[index]=0;
1539 		index++;
1540 		index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
1541 		phbbmu->doneq_index=index;
1542 		/* check if command done with no error*/
1543         error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
1544 		arcmsr_drain_donequeue(acb, flag_srb, error);
1545 	}	/*drain reply FIFO*/
1546 	return;
1547 }
1548 /*
1549 **************************************************************************
1550 **************************************************************************
1551 */
1552 static void arcmsr_hbc_postqueue_isr(struct AdapterControlBlock *acb)
1553 {
1554 	u_int32_t flag_srb,throttling=0;
1555 	u_int16_t error;
1556 
1557 	/*
1558 	*****************************************************************************
1559 	**               areca cdb command done
1560 	*****************************************************************************
1561 	*/
1562 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1563 
1564 	while(CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) {
1565 
1566 		flag_srb=CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
1567 		/* check if command done with no error*/
1568         error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
1569 		arcmsr_drain_donequeue(acb, flag_srb, error);
1570         if(throttling==ARCMSR_HBC_ISR_THROTTLING_LEVEL) {
1571             CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_POSTQUEUE_THROTTLING);
1572             break;
1573         }
1574         throttling++;
1575 	}	/*drain reply FIFO*/
1576 	return;
1577 }
1578 /*
1579 **********************************************************************
1580 **********************************************************************
1581 */
1582 static void arcmsr_handle_hba_isr( struct AdapterControlBlock *acb)
1583 {
1584 	u_int32_t outbound_intstatus;
1585 	/*
1586 	*********************************************
1587 	**   check outbound intstatus
1588 	*********************************************
1589 	*/
1590 	outbound_intstatus=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
1591 	if(!outbound_intstatus) {
1592 		/*it must be share irq*/
1593 		return;
1594 	}
1595 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intstatus);/*clear interrupt*/
1596 	/* MU doorbell interrupts*/
1597 	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_DOORBELL_INT) {
1598 		arcmsr_hba_doorbell_isr(acb);
1599 	}
1600 	/* MU post queue interrupts*/
1601 	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_POSTQUEUE_INT) {
1602 		arcmsr_hba_postqueue_isr(acb);
1603 	}
1604 	if(outbound_intstatus & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
1605 		arcmsr_hba_message_isr(acb);
1606 	}
1607 	return;
1608 }
1609 /*
1610 **********************************************************************
1611 **********************************************************************
1612 */
1613 static void arcmsr_handle_hbb_isr( struct AdapterControlBlock *acb)
1614 {
1615 	u_int32_t outbound_doorbell;
1616 	/*
1617 	*********************************************
1618 	**   check outbound intstatus
1619 	*********************************************
1620 	*/
1621 	outbound_doorbell=CHIP_REG_READ32(HBB_DOORBELL, 0, iop2drv_doorbell) & acb->outbound_int_enable;
1622 	if(!outbound_doorbell) {
1623 		/*it must be share irq*/
1624 		return;
1625 	}
1626 	CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ~outbound_doorbell); /* clear doorbell interrupt */
1627 	CHIP_REG_READ32(HBB_DOORBELL, 0, iop2drv_doorbell);
1628 	CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
1629 	/* MU ioctl transfer doorbell interrupts*/
1630 	if(outbound_doorbell & ARCMSR_IOP2DRV_DATA_WRITE_OK) {
1631 		arcmsr_iop2drv_data_wrote_handle(acb);
1632 	}
1633 	if(outbound_doorbell & ARCMSR_IOP2DRV_DATA_READ_OK) {
1634 		arcmsr_iop2drv_data_read_handle(acb);
1635 	}
1636 	/* MU post queue interrupts*/
1637 	if(outbound_doorbell & ARCMSR_IOP2DRV_CDB_DONE) {
1638 		arcmsr_hbb_postqueue_isr(acb);
1639 	}
1640 	if(outbound_doorbell & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
1641 		arcmsr_hbb_message_isr(acb);
1642 	}
1643 	return;
1644 }
1645 /*
1646 **********************************************************************
1647 **********************************************************************
1648 */
1649 static void arcmsr_handle_hbc_isr( struct AdapterControlBlock *acb)
1650 {
1651 	u_int32_t host_interrupt_status;
1652 	/*
1653 	*********************************************
1654 	**   check outbound intstatus
1655 	*********************************************
1656 	*/
1657 	host_interrupt_status=CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status);
1658 	if(!host_interrupt_status) {
1659 		/*it must be share irq*/
1660 		return;
1661 	}
1662 	/* MU doorbell interrupts*/
1663 	if(host_interrupt_status & ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR) {
1664 		arcmsr_hbc_doorbell_isr(acb);
1665 	}
1666 	/* MU post queue interrupts*/
1667 	if(host_interrupt_status & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) {
1668 		arcmsr_hbc_postqueue_isr(acb);
1669 	}
1670 	return;
1671 }
1672 /*
1673 ******************************************************************************
1674 ******************************************************************************
1675 */
1676 static void arcmsr_interrupt(struct AdapterControlBlock *acb)
1677 {
1678 	switch (acb->adapter_type) {
1679 	case ACB_ADAPTER_TYPE_A:
1680 		arcmsr_handle_hba_isr(acb);
1681 		break;
1682 	case ACB_ADAPTER_TYPE_B:
1683 		arcmsr_handle_hbb_isr(acb);
1684 		break;
1685 	case ACB_ADAPTER_TYPE_C:
1686 		arcmsr_handle_hbc_isr(acb);
1687 		break;
1688 	default:
1689 		kprintf("arcmsr%d: interrupt service,"
1690 		" unknow adapter type =%d\n", acb->pci_unit, acb->adapter_type);
1691 		break;
1692 	}
1693 	return;
1694 }
1695 /*
1696 **********************************************************************
1697 **********************************************************************
1698 */
1699 static void arcmsr_intr_handler(void *arg)
1700 {
1701 	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)arg;
1702 
1703 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1704 	arcmsr_interrupt(acb);
1705 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1706 }
1707 /*
1708 ******************************************************************************
1709 ******************************************************************************
1710 */
1711 static void	arcmsr_polling_devmap(void* arg)
1712 {
1713 	struct AdapterControlBlock *acb = (struct AdapterControlBlock *)arg;
1714 	switch (acb->adapter_type) {
1715 	case ACB_ADAPTER_TYPE_A:
1716 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
1717 		break;
1718 
1719 	case ACB_ADAPTER_TYPE_B:
1720 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_MESSAGE_GET_CONFIG);
1721 		break;
1722 
1723 	case ACB_ADAPTER_TYPE_C:
1724 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
1725 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
1726 		break;
1727 	}
1728 
1729 	if((acb->acb_flags & ACB_F_SCSISTOPADAPTER) == 0)
1730 	{
1731 		callout_reset(&acb->devmap_callout, 5 * hz, arcmsr_polling_devmap, acb);	/* polling per 5 seconds */
1732 	}
1733 }
1734 
1735 /*
1736 *******************************************************************************
1737 **
1738 *******************************************************************************
1739 */
1740 static void arcmsr_iop_parking(struct AdapterControlBlock *acb)
1741 {
1742 	u_int32_t intmask_org;
1743 
1744 	if(acb!=NULL) {
1745 		/* stop adapter background rebuild */
1746 		if(acb->acb_flags & ACB_F_MSG_START_BGRB) {
1747 			intmask_org = arcmsr_disable_allintr(acb);
1748 			arcmsr_stop_adapter_bgrb(acb);
1749 			arcmsr_flush_adapter_cache(acb);
1750 			arcmsr_enable_allintr(acb, intmask_org);
1751 		}
1752 	}
1753 }
1754 /*
1755 ***********************************************************************
1756 **
1757 ************************************************************************
1758 */
1759 u_int32_t arcmsr_iop_ioctlcmd(struct AdapterControlBlock *acb, u_int32_t ioctl_cmd, caddr_t arg)
1760 {
1761 	struct CMD_MESSAGE_FIELD * pcmdmessagefld;
1762 	u_int32_t retvalue=EINVAL;
1763 
1764 	pcmdmessagefld=(struct CMD_MESSAGE_FIELD *) arg;
1765 	if(memcmp(pcmdmessagefld->cmdmessage.Signature, "ARCMSR", 6)!=0) {
1766 		return retvalue;
1767 	}
1768 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1769 	switch(ioctl_cmd) {
1770 	case ARCMSR_MESSAGE_READ_RQBUFFER: {
1771 			u_int8_t * pQbuffer;
1772 			u_int8_t * ptmpQbuffer=pcmdmessagefld->messagedatabuffer;
1773 			u_int32_t allxfer_len=0;
1774 
1775 			while((acb->rqbuf_firstindex!=acb->rqbuf_lastindex)
1776 				&& (allxfer_len<1031)) {
1777 				/*copy READ QBUFFER to srb*/
1778 				pQbuffer= &acb->rqbuffer[acb->rqbuf_firstindex];
1779 				memcpy(ptmpQbuffer, pQbuffer, 1);
1780 				acb->rqbuf_firstindex++;
1781 				acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
1782 				/*if last index number set it to 0 */
1783 				ptmpQbuffer++;
1784 				allxfer_len++;
1785 			}
1786 			if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
1787 				struct QBUFFER * prbuffer;
1788 				u_int8_t * iop_data;
1789 				u_int32_t iop_len;
1790 
1791 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1792 				prbuffer=arcmsr_get_iop_rqbuffer(acb);
1793 				iop_data=(u_int8_t *)prbuffer->data;
1794 				iop_len=(u_int32_t)prbuffer->data_len;
1795 				/*this iop data does no chance to make me overflow again here, so just do it*/
1796 				while(iop_len>0) {
1797 					pQbuffer= &acb->rqbuffer[acb->rqbuf_lastindex];
1798 					memcpy(pQbuffer, iop_data, 1);
1799 					acb->rqbuf_lastindex++;
1800 					acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1801 					/*if last index number set it to 0 */
1802 					iop_data++;
1803 					iop_len--;
1804 				}
1805 				arcmsr_iop_message_read(acb);
1806 				/*signature, let IOP know data has been readed */
1807 			}
1808 			pcmdmessagefld->cmdmessage.Length=allxfer_len;
1809 			pcmdmessagefld->cmdmessage.ReturnCode=ARCMSR_MESSAGE_RETURNCODE_OK;
1810 			retvalue=ARCMSR_MESSAGE_SUCCESS;
1811 		}
1812 		break;
1813 	case ARCMSR_MESSAGE_WRITE_WQBUFFER: {
1814 			u_int32_t my_empty_len, user_len, wqbuf_firstindex, wqbuf_lastindex;
1815 			u_int8_t * pQbuffer;
1816 			u_int8_t * ptmpuserbuffer=pcmdmessagefld->messagedatabuffer;
1817 
1818 			user_len=pcmdmessagefld->cmdmessage.Length;
1819 			/*check if data xfer length of this request will overflow my array qbuffer */
1820 			wqbuf_lastindex=acb->wqbuf_lastindex;
1821 			wqbuf_firstindex=acb->wqbuf_firstindex;
1822 			if(wqbuf_lastindex!=wqbuf_firstindex) {
1823 				arcmsr_post_ioctldata2iop(acb);
1824 				pcmdmessagefld->cmdmessage.ReturnCode=ARCMSR_MESSAGE_RETURNCODE_ERROR;
1825 			} else {
1826 				my_empty_len=(wqbuf_firstindex-wqbuf_lastindex-1)&(ARCMSR_MAX_QBUFFER-1);
1827 				if(my_empty_len>=user_len) {
1828 					while(user_len>0) {
1829 						/*copy srb data to wqbuffer*/
1830 						pQbuffer= &acb->wqbuffer[acb->wqbuf_lastindex];
1831 						memcpy(pQbuffer, ptmpuserbuffer, 1);
1832 						acb->wqbuf_lastindex++;
1833 						acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1834 						/*if last index number set it to 0 */
1835 						ptmpuserbuffer++;
1836 						user_len--;
1837 					}
1838 					/*post fist Qbuffer*/
1839 					if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
1840 						acb->acb_flags &=~ACB_F_MESSAGE_WQBUFFER_CLEARED;
1841 						arcmsr_post_ioctldata2iop(acb);
1842 					}
1843 					pcmdmessagefld->cmdmessage.ReturnCode=ARCMSR_MESSAGE_RETURNCODE_OK;
1844 				} else {
1845 					pcmdmessagefld->cmdmessage.ReturnCode=ARCMSR_MESSAGE_RETURNCODE_ERROR;
1846 				}
1847 			}
1848 			retvalue=ARCMSR_MESSAGE_SUCCESS;
1849 		}
1850 		break;
1851 	case ARCMSR_MESSAGE_CLEAR_RQBUFFER: {
1852 			u_int8_t * pQbuffer=acb->rqbuffer;
1853 
1854 			if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
1855 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1856 				arcmsr_iop_message_read(acb);
1857 				/*signature, let IOP know data has been readed */
1858 			}
1859 			acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
1860 			acb->rqbuf_firstindex=0;
1861 			acb->rqbuf_lastindex=0;
1862 			memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
1863 			pcmdmessagefld->cmdmessage.ReturnCode=ARCMSR_MESSAGE_RETURNCODE_OK;
1864 			retvalue=ARCMSR_MESSAGE_SUCCESS;
1865 		}
1866 		break;
1867 	case ARCMSR_MESSAGE_CLEAR_WQBUFFER:
1868 		{
1869 			u_int8_t * pQbuffer=acb->wqbuffer;
1870 
1871 			if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
1872 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1873                 arcmsr_iop_message_read(acb);
1874 				/*signature, let IOP know data has been readed */
1875 			}
1876 			acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED|ACB_F_MESSAGE_WQBUFFER_READ);
1877 			acb->wqbuf_firstindex=0;
1878 			acb->wqbuf_lastindex=0;
1879 			memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
1880 			pcmdmessagefld->cmdmessage.ReturnCode=ARCMSR_MESSAGE_RETURNCODE_OK;
1881 			retvalue=ARCMSR_MESSAGE_SUCCESS;
1882 		}
1883 		break;
1884 	case ARCMSR_MESSAGE_CLEAR_ALLQBUFFER: {
1885 			u_int8_t * pQbuffer;
1886 
1887 			if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
1888 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
1889                 arcmsr_iop_message_read(acb);
1890 				/*signature, let IOP know data has been readed */
1891 			}
1892 			acb->acb_flags  |= (ACB_F_MESSAGE_WQBUFFER_CLEARED
1893 					|ACB_F_MESSAGE_RQBUFFER_CLEARED
1894 					|ACB_F_MESSAGE_WQBUFFER_READ);
1895 			acb->rqbuf_firstindex=0;
1896 			acb->rqbuf_lastindex=0;
1897 			acb->wqbuf_firstindex=0;
1898 			acb->wqbuf_lastindex=0;
1899 			pQbuffer=acb->rqbuffer;
1900 			memset(pQbuffer, 0, sizeof(struct QBUFFER));
1901 			pQbuffer=acb->wqbuffer;
1902 			memset(pQbuffer, 0, sizeof(struct QBUFFER));
1903 			pcmdmessagefld->cmdmessage.ReturnCode=ARCMSR_MESSAGE_RETURNCODE_OK;
1904 			retvalue=ARCMSR_MESSAGE_SUCCESS;
1905 		}
1906 		break;
1907 	case ARCMSR_MESSAGE_REQUEST_RETURNCODE_3F: {
1908 			pcmdmessagefld->cmdmessage.ReturnCode=ARCMSR_MESSAGE_RETURNCODE_3F;
1909 			retvalue=ARCMSR_MESSAGE_SUCCESS;
1910 		}
1911 		break;
1912 	case ARCMSR_MESSAGE_SAY_HELLO: {
1913 			u_int8_t * hello_string="Hello! I am ARCMSR";
1914 			u_int8_t * puserbuffer=(u_int8_t *)pcmdmessagefld->messagedatabuffer;
1915 
1916 			if(memcpy(puserbuffer, hello_string, (int16_t)strlen(hello_string))) {
1917 				pcmdmessagefld->cmdmessage.ReturnCode=ARCMSR_MESSAGE_RETURNCODE_ERROR;
1918 				ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1919 				return ENOIOCTL;
1920 			}
1921 			pcmdmessagefld->cmdmessage.ReturnCode=ARCMSR_MESSAGE_RETURNCODE_OK;
1922 			retvalue=ARCMSR_MESSAGE_SUCCESS;
1923 		}
1924 		break;
1925 	case ARCMSR_MESSAGE_SAY_GOODBYE: {
1926 			arcmsr_iop_parking(acb);
1927 			retvalue=ARCMSR_MESSAGE_SUCCESS;
1928 		}
1929 		break;
1930 	case ARCMSR_MESSAGE_FLUSH_ADAPTER_CACHE: {
1931 			arcmsr_flush_adapter_cache(acb);
1932 			retvalue=ARCMSR_MESSAGE_SUCCESS;
1933 		}
1934 		break;
1935 	}
1936 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1937 	return retvalue;
1938 }
1939 /*
1940 **************************************************************************
1941 **************************************************************************
1942 */
1943 struct CommandControlBlock * arcmsr_get_freesrb(struct AdapterControlBlock *acb)
1944 {
1945 	struct CommandControlBlock *srb=NULL;
1946 	u_int32_t workingsrb_startindex, workingsrb_doneindex;
1947 
1948 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1949 	workingsrb_doneindex=acb->workingsrb_doneindex;
1950 	workingsrb_startindex=acb->workingsrb_startindex;
1951 	srb=acb->srbworkingQ[workingsrb_startindex];
1952 	workingsrb_startindex++;
1953 	workingsrb_startindex %= ARCMSR_MAX_FREESRB_NUM;
1954 	if(workingsrb_doneindex!=workingsrb_startindex) {
1955 		acb->workingsrb_startindex=workingsrb_startindex;
1956 	} else {
1957 		srb=NULL;
1958 	}
1959 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1960 	return(srb);
1961 }
1962 /*
1963 **************************************************************************
1964 **************************************************************************
1965 */
1966 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb * pccb)
1967 {
1968 	struct CMD_MESSAGE_FIELD * pcmdmessagefld;
1969 	int retvalue = 0, transfer_len = 0;
1970 	char *buffer;
1971 	u_int32_t controlcode = (u_int32_t ) pccb->csio.cdb_io.cdb_bytes[5] << 24 |
1972 				(u_int32_t ) pccb->csio.cdb_io.cdb_bytes[6] << 16 |
1973 				(u_int32_t ) pccb->csio.cdb_io.cdb_bytes[7] << 8  |
1974 				(u_int32_t ) pccb->csio.cdb_io.cdb_bytes[8];
1975 					/* 4 bytes: Areca io control code */
1976 	if((pccb->ccb_h.flags & CAM_SCATTER_VALID) == 0) {
1977 		buffer = pccb->csio.data_ptr;
1978 		transfer_len = pccb->csio.dxfer_len;
1979 	} else {
1980 		retvalue = ARCMSR_MESSAGE_FAIL;
1981 		goto message_out;
1982 	}
1983 	if (transfer_len > sizeof(struct CMD_MESSAGE_FIELD)) {
1984 		retvalue = ARCMSR_MESSAGE_FAIL;
1985 		goto message_out;
1986 	}
1987 	pcmdmessagefld = (struct CMD_MESSAGE_FIELD *) buffer;
1988 	switch(controlcode) {
1989 	case ARCMSR_MESSAGE_READ_RQBUFFER: {
1990 			u_int8_t *pQbuffer;
1991 			u_int8_t *ptmpQbuffer=pcmdmessagefld->messagedatabuffer;
1992 			int32_t allxfer_len = 0;
1993 
1994 			while ((acb->rqbuf_firstindex != acb->rqbuf_lastindex)
1995 				&& (allxfer_len < 1031)) {
1996 				pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex];
1997 				memcpy(ptmpQbuffer, pQbuffer, 1);
1998 				acb->rqbuf_firstindex++;
1999 				acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
2000 				ptmpQbuffer++;
2001 				allxfer_len++;
2002 			}
2003 			if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2004 				struct QBUFFER  *prbuffer;
2005 				u_int8_t  *iop_data;
2006 				int32_t iop_len;
2007 
2008 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2009 				prbuffer=arcmsr_get_iop_rqbuffer(acb);
2010 				iop_data = (u_int8_t *)prbuffer->data;
2011 				iop_len =(u_int32_t)prbuffer->data_len;
2012 				while (iop_len > 0) {
2013 			        pQbuffer= &acb->rqbuffer[acb->rqbuf_lastindex];
2014 					memcpy(pQbuffer, iop_data, 1);
2015 					acb->rqbuf_lastindex++;
2016 					acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
2017 					iop_data++;
2018 					iop_len--;
2019 				}
2020 				arcmsr_iop_message_read(acb);
2021 			}
2022 			pcmdmessagefld->cmdmessage.Length = allxfer_len;
2023 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2024 			retvalue=ARCMSR_MESSAGE_SUCCESS;
2025 		}
2026 		break;
2027 	case ARCMSR_MESSAGE_WRITE_WQBUFFER: {
2028 			int32_t my_empty_len, user_len, wqbuf_firstindex, wqbuf_lastindex;
2029 			u_int8_t *pQbuffer;
2030 			u_int8_t *ptmpuserbuffer=pcmdmessagefld->messagedatabuffer;
2031 
2032 			user_len = pcmdmessagefld->cmdmessage.Length;
2033 			wqbuf_lastindex = acb->wqbuf_lastindex;
2034 			wqbuf_firstindex = acb->wqbuf_firstindex;
2035 			if (wqbuf_lastindex != wqbuf_firstindex) {
2036 				arcmsr_post_ioctldata2iop(acb);
2037 				/* has error report sensedata */
2038 			    if(&pccb->csio.sense_data) {
2039 				((u_int8_t *)&pccb->csio.sense_data)[0] = (0x1 << 7 | 0x70);
2040 				/* Valid,ErrorCode */
2041 				((u_int8_t *)&pccb->csio.sense_data)[2] = 0x05;
2042 				/* FileMark,EndOfMedia,IncorrectLength,Reserved,SenseKey */
2043 				((u_int8_t *)&pccb->csio.sense_data)[7] = 0x0A;
2044 				/* AdditionalSenseLength */
2045 				((u_int8_t *)&pccb->csio.sense_data)[12] = 0x20;
2046 				/* AdditionalSenseCode */
2047 				}
2048 				retvalue = ARCMSR_MESSAGE_FAIL;
2049 			} else {
2050 				my_empty_len = (wqbuf_firstindex-wqbuf_lastindex - 1)
2051 						&(ARCMSR_MAX_QBUFFER - 1);
2052 				if (my_empty_len >= user_len) {
2053 					while (user_len > 0) {
2054 						pQbuffer = &acb->wqbuffer[acb->wqbuf_lastindex];
2055 						memcpy(pQbuffer, ptmpuserbuffer, 1);
2056 						acb->wqbuf_lastindex++;
2057 						acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
2058 						ptmpuserbuffer++;
2059 						user_len--;
2060 					}
2061 					if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
2062 						acb->acb_flags &=
2063 						~ACB_F_MESSAGE_WQBUFFER_CLEARED;
2064 						arcmsr_post_ioctldata2iop(acb);
2065 					}
2066 				} else {
2067 					/* has error report sensedata */
2068 					if(&pccb->csio.sense_data) {
2069 					((u_int8_t *)&pccb->csio.sense_data)[0] = (0x1 << 7 | 0x70);
2070 					/* Valid,ErrorCode */
2071 					((u_int8_t *)&pccb->csio.sense_data)[2] = 0x05;
2072 					/* FileMark,EndOfMedia,IncorrectLength,Reserved,SenseKey */
2073 					((u_int8_t *)&pccb->csio.sense_data)[7] = 0x0A;
2074 					/* AdditionalSenseLength */
2075 					((u_int8_t *)&pccb->csio.sense_data)[12] = 0x20;
2076 					/* AdditionalSenseCode */
2077 					}
2078 					retvalue = ARCMSR_MESSAGE_FAIL;
2079 				}
2080 			}
2081 		}
2082 		break;
2083 	case ARCMSR_MESSAGE_CLEAR_RQBUFFER: {
2084 			u_int8_t *pQbuffer = acb->rqbuffer;
2085 
2086 			if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2087 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2088 				arcmsr_iop_message_read(acb);
2089 			}
2090 			acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
2091 			acb->rqbuf_firstindex = 0;
2092 			acb->rqbuf_lastindex = 0;
2093 			memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
2094 			pcmdmessagefld->cmdmessage.ReturnCode =
2095 			ARCMSR_MESSAGE_RETURNCODE_OK;
2096 		}
2097 		break;
2098 	case ARCMSR_MESSAGE_CLEAR_WQBUFFER: {
2099 			u_int8_t *pQbuffer = acb->wqbuffer;
2100 
2101 			if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2102 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2103 				arcmsr_iop_message_read(acb);
2104 			}
2105 			acb->acb_flags |=
2106 				(ACB_F_MESSAGE_WQBUFFER_CLEARED |
2107 					ACB_F_MESSAGE_WQBUFFER_READ);
2108 			acb->wqbuf_firstindex = 0;
2109 			acb->wqbuf_lastindex = 0;
2110 			memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
2111 			pcmdmessagefld->cmdmessage.ReturnCode =
2112 				ARCMSR_MESSAGE_RETURNCODE_OK;
2113 		}
2114 		break;
2115 	case ARCMSR_MESSAGE_CLEAR_ALLQBUFFER: {
2116 			u_int8_t *pQbuffer;
2117 
2118 			if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2119 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2120 				arcmsr_iop_message_read(acb);
2121 			}
2122 			acb->acb_flags |=
2123 				(ACB_F_MESSAGE_WQBUFFER_CLEARED
2124 				| ACB_F_MESSAGE_RQBUFFER_CLEARED
2125 				| ACB_F_MESSAGE_WQBUFFER_READ);
2126 			acb->rqbuf_firstindex = 0;
2127 			acb->rqbuf_lastindex = 0;
2128 			acb->wqbuf_firstindex = 0;
2129 			acb->wqbuf_lastindex = 0;
2130 			pQbuffer = acb->rqbuffer;
2131 			memset(pQbuffer, 0, sizeof (struct QBUFFER));
2132 			pQbuffer = acb->wqbuffer;
2133 			memset(pQbuffer, 0, sizeof (struct QBUFFER));
2134 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2135 		}
2136 		break;
2137 	case ARCMSR_MESSAGE_REQUEST_RETURNCODE_3F: {
2138 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_3F;
2139 		}
2140 		break;
2141 	case ARCMSR_MESSAGE_SAY_HELLO: {
2142 			int8_t * hello_string = "Hello! I am ARCMSR";
2143 
2144 			memcpy(pcmdmessagefld->messagedatabuffer, hello_string
2145 				, (int16_t)strlen(hello_string));
2146 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2147 		}
2148 		break;
2149 	case ARCMSR_MESSAGE_SAY_GOODBYE:
2150 		arcmsr_iop_parking(acb);
2151 		break;
2152 	case ARCMSR_MESSAGE_FLUSH_ADAPTER_CACHE:
2153 		arcmsr_flush_adapter_cache(acb);
2154 		break;
2155 	default:
2156 		retvalue = ARCMSR_MESSAGE_FAIL;
2157 	}
2158 message_out:
2159 	return retvalue;
2160 }
2161 /*
2162 *********************************************************************
2163 *********************************************************************
2164 */
2165 static void arcmsr_execute_srb(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error)
2166 {
2167 	struct CommandControlBlock *srb=(struct CommandControlBlock *)arg;
2168 	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)srb->acb;
2169 	union ccb * pccb;
2170 	int target, lun;
2171 
2172 	pccb=srb->pccb;
2173 	target=pccb->ccb_h.target_id;
2174 	lun=pccb->ccb_h.target_lun;
2175 	if(error != 0) {
2176 		if(error != EFBIG) {
2177 			kprintf("arcmsr%d: unexpected error %x"
2178 				" returned from 'bus_dmamap_load' \n"
2179 				, acb->pci_unit, error);
2180 		}
2181 		if((pccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG) {
2182 			pccb->ccb_h.status |= CAM_REQ_TOO_BIG;
2183 		}
2184 		arcmsr_srb_complete(srb, 0);
2185 		return;
2186 	}
2187 	if(nseg > ARCMSR_MAX_SG_ENTRIES) {
2188 		pccb->ccb_h.status |= CAM_REQ_TOO_BIG;
2189 		arcmsr_srb_complete(srb, 0);
2190 		return;
2191 	}
2192 	if(acb->acb_flags & ACB_F_BUS_RESET) {
2193 		kprintf("arcmsr%d: bus reset and return busy \n", acb->pci_unit);
2194 		pccb->ccb_h.status |= CAM_SCSI_BUS_RESET;
2195 		arcmsr_srb_complete(srb, 0);
2196 		return;
2197 	}
2198 	if(acb->devstate[target][lun]==ARECA_RAID_GONE) {
2199 		u_int8_t block_cmd;
2200 
2201 		block_cmd=pccb->csio.cdb_io.cdb_bytes[0] & 0x0f;
2202 		if(block_cmd==0x08 || block_cmd==0x0a) {
2203 			kprintf("arcmsr%d:block 'read/write' command "
2204 				"with gone raid volume Cmd=%2x, TargetId=%d, Lun=%d \n"
2205 				, acb->pci_unit, block_cmd, target, lun);
2206 			pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
2207 			arcmsr_srb_complete(srb, 0);
2208 			return;
2209 		}
2210 	}
2211 	if((pccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_INPROG) {
2212 		if(nseg != 0) {
2213 			bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap);
2214 		}
2215 		arcmsr_srb_complete(srb, 0);
2216 		return;
2217 	}
2218 	if(acb->srboutstandingcount >= ARCMSR_MAX_OUTSTANDING_CMD) {
2219 		xpt_freeze_simq(acb->psim, 1);
2220 		pccb->ccb_h.status = CAM_REQUEUE_REQ;
2221 		acb->acb_flags |= ACB_F_CAM_DEV_QFRZN;
2222 		arcmsr_srb_complete(srb, 0);
2223 		return;
2224 	}
2225 	pccb->ccb_h.status |= CAM_SIM_QUEUED;
2226 	arcmsr_build_srb(srb, dm_segs, nseg);
2227 /*	if (pccb->ccb_h.timeout != CAM_TIME_INFINITY)
2228 		callout_reset(&srb->ccb_callout, (pccb->ccb_h.timeout * hz) / 1000, arcmsr_srb_timeout, srb);
2229 */
2230 	arcmsr_post_srb(acb, srb);
2231 	return;
2232 }
2233 /*
2234 *****************************************************************************************
2235 *****************************************************************************************
2236 */
2237 static u_int8_t arcmsr_seek_cmd2abort(union ccb * abortccb)
2238 {
2239 	struct CommandControlBlock *srb;
2240 	struct AdapterControlBlock *acb=(struct AdapterControlBlock *) abortccb->ccb_h.arcmsr_ccbacb_ptr;
2241 	u_int32_t intmask_org;
2242 	int i=0;
2243 
2244 	acb->num_aborts++;
2245 	/*
2246 	***************************************************************************
2247 	** It is the upper layer do abort command this lock just prior to calling us.
2248 	** First determine if we currently own this command.
2249 	** Start by searching the device queue. If not found
2250 	** at all, and the system wanted us to just abort the
2251 	** command return success.
2252 	***************************************************************************
2253 	*/
2254 	if(acb->srboutstandingcount!=0) {
2255 		for(i=0;i<ARCMSR_MAX_FREESRB_NUM;i++) {
2256 			srb=acb->psrb_pool[i];
2257 			if(srb->startdone==ARCMSR_SRB_START) {
2258 				if(srb->pccb==abortccb) {
2259 					srb->startdone=ARCMSR_SRB_ABORTED;
2260 					kprintf("arcmsr%d:scsi id=%d lun=%d abort srb '%p'"
2261 						"outstanding command \n"
2262 						, acb->pci_unit, abortccb->ccb_h.target_id
2263 						, abortccb->ccb_h.target_lun, srb);
2264 					goto abort_outstanding_cmd;
2265 				}
2266 			}
2267 		}
2268 	}
2269 	return(FALSE);
2270 abort_outstanding_cmd:
2271 	/* disable all outbound interrupt */
2272 	intmask_org=arcmsr_disable_allintr(acb);
2273 	arcmsr_polling_srbdone(acb, srb);
2274 	/* enable outbound Post Queue, outbound doorbell Interrupt */
2275 	arcmsr_enable_allintr(acb, intmask_org);
2276 	return (TRUE);
2277 }
2278 /*
2279 ****************************************************************************
2280 ****************************************************************************
2281 */
2282 static void arcmsr_bus_reset(struct AdapterControlBlock *acb)
2283 {
2284 	int retry=0;
2285 
2286 	acb->num_resets++;
2287 	acb->acb_flags |=ACB_F_BUS_RESET;
2288 	while(acb->srboutstandingcount!=0 && retry < 400) {
2289 		arcmsr_interrupt(acb);
2290 		UDELAY(25000);
2291 		retry++;
2292 	}
2293 	arcmsr_iop_reset(acb);
2294 	acb->acb_flags &= ~ACB_F_BUS_RESET;
2295 	return;
2296 }
2297 /*
2298 **************************************************************************
2299 **************************************************************************
2300 */
2301 static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb,
2302 		union ccb * pccb)
2303 {
2304 	pccb->ccb_h.status |= CAM_REQ_CMP;
2305 	switch (pccb->csio.cdb_io.cdb_bytes[0]) {
2306 	case INQUIRY: {
2307 		unsigned char inqdata[36];
2308 		char *buffer=pccb->csio.data_ptr;
2309 
2310 		if (pccb->ccb_h.target_lun) {
2311 			pccb->ccb_h.status |= CAM_SEL_TIMEOUT;
2312 			xpt_done(pccb);
2313 			return;
2314 		}
2315 		inqdata[0] = T_PROCESSOR;	/* Periph Qualifier & Periph Dev Type */
2316 		inqdata[1] = 0;				/* rem media bit & Dev Type Modifier */
2317 		inqdata[2] = 0;				/* ISO, ECMA, & ANSI versions */
2318 		inqdata[3] = 0;
2319 		inqdata[4] = 31;			/* length of additional data */
2320 		inqdata[5] = 0;
2321 		inqdata[6] = 0;
2322 		inqdata[7] = 0;
2323 		strncpy(&inqdata[8], "Areca   ", 8);	/* Vendor Identification */
2324 		strncpy(&inqdata[16], "RAID controller ", 16);	/* Product Identification */
2325 		strncpy(&inqdata[32], "R001", 4); /* Product Revision */
2326 		memcpy(buffer, inqdata, sizeof(inqdata));
2327 		xpt_done(pccb);
2328 	}
2329 	break;
2330 	case WRITE_BUFFER:
2331 	case READ_BUFFER: {
2332 		if (arcmsr_iop_message_xfer(acb, pccb)) {
2333 			pccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR;
2334 			pccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
2335 		}
2336 		xpt_done(pccb);
2337 	}
2338 	break;
2339 	default:
2340 		xpt_done(pccb);
2341 	}
2342 }
2343 /*
2344 *********************************************************************
2345 *********************************************************************
2346 */
2347 static void arcmsr_action(struct cam_sim * psim, union ccb * pccb)
2348 {
2349 	struct AdapterControlBlock *  acb;
2350 
2351 	acb=(struct AdapterControlBlock *) cam_sim_softc(psim);
2352 	if(acb==NULL) {
2353 		pccb->ccb_h.status |= CAM_REQ_INVALID;
2354 		xpt_done(pccb);
2355 		return;
2356 	}
2357 	switch (pccb->ccb_h.func_code) {
2358 	case XPT_SCSI_IO: {
2359 			struct CommandControlBlock *srb;
2360 			int target=pccb->ccb_h.target_id;
2361 
2362 			if(target == 16) {
2363 				/* virtual device for iop message transfer */
2364 				arcmsr_handle_virtual_command(acb, pccb);
2365 				return;
2366 			}
2367 			if((srb=arcmsr_get_freesrb(acb)) == NULL) {
2368 				pccb->ccb_h.status |= CAM_RESRC_UNAVAIL;
2369 				xpt_done(pccb);
2370 				return;
2371 			}
2372 			pccb->ccb_h.arcmsr_ccbsrb_ptr=srb;
2373 			pccb->ccb_h.arcmsr_ccbacb_ptr=acb;
2374 			srb->pccb=pccb;
2375 			if((pccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
2376 				if(!(pccb->ccb_h.flags & CAM_SCATTER_VALID)) {
2377 					/* Single buffer */
2378 					if(!(pccb->ccb_h.flags & CAM_DATA_PHYS)) {
2379 						/* Buffer is virtual */
2380 						u_int32_t error;
2381 
2382 						crit_enter();
2383 						error =	bus_dmamap_load(acb->dm_segs_dmat
2384 							, srb->dm_segs_dmamap
2385 							, pccb->csio.data_ptr
2386 							, pccb->csio.dxfer_len
2387 							, arcmsr_execute_srb, srb, /*flags*/0);
2388 						if(error == EINPROGRESS) {
2389 							xpt_freeze_simq(acb->psim, 1);
2390 							pccb->ccb_h.status |= CAM_RELEASE_SIMQ;
2391 						}
2392 						crit_exit();
2393 					}
2394 					else {		/* Buffer is physical */
2395 						struct bus_dma_segment seg;
2396 
2397 						seg.ds_addr = (bus_addr_t)pccb->csio.data_ptr;
2398 						seg.ds_len = pccb->csio.dxfer_len;
2399 						arcmsr_execute_srb(srb, &seg, 1, 0);
2400 					}
2401 				} else {
2402 					/* Scatter/gather list */
2403 					struct bus_dma_segment *segs;
2404 
2405 					if((pccb->ccb_h.flags & CAM_SG_LIST_PHYS) == 0
2406 					|| (pccb->ccb_h.flags & CAM_DATA_PHYS) != 0) {
2407 						pccb->ccb_h.status |= CAM_PROVIDE_FAIL;
2408 						xpt_done(pccb);
2409 						kfree(srb, M_DEVBUF);
2410 						return;
2411 					}
2412 					segs=(struct bus_dma_segment *)pccb->csio.data_ptr;
2413 					arcmsr_execute_srb(srb, segs, pccb->csio.sglist_cnt, 0);
2414 				}
2415 			} else {
2416 				arcmsr_execute_srb(srb, NULL, 0, 0);
2417 			}
2418 			break;
2419 		}
2420 	case XPT_TARGET_IO: {
2421 			/* target mode not yet support vendor specific commands. */
2422 			pccb->ccb_h.status |= CAM_REQ_CMP;
2423 			xpt_done(pccb);
2424 			break;
2425 		}
2426 	case XPT_PATH_INQ: {
2427 			struct ccb_pathinq *cpi= &pccb->cpi;
2428 
2429 			cpi->version_num=1;
2430 			cpi->hba_inquiry=PI_SDTR_ABLE | PI_TAG_ABLE;
2431 			cpi->target_sprt=0;
2432 			cpi->hba_misc=0;
2433 			cpi->hba_eng_cnt=0;
2434 			cpi->max_target=ARCMSR_MAX_TARGETID;        /* 0-16 */
2435 			cpi->max_lun=ARCMSR_MAX_TARGETLUN;	    /* 0-7 */
2436 			cpi->initiator_id=ARCMSR_SCSI_INITIATOR_ID; /* 255 */
2437 			cpi->bus_id=cam_sim_bus(psim);
2438 			strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
2439 			strncpy(cpi->hba_vid, "ARCMSR", HBA_IDLEN);
2440 			strncpy(cpi->dev_name, cam_sim_name(psim), DEV_IDLEN);
2441 			cpi->unit_number=cam_sim_unit(psim);
2442 		#ifdef	CAM_NEW_TRAN_CODE
2443 			cpi->transport = XPORT_SPI;
2444 			cpi->transport_version = 2;
2445 			cpi->protocol = PROTO_SCSI;
2446 			cpi->protocol_version = SCSI_REV_2;
2447 		#endif
2448 			cpi->ccb_h.status |= CAM_REQ_CMP;
2449 			xpt_done(pccb);
2450 			break;
2451 		}
2452 	case XPT_ABORT: {
2453 			union ccb *pabort_ccb;
2454 
2455 			pabort_ccb=pccb->cab.abort_ccb;
2456 			switch (pabort_ccb->ccb_h.func_code) {
2457 			case XPT_ACCEPT_TARGET_IO:
2458 			case XPT_IMMED_NOTIFY:
2459 			case XPT_CONT_TARGET_IO:
2460 				if(arcmsr_seek_cmd2abort(pabort_ccb)==TRUE) {
2461 					pabort_ccb->ccb_h.status |= CAM_REQ_ABORTED;
2462 					xpt_done(pabort_ccb);
2463 					pccb->ccb_h.status |= CAM_REQ_CMP;
2464 				} else {
2465 					xpt_print_path(pabort_ccb->ccb_h.path);
2466 					kprintf("Not found\n");
2467 					pccb->ccb_h.status |= CAM_PATH_INVALID;
2468 				}
2469 				break;
2470 			case XPT_SCSI_IO:
2471 				pccb->ccb_h.status |= CAM_UA_ABORT;
2472 				break;
2473 			default:
2474 				pccb->ccb_h.status |= CAM_REQ_INVALID;
2475 				break;
2476 			}
2477 			xpt_done(pccb);
2478 			break;
2479 		}
2480 	case XPT_RESET_BUS:
2481 	case XPT_RESET_DEV: {
2482 			u_int32_t     i;
2483 
2484 			arcmsr_bus_reset(acb);
2485 			for (i=0; i < 500; i++) {
2486 				DELAY(1000);
2487 			}
2488 			pccb->ccb_h.status |= CAM_REQ_CMP;
2489 			xpt_done(pccb);
2490 			break;
2491 		}
2492 	case XPT_TERM_IO: {
2493 			pccb->ccb_h.status |= CAM_REQ_INVALID;
2494 			xpt_done(pccb);
2495 			break;
2496 		}
2497 	case XPT_GET_TRAN_SETTINGS: {
2498 			struct ccb_trans_settings *cts;
2499 
2500 			if(pccb->ccb_h.target_id == 16) {
2501 				pccb->ccb_h.status |= CAM_FUNC_NOTAVAIL;
2502 				xpt_done(pccb);
2503 				break;
2504 			}
2505 			cts= &pccb->cts;
2506 		#ifdef	CAM_NEW_TRAN_CODE
2507 			{
2508 				struct ccb_trans_settings_scsi *scsi;
2509 				struct ccb_trans_settings_spi *spi;
2510 
2511 				scsi = &cts->proto_specific.scsi;
2512 				spi = &cts->xport_specific.spi;
2513 				cts->protocol = PROTO_SCSI;
2514 				cts->protocol_version = SCSI_REV_2;
2515 				cts->transport = XPORT_SPI;
2516 				cts->transport_version = 2;
2517 				spi->flags = CTS_SPI_FLAGS_DISC_ENB;
2518 				spi->sync_period=3;
2519 				spi->sync_offset=32;
2520 				spi->bus_width=MSG_EXT_WDTR_BUS_16_BIT;
2521 				scsi->flags = CTS_SCSI_FLAGS_TAG_ENB;
2522 				spi->valid = CTS_SPI_VALID_DISC
2523 					| CTS_SPI_VALID_SYNC_RATE
2524 					| CTS_SPI_VALID_SYNC_OFFSET
2525 					| CTS_SPI_VALID_BUS_WIDTH;
2526 				scsi->valid = CTS_SCSI_VALID_TQ;
2527 			}
2528 		#else
2529 			{
2530 				cts->flags=(CCB_TRANS_DISC_ENB | CCB_TRANS_TAG_ENB);
2531 				cts->sync_period=3;
2532 				cts->sync_offset=32;
2533 				cts->bus_width=MSG_EXT_WDTR_BUS_16_BIT;
2534 				cts->valid=CCB_TRANS_SYNC_RATE_VALID |
2535 				CCB_TRANS_SYNC_OFFSET_VALID |
2536 				CCB_TRANS_BUS_WIDTH_VALID |
2537 				CCB_TRANS_DISC_VALID |
2538 				CCB_TRANS_TQ_VALID;
2539 			}
2540 		#endif
2541 			pccb->ccb_h.status |= CAM_REQ_CMP;
2542 			xpt_done(pccb);
2543 			break;
2544 		}
2545 	case XPT_SET_TRAN_SETTINGS: {
2546 			pccb->ccb_h.status |= CAM_FUNC_NOTAVAIL;
2547 			xpt_done(pccb);
2548 			break;
2549 		}
2550 	case XPT_CALC_GEOMETRY: {
2551 			struct ccb_calc_geometry *ccg;
2552 			u_int32_t size_mb;
2553 			u_int32_t secs_per_cylinder;
2554 
2555 			if(pccb->ccb_h.target_id == 16) {
2556 				pccb->ccb_h.status |= CAM_FUNC_NOTAVAIL;
2557 				xpt_done(pccb);
2558 				break;
2559 			}
2560 			ccg= &pccb->ccg;
2561 			if (ccg->block_size == 0) {
2562 				pccb->ccb_h.status = CAM_REQ_INVALID;
2563 				xpt_done(pccb);
2564 				break;
2565 			}
2566 			if(((1024L * 1024L)/ccg->block_size) < 0) {
2567 				pccb->ccb_h.status = CAM_REQ_INVALID;
2568 				xpt_done(pccb);
2569 				break;
2570 			}
2571 			size_mb=ccg->volume_size/((1024L * 1024L)/ccg->block_size);
2572 			if(size_mb > 1024 ) {
2573 				ccg->heads=255;
2574 				ccg->secs_per_track=63;
2575 			} else {
2576 				ccg->heads=64;
2577 				ccg->secs_per_track=32;
2578 			}
2579 			secs_per_cylinder=ccg->heads * ccg->secs_per_track;
2580 			ccg->cylinders=ccg->volume_size / secs_per_cylinder;
2581 			pccb->ccb_h.status |= CAM_REQ_CMP;
2582 			xpt_done(pccb);
2583 			break;
2584 		}
2585 	default:
2586 		pccb->ccb_h.status |= CAM_REQ_INVALID;
2587 		xpt_done(pccb);
2588 		break;
2589 	}
2590 	return;
2591 }
2592 /*
2593 **********************************************************************
2594 **********************************************************************
2595 */
2596 static void arcmsr_start_hba_bgrb(struct AdapterControlBlock *acb)
2597 {
2598 	acb->acb_flags |= ACB_F_MSG_START_BGRB;
2599 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_START_BGRB);
2600 	if(!arcmsr_hba_wait_msgint_ready(acb)) {
2601 		kprintf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
2602 	}
2603 	return;
2604 }
2605 /*
2606 **********************************************************************
2607 **********************************************************************
2608 */
2609 static void arcmsr_start_hbb_bgrb(struct AdapterControlBlock *acb)
2610 {
2611 	acb->acb_flags |= ACB_F_MSG_START_BGRB;
2612 	CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell,  ARCMSR_MESSAGE_START_BGRB);
2613 	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
2614 		kprintf( "arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
2615 	}
2616 	return;
2617 }
2618 /*
2619 **********************************************************************
2620 **********************************************************************
2621 */
2622 static void arcmsr_start_hbc_bgrb(struct AdapterControlBlock *acb)
2623 {
2624 	acb->acb_flags |= ACB_F_MSG_START_BGRB;
2625 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_START_BGRB);
2626 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
2627 	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
2628 		kprintf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
2629 	}
2630 	return;
2631 }
2632 /*
2633 **********************************************************************
2634 **********************************************************************
2635 */
2636 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb)
2637 {
2638 	switch (acb->adapter_type) {
2639 	case ACB_ADAPTER_TYPE_A:
2640 		arcmsr_start_hba_bgrb(acb);
2641 		break;
2642 	case ACB_ADAPTER_TYPE_B:
2643 		arcmsr_start_hbb_bgrb(acb);
2644 		break;
2645 	case ACB_ADAPTER_TYPE_C:
2646 		arcmsr_start_hbc_bgrb(acb);
2647 		break;
2648 	}
2649 	return;
2650 }
2651 /*
2652 **********************************************************************
2653 **
2654 **********************************************************************
2655 */
2656 static void arcmsr_polling_hba_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
2657 {
2658 	struct CommandControlBlock *srb;
2659 	u_int32_t flag_srb, outbound_intstatus, poll_srb_done=0, poll_count=0;
2660 	u_int16_t	error;
2661 
2662 polling_ccb_retry:
2663 	poll_count++;
2664 	outbound_intstatus=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
2665 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intstatus);	/*clear interrupt*/
2666 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
2667 	while(1) {
2668 		if((flag_srb=CHIP_REG_READ32(HBA_MessageUnit,
2669 			0, outbound_queueport))==0xFFFFFFFF) {
2670 			if(poll_srb_done) {
2671 				break;/*chip FIFO no ccb for completion already*/
2672 			} else {
2673 				UDELAY(25000);
2674 				if ((poll_count > 100) && (poll_srb != NULL)) {
2675 					break;
2676 				}
2677 				goto polling_ccb_retry;
2678 			}
2679 		}
2680 		/* check if command done with no error*/
2681 		srb=(struct CommandControlBlock *)
2682 			(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
2683         error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
2684 		poll_srb_done = (srb==poll_srb) ? 1:0;
2685 		if((srb->acb!=acb) || (srb->startdone!=ARCMSR_SRB_START)) {
2686 			if(srb->startdone==ARCMSR_SRB_ABORTED) {
2687 				kprintf("arcmsr%d: scsi id=%d lun=%d srb='%p'"
2688 					"poll command abort successfully \n"
2689 					, acb->pci_unit
2690 					, srb->pccb->ccb_h.target_id
2691 					, srb->pccb->ccb_h.target_lun, srb);
2692 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
2693 				arcmsr_srb_complete(srb, 1);
2694 				continue;
2695 			}
2696 			kprintf("arcmsr%d: polling get an illegal srb command done srb='%p'"
2697 				"srboutstandingcount=%d \n"
2698 				, acb->pci_unit
2699 				, srb, acb->srboutstandingcount);
2700 			continue;
2701 		}
2702 		arcmsr_report_srb_state(acb, srb, error);
2703 	}	/*drain reply FIFO*/
2704 	return;
2705 }
2706 /*
2707 **********************************************************************
2708 **
2709 **********************************************************************
2710 */
2711 static void arcmsr_polling_hbb_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
2712 {
2713 	struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
2714 	struct CommandControlBlock *srb;
2715 	u_int32_t flag_srb, poll_srb_done=0, poll_count=0;
2716 	int index;
2717 	u_int16_t	error;
2718 
2719 polling_ccb_retry:
2720 	poll_count++;
2721 	CHIP_REG_WRITE32(HBB_DOORBELL,
2722 	0, iop2drv_doorbell, ARCMSR_DOORBELL_INT_CLEAR_PATTERN); /* clear doorbell interrupt */
2723 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
2724 	while(1) {
2725 		index=phbbmu->doneq_index;
2726 		if((flag_srb=phbbmu->done_qbuffer[index]) == 0) {
2727 			if(poll_srb_done) {
2728 				break;/*chip FIFO no ccb for completion already*/
2729 			} else {
2730 				UDELAY(25000);
2731 			    if ((poll_count > 100) && (poll_srb != NULL)) {
2732 					break;
2733 				}
2734 				goto polling_ccb_retry;
2735 			}
2736 		}
2737 		phbbmu->done_qbuffer[index]=0;
2738 		index++;
2739 		index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
2740 		phbbmu->doneq_index=index;
2741 		/* check if command done with no error*/
2742 		srb=(struct CommandControlBlock *)
2743 			(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
2744         error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
2745 		poll_srb_done = (srb==poll_srb) ? 1:0;
2746 		if((srb->acb!=acb) || (srb->startdone!=ARCMSR_SRB_START)) {
2747 			if(srb->startdone==ARCMSR_SRB_ABORTED) {
2748 				kprintf("arcmsr%d: scsi id=%d lun=%d srb='%p'"
2749 					"poll command abort successfully \n"
2750 					, acb->pci_unit
2751 					, srb->pccb->ccb_h.target_id
2752 					, srb->pccb->ccb_h.target_lun, srb);
2753 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
2754 				arcmsr_srb_complete(srb, 1);
2755 				continue;
2756 			}
2757 			kprintf("arcmsr%d: polling get an illegal srb command done srb='%p'"
2758 				"srboutstandingcount=%d \n"
2759 				, acb->pci_unit
2760 				, srb, acb->srboutstandingcount);
2761 			continue;
2762 		}
2763 		arcmsr_report_srb_state(acb, srb, error);
2764 	}	/*drain reply FIFO*/
2765 	return;
2766 }
2767 /*
2768 **********************************************************************
2769 **
2770 **********************************************************************
2771 */
2772 static void arcmsr_polling_hbc_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
2773 {
2774 	struct CommandControlBlock *srb;
2775 	u_int32_t flag_srb, poll_srb_done=0, poll_count=0;
2776 	u_int16_t	error;
2777 
2778 polling_ccb_retry:
2779 	poll_count++;
2780 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
2781 	while(1) {
2782 		if(!(CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR)) {
2783 			if(poll_srb_done) {
2784 				break;/*chip FIFO no ccb for completion already*/
2785 			} else {
2786 				UDELAY(25000);
2787 			    if ((poll_count > 100) && (poll_srb != NULL)) {
2788 					break;
2789 				}
2790 			    if (acb->srboutstandingcount == 0) {
2791 				    break;
2792 			    }
2793 				goto polling_ccb_retry;
2794 			}
2795 		}
2796 		flag_srb = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
2797 		/* check if command done with no error*/
2798 		srb=(struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFF0));/*frame must be 32 bytes aligned*/
2799         error=(flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
2800 		if (poll_srb != NULL)
2801 			poll_srb_done = (srb==poll_srb) ? 1:0;
2802 		if((srb->acb!=acb) || (srb->startdone!=ARCMSR_SRB_START)) {
2803 			if(srb->startdone==ARCMSR_SRB_ABORTED) {
2804 				kprintf("arcmsr%d: scsi id=%d lun=%d srb='%p'poll command abort successfully \n"
2805 						, acb->pci_unit, srb->pccb->ccb_h.target_id, srb->pccb->ccb_h.target_lun, srb);
2806 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
2807 				arcmsr_srb_complete(srb, 1);
2808 				continue;
2809 			}
2810 			kprintf("arcmsr%d: polling get an illegal srb command done srb='%p'srboutstandingcount=%d \n"
2811 					, acb->pci_unit, srb, acb->srboutstandingcount);
2812 			continue;
2813 		}
2814 		arcmsr_report_srb_state(acb, srb, error);
2815 	}	/*drain reply FIFO*/
2816 	return;
2817 }
2818 /*
2819 **********************************************************************
2820 **********************************************************************
2821 */
2822 static void arcmsr_polling_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
2823 {
2824 	switch (acb->adapter_type) {
2825 	case ACB_ADAPTER_TYPE_A: {
2826 			arcmsr_polling_hba_srbdone(acb, poll_srb);
2827 		}
2828 		break;
2829 	case ACB_ADAPTER_TYPE_B: {
2830 			arcmsr_polling_hbb_srbdone(acb, poll_srb);
2831 		}
2832 		break;
2833 	case ACB_ADAPTER_TYPE_C: {
2834 			arcmsr_polling_hbc_srbdone(acb, poll_srb);
2835 		}
2836 		break;
2837 	}
2838 }
2839 /*
2840 **********************************************************************
2841 **********************************************************************
2842 */
2843 static void arcmsr_get_hba_config(struct AdapterControlBlock *acb)
2844 {
2845 	char *acb_firm_model=acb->firm_model;
2846 	char *acb_firm_version=acb->firm_version;
2847 	char *acb_device_map = acb->device_map;
2848 	size_t iop_firm_model=offsetof(struct HBA_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]);	/*firm_model,15,60-67*/
2849 	size_t iop_firm_version=offsetof(struct HBA_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]);	/*firm_version,17,68-83*/
2850 	size_t iop_device_map = offsetof(struct HBA_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
2851 	int i;
2852 
2853 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2854 	if(!arcmsr_hba_wait_msgint_ready(acb)) {
2855 		kprintf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
2856 	}
2857 	i=0;
2858 	while(i<8) {
2859 		*acb_firm_model=bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
2860 		/* 8 bytes firm_model, 15, 60-67*/
2861 		acb_firm_model++;
2862 		i++;
2863 	}
2864 	i=0;
2865 	while(i<16) {
2866 		*acb_firm_version=bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
2867 		/* 16 bytes firm_version, 17, 68-83*/
2868 		acb_firm_version++;
2869 		i++;
2870 	}
2871 	i=0;
2872 	while(i<16) {
2873 		*acb_device_map=bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
2874 		acb_device_map++;
2875 		i++;
2876 	}
2877 	kprintf("ARECA RAID ADAPTER%d: %s \n", acb->pci_unit, ARCMSR_DRIVER_VERSION);
2878 	kprintf("ARECA RAID ADAPTER%d: FIRMWARE VERSION %s \n", acb->pci_unit, acb->firm_version);
2879 	acb->firm_request_len=CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[1]);   /*firm_request_len, 1, 04-07*/
2880 	acb->firm_numbers_queue=CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
2881 	acb->firm_sdram_size=CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[3]);    /*firm_sdram_size, 3, 12-15*/
2882 	acb->firm_ide_channels=CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[4]);  /*firm_ide_channels, 4, 16-19*/
2883 	acb->firm_cfg_version=CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]);	/*firm_cfg_version,  25,	  */
2884 	return;
2885 }
2886 /*
2887 **********************************************************************
2888 **********************************************************************
2889 */
2890 static void arcmsr_get_hbb_config(struct AdapterControlBlock *acb)
2891 {
2892 	char *acb_firm_model=acb->firm_model;
2893 	char *acb_firm_version=acb->firm_version;
2894 	char *acb_device_map = acb->device_map;
2895 	size_t iop_firm_model=offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]);	/*firm_model,15,60-67*/
2896 	size_t iop_firm_version=offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]);	/*firm_version,17,68-83*/
2897 	size_t iop_device_map = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
2898 	int i;
2899 
2900 	CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_MESSAGE_GET_CONFIG);
2901 	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
2902 		kprintf( "arcmsr%d: wait" "'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
2903 	}
2904 	i=0;
2905 	while(i<8) {
2906 		*acb_firm_model=bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_firm_model+i);
2907 		/* 8 bytes firm_model, 15, 60-67*/
2908 		acb_firm_model++;
2909 		i++;
2910 	}
2911 	i=0;
2912 	while(i<16) {
2913 		*acb_firm_version=bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_firm_version+i);
2914 		/* 16 bytes firm_version, 17, 68-83*/
2915 		acb_firm_version++;
2916 		i++;
2917 	}
2918 	i=0;
2919 	while(i<16) {
2920 		*acb_device_map=bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_device_map+i);
2921 		acb_device_map++;
2922 		i++;
2923 	}
2924 	kprintf("ARECA RAID ADAPTER%d: %s \n", acb->pci_unit, ARCMSR_DRIVER_VERSION);
2925 	kprintf("ARECA RAID ADAPTER%d: FIRMWARE VERSION %s \n", acb->pci_unit, acb->firm_version);
2926 	acb->firm_request_len=CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[1]);   /*firm_request_len, 1, 04-07*/
2927 	acb->firm_numbers_queue=CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
2928 	acb->firm_sdram_size=CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[3]);    /*firm_sdram_size, 3, 12-15*/
2929 	acb->firm_ide_channels=CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[4]);  /*firm_ide_channels, 4, 16-19*/
2930 	acb->firm_cfg_version=CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]);	/*firm_cfg_version,  25,	  */
2931 	return;
2932 }
2933 /*
2934 **********************************************************************
2935 **********************************************************************
2936 */
2937 static void arcmsr_get_hbc_config(struct AdapterControlBlock *acb)
2938 {
2939 	char *acb_firm_model=acb->firm_model;
2940 	char *acb_firm_version=acb->firm_version;
2941 	char *acb_device_map = acb->device_map;
2942 	size_t iop_firm_model=offsetof(struct HBC_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]);   /*firm_model,15,60-67*/
2943 	size_t iop_firm_version=offsetof(struct HBC_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]); /*firm_version,17,68-83*/
2944 	size_t iop_device_map = offsetof(struct HBC_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
2945 	int i;
2946 
2947 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2948 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
2949 	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
2950 		kprintf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
2951 	}
2952 	i=0;
2953 	while(i<8) {
2954 		*acb_firm_model=bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
2955 		/* 8 bytes firm_model, 15, 60-67*/
2956 		acb_firm_model++;
2957 		i++;
2958 	}
2959 	i=0;
2960 	while(i<16) {
2961 		*acb_firm_version=bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
2962 		/* 16 bytes firm_version, 17, 68-83*/
2963 		acb_firm_version++;
2964 		i++;
2965 	}
2966 	i=0;
2967 	while(i<16) {
2968 		*acb_device_map=bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
2969 		acb_device_map++;
2970 		i++;
2971 	}
2972 	kprintf("ARECA RAID ADAPTER%d: %s \n", acb->pci_unit, ARCMSR_DRIVER_VERSION);
2973 	kprintf("ARECA RAID ADAPTER%d: FIRMWARE VERSION %s \n", acb->pci_unit, acb->firm_version);
2974 	acb->firm_request_len	=CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[1]);	/*firm_request_len,   1, 04-07*/
2975 	acb->firm_numbers_queue	=CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[2]);	/*firm_numbers_queue, 2, 08-11*/
2976 	acb->firm_sdram_size	=CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[3]);	/*firm_sdram_size,    3, 12-15*/
2977 	acb->firm_ide_channels	=CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[4]);	/*firm_ide_channels,  4, 16-19*/
2978 	acb->firm_cfg_version	=CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]);	/*firm_cfg_version,  25,	  */
2979 	return;
2980 }
2981 /*
2982 **********************************************************************
2983 **********************************************************************
2984 */
2985 static void arcmsr_get_firmware_spec(struct AdapterControlBlock *acb)
2986 {
2987 	switch (acb->adapter_type) {
2988 	case ACB_ADAPTER_TYPE_A: {
2989 			arcmsr_get_hba_config(acb);
2990 		}
2991 		break;
2992 	case ACB_ADAPTER_TYPE_B: {
2993 			arcmsr_get_hbb_config(acb);
2994 		}
2995 		break;
2996 	case ACB_ADAPTER_TYPE_C: {
2997 			arcmsr_get_hbc_config(acb);
2998 		}
2999 		break;
3000 	}
3001 	return;
3002 }
3003 /*
3004 **********************************************************************
3005 **********************************************************************
3006 */
3007 static void arcmsr_wait_firmware_ready( struct AdapterControlBlock *acb)
3008 {
3009 	int	timeout=0;
3010 
3011 	switch (acb->adapter_type) {
3012 	case ACB_ADAPTER_TYPE_A: {
3013 			while ((CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_msgaddr1) & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0)
3014 			{
3015 				if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
3016 				{
3017 					kprintf( "arcmsr%d:timed out waiting for firmware \n", acb->pci_unit);
3018 					return;
3019 				}
3020 				UDELAY(15000); /* wait 15 milli-seconds */
3021 			}
3022 		}
3023 		break;
3024 	case ACB_ADAPTER_TYPE_B: {
3025 			while ((CHIP_REG_READ32(HBB_DOORBELL, 0, iop2drv_doorbell) & ARCMSR_MESSAGE_FIRMWARE_OK) == 0)
3026 			{
3027 				if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
3028 				{
3029 					kprintf( "arcmsr%d: timed out waiting for firmware \n", acb->pci_unit);
3030 					return;
3031 				}
3032 				UDELAY(15000); /* wait 15 milli-seconds */
3033 			}
3034 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
3035 		}
3036 		break;
3037 	case ACB_ADAPTER_TYPE_C: {
3038 			while ((CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_msgaddr1) & ARCMSR_HBCMU_MESSAGE_FIRMWARE_OK) == 0)
3039 			{
3040 				if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
3041 				{
3042 					kprintf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit);
3043 					return;
3044 				}
3045 				UDELAY(15000); /* wait 15 milli-seconds */
3046 			}
3047 		}
3048 		break;
3049 	}
3050 	return;
3051 }
3052 /*
3053 **********************************************************************
3054 **********************************************************************
3055 */
3056 static void arcmsr_clear_doorbell_queue_buffer( struct AdapterControlBlock *acb)
3057 {
3058 	u_int32_t outbound_doorbell;
3059 
3060 	switch (acb->adapter_type) {
3061 	case ACB_ADAPTER_TYPE_A: {
3062 			/* empty doorbell Qbuffer if door bell ringed */
3063 			outbound_doorbell = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_doorbell);
3064 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_doorbell, outbound_doorbell);	/*clear doorbell interrupt */
3065 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
3066 
3067 		}
3068 		break;
3069 	case ACB_ADAPTER_TYPE_B: {
3070 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);/*clear interrupt and message state*/
3071 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
3072 			/* let IOP know data has been read */
3073 		}
3074 		break;
3075 	case ACB_ADAPTER_TYPE_C: {
3076 			/* empty doorbell Qbuffer if door bell ringed */
3077 			outbound_doorbell = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell);
3078 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, outbound_doorbell);	/*clear doorbell interrupt */
3079 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK);
3080 
3081 		}
3082 		break;
3083 	}
3084 	return;
3085 }
3086 /*
3087 ************************************************************************
3088 ************************************************************************
3089 */
3090 static u_int32_t arcmsr_iop_confirm(struct AdapterControlBlock *acb)
3091 {
3092 	unsigned long srb_phyaddr;
3093 	u_int32_t srb_phyaddr_hi32;
3094 
3095 	/*
3096 	********************************************************************
3097 	** here we need to tell iop 331 our freesrb.HighPart
3098 	** if freesrb.HighPart is not zero
3099 	********************************************************************
3100 	*/
3101 	srb_phyaddr= (unsigned long) acb->srb_phyaddr.phyaddr;
3102 //	srb_phyaddr_hi32=(u_int32_t) ((srb_phyaddr>>16)>>16);
3103 	srb_phyaddr_hi32=acb->srb_phyaddr.B.phyadd_high;
3104 	switch (acb->adapter_type) {
3105 	case ACB_ADAPTER_TYPE_A: {
3106 			if(srb_phyaddr_hi32!=0) {
3107 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG);
3108 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, msgcode_rwbuffer[1], srb_phyaddr_hi32);
3109 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
3110 				if(!arcmsr_hba_wait_msgint_ready(acb)) {
3111 					kprintf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
3112 					return FALSE;
3113 				}
3114 			}
3115 		}
3116 		break;
3117 		/*
3118 		***********************************************************************
3119 		**    if adapter type B, set window of "post command Q"
3120 		***********************************************************************
3121 		*/
3122 	case ACB_ADAPTER_TYPE_B: {
3123 			u_int32_t post_queue_phyaddr;
3124 			struct HBB_MessageUnit *phbbmu;
3125 
3126 			phbbmu=(struct HBB_MessageUnit *)acb->pmu;
3127 			phbbmu->postq_index=0;
3128 			phbbmu->doneq_index=0;
3129 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_MESSAGE_SET_POST_WINDOW);
3130 			if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3131 				kprintf( "arcmsr%d: 'set window of post command Q' timeout\n", acb->pci_unit);
3132 				return FALSE;
3133 			}
3134 			post_queue_phyaddr = srb_phyaddr + ARCMSR_MAX_FREESRB_NUM*sizeof(struct CommandControlBlock)
3135 			+ offsetof(struct HBB_MessageUnit, post_qbuffer);
3136 			CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG); /* driver "set config" signature */
3137 			CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[1], srb_phyaddr_hi32); /* normal should be zero */
3138 			CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[2], post_queue_phyaddr); /* postQ size (256+8)*4 */
3139 			CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[3], post_queue_phyaddr+1056); /* doneQ size (256+8)*4 */
3140 			CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[4], 1056); /* srb maxQ size must be --> [(256+8)*4] */
3141 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_MESSAGE_SET_CONFIG);
3142 			if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3143 				kprintf( "arcmsr%d: 'set command Q window' timeout \n", acb->pci_unit);
3144 				return FALSE;
3145 			}
3146 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell, ARCMSR_MESSAGE_START_DRIVER_MODE);
3147 			if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3148 				kprintf( "arcmsr%d: 'start diver mode' timeout \n", acb->pci_unit);
3149 				return FALSE;
3150 			}
3151 		}
3152 		break;
3153 	case ACB_ADAPTER_TYPE_C: {
3154 			if(srb_phyaddr_hi32!=0) {
3155 				CHIP_REG_WRITE32(HBC_MessageUnit, 0, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG);
3156 				CHIP_REG_WRITE32(HBC_MessageUnit, 0, msgcode_rwbuffer[1], srb_phyaddr_hi32);
3157 				CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
3158 				CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
3159 				if(!arcmsr_hbc_wait_msgint_ready(acb)) {
3160 					kprintf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
3161 					return FALSE;
3162 				}
3163 			}
3164 		}
3165 		break;
3166 	}
3167 	return TRUE;
3168 }
3169 /*
3170 ************************************************************************
3171 ************************************************************************
3172 */
3173 static void arcmsr_enable_eoi_mode(struct AdapterControlBlock *acb)
3174 {
3175 	switch (acb->adapter_type)
3176 	{
3177 	case ACB_ADAPTER_TYPE_A:
3178 	case ACB_ADAPTER_TYPE_C:
3179 		break;
3180 	case ACB_ADAPTER_TYPE_B: {
3181 			CHIP_REG_WRITE32(HBB_DOORBELL, 0, drv2iop_doorbell,ARCMSR_MESSAGE_ACTIVE_EOI_MODE);
3182 			if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3183 				kprintf( "arcmsr%d: 'iop enable eoi mode' timeout \n", acb->pci_unit);
3184 
3185 				return;
3186 			}
3187 		}
3188 		break;
3189 	}
3190 	return;
3191 }
3192 /*
3193 **********************************************************************
3194 **********************************************************************
3195 */
3196 static void arcmsr_iop_init(struct AdapterControlBlock *acb)
3197 {
3198 	u_int32_t intmask_org;
3199 
3200 	/* disable all outbound interrupt */
3201 	intmask_org=arcmsr_disable_allintr(acb);
3202 	arcmsr_wait_firmware_ready(acb);
3203 	arcmsr_iop_confirm(acb);
3204 	arcmsr_get_firmware_spec(acb);
3205 	/*start background rebuild*/
3206 	arcmsr_start_adapter_bgrb(acb);
3207 	/* empty doorbell Qbuffer if door bell ringed */
3208 	arcmsr_clear_doorbell_queue_buffer(acb);
3209 	arcmsr_enable_eoi_mode(acb);
3210 	/* enable outbound Post Queue, outbound doorbell Interrupt */
3211 	arcmsr_enable_allintr(acb, intmask_org);
3212 	acb->acb_flags |=ACB_F_IOP_INITED;
3213 	return;
3214 }
3215 /*
3216 **********************************************************************
3217 **********************************************************************
3218 */
3219 static void arcmsr_map_free_srb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
3220 {
3221 	struct AdapterControlBlock *acb=arg;
3222 	struct CommandControlBlock *srb_tmp;
3223 	u_int8_t * dma_memptr;
3224 	u_int32_t i;
3225 	unsigned long srb_phyaddr=(unsigned long)segs->ds_addr;
3226 
3227 	dma_memptr=acb->uncacheptr;
3228 	acb->srb_phyaddr.phyaddr=srb_phyaddr;
3229 	srb_tmp=(struct CommandControlBlock *)dma_memptr;
3230 	for(i=0;i<ARCMSR_MAX_FREESRB_NUM;i++) {
3231 		if(bus_dmamap_create(acb->dm_segs_dmat,
3232 			 /*flags*/0, &srb_tmp->dm_segs_dmamap)!=0) {
3233 			acb->acb_flags |= ACB_F_MAPFREESRB_FAILD;
3234 			kprintf("arcmsr%d:"
3235 			" srb dmamap bus_dmamap_create error\n", acb->pci_unit);
3236 			return;
3237 		}
3238 		srb_tmp->cdb_shifted_phyaddr=(acb->adapter_type==ACB_ADAPTER_TYPE_C)?srb_phyaddr:(srb_phyaddr >> 5);
3239 		srb_tmp->acb=acb;
3240 		acb->srbworkingQ[i]=acb->psrb_pool[i]=srb_tmp;
3241 		srb_phyaddr=srb_phyaddr+sizeof(struct CommandControlBlock);
3242 		srb_tmp++;
3243 	}
3244 	acb->vir2phy_offset=(unsigned long)srb_tmp-(unsigned long)srb_phyaddr;
3245 	return;
3246 }
3247 /*
3248 ************************************************************************
3249 **
3250 **
3251 ************************************************************************
3252 */
3253 static void arcmsr_free_resource(struct AdapterControlBlock *acb)
3254 {
3255 	/* remove the control device */
3256 	if(acb->ioctl_dev != NULL) {
3257 		destroy_dev(acb->ioctl_dev);
3258 	}
3259 	bus_dmamap_unload(acb->srb_dmat, acb->srb_dmamap);
3260 	bus_dmamap_destroy(acb->srb_dmat, acb->srb_dmamap);
3261 	bus_dma_tag_destroy(acb->srb_dmat);
3262 	bus_dma_tag_destroy(acb->dm_segs_dmat);
3263 	bus_dma_tag_destroy(acb->parent_dmat);
3264 	return;
3265 }
3266 /*
3267 ************************************************************************
3268 ************************************************************************
3269 */
3270 static u_int32_t arcmsr_initialize(device_t dev)
3271 {
3272 	struct AdapterControlBlock *acb=device_get_softc(dev);
3273 	u_int16_t pci_command;
3274 	int i, j,max_coherent_size;
3275 
3276 	switch (pci_get_devid(dev)) {
3277 	case PCIDevVenIDARC1880: {
3278 			acb->adapter_type=ACB_ADAPTER_TYPE_C;
3279 			max_coherent_size=ARCMSR_SRBS_POOL_SIZE;
3280 		}
3281 		break;
3282 	case PCIDevVenIDARC1200:
3283 	case PCIDevVenIDARC1201: {
3284 			acb->adapter_type=ACB_ADAPTER_TYPE_B;
3285 			max_coherent_size=ARCMSR_SRBS_POOL_SIZE+(sizeof(struct HBB_MessageUnit));
3286 		}
3287 		break;
3288 	case PCIDevVenIDARC1110:
3289 	case PCIDevVenIDARC1120:
3290 	case PCIDevVenIDARC1130:
3291 	case PCIDevVenIDARC1160:
3292 	case PCIDevVenIDARC1170:
3293 	case PCIDevVenIDARC1210:
3294 	case PCIDevVenIDARC1220:
3295 	case PCIDevVenIDARC1230:
3296 	case PCIDevVenIDARC1231:
3297 	case PCIDevVenIDARC1260:
3298 	case PCIDevVenIDARC1261:
3299 	case PCIDevVenIDARC1270:
3300 	case PCIDevVenIDARC1280:
3301 	case PCIDevVenIDARC1212:
3302 	case PCIDevVenIDARC1222:
3303 	case PCIDevVenIDARC1380:
3304 	case PCIDevVenIDARC1381:
3305 	case PCIDevVenIDARC1680:
3306 	case PCIDevVenIDARC1681: {
3307 			acb->adapter_type=ACB_ADAPTER_TYPE_A;
3308 			max_coherent_size=ARCMSR_SRBS_POOL_SIZE;
3309 		}
3310 		break;
3311 	default: {
3312 			kprintf("arcmsr%d:"
3313 			" unknown RAID adapter type \n", device_get_unit(dev));
3314 			return ENOMEM;
3315 		}
3316 	}
3317 	if(bus_dma_tag_create(  /*parent*/	NULL,
3318 				/*alignemnt*/	1,
3319 				/*boundary*/	0,
3320 				/*lowaddr*/	BUS_SPACE_MAXADDR,
3321 				/*highaddr*/	BUS_SPACE_MAXADDR,
3322 				/*filter*/	NULL,
3323 				/*filterarg*/	NULL,
3324 				/*maxsize*/	BUS_SPACE_MAXSIZE_32BIT,
3325 				/*nsegments*/	BUS_SPACE_UNRESTRICTED,
3326 				/*maxsegsz*/	BUS_SPACE_MAXSIZE_32BIT,
3327 				/*flags*/	0,
3328 						&acb->parent_dmat) != 0)
3329 	{
3330 		kprintf("arcmsr%d: parent_dmat bus_dma_tag_create failure!\n", device_get_unit(dev));
3331 		return ENOMEM;
3332 	}
3333 	/* Create a single tag describing a region large enough to hold all of the s/g lists we will need. */
3334 	if(bus_dma_tag_create(  /*parent_dmat*/	acb->parent_dmat,
3335 				/*alignment*/	1,
3336 				/*boundary*/	0,
3337 				/*lowaddr*/	BUS_SPACE_MAXADDR,
3338 				/*highaddr*/	BUS_SPACE_MAXADDR,
3339 				/*filter*/	NULL,
3340 				/*filterarg*/	NULL,
3341 				/*maxsize*/	ARCMSR_MAX_SG_ENTRIES * PAGE_SIZE * ARCMSR_MAX_FREESRB_NUM,
3342 				/*nsegments*/	ARCMSR_MAX_SG_ENTRIES,
3343 				/*maxsegsz*/	BUS_SPACE_MAXSIZE_32BIT,
3344 				/*flags*/	0,
3345 						&acb->dm_segs_dmat) != 0)
3346 	{
3347 		bus_dma_tag_destroy(acb->parent_dmat);
3348 		kprintf("arcmsr%d: dm_segs_dmat bus_dma_tag_create failure!\n", device_get_unit(dev));
3349 		return ENOMEM;
3350 	}
3351 	/* DMA tag for our srb structures.... Allocate the freesrb memory */
3352 	if(bus_dma_tag_create(  /*parent_dmat*/	acb->parent_dmat,
3353 				/*alignment*/	0x20,
3354 				/*boundary*/	0,
3355 				/*lowaddr*/	BUS_SPACE_MAXADDR_32BIT,
3356 				/*highaddr*/	BUS_SPACE_MAXADDR,
3357 				/*filter*/	NULL,
3358 				/*filterarg*/	NULL,
3359 				/*maxsize*/	max_coherent_size,
3360 				/*nsegments*/	1,
3361 				/*maxsegsz*/	BUS_SPACE_MAXSIZE_32BIT,
3362 				/*flags*/	0,
3363 						&acb->srb_dmat) != 0)
3364 	{
3365 		bus_dma_tag_destroy(acb->dm_segs_dmat);
3366 		bus_dma_tag_destroy(acb->parent_dmat);
3367 		kprintf("arcmsr%d: srb_dmat bus_dma_tag_create failure!\n", device_get_unit(dev));
3368 		return ENXIO;
3369 	}
3370 	/* Allocation for our srbs */
3371 	if(bus_dmamem_alloc(acb->srb_dmat, (void **)&acb->uncacheptr, BUS_DMA_WAITOK | BUS_DMA_COHERENT | BUS_DMA_ZERO, &acb->srb_dmamap) != 0) {
3372 		bus_dma_tag_destroy(acb->srb_dmat);
3373 		bus_dma_tag_destroy(acb->dm_segs_dmat);
3374 		bus_dma_tag_destroy(acb->parent_dmat);
3375 		kprintf("arcmsr%d: srb_dmat bus_dmamem_alloc failure!\n", device_get_unit(dev));
3376 		return ENXIO;
3377 	}
3378 	/* And permanently map them */
3379 	if(bus_dmamap_load(acb->srb_dmat, acb->srb_dmamap, acb->uncacheptr, max_coherent_size, arcmsr_map_free_srb, acb, /*flags*/0)) {
3380 		bus_dma_tag_destroy(acb->srb_dmat);
3381 		bus_dma_tag_destroy(acb->dm_segs_dmat);
3382 		bus_dma_tag_destroy(acb->parent_dmat);
3383 		kprintf("arcmsr%d: srb_dmat bus_dmamap_load failure!\n", device_get_unit(dev));
3384 		return ENXIO;
3385 	}
3386 	pci_command=pci_read_config(dev, PCIR_COMMAND, 2);
3387 	pci_command |= PCIM_CMD_BUSMASTEREN;
3388 	pci_command |= PCIM_CMD_PERRESPEN;
3389 	pci_command |= PCIM_CMD_MWRICEN;
3390 	/* Enable Busmaster/Mem */
3391 	pci_command |= PCIM_CMD_MEMEN;
3392 	pci_write_config(dev, PCIR_COMMAND, pci_command, 2);
3393 	switch(acb->adapter_type) {
3394 	case ACB_ADAPTER_TYPE_A: {
3395 			u_int32_t rid0=PCIR_BAR(0);
3396 			vm_offset_t	mem_base0;
3397 
3398 			acb->sys_res_arcmsr[0]=bus_alloc_resource(dev,SYS_RES_MEMORY, &rid0, 0ul, ~0ul, 0x1000, RF_ACTIVE);
3399 			if(acb->sys_res_arcmsr[0] == NULL) {
3400 				arcmsr_free_resource(acb);
3401 				kprintf("arcmsr%d: bus_alloc_resource failure!\n", device_get_unit(dev));
3402 				return ENOMEM;
3403 			}
3404 			if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
3405 				arcmsr_free_resource(acb);
3406 				kprintf("arcmsr%d: rman_get_start failure!\n", device_get_unit(dev));
3407 				return ENXIO;
3408 			}
3409 			mem_base0=(vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
3410 			if(mem_base0==0) {
3411 				arcmsr_free_resource(acb);
3412 				kprintf("arcmsr%d: rman_get_virtual failure!\n", device_get_unit(dev));
3413 				return ENXIO;
3414 			}
3415 			acb->btag[0]=rman_get_bustag(acb->sys_res_arcmsr[0]);
3416 			acb->bhandle[0]=rman_get_bushandle(acb->sys_res_arcmsr[0]);
3417 			acb->pmu=(struct MessageUnit_UNION *)mem_base0;
3418 		}
3419 		break;
3420 	case ACB_ADAPTER_TYPE_B: {
3421 			struct HBB_MessageUnit *phbbmu;
3422 			struct CommandControlBlock *freesrb;
3423 			u_int32_t rid[]={ PCIR_BAR(0), PCIR_BAR(2) };
3424 			vm_offset_t	mem_base[]={0,0};
3425 			for(i=0; i<2; i++) {
3426 				if(i==0) {
3427 					acb->sys_res_arcmsr[i]=bus_alloc_resource(dev,SYS_RES_MEMORY, &rid[i],
3428 											0ul, ~0ul, sizeof(struct HBB_DOORBELL), RF_ACTIVE);
3429 				} else {
3430 					acb->sys_res_arcmsr[i]=bus_alloc_resource(dev, SYS_RES_MEMORY, &rid[i],
3431 											0ul, ~0ul, sizeof(struct HBB_RWBUFFER), RF_ACTIVE);
3432 				}
3433 				if(acb->sys_res_arcmsr[i] == NULL) {
3434 					arcmsr_free_resource(acb);
3435 					kprintf("arcmsr%d: bus_alloc_resource %d failure!\n", device_get_unit(dev), i);
3436 					return ENOMEM;
3437 				}
3438 				if(rman_get_start(acb->sys_res_arcmsr[i]) <= 0) {
3439 					arcmsr_free_resource(acb);
3440 					kprintf("arcmsr%d: rman_get_start %d failure!\n", device_get_unit(dev), i);
3441 					return ENXIO;
3442 				}
3443 				mem_base[i]=(vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[i]);
3444 				if(mem_base[i]==0) {
3445 					arcmsr_free_resource(acb);
3446 					kprintf("arcmsr%d: rman_get_virtual %d failure!\n", device_get_unit(dev), i);
3447 					return ENXIO;
3448 				}
3449 				acb->btag[i]=rman_get_bustag(acb->sys_res_arcmsr[i]);
3450 				acb->bhandle[i]=rman_get_bushandle(acb->sys_res_arcmsr[i]);
3451 			}
3452 			freesrb=(struct CommandControlBlock *)acb->uncacheptr;
3453 			acb->pmu=(struct MessageUnit_UNION *)&freesrb[ARCMSR_MAX_FREESRB_NUM];
3454 			phbbmu=(struct HBB_MessageUnit *)acb->pmu;
3455 			phbbmu->hbb_doorbell=(struct HBB_DOORBELL *)mem_base[0];
3456 			phbbmu->hbb_rwbuffer=(struct HBB_RWBUFFER *)mem_base[1];
3457 		}
3458 		break;
3459 	case ACB_ADAPTER_TYPE_C: {
3460 			u_int32_t rid0=PCIR_BAR(1);
3461 			vm_offset_t	mem_base0;
3462 
3463 			acb->sys_res_arcmsr[0]=bus_alloc_resource(dev,SYS_RES_MEMORY, &rid0, 0ul, ~0ul, sizeof(struct HBC_MessageUnit), RF_ACTIVE);
3464 			if(acb->sys_res_arcmsr[0] == NULL) {
3465 				arcmsr_free_resource(acb);
3466 				kprintf("arcmsr%d: bus_alloc_resource failure!\n", device_get_unit(dev));
3467 				return ENOMEM;
3468 			}
3469 			if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
3470 				arcmsr_free_resource(acb);
3471 				kprintf("arcmsr%d: rman_get_start failure!\n", device_get_unit(dev));
3472 				return ENXIO;
3473 			}
3474 			mem_base0=(vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
3475 			if(mem_base0==0) {
3476 				arcmsr_free_resource(acb);
3477 				kprintf("arcmsr%d: rman_get_virtual failure!\n", device_get_unit(dev));
3478 				return ENXIO;
3479 			}
3480 			acb->btag[0]=rman_get_bustag(acb->sys_res_arcmsr[0]);
3481 			acb->bhandle[0]=rman_get_bushandle(acb->sys_res_arcmsr[0]);
3482 			acb->pmu=(struct MessageUnit_UNION *)mem_base0;
3483 		}
3484 		break;
3485 	}
3486 	if(acb->acb_flags & ACB_F_MAPFREESRB_FAILD) {
3487 		arcmsr_free_resource(acb);
3488 		kprintf("arcmsr%d: map free srb failure!\n", device_get_unit(dev));
3489 		return ENXIO;
3490 	}
3491 	acb->acb_flags  |= (ACB_F_MESSAGE_WQBUFFER_CLEARED|ACB_F_MESSAGE_RQBUFFER_CLEARED|ACB_F_MESSAGE_WQBUFFER_READ);
3492 	acb->acb_flags &= ~ACB_F_SCSISTOPADAPTER;
3493 	/*
3494 	********************************************************************
3495 	** init raid volume state
3496 	********************************************************************
3497 	*/
3498 	for(i=0;i<ARCMSR_MAX_TARGETID;i++) {
3499 		for(j=0;j<ARCMSR_MAX_TARGETLUN;j++) {
3500 			acb->devstate[i][j]=ARECA_RAID_GONE;
3501 		}
3502 	}
3503 	arcmsr_iop_init(acb);
3504 	return(0);
3505 }
3506 /*
3507 ************************************************************************
3508 ************************************************************************
3509 */
3510 static int arcmsr_attach(device_t dev)
3511 {
3512 	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
3513 	u_int32_t unit=device_get_unit(dev);
3514 	struct ccb_setasync csa;
3515 	struct cam_devq	*devq;	/* Device Queue to use for this SIM */
3516 	struct resource	*irqres;
3517 	int	rid;
3518 	u_int irq_flags;
3519 
3520 	if(acb == NULL) {
3521 		kprintf("arcmsr%d: cannot allocate softc\n", unit);
3522 		return (ENOMEM);
3523 	}
3524 	ARCMSR_LOCK_INIT(&acb->qbuffer_lock, "arcmsr Q buffer lock");
3525 	if(arcmsr_initialize(dev)) {
3526 		kprintf("arcmsr%d: initialize failure!\n", unit);
3527 		ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
3528 		return ENXIO;
3529 	}
3530 	/* After setting up the adapter, map our interrupt */
3531 	rid=0;
3532 	acb->irq_type = pci_alloc_1intr(dev, arcmsr_msi_enable, &rid,
3533 	    &irq_flags);
3534 	irqres=bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0ul, ~0ul, 1,
3535 	    irq_flags);
3536 	if(irqres == NULL ||
3537 		bus_setup_intr(dev, irqres, INTR_MPSAFE, arcmsr_intr_handler, acb, &acb->ih, NULL)) {
3538 		arcmsr_free_resource(acb);
3539 		ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
3540 		kprintf("arcmsr%d: unable to register interrupt handler!\n", unit);
3541 		return ENXIO;
3542 	}
3543 	acb->irqres=irqres;
3544 	acb->pci_dev=dev;
3545 	acb->pci_unit=unit;
3546 	/*
3547 	 * Now let the CAM generic SCSI layer find the SCSI devices on
3548 	 * the bus *  start queue to reset to the idle loop. *
3549 	 * Create device queue of SIM(s) *  (MAX_START_JOB - 1) :
3550 	 * max_sim_transactions
3551 	*/
3552 	devq=cam_simq_alloc(ARCMSR_MAX_START_JOB);
3553 	if(devq == NULL) {
3554 	    arcmsr_free_resource(acb);
3555 		bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
3556 		if (acb->irq_type == PCI_INTR_TYPE_MSI)
3557 			pci_release_msi(dev);
3558 		ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
3559 		kprintf("arcmsr%d: cam_simq_alloc failure!\n", unit);
3560 		return ENXIO;
3561 	}
3562 	acb->psim=cam_sim_alloc(arcmsr_action, arcmsr_poll, "arcmsr", acb, unit, &acb->qbuffer_lock, 1, ARCMSR_MAX_OUTSTANDING_CMD, devq);
3563 	if(acb->psim == NULL) {
3564 		arcmsr_free_resource(acb);
3565 		bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
3566 		if (acb->irq_type == PCI_INTR_TYPE_MSI)
3567 			pci_release_msi(dev);
3568 		cam_simq_release(devq);
3569 		ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
3570 		kprintf("arcmsr%d: cam_sim_alloc failure!\n", unit);
3571 		return ENXIO;
3572 	}
3573 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
3574 	if(xpt_bus_register(acb->psim, 0) != CAM_SUCCESS) {
3575 		arcmsr_free_resource(acb);
3576 		bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
3577 		if (acb->irq_type == PCI_INTR_TYPE_MSI)
3578 			pci_release_msi(dev);
3579 		cam_sim_free(acb->psim);
3580 		ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
3581 		kprintf("arcmsr%d: xpt_bus_register failure!\n", unit);
3582 		return ENXIO;
3583 	}
3584 	if(xpt_create_path(&acb->ppath, /* periph */ NULL, cam_sim_path(acb->psim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
3585 		arcmsr_free_resource(acb);
3586 		bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
3587 		if (acb->irq_type == PCI_INTR_TYPE_MSI)
3588 			pci_release_msi(dev);
3589 		xpt_bus_deregister(cam_sim_path(acb->psim));
3590 		cam_sim_free(acb->psim);
3591 		ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
3592 		kprintf("arcmsr%d: xpt_create_path failure!\n", unit);
3593 		return ENXIO;
3594 	}
3595 	/*
3596 	****************************************************
3597 	*/
3598 	xpt_setup_ccb(&csa.ccb_h, acb->ppath, /*priority*/5);
3599 	csa.ccb_h.func_code=XPT_SASYNC_CB;
3600 	csa.event_enable=AC_FOUND_DEVICE|AC_LOST_DEVICE;
3601 	csa.callback=arcmsr_async;
3602 	csa.callback_arg=acb->psim;
3603 	xpt_action((union ccb *)&csa);
3604 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
3605 	/* Create the control device.  */
3606 	acb->ioctl_dev=make_dev(&arcmsr_ops, unit, UID_ROOT, GID_WHEEL /* GID_OPERATOR */, S_IRUSR | S_IWUSR, "arcmsr%d", unit);
3607 
3608 	acb->ioctl_dev->si_drv1=acb;
3609 	(void)make_dev_alias(acb->ioctl_dev, "arc%d", unit);
3610 	callout_init(&acb->devmap_callout);
3611 	callout_reset(&acb->devmap_callout, 60 * hz, arcmsr_polling_devmap, acb);
3612 	return 0;
3613 }
3614 /*
3615 ************************************************************************
3616 ************************************************************************
3617 */
3618 static int arcmsr_probe(device_t dev)
3619 {
3620 	u_int32_t id;
3621 	static char buf[256];
3622 	char x_type[]={"X-TYPE"};
3623 	char *type;
3624 	int raid6 = 1;
3625 
3626 	if (pci_get_vendor(dev) != PCI_VENDOR_ID_ARECA) {
3627 		return (ENXIO);
3628 	}
3629 	switch(id=pci_get_devid(dev)) {
3630 	case PCIDevVenIDARC1110:
3631 	case PCIDevVenIDARC1200:
3632 	case PCIDevVenIDARC1201:
3633 	case PCIDevVenIDARC1210:
3634 		raid6 = 0;
3635 		/*FALLTHRU*/
3636 	case PCIDevVenIDARC1120:
3637 	case PCIDevVenIDARC1130:
3638 	case PCIDevVenIDARC1160:
3639 	case PCIDevVenIDARC1170:
3640 	case PCIDevVenIDARC1220:
3641 	case PCIDevVenIDARC1230:
3642 	case PCIDevVenIDARC1231:
3643 	case PCIDevVenIDARC1260:
3644 	case PCIDevVenIDARC1261:
3645 	case PCIDevVenIDARC1270:
3646 	case PCIDevVenIDARC1280:
3647 		type = "SATA";
3648 		break;
3649 	case PCIDevVenIDARC1212:
3650 	case PCIDevVenIDARC1222:
3651 	case PCIDevVenIDARC1380:
3652 	case PCIDevVenIDARC1381:
3653 	case PCIDevVenIDARC1680:
3654 	case PCIDevVenIDARC1681:
3655 		type = "SAS 3G";
3656 		break;
3657 	case PCIDevVenIDARC1880:
3658 		type = "SAS 6G";
3659 		break;
3660 	default:
3661 		type = x_type;
3662 		break;
3663 	}
3664 	if(type == x_type)
3665 		return(ENXIO);
3666 	ksprintf(buf, "Areca %s Host Adapter RAID Controller%s", type, raid6 ? " (RAID6 capable)" : "");
3667 	device_set_desc_copy(dev, buf);
3668 	return 0;
3669 }
3670 /*
3671 ************************************************************************
3672 ************************************************************************
3673 */
3674 static int arcmsr_shutdown(device_t dev)
3675 {
3676 	u_int32_t  i;
3677 	u_int32_t intmask_org;
3678 	struct CommandControlBlock *srb;
3679 	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
3680 
3681 	/* stop adapter background rebuild */
3682 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
3683 	/* disable all outbound interrupt */
3684 	intmask_org=arcmsr_disable_allintr(acb);
3685 	arcmsr_stop_adapter_bgrb(acb);
3686 	arcmsr_flush_adapter_cache(acb);
3687 	/* abort all outstanding command */
3688 	acb->acb_flags |= ACB_F_SCSISTOPADAPTER;
3689 	acb->acb_flags &= ~ACB_F_IOP_INITED;
3690 	if(acb->srboutstandingcount!=0) {
3691 		/*clear and abort all outbound posted Q*/
3692 		arcmsr_done4abort_postqueue(acb);
3693 		/* talk to iop 331 outstanding command aborted*/
3694 		arcmsr_abort_allcmd(acb);
3695 		for(i=0;i<ARCMSR_MAX_FREESRB_NUM;i++) {
3696 			srb=acb->psrb_pool[i];
3697 			if(srb->startdone==ARCMSR_SRB_START) {
3698 				srb->startdone=ARCMSR_SRB_ABORTED;
3699 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3700 				arcmsr_srb_complete(srb, 1);
3701 			}
3702 		}
3703 	}
3704 	atomic_set_int(&acb->srboutstandingcount, 0);
3705 	acb->workingsrb_doneindex=0;
3706 	acb->workingsrb_startindex=0;
3707 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
3708 	return (0);
3709 }
3710 /*
3711 ************************************************************************
3712 ************************************************************************
3713 */
3714 static int arcmsr_detach(device_t dev)
3715 {
3716 	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
3717 	int i;
3718 
3719 	callout_stop(&acb->devmap_callout);
3720 	bus_teardown_intr(dev, acb->irqres, acb->ih);
3721 	arcmsr_shutdown(dev);
3722 	arcmsr_free_resource(acb);
3723 	for(i=0; (acb->sys_res_arcmsr[i]!=NULL) && (i<2); i++) {
3724 		bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BAR(i), acb->sys_res_arcmsr[i]);
3725 	}
3726 	bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
3727 	if (acb->irq_type == PCI_INTR_TYPE_MSI)
3728 		pci_release_msi(dev);
3729 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
3730 	xpt_async(AC_LOST_DEVICE, acb->ppath, NULL);
3731 	xpt_free_path(acb->ppath);
3732 	xpt_bus_deregister(cam_sim_path(acb->psim));
3733 	cam_sim_free(acb->psim);
3734 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
3735 	ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
3736 	return (0);
3737 }
3738