Lines Matching refs:acb

156 static struct CommandControlBlock *arcmsr_get_freesrb(struct AdapterControlBlock *acb);
161 static u_int32_t arcmsr_iop_ioctlcmd(struct AdapterControlBlock *acb, u_int32_t ioctl_cmd, caddr_t arg);
162 static void arcmsr_iop_parking(struct AdapterControlBlock *acb);
164 static void arcmsr_interrupt(struct AdapterControlBlock *acb);
165 static void arcmsr_polling_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb);
166 static void arcmsr_free_resource(struct AdapterControlBlock *acb);
167 static void arcmsr_bus_reset(struct AdapterControlBlock *acb);
168 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb);
169 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb);
170 static void arcmsr_iop_init(struct AdapterControlBlock *acb);
171 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb);
172 static u_int32_t arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb, struct QBUFFER *prbuffer);
173 static void arcmsr_Write_data_2iop_wqbuffer(struct AdapterControlBlock *acb);
174 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb);
176 static void arcmsr_iop_reset(struct AdapterControlBlock *acb);
179 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb *pccb);
185 static void arcmsr_hbd_postqueue_isr(struct AdapterControlBlock *acb);
187 static void arcmsr_dump_data(struct AdapterControlBlock *acb);
281 struct AdapterControlBlock *acb = dev->si_drv1;
284 struct AdapterControlBlock *acb = devclass_get_softc(arcmsr_devclass, unit);
286 if(acb == NULL) {
306 struct AdapterControlBlock *acb = dev->si_drv1;
309 struct AdapterControlBlock *acb = devclass_get_softc(arcmsr_devclass, unit);
311 if(acb == NULL) {
331 struct AdapterControlBlock *acb = dev->si_drv1;
334 struct AdapterControlBlock *acb = devclass_get_softc(arcmsr_devclass, unit);
337 if(acb == NULL) {
340 return (arcmsr_iop_ioctlcmd(acb, ioctl_cmd, arg));
346 static u_int32_t arcmsr_disable_allintr( struct AdapterControlBlock *acb)
350 switch (acb->adapter_type) {
383 static void arcmsr_enable_allintr( struct AdapterControlBlock *acb, u_int32_t intmask_org)
387 switch (acb->adapter_type) {
392 acb->outbound_int_enable = ~(intmask_org & mask) & 0x000000ff;
399 acb->outbound_int_enable = (intmask_org | mask) & 0x0000000f;
406 acb->outbound_int_enable = ~(intmask_org & mask) & 0x0000000f;
414 acb->outbound_int_enable = mask;
423 static u_int8_t arcmsr_hba_wait_msgint_ready(struct AdapterControlBlock *acb)
443 static u_int8_t arcmsr_hbb_wait_msgint_ready(struct AdapterControlBlock *acb)
464 static u_int8_t arcmsr_hbc_wait_msgint_ready(struct AdapterControlBlock *acb)
484 static u_int8_t arcmsr_hbd_wait_msgint_ready(struct AdapterControlBlock *acb)
504 static void arcmsr_flush_hba_cache(struct AdapterControlBlock *acb)
510 if(arcmsr_hba_wait_msgint_ready(acb)) {
521 static void arcmsr_flush_hbb_cache(struct AdapterControlBlock *acb)
528 if(arcmsr_hbb_wait_msgint_ready(acb)) {
539 static void arcmsr_flush_hbc_cache(struct AdapterControlBlock *acb)
546 if(arcmsr_hbc_wait_msgint_ready(acb)) {
557 static void arcmsr_flush_hbd_cache(struct AdapterControlBlock *acb)
563 if(arcmsr_hbd_wait_msgint_ready(acb)) {
574 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb)
576 switch (acb->adapter_type) {
578 arcmsr_flush_hba_cache(acb);
582 arcmsr_flush_hbb_cache(acb);
586 arcmsr_flush_hbc_cache(acb);
590 arcmsr_flush_hbd_cache(acb);
601 struct AdapterControlBlock *acb = device_get_softc(dev);
604 arcmsr_iop_parking(acb);
606 arcmsr_disable_allintr(acb);
615 struct AdapterControlBlock *acb = device_get_softc(dev);
617 arcmsr_iop_init(acb);
626 struct AdapterControlBlock *acb;
631 acb =(struct AdapterControlBlock *) cam_sim_softc(sim);
639 // printf("%s:scsi id=%d lun=%d device lost \n", device_get_name(acb->pci_dev), target_id, target_lun);
667 static void arcmsr_abort_hba_allcmd(struct AdapterControlBlock *acb)
670 if(!arcmsr_hba_wait_msgint_ready(acb)) {
671 printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
678 static void arcmsr_abort_hbb_allcmd(struct AdapterControlBlock *acb)
681 if(!arcmsr_hbb_wait_msgint_ready(acb)) {
682 printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
689 static void arcmsr_abort_hbc_allcmd(struct AdapterControlBlock *acb)
693 if(!arcmsr_hbc_wait_msgint_ready(acb)) {
694 printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
701 static void arcmsr_abort_hbd_allcmd(struct AdapterControlBlock *acb)
704 if(!arcmsr_hbd_wait_msgint_ready(acb)) {
705 printf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit);
712 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb)
714 switch (acb->adapter_type) {
716 arcmsr_abort_hba_allcmd(acb);
720 arcmsr_abort_hbb_allcmd(acb);
724 arcmsr_abort_hbc_allcmd(acb);
728 arcmsr_abort_hbd_allcmd(acb);
739 struct AdapterControlBlock *acb = srb->acb;
752 bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
753 bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap);
756 atomic_subtract_int(&acb->srboutstandingcount, 1);
757 if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) && (
758 acb->srboutstandingcount < (acb->maxOutstanding -10))) {
759 acb->acb_flags &= ~ACB_F_CAM_DEV_QFRZN;
765 acb->pktReturnCount++;
772 static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, struct CommandControlBlock *srb, u_int16_t error)
779 if(acb->devstate[target][lun] == ARECA_RAID_GONE) {
780 acb->devstate[target][lun] = ARECA_RAID_GOOD;
787 if(acb->devstate[target][lun] == ARECA_RAID_GOOD) {
788 printf( "arcmsr%d: Target=%x, Lun=%x, selection timeout, raid volume was lost\n", acb->pci_unit, target, lun);
790 acb->devstate[target][lun] = ARECA_RAID_GONE;
797 acb->devstate[target][lun] = ARECA_RAID_GONE;
803 acb->devstate[target][lun] = ARECA_RAID_GOOD;
810 , acb->pci_unit, target, lun ,srb->arcmsr_cdb.DeviceStatus);
811 acb->devstate[target][lun] = ARECA_RAID_GONE;
823 static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb, u_int16_t error)
828 switch (acb->adapter_type) {
831 srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0)); /*frame must be 32 bytes aligned*/
836 srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
839 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
842 printf("arcmsr%d: srb='%p' return srb has been timeouted\n", acb->pci_unit, srb);
847 acb->pci_unit, srb, srb->srb_state, acb->srboutstandingcount);
850 arcmsr_report_srb_state(acb, srb, error);
859 struct AdapterControlBlock *acb;
865 acb = srb->acb;
866 ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
874 acb->pci_unit, target, lun, cmd, srb);
876 ARCMSR_LOCK_RELEASE(&acb->isr_lock);
878 arcmsr_dump_data(acb);
886 static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb)
892 switch (acb->adapter_type) {
897 outbound_intstatus = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
901 arcmsr_drain_donequeue(acb, flag_srb, error);
906 struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu;
914 arcmsr_drain_donequeue(acb, flag_srb, error);
927 arcmsr_drain_donequeue(acb, flag_srb, error);
932 arcmsr_hbd_postqueue_isr(acb);
941 static void arcmsr_iop_reset(struct AdapterControlBlock *acb)
947 if(acb->srboutstandingcount>0) {
949 intmask_org = arcmsr_disable_allintr(acb);
951 arcmsr_done4abort_postqueue(acb);
953 arcmsr_abort_allcmd(acb);
955 srb = acb->psrb_pool[i];
961 , acb->pci_unit, srb->pccb->ccb_h.target_id
966 arcmsr_enable_allintr(acb, intmask_org);
968 acb->srboutstandingcount = 0;
969 acb->workingsrb_doneindex = 0;
970 acb->workingsrb_startindex = 0;
971 acb->pktRequestCount = 0;
972 acb->pktReturnCount = 0;
996 struct AdapterControlBlock *acb = srb->acb;
1007 bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op);
1065 static void arcmsr_post_srb(struct AdapterControlBlock *acb, struct CommandControlBlock *srb)
1070 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, (srb->srb_flags & SRB_FLAG_WRITE) ? BUS_DMASYNC_POSTWRITE:BUS_DMASYNC_POSTREAD);
1071 atomic_add_int(&acb->srboutstandingcount, 1);
1074 switch (acb->adapter_type) {
1084 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1106 cdb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
1119 struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
1124 ARCMSR_LOCK_ACQUIRE(&acb->postDone_lock);
1143 ARCMSR_LOCK_RELEASE(&acb->postDone_lock);
1152 static struct QBUFFER *arcmsr_get_iop_rqbuffer( struct AdapterControlBlock *acb)
1156 switch (acb->adapter_type) {
1158 struct HBA_MessageUnit *phbamu = (struct HBA_MessageUnit *)acb->pmu;
1164 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1170 struct HBC_MessageUnit *phbcmu = (struct HBC_MessageUnit *)acb->pmu;
1176 struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
1188 static struct QBUFFER *arcmsr_get_iop_wqbuffer( struct AdapterControlBlock *acb)
1192 switch (acb->adapter_type) {
1194 struct HBA_MessageUnit *phbamu = (struct HBA_MessageUnit *)acb->pmu;
1200 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1206 struct HBC_MessageUnit *phbcmu = (struct HBC_MessageUnit *)acb->pmu;
1212 struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
1224 static void arcmsr_iop_message_read(struct AdapterControlBlock *acb)
1226 switch (acb->adapter_type) {
1253 static void arcmsr_iop_message_wrote(struct AdapterControlBlock *acb)
1255 switch (acb->adapter_type) {
1294 static void arcmsr_stop_hba_bgrb(struct AdapterControlBlock *acb)
1296 acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1299 if(!arcmsr_hba_wait_msgint_ready(acb)) {
1301 , acb->pci_unit);
1308 static void arcmsr_stop_hbb_bgrb(struct AdapterControlBlock *acb)
1310 acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1313 if(!arcmsr_hbb_wait_msgint_ready(acb)) {
1315 , acb->pci_unit);
1322 static void arcmsr_stop_hbc_bgrb(struct AdapterControlBlock *acb)
1324 acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1327 if(!arcmsr_hbc_wait_msgint_ready(acb)) {
1328 printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit);
1335 static void arcmsr_stop_hbd_bgrb(struct AdapterControlBlock *acb)
1337 acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
1339 if(!arcmsr_hbd_wait_msgint_ready(acb)) {
1340 printf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit);
1347 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb)
1349 switch (acb->adapter_type) {
1351 arcmsr_stop_hba_bgrb(acb);
1355 arcmsr_stop_hbb_bgrb(acb);
1359 arcmsr_stop_hbc_bgrb(acb);
1363 arcmsr_stop_hbd_bgrb(acb);
1374 struct AdapterControlBlock *acb;
1377 acb = (struct AdapterControlBlock *)cam_sim_softc(psim);
1378 mutex = mtx_owned(&acb->isr_lock);
1380 ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
1381 arcmsr_interrupt(acb);
1383 ARCMSR_LOCK_RELEASE(&acb->isr_lock);
1389 static u_int32_t arcmsr_Read_iop_rqbuffer_data_D(struct AdapterControlBlock *acb,
1416 pQbuffer = &acb->rqbuffer[acb->rqbuf_lastindex];
1418 acb->rqbuf_lastindex++;
1420 acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1427 arcmsr_iop_message_read(acb);
1434 static u_int32_t arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb,
1441 if(acb->adapter_type == ACB_ADAPTER_TYPE_D) {
1442 return(arcmsr_Read_iop_rqbuffer_data_D(acb, prbuffer));
1447 pQbuffer = &acb->rqbuffer[acb->rqbuf_lastindex];
1449 acb->rqbuf_lastindex++;
1451 acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
1456 arcmsr_iop_message_read(acb);
1463 static void arcmsr_iop2drv_data_wrote_handle(struct AdapterControlBlock *acb)
1469 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1470 prbuffer = arcmsr_get_iop_rqbuffer(acb);
1471 my_empty_len = (acb->rqbuf_lastindex - acb->rqbuf_firstindex - 1) &
1474 if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
1475 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
1477 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
1479 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1485 static void arcmsr_Write_data_2iop_wqbuffer_D(struct AdapterControlBlock *acb)
1493 if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READ) {
1499 acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ);
1500 pwbuffer = arcmsr_get_iop_wqbuffer(acb);
1502 while((acb->wqbuf_firstindex != acb->wqbuf_lastindex)
1504 pQbuffer = &acb->wqbuffer[acb->wqbuf_firstindex];
1506 acb->wqbuf_firstindex++;
1507 acb->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
1522 arcmsr_iop_message_wrote(acb);
1529 static void arcmsr_Write_data_2iop_wqbuffer(struct AdapterControlBlock *acb)
1536 if(acb->adapter_type == ACB_ADAPTER_TYPE_D) {
1537 arcmsr_Write_data_2iop_wqbuffer_D(acb);
1540 if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READ) {
1541 acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ);
1542 pwbuffer = arcmsr_get_iop_wqbuffer(acb);
1544 while((acb->wqbuf_firstindex != acb->wqbuf_lastindex)
1546 pQbuffer = &acb->wqbuffer[acb->wqbuf_firstindex];
1548 acb->wqbuf_firstindex++;
1549 acb->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
1554 arcmsr_iop_message_wrote(acb);
1561 static void arcmsr_iop2drv_data_read_handle(struct AdapterControlBlock *acb)
1563 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
1564 acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_READ;
1571 if(acb->wqbuf_firstindex != acb->wqbuf_lastindex) {
1572 arcmsr_Write_data_2iop_wqbuffer(acb);
1574 if(acb->wqbuf_firstindex == acb->wqbuf_lastindex) {
1575 acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_CLEARED;
1577 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
1597 static void arcmsr_rescan_lun(struct AdapterControlBlock *acb, int target, int lun)
1604 if (xpt_create_path(&path, NULL, cam_sim_path(acb->psim), target, lun) != CAM_REQ_CMP)
1619 static void arcmsr_abort_dr_ccbs(struct AdapterControlBlock *acb, int target, int lun)
1626 intmask_org = arcmsr_disable_allintr(acb);
1629 srb = acb->psrb_pool[i];
1637 printf("arcmsr%d: abort scsi id %d lun %d srb=%p \n", acb->pci_unit, target, lun, srb);
1642 arcmsr_enable_allintr(acb, intmask_org);
1648 static void arcmsr_dr_handle(struct AdapterControlBlock *acb) {
1654 switch (acb->adapter_type) {
1659 deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap);
1668 deviceMapCurrent[target]=bus_space_read_4(acb->btag[1], acb->bhandle[1], devicemap);
1677 deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap);
1685 deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap);
1691 if(acb->acb_flags & ACB_F_BUS_HANG_ON)
1693 acb->acb_flags &= ~ACB_F_BUS_HANG_ON;
1702 if (*pDevMap != acb->device_map[target])
1706 difference = *pDevMap ^ acb->device_map[target];
1712 if(acb->device_map[target] & bit_check)
1715 arcmsr_abort_dr_ccbs(acb, target, lun);
1716 arcmsr_rescan_lun(acb, target, lun);
1717 acb->devstate[target][lun] = ARECA_RAID_GONE;
1722 arcmsr_rescan_lun(acb, target, lun);
1723 acb->devstate[target][lun] = ARECA_RAID_GOOD;
1727 /* printf("arcmsr_dr_handle: acb->device_map[%x]=0x%x, deviceMapCurrent[%x]=%x\n",target,acb->device_map[target],target,*pDevMap); */
1728 acb->device_map[target] = *pDevMap;
1737 static void arcmsr_hba_message_isr(struct AdapterControlBlock *acb) {
1743 arcmsr_dr_handle( acb );
1749 static void arcmsr_hbb_message_isr(struct AdapterControlBlock *acb) {
1756 arcmsr_dr_handle( acb );
1762 static void arcmsr_hbc_message_isr(struct AdapterControlBlock *acb) {
1768 arcmsr_dr_handle( acb );
1774 static void arcmsr_hbd_message_isr(struct AdapterControlBlock *acb) {
1780 arcmsr_dr_handle( acb );
1786 static void arcmsr_hba_doorbell_isr(struct AdapterControlBlock *acb)
1802 arcmsr_iop2drv_data_wrote_handle(acb);
1805 arcmsr_iop2drv_data_read_handle(acb);
1812 static void arcmsr_hbc_doorbell_isr(struct AdapterControlBlock *acb)
1826 arcmsr_iop2drv_data_wrote_handle(acb);
1829 arcmsr_iop2drv_data_read_handle(acb);
1832 arcmsr_hbc_message_isr(acb); /* messenger of "driver to iop commands" */
1839 static void arcmsr_hbd_doorbell_isr(struct AdapterControlBlock *acb)
1855 arcmsr_iop2drv_data_wrote_handle(acb);
1858 arcmsr_iop2drv_data_read_handle(acb);
1861 arcmsr_hbd_message_isr(acb); /* messenger of "driver to iop commands" */
1872 static void arcmsr_hba_postqueue_isr(struct AdapterControlBlock *acb)
1882 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
1888 arcmsr_drain_donequeue(acb, flag_srb, error);
1895 static void arcmsr_hbb_postqueue_isr(struct AdapterControlBlock *acb)
1897 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
1907 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
1917 arcmsr_drain_donequeue(acb, flag_srb, error);
1924 static void arcmsr_hbc_postqueue_isr(struct AdapterControlBlock *acb)
1934 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1941 arcmsr_drain_donequeue(acb, flag_srb, error);
1978 static void arcmsr_hbd_postqueue_isr(struct AdapterControlBlock *acb)
1980 struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
1993 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap,
2001 arcmsr_drain_donequeue(acb, addressLow, error); /*Check if command done with no error */
2012 static void arcmsr_handle_hba_isr( struct AdapterControlBlock *acb)
2020 outbound_intStatus = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
2028 arcmsr_hba_doorbell_isr(acb);
2032 arcmsr_hba_postqueue_isr(acb);
2035 arcmsr_hba_message_isr(acb);
2042 static void arcmsr_handle_hbb_isr( struct AdapterControlBlock *acb)
2050 outbound_doorbell = CHIP_REG_READ32(HBB_DOORBELL, 0, iop2drv_doorbell) & acb->outbound_int_enable;
2060 arcmsr_iop2drv_data_wrote_handle(acb);
2063 arcmsr_iop2drv_data_read_handle(acb);
2067 arcmsr_hbb_postqueue_isr(acb);
2070 arcmsr_hbb_message_isr(acb);
2077 static void arcmsr_handle_hbc_isr( struct AdapterControlBlock *acb)
2092 arcmsr_hbc_doorbell_isr(acb);
2096 arcmsr_hbc_postqueue_isr(acb);
2103 static void arcmsr_handle_hbd_isr( struct AdapterControlBlock *acb)
2112 host_interrupt_status = CHIP_REG_READ32(HBD_MessageUnit, 0, host_int_status) & acb->outbound_int_enable;
2122 arcmsr_hbd_doorbell_isr(acb);
2126 arcmsr_hbd_postqueue_isr(acb);
2136 static void arcmsr_interrupt(struct AdapterControlBlock *acb)
2138 switch (acb->adapter_type) {
2140 arcmsr_handle_hba_isr(acb);
2143 arcmsr_handle_hbb_isr(acb);
2146 arcmsr_handle_hbc_isr(acb);
2149 arcmsr_handle_hbd_isr(acb);
2153 " unknown adapter type =%d\n", acb->pci_unit, acb->adapter_type);
2163 struct AdapterControlBlock *acb = (struct AdapterControlBlock *)arg;
2165 ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
2166 arcmsr_interrupt(acb);
2167 ARCMSR_LOCK_RELEASE(&acb->isr_lock);
2175 struct AdapterControlBlock *acb = (struct AdapterControlBlock *)arg;
2176 switch (acb->adapter_type) {
2195 if((acb->acb_flags & ACB_F_SCSISTOPADAPTER) == 0)
2197 callout_reset(&acb->devmap_callout, 5 * hz, arcmsr_polling_devmap, acb); /* polling per 5 seconds */
2206 static void arcmsr_iop_parking(struct AdapterControlBlock *acb)
2210 if(acb != NULL) {
2212 if(acb->acb_flags & ACB_F_MSG_START_BGRB) {
2213 intmask_org = arcmsr_disable_allintr(acb);
2214 arcmsr_stop_adapter_bgrb(acb);
2215 arcmsr_flush_adapter_cache(acb);
2216 arcmsr_enable_allintr(acb, intmask_org);
2225 u_int32_t arcmsr_iop_ioctlcmd(struct AdapterControlBlock *acb, u_int32_t ioctl_cmd, caddr_t arg)
2234 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2241 while((acb->rqbuf_firstindex != acb->rqbuf_lastindex)
2244 pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex];
2246 acb->rqbuf_firstindex++;
2247 acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
2252 if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2255 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2256 prbuffer = arcmsr_get_iop_rqbuffer(acb);
2257 if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
2258 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
2272 wqbuf_lastindex = acb->wqbuf_lastindex;
2273 wqbuf_firstindex = acb->wqbuf_firstindex;
2275 arcmsr_Write_data_2iop_wqbuffer(acb);
2283 pQbuffer = &acb->wqbuffer[acb->wqbuf_lastindex];
2285 acb->wqbuf_lastindex++;
2286 acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
2292 if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
2293 acb->acb_flags &= ~ACB_F_MESSAGE_WQBUFFER_CLEARED;
2294 arcmsr_Write_data_2iop_wqbuffer(acb);
2305 u_int8_t *pQbuffer = acb->rqbuffer;
2307 if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2308 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2309 arcmsr_iop_message_read(acb);
2312 acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
2313 acb->rqbuf_firstindex = 0;
2314 acb->rqbuf_lastindex = 0;
2322 u_int8_t *pQbuffer = acb->wqbuffer;
2324 if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2325 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2326 arcmsr_iop_message_read(acb);
2329 acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED|ACB_F_MESSAGE_WQBUFFER_READ);
2330 acb->wqbuf_firstindex = 0;
2331 acb->wqbuf_lastindex = 0;
2340 if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2341 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2342 arcmsr_iop_message_read(acb);
2345 acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED
2348 acb->rqbuf_firstindex = 0;
2349 acb->rqbuf_lastindex = 0;
2350 acb->wqbuf_firstindex = 0;
2351 acb->wqbuf_lastindex = 0;
2352 pQbuffer = acb->rqbuffer;
2354 pQbuffer = acb->wqbuffer;
2371 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2379 arcmsr_iop_parking(acb);
2384 arcmsr_flush_adapter_cache(acb);
2389 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2398 struct AdapterControlBlock *acb;
2400 acb = srb->acb;
2401 ARCMSR_LOCK_ACQUIRE(&acb->srb_lock);
2404 acb->srbworkingQ[acb->workingsrb_doneindex] = srb;
2405 acb->workingsrb_doneindex++;
2406 acb->workingsrb_doneindex %= ARCMSR_MAX_FREESRB_NUM;
2407 ARCMSR_LOCK_RELEASE(&acb->srb_lock);
2413 struct CommandControlBlock *arcmsr_get_freesrb(struct AdapterControlBlock *acb)
2418 ARCMSR_LOCK_ACQUIRE(&acb->srb_lock);
2419 workingsrb_doneindex = acb->workingsrb_doneindex;
2420 workingsrb_startindex = acb->workingsrb_startindex;
2421 srb = acb->srbworkingQ[workingsrb_startindex];
2425 acb->workingsrb_startindex = workingsrb_startindex;
2429 ARCMSR_LOCK_RELEASE(&acb->srb_lock);
2436 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb *pccb)
2464 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2465 while ((acb->rqbuf_firstindex != acb->rqbuf_lastindex)
2467 pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex];
2469 acb->rqbuf_firstindex++;
2470 acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER;
2474 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2477 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2478 prbuffer = arcmsr_get_iop_rqbuffer(acb);
2479 if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
2480 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
2485 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2494 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2495 wqbuf_lastindex = acb->wqbuf_lastindex;
2496 wqbuf_firstindex = acb->wqbuf_firstindex;
2498 arcmsr_Write_data_2iop_wqbuffer(acb);
2516 pQbuffer = &acb->wqbuffer[acb->wqbuf_lastindex];
2518 acb->wqbuf_lastindex++;
2519 acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER;
2523 if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
2524 acb->acb_flags &=
2526 arcmsr_Write_data_2iop_wqbuffer(acb);
2543 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2547 u_int8_t *pQbuffer = acb->rqbuffer;
2549 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2550 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2551 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2552 arcmsr_iop_message_read(acb);
2554 acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
2555 acb->rqbuf_firstindex = 0;
2556 acb->rqbuf_lastindex = 0;
2560 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2564 u_int8_t *pQbuffer = acb->wqbuffer;
2566 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2567 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2568 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2569 arcmsr_iop_message_read(acb);
2571 acb->acb_flags |=
2574 acb->wqbuf_firstindex = 0;
2575 acb->wqbuf_lastindex = 0;
2579 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2585 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
2586 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
2587 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
2588 arcmsr_iop_message_read(acb);
2590 acb->acb_flags |=
2594 acb->rqbuf_firstindex = 0;
2595 acb->rqbuf_lastindex = 0;
2596 acb->wqbuf_firstindex = 0;
2597 acb->wqbuf_lastindex = 0;
2598 pQbuffer = acb->rqbuffer;
2600 pQbuffer = acb->wqbuffer;
2603 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
2619 arcmsr_iop_parking(acb);
2622 arcmsr_flush_adapter_cache(acb);
2637 struct AdapterControlBlock *acb = (struct AdapterControlBlock *)srb->acb;
2644 acb->pktRequestCount++;
2649 , acb->pci_unit, error);
2662 if(acb->acb_flags & ACB_F_BUS_RESET) {
2663 printf("arcmsr%d: bus reset and return busy \n", acb->pci_unit);
2668 if(acb->devstate[target][lun] == ARECA_RAID_GONE) {
2676 , acb->pci_unit, cmd, target, lun);
2684 bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap);
2689 if(acb->srboutstandingcount >= acb->maxOutstanding) {
2690 if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) == 0)
2692 xpt_freeze_simq(acb->psim, 1);
2693 acb->acb_flags |= ACB_F_CAM_DEV_QFRZN;
2702 arcmsr_post_srb(acb, srb);
2717 struct AdapterControlBlock *acb = (struct AdapterControlBlock *) abortccb->ccb_h.arcmsr_ccbacb_ptr;
2721 acb->num_aborts++;
2731 if(acb->srboutstandingcount != 0) {
2733 intmask_org = arcmsr_disable_allintr(acb);
2735 srb = acb->psrb_pool[i];
2741 , acb->pci_unit, abortccb->ccb_h.target_id
2743 arcmsr_polling_srbdone(acb, srb);
2745 arcmsr_enable_allintr(acb, intmask_org);
2751 arcmsr_enable_allintr(acb, intmask_org);
2759 static void arcmsr_bus_reset(struct AdapterControlBlock *acb)
2763 acb->num_resets++;
2764 acb->acb_flags |= ACB_F_BUS_RESET;
2765 while(acb->srboutstandingcount != 0 && retry < 400) {
2766 arcmsr_interrupt(acb);
2770 arcmsr_iop_reset(acb);
2771 acb->acb_flags &= ~ACB_F_BUS_RESET;
2777 static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb,
2808 if (arcmsr_iop_message_xfer(acb, pccb)) {
2825 struct AdapterControlBlock *acb;
2827 acb = (struct AdapterControlBlock *) cam_sim_softc(psim);
2828 if(acb == NULL) {
2841 arcmsr_handle_virtual_command(acb, pccb);
2844 if((srb = arcmsr_get_freesrb(acb)) == NULL) {
2850 pccb->ccb_h.arcmsr_ccbacb_ptr = acb;
2852 error = bus_dmamap_load_ccb(acb->dm_segs_dmat
2857 xpt_freeze_simq(acb->psim, 1);
2885 if(acb->adapter_bus_speed == ACB_BUS_SPEED_6G)
2889 if((acb->vendor_device_id == PCIDevVenIDARC1880) ||
2890 (acb->vendor_device_id == PCIDevVenIDARC1680) ||
2891 (acb->vendor_device_id == PCIDevVenIDARC1214))
2941 arcmsr_bus_reset(acb);
2974 if((acb->vendor_device_id == PCIDevVenIDARC1880) ||
2975 (acb->vendor_device_id == PCIDevVenIDARC1680) ||
2976 (acb->vendor_device_id == PCIDevVenIDARC1214))
2983 if((acb->vendor_device_id == PCIDevVenIDARC1880) ||
2984 (acb->vendor_device_id == PCIDevVenIDARC1214))
2986 else if(acb->vendor_device_id == PCIDevVenIDARC1680)
3077 static void arcmsr_start_hba_bgrb(struct AdapterControlBlock *acb)
3079 acb->acb_flags |= ACB_F_MSG_START_BGRB;
3081 if(!arcmsr_hba_wait_msgint_ready(acb)) {
3082 printf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
3089 static void arcmsr_start_hbb_bgrb(struct AdapterControlBlock *acb)
3091 acb->acb_flags |= ACB_F_MSG_START_BGRB;
3093 if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3094 printf( "arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
3101 static void arcmsr_start_hbc_bgrb(struct AdapterControlBlock *acb)
3103 acb->acb_flags |= ACB_F_MSG_START_BGRB;
3106 if(!arcmsr_hbc_wait_msgint_ready(acb)) {
3107 printf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
3114 static void arcmsr_start_hbd_bgrb(struct AdapterControlBlock *acb)
3116 acb->acb_flags |= ACB_F_MSG_START_BGRB;
3118 if(!arcmsr_hbd_wait_msgint_ready(acb)) {
3119 printf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit);
3126 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb)
3128 switch (acb->adapter_type) {
3130 arcmsr_start_hba_bgrb(acb);
3133 arcmsr_start_hbb_bgrb(acb);
3136 arcmsr_start_hbc_bgrb(acb);
3139 arcmsr_start_hbd_bgrb(acb);
3148 static void arcmsr_polling_hba_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3156 outbound_intstatus=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enable;
3158 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3174 (acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
3177 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3181 , acb->pci_unit
3190 , acb->pci_unit
3191 , srb, acb->srboutstandingcount);
3194 arcmsr_report_srb_state(acb, srb, error);
3202 static void arcmsr_polling_hbb_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3204 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu;
3214 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3234 (acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/
3237 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3241 , acb->pci_unit
3250 , acb->pci_unit
3251 , srb, acb->srboutstandingcount);
3254 arcmsr_report_srb_state(acb, srb, error);
3262 static void arcmsr_polling_hbc_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3270 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3280 if (acb->srboutstandingcount == 0) {
3288 srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0));/*frame must be 32 bytes aligned*/
3292 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3295 , acb->pci_unit, srb->pccb->ccb_h.target_id, srb->pccb->ccb_h.target_lun, srb);
3301 , acb->pci_unit, srb, acb->srboutstandingcount);
3304 arcmsr_report_srb_state(acb, srb, error);
3312 static void arcmsr_polling_hbd_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3314 struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
3322 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3334 if (acb->srboutstandingcount == 0) {
3343 srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0));/*frame must be 32 bytes aligned*/
3348 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) {
3351 , acb->pci_unit, srb->pccb->ccb_h.target_id, srb->pccb->ccb_h.target_lun, srb);
3357 , acb->pci_unit, srb, acb->srboutstandingcount);
3360 arcmsr_report_srb_state(acb, srb, error);
3367 static void arcmsr_polling_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *poll_srb)
3369 switch (acb->adapter_type) {
3371 arcmsr_polling_hba_srbdone(acb, poll_srb);
3375 arcmsr_polling_hbb_srbdone(acb, poll_srb);
3379 arcmsr_polling_hbc_srbdone(acb, poll_srb);
3383 arcmsr_polling_hbd_srbdone(acb, poll_srb);
3392 static void arcmsr_get_hba_config(struct AdapterControlBlock *acb)
3394 char *acb_firm_model = acb->firm_model;
3395 char *acb_firm_version = acb->firm_version;
3396 char *acb_device_map = acb->device_map;
3403 if(!arcmsr_hba_wait_msgint_ready(acb)) {
3404 printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3408 *acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3415 *acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3422 *acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3426 printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3427 acb->firm_request_len = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[1]); /*firm_request_len, 1, 04-07*/
3428 acb->firm_numbers_queue = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
3429 acb->firm_sdram_size = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
3430 acb->firm_ide_channels = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
3431 acb->firm_cfg_version = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
3432 if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
3433 acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
3435 acb->maxOutstanding = acb->firm_numbers_queue - 1;
3441 static void arcmsr_get_hbb_config(struct AdapterControlBlock *acb)
3443 char *acb_firm_model = acb->firm_model;
3444 char *acb_firm_version = acb->firm_version;
3445 char *acb_device_map = acb->device_map;
3452 if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3453 printf( "arcmsr%d: wait" "'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3457 *acb_firm_model = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_firm_model+i);
3464 *acb_firm_version = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_firm_version+i);
3471 *acb_device_map = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_device_map+i);
3475 printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3476 acb->firm_request_len = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[1]); /*firm_request_len, 1, 04-07*/
3477 acb->firm_numbers_queue = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
3478 acb->firm_sdram_size = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
3479 acb->firm_ide_channels = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
3480 acb->firm_cfg_version = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
3481 if(acb->firm_numbers_queue > ARCMSR_MAX_HBB_POSTQUEUE)
3482 acb->maxOutstanding = ARCMSR_MAX_HBB_POSTQUEUE - 1;
3484 acb->maxOutstanding = acb->firm_numbers_queue - 1;
3490 static void arcmsr_get_hbc_config(struct AdapterControlBlock *acb)
3492 char *acb_firm_model = acb->firm_model;
3493 char *acb_firm_version = acb->firm_version;
3494 char *acb_device_map = acb->device_map;
3502 if(!arcmsr_hbc_wait_msgint_ready(acb)) {
3503 printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3507 *acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3514 *acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3521 *acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3525 printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3526 acb->firm_request_len = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[1]); /*firm_request_len, 1, 04-07*/
3527 acb->firm_numbers_queue = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_numbers_queue, 2, 08-11*/
3528 acb->firm_sdram_size = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_sdram_size, 3, 12-15*/
3529 acb->firm_ide_channels = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_ide_channels, 4, 16-19*/
3530 acb->firm_cfg_version = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
3531 if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD)
3532 acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1;
3534 acb->maxOutstanding = acb->firm_numbers_queue - 1;
3540 static void arcmsr_get_hbd_config(struct AdapterControlBlock *acb)
3542 char *acb_firm_model = acb->firm_model;
3543 char *acb_firm_version = acb->firm_version;
3544 char *acb_device_map = acb->device_map;
3553 if(!arcmsr_hbd_wait_msgint_ready(acb)) {
3554 printf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit);
3558 *acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i);
3565 *acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i);
3572 *acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i);
3576 printf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_version);
3577 acb->firm_request_len = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_request_len, 1, 04-07*/
3578 acb->firm_numbers_queue = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_numbers_queue, 2, 08-11*/
3579 acb->firm_sdram_size = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_sdram_size, 3, 12-15*/
3580 acb->firm_ide_channels = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[5]); /*firm_ide_channels, 4, 16-19*/
3581 acb->firm_cfg_version = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]); /*firm_cfg_version, 25, */
3582 if(acb->firm_numbers_queue > ARCMSR_MAX_HBD_POSTQUEUE)
3583 acb->maxOutstanding = ARCMSR_MAX_HBD_POSTQUEUE - 1;
3585 acb->maxOutstanding = acb->firm_numbers_queue - 1;
3591 static void arcmsr_get_firmware_spec(struct AdapterControlBlock *acb)
3593 switch (acb->adapter_type) {
3595 arcmsr_get_hba_config(acb);
3599 arcmsr_get_hbb_config(acb);
3603 arcmsr_get_hbc_config(acb);
3607 arcmsr_get_hbd_config(acb);
3616 static void arcmsr_wait_firmware_ready( struct AdapterControlBlock *acb)
3620 switch (acb->adapter_type) {
3626 printf( "arcmsr%d:timed out waiting for firmware \n", acb->pci_unit);
3638 printf( "arcmsr%d: timed out waiting for firmware \n", acb->pci_unit);
3651 printf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit);
3663 printf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit);
3676 static void arcmsr_clear_doorbell_queue_buffer( struct AdapterControlBlock *acb)
3680 switch (acb->adapter_type) {
3718 static u_int32_t arcmsr_iop_confirm(struct AdapterControlBlock *acb)
3730 srb_phyaddr = (unsigned long) acb->srb_phyaddr.phyaddr;
3731 srb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high;
3732 srb_phyaddr_lo32 = acb->srb_phyaddr.B.phyadd_low;
3733 switch (acb->adapter_type) {
3739 if(!arcmsr_hba_wait_msgint_ready(acb)) {
3740 printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
3755 phbbmu = (struct HBB_MessageUnit *)acb->pmu;
3759 if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3760 printf( "arcmsr%d: 'set window of post command Q' timeout\n", acb->pci_unit);
3771 if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3772 printf( "arcmsr%d: 'set command Q window' timeout \n", acb->pci_unit);
3776 if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3777 printf( "arcmsr%d: 'start diver mode' timeout \n", acb->pci_unit);
3788 if(!arcmsr_hbc_wait_msgint_ready(acb)) {
3789 printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
3799 phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
3812 if(!arcmsr_hbd_wait_msgint_ready(acb)) {
3813 printf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit);
3825 static void arcmsr_enable_eoi_mode(struct AdapterControlBlock *acb)
3827 switch (acb->adapter_type)
3835 if(!arcmsr_hbb_wait_msgint_ready(acb)) {
3836 printf( "arcmsr%d: 'iop enable eoi mode' timeout \n", acb->pci_unit);
3847 static void arcmsr_iop_init(struct AdapterControlBlock *acb)
3852 intmask_org = arcmsr_disable_allintr(acb);
3853 arcmsr_wait_firmware_ready(acb);
3854 arcmsr_iop_confirm(acb);
3855 arcmsr_get_firmware_spec(acb);
3857 arcmsr_start_adapter_bgrb(acb);
3859 arcmsr_clear_doorbell_queue_buffer(acb);
3860 arcmsr_enable_eoi_mode(acb);
3862 arcmsr_enable_allintr(acb, intmask_org);
3863 acb->acb_flags |= ACB_F_IOP_INITED;
3871 struct AdapterControlBlock *acb = arg;
3876 acb->srb_phyaddr.phyaddr = srb_phyaddr;
3877 srb_tmp = (struct CommandControlBlock *)acb->uncacheptr;
3879 if(bus_dmamap_create(acb->dm_segs_dmat,
3881 acb->acb_flags |= ACB_F_MAPFREESRB_FAILD;
3883 " srb dmamap bus_dmamap_create error\n", acb->pci_unit);
3886 if((acb->adapter_type == ACB_ADAPTER_TYPE_C) || (acb->adapter_type == ACB_ADAPTER_TYPE_D))
3893 srb_tmp->acb = acb;
3894 acb->srbworkingQ[i] = acb->psrb_pool[i] = srb_tmp;
3898 acb->vir2phy_offset = (unsigned long)srb_tmp - (unsigned long)srb_phyaddr;
3904 static void arcmsr_free_resource(struct AdapterControlBlock *acb)
3907 if(acb->ioctl_dev != NULL) {
3908 destroy_dev(acb->ioctl_dev);
3910 bus_dmamap_unload(acb->srb_dmat, acb->srb_dmamap);
3911 bus_dmamap_destroy(acb->srb_dmat, acb->srb_dmamap);
3912 bus_dma_tag_destroy(acb->srb_dmat);
3913 bus_dma_tag_destroy(acb->dm_segs_dmat);
3914 bus_dma_tag_destroy(acb->parent_dmat);
3920 static void arcmsr_mutex_init(struct AdapterControlBlock *acb)
3922 ARCMSR_LOCK_INIT(&acb->isr_lock, "arcmsr isr lock");
3923 ARCMSR_LOCK_INIT(&acb->srb_lock, "arcmsr srb lock");
3924 ARCMSR_LOCK_INIT(&acb->postDone_lock, "arcmsr postQ lock");
3925 ARCMSR_LOCK_INIT(&acb->qbuffer_lock, "arcmsr RW buffer lock");
3931 static void arcmsr_mutex_destroy(struct AdapterControlBlock *acb)
3933 ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock);
3934 ARCMSR_LOCK_DESTROY(&acb->postDone_lock);
3935 ARCMSR_LOCK_DESTROY(&acb->srb_lock);
3936 ARCMSR_LOCK_DESTROY(&acb->isr_lock);
3944 struct AdapterControlBlock *acb = device_get_softc(dev);
3950 acb->vendor_device_id = vendor_dev_id;
3956 acb->adapter_type = ACB_ADAPTER_TYPE_C;
3957 acb->adapter_bus_speed = ACB_BUS_SPEED_6G;
3962 acb->adapter_type = ACB_ADAPTER_TYPE_D;
3963 acb->adapter_bus_speed = ACB_BUS_SPEED_6G;
3969 acb->adapter_type = ACB_ADAPTER_TYPE_B;
3970 acb->adapter_bus_speed = ACB_BUS_SPEED_3G;
3993 acb->adapter_type = ACB_ADAPTER_TYPE_A;
3994 acb->adapter_bus_speed = ACB_BUS_SPEED_3G;
4023 &acb->parent_dmat) != 0)
4030 if(bus_dma_tag_create( /*parent_dmat*/ acb->parent_dmat,
4047 /*lockarg*/ &acb->isr_lock,
4049 &acb->dm_segs_dmat) != 0)
4051 bus_dma_tag_destroy(acb->parent_dmat);
4057 if(bus_dma_tag_create( /*parent_dmat*/ acb->parent_dmat,
4072 &acb->srb_dmat) != 0)
4074 bus_dma_tag_destroy(acb->dm_segs_dmat);
4075 bus_dma_tag_destroy(acb->parent_dmat);
4080 if(bus_dmamem_alloc(acb->srb_dmat, (void **)&acb->uncacheptr, BUS_DMA_WAITOK | BUS_DMA_COHERENT | BUS_DMA_ZERO, &acb->srb_dmamap) != 0) {
4081 bus_dma_tag_destroy(acb->srb_dmat);
4082 bus_dma_tag_destroy(acb->dm_segs_dmat);
4083 bus_dma_tag_destroy(acb->parent_dmat);
4088 if(bus_dmamap_load(acb->srb_dmat, acb->srb_dmamap, acb->uncacheptr, max_coherent_size, arcmsr_map_free_srb, acb, /*flags*/0)) {
4089 bus_dma_tag_destroy(acb->srb_dmat);
4090 bus_dma_tag_destroy(acb->dm_segs_dmat);
4091 bus_dma_tag_destroy(acb->parent_dmat);
4101 switch(acb->adapter_type) {
4106 acb->sys_res_arcmsr[0] = bus_alloc_resource(dev,SYS_RES_MEMORY, &rid0, 0ul, ~0ul, 0x1000, RF_ACTIVE);
4107 if(acb->sys_res_arcmsr[0] == NULL) {
4108 arcmsr_free_resource(acb);
4112 if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4113 arcmsr_free_resource(acb);
4117 mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4119 arcmsr_free_resource(acb);
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 *)mem_base0;
4135 acb->sys_res_arcmsr[i] = bus_alloc_resource(dev,SYS_RES_MEMORY, &rid[i],
4138 acb->sys_res_arcmsr[i] = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid[i],
4141 if(acb->sys_res_arcmsr[i] == NULL) {
4142 arcmsr_free_resource(acb);
4146 if(rman_get_start(acb->sys_res_arcmsr[i]) <= 0) {
4147 arcmsr_free_resource(acb);
4151 mem_base[i] = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[i]);
4153 arcmsr_free_resource(acb);
4157 acb->btag[i] = rman_get_bustag(acb->sys_res_arcmsr[i]);
4158 acb->bhandle[i] = rman_get_bushandle(acb->sys_res_arcmsr[i]);
4160 freesrb = (struct CommandControlBlock *)acb->uncacheptr;
4161 acb->pmu = (struct MessageUnit_UNION *)((unsigned long)freesrb+ARCMSR_SRBS_POOL_SIZE);
4162 phbbmu = (struct HBB_MessageUnit *)acb->pmu;
4171 acb->sys_res_arcmsr[0] = bus_alloc_resource(dev,SYS_RES_MEMORY, &rid0, 0ul, ~0ul, sizeof(struct HBC_MessageUnit), RF_ACTIVE);
4172 if(acb->sys_res_arcmsr[0] == NULL) {
4173 arcmsr_free_resource(acb);
4177 if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4178 arcmsr_free_resource(acb);
4182 mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4184 arcmsr_free_resource(acb);
4188 acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4189 acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4190 acb->pmu = (struct MessageUnit_UNION *)mem_base0;
4198 acb->sys_res_arcmsr[0] = bus_alloc_resource(dev,SYS_RES_MEMORY, &rid0, 0ul, ~0ul, sizeof(struct HBD_MessageUnit), RF_ACTIVE);
4199 if(acb->sys_res_arcmsr[0] == NULL) {
4200 arcmsr_free_resource(acb);
4204 if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) {
4205 arcmsr_free_resource(acb);
4209 mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]);
4211 arcmsr_free_resource(acb);
4215 acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]);
4216 acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]);
4217 acb->pmu = (struct MessageUnit_UNION *)((unsigned long)acb->uncacheptr+ARCMSR_SRBS_POOL_SIZE);
4218 phbdmu = (struct HBD_MessageUnit0 *)acb->pmu;
4223 if(acb->acb_flags & ACB_F_MAPFREESRB_FAILD) {
4224 arcmsr_free_resource(acb);
4228 acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED|ACB_F_MESSAGE_RQBUFFER_CLEARED|ACB_F_MESSAGE_WQBUFFER_READ);
4229 acb->acb_flags &= ~ACB_F_SCSISTOPADAPTER;
4237 acb->devstate[i][j] = ARECA_RAID_GONE;
4240 arcmsr_iop_init(acb);
4249 struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
4256 if(acb == NULL) {
4260 arcmsr_mutex_init(acb);
4261 acb->pci_dev = dev;
4262 acb->pci_unit = unit;
4265 arcmsr_mutex_destroy(acb);
4273 bus_setup_intr(dev, irqres, INTR_TYPE_CAM|INTR_ENTROPY|INTR_MPSAFE, NULL, arcmsr_intr_handler, acb, &acb->ih)) {
4275 bus_setup_intr(dev, irqres, INTR_TYPE_CAM|INTR_ENTROPY|INTR_MPSAFE, arcmsr_intr_handler, acb, &acb->ih)) {
4277 arcmsr_free_resource(acb);
4278 arcmsr_mutex_destroy(acb);
4282 acb->irqres = irqres;
4291 arcmsr_free_resource(acb);
4292 bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
4293 arcmsr_mutex_destroy(acb);
4298 acb->psim = cam_sim_alloc(arcmsr_action, arcmsr_poll, "arcmsr", acb, unit, &acb->isr_lock, 1, ARCMSR_MAX_OUTSTANDING_CMD, devq);
4300 acb->psim = cam_sim_alloc(arcmsr_action, arcmsr_poll, "arcmsr", acb, unit, 1, ARCMSR_MAX_OUTSTANDING_CMD, devq);
4302 if(acb->psim == NULL) {
4303 arcmsr_free_resource(acb);
4304 bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
4306 arcmsr_mutex_destroy(acb);
4310 ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
4312 if(xpt_bus_register(acb->psim, dev, 0) != CAM_SUCCESS) {
4314 if(xpt_bus_register(acb->psim, 0) != CAM_SUCCESS) {
4316 arcmsr_free_resource(acb);
4317 bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
4318 cam_sim_free(acb->psim, /*free_devq*/TRUE);
4319 arcmsr_mutex_destroy(acb);
4323 if(xpt_create_path(&acb->ppath, /* periph */ NULL, cam_sim_path(acb->psim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
4324 arcmsr_free_resource(acb);
4325 bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
4326 xpt_bus_deregister(cam_sim_path(acb->psim));
4327 cam_sim_free(acb->psim, /* free_simq */ TRUE);
4328 arcmsr_mutex_destroy(acb);
4335 xpt_setup_ccb(&csa.ccb_h, acb->ppath, /*priority*/5);
4339 csa.callback_arg = acb->psim;
4341 ARCMSR_LOCK_RELEASE(&acb->isr_lock);
4343 acb->ioctl_dev = make_dev(&arcmsr_cdevsw, unit, UID_ROOT, GID_WHEEL /* GID_OPERATOR */, S_IRUSR | S_IWUSR, "arcmsr%d", unit);
4346 acb->ioctl_dev->si_drv1 = acb;
4349 (void)make_dev_alias(acb->ioctl_dev, "arc%d", unit);
4351 arcmsr_callout_init(&acb->devmap_callout);
4352 callout_reset(&acb->devmap_callout, 60 * hz, arcmsr_polling_devmap, acb);
4429 struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
4432 ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
4434 intmask_org = arcmsr_disable_allintr(acb);
4435 arcmsr_stop_adapter_bgrb(acb);
4436 arcmsr_flush_adapter_cache(acb);
4438 acb->acb_flags |= ACB_F_SCSISTOPADAPTER;
4439 acb->acb_flags &= ~ACB_F_IOP_INITED;
4440 if(acb->srboutstandingcount != 0) {
4442 arcmsr_done4abort_postqueue(acb);
4444 arcmsr_abort_allcmd(acb);
4446 srb = acb->psrb_pool[i];
4454 acb->srboutstandingcount = 0;
4455 acb->workingsrb_doneindex = 0;
4456 acb->workingsrb_startindex = 0;
4457 acb->pktRequestCount = 0;
4458 acb->pktReturnCount = 0;
4459 ARCMSR_LOCK_RELEASE(&acb->isr_lock);
4468 struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev);
4471 callout_stop(&acb->devmap_callout);
4472 bus_teardown_intr(dev, acb->irqres, acb->ih);
4474 arcmsr_free_resource(acb);
4475 for(i=0; (acb->sys_res_arcmsr[i]!=NULL) && (i<2); i++) {
4476 bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BAR(i), acb->sys_res_arcmsr[i]);
4478 bus_release_resource(dev, SYS_RES_IRQ, 0, acb->irqres);
4479 ARCMSR_LOCK_ACQUIRE(&acb->isr_lock);
4480 xpt_async(AC_LOST_DEVICE, acb->ppath, NULL);
4481 xpt_free_path(acb->ppath);
4482 xpt_bus_deregister(cam_sim_path(acb->psim));
4483 cam_sim_free(acb->psim, TRUE);
4484 ARCMSR_LOCK_RELEASE(&acb->isr_lock);
4485 arcmsr_mutex_destroy(acb);
4490 static void arcmsr_dump_data(struct AdapterControlBlock *acb)
4492 if((acb->pktRequestCount - acb->pktReturnCount) == 0)
4494 printf("Command Request Count =0x%x\n",acb->pktRequestCount);
4495 printf("Command Return Count =0x%x\n",acb->pktReturnCount);
4496 printf("Command (Req-Rtn) Count =0x%x\n",(acb->pktRequestCount - acb->pktReturnCount));
4497 printf("Queued Command Count =0x%x\n",acb->srboutstandingcount);