xref: /freebsd/sys/dev/arcmsr/arcmsr.c (revision 6be3386466ab79a84b48429ae66244f21526d3df)
1 /*
2 ********************************************************************************
3 **        OS    : 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)
8 **                SATA/SAS RAID HOST Adapter
9 ********************************************************************************
10 ********************************************************************************
11 **
12 ** SPDX-License-Identifier: BSD-3-Clause
13 **
14 ** Copyright (C) 2002 - 2012, Areca Technology Corporation 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   03/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   04/19/2005  Erich Chen      add SATA 24 Ports adapter type support
44 **                                          clean unused function
45 ** 1.20.00.12   09/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   08/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 ** 1.20.00.20   12/08/2010  Ching Huang     Avoid calling atomic_set_int function
68 ** 1.20.00.21   02/08/2011  Ching Huang     Implement I/O request timeout
69 **              02/14/2011  Ching Huang     Modified pktRequestCount
70 ** 1.20.00.21   03/03/2011  Ching Huang     if a command timeout, then wait its ccb back before free it
71 ** 1.20.00.22   07/04/2011  Ching Huang     Fixed multiple MTX panic
72 ** 1.20.00.23   10/28/2011  Ching Huang     Added TIMEOUT_DELAY in case of too many HDDs need to start
73 ** 1.20.00.23   11/08/2011  Ching Huang     Added report device transfer speed
74 ** 1.20.00.23   01/30/2012  Ching Huang     Fixed Request requeued and Retrying command
75 ** 1.20.00.24   06/11/2012  Ching Huang     Fixed return sense data condition
76 ** 1.20.00.25   08/17/2012  Ching Huang     Fixed hotplug device no function on type A adapter
77 ** 1.20.00.26   12/14/2012  Ching Huang     Added support ARC1214,1224,1264,1284
78 ** 1.20.00.27   05/06/2013  Ching Huang     Fixed out standing cmd full on ARC-12x4
79 ** 1.20.00.28   09/13/2013  Ching Huang     Removed recursive mutex in arcmsr_abort_dr_ccbs
80 ** 1.20.00.29   12/18/2013  Ching Huang     Change simq allocation number, support ARC1883
81 ** 1.30.00.00   11/30/2015  Ching Huang     Added support ARC1203
82 ** 1.40.00.00   07/11/2017  Ching Huang     Added support ARC1884
83 ** 1.40.00.01   10/30/2017  Ching Huang     Fixed release memory resource
84 ** 1.50.00.00   09/30/2020  Ching Huang     Added support ARC-1886, NVMe/SAS/SATA controller
85 ** 1.50.00.01   02/26/2021  Ching Huang     Fixed no action of hot plugging device on type_F adapter
86 ******************************************************************************************
87 */
88 
89 #include <sys/cdefs.h>
90 __FBSDID("$FreeBSD$");
91 
92 #if 0
93 #define ARCMSR_DEBUG1			1
94 #endif
95 #include <sys/param.h>
96 #include <sys/systm.h>
97 #include <sys/malloc.h>
98 #include <sys/kernel.h>
99 #include <sys/bus.h>
100 #include <sys/queue.h>
101 #include <sys/stat.h>
102 #include <sys/devicestat.h>
103 #include <sys/kthread.h>
104 #include <sys/module.h>
105 #include <sys/proc.h>
106 #include <sys/lock.h>
107 #include <sys/sysctl.h>
108 #include <sys/poll.h>
109 #include <sys/ioccom.h>
110 #include <vm/vm.h>
111 #include <vm/vm_param.h>
112 #include <vm/pmap.h>
113 
114 #include <isa/rtc.h>
115 
116 #include <machine/bus.h>
117 #include <machine/resource.h>
118 #include <machine/atomic.h>
119 #include <sys/conf.h>
120 #include <sys/rman.h>
121 
122 #include <cam/cam.h>
123 #include <cam/cam_ccb.h>
124 #include <cam/cam_sim.h>
125 #include <cam/cam_periph.h>
126 #include <cam/cam_xpt_periph.h>
127 #include <cam/cam_xpt_sim.h>
128 #include <cam/cam_debug.h>
129 #include <cam/scsi/scsi_all.h>
130 #include <cam/scsi/scsi_message.h>
131 /*
132 **************************************************************************
133 **************************************************************************
134 */
135 #include <sys/selinfo.h>
136 #include <sys/mutex.h>
137 #include <sys/endian.h>
138 #include <dev/pci/pcivar.h>
139 #include <dev/pci/pcireg.h>
140 
141 #define arcmsr_callout_init(a)	callout_init(a, /*mpsafe*/1);
142 
143 #define ARCMSR_DRIVER_VERSION	"arcmsr version 1.50.00.01 2021-02-26"
144 #include <dev/arcmsr/arcmsr.h>
145 /*
146 **************************************************************************
147 **************************************************************************
148 */
149 static void arcmsr_free_srb(struct CommandControlBlock *srb);
150 static struct CommandControlBlock *arcmsr_get_freesrb(struct AdapterControlBlock *acb);
151 static u_int8_t arcmsr_seek_cmd2abort(union ccb *abortccb);
152 static int arcmsr_probe(device_t dev);
153 static int arcmsr_attach(device_t dev);
154 static int arcmsr_detach(device_t dev);
155 static u_int32_t arcmsr_iop_ioctlcmd(struct AdapterControlBlock *acb, u_int32_t ioctl_cmd, caddr_t arg);
156 static void arcmsr_iop_parking(struct AdapterControlBlock *acb);
157 static int arcmsr_shutdown(device_t dev);
158 static void arcmsr_interrupt(struct AdapterControlBlock *acb);
159 static void arcmsr_polling_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb);
160 static void arcmsr_free_resource(struct AdapterControlBlock *acb);
161 static void arcmsr_bus_reset(struct AdapterControlBlock *acb);
162 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb);
163 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb);
164 static void arcmsr_iop_init(struct AdapterControlBlock *acb);
165 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb);
166 static u_int32_t arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb, struct QBUFFER *prbuffer);
167 static void arcmsr_Write_data_2iop_wqbuffer(struct AdapterControlBlock *acb);
168 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb);
169 static void arcmsr_srb_complete(struct CommandControlBlock *srb, int stand_flag);
170 static void arcmsr_iop_reset(struct AdapterControlBlock *acb);
171 static void arcmsr_report_sense_info(struct CommandControlBlock *srb);
172 static void arcmsr_build_srb(struct CommandControlBlock *srb, bus_dma_segment_t *dm_segs, u_int32_t nseg);
173 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb *pccb);
174 static int arcmsr_resume(device_t dev);
175 static int arcmsr_suspend(device_t dev);
176 static void arcmsr_rescanLun_cb(struct cam_periph *periph, union ccb *ccb);
177 static void arcmsr_polling_devmap(void *arg);
178 static void arcmsr_srb_timeout(void *arg);
179 static void arcmsr_hbd_postqueue_isr(struct AdapterControlBlock *acb);
180 static void arcmsr_hbe_postqueue_isr(struct AdapterControlBlock *acb);
181 static void arcmsr_hbf_postqueue_isr(struct AdapterControlBlock *acb);
182 static void arcmsr_teardown_intr(device_t dev, struct AdapterControlBlock *acb);
183 #ifdef ARCMSR_DEBUG1
184 static void arcmsr_dump_data(struct AdapterControlBlock *acb);
185 #endif
186 /*
187 **************************************************************************
188 **************************************************************************
189 */
190 static void UDELAY(u_int32_t us) { DELAY(us); }
191 /*
192 **************************************************************************
193 **************************************************************************
194 */
195 static bus_dmamap_callback_t arcmsr_map_free_srb;
196 static bus_dmamap_callback_t arcmsr_execute_srb;
197 /*
198 **************************************************************************
199 **************************************************************************
200 */
201 static d_open_t	arcmsr_open;
202 static d_close_t arcmsr_close;
203 static d_ioctl_t arcmsr_ioctl;
204 
205 static device_method_t arcmsr_methods[]={
206 	DEVMETHOD(device_probe,		arcmsr_probe),
207 	DEVMETHOD(device_attach,	arcmsr_attach),
208 	DEVMETHOD(device_detach,	arcmsr_detach),
209 	DEVMETHOD(device_shutdown,	arcmsr_shutdown),
210 	DEVMETHOD(device_suspend,	arcmsr_suspend),
211 	DEVMETHOD(device_resume,	arcmsr_resume),
212 	DEVMETHOD_END
213 };
214 
215 static driver_t arcmsr_driver={
216 	"arcmsr", arcmsr_methods, sizeof(struct AdapterControlBlock)
217 };
218 
219 static devclass_t arcmsr_devclass;
220 DRIVER_MODULE(arcmsr, pci, arcmsr_driver, arcmsr_devclass, 0, 0);
221 MODULE_DEPEND(arcmsr, pci, 1, 1, 1);
222 MODULE_DEPEND(arcmsr, cam, 1, 1, 1);
223 #ifndef BUS_DMA_COHERENT
224 	#define	BUS_DMA_COHERENT	0x04	/* hint: map memory in a coherent way */
225 #endif
226 static struct cdevsw arcmsr_cdevsw={
227 		.d_version = D_VERSION,
228 		.d_open    = arcmsr_open, 	/* open     */
229 		.d_close   = arcmsr_close, 	/* close    */
230 		.d_ioctl   = arcmsr_ioctl, 	/* ioctl    */
231 		.d_name    = "arcmsr", 		/* name     */
232 	};
233 /*
234 **************************************************************************
235 **************************************************************************
236 */
237 static int arcmsr_open(struct cdev *dev, int flags, int fmt, struct thread *proc)
238 {
239 	int	unit = dev2unit(dev);
240 	struct AdapterControlBlock *acb = devclass_get_softc(arcmsr_devclass, unit);
241 
242 	if (acb == NULL) {
243 		return ENXIO;
244 	}
245 	return (0);
246 }
247 /*
248 **************************************************************************
249 **************************************************************************
250 */
251 static int arcmsr_close(struct cdev *dev, int flags, int fmt, struct thread *proc)
252 {
253 	int	unit = dev2unit(dev);
254 	struct AdapterControlBlock *acb = devclass_get_softc(arcmsr_devclass, unit);
255 
256 	if (acb == NULL) {
257 		return ENXIO;
258 	}
259 	return 0;
260 }
261 /*
262 **************************************************************************
263 **************************************************************************
264 */
265 static int arcmsr_ioctl(struct cdev *dev, u_long ioctl_cmd, caddr_t arg, int flags, struct thread *proc)
266 {
267 	int	unit = dev2unit(dev);
268 	struct AdapterControlBlock *acb = devclass_get_softc(arcmsr_devclass, unit);
269 
270 	if (acb == NULL) {
271 		return ENXIO;
272 	}
273 	return (arcmsr_iop_ioctlcmd(acb, ioctl_cmd, arg));
274 }
275 /*
276 **********************************************************************
277 **********************************************************************
278 */
279 static u_int32_t arcmsr_disable_allintr( struct AdapterControlBlock *acb)
280 {
281 	u_int32_t intmask_org = 0;
282 
283 	switch (acb->adapter_type) {
284 	case ACB_ADAPTER_TYPE_A: {
285 			/* disable all outbound interrupt */
286 			intmask_org = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intmask); /* disable outbound message0 int */
287 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intmask, intmask_org|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE);
288 		}
289 		break;
290 	case ACB_ADAPTER_TYPE_B: {
291 			struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
292 			/* disable all outbound interrupt */
293 			intmask_org = READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell_mask)
294 						& (~ARCMSR_IOP2DRV_MESSAGE_CMD_DONE); /* disable outbound message0 int */
295 			WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell_mask, 0); /* disable all interrupt */
296 		}
297 		break;
298 	case ACB_ADAPTER_TYPE_C: {
299 			/* disable all outbound interrupt */
300 			intmask_org = CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_mask); /* disable outbound message0 int */
301 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE);
302 		}
303 		break;
304 	case ACB_ADAPTER_TYPE_D: {
305 			/* disable all outbound interrupt */
306 			intmask_org = CHIP_REG_READ32(HBD_MessageUnit, 0, pcief0_int_enable); /* disable outbound message0 int */
307 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, pcief0_int_enable, ARCMSR_HBDMU_ALL_INT_DISABLE);
308 		}
309 		break;
310 	case ACB_ADAPTER_TYPE_E:
311 	case ACB_ADAPTER_TYPE_F: {
312 			/* disable all outbound interrupt */
313 			intmask_org = CHIP_REG_READ32(HBE_MessageUnit, 0, host_int_mask); /* disable outbound message0 int */
314 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_mask, intmask_org | ARCMSR_HBEMU_ALL_INTMASKENABLE);
315 		}
316 		break;
317 	}
318 	return (intmask_org);
319 }
320 /*
321 **********************************************************************
322 **********************************************************************
323 */
324 static void arcmsr_enable_allintr( struct AdapterControlBlock *acb, u_int32_t intmask_org)
325 {
326 	u_int32_t mask;
327 
328 	switch (acb->adapter_type) {
329 	case ACB_ADAPTER_TYPE_A: {
330 			/* enable outbound Post Queue, outbound doorbell Interrupt */
331 			mask = ~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE|ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE|ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE);
332 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intmask, intmask_org & mask);
333 			acb->outbound_int_enable = ~(intmask_org & mask) & 0x000000ff;
334 		}
335 		break;
336 	case ACB_ADAPTER_TYPE_B: {
337 			struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
338 			/* enable ARCMSR_IOP2DRV_MESSAGE_CMD_DONE */
339 			mask = (ARCMSR_IOP2DRV_DATA_WRITE_OK|ARCMSR_IOP2DRV_DATA_READ_OK|ARCMSR_IOP2DRV_CDB_DONE|ARCMSR_IOP2DRV_MESSAGE_CMD_DONE);
340 			WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell_mask, intmask_org | mask); /*1=interrupt enable, 0=interrupt disable*/
341 			acb->outbound_int_enable = (intmask_org | mask) & 0x0000000f;
342 		}
343 		break;
344 	case ACB_ADAPTER_TYPE_C: {
345 			/* enable outbound Post Queue, outbound doorbell Interrupt */
346 			mask = ~(ARCMSR_HBCMU_UTILITY_A_ISR_MASK | ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR_MASK | ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR_MASK);
347 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, host_int_mask, intmask_org & mask);
348 			acb->outbound_int_enable = ~(intmask_org & mask) & 0x0000000f;
349 		}
350 		break;
351 	case ACB_ADAPTER_TYPE_D: {
352 			/* enable outbound Post Queue, outbound doorbell Interrupt */
353 			mask = ARCMSR_HBDMU_ALL_INT_ENABLE;
354 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, pcief0_int_enable, intmask_org | mask);
355 			CHIP_REG_READ32(HBD_MessageUnit, 0, pcief0_int_enable);
356 			acb->outbound_int_enable = mask;
357 		}
358 		break;
359 	case ACB_ADAPTER_TYPE_E:
360 	case ACB_ADAPTER_TYPE_F: {
361 			/* enable outbound Post Queue, outbound doorbell Interrupt */
362 			mask = ~(ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR | ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR);
363 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_mask, intmask_org & mask);
364 			acb->outbound_int_enable = ~(intmask_org & mask) & 0x0000000f;
365 		}
366 		break;
367 	}
368 }
369 /*
370 **********************************************************************
371 **********************************************************************
372 */
373 static u_int8_t arcmsr_hba_wait_msgint_ready(struct AdapterControlBlock *acb)
374 {
375 	u_int32_t Index;
376 	u_int8_t Retries = 0x00;
377 
378 	do {
379 		for(Index=0; Index < 100; Index++) {
380 			if(CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
381 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);/*clear interrupt*/
382 				return TRUE;
383 			}
384 			UDELAY(10000);
385 		}/*max 1 seconds*/
386 	}while(Retries++ < 20);/*max 20 sec*/
387 	return (FALSE);
388 }
389 /*
390 **********************************************************************
391 **********************************************************************
392 */
393 static u_int8_t arcmsr_hbb_wait_msgint_ready(struct AdapterControlBlock *acb)
394 {
395 	u_int32_t Index;
396 	u_int8_t Retries = 0x00;
397 	struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
398 
399 	do {
400 		for(Index=0; Index < 100; Index++) {
401 			if(READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell) & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
402 				WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);/*clear interrupt*/
403 				WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
404 				return TRUE;
405 			}
406 			UDELAY(10000);
407 		}/*max 1 seconds*/
408 	}while(Retries++ < 20);/*max 20 sec*/
409 	return (FALSE);
410 }
411 /*
412 **********************************************************************
413 **********************************************************************
414 */
415 static u_int8_t arcmsr_hbc_wait_msgint_ready(struct AdapterControlBlock *acb)
416 {
417 	u_int32_t Index;
418 	u_int8_t Retries = 0x00;
419 
420 	do {
421 		for(Index=0; Index < 100; Index++) {
422 			if(CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
423 				CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);/*clear interrupt*/
424 				return TRUE;
425 			}
426 			UDELAY(10000);
427 		}/*max 1 seconds*/
428 	}while(Retries++ < 20);/*max 20 sec*/
429 	return (FALSE);
430 }
431 /*
432 **********************************************************************
433 **********************************************************************
434 */
435 static u_int8_t arcmsr_hbd_wait_msgint_ready(struct AdapterControlBlock *acb)
436 {
437 	u_int32_t Index;
438 	u_int8_t Retries = 0x00;
439 
440 	do {
441 		for(Index=0; Index < 100; Index++) {
442 			if(CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE) {
443 				CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE_CLEAR);/*clear interrupt*/
444 				return TRUE;
445 			}
446 			UDELAY(10000);
447 		}/*max 1 seconds*/
448 	}while(Retries++ < 20);/*max 20 sec*/
449 	return (FALSE);
450 }
451 /*
452 **********************************************************************
453 **********************************************************************
454 */
455 static u_int8_t arcmsr_hbe_wait_msgint_ready(struct AdapterControlBlock *acb)
456 {
457 	u_int32_t Index, read_doorbell;
458 	u_int8_t Retries = 0x00;
459 
460 	do {
461 		for(Index=0; Index < 100; Index++) {
462 			read_doorbell = CHIP_REG_READ32(HBE_MessageUnit, 0, iobound_doorbell);
463 			if((read_doorbell ^ acb->in_doorbell) & ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE) {
464 				CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0);/*clear interrupt*/
465 				acb->in_doorbell = read_doorbell;
466 				return TRUE;
467 			}
468 			UDELAY(10000);
469 		}/*max 1 seconds*/
470 	}while(Retries++ < 20);/*max 20 sec*/
471 	return (FALSE);
472 }
473 /*
474 ************************************************************************
475 ************************************************************************
476 */
477 static void arcmsr_flush_hba_cache(struct AdapterControlBlock *acb)
478 {
479 	int retry_count = 30;/* enlarge wait flush adapter cache time: 10 minute */
480 
481 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
482 	do {
483 		if(arcmsr_hba_wait_msgint_ready(acb)) {
484 			break;
485 		} else {
486 			retry_count--;
487 		}
488 	}while(retry_count != 0);
489 }
490 /*
491 ************************************************************************
492 ************************************************************************
493 */
494 static void arcmsr_flush_hbb_cache(struct AdapterControlBlock *acb)
495 {
496 	int retry_count = 30;/* enlarge wait flush adapter cache time: 10 minute */
497 	struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
498 
499 	WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_FLUSH_CACHE);
500 	do {
501 		if(arcmsr_hbb_wait_msgint_ready(acb)) {
502 			break;
503 		} else {
504 			retry_count--;
505 		}
506 	}while(retry_count != 0);
507 }
508 /*
509 ************************************************************************
510 ************************************************************************
511 */
512 static void arcmsr_flush_hbc_cache(struct AdapterControlBlock *acb)
513 {
514 	int retry_count = 30;/* enlarge wait flush adapter cache time: 10 minute */
515 
516 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
517 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
518 	do {
519 		if(arcmsr_hbc_wait_msgint_ready(acb)) {
520 			break;
521 		} else {
522 			retry_count--;
523 		}
524 	}while(retry_count != 0);
525 }
526 /*
527 ************************************************************************
528 ************************************************************************
529 */
530 static void arcmsr_flush_hbd_cache(struct AdapterControlBlock *acb)
531 {
532 	int retry_count = 30; /* enlarge wait flush adapter cache time: 10 minute */
533 
534 	CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
535 	do {
536 		if(arcmsr_hbd_wait_msgint_ready(acb)) {
537 			break;
538 		} else {
539 			retry_count--;
540 		}
541 	}while(retry_count != 0);
542 }
543 /*
544 ************************************************************************
545 ************************************************************************
546 */
547 static void arcmsr_flush_hbe_cache(struct AdapterControlBlock *acb)
548 {
549 	int retry_count = 30;/* enlarge wait flush adapter cache time: 10 minute */
550 
551 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_FLUSH_CACHE);
552 	acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
553 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
554 	do {
555 		if(arcmsr_hbe_wait_msgint_ready(acb)) {
556 			break;
557 		} else {
558 			retry_count--;
559 		}
560 	}while(retry_count != 0);
561 }
562 /*
563 ************************************************************************
564 ************************************************************************
565 */
566 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb)
567 {
568 	switch (acb->adapter_type) {
569 	case ACB_ADAPTER_TYPE_A: {
570 			arcmsr_flush_hba_cache(acb);
571 		}
572 		break;
573 	case ACB_ADAPTER_TYPE_B: {
574 			arcmsr_flush_hbb_cache(acb);
575 		}
576 		break;
577 	case ACB_ADAPTER_TYPE_C: {
578 			arcmsr_flush_hbc_cache(acb);
579 		}
580 		break;
581 	case ACB_ADAPTER_TYPE_D: {
582 			arcmsr_flush_hbd_cache(acb);
583 		}
584 		break;
585 	case ACB_ADAPTER_TYPE_E:
586 	case ACB_ADAPTER_TYPE_F: {
587 			arcmsr_flush_hbe_cache(acb);
588 		}
589 		break;
590 	}
591 }
592 /*
593 *******************************************************************************
594 *******************************************************************************
595 */
596 static int arcmsr_suspend(device_t dev)
597 {
598 	struct AdapterControlBlock	*acb = device_get_softc(dev);
599 
600 	/* flush controller */
601 	arcmsr_iop_parking(acb);
602 	/* disable all outbound interrupt */
603 	arcmsr_disable_allintr(acb);
604 	return(0);
605 }
606 /*
607 *******************************************************************************
608 *******************************************************************************
609 */
610 static int arcmsr_resume(device_t dev)
611 {
612 	struct AdapterControlBlock	*acb = device_get_softc(dev);
613 
614 	arcmsr_iop_init(acb);
615 	return(0);
616 }
617 /*
618 *********************************************************************************
619 *********************************************************************************
620 */
621 static void arcmsr_async(void *cb_arg, u_int32_t code, struct cam_path *path, void *arg)
622 {
623 	struct AdapterControlBlock *acb;
624 	u_int8_t target_id, target_lun;
625 	struct cam_sim *sim;
626 
627 	sim = (struct cam_sim *) cb_arg;
628 	acb =(struct AdapterControlBlock *) cam_sim_softc(sim);
629 	switch (code) {
630 	case AC_LOST_DEVICE:
631 		target_id = xpt_path_target_id(path);
632 		target_lun = xpt_path_lun_id(path);
633 		if((target_id > ARCMSR_MAX_TARGETID) || (target_lun > ARCMSR_MAX_TARGETLUN)) {
634 			break;
635 		}
636 	//	printf("%s:scsi id=%d lun=%d device lost \n", device_get_name(acb->pci_dev), target_id, target_lun);
637 		break;
638 	default:
639 		break;
640 	}
641 }
642 /*
643 **********************************************************************
644 **********************************************************************
645 */
646 static void arcmsr_report_sense_info(struct CommandControlBlock *srb)
647 {
648 	union ccb *pccb = srb->pccb;
649 
650 	pccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR;
651 	pccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
652 	if(pccb->csio.sense_len) {
653 		memset(&pccb->csio.sense_data, 0, sizeof(pccb->csio.sense_data));
654 		memcpy(&pccb->csio.sense_data, srb->arcmsr_cdb.SenseData,
655 		get_min(sizeof(struct SENSE_DATA), sizeof(pccb->csio.sense_data)));
656 		((u_int8_t *)&pccb->csio.sense_data)[0] = (0x1 << 7 | 0x70); /* Valid,ErrorCode */
657 		pccb->ccb_h.status |= CAM_AUTOSNS_VALID;
658 	}
659 }
660 /*
661 *********************************************************************
662 *********************************************************************
663 */
664 static void arcmsr_abort_hba_allcmd(struct AdapterControlBlock *acb)
665 {
666 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
667 	if(!arcmsr_hba_wait_msgint_ready(acb)) {
668 		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
669 	}
670 }
671 /*
672 *********************************************************************
673 *********************************************************************
674 */
675 static void arcmsr_abort_hbb_allcmd(struct AdapterControlBlock *acb)
676 {
677 	struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
678 	WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_ABORT_CMD);
679 	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
680 		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
681 	}
682 }
683 /*
684 *********************************************************************
685 *********************************************************************
686 */
687 static void arcmsr_abort_hbc_allcmd(struct AdapterControlBlock *acb)
688 {
689 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
690 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
691 	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
692 		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
693 	}
694 }
695 /*
696 *********************************************************************
697 *********************************************************************
698 */
699 static void arcmsr_abort_hbd_allcmd(struct AdapterControlBlock *acb)
700 {
701 	CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
702 	if(!arcmsr_hbd_wait_msgint_ready(acb)) {
703 		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
704 	}
705 }
706 /*
707 *********************************************************************
708 *********************************************************************
709 */
710 static void arcmsr_abort_hbe_allcmd(struct AdapterControlBlock *acb)
711 {
712 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_ABORT_CMD);
713 	acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
714 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
715 	if(!arcmsr_hbe_wait_msgint_ready(acb)) {
716 		printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
717 	}
718 }
719 /*
720 *********************************************************************
721 *********************************************************************
722 */
723 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb)
724 {
725 	switch (acb->adapter_type) {
726 	case ACB_ADAPTER_TYPE_A: {
727 			arcmsr_abort_hba_allcmd(acb);
728 		}
729 		break;
730 	case ACB_ADAPTER_TYPE_B: {
731 			arcmsr_abort_hbb_allcmd(acb);
732 		}
733 		break;
734 	case ACB_ADAPTER_TYPE_C: {
735 			arcmsr_abort_hbc_allcmd(acb);
736 		}
737 		break;
738 	case ACB_ADAPTER_TYPE_D: {
739 			arcmsr_abort_hbd_allcmd(acb);
740 		}
741 		break;
742 	case ACB_ADAPTER_TYPE_E:
743 	case ACB_ADAPTER_TYPE_F: {
744 			arcmsr_abort_hbe_allcmd(acb);
745 		}
746 		break;
747 	}
748 }
749 /*
750 **********************************************************************
751 **********************************************************************
752 */
753 static void arcmsr_srb_complete(struct CommandControlBlock *srb, int stand_flag)
754 {
755 	struct AdapterControlBlock *acb = srb->acb;
756 	union ccb *pccb = srb->pccb;
757 
758 	if(srb->srb_flags & SRB_FLAG_TIMER_START)
759 		callout_stop(&srb->ccb_callout);
760 	if((pccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
761 		bus_dmasync_op_t op;
762 
763 		if((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
764 			op = BUS_DMASYNC_POSTREAD;
765 		} else {
766 			op = BUS_DMASYNC_POSTWRITE;
767 		}
768 		bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
769 		bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap);
770 	}
771 	if(stand_flag == 1) {
772 		atomic_subtract_int(&acb->srboutstandingcount, 1);
773 		if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) && (
774 		acb->srboutstandingcount < (acb->maxOutstanding -10))) {
775 			acb->acb_flags &= ~ACB_F_CAM_DEV_QFRZN;
776 			pccb->ccb_h.status |= CAM_RELEASE_SIMQ;
777 		}
778 	}
779 	if(srb->srb_state != ARCMSR_SRB_TIMEOUT)
780 		arcmsr_free_srb(srb);
781 	acb->pktReturnCount++;
782 	xpt_done(pccb);
783 }
784 /*
785 **************************************************************************
786 **************************************************************************
787 */
788 static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, struct CommandControlBlock *srb, u_int16_t error)
789 {
790 	int target, lun;
791 
792 	target = srb->pccb->ccb_h.target_id;
793 	lun = srb->pccb->ccb_h.target_lun;
794 	if(error == FALSE) {
795 		if(acb->devstate[target][lun] == ARECA_RAID_GONE) {
796 			acb->devstate[target][lun] = ARECA_RAID_GOOD;
797 		}
798 		srb->pccb->ccb_h.status |= CAM_REQ_CMP;
799 		arcmsr_srb_complete(srb, 1);
800 	} else {
801 		switch(srb->arcmsr_cdb.DeviceStatus) {
802 		case ARCMSR_DEV_SELECT_TIMEOUT: {
803 				if(acb->devstate[target][lun] == ARECA_RAID_GOOD) {
804 					printf( "arcmsr%d: Target=%x, Lun=%x, selection timeout, raid volume was lost\n", acb->pci_unit, target, lun);
805 				}
806 				acb->devstate[target][lun] = ARECA_RAID_GONE;
807 				srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
808 				arcmsr_srb_complete(srb, 1);
809 			}
810 			break;
811 		case ARCMSR_DEV_ABORTED:
812 		case ARCMSR_DEV_INIT_FAIL: {
813 				acb->devstate[target][lun] = ARECA_RAID_GONE;
814 				srb->pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
815 				arcmsr_srb_complete(srb, 1);
816 			}
817 			break;
818 		case SCSISTAT_CHECK_CONDITION: {
819 				acb->devstate[target][lun] = ARECA_RAID_GOOD;
820 				arcmsr_report_sense_info(srb);
821 				arcmsr_srb_complete(srb, 1);
822 			}
823 			break;
824 		default:
825 			printf("arcmsr%d: scsi id=%d lun=%d isr got command error done,but got unknown DeviceStatus=0x%x \n"
826 					, acb->pci_unit, target, lun ,srb->arcmsr_cdb.DeviceStatus);
827 			acb->devstate[target][lun] = ARECA_RAID_GONE;
828 			srb->pccb->ccb_h.status |= CAM_UNCOR_PARITY;
829 			/*unknown error or crc error just for retry*/
830 			arcmsr_srb_complete(srb, 1);
831 			break;
832 		}
833 	}
834 }
835 /*
836 **************************************************************************
837 **************************************************************************
838 */
839 static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb, u_int16_t error)
840 {
841 	struct CommandControlBlock *srb;
842 
843 	/* check if command done with no error*/
844 	switch (acb->adapter_type) {
845 	case ACB_ADAPTER_TYPE_A:
846 	case ACB_ADAPTER_TYPE_B:
847 		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
848 		break;
849 	case ACB_ADAPTER_TYPE_C:
850 	case ACB_ADAPTER_TYPE_D:
851 		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0)); /*frame must be 32 bytes aligned*/
852 		break;
853 	case ACB_ADAPTER_TYPE_E:
854 	case ACB_ADAPTER_TYPE_F:
855 		srb = acb->psrb_pool[flag_srb];
856 		break;
857 	default:
858 		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
859 		break;
860 	}
861 	if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
862 		if(srb->srb_state == ARCMSR_SRB_TIMEOUT) {
863 			arcmsr_free_srb(srb);
864 			printf("arcmsr%d: srb='%p' return srb has been timeouted\n", acb->pci_unit, srb);
865 			return;
866 		}
867 		printf("arcmsr%d: return srb has been completed\n"
868 			"srb='%p' srb_state=0x%x outstanding srb count=%d \n",
869 			acb->pci_unit, srb, srb->srb_state, acb->srboutstandingcount);
870 		return;
871 	}
872 	arcmsr_report_srb_state(acb, srb, error);
873 }
874 /*
875 **************************************************************************
876 **************************************************************************
877 */
878 static void	arcmsr_srb_timeout(void *arg)
879 {
880 	struct CommandControlBlock *srb = (struct CommandControlBlock *)arg;
881 	struct AdapterControlBlock *acb;
882 	int target, lun;
883 	u_int8_t cmd;
884 
885 	target = srb->pccb->ccb_h.target_id;
886 	lun = srb->pccb->ccb_h.target_lun;
887 	acb = srb->acb;
888 	ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
889 	if(srb->srb_state == ARCMSR_SRB_START)
890 	{
891 		cmd = scsiio_cdb_ptr(&srb->pccb->csio)[0];
892 		srb->srb_state = ARCMSR_SRB_TIMEOUT;
893 		srb->pccb->ccb_h.status |= CAM_CMD_TIMEOUT;
894 		arcmsr_srb_complete(srb, 1);
895 		printf("arcmsr%d: scsi id %d lun %d cmd=0x%x srb='%p' ccb command time out!\n",
896 				 acb->pci_unit, target, lun, cmd, srb);
897 	}
898 	ARCMSR_LOCK_RELEASE(&acb->isr_lock);
899 #ifdef ARCMSR_DEBUG1
900 	arcmsr_dump_data(acb);
901 #endif
902 }
903 
904 /*
905 **********************************************************************
906 **********************************************************************
907 */
908 static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb)
909 {
910 	int i=0;
911 	u_int32_t flag_srb;
912 	u_int16_t error;
913 
914 	switch (acb->adapter_type) {
915 	case ACB_ADAPTER_TYPE_A: {
916 			u_int32_t outbound_intstatus;
917 
918 			/*clear and abort all outbound posted Q*/
919 			outbound_intstatus = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
920 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intstatus);/*clear interrupt*/
921 			while(((flag_srb=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_queueport)) != 0xFFFFFFFF) && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
922 				error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
923 				arcmsr_drain_donequeue(acb, flag_srb, error);
924 			}
925 		}
926 		break;
927 	case ACB_ADAPTER_TYPE_B: {
928 			struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
929 
930 			/*clear all outbound posted Q*/
931 			WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ARCMSR_DOORBELL_INT_CLEAR_PATTERN); /* clear doorbell interrupt */
932 			for(i=0; i < ARCMSR_MAX_HBB_POSTQUEUE; i++) {
933 				if((flag_srb = phbbmu->done_qbuffer[i]) != 0) {
934 					phbbmu->done_qbuffer[i] = 0;
935 					error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
936 					arcmsr_drain_donequeue(acb, flag_srb, error);
937 				}
938 				phbbmu->post_qbuffer[i] = 0;
939 			}/*drain reply FIFO*/
940 			phbbmu->doneq_index = 0;
941 			phbbmu->postq_index = 0;
942 		}
943 		break;
944 	case ACB_ADAPTER_TYPE_C: {
945 			while((CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) && (i++ < ARCMSR_MAX_OUTSTANDING_CMD)) {
946 				flag_srb = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
947 				error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
948 				arcmsr_drain_donequeue(acb, flag_srb, error);
949 			}
950 		}
951 		break;
952 	case ACB_ADAPTER_TYPE_D:
953 		arcmsr_hbd_postqueue_isr(acb);
954 		break;
955 	case ACB_ADAPTER_TYPE_E:
956 		arcmsr_hbe_postqueue_isr(acb);
957 		break;
958 	case ACB_ADAPTER_TYPE_F:
959 		arcmsr_hbf_postqueue_isr(acb);
960 		break;
961 	}
962 }
963 /*
964 ****************************************************************************
965 ****************************************************************************
966 */
967 static void arcmsr_iop_reset(struct AdapterControlBlock *acb)
968 {
969 	struct CommandControlBlock *srb;
970 	u_int32_t intmask_org;
971 	u_int32_t i=0;
972 
973 	if(acb->srboutstandingcount>0) {
974 		/* disable all outbound interrupt */
975 		intmask_org = arcmsr_disable_allintr(acb);
976 		/*clear and abort all outbound posted Q*/
977 		arcmsr_done4abort_postqueue(acb);
978 		/* talk to iop 331 outstanding command aborted*/
979 		arcmsr_abort_allcmd(acb);
980 		for(i=0; i < ARCMSR_MAX_FREESRB_NUM; i++) {
981 			srb = acb->psrb_pool[i];
982 			if(srb->srb_state == ARCMSR_SRB_START) {
983 				srb->srb_state = ARCMSR_SRB_ABORTED;
984 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
985 				arcmsr_srb_complete(srb, 1);
986 				printf("arcmsr%d: scsi id=%d lun=%jx srb='%p' aborted\n"
987 						, acb->pci_unit, srb->pccb->ccb_h.target_id
988 						, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
989 			}
990 		}
991 		/* enable all outbound interrupt */
992 		arcmsr_enable_allintr(acb, intmask_org);
993 	}
994 	acb->srboutstandingcount = 0;
995 	acb->workingsrb_doneindex = 0;
996 	acb->workingsrb_startindex = 0;
997 	acb->pktRequestCount = 0;
998 	acb->pktReturnCount = 0;
999 }
1000 /*
1001 **********************************************************************
1002 **********************************************************************
1003 */
1004 static void arcmsr_build_srb(struct CommandControlBlock *srb,
1005 		bus_dma_segment_t *dm_segs, u_int32_t nseg)
1006 {
1007 	struct ARCMSR_CDB *arcmsr_cdb = &srb->arcmsr_cdb;
1008 	u_int8_t *psge = (u_int8_t *)&arcmsr_cdb->u;
1009 	u_int32_t address_lo, address_hi;
1010 	union ccb *pccb = srb->pccb;
1011 	struct ccb_scsiio *pcsio = &pccb->csio;
1012 	u_int32_t arccdbsize = 0x30;
1013 
1014 	memset(arcmsr_cdb, 0, sizeof(struct ARCMSR_CDB));
1015 	arcmsr_cdb->Bus = 0;
1016 	arcmsr_cdb->TargetID = pccb->ccb_h.target_id;
1017 	arcmsr_cdb->LUN = pccb->ccb_h.target_lun;
1018 	arcmsr_cdb->Function = 1;
1019 	arcmsr_cdb->CdbLength = (u_int8_t)pcsio->cdb_len;
1020 	bcopy(scsiio_cdb_ptr(pcsio), arcmsr_cdb->Cdb, pcsio->cdb_len);
1021 	if(nseg != 0) {
1022 		struct AdapterControlBlock *acb = srb->acb;
1023 		bus_dmasync_op_t op;
1024 		u_int32_t length, i, cdb_sgcount = 0;
1025 
1026 		if((pccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
1027 			op = BUS_DMASYNC_PREREAD;
1028 		} else {
1029 			op = BUS_DMASYNC_PREWRITE;
1030 			arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_WRITE;
1031 			srb->srb_flags |= SRB_FLAG_WRITE;
1032 		}
1033 		bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
1034 		for(i=0; i < nseg; i++) {
1035 			/* Get the physical address of the current data pointer */
1036 			length = arcmsr_htole32(dm_segs[i].ds_len);
1037 			address_lo = arcmsr_htole32(dma_addr_lo32(dm_segs[i].ds_addr));
1038 			address_hi = arcmsr_htole32(dma_addr_hi32(dm_segs[i].ds_addr));
1039 			if(address_hi == 0) {
1040 				struct SG32ENTRY *pdma_sg = (struct SG32ENTRY *)psge;
1041 				pdma_sg->address = address_lo;
1042 				pdma_sg->length = length;
1043 				psge += sizeof(struct SG32ENTRY);
1044 				arccdbsize += sizeof(struct SG32ENTRY);
1045 			} else {
1046 				u_int32_t sg64s_size = 0, tmplength = length;
1047 
1048 				while(1) {
1049 					u_int64_t span4G, length0;
1050 					struct SG64ENTRY *pdma_sg = (struct SG64ENTRY *)psge;
1051 
1052 					span4G = (u_int64_t)address_lo + tmplength;
1053 					pdma_sg->addresshigh = address_hi;
1054 					pdma_sg->address = address_lo;
1055 					if(span4G > 0x100000000) {
1056 						/*see if cross 4G boundary*/
1057 						length0 = 0x100000000-address_lo;
1058 						pdma_sg->length = (u_int32_t)length0 | IS_SG64_ADDR;
1059 						address_hi = address_hi+1;
1060 						address_lo = 0;
1061 						tmplength = tmplength - (u_int32_t)length0;
1062 						sg64s_size += sizeof(struct SG64ENTRY);
1063 						psge += sizeof(struct SG64ENTRY);
1064 						cdb_sgcount++;
1065 					} else {
1066 						pdma_sg->length = tmplength | IS_SG64_ADDR;
1067 						sg64s_size += sizeof(struct SG64ENTRY);
1068 						psge += sizeof(struct SG64ENTRY);
1069 						break;
1070 					}
1071 				}
1072 				arccdbsize += sg64s_size;
1073 			}
1074 			cdb_sgcount++;
1075 		}
1076 		arcmsr_cdb->sgcount = (u_int8_t)cdb_sgcount;
1077 		arcmsr_cdb->DataLength = pcsio->dxfer_len;
1078 		if( arccdbsize > 256) {
1079 			arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_SGL_BSIZE;
1080 		}
1081 	} else {
1082 		arcmsr_cdb->DataLength = 0;
1083 	}
1084 	srb->arc_cdb_size = arccdbsize;
1085 	arcmsr_cdb->msgPages = (arccdbsize/256) + ((arccdbsize % 256) ? 1 : 0);
1086 }
1087 /*
1088 **************************************************************************
1089 **************************************************************************
1090 */
1091 static void arcmsr_post_srb(struct AdapterControlBlock *acb, struct CommandControlBlock *srb)
1092 {
1093 	u_int32_t cdb_phyaddr_low = (u_int32_t) srb->cdb_phyaddr_low;
1094 	struct ARCMSR_CDB *arcmsr_cdb = (struct ARCMSR_CDB *)&srb->arcmsr_cdb;
1095 
1096 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, (srb->srb_flags & SRB_FLAG_WRITE) ? BUS_DMASYNC_POSTWRITE:BUS_DMASYNC_POSTREAD);
1097 	atomic_add_int(&acb->srboutstandingcount, 1);
1098 	srb->srb_state = ARCMSR_SRB_START;
1099 
1100 	switch (acb->adapter_type) {
1101 	case ACB_ADAPTER_TYPE_A: {
1102 			if(arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) {
1103 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_queueport, cdb_phyaddr_low|ARCMSR_SRBPOST_FLAG_SGL_BSIZE);
1104 			} else {
1105 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_queueport, cdb_phyaddr_low);
1106 			}
1107 		}
1108 		break;
1109 	case ACB_ADAPTER_TYPE_B: {
1110 			struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1111 			int ending_index, index;
1112 
1113 			index = phbbmu->postq_index;
1114 			ending_index = ((index+1) % ARCMSR_MAX_HBB_POSTQUEUE);
1115 			phbbmu->post_qbuffer[ending_index] = 0;
1116 			if(arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) {
1117 				phbbmu->post_qbuffer[index] = cdb_phyaddr_low | ARCMSR_SRBPOST_FLAG_SGL_BSIZE;
1118 			} else {
1119 				phbbmu->post_qbuffer[index] = cdb_phyaddr_low;
1120 			}
1121 			index++;
1122 			index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
1123 			phbbmu->postq_index = index;
1124 			WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_CDB_POSTED);
1125 		}
1126 		break;
1127 	case ACB_ADAPTER_TYPE_C: {
1128 			u_int32_t ccb_post_stamp, arc_cdb_size, cdb_phyaddr_hi32;
1129 
1130 			arc_cdb_size = (srb->arc_cdb_size > 0x300) ? 0x300 : srb->arc_cdb_size;
1131 			ccb_post_stamp = (cdb_phyaddr_low | ((arc_cdb_size-1) >> 6) | 1);
1132 			cdb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
1133 			if(cdb_phyaddr_hi32)
1134 			{
1135 				CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_high, cdb_phyaddr_hi32);
1136 				CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
1137 			}
1138 			else
1139 			{
1140 				CHIP_REG_WRITE32(HBC_MessageUnit,0,inbound_queueport_low, ccb_post_stamp);
1141 			}
1142 		}
1143 		break;
1144 	case ACB_ADAPTER_TYPE_D: {
1145 			struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
1146 			u_int16_t index_stripped;
1147 			u_int16_t postq_index;
1148 			struct InBound_SRB *pinbound_srb;
1149 
1150 			ARCMSR_LOCK_ACQUIRE(&acb->postDone_lock);
1151 			postq_index = phbdmu->postq_index;
1152 			pinbound_srb = (struct InBound_SRB *)&phbdmu->post_qbuffer[postq_index & 0xFF];
1153 			pinbound_srb->addressHigh = srb->cdb_phyaddr_high;
1154 			pinbound_srb->addressLow = srb->cdb_phyaddr_low;
1155 			pinbound_srb->length = srb->arc_cdb_size >> 2;
1156 			arcmsr_cdb->Context = srb->cdb_phyaddr_low;
1157 			if (postq_index & 0x4000) {
1158 				index_stripped = postq_index & 0xFF;
1159 				index_stripped += 1;
1160 				index_stripped %= ARCMSR_MAX_HBD_POSTQUEUE;
1161 				phbdmu->postq_index = index_stripped ? (index_stripped | 0x4000) : index_stripped;
1162 			} else {
1163 				index_stripped = postq_index;
1164 				index_stripped += 1;
1165 				index_stripped %= ARCMSR_MAX_HBD_POSTQUEUE;
1166 				phbdmu->postq_index = index_stripped ? index_stripped : (index_stripped | 0x4000);
1167 			}
1168 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, inboundlist_write_pointer, postq_index);
1169 			ARCMSR_LOCK_RELEASE(&acb->postDone_lock);
1170 		}
1171 		break;
1172 	case ACB_ADAPTER_TYPE_E: {
1173 			u_int32_t ccb_post_stamp, arc_cdb_size;
1174 
1175 			arc_cdb_size = (srb->arc_cdb_size > 0x300) ? 0x300 : srb->arc_cdb_size;
1176 			ccb_post_stamp = (srb->smid | ((arc_cdb_size-1) >> 6));
1177 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_queueport_high, 0);
1178 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_queueport_low, ccb_post_stamp);
1179 		}
1180 		break;
1181 	case ACB_ADAPTER_TYPE_F: {
1182 			u_int32_t ccb_post_stamp, arc_cdb_size;
1183 
1184 			if (srb->arc_cdb_size <= 0x300)
1185 				arc_cdb_size = (srb->arc_cdb_size - 1) >> 6 | 1;
1186 			else
1187 				arc_cdb_size = (((srb->arc_cdb_size + 0xff) >> 8) + 2) << 1 | 1;
1188 			ccb_post_stamp = (srb->smid | arc_cdb_size);
1189 			CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_queueport_high, 0);
1190 			CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_queueport_low, ccb_post_stamp);
1191 		}
1192 		break;
1193 	}
1194 }
1195 /*
1196 ************************************************************************
1197 ************************************************************************
1198 */
1199 static struct QBUFFER *arcmsr_get_iop_rqbuffer( struct AdapterControlBlock *acb)
1200 {
1201 	struct QBUFFER *qbuffer=NULL;
1202 
1203 	switch (acb->adapter_type) {
1204 	case ACB_ADAPTER_TYPE_A: {
1205 			struct HBA_MessageUnit *phbamu = (struct HBA_MessageUnit *)acb->pmu;
1206 
1207 			qbuffer = (struct QBUFFER *)&phbamu->message_rbuffer;
1208 		}
1209 		break;
1210 	case ACB_ADAPTER_TYPE_B: {
1211 			struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1212 
1213 			qbuffer = (struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_rbuffer;
1214 		}
1215 		break;
1216 	case ACB_ADAPTER_TYPE_C: {
1217 			struct HBC_MessageUnit *phbcmu = (struct HBC_MessageUnit *)acb->pmu;
1218 
1219 			qbuffer = (struct QBUFFER *)&phbcmu->message_rbuffer;
1220 		}
1221 		break;
1222 	case ACB_ADAPTER_TYPE_D: {
1223 			struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
1224 
1225 			qbuffer = (struct QBUFFER *)&phbdmu->phbdmu->message_rbuffer;
1226 		}
1227 		break;
1228 	case ACB_ADAPTER_TYPE_E: {
1229 			struct HBE_MessageUnit *phbcmu = (struct HBE_MessageUnit *)acb->pmu;
1230 
1231 			qbuffer = (struct QBUFFER *)&phbcmu->message_rbuffer;
1232 		}
1233 		break;
1234 	case ACB_ADAPTER_TYPE_F:
1235 		qbuffer = (struct QBUFFER *)acb->message_rbuffer;
1236 		break;
1237 	}
1238 	return(qbuffer);
1239 }
1240 /*
1241 ************************************************************************
1242 ************************************************************************
1243 */
1244 static struct QBUFFER *arcmsr_get_iop_wqbuffer( struct AdapterControlBlock *acb)
1245 {
1246 	struct QBUFFER *qbuffer = NULL;
1247 
1248 	switch (acb->adapter_type) {
1249 	case ACB_ADAPTER_TYPE_A: {
1250 			struct HBA_MessageUnit *phbamu = (struct HBA_MessageUnit *)acb->pmu;
1251 
1252 			qbuffer = (struct QBUFFER *)&phbamu->message_wbuffer;
1253 		}
1254 		break;
1255 	case ACB_ADAPTER_TYPE_B: {
1256 			struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1257 
1258 			qbuffer = (struct QBUFFER *)&phbbmu->hbb_rwbuffer->message_wbuffer;
1259 		}
1260 		break;
1261 	case ACB_ADAPTER_TYPE_C: {
1262 			struct HBC_MessageUnit *phbcmu = (struct HBC_MessageUnit *)acb->pmu;
1263 
1264 			qbuffer = (struct QBUFFER *)&phbcmu->message_wbuffer;
1265 		}
1266 		break;
1267 	case ACB_ADAPTER_TYPE_D: {
1268 			struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
1269 
1270 			qbuffer = (struct QBUFFER *)&phbdmu->phbdmu->message_wbuffer;
1271 		}
1272 		break;
1273 	case ACB_ADAPTER_TYPE_E: {
1274 			struct HBE_MessageUnit *phbcmu = (struct HBE_MessageUnit *)acb->pmu;
1275 
1276 			qbuffer = (struct QBUFFER *)&phbcmu->message_wbuffer;
1277 		}
1278 		break;
1279 	case ACB_ADAPTER_TYPE_F:
1280 		qbuffer = (struct QBUFFER *)acb->message_wbuffer;
1281 		break;
1282 	}
1283 	return(qbuffer);
1284 }
1285 /*
1286 **************************************************************************
1287 **************************************************************************
1288 */
1289 static void arcmsr_iop_message_read(struct AdapterControlBlock *acb)
1290 {
1291 	switch (acb->adapter_type) {
1292 	case ACB_ADAPTER_TYPE_A: {
1293 			/* let IOP know data has been read */
1294 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
1295 		}
1296 		break;
1297 	case ACB_ADAPTER_TYPE_B: {
1298 			struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1299 			/* let IOP know data has been read */
1300 			WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
1301 		}
1302 		break;
1303 	case ACB_ADAPTER_TYPE_C: {
1304 			/* let IOP know data has been read */
1305 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK);
1306 		}
1307 		break;
1308 	case ACB_ADAPTER_TYPE_D: {
1309 			/* let IOP know data has been read */
1310 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_doorbell, ARCMSR_HBDMU_DRV2IOP_DATA_OUT_READ);
1311 		}
1312 		break;
1313 	case ACB_ADAPTER_TYPE_E:
1314 	case ACB_ADAPTER_TYPE_F: {
1315 			/* let IOP know data has been read */
1316 			acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK;
1317 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
1318 		}
1319 		break;
1320 	}
1321 }
1322 /*
1323 **************************************************************************
1324 **************************************************************************
1325 */
1326 static void arcmsr_iop_message_wrote(struct AdapterControlBlock *acb)
1327 {
1328 	switch (acb->adapter_type) {
1329 	case ACB_ADAPTER_TYPE_A: {
1330 			/*
1331 			** push inbound doorbell tell iop, driver data write ok
1332 			** and wait reply on next hwinterrupt for next Qbuffer post
1333 			*/
1334 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK);
1335 		}
1336 		break;
1337 	case ACB_ADAPTER_TYPE_B: {
1338 			struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1339 			/*
1340 			** push inbound doorbell tell iop, driver data write ok
1341 			** and wait reply on next hwinterrupt for next Qbuffer post
1342 			*/
1343 			WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_WRITE_OK);
1344 		}
1345 		break;
1346 	case ACB_ADAPTER_TYPE_C: {
1347 			/*
1348 			** push inbound doorbell tell iop, driver data write ok
1349 			** and wait reply on next hwinterrupt for next Qbuffer post
1350 			*/
1351 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_WRITE_OK);
1352 		}
1353 		break;
1354 	case ACB_ADAPTER_TYPE_D: {
1355 			/*
1356 			** push inbound doorbell tell iop, driver data write ok
1357 			** and wait reply on next hwinterrupt for next Qbuffer post
1358 			*/
1359 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_doorbell, ARCMSR_HBDMU_DRV2IOP_DATA_IN_READY);
1360 		}
1361 		break;
1362 	case ACB_ADAPTER_TYPE_E:
1363 	case ACB_ADAPTER_TYPE_F: {
1364 			/*
1365 			** push inbound doorbell tell iop, driver data write ok
1366 			** and wait reply on next hwinterrupt for next Qbuffer post
1367 			*/
1368 			acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_WRITE_OK;
1369 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
1370 		}
1371 		break;
1372 	}
1373 }
1374 /*
1375 ************************************************************************
1376 ************************************************************************
1377 */
1378 static void arcmsr_stop_hba_bgrb(struct AdapterControlBlock *acb)
1379 {
1380 	acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1381 	CHIP_REG_WRITE32(HBA_MessageUnit,
1382 		0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
1383 	if(!arcmsr_hba_wait_msgint_ready(acb)) {
1384 		printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
1385 			, acb->pci_unit);
1386 	}
1387 }
1388 /*
1389 ************************************************************************
1390 ************************************************************************
1391 */
1392 static void arcmsr_stop_hbb_bgrb(struct AdapterControlBlock *acb)
1393 {
1394 	struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1395 	acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1396 	WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_STOP_BGRB);
1397 	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
1398 		printf( "arcmsr%d: wait 'stop adapter background rebulid' timeout \n"
1399 			, acb->pci_unit);
1400 	}
1401 }
1402 /*
1403 ************************************************************************
1404 ************************************************************************
1405 */
1406 static void arcmsr_stop_hbc_bgrb(struct AdapterControlBlock *acb)
1407 {
1408 	acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1409 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
1410 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
1411 	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
1412 		printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit);
1413 	}
1414 }
1415 /*
1416 ************************************************************************
1417 ************************************************************************
1418 */
1419 static void arcmsr_stop_hbd_bgrb(struct AdapterControlBlock *acb)
1420 {
1421 	acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1422 	CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
1423 	if(!arcmsr_hbd_wait_msgint_ready(acb)) {
1424 		printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit);
1425 	}
1426 }
1427 /*
1428 ************************************************************************
1429 ************************************************************************
1430 */
1431 static void arcmsr_stop_hbe_bgrb(struct AdapterControlBlock *acb)
1432 {
1433 	acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1434 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_STOP_BGRB);
1435 	acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
1436 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
1437 	if(!arcmsr_hbe_wait_msgint_ready(acb)) {
1438 		printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit);
1439 	}
1440 }
1441 /*
1442 ************************************************************************
1443 ************************************************************************
1444 */
1445 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb)
1446 {
1447 	switch (acb->adapter_type) {
1448 	case ACB_ADAPTER_TYPE_A: {
1449 			arcmsr_stop_hba_bgrb(acb);
1450 		}
1451 		break;
1452 	case ACB_ADAPTER_TYPE_B: {
1453 			arcmsr_stop_hbb_bgrb(acb);
1454 		}
1455 		break;
1456 	case ACB_ADAPTER_TYPE_C: {
1457 			arcmsr_stop_hbc_bgrb(acb);
1458 		}
1459 		break;
1460 	case ACB_ADAPTER_TYPE_D: {
1461 			arcmsr_stop_hbd_bgrb(acb);
1462 		}
1463 		break;
1464 	case ACB_ADAPTER_TYPE_E:
1465 	case ACB_ADAPTER_TYPE_F: {
1466 			arcmsr_stop_hbe_bgrb(acb);
1467 		}
1468 		break;
1469 	}
1470 }
1471 /*
1472 ************************************************************************
1473 ************************************************************************
1474 */
1475 static void arcmsr_poll(struct cam_sim *psim)
1476 {
1477 	struct AdapterControlBlock *acb;
1478 	int	mutex;
1479 
1480 	acb = (struct AdapterControlBlock *)cam_sim_softc(psim);
1481 	mutex = mtx_owned(&acb->isr_lock);
1482 	if( mutex == 0 )
1483 		ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
1484 	arcmsr_interrupt(acb);
1485 	if( mutex == 0 )
1486 		ARCMSR_LOCK_RELEASE(&acb->isr_lock);
1487 }
1488 /*
1489 **************************************************************************
1490 **************************************************************************
1491 */
1492 static u_int32_t arcmsr_Read_iop_rqbuffer_data_D(struct AdapterControlBlock *acb,
1493 	struct QBUFFER *prbuffer) {
1494 	u_int8_t *pQbuffer;
1495 	u_int8_t *buf1 = NULL;
1496 	u_int32_t *iop_data, *buf2 = NULL;
1497 	u_int32_t iop_len, data_len;
1498 
1499 	iop_data = (u_int32_t *)prbuffer->data;
1500 	iop_len = (u_int32_t)prbuffer->data_len;
1501 	if ( iop_len > 0 )
1502 	{
1503 		buf1 = malloc(128, M_DEVBUF, M_NOWAIT | M_ZERO);
1504 		buf2 = (u_int32_t *)buf1;
1505 		if( buf1 == NULL)
1506 			return (0);
1507 		data_len = iop_len;
1508 		while(data_len >= 4)
1509 		{
1510 			*buf2++ = *iop_data++;
1511 			data_len -= 4;
1512 		}
1513 		if(data_len)
1514 			*buf2 = *iop_data;
1515 		buf2 = (u_int32_t *)buf1;
1516 	}
1517 	while (iop_len > 0) {
1518 		pQbuffer = &acb->rqbuffer[acb->rqbuf_lastindex];
1519 		*pQbuffer = *buf1;
1520 		acb->rqbuf_lastindex++;
1521 		/* if last, index number set it to 0 */
1522 		acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1523 		buf1++;
1524 		iop_len--;
1525 	}
1526 	if(buf2)
1527 		free( (u_int8_t *)buf2, M_DEVBUF);
1528 	/* let IOP know data has been read */
1529 	arcmsr_iop_message_read(acb);
1530 	return (1);
1531 }
1532 /*
1533 **************************************************************************
1534 **************************************************************************
1535 */
1536 static u_int32_t arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb,
1537 	struct QBUFFER *prbuffer) {
1538 	u_int8_t *pQbuffer;
1539 	u_int8_t *iop_data;
1540 	u_int32_t iop_len;
1541 
1542 	if(acb->adapter_type >= ACB_ADAPTER_TYPE_B) {
1543 		return(arcmsr_Read_iop_rqbuffer_data_D(acb, prbuffer));
1544 	}
1545 	iop_data = (u_int8_t *)prbuffer->data;
1546 	iop_len = (u_int32_t)prbuffer->data_len;
1547 	while (iop_len > 0) {
1548 		pQbuffer = &acb->rqbuffer[acb->rqbuf_lastindex];
1549 		*pQbuffer = *iop_data;
1550 		acb->rqbuf_lastindex++;
1551 		/* if last, index number set it to 0 */
1552 		acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1553 		iop_data++;
1554 		iop_len--;
1555 	}
1556 	/* let IOP know data has been read */
1557 	arcmsr_iop_message_read(acb);
1558 	return (1);
1559 }
1560 /*
1561 **************************************************************************
1562 **************************************************************************
1563 */
1564 static void arcmsr_iop2drv_data_wrote_handle(struct AdapterControlBlock *acb)
1565 {
1566 	struct QBUFFER *prbuffer;
1567 	int my_empty_len;
1568 
1569 	/*check this iop data if overflow my rqbuffer*/
1570 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1571 	prbuffer = arcmsr_get_iop_rqbuffer(acb);
1572 	my_empty_len = (acb->rqbuf_lastindex - acb->rqbuf_firstindex - 1) &
1573 		(ARCMSR_MAX_QBUFFER-1);
1574 	if(my_empty_len >= prbuffer->data_len) {
1575 		if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
1576 			acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
1577 	} else {
1578 		acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
1579 	}
1580 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1581 }
1582 /*
1583 **********************************************************************
1584 **********************************************************************
1585 */
1586 static void arcmsr_Write_data_2iop_wqbuffer_D(struct AdapterControlBlock *acb)
1587 {
1588 	u_int8_t *pQbuffer;
1589 	struct QBUFFER *pwbuffer;
1590 	u_int8_t *buf1 = NULL;
1591 	u_int32_t *iop_data, *buf2 = NULL;
1592 	u_int32_t allxfer_len = 0, data_len;
1593 
1594 	if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READ) {
1595 		buf1 = malloc(128, M_DEVBUF, M_NOWAIT | M_ZERO);
1596 		buf2 = (u_int32_t *)buf1;
1597 		if( buf1 == NULL)
1598 			return;
1599 
1600 		acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ);
1601 		pwbuffer = arcmsr_get_iop_wqbuffer(acb);
1602 		iop_data = (u_int32_t *)pwbuffer->data;
1603 		while((acb->wqbuf_firstindex != acb->wqbuf_lastindex)
1604 			&& (allxfer_len < 124)) {
1605 			pQbuffer = &acb->wqbuffer[acb->wqbuf_firstindex];
1606 			*buf1 = *pQbuffer;
1607 			acb->wqbuf_firstindex++;
1608 			acb->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
1609 			buf1++;
1610 			allxfer_len++;
1611 		}
1612 		pwbuffer->data_len = allxfer_len;
1613 		data_len = allxfer_len;
1614 		buf1 = (u_int8_t *)buf2;
1615 		while(data_len >= 4)
1616 		{
1617 			*iop_data++ = *buf2++;
1618 			data_len -= 4;
1619 		}
1620 		if(data_len)
1621 			*iop_data = *buf2;
1622 		free( buf1, M_DEVBUF);
1623 		arcmsr_iop_message_wrote(acb);
1624 	}
1625 }
1626 /*
1627 **********************************************************************
1628 **********************************************************************
1629 */
1630 static void arcmsr_Write_data_2iop_wqbuffer(struct AdapterControlBlock *acb)
1631 {
1632 	u_int8_t *pQbuffer;
1633 	struct QBUFFER *pwbuffer;
1634 	u_int8_t *iop_data;
1635 	int32_t allxfer_len=0;
1636 
1637 	if(acb->adapter_type >= ACB_ADAPTER_TYPE_B) {
1638 		arcmsr_Write_data_2iop_wqbuffer_D(acb);
1639 		return;
1640 	}
1641 	if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READ) {
1642 		acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ);
1643 		pwbuffer = arcmsr_get_iop_wqbuffer(acb);
1644 		iop_data = (u_int8_t *)pwbuffer->data;
1645 		while((acb->wqbuf_firstindex != acb->wqbuf_lastindex)
1646 			&& (allxfer_len < 124)) {
1647 			pQbuffer = &acb->wqbuffer[acb->wqbuf_firstindex];
1648 			*iop_data = *pQbuffer;
1649 			acb->wqbuf_firstindex++;
1650 			acb->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
1651 			iop_data++;
1652 			allxfer_len++;
1653 		}
1654 		pwbuffer->data_len = allxfer_len;
1655 		arcmsr_iop_message_wrote(acb);
1656 	}
1657 }
1658 /*
1659 **************************************************************************
1660 **************************************************************************
1661 */
1662 static void arcmsr_iop2drv_data_read_handle(struct AdapterControlBlock *acb)
1663 {
1664 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1665 	acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_READ;
1666 	/*
1667 	*****************************************************************
1668 	**   check if there are any mail packages from user space program
1669 	**   in my post bag, now is the time to send them into Areca's firmware
1670 	*****************************************************************
1671 	*/
1672 	if(acb->wqbuf_firstindex != acb->wqbuf_lastindex) {
1673 		arcmsr_Write_data_2iop_wqbuffer(acb);
1674 	}
1675 	if(acb->wqbuf_firstindex == acb->wqbuf_lastindex) {
1676 		acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_CLEARED;
1677 	}
1678 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1679 }
1680 /*
1681 **************************************************************************
1682 **************************************************************************
1683 */
1684 static void arcmsr_rescanLun_cb(struct cam_periph *periph, union ccb *ccb)
1685 {
1686 /*
1687 	if (ccb->ccb_h.status != CAM_REQ_CMP)
1688 		printf("arcmsr_rescanLun_cb: Rescan Target=%x, lun=%x,"
1689 			"failure status=%x\n", ccb->ccb_h.target_id,
1690 			ccb->ccb_h.target_lun, ccb->ccb_h.status);
1691 	else
1692 		printf("arcmsr_rescanLun_cb: Rescan lun successfully!\n");
1693 */
1694 	xpt_free_path(ccb->ccb_h.path);
1695 	xpt_free_ccb(ccb);
1696 }
1697 
1698 static void	arcmsr_rescan_lun(struct AdapterControlBlock *acb, int target, int lun)
1699 {
1700 	struct cam_path     *path;
1701 	union ccb           *ccb;
1702 
1703 	if ((ccb = (union ccb *)xpt_alloc_ccb_nowait()) == NULL)
1704 		return;
1705 	if (xpt_create_path(&path, NULL, cam_sim_path(acb->psim), target, lun) != CAM_REQ_CMP)
1706 	{
1707 		xpt_free_ccb(ccb);
1708 		return;
1709 	}
1710 /*	printf("arcmsr_rescan_lun: Rescan Target=%x, Lun=%x\n", target, lun); */
1711 	xpt_setup_ccb(&ccb->ccb_h, path, 5);
1712 	ccb->ccb_h.func_code = XPT_SCAN_LUN;
1713 	ccb->ccb_h.cbfcnp = arcmsr_rescanLun_cb;
1714 	ccb->crcn.flags = CAM_FLAG_NONE;
1715 	xpt_action(ccb);
1716 }
1717 
1718 static void arcmsr_abort_dr_ccbs(struct AdapterControlBlock *acb, int target, int lun)
1719 {
1720 	struct CommandControlBlock *srb;
1721 	u_int32_t intmask_org;
1722 	int i;
1723 
1724 	/* disable all outbound interrupts */
1725 	intmask_org = arcmsr_disable_allintr(acb);
1726 	for (i = 0; i < ARCMSR_MAX_FREESRB_NUM; i++)
1727 	{
1728 		srb = acb->psrb_pool[i];
1729 		if (srb->srb_state == ARCMSR_SRB_START)
1730 		{
1731 			if((target == srb->pccb->ccb_h.target_id) && (lun == srb->pccb->ccb_h.target_lun))
1732 			{
1733 				srb->srb_state = ARCMSR_SRB_ABORTED;
1734 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
1735 				arcmsr_srb_complete(srb, 1);
1736 				printf("arcmsr%d: abort scsi id %d lun %d srb=%p \n", acb->pci_unit, target, lun, srb);
1737 			}
1738 		}
1739 	}
1740 	/* enable outbound Post Queue, outbound doorbell Interrupt */
1741 	arcmsr_enable_allintr(acb, intmask_org);
1742 }
1743 /*
1744 **************************************************************************
1745 **************************************************************************
1746 */
1747 static void arcmsr_dr_handle(struct AdapterControlBlock *acb) {
1748 	u_int32_t	devicemap;
1749 	u_int32_t	target, lun;
1750 	u_int32_t	deviceMapCurrent[4]={0};
1751 	u_int8_t	*pDevMap;
1752 
1753 	switch (acb->adapter_type) {
1754 	case ACB_ADAPTER_TYPE_A:
1755 		devicemap = offsetof(struct HBA_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1756 		for (target = 0; target < 4; target++)
1757 		{
1758 			deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
1759 			devicemap += 4;
1760 		}
1761 		break;
1762 
1763 	case ACB_ADAPTER_TYPE_B:
1764 		devicemap = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1765 		for (target = 0; target < 4; target++)
1766 		{
1767 			deviceMapCurrent[target]=bus_space_read_4(acb->btag[1], acb->bhandle[1],  devicemap);
1768 			devicemap += 4;
1769 		}
1770 		break;
1771 
1772 	case ACB_ADAPTER_TYPE_C:
1773 		devicemap = offsetof(struct HBC_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1774 		for (target = 0; target < 4; target++)
1775 		{
1776 			deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
1777 			devicemap += 4;
1778 		}
1779 		break;
1780 	case ACB_ADAPTER_TYPE_D:
1781 		devicemap = offsetof(struct HBD_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1782 		for (target = 0; target < 4; target++)
1783 		{
1784 			deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
1785 			devicemap += 4;
1786 		}
1787 		break;
1788 	case ACB_ADAPTER_TYPE_E:
1789 		devicemap = offsetof(struct HBE_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
1790 		for (target = 0; target < 4; target++)
1791 		{
1792 			deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0],  devicemap);
1793 			devicemap += 4;
1794 		}
1795 		break;
1796 	case ACB_ADAPTER_TYPE_F:
1797 		devicemap = ARCMSR_FW_DEVMAP_OFFSET;
1798 		for (target = 0; target < 4; target++)
1799 		{
1800 			deviceMapCurrent[target] = acb->msgcode_rwbuffer[devicemap];
1801 			devicemap += 1;
1802 		}
1803 		break;
1804 	}
1805 
1806 	if(acb->acb_flags & ACB_F_BUS_HANG_ON)
1807 	{
1808 		acb->acb_flags &= ~ACB_F_BUS_HANG_ON;
1809 	}
1810 	/*
1811 	** adapter posted CONFIG message
1812 	** copy the new map, note if there are differences with the current map
1813 	*/
1814 	pDevMap = (u_int8_t *)&deviceMapCurrent[0];
1815 	for (target = 0; target < ARCMSR_MAX_TARGETID - 1; target++)
1816 	{
1817 		if (*pDevMap != acb->device_map[target])
1818 		{
1819 			u_int8_t difference, bit_check;
1820 
1821 			difference = *pDevMap ^ acb->device_map[target];
1822 			for(lun=0; lun < ARCMSR_MAX_TARGETLUN; lun++)
1823 			{
1824 				bit_check = (1 << lun);		/*check bit from 0....31*/
1825 				if(difference & bit_check)
1826 				{
1827 					if(acb->device_map[target] & bit_check)
1828 					{/* unit departed */
1829 						printf("arcmsr_dr_handle: Target=%x, lun=%x, GONE!!!\n",target,lun);
1830 						arcmsr_abort_dr_ccbs(acb, target, lun);
1831 						arcmsr_rescan_lun(acb, target, lun);
1832 						acb->devstate[target][lun] = ARECA_RAID_GONE;
1833 					}
1834 					else
1835 					{/* unit arrived */
1836 						printf("arcmsr_dr_handle: Target=%x, lun=%x, Plug-IN!!!\n",target,lun);
1837 						arcmsr_rescan_lun(acb, target, lun);
1838 						acb->devstate[target][lun] = ARECA_RAID_GOOD;
1839 					}
1840 				}
1841 			}
1842 /*			printf("arcmsr_dr_handle: acb->device_map[%x]=0x%x, deviceMapCurrent[%x]=%x\n",target,acb->device_map[target],target,*pDevMap); */
1843 			acb->device_map[target] = *pDevMap;
1844 		}
1845 		pDevMap++;
1846 	}
1847 }
1848 /*
1849 **************************************************************************
1850 **************************************************************************
1851 */
1852 static void arcmsr_hba_message_isr(struct AdapterControlBlock *acb) {
1853 	u_int32_t outbound_message;
1854 
1855 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, ARCMSR_MU_OUTBOUND_MESSAGE0_INT);
1856 	outbound_message = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[0]);
1857 	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1858 		arcmsr_dr_handle( acb );
1859 }
1860 /*
1861 **************************************************************************
1862 **************************************************************************
1863 */
1864 static void arcmsr_hbb_message_isr(struct AdapterControlBlock *acb) {
1865 	u_int32_t outbound_message;
1866 	struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1867 
1868 	/* clear interrupts */
1869 	WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ARCMSR_MESSAGE_INT_CLEAR_PATTERN);
1870 	outbound_message = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[0]);
1871 	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1872 		arcmsr_dr_handle( acb );
1873 }
1874 /*
1875 **************************************************************************
1876 **************************************************************************
1877 */
1878 static void arcmsr_hbc_message_isr(struct AdapterControlBlock *acb) {
1879 	u_int32_t outbound_message;
1880 
1881 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR);
1882 	outbound_message = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[0]);
1883 	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1884 		arcmsr_dr_handle( acb );
1885 }
1886 /*
1887 **************************************************************************
1888 **************************************************************************
1889 */
1890 static void arcmsr_hbd_message_isr(struct AdapterControlBlock *acb) {
1891 	u_int32_t outbound_message;
1892 
1893 	CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE_CLEAR);
1894 	outbound_message = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[0]);
1895 	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1896 		arcmsr_dr_handle( acb );
1897 }
1898 /*
1899 **************************************************************************
1900 **************************************************************************
1901 */
1902 static void arcmsr_hbe_message_isr(struct AdapterControlBlock *acb) {
1903 	u_int32_t outbound_message;
1904 
1905 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0);
1906 	if (acb->adapter_type == ACB_ADAPTER_TYPE_E)
1907 		outbound_message = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[0]);
1908 	else
1909 		outbound_message = acb->msgcode_rwbuffer[0];
1910 	if (outbound_message == ARCMSR_SIGNATURE_GET_CONFIG)
1911 		arcmsr_dr_handle( acb );
1912 }
1913 /*
1914 **************************************************************************
1915 **************************************************************************
1916 */
1917 static void arcmsr_hba_doorbell_isr(struct AdapterControlBlock *acb)
1918 {
1919 	u_int32_t doorbell_status;
1920 
1921 	/*
1922 	*******************************************************************
1923 	**  Maybe here we need to check wrqbuffer_lock is lock or not
1924 	**  DOORBELL: din! don!
1925 	**  check if there are any mail need to pack from firmware
1926 	*******************************************************************
1927 	*/
1928 	doorbell_status = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_doorbell);
1929 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_doorbell, doorbell_status); /* clear doorbell interrupt */
1930 	if(doorbell_status & ARCMSR_OUTBOUND_IOP331_DATA_WRITE_OK) {
1931 		arcmsr_iop2drv_data_wrote_handle(acb);
1932 	}
1933 	if(doorbell_status & ARCMSR_OUTBOUND_IOP331_DATA_READ_OK) {
1934 		arcmsr_iop2drv_data_read_handle(acb);
1935 	}
1936 }
1937 /*
1938 **************************************************************************
1939 **************************************************************************
1940 */
1941 static void arcmsr_hbc_doorbell_isr(struct AdapterControlBlock *acb)
1942 {
1943 	u_int32_t doorbell_status;
1944 
1945 	/*
1946 	*******************************************************************
1947 	**  Maybe here we need to check wrqbuffer_lock is lock or not
1948 	**  DOORBELL: din! don!
1949 	**  check if there are any mail need to pack from firmware
1950 	*******************************************************************
1951 	*/
1952 	doorbell_status = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell);
1953 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, doorbell_status); /* clear doorbell interrupt */
1954 	if(doorbell_status & ARCMSR_HBCMU_IOP2DRV_DATA_WRITE_OK) {
1955 		arcmsr_iop2drv_data_wrote_handle(acb);
1956 	}
1957 	if(doorbell_status & ARCMSR_HBCMU_IOP2DRV_DATA_READ_OK) {
1958 		arcmsr_iop2drv_data_read_handle(acb);
1959 	}
1960 	if(doorbell_status & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
1961 		arcmsr_hbc_message_isr(acb);    /* messenger of "driver to iop commands" */
1962 	}
1963 }
1964 /*
1965 **************************************************************************
1966 **************************************************************************
1967 */
1968 static void arcmsr_hbd_doorbell_isr(struct AdapterControlBlock *acb)
1969 {
1970 	u_int32_t doorbell_status;
1971 
1972 	/*
1973 	*******************************************************************
1974 	**  Maybe here we need to check wrqbuffer_lock is lock or not
1975 	**  DOORBELL: din! don!
1976 	**  check if there are any mail need to pack from firmware
1977 	*******************************************************************
1978 	*/
1979 	doorbell_status = CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBDMU_F0_DOORBELL_CAUSE;
1980 	if(doorbell_status)
1981 		CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, doorbell_status); /* clear doorbell interrupt */
1982 	while( doorbell_status & ARCMSR_HBDMU_F0_DOORBELL_CAUSE ) {
1983 		if(doorbell_status & ARCMSR_HBDMU_IOP2DRV_DATA_WRITE_OK) {
1984 			arcmsr_iop2drv_data_wrote_handle(acb);
1985 		}
1986 		if(doorbell_status & ARCMSR_HBDMU_IOP2DRV_DATA_READ_OK) {
1987 			arcmsr_iop2drv_data_read_handle(acb);
1988 		}
1989 		if(doorbell_status & ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE) {
1990 			arcmsr_hbd_message_isr(acb);    /* messenger of "driver to iop commands" */
1991 		}
1992 		doorbell_status = CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBDMU_F0_DOORBELL_CAUSE;
1993 		if(doorbell_status)
1994 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, doorbell_status); /* clear doorbell interrupt */
1995 	}
1996 }
1997 /*
1998 **************************************************************************
1999 **************************************************************************
2000 */
2001 static void arcmsr_hbe_doorbell_isr(struct AdapterControlBlock *acb)
2002 {
2003 	u_int32_t doorbell_status, in_doorbell;
2004 
2005 	/*
2006 	*******************************************************************
2007 	**  Maybe here we need to check wrqbuffer_lock is lock or not
2008 	**  DOORBELL: din! don!
2009 	**  check if there are any mail need to pack from firmware
2010 	*******************************************************************
2011 	*/
2012 	in_doorbell = CHIP_REG_READ32(HBE_MessageUnit, 0, iobound_doorbell);
2013 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0); /* clear doorbell interrupt */
2014 	doorbell_status = in_doorbell ^ acb->in_doorbell;
2015 	if(doorbell_status & ARCMSR_HBEMU_IOP2DRV_DATA_WRITE_OK) {
2016 		arcmsr_iop2drv_data_wrote_handle(acb);
2017 	}
2018 	if(doorbell_status & ARCMSR_HBEMU_IOP2DRV_DATA_READ_OK) {
2019 		arcmsr_iop2drv_data_read_handle(acb);
2020 	}
2021 	if(doorbell_status & ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE) {
2022 		arcmsr_hbe_message_isr(acb);    /* messenger of "driver to iop commands" */
2023 	}
2024 	acb->in_doorbell = in_doorbell;
2025 }
2026 /*
2027 **************************************************************************
2028 **************************************************************************
2029 */
2030 static void arcmsr_hba_postqueue_isr(struct AdapterControlBlock *acb)
2031 {
2032 	u_int32_t flag_srb;
2033 	u_int16_t error;
2034 
2035 	/*
2036 	*****************************************************************************
2037 	**               areca cdb command done
2038 	*****************************************************************************
2039 	*/
2040 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
2041 		BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
2042 	while((flag_srb = CHIP_REG_READ32(HBA_MessageUnit,
2043 		0, outbound_queueport)) != 0xFFFFFFFF) {
2044 		/* check if command done with no error*/
2045 		error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0) ? TRUE : FALSE;
2046 		arcmsr_drain_donequeue(acb, flag_srb, error);
2047 	}	/*drain reply FIFO*/
2048 }
2049 /*
2050 **************************************************************************
2051 **************************************************************************
2052 */
2053 static void arcmsr_hbb_postqueue_isr(struct AdapterControlBlock *acb)
2054 {
2055 	struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
2056 	u_int32_t flag_srb;
2057 	int index;
2058 	u_int16_t error;
2059 
2060 	/*
2061 	*****************************************************************************
2062 	**               areca cdb command done
2063 	*****************************************************************************
2064 	*/
2065 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
2066 		BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
2067 	index = phbbmu->doneq_index;
2068 	while((flag_srb = phbbmu->done_qbuffer[index]) != 0) {
2069 		phbbmu->done_qbuffer[index] = 0;
2070 		index++;
2071 		index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
2072 		phbbmu->doneq_index = index;
2073 		/* check if command done with no error*/
2074 		error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
2075 		arcmsr_drain_donequeue(acb, flag_srb, error);
2076 	}	/*drain reply FIFO*/
2077 }
2078 /*
2079 **************************************************************************
2080 **************************************************************************
2081 */
2082 static void arcmsr_hbc_postqueue_isr(struct AdapterControlBlock *acb)
2083 {
2084 	u_int32_t flag_srb,throttling = 0;
2085 	u_int16_t error;
2086 
2087 	/*
2088 	*****************************************************************************
2089 	**               areca cdb command done
2090 	*****************************************************************************
2091 	*/
2092 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2093 	do {
2094 		flag_srb = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
2095 		if (flag_srb == 0xFFFFFFFF)
2096 			break;
2097 		/* check if command done with no error*/
2098 		error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
2099 		arcmsr_drain_donequeue(acb, flag_srb, error);
2100 		throttling++;
2101 		if(throttling == ARCMSR_HBC_ISR_THROTTLING_LEVEL) {
2102 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_POSTQUEUE_THROTTLING);
2103 			throttling = 0;
2104 		}
2105 	} while(CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR);
2106 }
2107 /*
2108 **********************************************************************
2109 **
2110 **********************************************************************
2111 */
2112 static uint16_t arcmsr_get_doneq_index(struct HBD_MessageUnit0 *phbdmu)
2113 {
2114 	uint16_t doneq_index, index_stripped;
2115 
2116 	doneq_index = phbdmu->doneq_index;
2117 	if (doneq_index & 0x4000) {
2118 		index_stripped = doneq_index & 0xFF;
2119 		index_stripped += 1;
2120 		index_stripped %= ARCMSR_MAX_HBD_POSTQUEUE;
2121 		phbdmu->doneq_index = index_stripped ?
2122 		    (index_stripped | 0x4000) : index_stripped;
2123 	} else {
2124 		index_stripped = doneq_index;
2125 		index_stripped += 1;
2126 		index_stripped %= ARCMSR_MAX_HBD_POSTQUEUE;
2127 		phbdmu->doneq_index = index_stripped ?
2128 		    index_stripped : (index_stripped | 0x4000);
2129 	}
2130 	return (phbdmu->doneq_index);
2131 }
2132 /*
2133 **************************************************************************
2134 **************************************************************************
2135 */
2136 static void arcmsr_hbd_postqueue_isr(struct AdapterControlBlock *acb)
2137 {
2138 	struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
2139 	u_int32_t outbound_write_pointer;
2140 	u_int32_t addressLow;
2141 	uint16_t doneq_index;
2142 	u_int16_t error;
2143 	/*
2144 	*****************************************************************************
2145 	**               areca cdb command done
2146 	*****************************************************************************
2147 	*/
2148 	if((CHIP_REG_READ32(HBD_MessageUnit, 0, outboundlist_interrupt_cause) &
2149 		ARCMSR_HBDMU_OUTBOUND_LIST_INTERRUPT) == 0)
2150 		return;
2151 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
2152 		BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2153 	outbound_write_pointer = phbdmu->done_qbuffer[0].addressLow;
2154 	doneq_index = phbdmu->doneq_index;
2155 	while ((doneq_index & 0xFF) != (outbound_write_pointer & 0xFF)) {
2156 		doneq_index = arcmsr_get_doneq_index(phbdmu);
2157 		addressLow = phbdmu->done_qbuffer[(doneq_index & 0xFF)+1].addressLow;
2158 		error = (addressLow & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
2159 		arcmsr_drain_donequeue(acb, addressLow, error); /*Check if command done with no error */
2160 		CHIP_REG_WRITE32(HBD_MessageUnit, 0, outboundlist_read_pointer, doneq_index);
2161 		outbound_write_pointer = phbdmu->done_qbuffer[0].addressLow;
2162 	}
2163 	CHIP_REG_WRITE32(HBD_MessageUnit, 0, outboundlist_interrupt_cause, ARCMSR_HBDMU_OUTBOUND_LIST_INTERRUPT_CLEAR);
2164 	CHIP_REG_READ32(HBD_MessageUnit, 0, outboundlist_interrupt_cause); /*Dummy ioread32 to force pci flush */
2165 }
2166 /*
2167 **************************************************************************
2168 **************************************************************************
2169 */
2170 static void arcmsr_hbe_postqueue_isr(struct AdapterControlBlock *acb)
2171 {
2172 	u_int16_t error;
2173 	uint32_t doneq_index;
2174 	uint16_t cmdSMID;
2175 
2176 	/*
2177 	*****************************************************************************
2178 	**               areca cdb command done
2179 	*****************************************************************************
2180 	*/
2181 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2182 	doneq_index = acb->doneq_index;
2183 	while ((CHIP_REG_READ32(HBE_MessageUnit, 0, reply_post_producer_index) & 0xFFFF) != doneq_index) {
2184 		cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID;
2185 		error = (acb->pCompletionQ[doneq_index].cmdFlag & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
2186 		arcmsr_drain_donequeue(acb, (u_int32_t)cmdSMID, error);
2187 		doneq_index++;
2188 		if (doneq_index >= acb->completionQ_entry)
2189 			doneq_index = 0;
2190 	}
2191 	acb->doneq_index = doneq_index;
2192 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, reply_post_consumer_index, doneq_index);
2193 }
2194 
2195 static void arcmsr_hbf_postqueue_isr(struct AdapterControlBlock *acb)
2196 {
2197 	uint16_t error;
2198 	uint32_t doneq_index;
2199 	uint16_t cmdSMID;
2200 
2201 	/*
2202 	*****************************************************************************
2203 	**               areca cdb command done
2204 	*****************************************************************************
2205 	*/
2206 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2207 	doneq_index = acb->doneq_index;
2208 	while (1) {
2209 		cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID;
2210 		if (cmdSMID == 0xffff)
2211 			break;
2212 		error = (acb->pCompletionQ[doneq_index].cmdFlag & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
2213 		arcmsr_drain_donequeue(acb, (u_int32_t)cmdSMID, error);
2214 		acb->pCompletionQ[doneq_index].cmdSMID = 0xffff;
2215 		doneq_index++;
2216 		if (doneq_index >= acb->completionQ_entry)
2217 			doneq_index = 0;
2218 	}
2219 	acb->doneq_index = doneq_index;
2220 	CHIP_REG_WRITE32(HBF_MessageUnit, 0, reply_post_consumer_index, doneq_index);
2221 }
2222 
2223 /*
2224 **********************************************************************
2225 **********************************************************************
2226 */
2227 static void arcmsr_handle_hba_isr( struct AdapterControlBlock *acb)
2228 {
2229 	u_int32_t outbound_intStatus;
2230 	/*
2231 	*********************************************
2232 	**   check outbound intstatus
2233 	*********************************************
2234 	*/
2235 	outbound_intStatus = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
2236 	if(!outbound_intStatus) {
2237 		/*it must be share irq*/
2238 		return;
2239 	}
2240 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intStatus); /*clear interrupt*/
2241 	/* MU doorbell interrupts*/
2242 	if(outbound_intStatus & ARCMSR_MU_OUTBOUND_DOORBELL_INT) {
2243 		arcmsr_hba_doorbell_isr(acb);
2244 	}
2245 	/* MU post queue interrupts*/
2246 	if(outbound_intStatus & ARCMSR_MU_OUTBOUND_POSTQUEUE_INT) {
2247 		arcmsr_hba_postqueue_isr(acb);
2248 	}
2249 	if(outbound_intStatus & ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
2250 		arcmsr_hba_message_isr(acb);
2251 	}
2252 }
2253 /*
2254 **********************************************************************
2255 **********************************************************************
2256 */
2257 static void arcmsr_handle_hbb_isr( struct AdapterControlBlock *acb)
2258 {
2259 	u_int32_t outbound_doorbell;
2260 	struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
2261 	/*
2262 	*********************************************
2263 	**   check outbound intstatus
2264 	*********************************************
2265 	*/
2266 	outbound_doorbell = READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell) & acb->outbound_int_enable;
2267 	if(!outbound_doorbell) {
2268 		/*it must be share irq*/
2269 		return;
2270 	}
2271 	WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ~outbound_doorbell); /* clear doorbell interrupt */
2272 	READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell);
2273 	WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
2274 	/* MU ioctl transfer doorbell interrupts*/
2275 	if(outbound_doorbell & ARCMSR_IOP2DRV_DATA_WRITE_OK) {
2276 		arcmsr_iop2drv_data_wrote_handle(acb);
2277 	}
2278 	if(outbound_doorbell & ARCMSR_IOP2DRV_DATA_READ_OK) {
2279 		arcmsr_iop2drv_data_read_handle(acb);
2280 	}
2281 	/* MU post queue interrupts*/
2282 	if(outbound_doorbell & ARCMSR_IOP2DRV_CDB_DONE) {
2283 		arcmsr_hbb_postqueue_isr(acb);
2284 	}
2285 	if(outbound_doorbell & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
2286 		arcmsr_hbb_message_isr(acb);
2287 	}
2288 }
2289 /*
2290 **********************************************************************
2291 **********************************************************************
2292 */
2293 static void arcmsr_handle_hbc_isr( struct AdapterControlBlock *acb)
2294 {
2295 	u_int32_t host_interrupt_status;
2296 	/*
2297 	*********************************************
2298 	**   check outbound intstatus
2299 	*********************************************
2300 	*/
2301 	host_interrupt_status = CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) &
2302 		(ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR |
2303 		ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR);
2304 	if(!host_interrupt_status) {
2305 		/*it must be share irq*/
2306 		return;
2307 	}
2308 	do {
2309 		/* MU doorbell interrupts*/
2310 		if(host_interrupt_status & ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR) {
2311 			arcmsr_hbc_doorbell_isr(acb);
2312 		}
2313 		/* MU post queue interrupts*/
2314 		if(host_interrupt_status & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) {
2315 			arcmsr_hbc_postqueue_isr(acb);
2316 		}
2317 		host_interrupt_status = CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status);
2318 	} while (host_interrupt_status & (ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR | ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR));
2319 }
2320 /*
2321 **********************************************************************
2322 **********************************************************************
2323 */
2324 static void arcmsr_handle_hbd_isr( struct AdapterControlBlock *acb)
2325 {
2326 	u_int32_t host_interrupt_status;
2327 	u_int32_t intmask_org;
2328 	/*
2329 	*********************************************
2330 	**   check outbound intstatus
2331 	*********************************************
2332 	*/
2333 	host_interrupt_status = CHIP_REG_READ32(HBD_MessageUnit, 0, host_int_status) & acb->outbound_int_enable;
2334 	if(!(host_interrupt_status & ARCMSR_HBDMU_OUTBOUND_INT)) {
2335 		/*it must be share irq*/
2336 		return;
2337 	}
2338 	/* disable outbound interrupt */
2339 	intmask_org = CHIP_REG_READ32(HBD_MessageUnit, 0, pcief0_int_enable)	; /* disable outbound message0 int */
2340 	CHIP_REG_WRITE32(HBD_MessageUnit, 0, pcief0_int_enable, ARCMSR_HBDMU_ALL_INT_DISABLE);
2341 	/* MU doorbell interrupts*/
2342 	if(host_interrupt_status & ARCMSR_HBDMU_OUTBOUND_DOORBELL_INT) {
2343 		arcmsr_hbd_doorbell_isr(acb);
2344 	}
2345 	/* MU post queue interrupts*/
2346 	if(host_interrupt_status & ARCMSR_HBDMU_OUTBOUND_POSTQUEUE_INT) {
2347 		arcmsr_hbd_postqueue_isr(acb);
2348 	}
2349 	/* enable all outbound interrupt */
2350 	CHIP_REG_WRITE32(HBD_MessageUnit, 0, pcief0_int_enable, intmask_org | ARCMSR_HBDMU_ALL_INT_ENABLE);
2351 //	CHIP_REG_READ32(HBD_MessageUnit, 0, pcief0_int_enable);
2352 }
2353 /*
2354 **********************************************************************
2355 **********************************************************************
2356 */
2357 static void arcmsr_handle_hbe_isr( struct AdapterControlBlock *acb)
2358 {
2359 	u_int32_t host_interrupt_status;
2360 	/*
2361 	*********************************************
2362 	**   check outbound intstatus
2363 	*********************************************
2364 	*/
2365 	host_interrupt_status = CHIP_REG_READ32(HBE_MessageUnit, 0, host_int_status) &
2366 		(ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR |
2367 		ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR);
2368 	if(!host_interrupt_status) {
2369 		/*it must be share irq*/
2370 		return;
2371 	}
2372 	do {
2373 		/* MU doorbell interrupts*/
2374 		if(host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR) {
2375 			arcmsr_hbe_doorbell_isr(acb);
2376 		}
2377 		/* MU post queue interrupts*/
2378 		if(host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR) {
2379 			arcmsr_hbe_postqueue_isr(acb);
2380 		}
2381 		host_interrupt_status = CHIP_REG_READ32(HBE_MessageUnit, 0, host_int_status);
2382 	} while (host_interrupt_status & (ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR | ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR));
2383 }
2384 
2385 static void arcmsr_handle_hbf_isr( struct AdapterControlBlock *acb)
2386 {
2387 	u_int32_t host_interrupt_status;
2388 	/*
2389 	*********************************************
2390 	**   check outbound intstatus
2391 	*********************************************
2392 	*/
2393 	host_interrupt_status = CHIP_REG_READ32(HBF_MessageUnit, 0, host_int_status) &
2394 		(ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR |
2395 		ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR);
2396 	if(!host_interrupt_status) {
2397 		/*it must be share irq*/
2398 		return;
2399 	}
2400 	do {
2401 		/* MU doorbell interrupts*/
2402 		if(host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR) {
2403 			arcmsr_hbe_doorbell_isr(acb);
2404 		}
2405 		/* MU post queue interrupts*/
2406 		if(host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR) {
2407 			arcmsr_hbf_postqueue_isr(acb);
2408 		}
2409 		host_interrupt_status = CHIP_REG_READ32(HBF_MessageUnit, 0, host_int_status);
2410 	} while (host_interrupt_status & (ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR | ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR));
2411 }
2412 /*
2413 ******************************************************************************
2414 ******************************************************************************
2415 */
2416 static void arcmsr_interrupt(struct AdapterControlBlock *acb)
2417 {
2418 	switch (acb->adapter_type) {
2419 	case ACB_ADAPTER_TYPE_A:
2420 		arcmsr_handle_hba_isr(acb);
2421 		break;
2422 	case ACB_ADAPTER_TYPE_B:
2423 		arcmsr_handle_hbb_isr(acb);
2424 		break;
2425 	case ACB_ADAPTER_TYPE_C:
2426 		arcmsr_handle_hbc_isr(acb);
2427 		break;
2428 	case ACB_ADAPTER_TYPE_D:
2429 		arcmsr_handle_hbd_isr(acb);
2430 		break;
2431 	case ACB_ADAPTER_TYPE_E:
2432 		arcmsr_handle_hbe_isr(acb);
2433 		break;
2434 	case ACB_ADAPTER_TYPE_F:
2435 		arcmsr_handle_hbf_isr(acb);
2436 		break;
2437 	default:
2438 		printf("arcmsr%d: interrupt service,"
2439 		" unknown adapter type =%d\n", acb->pci_unit, acb->adapter_type);
2440 		break;
2441 	}
2442 }
2443 /*
2444 **********************************************************************
2445 **********************************************************************
2446 */
2447 static void arcmsr_intr_handler(void *arg)
2448 {
2449 	struct AdapterControlBlock *acb = (struct AdapterControlBlock *)arg;
2450 
2451 	ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
2452 	arcmsr_interrupt(acb);
2453 	ARCMSR_LOCK_RELEASE(&acb->isr_lock);
2454 }
2455 /*
2456 ******************************************************************************
2457 ******************************************************************************
2458 */
2459 static void	arcmsr_polling_devmap(void *arg)
2460 {
2461 	struct AdapterControlBlock *acb = (struct AdapterControlBlock *)arg;
2462 	switch (acb->adapter_type) {
2463 	case ACB_ADAPTER_TYPE_A:
2464 		CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2465 		break;
2466 
2467 	case ACB_ADAPTER_TYPE_B: {
2468 			struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
2469 			WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_GET_CONFIG);
2470 		}
2471 		break;
2472 
2473 	case ACB_ADAPTER_TYPE_C:
2474 		CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2475 		CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
2476 		break;
2477 
2478 	case ACB_ADAPTER_TYPE_D:
2479 		CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2480 		break;
2481 
2482 	case ACB_ADAPTER_TYPE_E:
2483 		CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2484 		acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
2485 		CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
2486 		break;
2487 
2488 	case ACB_ADAPTER_TYPE_F: {
2489 		u_int32_t outMsg1 = CHIP_REG_READ32(HBF_MessageUnit, 0, outbound_msgaddr1);
2490 		if (!(outMsg1 & ARCMSR_HBFMU_MESSAGE_FIRMWARE_OK) ||
2491 			(outMsg1 & ARCMSR_HBFMU_MESSAGE_NO_VOLUME_CHANGE))
2492 			goto nxt6s;
2493 		CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
2494 		acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
2495 		CHIP_REG_WRITE32(HBF_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
2496 		break;
2497 		}
2498 	}
2499 nxt6s:
2500 	if((acb->acb_flags & ACB_F_SCSISTOPADAPTER) == 0)
2501 	{
2502 		callout_reset(&acb->devmap_callout, 5 * hz, arcmsr_polling_devmap, acb);	/* polling per 5 seconds */
2503 	}
2504 }
2505 
2506 /*
2507 *******************************************************************************
2508 **
2509 *******************************************************************************
2510 */
2511 static void arcmsr_iop_parking(struct AdapterControlBlock *acb)
2512 {
2513 	u_int32_t intmask_org;
2514 
2515 	if(acb != NULL) {
2516 		/* stop adapter background rebuild */
2517 		if(acb->acb_flags & ACB_F_MSG_START_BGRB) {
2518 			intmask_org = arcmsr_disable_allintr(acb);
2519 			arcmsr_stop_adapter_bgrb(acb);
2520 			arcmsr_flush_adapter_cache(acb);
2521 			arcmsr_enable_allintr(acb, intmask_org);
2522 		}
2523 	}
2524 }
2525 /*
2526 ***********************************************************************
2527 **
2528 ************************************************************************
2529 */
2530 static u_int32_t arcmsr_iop_ioctlcmd(struct AdapterControlBlock *acb, u_int32_t ioctl_cmd, caddr_t arg)
2531 {
2532 	struct CMD_MESSAGE_FIELD *pcmdmessagefld;
2533 	u_int32_t retvalue = EINVAL;
2534 
2535 	pcmdmessagefld = (struct CMD_MESSAGE_FIELD *) arg;
2536 	if(memcmp(pcmdmessagefld->cmdmessage.Signature, "ARCMSR", 6)!=0) {
2537 		return retvalue;
2538 	}
2539 	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2540 	switch(ioctl_cmd) {
2541 	case ARCMSR_MESSAGE_READ_RQBUFFER: {
2542 			u_int8_t *pQbuffer;
2543 			u_int8_t *ptmpQbuffer = pcmdmessagefld->messagedatabuffer;
2544 			u_int32_t allxfer_len=0;
2545 
2546 			while((acb->rqbuf_firstindex != acb->rqbuf_lastindex)
2547 				&& (allxfer_len < 1031)) {
2548 				/*copy READ QBUFFER to srb*/
2549 				pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex];
2550 				*ptmpQbuffer = *pQbuffer;
2551 				acb->rqbuf_firstindex++;
2552 				acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
2553 				/*if last index number set it to 0 */
2554 				ptmpQbuffer++;
2555 				allxfer_len++;
2556 			}
2557 			if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2558 				struct QBUFFER *prbuffer;
2559 
2560 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2561 				prbuffer = arcmsr_get_iop_rqbuffer(acb);
2562 				if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
2563 					acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
2564 			}
2565 			pcmdmessagefld->cmdmessage.Length = allxfer_len;
2566 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2567 			retvalue = ARCMSR_MESSAGE_SUCCESS;
2568 		}
2569 		break;
2570 	case ARCMSR_MESSAGE_WRITE_WQBUFFER: {
2571 			u_int32_t my_empty_len, user_len, wqbuf_firstindex, wqbuf_lastindex;
2572 			u_int8_t *pQbuffer;
2573 			u_int8_t *ptmpuserbuffer = pcmdmessagefld->messagedatabuffer;
2574 
2575 			user_len = pcmdmessagefld->cmdmessage.Length;
2576 			/*check if data xfer length of this request will overflow my array qbuffer */
2577 			wqbuf_lastindex = acb->wqbuf_lastindex;
2578 			wqbuf_firstindex = acb->wqbuf_firstindex;
2579 			if(wqbuf_lastindex != wqbuf_firstindex) {
2580 				arcmsr_Write_data_2iop_wqbuffer(acb);
2581 				pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_ERROR;
2582 			} else {
2583 				my_empty_len = (wqbuf_firstindex - wqbuf_lastindex - 1) &
2584 					(ARCMSR_MAX_QBUFFER - 1);
2585 				if(my_empty_len >= user_len) {
2586 					while(user_len > 0) {
2587 						/*copy srb data to wqbuffer*/
2588 						pQbuffer = &acb->wqbuffer[acb->wqbuf_lastindex];
2589 						*pQbuffer = *ptmpuserbuffer;
2590 						acb->wqbuf_lastindex++;
2591 						acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
2592 						/*if last index number set it to 0 */
2593 						ptmpuserbuffer++;
2594 						user_len--;
2595 					}
2596 					/*post fist Qbuffer*/
2597 					if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
2598 						acb->acb_flags &= ~ACB_F_MESSAGE_WQBUFFER_CLEARED;
2599 						arcmsr_Write_data_2iop_wqbuffer(acb);
2600 					}
2601 					pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2602 				} else {
2603 					pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_ERROR;
2604 				}
2605 			}
2606 			retvalue = ARCMSR_MESSAGE_SUCCESS;
2607 		}
2608 		break;
2609 	case ARCMSR_MESSAGE_CLEAR_RQBUFFER: {
2610 			u_int8_t *pQbuffer = acb->rqbuffer;
2611 
2612 			if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2613 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2614 				arcmsr_iop_message_read(acb);
2615 				/*signature, let IOP know data has been readed */
2616 			}
2617 			acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
2618 			acb->rqbuf_firstindex = 0;
2619 			acb->rqbuf_lastindex = 0;
2620 			memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
2621 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2622 			retvalue = ARCMSR_MESSAGE_SUCCESS;
2623 		}
2624 		break;
2625 	case ARCMSR_MESSAGE_CLEAR_WQBUFFER:
2626 		{
2627 			u_int8_t *pQbuffer = acb->wqbuffer;
2628 
2629 			if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2630 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2631 				arcmsr_iop_message_read(acb);
2632 				/*signature, let IOP know data has been readed */
2633 			}
2634 			acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED|ACB_F_MESSAGE_WQBUFFER_READ);
2635 			acb->wqbuf_firstindex = 0;
2636 			acb->wqbuf_lastindex = 0;
2637 			memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
2638 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2639 			retvalue = ARCMSR_MESSAGE_SUCCESS;
2640 		}
2641 		break;
2642 	case ARCMSR_MESSAGE_CLEAR_ALLQBUFFER: {
2643 			u_int8_t *pQbuffer;
2644 
2645 			if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2646 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2647 				arcmsr_iop_message_read(acb);
2648 				/*signature, let IOP know data has been readed */
2649 			}
2650 			acb->acb_flags  |= (ACB_F_MESSAGE_WQBUFFER_CLEARED
2651 					|ACB_F_MESSAGE_RQBUFFER_CLEARED
2652 					|ACB_F_MESSAGE_WQBUFFER_READ);
2653 			acb->rqbuf_firstindex = 0;
2654 			acb->rqbuf_lastindex = 0;
2655 			acb->wqbuf_firstindex = 0;
2656 			acb->wqbuf_lastindex = 0;
2657 			pQbuffer = acb->rqbuffer;
2658 			memset(pQbuffer, 0, sizeof(struct QBUFFER));
2659 			pQbuffer = acb->wqbuffer;
2660 			memset(pQbuffer, 0, sizeof(struct QBUFFER));
2661 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2662 			retvalue = ARCMSR_MESSAGE_SUCCESS;
2663 		}
2664 		break;
2665 	case ARCMSR_MESSAGE_REQUEST_RETURNCODE_3F: {
2666 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_3F;
2667 			retvalue = ARCMSR_MESSAGE_SUCCESS;
2668 		}
2669 		break;
2670 	case ARCMSR_MESSAGE_SAY_HELLO: {
2671 			u_int8_t *hello_string = "Hello! I am ARCMSR";
2672 			u_int8_t *puserbuffer = (u_int8_t *)pcmdmessagefld->messagedatabuffer;
2673 
2674 			if(memcpy(puserbuffer, hello_string, (int16_t)strlen(hello_string))) {
2675 				pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_ERROR;
2676 				ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2677 				return ENOIOCTL;
2678 			}
2679 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2680 			retvalue = ARCMSR_MESSAGE_SUCCESS;
2681 		}
2682 		break;
2683 	case ARCMSR_MESSAGE_SAY_GOODBYE: {
2684 			arcmsr_iop_parking(acb);
2685 			retvalue = ARCMSR_MESSAGE_SUCCESS;
2686 		}
2687 		break;
2688 	case ARCMSR_MESSAGE_FLUSH_ADAPTER_CACHE: {
2689 			arcmsr_flush_adapter_cache(acb);
2690 			retvalue = ARCMSR_MESSAGE_SUCCESS;
2691 		}
2692 		break;
2693 	}
2694 	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2695 	return (retvalue);
2696 }
2697 /*
2698 **************************************************************************
2699 **************************************************************************
2700 */
2701 static void arcmsr_free_srb(struct CommandControlBlock *srb)
2702 {
2703 	struct AdapterControlBlock	*acb;
2704 
2705 	acb = srb->acb;
2706 	ARCMSR_LOCK_ACQUIRE(&acb->srb_lock);
2707 	srb->srb_state = ARCMSR_SRB_DONE;
2708 	srb->srb_flags = 0;
2709 	acb->srbworkingQ[acb->workingsrb_doneindex] = srb;
2710 	acb->workingsrb_doneindex++;
2711 	acb->workingsrb_doneindex %= ARCMSR_MAX_FREESRB_NUM;
2712 	ARCMSR_LOCK_RELEASE(&acb->srb_lock);
2713 }
2714 /*
2715 **************************************************************************
2716 **************************************************************************
2717 */
2718 static struct CommandControlBlock *arcmsr_get_freesrb(struct AdapterControlBlock *acb)
2719 {
2720 	struct CommandControlBlock *srb = NULL;
2721 	u_int32_t workingsrb_startindex, workingsrb_doneindex;
2722 
2723 	ARCMSR_LOCK_ACQUIRE(&acb->srb_lock);
2724 	workingsrb_doneindex = acb->workingsrb_doneindex;
2725 	workingsrb_startindex = acb->workingsrb_startindex;
2726 	srb = acb->srbworkingQ[workingsrb_startindex];
2727 	workingsrb_startindex++;
2728 	workingsrb_startindex %= ARCMSR_MAX_FREESRB_NUM;
2729 	if(workingsrb_doneindex != workingsrb_startindex) {
2730 		acb->workingsrb_startindex = workingsrb_startindex;
2731 	} else {
2732 		srb = NULL;
2733 	}
2734 	ARCMSR_LOCK_RELEASE(&acb->srb_lock);
2735 	return(srb);
2736 }
2737 /*
2738 **************************************************************************
2739 **************************************************************************
2740 */
2741 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb *pccb)
2742 {
2743 	struct CMD_MESSAGE_FIELD *pcmdmessagefld;
2744 	int retvalue = 0, transfer_len = 0;
2745 	char *buffer;
2746 	uint8_t *ptr = scsiio_cdb_ptr(&pccb->csio);
2747 	u_int32_t controlcode = (u_int32_t ) ptr[5] << 24 |
2748 				(u_int32_t ) ptr[6] << 16 |
2749 				(u_int32_t ) ptr[7] << 8  |
2750 				(u_int32_t ) ptr[8];
2751 					/* 4 bytes: Areca io control code */
2752 	if ((pccb->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) {
2753 		buffer = pccb->csio.data_ptr;
2754 		transfer_len = pccb->csio.dxfer_len;
2755 	} else {
2756 		retvalue = ARCMSR_MESSAGE_FAIL;
2757 		goto message_out;
2758 	}
2759 	if (transfer_len > sizeof(struct CMD_MESSAGE_FIELD)) {
2760 		retvalue = ARCMSR_MESSAGE_FAIL;
2761 		goto message_out;
2762 	}
2763 	pcmdmessagefld = (struct CMD_MESSAGE_FIELD *) buffer;
2764 	switch(controlcode) {
2765 	case ARCMSR_MESSAGE_READ_RQBUFFER: {
2766 			u_int8_t *pQbuffer;
2767 			u_int8_t *ptmpQbuffer = pcmdmessagefld->messagedatabuffer;
2768 			int32_t allxfer_len = 0;
2769 
2770 			ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2771 			while ((acb->rqbuf_firstindex != acb->rqbuf_lastindex)
2772 				&& (allxfer_len < 1031)) {
2773 				pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex];
2774 				*ptmpQbuffer = *pQbuffer;
2775 				acb->rqbuf_firstindex++;
2776 				acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
2777 				ptmpQbuffer++;
2778 				allxfer_len++;
2779 			}
2780 			if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2781 				struct QBUFFER  *prbuffer;
2782 
2783 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2784 				prbuffer = arcmsr_get_iop_rqbuffer(acb);
2785 				if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
2786 					acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
2787 			}
2788 			pcmdmessagefld->cmdmessage.Length = allxfer_len;
2789 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2790 			retvalue = ARCMSR_MESSAGE_SUCCESS;
2791 			ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2792 		}
2793 		break;
2794 	case ARCMSR_MESSAGE_WRITE_WQBUFFER: {
2795 			int32_t my_empty_len, user_len, wqbuf_firstindex, wqbuf_lastindex;
2796 			u_int8_t *pQbuffer;
2797 			u_int8_t *ptmpuserbuffer = pcmdmessagefld->messagedatabuffer;
2798 
2799 			user_len = pcmdmessagefld->cmdmessage.Length;
2800 			ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2801 			wqbuf_lastindex = acb->wqbuf_lastindex;
2802 			wqbuf_firstindex = acb->wqbuf_firstindex;
2803 			if (wqbuf_lastindex != wqbuf_firstindex) {
2804 				arcmsr_Write_data_2iop_wqbuffer(acb);
2805 				/* has error report sensedata */
2806 				if(pccb->csio.sense_len) {
2807 				((u_int8_t *)&pccb->csio.sense_data)[0] = (0x1 << 7 | 0x70);
2808 				/* Valid,ErrorCode */
2809 				((u_int8_t *)&pccb->csio.sense_data)[2] = 0x05;
2810 				/* FileMark,EndOfMedia,IncorrectLength,Reserved,SenseKey */
2811 				((u_int8_t *)&pccb->csio.sense_data)[7] = 0x0A;
2812 				/* AdditionalSenseLength */
2813 				((u_int8_t *)&pccb->csio.sense_data)[12] = 0x20;
2814 				/* AdditionalSenseCode */
2815 				}
2816 				retvalue = ARCMSR_MESSAGE_FAIL;
2817 			} else {
2818 				my_empty_len = (wqbuf_firstindex-wqbuf_lastindex - 1)
2819 						&(ARCMSR_MAX_QBUFFER - 1);
2820 				if (my_empty_len >= user_len) {
2821 					while (user_len > 0) {
2822 						pQbuffer = &acb->wqbuffer[acb->wqbuf_lastindex];
2823 						*pQbuffer = *ptmpuserbuffer;
2824 						acb->wqbuf_lastindex++;
2825 						acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
2826 						ptmpuserbuffer++;
2827 						user_len--;
2828 					}
2829 					if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
2830 						acb->acb_flags &=
2831 						    ~ACB_F_MESSAGE_WQBUFFER_CLEARED;
2832 						arcmsr_Write_data_2iop_wqbuffer(acb);
2833 					}
2834 				} else {
2835 					/* has error report sensedata */
2836 					if(pccb->csio.sense_len) {
2837 					((u_int8_t *)&pccb->csio.sense_data)[0] = (0x1 << 7 | 0x70);
2838 					/* Valid,ErrorCode */
2839 					((u_int8_t *)&pccb->csio.sense_data)[2] = 0x05;
2840 					/* FileMark,EndOfMedia,IncorrectLength,Reserved,SenseKey */
2841 					((u_int8_t *)&pccb->csio.sense_data)[7] = 0x0A;
2842 					/* AdditionalSenseLength */
2843 					((u_int8_t *)&pccb->csio.sense_data)[12] = 0x20;
2844 					/* AdditionalSenseCode */
2845 					}
2846 					retvalue = ARCMSR_MESSAGE_FAIL;
2847 				}
2848 			}
2849 			ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2850 		}
2851 		break;
2852 	case ARCMSR_MESSAGE_CLEAR_RQBUFFER: {
2853 			u_int8_t *pQbuffer = acb->rqbuffer;
2854 
2855 			ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2856 			if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2857 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2858 				arcmsr_iop_message_read(acb);
2859 			}
2860 			acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
2861 			acb->rqbuf_firstindex = 0;
2862 			acb->rqbuf_lastindex = 0;
2863 			memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
2864 			pcmdmessagefld->cmdmessage.ReturnCode =
2865 			    ARCMSR_MESSAGE_RETURNCODE_OK;
2866 			ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2867 		}
2868 		break;
2869 	case ARCMSR_MESSAGE_CLEAR_WQBUFFER: {
2870 			u_int8_t *pQbuffer = acb->wqbuffer;
2871 
2872 			ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2873 			if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2874 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2875 				arcmsr_iop_message_read(acb);
2876 			}
2877 			acb->acb_flags |=
2878 				(ACB_F_MESSAGE_WQBUFFER_CLEARED |
2879 					ACB_F_MESSAGE_WQBUFFER_READ);
2880 			acb->wqbuf_firstindex = 0;
2881 			acb->wqbuf_lastindex = 0;
2882 			memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
2883 			pcmdmessagefld->cmdmessage.ReturnCode =
2884 				ARCMSR_MESSAGE_RETURNCODE_OK;
2885 			ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2886 		}
2887 		break;
2888 	case ARCMSR_MESSAGE_CLEAR_ALLQBUFFER: {
2889 			u_int8_t *pQbuffer;
2890 
2891 			ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2892 			if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2893 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2894 				arcmsr_iop_message_read(acb);
2895 			}
2896 			acb->acb_flags |=
2897 				(ACB_F_MESSAGE_WQBUFFER_CLEARED
2898 				| ACB_F_MESSAGE_RQBUFFER_CLEARED
2899 				| ACB_F_MESSAGE_WQBUFFER_READ);
2900 			acb->rqbuf_firstindex = 0;
2901 			acb->rqbuf_lastindex = 0;
2902 			acb->wqbuf_firstindex = 0;
2903 			acb->wqbuf_lastindex = 0;
2904 			pQbuffer = acb->rqbuffer;
2905 			memset(pQbuffer, 0, sizeof (struct QBUFFER));
2906 			pQbuffer = acb->wqbuffer;
2907 			memset(pQbuffer, 0, sizeof (struct QBUFFER));
2908 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2909 			ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2910 		}
2911 		break;
2912 	case ARCMSR_MESSAGE_REQUEST_RETURNCODE_3F: {
2913 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_3F;
2914 		}
2915 		break;
2916 	case ARCMSR_MESSAGE_SAY_HELLO: {
2917 			int8_t *hello_string = "Hello! I am ARCMSR";
2918 
2919 			memcpy(pcmdmessagefld->messagedatabuffer, hello_string
2920 				, (int16_t)strlen(hello_string));
2921 			pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK;
2922 		}
2923 		break;
2924 	case ARCMSR_MESSAGE_SAY_GOODBYE:
2925 		arcmsr_iop_parking(acb);
2926 		break;
2927 	case ARCMSR_MESSAGE_FLUSH_ADAPTER_CACHE:
2928 		arcmsr_flush_adapter_cache(acb);
2929 		break;
2930 	default:
2931 		retvalue = ARCMSR_MESSAGE_FAIL;
2932 	}
2933 message_out:
2934 	return (retvalue);
2935 }
2936 /*
2937 *********************************************************************
2938 *********************************************************************
2939 */
2940 static void arcmsr_execute_srb(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error)
2941 {
2942 	struct CommandControlBlock *srb = (struct CommandControlBlock *)arg;
2943 	struct AdapterControlBlock *acb = (struct AdapterControlBlock *)srb->acb;
2944 	union ccb *pccb;
2945 	int target, lun;
2946 
2947 	pccb = srb->pccb;
2948 	target = pccb->ccb_h.target_id;
2949 	lun = pccb->ccb_h.target_lun;
2950 	acb->pktRequestCount++;
2951 	if(error != 0) {
2952 		if(error != EFBIG) {
2953 			printf("arcmsr%d: unexpected error %x"
2954 				" returned from 'bus_dmamap_load' \n"
2955 				, acb->pci_unit, error);
2956 		}
2957 		if((pccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG) {
2958 			pccb->ccb_h.status |= CAM_REQ_TOO_BIG;
2959 		}
2960 		arcmsr_srb_complete(srb, 0);
2961 		return;
2962 	}
2963 	if(nseg > ARCMSR_MAX_SG_ENTRIES) {
2964 		pccb->ccb_h.status |= CAM_REQ_TOO_BIG;
2965 		arcmsr_srb_complete(srb, 0);
2966 		return;
2967 	}
2968 	if(acb->acb_flags & ACB_F_BUS_RESET) {
2969 		printf("arcmsr%d: bus reset and return busy \n", acb->pci_unit);
2970 		pccb->ccb_h.status |= CAM_SCSI_BUS_RESET;
2971 		arcmsr_srb_complete(srb, 0);
2972 		return;
2973 	}
2974 	if(acb->devstate[target][lun] == ARECA_RAID_GONE) {
2975 		u_int8_t block_cmd, cmd;
2976 
2977 		cmd = scsiio_cdb_ptr(&pccb->csio)[0];
2978 		block_cmd = cmd & 0x0f;
2979 		if(block_cmd == 0x08 || block_cmd == 0x0a) {
2980 			printf("arcmsr%d:block 'read/write' command "
2981 				"with gone raid volume Cmd=0x%2x, TargetId=%d, Lun=%d \n"
2982 				, acb->pci_unit, cmd, target, lun);
2983 			pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
2984 			arcmsr_srb_complete(srb, 0);
2985 			return;
2986 		}
2987 	}
2988 	if((pccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_INPROG) {
2989 		if(nseg != 0) {
2990 			bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap);
2991 		}
2992 		arcmsr_srb_complete(srb, 0);
2993 		return;
2994 	}
2995 	if(acb->srboutstandingcount >= acb->maxOutstanding) {
2996 		if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) == 0)
2997 		{
2998 			xpt_freeze_simq(acb->psim, 1);
2999 			acb->acb_flags |= ACB_F_CAM_DEV_QFRZN;
3000 		}
3001 		pccb->ccb_h.status &= ~CAM_SIM_QUEUED;
3002 		pccb->ccb_h.status |= CAM_REQUEUE_REQ;
3003 		arcmsr_srb_complete(srb, 0);
3004 		return;
3005 	}
3006 	pccb->ccb_h.status |= CAM_SIM_QUEUED;
3007 	arcmsr_build_srb(srb, dm_segs, nseg);
3008 	arcmsr_post_srb(acb, srb);
3009 	if (pccb->ccb_h.timeout != CAM_TIME_INFINITY)
3010 	{
3011 		arcmsr_callout_init(&srb->ccb_callout);
3012 		callout_reset_sbt(&srb->ccb_callout, SBT_1MS *
3013 		    (pccb->ccb_h.timeout + (ARCMSR_TIMEOUT_DELAY * 1000)), 0,
3014 		    arcmsr_srb_timeout, srb, 0);
3015 		srb->srb_flags |= SRB_FLAG_TIMER_START;
3016 	}
3017 }
3018 /*
3019 *****************************************************************************************
3020 *****************************************************************************************
3021 */
3022 static u_int8_t arcmsr_seek_cmd2abort(union ccb *abortccb)
3023 {
3024 	struct CommandControlBlock *srb;
3025 	struct AdapterControlBlock *acb = (struct AdapterControlBlock *) abortccb->ccb_h.arcmsr_ccbacb_ptr;
3026 	u_int32_t intmask_org;
3027 	int i = 0;
3028 
3029 	acb->num_aborts++;
3030 	/*
3031 	***************************************************************************
3032 	** It is the upper layer do abort command this lock just prior to calling us.
3033 	** First determine if we currently own this command.
3034 	** Start by searching the device queue. If not found
3035 	** at all, and the system wanted us to just abort the
3036 	** command return success.
3037 	***************************************************************************
3038 	*/
3039 	if(acb->srboutstandingcount != 0) {
3040 		/* disable all outbound interrupt */
3041 		intmask_org = arcmsr_disable_allintr(acb);
3042 		for(i=0; i < ARCMSR_MAX_FREESRB_NUM; i++) {
3043 			srb = acb->psrb_pool[i];
3044 			if(srb->srb_state == ARCMSR_SRB_START) {
3045 				if(srb->pccb == abortccb) {
3046 					srb->srb_state = ARCMSR_SRB_ABORTED;
3047 					printf("arcmsr%d:scsi id=%d lun=%jx abort srb '%p'"
3048 						"outstanding command \n"
3049 						, acb->pci_unit, abortccb->ccb_h.target_id
3050 						, (uintmax_t)abortccb->ccb_h.target_lun, srb);
3051 					arcmsr_polling_srbdone(acb, srb);
3052 					/* enable outbound Post Queue, outbound doorbell Interrupt */
3053 					arcmsr_enable_allintr(acb, intmask_org);
3054 					return (TRUE);
3055 				}
3056 			}
3057 		}
3058 		/* enable outbound Post Queue, outbound doorbell Interrupt */
3059 		arcmsr_enable_allintr(acb, intmask_org);
3060 	}
3061 	return(FALSE);
3062 }
3063 /*
3064 ****************************************************************************
3065 ****************************************************************************
3066 */
3067 static void arcmsr_bus_reset(struct AdapterControlBlock *acb)
3068 {
3069 	int retry = 0;
3070 
3071 	acb->num_resets++;
3072 	acb->acb_flags |= ACB_F_BUS_RESET;
3073 	while(acb->srboutstandingcount != 0 && retry < 400) {
3074 		arcmsr_interrupt(acb);
3075 		UDELAY(25000);
3076 		retry++;
3077 	}
3078 	arcmsr_iop_reset(acb);
3079 	acb->acb_flags &= ~ACB_F_BUS_RESET;
3080 }
3081 /*
3082 **************************************************************************
3083 **************************************************************************
3084 */
3085 static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb,
3086 		union ccb *pccb)
3087 {
3088 	if (pccb->ccb_h.target_lun) {
3089 		pccb->ccb_h.status |= CAM_DEV_NOT_THERE;
3090 		xpt_done(pccb);
3091 		return;
3092 	}
3093 	pccb->ccb_h.status |= CAM_REQ_CMP;
3094 	switch (scsiio_cdb_ptr(&pccb->csio)[0]) {
3095 	case INQUIRY: {
3096 		unsigned char inqdata[36];
3097 		char *buffer = pccb->csio.data_ptr;
3098 
3099 		inqdata[0] = T_PROCESSOR;	/* Periph Qualifier & Periph Dev Type */
3100 		inqdata[1] = 0;			/* rem media bit & Dev Type Modifier */
3101 		inqdata[2] = 0;			/* ISO, ECMA, & ANSI versions */
3102 		inqdata[3] = 0;
3103 		inqdata[4] = 31;		/* length of additional data */
3104 		inqdata[5] = 0;
3105 		inqdata[6] = 0;
3106 		inqdata[7] = 0;
3107 		strncpy(&inqdata[8], "Areca   ", 8);	/* Vendor Identification */
3108 		strncpy(&inqdata[16], "RAID controller ", 16);	/* Product Identification */
3109 		strncpy(&inqdata[32], "R001", 4); /* Product Revision */
3110 		memcpy(buffer, inqdata, sizeof(inqdata));
3111 		xpt_done(pccb);
3112 	}
3113 	break;
3114 	case WRITE_BUFFER:
3115 	case READ_BUFFER: {
3116 		if (arcmsr_iop_message_xfer(acb, pccb)) {
3117 			pccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR;
3118 			pccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
3119 		}
3120 		xpt_done(pccb);
3121 	}
3122 	break;
3123 	default:
3124 		xpt_done(pccb);
3125 	}
3126 }
3127 /*
3128 *********************************************************************
3129 *********************************************************************
3130 */
3131 static void arcmsr_action(struct cam_sim *psim, union ccb *pccb)
3132 {
3133 	struct AdapterControlBlock *acb;
3134 
3135 	acb = (struct AdapterControlBlock *) cam_sim_softc(psim);
3136 	if(acb == NULL) {
3137 		pccb->ccb_h.status |= CAM_REQ_INVALID;
3138 		xpt_done(pccb);
3139 		return;
3140 	}
3141 	switch (pccb->ccb_h.func_code) {
3142 	case XPT_SCSI_IO: {
3143 			struct CommandControlBlock *srb;
3144 			int target = pccb->ccb_h.target_id;
3145 			int error;
3146 
3147 			if (pccb->ccb_h.flags & CAM_CDB_PHYS) {
3148 				pccb->ccb_h.status = CAM_REQ_INVALID;
3149 				xpt_done(pccb);
3150 				return;
3151 			}
3152 
3153 			if(target == 16) {
3154 				/* virtual device for iop message transfer */
3155 				arcmsr_handle_virtual_command(acb, pccb);
3156 				return;
3157 			}
3158 			if((srb = arcmsr_get_freesrb(acb)) == NULL) {
3159 				pccb->ccb_h.status |= CAM_RESRC_UNAVAIL;
3160 				xpt_done(pccb);
3161 				return;
3162 			}
3163 			pccb->ccb_h.arcmsr_ccbsrb_ptr = srb;
3164 			pccb->ccb_h.arcmsr_ccbacb_ptr = acb;
3165 			srb->pccb = pccb;
3166 			error =	bus_dmamap_load_ccb(acb->dm_segs_dmat
3167 				, srb->dm_segs_dmamap
3168 				, pccb
3169 				, arcmsr_execute_srb, srb, /*flags*/0);
3170 			if(error == EINPROGRESS) {
3171 				xpt_freeze_simq(acb->psim, 1);
3172 				pccb->ccb_h.status |= CAM_RELEASE_SIMQ;
3173 			}
3174 			break;
3175 		}
3176 	case XPT_PATH_INQ: {
3177 			struct ccb_pathinq *cpi = &pccb->cpi;
3178 
3179 			cpi->version_num = 1;
3180 			cpi->hba_inquiry = PI_SDTR_ABLE | PI_TAG_ABLE;
3181 			cpi->target_sprt = 0;
3182 			cpi->hba_misc = 0;
3183 			cpi->hba_eng_cnt = 0;
3184 			cpi->max_target = ARCMSR_MAX_TARGETID;        /* 0-16 */
3185 			cpi->max_lun = ARCMSR_MAX_TARGETLUN;	    /* 0-7 */
3186 			cpi->initiator_id = ARCMSR_SCSI_INITIATOR_ID; /* 255 */
3187 			cpi->bus_id = cam_sim_bus(psim);
3188 			strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
3189 			strlcpy(cpi->hba_vid, "ARCMSR", HBA_IDLEN);
3190 			strlcpy(cpi->dev_name, cam_sim_name(psim), DEV_IDLEN);
3191 			cpi->unit_number = cam_sim_unit(psim);
3192 			if(acb->adapter_bus_speed == ACB_BUS_SPEED_12G)
3193 				cpi->base_transfer_speed = 1200000;
3194 			else if(acb->adapter_bus_speed == ACB_BUS_SPEED_6G)
3195 				cpi->base_transfer_speed = 600000;
3196 			else
3197 				cpi->base_transfer_speed = 300000;
3198 			if((acb->vendor_device_id == PCIDevVenIDARC1880) ||
3199 			   (acb->vendor_device_id == PCIDevVenIDARC1884) ||
3200 			   (acb->vendor_device_id == PCIDevVenIDARC1680) ||
3201 			   (acb->vendor_device_id == PCIDevVenIDARC1214))
3202 			{
3203 				cpi->transport = XPORT_SAS;
3204 				cpi->transport_version = 0;
3205 				cpi->protocol_version = SCSI_REV_SPC2;
3206 			}
3207 			else
3208 			{
3209 				cpi->transport = XPORT_SPI;
3210 				cpi->transport_version = 2;
3211 				cpi->protocol_version = SCSI_REV_2;
3212 			}
3213 			cpi->protocol = PROTO_SCSI;
3214 			cpi->ccb_h.status |= CAM_REQ_CMP;
3215 			xpt_done(pccb);
3216 			break;
3217 		}
3218 	case XPT_ABORT: {
3219 			union ccb *pabort_ccb;
3220 
3221 			pabort_ccb = pccb->cab.abort_ccb;
3222 			switch (pabort_ccb->ccb_h.func_code) {
3223 			case XPT_ACCEPT_TARGET_IO:
3224 			case XPT_CONT_TARGET_IO:
3225 				if(arcmsr_seek_cmd2abort(pabort_ccb)==TRUE) {
3226 					pabort_ccb->ccb_h.status |= CAM_REQ_ABORTED;
3227 					xpt_done(pabort_ccb);
3228 					pccb->ccb_h.status |= CAM_REQ_CMP;
3229 				} else {
3230 					xpt_print_path(pabort_ccb->ccb_h.path);
3231 					printf("Not found\n");
3232 					pccb->ccb_h.status |= CAM_PATH_INVALID;
3233 				}
3234 				break;
3235 			case XPT_SCSI_IO:
3236 				pccb->ccb_h.status |= CAM_UA_ABORT;
3237 				break;
3238 			default:
3239 				pccb->ccb_h.status |= CAM_REQ_INVALID;
3240 				break;
3241 			}
3242 			xpt_done(pccb);
3243 			break;
3244 		}
3245 	case XPT_RESET_BUS:
3246 	case XPT_RESET_DEV: {
3247 			u_int32_t	i;
3248 
3249 			arcmsr_bus_reset(acb);
3250 			for (i=0; i < 500; i++) {
3251 				DELAY(1000);
3252 			}
3253 			pccb->ccb_h.status |= CAM_REQ_CMP;
3254 			xpt_done(pccb);
3255 			break;
3256 		}
3257 	case XPT_TERM_IO: {
3258 			pccb->ccb_h.status |= CAM_REQ_INVALID;
3259 			xpt_done(pccb);
3260 			break;
3261 		}
3262 	case XPT_GET_TRAN_SETTINGS: {
3263 			struct ccb_trans_settings *cts;
3264 
3265 			if(pccb->ccb_h.target_id == 16) {
3266 				pccb->ccb_h.status |= CAM_FUNC_NOTAVAIL;
3267 				xpt_done(pccb);
3268 				break;
3269 			}
3270 			cts = &pccb->cts;
3271 			{
3272 				struct ccb_trans_settings_scsi *scsi;
3273 				struct ccb_trans_settings_spi *spi;
3274 				struct ccb_trans_settings_sas *sas;
3275 
3276 				scsi = &cts->proto_specific.scsi;
3277 				scsi->flags = CTS_SCSI_FLAGS_TAG_ENB;
3278 				scsi->valid = CTS_SCSI_VALID_TQ;
3279 				cts->protocol = PROTO_SCSI;
3280 
3281 				if((acb->vendor_device_id == PCIDevVenIDARC1880) ||
3282 				   (acb->vendor_device_id == PCIDevVenIDARC1884) ||
3283 				   (acb->vendor_device_id == PCIDevVenIDARC1680) ||
3284 				   (acb->vendor_device_id == PCIDevVenIDARC1214))
3285 				{
3286 					cts->protocol_version = SCSI_REV_SPC2;
3287 					cts->transport_version = 0;
3288 					cts->transport = XPORT_SAS;
3289 					sas = &cts->xport_specific.sas;
3290 					sas->valid = CTS_SAS_VALID_SPEED;
3291 					if (acb->adapter_bus_speed == ACB_BUS_SPEED_12G)
3292 						sas->bitrate = 1200000;
3293 					else if(acb->adapter_bus_speed == ACB_BUS_SPEED_6G)
3294 						sas->bitrate = 600000;
3295 					else if(acb->adapter_bus_speed == ACB_BUS_SPEED_3G)
3296 						sas->bitrate = 300000;
3297 				}
3298 				else
3299 				{
3300 					cts->protocol_version = SCSI_REV_2;
3301 					cts->transport_version = 2;
3302 					cts->transport = XPORT_SPI;
3303 					spi = &cts->xport_specific.spi;
3304 					spi->flags = CTS_SPI_FLAGS_DISC_ENB;
3305 					if (acb->adapter_bus_speed == ACB_BUS_SPEED_6G)
3306 						spi->sync_period = 1;
3307 					else
3308 						spi->sync_period = 2;
3309 					spi->sync_offset = 32;
3310 					spi->bus_width = MSG_EXT_WDTR_BUS_16_BIT;
3311 					spi->valid = CTS_SPI_VALID_DISC
3312 						| CTS_SPI_VALID_SYNC_RATE
3313 						| CTS_SPI_VALID_SYNC_OFFSET
3314 						| CTS_SPI_VALID_BUS_WIDTH;
3315 				}
3316 			}
3317 			pccb->ccb_h.status |= CAM_REQ_CMP;
3318 			xpt_done(pccb);
3319 			break;
3320 		}
3321 	case XPT_SET_TRAN_SETTINGS: {
3322 			pccb->ccb_h.status |= CAM_FUNC_NOTAVAIL;
3323 			xpt_done(pccb);
3324 			break;
3325 		}
3326 	case XPT_CALC_GEOMETRY:
3327 			if(pccb->ccb_h.target_id == 16) {
3328 				pccb->ccb_h.status |= CAM_FUNC_NOTAVAIL;
3329 				xpt_done(pccb);
3330 				break;
3331 			}
3332 			cam_calc_geometry(&pccb->ccg, 1);
3333 			xpt_done(pccb);
3334 			break;
3335 	default:
3336 		pccb->ccb_h.status |= CAM_REQ_INVALID;
3337 		xpt_done(pccb);
3338 		break;
3339 	}
3340 }
3341 /*
3342 **********************************************************************
3343 **********************************************************************
3344 */
3345 static void arcmsr_start_hba_bgrb(struct AdapterControlBlock *acb)
3346 {
3347 	acb->acb_flags |= ACB_F_MSG_START_BGRB;
3348 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_START_BGRB);
3349 	if(!arcmsr_hba_wait_msgint_ready(acb)) {
3350 		printf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
3351 	}
3352 }
3353 /*
3354 **********************************************************************
3355 **********************************************************************
3356 */
3357 static void arcmsr_start_hbb_bgrb(struct AdapterControlBlock *acb)
3358 {
3359 	struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
3360 	acb->acb_flags |= ACB_F_MSG_START_BGRB;
3361 	WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_START_BGRB);
3362 	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3363 		printf( "arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
3364 	}
3365 }
3366 /*
3367 **********************************************************************
3368 **********************************************************************
3369 */
3370 static void arcmsr_start_hbc_bgrb(struct AdapterControlBlock *acb)
3371 {
3372 	acb->acb_flags |= ACB_F_MSG_START_BGRB;
3373 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_START_BGRB);
3374 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
3375 	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
3376 		printf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
3377 	}
3378 }
3379 /*
3380 **********************************************************************
3381 **********************************************************************
3382 */
3383 static void arcmsr_start_hbd_bgrb(struct AdapterControlBlock *acb)
3384 {
3385 	acb->acb_flags |= ACB_F_MSG_START_BGRB;
3386 	CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_START_BGRB);
3387 	if(!arcmsr_hbd_wait_msgint_ready(acb)) {
3388 		printf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
3389 	}
3390 }
3391 /*
3392 **********************************************************************
3393 **********************************************************************
3394 */
3395 static void arcmsr_start_hbe_bgrb(struct AdapterControlBlock *acb)
3396 {
3397 	acb->acb_flags |= ACB_F_MSG_START_BGRB;
3398 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_START_BGRB);
3399 	acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
3400 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
3401 	if(!arcmsr_hbe_wait_msgint_ready(acb)) {
3402 		printf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
3403 	}
3404 }
3405 /*
3406 **********************************************************************
3407 **********************************************************************
3408 */
3409 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb)
3410 {
3411 	switch (acb->adapter_type) {
3412 	case ACB_ADAPTER_TYPE_A:
3413 		arcmsr_start_hba_bgrb(acb);
3414 		break;
3415 	case ACB_ADAPTER_TYPE_B:
3416 		arcmsr_start_hbb_bgrb(acb);
3417 		break;
3418 	case ACB_ADAPTER_TYPE_C:
3419 		arcmsr_start_hbc_bgrb(acb);
3420 		break;
3421 	case ACB_ADAPTER_TYPE_D:
3422 		arcmsr_start_hbd_bgrb(acb);
3423 		break;
3424 	case ACB_ADAPTER_TYPE_E:
3425 	case ACB_ADAPTER_TYPE_F:
3426 		arcmsr_start_hbe_bgrb(acb);
3427 		break;
3428 	}
3429 }
3430 /*
3431 **********************************************************************
3432 **
3433 **********************************************************************
3434 */
3435 static void arcmsr_polling_hba_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3436 {
3437 	struct CommandControlBlock *srb;
3438 	u_int32_t flag_srb, outbound_intstatus, poll_srb_done=0, poll_count=0;
3439 	u_int16_t	error;
3440 
3441 polling_ccb_retry:
3442 	poll_count++;
3443 	outbound_intstatus=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
3444 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_intstatus, outbound_intstatus);	/*clear interrupt*/
3445 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3446 	while(1) {
3447 		if((flag_srb = CHIP_REG_READ32(HBA_MessageUnit,
3448 			0, outbound_queueport)) == 0xFFFFFFFF) {
3449 			if(poll_srb_done) {
3450 				break;/*chip FIFO no ccb for completion already*/
3451 			} else {
3452 				UDELAY(25000);
3453 				if ((poll_count > 100) && (poll_srb != NULL)) {
3454 					break;
3455 				}
3456 				goto polling_ccb_retry;
3457 			}
3458 		}
3459 		/* check if command done with no error*/
3460 		srb = (struct CommandControlBlock *)
3461 			(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
3462 		error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
3463 		poll_srb_done = (srb == poll_srb) ? 1:0;
3464 		if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3465 			if(srb->srb_state == ARCMSR_SRB_ABORTED) {
3466 				printf("arcmsr%d: scsi id=%d lun=%jx srb='%p'"
3467 					"poll command abort successfully \n"
3468 					, acb->pci_unit
3469 					, srb->pccb->ccb_h.target_id
3470 					, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
3471 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3472 				arcmsr_srb_complete(srb, 1);
3473 				continue;
3474 			}
3475 			printf("arcmsr%d: polling get an illegal srb command done srb='%p'"
3476 				"srboutstandingcount=%d \n"
3477 				, acb->pci_unit
3478 				, srb, acb->srboutstandingcount);
3479 			continue;
3480 		}
3481 		arcmsr_report_srb_state(acb, srb, error);
3482 	}	/*drain reply FIFO*/
3483 }
3484 /*
3485 **********************************************************************
3486 **
3487 **********************************************************************
3488 */
3489 static void arcmsr_polling_hbb_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3490 {
3491 	struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
3492 	struct CommandControlBlock *srb;
3493 	u_int32_t flag_srb, poll_srb_done=0, poll_count=0;
3494 	int index;
3495 	u_int16_t	error;
3496 
3497 polling_ccb_retry:
3498 	poll_count++;
3499 	WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ARCMSR_DOORBELL_INT_CLEAR_PATTERN); /* clear doorbell interrupt */
3500 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3501 	while(1) {
3502 		index = phbbmu->doneq_index;
3503 		if((flag_srb = phbbmu->done_qbuffer[index]) == 0) {
3504 			if(poll_srb_done) {
3505 				break;/*chip FIFO no ccb for completion already*/
3506 			} else {
3507 				UDELAY(25000);
3508 				if ((poll_count > 100) && (poll_srb != NULL)) {
3509 					break;
3510 				}
3511 				goto polling_ccb_retry;
3512 			}
3513 		}
3514 		phbbmu->done_qbuffer[index] = 0;
3515 		index++;
3516 		index %= ARCMSR_MAX_HBB_POSTQUEUE;     /*if last index number set it to 0 */
3517 		phbbmu->doneq_index = index;
3518 		/* check if command done with no error*/
3519 		srb = (struct CommandControlBlock *)
3520 			(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
3521 		error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE0)?TRUE:FALSE;
3522 		poll_srb_done = (srb == poll_srb) ? 1:0;
3523 		if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3524 			if(srb->srb_state == ARCMSR_SRB_ABORTED) {
3525 				printf("arcmsr%d: scsi id=%d lun=%jx srb='%p'"
3526 					"poll command abort successfully \n"
3527 					, acb->pci_unit
3528 					, srb->pccb->ccb_h.target_id
3529 					, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
3530 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3531 				arcmsr_srb_complete(srb, 1);
3532 				continue;
3533 			}
3534 			printf("arcmsr%d: polling get an illegal srb command done srb='%p'"
3535 				"srboutstandingcount=%d \n"
3536 				, acb->pci_unit
3537 				, srb, acb->srboutstandingcount);
3538 			continue;
3539 		}
3540 		arcmsr_report_srb_state(acb, srb, error);
3541 	}	/*drain reply FIFO*/
3542 }
3543 /*
3544 **********************************************************************
3545 **
3546 **********************************************************************
3547 */
3548 static void arcmsr_polling_hbc_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3549 {
3550 	struct CommandControlBlock *srb;
3551 	u_int32_t flag_srb, poll_srb_done=0, poll_count=0;
3552 	u_int16_t	error;
3553 
3554 polling_ccb_retry:
3555 	poll_count++;
3556 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3557 	while(1) {
3558 		if(!(CHIP_REG_READ32(HBC_MessageUnit, 0, host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR)) {
3559 			if(poll_srb_done) {
3560 				break;/*chip FIFO no ccb for completion already*/
3561 			} else {
3562 				UDELAY(25000);
3563 				if ((poll_count > 100) && (poll_srb != NULL)) {
3564 					break;
3565 				}
3566 				if (acb->srboutstandingcount == 0) {
3567 					break;
3568 				}
3569 				goto polling_ccb_retry;
3570 			}
3571 		}
3572 		flag_srb = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_queueport_low);
3573 		/* check if command done with no error*/
3574 		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0));/*frame must be 32 bytes aligned*/
3575 		error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1)?TRUE:FALSE;
3576 		if (poll_srb != NULL)
3577 			poll_srb_done = (srb == poll_srb) ? 1:0;
3578 		if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3579 			if(srb->srb_state == ARCMSR_SRB_ABORTED) {
3580 				printf("arcmsr%d: scsi id=%d lun=%jx srb='%p'poll command abort successfully \n"
3581 						, acb->pci_unit, srb->pccb->ccb_h.target_id, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
3582 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3583 				arcmsr_srb_complete(srb, 1);
3584 				continue;
3585 			}
3586 			printf("arcmsr%d: polling get an illegal srb command done srb='%p'srboutstandingcount=%d \n"
3587 					, acb->pci_unit, srb, acb->srboutstandingcount);
3588 			continue;
3589 		}
3590 		arcmsr_report_srb_state(acb, srb, error);
3591 	}	/*drain reply FIFO*/
3592 }
3593 /*
3594 **********************************************************************
3595 **
3596 **********************************************************************
3597 */
3598 static void arcmsr_polling_hbd_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3599 {
3600 	struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
3601 	struct CommandControlBlock *srb;
3602 	u_int32_t flag_srb, poll_srb_done=0, poll_count=0;
3603 	u_int32_t outbound_write_pointer;
3604 	u_int16_t	error, doneq_index;
3605 
3606 polling_ccb_retry:
3607 	poll_count++;
3608 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3609 	while(1) {
3610 		outbound_write_pointer = phbdmu->done_qbuffer[0].addressLow;
3611 		doneq_index = phbdmu->doneq_index;
3612 		if ((outbound_write_pointer & 0xFF) == (doneq_index & 0xFF)) {
3613 			if(poll_srb_done) {
3614 				break;/*chip FIFO no ccb for completion already*/
3615 			} else {
3616 				UDELAY(25000);
3617 				if ((poll_count > 100) && (poll_srb != NULL)) {
3618 					break;
3619 				}
3620 				if (acb->srboutstandingcount == 0) {
3621 					break;
3622 				}
3623 				goto polling_ccb_retry;
3624 			}
3625 		}
3626 		doneq_index = arcmsr_get_doneq_index(phbdmu);
3627 		flag_srb = phbdmu->done_qbuffer[(doneq_index & 0xFF)+1].addressLow;
3628 		/* check if command done with no error*/
3629 		srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0));/*frame must be 32 bytes aligned*/
3630 		error = (flag_srb & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
3631 		CHIP_REG_WRITE32(HBD_MessageUnit, 0, outboundlist_read_pointer, doneq_index);
3632 		if (poll_srb != NULL)
3633 			poll_srb_done = (srb == poll_srb) ? 1:0;
3634 		if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3635 			if(srb->srb_state == ARCMSR_SRB_ABORTED) {
3636 				printf("arcmsr%d: scsi id=%d lun=%jx srb='%p'poll command abort successfully \n"
3637 						, acb->pci_unit, srb->pccb->ccb_h.target_id, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
3638 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3639 				arcmsr_srb_complete(srb, 1);
3640 				continue;
3641 			}
3642 			printf("arcmsr%d: polling get an illegal srb command done srb='%p'srboutstandingcount=%d \n"
3643 					, acb->pci_unit, srb, acb->srboutstandingcount);
3644 			continue;
3645 		}
3646 		arcmsr_report_srb_state(acb, srb, error);
3647 	}	/*drain reply FIFO*/
3648 }
3649 /*
3650 **********************************************************************
3651 **
3652 **********************************************************************
3653 */
3654 static void arcmsr_polling_hbe_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3655 {
3656 	struct CommandControlBlock *srb;
3657 	u_int32_t poll_srb_done=0, poll_count=0, doneq_index;
3658 	u_int16_t	error, cmdSMID;
3659 
3660 polling_ccb_retry:
3661 	poll_count++;
3662 	bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3663 	while(1) {
3664 		doneq_index = acb->doneq_index;
3665 		if((CHIP_REG_READ32(HBE_MessageUnit, 0, reply_post_producer_index) & 0xFFFF) == doneq_index) {
3666 			if(poll_srb_done) {
3667 				break;/*chip FIFO no ccb for completion already*/
3668 			} else {
3669 				UDELAY(25000);
3670 				if ((poll_count > 100) && (poll_srb != NULL)) {
3671 					break;
3672 				}
3673 				if (acb->srboutstandingcount == 0) {
3674 					break;
3675 				}
3676 				goto polling_ccb_retry;
3677 			}
3678 		}
3679 		cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID;
3680 		doneq_index++;
3681 		if (doneq_index >= acb->completionQ_entry)
3682 			doneq_index = 0;
3683 		acb->doneq_index = doneq_index;
3684 		srb = acb->psrb_pool[cmdSMID];
3685 		error = (acb->pCompletionQ[doneq_index].cmdFlag & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE;
3686 		if (poll_srb != NULL)
3687 			poll_srb_done = (srb == poll_srb) ? 1:0;
3688 		if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3689 			if(srb->srb_state == ARCMSR_SRB_ABORTED) {
3690 				printf("arcmsr%d: scsi id=%d lun=%jx srb='%p'poll command abort successfully \n"
3691 						, acb->pci_unit, srb->pccb->ccb_h.target_id, (uintmax_t)srb->pccb->ccb_h.target_lun, srb);
3692 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
3693 				arcmsr_srb_complete(srb, 1);
3694 				continue;
3695 			}
3696 			printf("arcmsr%d: polling get an illegal srb command done srb='%p'srboutstandingcount=%d \n"
3697 					, acb->pci_unit, srb, acb->srboutstandingcount);
3698 			continue;
3699 		}
3700 		arcmsr_report_srb_state(acb, srb, error);
3701 	}	/*drain reply FIFO*/
3702 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, reply_post_producer_index, doneq_index);
3703 }
3704 /*
3705 **********************************************************************
3706 **********************************************************************
3707 */
3708 static void arcmsr_polling_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3709 {
3710 	switch (acb->adapter_type) {
3711 	case ACB_ADAPTER_TYPE_A:
3712 		arcmsr_polling_hba_srbdone(acb, poll_srb);
3713 		break;
3714 	case ACB_ADAPTER_TYPE_B:
3715 		arcmsr_polling_hbb_srbdone(acb, poll_srb);
3716 		break;
3717 	case ACB_ADAPTER_TYPE_C:
3718 		arcmsr_polling_hbc_srbdone(acb, poll_srb);
3719 		break;
3720 	case ACB_ADAPTER_TYPE_D:
3721 		arcmsr_polling_hbd_srbdone(acb, poll_srb);
3722 		break;
3723 	case ACB_ADAPTER_TYPE_E:
3724 	case ACB_ADAPTER_TYPE_F:
3725 		arcmsr_polling_hbe_srbdone(acb, poll_srb);
3726 		break;
3727 	}
3728 }
3729 /*
3730 **********************************************************************
3731 **********************************************************************
3732 */
3733 static void arcmsr_get_hba_config(struct AdapterControlBlock *acb)
3734 {
3735 	char *acb_firm_model = acb->firm_model;
3736 	char *acb_firm_version = acb->firm_version;
3737 	char *acb_device_map = acb->device_map;
3738 	size_t iop_firm_model = offsetof(struct HBA_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]);	/*firm_model,15,60-67*/
3739 	size_t iop_firm_version = offsetof(struct HBA_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]);	/*firm_version,17,68-83*/
3740 	size_t iop_device_map = offsetof(struct HBA_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
3741 	int i;
3742 
3743 	CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
3744 	if(!arcmsr_hba_wait_msgint_ready(acb)) {
3745 		printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3746 	}
3747 	i = 0;
3748 	while(i < 8) {
3749 		*acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3750 		/* 8 bytes firm_model, 15, 60-67*/
3751 		acb_firm_model++;
3752 		i++;
3753 	}
3754 	i=0;
3755 	while(i < 16) {
3756 		*acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3757 		/* 16 bytes firm_version, 17, 68-83*/
3758 		acb_firm_version++;
3759 		i++;
3760 	}
3761 	i=0;
3762 	while(i < 16) {
3763 		*acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3764 		acb_device_map++;
3765 		i++;
3766 	}
3767 	printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3768 	acb->firm_request_len = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[1]);   /*firm_request_len, 1, 04-07*/
3769 	acb->firm_numbers_queue = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
3770 	acb->firm_sdram_size = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[3]);    /*firm_sdram_size, 3, 12-15*/
3771 	acb->firm_ide_channels = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[4]);  /*firm_ide_channels, 4, 16-19*/
3772 	acb->firm_cfg_version = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]);	/*firm_cfg_version,  25, 	  */
3773 	if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
3774 		acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
3775 	else
3776 		acb->maxOutstanding = acb->firm_numbers_queue - 1;
3777 }
3778 /*
3779 **********************************************************************
3780 **********************************************************************
3781 */
3782 static void arcmsr_get_hbb_config(struct AdapterControlBlock *acb)
3783 {
3784 	struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
3785 	char *acb_firm_model = acb->firm_model;
3786 	char *acb_firm_version = acb->firm_version;
3787 	char *acb_device_map = acb->device_map;
3788 	size_t iop_firm_model = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]);	/*firm_model,15,60-67*/
3789 	size_t iop_firm_version = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]);	/*firm_version,17,68-83*/
3790 	size_t iop_device_map = offsetof(struct HBB_RWBUFFER, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
3791 	int i;
3792 
3793 	WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_GET_CONFIG);
3794 	if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3795 		printf( "arcmsr%d: wait" "'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3796 	}
3797 	i = 0;
3798 	while(i < 8) {
3799 		*acb_firm_model = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_firm_model+i);
3800 		/* 8 bytes firm_model, 15, 60-67*/
3801 		acb_firm_model++;
3802 		i++;
3803 	}
3804 	i = 0;
3805 	while(i < 16) {
3806 		*acb_firm_version = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_firm_version+i);
3807 		/* 16 bytes firm_version, 17, 68-83*/
3808 		acb_firm_version++;
3809 		i++;
3810 	}
3811 	i = 0;
3812 	while(i < 16) {
3813 		*acb_device_map = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_device_map+i);
3814 		acb_device_map++;
3815 		i++;
3816 	}
3817 	printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3818 	acb->firm_request_len = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[1]);   /*firm_request_len, 1, 04-07*/
3819 	acb->firm_numbers_queue = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
3820 	acb->firm_sdram_size = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[3]);    /*firm_sdram_size, 3, 12-15*/
3821 	acb->firm_ide_channels = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[4]);  /*firm_ide_channels, 4, 16-19*/
3822 	acb->firm_cfg_version = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]);	/*firm_cfg_version,  25, 	  */
3823 	if(acb->firm_numbers_queue > ARCMSR_MAX_HBB_POSTQUEUE)
3824 		acb->maxOutstanding = ARCMSR_MAX_HBB_POSTQUEUE - 1;
3825 	else
3826 		acb->maxOutstanding = acb->firm_numbers_queue - 1;
3827 }
3828 /*
3829 **********************************************************************
3830 **********************************************************************
3831 */
3832 static void arcmsr_get_hbc_config(struct AdapterControlBlock *acb)
3833 {
3834 	char *acb_firm_model = acb->firm_model;
3835 	char *acb_firm_version = acb->firm_version;
3836 	char *acb_device_map = acb->device_map;
3837 	size_t iop_firm_model = offsetof(struct HBC_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]);   /*firm_model,15,60-67*/
3838 	size_t iop_firm_version = offsetof(struct HBC_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]); /*firm_version,17,68-83*/
3839 	size_t iop_device_map = offsetof(struct HBC_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
3840 	int i;
3841 
3842 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
3843 	CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
3844 	if(!arcmsr_hbc_wait_msgint_ready(acb)) {
3845 		printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3846 	}
3847 	i = 0;
3848 	while(i < 8) {
3849 		*acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3850 		/* 8 bytes firm_model, 15, 60-67*/
3851 		acb_firm_model++;
3852 		i++;
3853 	}
3854 	i = 0;
3855 	while(i < 16) {
3856 		*acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3857 		/* 16 bytes firm_version, 17, 68-83*/
3858 		acb_firm_version++;
3859 		i++;
3860 	}
3861 	i = 0;
3862 	while(i < 16) {
3863 		*acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3864 		acb_device_map++;
3865 		i++;
3866 	}
3867 	printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3868 	acb->firm_request_len	= CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[1]);	/*firm_request_len,   1, 04-07*/
3869 	acb->firm_numbers_queue	= CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[2]);	/*firm_numbers_queue, 2, 08-11*/
3870 	acb->firm_sdram_size	= CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[3]);	/*firm_sdram_size,    3, 12-15*/
3871 	acb->firm_ide_channels	= CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[4]);	/*firm_ide_channels,  4, 16-19*/
3872 	acb->firm_cfg_version	= CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]);	/*firm_cfg_version,  25, 	  */
3873 	if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
3874 		acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
3875 	else
3876 		acb->maxOutstanding = acb->firm_numbers_queue - 1;
3877 }
3878 /*
3879 **********************************************************************
3880 **********************************************************************
3881 */
3882 static void arcmsr_get_hbd_config(struct AdapterControlBlock *acb)
3883 {
3884 	char *acb_firm_model = acb->firm_model;
3885 	char *acb_firm_version = acb->firm_version;
3886 	char *acb_device_map = acb->device_map;
3887 	size_t iop_firm_model = offsetof(struct HBD_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]);   /*firm_model,15,60-67*/
3888 	size_t iop_firm_version = offsetof(struct HBD_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]); /*firm_version,17,68-83*/
3889 	size_t iop_device_map = offsetof(struct HBD_MessageUnit, msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
3890 	int i;
3891 
3892 	if(CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_doorbell) & ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE)
3893 		CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, ARCMSR_HBDMU_IOP2DRV_MESSAGE_CMD_DONE_CLEAR);
3894 	CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
3895 	if(!arcmsr_hbd_wait_msgint_ready(acb)) {
3896 		printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3897 	}
3898 	i = 0;
3899 	while(i < 8) {
3900 		*acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3901 		/* 8 bytes firm_model, 15, 60-67*/
3902 		acb_firm_model++;
3903 		i++;
3904 	}
3905 	i = 0;
3906 	while(i < 16) {
3907 		*acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3908 		/* 16 bytes firm_version, 17, 68-83*/
3909 		acb_firm_version++;
3910 		i++;
3911 	}
3912 	i = 0;
3913 	while(i < 16) {
3914 		*acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3915 		acb_device_map++;
3916 		i++;
3917 	}
3918 	printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3919 	acb->firm_request_len	= CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[1]);	/*firm_request_len,   1, 04-07*/
3920 	acb->firm_numbers_queue	= CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[2]);	/*firm_numbers_queue, 2, 08-11*/
3921 	acb->firm_sdram_size	= CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[3]);	/*firm_sdram_size,    3, 12-15*/
3922 	acb->firm_ide_channels	= CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[4]);	/*firm_ide_channels,  4, 16-19*/
3923 	acb->firm_cfg_version	= CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]);	/*firm_cfg_version,  25, 	  */
3924 	if(acb->firm_numbers_queue > ARCMSR_MAX_HBD_POSTQUEUE)
3925 		acb->maxOutstanding = ARCMSR_MAX_HBD_POSTQUEUE - 1;
3926 	else
3927 		acb->maxOutstanding = acb->firm_numbers_queue - 1;
3928 }
3929 /*
3930 **********************************************************************
3931 **********************************************************************
3932 */
3933 static void arcmsr_get_hbe_config(struct AdapterControlBlock *acb)
3934 {
3935 	char *acb_firm_model = acb->firm_model;
3936 	char *acb_firm_version = acb->firm_version;
3937 	char *acb_device_map = acb->device_map;
3938 	size_t iop_firm_model = offsetof(struct HBE_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_MODEL_OFFSET]);   /*firm_model,15,60-67*/
3939 	size_t iop_firm_version = offsetof(struct HBE_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_VERS_OFFSET]); /*firm_version,17,68-83*/
3940 	size_t iop_device_map = offsetof(struct HBE_MessageUnit,msgcode_rwbuffer[ARCMSR_FW_DEVMAP_OFFSET]);
3941 	int i;
3942 
3943 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
3944 	acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
3945 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
3946 	if(!arcmsr_hbe_wait_msgint_ready(acb)) {
3947 		printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3948 	}
3949 
3950 	i = 0;
3951 	while(i < 8) {
3952 		*acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3953 		/* 8 bytes firm_model, 15, 60-67*/
3954 		acb_firm_model++;
3955 		i++;
3956 	}
3957 	i = 0;
3958 	while(i < 16) {
3959 		*acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3960 		/* 16 bytes firm_version, 17, 68-83*/
3961 		acb_firm_version++;
3962 		i++;
3963 	}
3964 	i = 0;
3965 	while(i < 16) {
3966 		*acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3967 		acb_device_map++;
3968 		i++;
3969 	}
3970 	printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3971 	acb->firm_request_len	= CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[1]);	/*firm_request_len,   1, 04-07*/
3972 	acb->firm_numbers_queue	= CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[2]);	/*firm_numbers_queue, 2, 08-11*/
3973 	acb->firm_sdram_size	= CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[3]);	/*firm_sdram_size,    3, 12-15*/
3974 	acb->firm_ide_channels	= CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[4]);	/*firm_ide_channels,  4, 16-19*/
3975 	acb->firm_cfg_version	= CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]);	/*firm_cfg_version,  25, 	  */
3976 	if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
3977 		acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
3978 	else
3979 		acb->maxOutstanding = acb->firm_numbers_queue - 1;
3980 }
3981 /*
3982 **********************************************************************
3983 **********************************************************************
3984 */
3985 static void arcmsr_get_hbf_config(struct AdapterControlBlock *acb)
3986 {
3987 	u_int32_t *acb_firm_model = (u_int32_t *)acb->firm_model;
3988 	u_int32_t *acb_firm_version = (u_int32_t *)acb->firm_version;
3989 	u_int32_t *acb_device_map = (u_int32_t *)acb->device_map;
3990 	size_t iop_firm_model = ARCMSR_FW_MODEL_OFFSET;   /*firm_model,15,60-67*/
3991 	size_t iop_firm_version = ARCMSR_FW_VERS_OFFSET; /*firm_version,17,68-83*/
3992 	size_t iop_device_map = ARCMSR_FW_DEVMAP_OFFSET;
3993 	int i;
3994 
3995 	CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_GET_CONFIG);
3996 	acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
3997 	CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
3998 	if(!arcmsr_hbe_wait_msgint_ready(acb))
3999 		printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
4000 
4001 	i = 0;
4002 	while(i < 2) {
4003 		*acb_firm_model = acb->msgcode_rwbuffer[iop_firm_model];
4004 		/* 8 bytes firm_model, 15, 60-67*/
4005 		acb_firm_model++;
4006 		iop_firm_model++;
4007 		i++;
4008 	}
4009 	i = 0;
4010 	while(i < 4) {
4011 		*acb_firm_version = acb->msgcode_rwbuffer[iop_firm_version];
4012 		/* 16 bytes firm_version, 17, 68-83*/
4013 		acb_firm_version++;
4014 		iop_firm_version++;
4015 		i++;
4016 	}
4017 	i = 0;
4018 	while(i < 4) {
4019 		*acb_device_map = acb->msgcode_rwbuffer[iop_device_map];
4020 		acb_device_map++;
4021 		iop_device_map++;
4022 		i++;
4023 	}
4024 	printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
4025 	acb->firm_request_len	= acb->msgcode_rwbuffer[1];	/*firm_request_len,   1, 04-07*/
4026 	acb->firm_numbers_queue	= acb->msgcode_rwbuffer[2];	/*firm_numbers_queue, 2, 08-11*/
4027 	acb->firm_sdram_size	= acb->msgcode_rwbuffer[3];	/*firm_sdram_size,    3, 12-15*/
4028 	acb->firm_ide_channels	= acb->msgcode_rwbuffer[4];	/*firm_ide_channels,  4, 16-19*/
4029 	acb->firm_cfg_version	= acb->msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]; /*firm_cfg_version,  25*/
4030 	if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
4031 		acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
4032 	else
4033 		acb->maxOutstanding = acb->firm_numbers_queue - 1;
4034 }
4035 /*
4036 **********************************************************************
4037 **********************************************************************
4038 */
4039 static void arcmsr_get_firmware_spec(struct AdapterControlBlock *acb)
4040 {
4041 	switch (acb->adapter_type) {
4042 	case ACB_ADAPTER_TYPE_A:
4043 		arcmsr_get_hba_config(acb);
4044 		break;
4045 	case ACB_ADAPTER_TYPE_B:
4046 		arcmsr_get_hbb_config(acb);
4047 		break;
4048 	case ACB_ADAPTER_TYPE_C:
4049 		arcmsr_get_hbc_config(acb);
4050 		break;
4051 	case ACB_ADAPTER_TYPE_D:
4052 		arcmsr_get_hbd_config(acb);
4053 		break;
4054 	case ACB_ADAPTER_TYPE_E:
4055 		arcmsr_get_hbe_config(acb);
4056 		break;
4057 	case ACB_ADAPTER_TYPE_F:
4058 		arcmsr_get_hbf_config(acb);
4059 		break;
4060 	}
4061 }
4062 /*
4063 **********************************************************************
4064 **********************************************************************
4065 */
4066 static void arcmsr_wait_firmware_ready( struct AdapterControlBlock *acb)
4067 {
4068 	int	timeout=0;
4069 
4070 	switch (acb->adapter_type) {
4071 	case ACB_ADAPTER_TYPE_A: {
4072 			while ((CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_msgaddr1) & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0)
4073 			{
4074 				if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
4075 				{
4076 					printf( "arcmsr%d:timed out waiting for firmware \n", acb->pci_unit);
4077 					return;
4078 				}
4079 				UDELAY(15000); /* wait 15 milli-seconds */
4080 			}
4081 		}
4082 		break;
4083 	case ACB_ADAPTER_TYPE_B: {
4084 			struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4085 			while ((READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell) & ARCMSR_MESSAGE_FIRMWARE_OK) == 0)
4086 			{
4087 				if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
4088 				{
4089 					printf( "arcmsr%d: timed out waiting for firmware \n", acb->pci_unit);
4090 					return;
4091 				}
4092 				UDELAY(15000); /* wait 15 milli-seconds */
4093 			}
4094 			WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_END_OF_INTERRUPT);
4095 		}
4096 		break;
4097 	case ACB_ADAPTER_TYPE_C: {
4098 			while ((CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_msgaddr1) & ARCMSR_HBCMU_MESSAGE_FIRMWARE_OK) == 0)
4099 			{
4100 				if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
4101 				{
4102 					printf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit);
4103 					return;
4104 				}
4105 				UDELAY(15000); /* wait 15 milli-seconds */
4106 			}
4107 		}
4108 		break;
4109 	case ACB_ADAPTER_TYPE_D: {
4110 			while ((CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_msgaddr1) & ARCMSR_HBDMU_MESSAGE_FIRMWARE_OK) == 0)
4111 			{
4112 				if (timeout++ > 2000) /* (2000*15)/1000 = 30 sec */
4113 				{
4114 					printf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit);
4115 					return;
4116 				}
4117 				UDELAY(15000); /* wait 15 milli-seconds */
4118 			}
4119 		}
4120 		break;
4121 	case ACB_ADAPTER_TYPE_E:
4122 	case ACB_ADAPTER_TYPE_F: {
4123 			while ((CHIP_REG_READ32(HBE_MessageUnit, 0, outbound_msgaddr1) & ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK) == 0)
4124 			{
4125 				if (timeout++ > 4000) /* (4000*15)/1000 = 60 sec */
4126 				{
4127 					printf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit);
4128 					return;
4129 				}
4130 				UDELAY(15000); /* wait 15 milli-seconds */
4131 			}
4132 		}
4133 		break;
4134 	}
4135 }
4136 /*
4137 **********************************************************************
4138 **********************************************************************
4139 */
4140 static void arcmsr_clear_doorbell_queue_buffer( struct AdapterControlBlock *acb)
4141 {
4142 	u_int32_t outbound_doorbell;
4143 
4144 	switch (acb->adapter_type) {
4145 	case ACB_ADAPTER_TYPE_A: {
4146 			/* empty doorbell Qbuffer if door bell ringed */
4147 			outbound_doorbell = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_doorbell);
4148 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, outbound_doorbell, outbound_doorbell);	/*clear doorbell interrupt */
4149 			CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_doorbell, ARCMSR_INBOUND_DRIVER_DATA_READ_OK);
4150 		}
4151 		break;
4152 	case ACB_ADAPTER_TYPE_B: {
4153 			struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4154 			WRITE_CHIP_REG32(0, phbbmu->iop2drv_doorbell, ARCMSR_DOORBELL_INT_CLEAR_PATTERN);/*clear interrupt and message state*/
4155 			WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_DRV2IOP_DATA_READ_OK);
4156 			/* let IOP know data has been read */
4157 		}
4158 		break;
4159 	case ACB_ADAPTER_TYPE_C: {
4160 			/* empty doorbell Qbuffer if door bell ringed */
4161 			outbound_doorbell = CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell);
4162 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, outbound_doorbell_clear, outbound_doorbell);	/*clear doorbell interrupt */
4163 			CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell, ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK);
4164 			CHIP_REG_READ32(HBC_MessageUnit, 0, outbound_doorbell_clear); /* Dummy read to force pci flush */
4165 			CHIP_REG_READ32(HBC_MessageUnit, 0, inbound_doorbell); /* Dummy read to force pci flush */
4166 		}
4167 		break;
4168 	case ACB_ADAPTER_TYPE_D: {
4169 			/* empty doorbell Qbuffer if door bell ringed */
4170 			outbound_doorbell = CHIP_REG_READ32(HBD_MessageUnit, 0, outbound_doorbell);
4171 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, outbound_doorbell, outbound_doorbell);	/*clear doorbell interrupt */
4172 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_doorbell, ARCMSR_HBDMU_DRV2IOP_DATA_OUT_READ);
4173 		}
4174 		break;
4175 	case ACB_ADAPTER_TYPE_E:
4176 	case ACB_ADAPTER_TYPE_F: {
4177 			/* empty doorbell Qbuffer if door bell ringed */
4178 			acb->in_doorbell = CHIP_REG_READ32(HBE_MessageUnit, 0, iobound_doorbell);
4179 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0);	/*clear doorbell interrupt */
4180 			acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK;
4181 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
4182 		}
4183 		break;
4184 	}
4185 }
4186 /*
4187 ************************************************************************
4188 ************************************************************************
4189 */
4190 static u_int32_t arcmsr_iop_confirm(struct AdapterControlBlock *acb)
4191 {
4192 	unsigned long srb_phyaddr;
4193 	u_int32_t srb_phyaddr_hi32;
4194 	u_int32_t srb_phyaddr_lo32;
4195 
4196 	/*
4197 	********************************************************************
4198 	** here we need to tell iop 331 our freesrb.HighPart
4199 	** if freesrb.HighPart is not zero
4200 	********************************************************************
4201 	*/
4202 	srb_phyaddr = (unsigned long) acb->srb_phyaddr.phyaddr;
4203 	srb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
4204 	srb_phyaddr_lo32 = acb->srb_phyaddr.B.phyadd_low;
4205 	switch (acb->adapter_type) {
4206 	case ACB_ADAPTER_TYPE_A: {
4207 			if(srb_phyaddr_hi32 != 0) {
4208 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG);
4209 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, msgcode_rwbuffer[1], srb_phyaddr_hi32);
4210 				CHIP_REG_WRITE32(HBA_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
4211 				if(!arcmsr_hba_wait_msgint_ready(acb)) {
4212 					printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
4213 					return FALSE;
4214 				}
4215 			}
4216 		}
4217 		break;
4218 		/*
4219 		***********************************************************************
4220 		**    if adapter type B, set window of "post command Q"
4221 		***********************************************************************
4222 		*/
4223 	case ACB_ADAPTER_TYPE_B: {
4224 			u_int32_t post_queue_phyaddr;
4225 			struct HBB_MessageUnit *phbbmu;
4226 
4227 			phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4228 			phbbmu->postq_index = 0;
4229 			phbbmu->doneq_index = 0;
4230 			WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_SET_POST_WINDOW);
4231 			if(!arcmsr_hbb_wait_msgint_ready(acb)) {
4232 				printf( "arcmsr%d: 'set window of post command Q' timeout\n", acb->pci_unit);
4233 				return FALSE;
4234 			}
4235 			post_queue_phyaddr = srb_phyaddr + ARCMSR_SRBS_POOL_SIZE
4236 								+ offsetof(struct HBB_MessageUnit, post_qbuffer);
4237 			CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG); /* driver "set config" signature */
4238 			CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[1], srb_phyaddr_hi32); /* normal should be zero */
4239 			CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[2], post_queue_phyaddr); /* postQ size (256+8)*4 */
4240 			CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[3], post_queue_phyaddr+1056); /* doneQ size (256+8)*4 */
4241 			CHIP_REG_WRITE32(HBB_RWBUFFER, 1, msgcode_rwbuffer[4], 1056); /* srb maxQ size must be --> [(256+8)*4] */
4242 			WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_SET_CONFIG);
4243 			if(!arcmsr_hbb_wait_msgint_ready(acb)) {
4244 				printf( "arcmsr%d: 'set command Q window' timeout \n", acb->pci_unit);
4245 				return FALSE;
4246 			}
4247 			WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_START_DRIVER_MODE);
4248 			if(!arcmsr_hbb_wait_msgint_ready(acb)) {
4249 				printf( "arcmsr%d: 'start diver mode' timeout \n", acb->pci_unit);
4250 				return FALSE;
4251 			}
4252 		}
4253 		break;
4254 	case ACB_ADAPTER_TYPE_C: {
4255 			if(srb_phyaddr_hi32 != 0) {
4256 				CHIP_REG_WRITE32(HBC_MessageUnit, 0, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG);
4257 				CHIP_REG_WRITE32(HBC_MessageUnit, 0, msgcode_rwbuffer[1], srb_phyaddr_hi32);
4258 				CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
4259 				CHIP_REG_WRITE32(HBC_MessageUnit, 0, inbound_doorbell,ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE);
4260 				if(!arcmsr_hbc_wait_msgint_ready(acb)) {
4261 					printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
4262 					return FALSE;
4263 				}
4264 			}
4265 		}
4266 		break;
4267 	case ACB_ADAPTER_TYPE_D: {
4268 			u_int32_t post_queue_phyaddr, done_queue_phyaddr;
4269 			struct HBD_MessageUnit0 *phbdmu;
4270 
4271 			phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
4272 			phbdmu->postq_index = 0;
4273 			phbdmu->doneq_index = 0x40FF;
4274 			post_queue_phyaddr = srb_phyaddr_lo32 + ARCMSR_SRBS_POOL_SIZE
4275 								+ offsetof(struct HBD_MessageUnit0, post_qbuffer);
4276 			done_queue_phyaddr = srb_phyaddr_lo32 + ARCMSR_SRBS_POOL_SIZE
4277 								+ offsetof(struct HBD_MessageUnit0, done_qbuffer);
4278 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG); /* driver "set config" signature */
4279 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, msgcode_rwbuffer[1], srb_phyaddr_hi32);
4280 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, msgcode_rwbuffer[2], post_queue_phyaddr); /* postQ base */
4281 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, msgcode_rwbuffer[3], done_queue_phyaddr); /* doneQ base */
4282 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, msgcode_rwbuffer[4], 0x100);
4283 			CHIP_REG_WRITE32(HBD_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
4284 			if(!arcmsr_hbd_wait_msgint_ready(acb)) {
4285 				printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
4286 				return FALSE;
4287 			}
4288 		}
4289 		break;
4290 	case ACB_ADAPTER_TYPE_E: {
4291 			u_int32_t cdb_phyaddr_lo32;
4292 			cdb_phyaddr_lo32 = srb_phyaddr_lo32 + offsetof(struct CommandControlBlock, arcmsr_cdb);
4293 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[0], ARCMSR_SIGNATURE_SET_CONFIG);
4294 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[1], ARCMSR_SIGNATURE_1884);
4295 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[2], cdb_phyaddr_lo32);
4296 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[3], srb_phyaddr_hi32);
4297 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[4], SRB_SIZE);
4298 			cdb_phyaddr_lo32 = srb_phyaddr_lo32 + ARCMSR_SRBS_POOL_SIZE;
4299 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[5], cdb_phyaddr_lo32);
4300 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[6], srb_phyaddr_hi32);
4301 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, msgcode_rwbuffer[7], COMPLETION_Q_POOL_SIZE);
4302 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
4303 			acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
4304 			CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
4305 			if(!arcmsr_hbe_wait_msgint_ready(acb)) {
4306 				printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
4307 				return FALSE;
4308 			}
4309 		}
4310 		break;
4311 	case ACB_ADAPTER_TYPE_F: {
4312 			u_int32_t cdb_phyaddr_lo32;
4313 			cdb_phyaddr_lo32 = srb_phyaddr_lo32 + offsetof(struct CommandControlBlock, arcmsr_cdb);
4314 			acb->msgcode_rwbuffer[0] = ARCMSR_SIGNATURE_SET_CONFIG;
4315 			acb->msgcode_rwbuffer[1] = ARCMSR_SIGNATURE_1886;
4316 			acb->msgcode_rwbuffer[2] = cdb_phyaddr_lo32;
4317 			acb->msgcode_rwbuffer[3] = srb_phyaddr_hi32;
4318 			acb->msgcode_rwbuffer[4] = SRB_SIZE;
4319 			cdb_phyaddr_lo32 = srb_phyaddr_lo32 + ARCMSR_SRBS_POOL_SIZE;
4320 			acb->msgcode_rwbuffer[5] = cdb_phyaddr_lo32;
4321 			acb->msgcode_rwbuffer[6] = srb_phyaddr_hi32;
4322 			acb->msgcode_rwbuffer[7] = COMPLETION_Q_POOL_SIZE;
4323 			CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_msgaddr0, ARCMSR_INBOUND_MESG0_SET_CONFIG);
4324 			acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
4325 			CHIP_REG_WRITE32(HBF_MessageUnit, 0, iobound_doorbell, acb->out_doorbell);
4326 			if(!arcmsr_hbe_wait_msgint_ready(acb)) {
4327 				printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
4328 				return FALSE;
4329 			}
4330 		}
4331 		break;
4332 	}
4333 	return (TRUE);
4334 }
4335 /*
4336 ************************************************************************
4337 ************************************************************************
4338 */
4339 static void arcmsr_enable_eoi_mode(struct AdapterControlBlock *acb)
4340 {
4341 	if (acb->adapter_type == ACB_ADAPTER_TYPE_B)
4342 	{
4343 		struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4344 		WRITE_CHIP_REG32(0, phbbmu->drv2iop_doorbell, ARCMSR_MESSAGE_ACTIVE_EOI_MODE);
4345 		if(!arcmsr_hbb_wait_msgint_ready(acb)) {
4346 			printf( "arcmsr%d: 'iop enable eoi mode' timeout \n", acb->pci_unit);
4347 			return;
4348 		}
4349 	}
4350 }
4351 /*
4352 **********************************************************************
4353 **********************************************************************
4354 */
4355 static void arcmsr_iop_init(struct AdapterControlBlock *acb)
4356 {
4357 	u_int32_t intmask_org;
4358 
4359 	/* disable all outbound interrupt */
4360 	intmask_org = arcmsr_disable_allintr(acb);
4361 	arcmsr_wait_firmware_ready(acb);
4362 	arcmsr_iop_confirm(acb);
4363 	arcmsr_get_firmware_spec(acb);
4364 	/*start background rebuild*/
4365 	arcmsr_start_adapter_bgrb(acb);
4366 	/* empty doorbell Qbuffer if door bell ringed */
4367 	arcmsr_clear_doorbell_queue_buffer(acb);
4368 	arcmsr_enable_eoi_mode(acb);
4369 	/* enable outbound Post Queue, outbound doorbell Interrupt */
4370 	arcmsr_enable_allintr(acb, intmask_org);
4371 	acb->acb_flags |= ACB_F_IOP_INITED;
4372 }
4373 /*
4374 **********************************************************************
4375 **********************************************************************
4376 */
4377 static void arcmsr_map_free_srb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
4378 {
4379 	struct AdapterControlBlock *acb = arg;
4380 	struct CommandControlBlock *srb_tmp;
4381 	u_int32_t i;
4382 	unsigned long srb_phyaddr = (unsigned long)segs->ds_addr;
4383 
4384 	acb->srb_phyaddr.phyaddr = srb_phyaddr;
4385 	srb_tmp = (struct CommandControlBlock *)acb->uncacheptr;
4386 	for(i=0; i < ARCMSR_MAX_FREESRB_NUM; i++) {
4387 		if(bus_dmamap_create(acb->dm_segs_dmat,
4388 			 /*flags*/0, &srb_tmp->dm_segs_dmamap) != 0) {
4389 			acb->acb_flags |= ACB_F_MAPFREESRB_FAILD;
4390 			printf("arcmsr%d:"
4391 			" srb dmamap bus_dmamap_create error\n", acb->pci_unit);
4392 			return;
4393 		}
4394 		if((acb->adapter_type == ACB_ADAPTER_TYPE_C) || (acb->adapter_type == ACB_ADAPTER_TYPE_D)
4395 			 || (acb->adapter_type == ACB_ADAPTER_TYPE_E) || (acb->adapter_type == ACB_ADAPTER_TYPE_F))
4396 		{
4397 			srb_tmp->cdb_phyaddr_low = srb_phyaddr;
4398 			srb_tmp->cdb_phyaddr_high = (u_int32_t)((srb_phyaddr >> 16) >> 16);
4399 		}
4400 		else
4401 			srb_tmp->cdb_phyaddr_low = srb_phyaddr >> 5;
4402 		srb_tmp->acb = acb;
4403 		srb_tmp->smid = i << 16;
4404 		acb->srbworkingQ[i] = acb->psrb_pool[i] = srb_tmp;
4405 		srb_phyaddr = srb_phyaddr + SRB_SIZE;
4406 		srb_tmp = (struct CommandControlBlock *)((unsigned long)srb_tmp + SRB_SIZE);
4407 	}
4408 	if (acb->adapter_type == ACB_ADAPTER_TYPE_E)
4409 		acb->pCompletionQ = (pCompletion_Q)srb_tmp;
4410 	else if (acb->adapter_type == ACB_ADAPTER_TYPE_F) {
4411 		acb->pCompletionQ = (pCompletion_Q)srb_tmp;
4412 		acb->completeQ_phys = srb_phyaddr;
4413 		memset(acb->pCompletionQ, 0xff, COMPLETION_Q_POOL_SIZE);
4414 		acb->message_wbuffer = (u_int32_t *)((unsigned long)acb->pCompletionQ + COMPLETION_Q_POOL_SIZE);
4415 		acb->message_rbuffer = (u_int32_t *)((unsigned long)acb->message_wbuffer + 0x100);
4416 		acb->msgcode_rwbuffer = (u_int32_t *)((unsigned long)acb->message_wbuffer + 0x200);
4417 		memset((void *)acb->message_wbuffer, 0, MESG_RW_BUFFER_SIZE);
4418 	}
4419 	acb->vir2phy_offset = (unsigned long)srb_tmp - (unsigned long)srb_phyaddr;
4420 }
4421 /*
4422 ************************************************************************
4423 ************************************************************************
4424 */
4425 static void arcmsr_free_resource(struct AdapterControlBlock *acb)
4426 {
4427 	/* remove the control device */
4428 	if(acb->ioctl_dev != NULL) {
4429 		destroy_dev(acb->ioctl_dev);
4430 	}
4431 	bus_dmamap_unload(acb->srb_dmat, acb->srb_dmamap);
4432 	bus_dmamap_destroy(acb->srb_dmat, acb->srb_dmamap);
4433 	bus_dma_tag_destroy(acb->srb_dmat);
4434 	bus_dma_tag_destroy(acb->dm_segs_dmat);
4435 	bus_dma_tag_destroy(acb->parent_dmat);
4436 }
4437 /*
4438 ************************************************************************
4439 ************************************************************************
4440 */
4441 static void arcmsr_mutex_init(struct AdapterControlBlock *acb)
4442 {
4443 	ARCMSR_LOCK_INIT(&acb->isr_lock, "arcmsr isr lock");
4444 	ARCMSR_LOCK_INIT(&acb->srb_lock, "arcmsr srb lock");
4445 	ARCMSR_LOCK_INIT(&acb->postDone_lock, "arcmsr postQ lock");
4446 	ARCMSR_LOCK_INIT(&acb->qbuffer_lock, "arcmsr RW buffer lock");
4447 }
4448 /*
4449 ************************************************************************
4450 ************************************************************************
4451 */
4452 static void arcmsr_mutex_destroy(struct AdapterControlBlock *acb)
4453 {
4454 	ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
4455 	ARCMSR_LOCK_DESTROY(&acb->postDone_lock);
4456 	ARCMSR_LOCK_DESTROY(&acb->srb_lock);
4457 	ARCMSR_LOCK_DESTROY(&acb->isr_lock);
4458 }
4459 /*
4460 ************************************************************************
4461 ************************************************************************
4462 */
4463 static u_int32_t arcmsr_initialize(device_t dev)
4464 {
4465 	struct AdapterControlBlock *acb = device_get_softc(dev);
4466 	u_int16_t pci_command;
4467 	int i, j,max_coherent_size;
4468 	u_int32_t vendor_dev_id;
4469 
4470 	vendor_dev_id = pci_get_devid(dev);
4471 	acb->vendor_device_id = vendor_dev_id;
4472 	acb->sub_device_id = pci_read_config(dev, PCIR_SUBDEV_0, 2);
4473 	switch (vendor_dev_id) {
4474 	case PCIDevVenIDARC1880:
4475 	case PCIDevVenIDARC1882:
4476 	case PCIDevVenIDARC1213:
4477 	case PCIDevVenIDARC1223: {
4478 			acb->adapter_type = ACB_ADAPTER_TYPE_C;
4479 			if ((acb->sub_device_id == ARECA_SUB_DEV_ID_1883) ||
4480 			    (acb->sub_device_id == ARECA_SUB_DEV_ID_1216) ||
4481 			    (acb->sub_device_id == ARECA_SUB_DEV_ID_1226))
4482 				acb->adapter_bus_speed = ACB_BUS_SPEED_12G;
4483 			else
4484 				acb->adapter_bus_speed = ACB_BUS_SPEED_6G;
4485 			max_coherent_size = ARCMSR_SRBS_POOL_SIZE;
4486 		}
4487 		break;
4488 	case PCIDevVenIDARC1884:
4489 		acb->adapter_type = ACB_ADAPTER_TYPE_E;
4490 		acb->adapter_bus_speed = ACB_BUS_SPEED_12G;
4491 		max_coherent_size = ARCMSR_SRBS_POOL_SIZE + COMPLETION_Q_POOL_SIZE;
4492 		acb->completionQ_entry = COMPLETION_Q_POOL_SIZE / sizeof(struct deliver_completeQ);
4493 		break;
4494 	case PCIDevVenIDARC1886_:
4495 	case PCIDevVenIDARC1886:
4496 		acb->adapter_type = ACB_ADAPTER_TYPE_F;
4497 		acb->adapter_bus_speed = ACB_BUS_SPEED_12G;
4498 		max_coherent_size = ARCMSR_SRBS_POOL_SIZE + COMPLETION_Q_POOL_SIZE + MESG_RW_BUFFER_SIZE;
4499 		acb->completionQ_entry = COMPLETION_Q_POOL_SIZE / sizeof(struct deliver_completeQ);
4500 		break;
4501 	case PCIDevVenIDARC1214: {
4502 			acb->adapter_type = ACB_ADAPTER_TYPE_D;
4503 			acb->adapter_bus_speed = ACB_BUS_SPEED_6G;
4504 			max_coherent_size = ARCMSR_SRBS_POOL_SIZE + (sizeof(struct HBD_MessageUnit0));
4505 		}
4506 		break;
4507 	case PCIDevVenIDARC1200:
4508 	case PCIDevVenIDARC1201: {
4509 			acb->adapter_type = ACB_ADAPTER_TYPE_B;
4510 			acb->adapter_bus_speed = ACB_BUS_SPEED_3G;
4511 			max_coherent_size = ARCMSR_SRBS_POOL_SIZE + (sizeof(struct HBB_MessageUnit));
4512 		}
4513 		break;
4514 	case PCIDevVenIDARC1203: {
4515 			acb->adapter_type = ACB_ADAPTER_TYPE_B;
4516 			acb->adapter_bus_speed = ACB_BUS_SPEED_6G;
4517 			max_coherent_size = ARCMSR_SRBS_POOL_SIZE + (sizeof(struct HBB_MessageUnit));
4518 		}
4519 		break;
4520 	case PCIDevVenIDARC1110:
4521 	case PCIDevVenIDARC1120:
4522 	case PCIDevVenIDARC1130:
4523 	case PCIDevVenIDARC1160:
4524 	case PCIDevVenIDARC1170:
4525 	case PCIDevVenIDARC1210:
4526 	case PCIDevVenIDARC1220:
4527 	case PCIDevVenIDARC1230:
4528 	case PCIDevVenIDARC1231:
4529 	case PCIDevVenIDARC1260:
4530 	case PCIDevVenIDARC1261:
4531 	case PCIDevVenIDARC1270:
4532 	case PCIDevVenIDARC1280:
4533 	case PCIDevVenIDARC1212:
4534 	case PCIDevVenIDARC1222:
4535 	case PCIDevVenIDARC1380:
4536 	case PCIDevVenIDARC1381:
4537 	case PCIDevVenIDARC1680:
4538 	case PCIDevVenIDARC1681: {
4539 			acb->adapter_type = ACB_ADAPTER_TYPE_A;
4540 			acb->adapter_bus_speed = ACB_BUS_SPEED_3G;
4541 			max_coherent_size = ARCMSR_SRBS_POOL_SIZE;
4542 		}
4543 		break;
4544 	default: {
4545 			printf("arcmsr%d:"
4546 			" unknown RAID adapter type \n", device_get_unit(dev));
4547 			return ENOMEM;
4548 		}
4549 	}
4550 	if(bus_dma_tag_create(  /*PCI parent*/		bus_get_dma_tag(dev),
4551 				/*alignemnt*/		1,
4552 				/*boundary*/		0,
4553 				/*lowaddr*/		BUS_SPACE_MAXADDR,
4554 				/*highaddr*/		BUS_SPACE_MAXADDR,
4555 				/*filter*/		NULL,
4556 				/*filterarg*/		NULL,
4557 				/*maxsize*/		BUS_SPACE_MAXSIZE_32BIT,
4558 				/*nsegments*/		BUS_SPACE_UNRESTRICTED,
4559 				/*maxsegsz*/		BUS_SPACE_MAXSIZE_32BIT,
4560 				/*flags*/		0,
4561 				/*lockfunc*/		NULL,
4562 				/*lockarg*/		NULL,
4563 							&acb->parent_dmat) != 0)
4564 	{
4565 		printf("arcmsr%d: parent_dmat bus_dma_tag_create failure!\n", device_get_unit(dev));
4566 		return ENOMEM;
4567 	}
4568 
4569 	/* Create a single tag describing a region large enough to hold all of the s/g lists we will need. */
4570 	if(bus_dma_tag_create(  /*parent_dmat*/		acb->parent_dmat,
4571 				/*alignment*/		1,
4572 				/*boundary*/		0,
4573 #ifdef PAE
4574 				/*lowaddr*/		BUS_SPACE_MAXADDR_32BIT,
4575 #else
4576 				/*lowaddr*/		BUS_SPACE_MAXADDR,
4577 #endif
4578 				/*highaddr*/		BUS_SPACE_MAXADDR,
4579 				/*filter*/		NULL,
4580 				/*filterarg*/		NULL,
4581 				/*maxsize*/		ARCMSR_MAX_SG_ENTRIES * PAGE_SIZE * ARCMSR_MAX_FREESRB_NUM,
4582 				/*nsegments*/		ARCMSR_MAX_SG_ENTRIES,
4583 				/*maxsegsz*/		BUS_SPACE_MAXSIZE_32BIT,
4584 				/*flags*/		0,
4585 				/*lockfunc*/		busdma_lock_mutex,
4586 				/*lockarg*/		&acb->isr_lock,
4587 							&acb->dm_segs_dmat) != 0)
4588 	{
4589 		bus_dma_tag_destroy(acb->parent_dmat);
4590 		printf("arcmsr%d: dm_segs_dmat bus_dma_tag_create failure!\n", device_get_unit(dev));
4591 		return ENOMEM;
4592 	}
4593 
4594 	/* DMA tag for our srb structures.... Allocate the freesrb memory */
4595 	if(bus_dma_tag_create(  /*parent_dmat*/		acb->parent_dmat,
4596 				/*alignment*/		0x20,
4597 				/*boundary*/		0,
4598 				/*lowaddr*/		BUS_SPACE_MAXADDR_32BIT,
4599 				/*highaddr*/		BUS_SPACE_MAXADDR,
4600 				/*filter*/		NULL,
4601 				/*filterarg*/		NULL,
4602 				/*maxsize*/		max_coherent_size,
4603 				/*nsegments*/		1,
4604 				/*maxsegsz*/		BUS_SPACE_MAXSIZE_32BIT,
4605 				/*flags*/		0,
4606 				/*lockfunc*/		NULL,
4607 				/*lockarg*/		NULL,
4608 							&acb->srb_dmat) != 0)
4609 	{
4610 		bus_dma_tag_destroy(acb->dm_segs_dmat);
4611 		bus_dma_tag_destroy(acb->parent_dmat);
4612 		printf("arcmsr%d: srb_dmat bus_dma_tag_create failure!\n", device_get_unit(dev));
4613 		return ENXIO;
4614 	}
4615 	/* Allocation for our srbs */
4616 	if(bus_dmamem_alloc(acb->srb_dmat, (void **)&acb->uncacheptr, BUS_DMA_WAITOK | BUS_DMA_COHERENT | BUS_DMA_ZERO, &acb->srb_dmamap) != 0) {
4617 		bus_dma_tag_destroy(acb->srb_dmat);
4618 		bus_dma_tag_destroy(acb->dm_segs_dmat);
4619 		bus_dma_tag_destroy(acb->parent_dmat);
4620 		printf("arcmsr%d: srb_dmat bus_dmamem_alloc failure!\n", device_get_unit(dev));
4621 		return ENXIO;
4622 	}
4623 	/* And permanently map them */
4624 	if(bus_dmamap_load(acb->srb_dmat, acb->srb_dmamap, acb->uncacheptr, max_coherent_size, arcmsr_map_free_srb, acb, /*flags*/0)) {
4625 		bus_dma_tag_destroy(acb->srb_dmat);
4626 		bus_dma_tag_destroy(acb->dm_segs_dmat);
4627 		bus_dma_tag_destroy(acb->parent_dmat);
4628 		printf("arcmsr%d: srb_dmat bus_dmamap_load failure!\n", device_get_unit(dev));
4629 		return ENXIO;
4630 	}
4631 	pci_command = pci_read_config(dev, PCIR_COMMAND, 2);
4632 	pci_command |= PCIM_CMD_BUSMASTEREN;
4633 	pci_command |= PCIM_CMD_PERRESPEN;
4634 	pci_command |= PCIM_CMD_MWRICEN;
4635 	/* Enable Busmaster */
4636 	pci_write_config(dev, PCIR_COMMAND, pci_command, 2);
4637 	switch(acb->adapter_type) {
4638 	case ACB_ADAPTER_TYPE_A: {
4639 		u_int32_t rid0 = PCIR_BAR(0);
4640 		vm_offset_t	mem_base0;
4641 
4642 		acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev,SYS_RES_MEMORY, &rid0, RF_ACTIVE);
4643 		if(acb->sys_res_arcmsr[0] == NULL) {
4644 			arcmsr_free_resource(acb);
4645 			printf("arcmsr%d: bus_alloc_resource failure!\n", device_get_unit(dev));
4646 			return ENOMEM;
4647 		}
4648 		if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4649 			arcmsr_free_resource(acb);
4650 			printf("arcmsr%d: rman_get_start failure!\n", device_get_unit(dev));
4651 			return ENXIO;
4652 		}
4653 		mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4654 		if(mem_base0 == 0) {
4655 			arcmsr_free_resource(acb);
4656 			printf("arcmsr%d: rman_get_virtual failure!\n", device_get_unit(dev));
4657 			return ENXIO;
4658 		}
4659 		acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4660 		acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4661 		acb->pmu = (struct MessageUnit_UNION *)mem_base0;
4662 		acb->rid[0] = rid0;
4663 		}
4664 		break;
4665 	case ACB_ADAPTER_TYPE_B: {
4666 		struct HBB_MessageUnit *phbbmu;
4667 		struct CommandControlBlock *freesrb;
4668 		u_int32_t rid[]={ PCIR_BAR(0), PCIR_BAR(2) };
4669 		vm_offset_t	mem_base[]={0,0};
4670 		for(i=0; i < 2; i++) {
4671 			acb->sys_res_arcmsr[i] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid[i], RF_ACTIVE);
4672 			if(acb->sys_res_arcmsr[i] == NULL) {
4673 				arcmsr_free_resource(acb);
4674 				printf("arcmsr%d: bus_alloc_resource %d failure!\n", device_get_unit(dev), i);
4675 				return ENOMEM;
4676 			}
4677 			if(rman_get_start(acb->sys_res_arcmsr[i]) <= 0) {
4678 				arcmsr_free_resource(acb);
4679 				printf("arcmsr%d: rman_get_start %d failure!\n", device_get_unit(dev), i);
4680 				return ENXIO;
4681 			}
4682 			mem_base[i] = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[i]);
4683 			if(mem_base[i] == 0) {
4684 				arcmsr_free_resource(acb);
4685 				printf("arcmsr%d: rman_get_virtual %d failure!\n", device_get_unit(dev), i);
4686 				return ENXIO;
4687 			}
4688 			acb->btag[i] = rman_get_bustag(acb->sys_res_arcmsr[i]);
4689 			acb->bhandle[i] = rman_get_bushandle(acb->sys_res_arcmsr[i]);
4690 		}
4691 		freesrb = (struct CommandControlBlock *)acb->uncacheptr;
4692 		acb->pmu = (struct MessageUnit_UNION *)((unsigned long)freesrb+ARCMSR_SRBS_POOL_SIZE);
4693 		phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4694 		phbbmu->hbb_doorbell = (struct HBB_DOORBELL *)mem_base[0];
4695 		phbbmu->hbb_rwbuffer = (struct HBB_RWBUFFER *)mem_base[1];
4696 		if (vendor_dev_id == PCIDevVenIDARC1203) {
4697 			phbbmu->drv2iop_doorbell = offsetof(struct HBB_DOORBELL_1203, drv2iop_doorbell);
4698 			phbbmu->drv2iop_doorbell_mask = offsetof(struct HBB_DOORBELL_1203, drv2iop_doorbell_mask);
4699 			phbbmu->iop2drv_doorbell = offsetof(struct HBB_DOORBELL_1203, iop2drv_doorbell);
4700 			phbbmu->iop2drv_doorbell_mask = offsetof(struct HBB_DOORBELL_1203, iop2drv_doorbell_mask);
4701 		} else {
4702 			phbbmu->drv2iop_doorbell = offsetof(struct HBB_DOORBELL, drv2iop_doorbell);
4703 			phbbmu->drv2iop_doorbell_mask = offsetof(struct HBB_DOORBELL, drv2iop_doorbell_mask);
4704 			phbbmu->iop2drv_doorbell = offsetof(struct HBB_DOORBELL, iop2drv_doorbell);
4705 			phbbmu->iop2drv_doorbell_mask = offsetof(struct HBB_DOORBELL, iop2drv_doorbell_mask);
4706 		}
4707 		acb->rid[0] = rid[0];
4708 		acb->rid[1] = rid[1];
4709 		}
4710 		break;
4711 	case ACB_ADAPTER_TYPE_C: {
4712 		u_int32_t rid0 = PCIR_BAR(1);
4713 		vm_offset_t	mem_base0;
4714 
4715 		acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid0, RF_ACTIVE);
4716 		if(acb->sys_res_arcmsr[0] == NULL) {
4717 			arcmsr_free_resource(acb);
4718 			printf("arcmsr%d: bus_alloc_resource failure!\n", device_get_unit(dev));
4719 			return ENOMEM;
4720 		}
4721 		if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4722 			arcmsr_free_resource(acb);
4723 			printf("arcmsr%d: rman_get_start failure!\n", device_get_unit(dev));
4724 			return ENXIO;
4725 		}
4726 		mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4727 		if(mem_base0 == 0) {
4728 			arcmsr_free_resource(acb);
4729 			printf("arcmsr%d: rman_get_virtual failure!\n", device_get_unit(dev));
4730 			return ENXIO;
4731 		}
4732 		acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4733 		acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4734 		acb->pmu = (struct MessageUnit_UNION *)mem_base0;
4735 		acb->rid[0] = rid0;
4736 		}
4737 		break;
4738 	case ACB_ADAPTER_TYPE_D: {
4739 		struct HBD_MessageUnit0 *phbdmu;
4740 		u_int32_t rid0 = PCIR_BAR(0);
4741 		vm_offset_t	mem_base0;
4742 
4743 		acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid0, RF_ACTIVE);
4744 		if(acb->sys_res_arcmsr[0] == NULL) {
4745 			arcmsr_free_resource(acb);
4746 			printf("arcmsr%d: bus_alloc_resource failure!\n", device_get_unit(dev));
4747 			return ENOMEM;
4748 		}
4749 		if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4750 			arcmsr_free_resource(acb);
4751 			printf("arcmsr%d: rman_get_start failure!\n", device_get_unit(dev));
4752 			return ENXIO;
4753 		}
4754 		mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4755 		if(mem_base0 == 0) {
4756 			arcmsr_free_resource(acb);
4757 			printf("arcmsr%d: rman_get_virtual failure!\n", device_get_unit(dev));
4758 			return ENXIO;
4759 		}
4760 		acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4761 		acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4762 		acb->pmu = (struct MessageUnit_UNION *)((unsigned long)acb->uncacheptr+ARCMSR_SRBS_POOL_SIZE);
4763 		phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
4764 		phbdmu->phbdmu = (struct HBD_MessageUnit *)mem_base0;
4765 		acb->rid[0] = rid0;
4766 		}
4767 		break;
4768 	case ACB_ADAPTER_TYPE_E: {
4769 		u_int32_t rid0 = PCIR_BAR(1);
4770 		vm_offset_t	mem_base0;
4771 
4772 		acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid0, RF_ACTIVE);
4773 		if(acb->sys_res_arcmsr[0] == NULL) {
4774 			arcmsr_free_resource(acb);
4775 			printf("arcmsr%d: bus_alloc_resource failure!\n", device_get_unit(dev));
4776 			return ENOMEM;
4777 		}
4778 		if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4779 			arcmsr_free_resource(acb);
4780 			printf("arcmsr%d: rman_get_start failure!\n", device_get_unit(dev));
4781 			return ENXIO;
4782 		}
4783 		mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4784 		if(mem_base0 == 0) {
4785 			arcmsr_free_resource(acb);
4786 			printf("arcmsr%d: rman_get_virtual failure!\n", device_get_unit(dev));
4787 			return ENXIO;
4788 		}
4789 		acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4790 		acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4791 		acb->pmu = (struct MessageUnit_UNION *)mem_base0;
4792 		acb->doneq_index = 0;
4793 		acb->in_doorbell = 0;
4794 		acb->out_doorbell = 0;
4795 		acb->rid[0] = rid0;
4796 		CHIP_REG_WRITE32(HBE_MessageUnit, 0, host_int_status, 0); /*clear interrupt*/
4797 		CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, ARCMSR_HBEMU_DOORBELL_SYNC); /* synchronize doorbell to 0 */
4798 		}
4799 		break;
4800 	case ACB_ADAPTER_TYPE_F: {
4801 		u_int32_t rid0 = PCIR_BAR(0);
4802 		vm_offset_t	mem_base0;
4803 		unsigned long	host_buffer_dma;
4804 
4805 		acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid0, RF_ACTIVE);
4806 		if(acb->sys_res_arcmsr[0] == NULL) {
4807 			arcmsr_free_resource(acb);
4808 			printf("arcmsr%d: bus_alloc_resource failure!\n", device_get_unit(dev));
4809 			return ENOMEM;
4810 		}
4811 		if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4812 			arcmsr_free_resource(acb);
4813 			printf("arcmsr%d: rman_get_start failure!\n", device_get_unit(dev));
4814 			return ENXIO;
4815 		}
4816 		mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4817 		if(mem_base0 == 0) {
4818 			arcmsr_free_resource(acb);
4819 			printf("arcmsr%d: rman_get_virtual failure!\n", device_get_unit(dev));
4820 			return ENXIO;
4821 		}
4822 		acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4823 		acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4824 		acb->pmu = (struct MessageUnit_UNION *)mem_base0;
4825 		acb->doneq_index = 0;
4826 		acb->in_doorbell = 0;
4827 		acb->out_doorbell = 0;
4828 		acb->rid[0] = rid0;
4829 		arcmsr_wait_firmware_ready(acb);
4830 		CHIP_REG_WRITE32(HBF_MessageUnit, 0, host_int_status, 0); /*clear interrupt*/
4831 		CHIP_REG_WRITE32(HBF_MessageUnit, 0, iobound_doorbell, ARCMSR_HBEMU_DOORBELL_SYNC); /* synchronize doorbell to 0 */
4832 		host_buffer_dma = acb->completeQ_phys + COMPLETION_Q_POOL_SIZE;
4833 		CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_msgaddr0, (u_int32_t)(host_buffer_dma | 1));  /* host buffer low addr, bit0:1 all buffer active */
4834 		CHIP_REG_WRITE32(HBF_MessageUnit, 0, inbound_msgaddr1, (u_int32_t)((host_buffer_dma >> 16) >> 16));/* host buffer high addr */
4835 		CHIP_REG_WRITE32(HBF_MessageUnit, 0, iobound_doorbell, ARCMSR_HBFMU_DOORBELL_SYNC1);       /* set host buffer physical address */
4836 		}
4837 		break;
4838 	}
4839 	if(acb->acb_flags & ACB_F_MAPFREESRB_FAILD) {
4840 		arcmsr_free_resource(acb);
4841 		printf("arcmsr%d: map free srb failure!\n", device_get_unit(dev));
4842 		return ENXIO;
4843 	}
4844 	acb->acb_flags  |= (ACB_F_MESSAGE_WQBUFFER_CLEARED|ACB_F_MESSAGE_RQBUFFER_CLEARED|ACB_F_MESSAGE_WQBUFFER_READ);
4845 	acb->acb_flags &= ~ACB_F_SCSISTOPADAPTER;
4846 	/*
4847 	********************************************************************
4848 	** init raid volume state
4849 	********************************************************************
4850 	*/
4851 	for(i=0; i < ARCMSR_MAX_TARGETID; i++) {
4852 		for(j=0; j < ARCMSR_MAX_TARGETLUN; j++) {
4853 			acb->devstate[i][j] = ARECA_RAID_GONE;
4854 		}
4855 	}
4856 	arcmsr_iop_init(acb);
4857 	return(0);
4858 }
4859 
4860 static int arcmsr_setup_msix(struct AdapterControlBlock *acb)
4861 {
4862 	int i;
4863 
4864 	for (i = 0; i < acb->msix_vectors; i++) {
4865 		acb->irq_id[i] = 1 + i;
4866 		acb->irqres[i] = bus_alloc_resource_any(acb->pci_dev,
4867 		    SYS_RES_IRQ, &acb->irq_id[i], RF_ACTIVE);
4868 		if (acb->irqres[i] == NULL) {
4869 			printf("arcmsr: Can't allocate MSI-X resource\n");
4870 			goto irq_alloc_failed;
4871 		}
4872 		if (bus_setup_intr(acb->pci_dev, acb->irqres[i],
4873 		    INTR_MPSAFE | INTR_TYPE_CAM, NULL, arcmsr_intr_handler,
4874 		    acb, &acb->ih[i])) {
4875 			printf("arcmsr: Cannot set up MSI-X interrupt handler\n");
4876 			goto irq_alloc_failed;
4877 		}
4878 	}
4879 	printf("arcmsr: MSI-X INT enabled\n");
4880 	acb->acb_flags |= ACB_F_MSIX_ENABLED;
4881 	return TRUE;
4882 
4883 irq_alloc_failed:
4884 	arcmsr_teardown_intr(acb->pci_dev, acb);
4885 	return FALSE;
4886 }
4887 
4888 /*
4889 ************************************************************************
4890 ************************************************************************
4891 */
4892 static int arcmsr_attach(device_t dev)
4893 {
4894 	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
4895 	u_int32_t unit=device_get_unit(dev);
4896 	struct ccb_setasync csa;
4897 	struct cam_devq	*devq;	/* Device Queue to use for this SIM */
4898 	struct resource	*irqres;
4899 
4900 	if(acb == NULL) {
4901 		printf("arcmsr%d: cannot allocate softc\n", unit);
4902 		return (ENOMEM);
4903 	}
4904 	arcmsr_mutex_init(acb);
4905 	acb->pci_dev = dev;
4906 	acb->pci_unit = unit;
4907 	if(arcmsr_initialize(dev)) {
4908 		printf("arcmsr%d: initialize failure!\n", unit);
4909 		goto initialize_failed;
4910 	}
4911 	/* After setting up the adapter, map our interrupt */
4912 	acb->msix_vectors = ARCMSR_NUM_MSIX_VECTORS;
4913 	if (pci_alloc_msix(dev, &acb->msix_vectors) == 0) {
4914 		if (arcmsr_setup_msix(acb) == TRUE)
4915 			goto irqx;
4916 	}
4917 	acb->irq_id[0] = 0;
4918 	irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &acb->irq_id[0], RF_SHAREABLE | RF_ACTIVE);
4919 	if(irqres == NULL ||
4920 		bus_setup_intr(dev, irqres, INTR_TYPE_CAM|INTR_ENTROPY|INTR_MPSAFE, NULL, arcmsr_intr_handler, acb, &acb->ih[0])) {
4921 		printf("arcmsr%d: unable to register interrupt handler!\n", unit);
4922 		goto setup_intr_failed;
4923 	}
4924 	acb->irqres[0] = irqres;
4925 irqx:
4926 	/*
4927 	 * Now let the CAM generic SCSI layer find the SCSI devices on
4928 	 * the bus *  start queue to reset to the idle loop. *
4929 	 * Create device queue of SIM(s) *  (MAX_START_JOB - 1) :
4930 	 * max_sim_transactions
4931 	*/
4932 	devq = cam_simq_alloc(acb->maxOutstanding);
4933 	if(devq == NULL) {
4934 		printf("arcmsr%d: cam_simq_alloc failure!\n", unit);
4935 		goto simq_alloc_failed;
4936 	}
4937 	acb->psim = cam_sim_alloc(arcmsr_action, arcmsr_poll, "arcmsr", acb, unit, &acb->isr_lock, 1, ARCMSR_MAX_OUTSTANDING_CMD, devq);
4938 	if(acb->psim == NULL) {
4939 		printf("arcmsr%d: cam_sim_alloc failure!\n", unit);
4940 		goto sim_alloc_failed;
4941 	}
4942 	ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
4943 	if(xpt_bus_register(acb->psim, dev, 0) != CAM_SUCCESS) {
4944 		printf("arcmsr%d: xpt_bus_register failure!\n", unit);
4945 		goto xpt_bus_failed;
4946 	}
4947 	if(xpt_create_path(&acb->ppath, /* periph */ NULL, cam_sim_path(acb->psim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
4948 		printf("arcmsr%d: xpt_create_path failure!\n", unit);
4949 		goto xpt_path_failed;
4950 	}
4951 	/*
4952 	****************************************************
4953 	*/
4954 	xpt_setup_ccb(&csa.ccb_h, acb->ppath, /*priority*/5);
4955 	csa.ccb_h.func_code = XPT_SASYNC_CB;
4956 	csa.event_enable = AC_FOUND_DEVICE|AC_LOST_DEVICE;
4957 	csa.callback = arcmsr_async;
4958 	csa.callback_arg = acb->psim;
4959 	xpt_action((union ccb *)&csa);
4960 	ARCMSR_LOCK_RELEASE(&acb->isr_lock);
4961 	/* Create the control device.  */
4962 	acb->ioctl_dev = make_dev(&arcmsr_cdevsw, unit, UID_ROOT, GID_WHEEL /* GID_OPERATOR */, S_IRUSR | S_IWUSR, "arcmsr%d", unit);
4963 
4964 	(void)make_dev_alias(acb->ioctl_dev, "arc%d", unit);
4965 	arcmsr_callout_init(&acb->devmap_callout);
4966 	callout_reset(&acb->devmap_callout, 60 * hz, arcmsr_polling_devmap, acb);
4967 	return (0);
4968 xpt_path_failed:
4969 	xpt_bus_deregister(cam_sim_path(acb->psim));
4970 xpt_bus_failed:
4971 	cam_sim_free(acb->psim, /* free_simq */ TRUE);
4972 sim_alloc_failed:
4973 	cam_simq_free(devq);
4974 simq_alloc_failed:
4975 	arcmsr_teardown_intr(dev, acb);
4976 setup_intr_failed:
4977 	arcmsr_free_resource(acb);
4978 initialize_failed:
4979 	arcmsr_mutex_destroy(acb);
4980 	return ENXIO;
4981 }
4982 
4983 /*
4984 ************************************************************************
4985 ************************************************************************
4986 */
4987 static int arcmsr_probe(device_t dev)
4988 {
4989 	u_int32_t id;
4990 	u_int16_t sub_device_id;
4991 	static char buf[256];
4992 	char x_type[]={"unknown"};
4993 	char *type;
4994 	int raid6 = 1;
4995 
4996 	if (pci_get_vendor(dev) != PCI_VENDOR_ID_ARECA) {
4997 		return (ENXIO);
4998 	}
4999 	sub_device_id = pci_read_config(dev, PCIR_SUBDEV_0, 2);
5000 	switch(id = pci_get_devid(dev)) {
5001 	case PCIDevVenIDARC1110:
5002 	case PCIDevVenIDARC1200:
5003 	case PCIDevVenIDARC1201:
5004 	case PCIDevVenIDARC1210:
5005 		raid6 = 0;
5006 		/*FALLTHRU*/
5007 	case PCIDevVenIDARC1120:
5008 	case PCIDevVenIDARC1130:
5009 	case PCIDevVenIDARC1160:
5010 	case PCIDevVenIDARC1170:
5011 	case PCIDevVenIDARC1220:
5012 	case PCIDevVenIDARC1230:
5013 	case PCIDevVenIDARC1231:
5014 	case PCIDevVenIDARC1260:
5015 	case PCIDevVenIDARC1261:
5016 	case PCIDevVenIDARC1270:
5017 	case PCIDevVenIDARC1280:
5018 		type = "SATA 3G";
5019 		break;
5020 	case PCIDevVenIDARC1212:
5021 	case PCIDevVenIDARC1222:
5022 	case PCIDevVenIDARC1380:
5023 	case PCIDevVenIDARC1381:
5024 	case PCIDevVenIDARC1680:
5025 	case PCIDevVenIDARC1681:
5026 		type = "SAS 3G";
5027 		break;
5028 	case PCIDevVenIDARC1880:
5029 	case PCIDevVenIDARC1882:
5030 	case PCIDevVenIDARC1213:
5031 	case PCIDevVenIDARC1223:
5032 		if ((sub_device_id == ARECA_SUB_DEV_ID_1883) ||
5033 		    (sub_device_id == ARECA_SUB_DEV_ID_1216) ||
5034 		    (sub_device_id == ARECA_SUB_DEV_ID_1226))
5035 			type = "SAS 12G";
5036 		else
5037 			type = "SAS 6G";
5038 		break;
5039 	case PCIDevVenIDARC1884:
5040 		type = "SAS 12G";
5041 		break;
5042 	case PCIDevVenIDARC1886_:
5043 	case PCIDevVenIDARC1886:
5044 		type = "NVME,SAS-12G,SATA-6G";
5045 		break;
5046 	case PCIDevVenIDARC1214:
5047 	case PCIDevVenIDARC1203:
5048 		type = "SATA 6G";
5049 		break;
5050 	default:
5051 		type = x_type;
5052 		raid6 = 0;
5053 		break;
5054 	}
5055 	if(type == x_type)
5056 		return(ENXIO);
5057 	sprintf(buf, "Areca %s Host Adapter RAID Controller %s\n%s\n",
5058 		type, raid6 ? "(RAID6 capable)" : "", ARCMSR_DRIVER_VERSION);
5059 	device_set_desc_copy(dev, buf);
5060 	return (BUS_PROBE_DEFAULT);
5061 }
5062 /*
5063 ************************************************************************
5064 ************************************************************************
5065 */
5066 static int arcmsr_shutdown(device_t dev)
5067 {
5068 	u_int32_t  i;
5069 	u_int32_t intmask_org;
5070 	struct CommandControlBlock *srb;
5071 	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
5072 
5073 	/* stop adapter background rebuild */
5074 	ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
5075 	/* disable all outbound interrupt */
5076 	intmask_org = arcmsr_disable_allintr(acb);
5077 	arcmsr_stop_adapter_bgrb(acb);
5078 	arcmsr_flush_adapter_cache(acb);
5079 	/* abort all outstanding command */
5080 	acb->acb_flags |= ACB_F_SCSISTOPADAPTER;
5081 	acb->acb_flags &= ~ACB_F_IOP_INITED;
5082 	if(acb->srboutstandingcount != 0) {
5083 		/*clear and abort all outbound posted Q*/
5084 		arcmsr_done4abort_postqueue(acb);
5085 		/* talk to iop 331 outstanding command aborted*/
5086 		arcmsr_abort_allcmd(acb);
5087 		for(i=0; i < ARCMSR_MAX_FREESRB_NUM; i++) {
5088 			srb = acb->psrb_pool[i];
5089 			if(srb->srb_state == ARCMSR_SRB_START) {
5090 				srb->srb_state = ARCMSR_SRB_ABORTED;
5091 				srb->pccb->ccb_h.status |= CAM_REQ_ABORTED;
5092 				arcmsr_srb_complete(srb, 1);
5093 			}
5094 		}
5095 	}
5096 	acb->srboutstandingcount = 0;
5097 	acb->workingsrb_doneindex = 0;
5098 	acb->workingsrb_startindex = 0;
5099 	acb->pktRequestCount = 0;
5100 	acb->pktReturnCount = 0;
5101 	ARCMSR_LOCK_RELEASE(&acb->isr_lock);
5102 	return (0);
5103 }
5104 /*
5105 ************************************************************************
5106 ************************************************************************
5107 */
5108 static void arcmsr_teardown_intr(device_t dev, struct AdapterControlBlock *acb)
5109 {
5110 	int i;
5111 
5112 	if (acb->acb_flags & ACB_F_MSIX_ENABLED) {
5113 		for (i = 0; i < acb->msix_vectors; i++) {
5114 			if (acb->ih[i])
5115 				bus_teardown_intr(dev, acb->irqres[i], acb->ih[i]);
5116 			if (acb->irqres[i] != NULL)
5117 				bus_release_resource(dev, SYS_RES_IRQ,
5118 				    acb->irq_id[i], acb->irqres[i]);
5119 
5120 			acb->ih[i] = NULL;
5121 		}
5122 		pci_release_msi(dev);
5123 	} else {
5124 		if (acb->ih[0])
5125 			bus_teardown_intr(dev, acb->irqres[0], acb->ih[0]);
5126 		if (acb->irqres[0] != NULL)
5127 			bus_release_resource(dev, SYS_RES_IRQ,
5128 			    acb->irq_id[0], acb->irqres[0]);
5129 		acb->ih[0] = NULL;
5130 	}
5131 
5132 }
5133 /*
5134 ************************************************************************
5135 ************************************************************************
5136 */
5137 static int arcmsr_detach(device_t dev)
5138 {
5139 	struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
5140 	int i;
5141 
5142 	callout_stop(&acb->devmap_callout);
5143 	arcmsr_teardown_intr(dev, acb);
5144 	arcmsr_shutdown(dev);
5145 	arcmsr_free_resource(acb);
5146 	for(i=0; (acb->sys_res_arcmsr[i]!=NULL) && (i<2); i++) {
5147 		bus_release_resource(dev, SYS_RES_MEMORY, acb->rid[i], acb->sys_res_arcmsr[i]);
5148 	}
5149 	ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
5150 	xpt_async(AC_LOST_DEVICE, acb->ppath, NULL);
5151 	xpt_free_path(acb->ppath);
5152 	xpt_bus_deregister(cam_sim_path(acb->psim));
5153 	cam_sim_free(acb->psim, TRUE);
5154 	ARCMSR_LOCK_RELEASE(&acb->isr_lock);
5155 	arcmsr_mutex_destroy(acb);
5156 	return (0);
5157 }
5158 
5159 #ifdef ARCMSR_DEBUG1
5160 static void arcmsr_dump_data(struct AdapterControlBlock *acb)
5161 {
5162 	if((acb->pktRequestCount - acb->pktReturnCount) == 0)
5163 		return;
5164 	printf("Command Request Count   =0x%x\n",acb->pktRequestCount);
5165 	printf("Command Return Count    =0x%x\n",acb->pktReturnCount);
5166 	printf("Command (Req-Rtn) Count =0x%x\n",(acb->pktRequestCount - acb->pktReturnCount));
5167 	printf("Queued Command Count    =0x%x\n",acb->srboutstandingcount);
5168 }
5169 #endif
5170