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