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