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