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