Lines Matching refs:acb
136 static struct CommandControlBlock *arcmsr_get_freesrb(struct AdapterControlBlock *acb);
141 static u_int32_t arcmsr_iop_ioctlcmd(struct AdapterControlBlock *acb, u_int32_t ioctl_cmd, caddr_t …
142 static void arcmsr_iop_parking(struct AdapterControlBlock *acb);
144 static void arcmsr_interrupt(struct AdapterControlBlock *acb);
145 static void arcmsr_polling_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *pol…
146 static void arcmsr_free_resource(struct AdapterControlBlock *acb);
147 static void arcmsr_bus_reset(struct AdapterControlBlock *acb);
148 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb);
149 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb);
150 static void arcmsr_iop_init(struct AdapterControlBlock *acb);
151 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb);
152 static u_int32_t arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb, struct QBUFFER *prb…
153 static void arcmsr_Write_data_2iop_wqbuffer(struct AdapterControlBlock *acb);
154 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb);
156 static void arcmsr_iop_reset(struct AdapterControlBlock *acb);
159 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb *pccb);
165 static void arcmsr_hbd_postqueue_isr(struct AdapterControlBlock *acb);
166 static void arcmsr_hbe_postqueue_isr(struct AdapterControlBlock *acb);
167 static void arcmsr_teardown_intr(device_t dev, struct AdapterControlBlock *acb);
169 static void arcmsr_dump_data(struct AdapterControlBlock *acb);
232 struct AdapterControlBlock *acb = dev->si_drv1; in arcmsr_open() local
234 if(acb == NULL) { in arcmsr_open()
247 struct AdapterControlBlock *acb = dev->si_drv1; in arcmsr_close() local
249 if(acb == NULL) { in arcmsr_close()
264 struct AdapterControlBlock *acb = dev->si_drv1; in arcmsr_ioctl() local
266 if(acb == NULL) { in arcmsr_ioctl()
269 return (arcmsr_iop_ioctlcmd(acb, ioctl_cmd, arg)); in arcmsr_ioctl()
275 static u_int32_t arcmsr_disable_allintr( struct AdapterControlBlock *acb) in arcmsr_disable_allintr() argument
279 switch (acb->adapter_type) { in arcmsr_disable_allintr()
287 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_disable_allintr()
319 static void arcmsr_enable_allintr( struct AdapterControlBlock *acb, u_int32_t intmask_org) in arcmsr_enable_allintr() argument
323 switch (acb->adapter_type) { in arcmsr_enable_allintr()
328 acb->outbound_int_enable = ~(intmask_org & mask) & 0x000000ff; in arcmsr_enable_allintr()
332 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_enable_allintr()
336 acb->outbound_int_enable = (intmask_org | mask) & 0x0000000f; in arcmsr_enable_allintr()
343 acb->outbound_int_enable = ~(intmask_org & mask) & 0x0000000f; in arcmsr_enable_allintr()
351 acb->outbound_int_enable = mask; in arcmsr_enable_allintr()
358 acb->outbound_int_enable = ~(intmask_org & mask) & 0x0000000f; in arcmsr_enable_allintr()
367 static u_int8_t arcmsr_hba_wait_msgint_ready(struct AdapterControlBlock *acb) in arcmsr_hba_wait_msgint_ready() argument
387 static u_int8_t arcmsr_hbb_wait_msgint_ready(struct AdapterControlBlock *acb) in arcmsr_hbb_wait_msgint_ready() argument
391 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_hbb_wait_msgint_ready()
409 static u_int8_t arcmsr_hbc_wait_msgint_ready(struct AdapterControlBlock *acb) in arcmsr_hbc_wait_msgint_ready() argument
429 static u_int8_t arcmsr_hbd_wait_msgint_ready(struct AdapterControlBlock *acb) in arcmsr_hbd_wait_msgint_ready() argument
449 static u_int8_t arcmsr_hbe_wait_msgint_ready(struct AdapterControlBlock *acb) in arcmsr_hbe_wait_msgint_ready() argument
457 … if((read_doorbell ^ acb->in_doorbell) & ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE) { in arcmsr_hbe_wait_msgint_ready()
459 acb->in_doorbell = read_doorbell; in arcmsr_hbe_wait_msgint_ready()
471 static void arcmsr_flush_hba_cache(struct AdapterControlBlock *acb) in arcmsr_flush_hba_cache() argument
477 if(arcmsr_hba_wait_msgint_ready(acb)) { in arcmsr_flush_hba_cache()
488 static void arcmsr_flush_hbb_cache(struct AdapterControlBlock *acb) in arcmsr_flush_hbb_cache() argument
491 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_flush_hbb_cache()
495 if(arcmsr_hbb_wait_msgint_ready(acb)) { in arcmsr_flush_hbb_cache()
506 static void arcmsr_flush_hbc_cache(struct AdapterControlBlock *acb) in arcmsr_flush_hbc_cache() argument
513 if(arcmsr_hbc_wait_msgint_ready(acb)) { in arcmsr_flush_hbc_cache()
524 static void arcmsr_flush_hbd_cache(struct AdapterControlBlock *acb) in arcmsr_flush_hbd_cache() argument
530 if(arcmsr_hbd_wait_msgint_ready(acb)) { in arcmsr_flush_hbd_cache()
541 static void arcmsr_flush_hbe_cache(struct AdapterControlBlock *acb) in arcmsr_flush_hbe_cache() argument
546 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_flush_hbe_cache()
547 CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell); in arcmsr_flush_hbe_cache()
549 if(arcmsr_hbe_wait_msgint_ready(acb)) { in arcmsr_flush_hbe_cache()
560 static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb) in arcmsr_flush_adapter_cache() argument
562 switch (acb->adapter_type) { in arcmsr_flush_adapter_cache()
564 arcmsr_flush_hba_cache(acb); in arcmsr_flush_adapter_cache()
568 arcmsr_flush_hbb_cache(acb); in arcmsr_flush_adapter_cache()
572 arcmsr_flush_hbc_cache(acb); in arcmsr_flush_adapter_cache()
576 arcmsr_flush_hbd_cache(acb); in arcmsr_flush_adapter_cache()
580 arcmsr_flush_hbe_cache(acb); in arcmsr_flush_adapter_cache()
591 struct AdapterControlBlock *acb = device_get_softc(dev); in arcmsr_suspend() local
594 arcmsr_iop_parking(acb); in arcmsr_suspend()
596 arcmsr_disable_allintr(acb); in arcmsr_suspend()
605 struct AdapterControlBlock *acb = device_get_softc(dev); in arcmsr_resume() local
607 arcmsr_iop_init(acb); in arcmsr_resume()
632 static void arcmsr_abort_hba_allcmd(struct AdapterControlBlock *acb) in arcmsr_abort_hba_allcmd() argument
635 if(!arcmsr_hba_wait_msgint_ready(acb)) { in arcmsr_abort_hba_allcmd()
636 … kprintf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit); in arcmsr_abort_hba_allcmd()
643 static void arcmsr_abort_hbb_allcmd(struct AdapterControlBlock *acb) in arcmsr_abort_hbb_allcmd() argument
645 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_abort_hbb_allcmd()
647 if(!arcmsr_hbb_wait_msgint_ready(acb)) { in arcmsr_abort_hbb_allcmd()
648 … kprintf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit); in arcmsr_abort_hbb_allcmd()
655 static void arcmsr_abort_hbc_allcmd(struct AdapterControlBlock *acb) in arcmsr_abort_hbc_allcmd() argument
659 if(!arcmsr_hbc_wait_msgint_ready(acb)) { in arcmsr_abort_hbc_allcmd()
660 … kprintf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit); in arcmsr_abort_hbc_allcmd()
667 static void arcmsr_abort_hbd_allcmd(struct AdapterControlBlock *acb) in arcmsr_abort_hbd_allcmd() argument
670 if(!arcmsr_hbd_wait_msgint_ready(acb)) { in arcmsr_abort_hbd_allcmd()
671 … kprintf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit); in arcmsr_abort_hbd_allcmd()
678 static void arcmsr_abort_hbe_allcmd(struct AdapterControlBlock *acb) in arcmsr_abort_hbe_allcmd() argument
681 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_abort_hbe_allcmd()
682 CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell); in arcmsr_abort_hbe_allcmd()
683 if(!arcmsr_hbe_wait_msgint_ready(acb)) { in arcmsr_abort_hbe_allcmd()
684 … kprintf("arcmsr%d: wait 'abort all outstanding command' timeout \n", acb->pci_unit); in arcmsr_abort_hbe_allcmd()
691 static void arcmsr_abort_allcmd(struct AdapterControlBlock *acb) in arcmsr_abort_allcmd() argument
693 switch (acb->adapter_type) { in arcmsr_abort_allcmd()
695 arcmsr_abort_hba_allcmd(acb); in arcmsr_abort_allcmd()
699 arcmsr_abort_hbb_allcmd(acb); in arcmsr_abort_allcmd()
703 arcmsr_abort_hbc_allcmd(acb); in arcmsr_abort_allcmd()
707 arcmsr_abort_hbd_allcmd(acb); in arcmsr_abort_allcmd()
711 arcmsr_abort_hbe_allcmd(acb); in arcmsr_abort_allcmd()
722 struct AdapterControlBlock *acb = srb->acb; in arcmsr_srb_complete() local
735 bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op); in arcmsr_srb_complete()
736 ARCMSR_LOCK_ACQUIRE(&acb->io_lock); in arcmsr_srb_complete()
737 bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap); in arcmsr_srb_complete()
738 ARCMSR_LOCK_RELEASE(&acb->io_lock); in arcmsr_srb_complete()
741 atomic_subtract_int(&acb->srboutstandingcount, 1); in arcmsr_srb_complete()
742 if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) && ( in arcmsr_srb_complete()
743 acb->srboutstandingcount < (acb->maxOutstanding -10))) { in arcmsr_srb_complete()
744 acb->acb_flags &= ~ACB_F_CAM_DEV_QFRZN; in arcmsr_srb_complete()
750 acb->pktReturnCount++; in arcmsr_srb_complete()
751 ARCMSR_LOCK_ACQUIRE(&acb->sim_lock); in arcmsr_srb_complete()
753 ARCMSR_LOCK_RELEASE(&acb->sim_lock); in arcmsr_srb_complete()
759 static void arcmsr_report_srb_state(struct AdapterControlBlock *acb, struct CommandControlBlock *sr… in arcmsr_report_srb_state() argument
766 if(acb->devstate[target][lun] == ARECA_RAID_GONE) { in arcmsr_report_srb_state()
767 acb->devstate[target][lun] = ARECA_RAID_GOOD; in arcmsr_report_srb_state()
774 if(acb->devstate[target][lun] == ARECA_RAID_GOOD) { in arcmsr_report_srb_state()
775 … "arcmsr%d: Target=%x, Lun=%x, selection timeout, raid volume was lost\n", acb->pci_unit, target, … in arcmsr_report_srb_state()
777 acb->devstate[target][lun] = ARECA_RAID_GONE; in arcmsr_report_srb_state()
784 acb->devstate[target][lun] = ARECA_RAID_GONE; in arcmsr_report_srb_state()
790 acb->devstate[target][lun] = ARECA_RAID_GOOD; in arcmsr_report_srb_state()
797 … , acb->pci_unit, target, lun ,srb->arcmsr_cdb.DeviceStatus); in arcmsr_report_srb_state()
798 acb->devstate[target][lun] = ARECA_RAID_GONE; in arcmsr_report_srb_state()
810 static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, u_int32_t flag_srb, u_int16_t e… in arcmsr_drain_donequeue() argument
815 switch (acb->adapter_type) { in arcmsr_drain_donequeue()
818 …srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0)); /*frame must be… in arcmsr_drain_donequeue()
821 srb = acb->psrb_pool[flag_srb]; in arcmsr_drain_donequeue()
826 …srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes… in arcmsr_drain_donequeue()
829 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) { in arcmsr_drain_donequeue()
832 … kprintf("arcmsr%d: srb='%p' return srb has been timeouted\n", acb->pci_unit, srb); in arcmsr_drain_donequeue()
837 acb->pci_unit, srb, srb->srb_state, acb->srboutstandingcount); in arcmsr_drain_donequeue()
840 arcmsr_report_srb_state(acb, srb, error); in arcmsr_drain_donequeue()
849 struct AdapterControlBlock *acb; in arcmsr_srb_timeout() local
855 acb = srb->acb; in arcmsr_srb_timeout()
863 acb->pci_unit, target, lun, cmd, srb); in arcmsr_srb_timeout()
866 arcmsr_dump_data(acb); in arcmsr_srb_timeout()
874 static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb) in arcmsr_done4abort_postqueue() argument
880 switch (acb->adapter_type) { in arcmsr_done4abort_postqueue()
885 …ound_intstatus = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_enabl… in arcmsr_done4abort_postqueue()
889 arcmsr_drain_donequeue(acb, flag_srb, error); in arcmsr_done4abort_postqueue()
894 struct HBB_MessageUnit *phbbmu=(struct HBB_MessageUnit *)acb->pmu; in arcmsr_done4abort_postqueue()
902 arcmsr_drain_donequeue(acb, flag_srb, error); in arcmsr_done4abort_postqueue()
915 arcmsr_drain_donequeue(acb, flag_srb, error); in arcmsr_done4abort_postqueue()
920 arcmsr_hbd_postqueue_isr(acb); in arcmsr_done4abort_postqueue()
924 arcmsr_hbe_postqueue_isr(acb); in arcmsr_done4abort_postqueue()
933 static void arcmsr_iop_reset(struct AdapterControlBlock *acb) in arcmsr_iop_reset() argument
939 if(acb->srboutstandingcount>0) { in arcmsr_iop_reset()
941 intmask_org = arcmsr_disable_allintr(acb); in arcmsr_iop_reset()
943 arcmsr_done4abort_postqueue(acb); in arcmsr_iop_reset()
945 arcmsr_abort_allcmd(acb); in arcmsr_iop_reset()
947 srb = acb->psrb_pool[i]; in arcmsr_iop_reset()
953 … , acb->pci_unit, srb->pccb->ccb_h.target_id in arcmsr_iop_reset()
958 arcmsr_enable_allintr(acb, intmask_org); in arcmsr_iop_reset()
960 acb->srboutstandingcount = 0; in arcmsr_iop_reset()
961 acb->workingsrb_doneindex = 0; in arcmsr_iop_reset()
962 acb->workingsrb_startindex = 0; in arcmsr_iop_reset()
963 acb->pktRequestCount = 0; in arcmsr_iop_reset()
964 acb->pktReturnCount = 0; in arcmsr_iop_reset()
988 struct AdapterControlBlock *acb = srb->acb; in arcmsr_build_srb() local
999 bus_dmamap_sync(acb->dm_segs_dmat, srb->dm_segs_dmamap, op); in arcmsr_build_srb()
1057 static void arcmsr_post_srb(struct AdapterControlBlock *acb, struct CommandControlBlock *srb) in arcmsr_post_srb() argument
1062 …bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, (srb->srb_flags & SRB_FLAG_WRITE) ? BUS_DMASYNC_PO… in arcmsr_post_srb()
1063 atomic_add_int(&acb->srboutstandingcount, 1); in arcmsr_post_srb()
1066 switch (acb->adapter_type) { in arcmsr_post_srb()
1076 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_post_srb()
1098 cdb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high; in arcmsr_post_srb()
1111 struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu; in arcmsr_post_srb()
1116 ARCMSR_LOCK_ACQUIRE(&acb->postDone_lock); in arcmsr_post_srb()
1135 ARCMSR_LOCK_RELEASE(&acb->postDone_lock); in arcmsr_post_srb()
1153 static struct QBUFFER *arcmsr_get_iop_rqbuffer( struct AdapterControlBlock *acb) in arcmsr_get_iop_rqbuffer() argument
1157 switch (acb->adapter_type) { in arcmsr_get_iop_rqbuffer()
1159 struct HBA_MessageUnit *phbamu = (struct HBA_MessageUnit *)acb->pmu; in arcmsr_get_iop_rqbuffer()
1165 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_get_iop_rqbuffer()
1171 struct HBC_MessageUnit *phbcmu = (struct HBC_MessageUnit *)acb->pmu; in arcmsr_get_iop_rqbuffer()
1177 struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu; in arcmsr_get_iop_rqbuffer()
1183 struct HBE_MessageUnit *phbcmu = (struct HBE_MessageUnit *)acb->pmu; in arcmsr_get_iop_rqbuffer()
1195 static struct QBUFFER *arcmsr_get_iop_wqbuffer( struct AdapterControlBlock *acb) in arcmsr_get_iop_wqbuffer() argument
1199 switch (acb->adapter_type) { in arcmsr_get_iop_wqbuffer()
1201 struct HBA_MessageUnit *phbamu = (struct HBA_MessageUnit *)acb->pmu; in arcmsr_get_iop_wqbuffer()
1207 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_get_iop_wqbuffer()
1213 struct HBC_MessageUnit *phbcmu = (struct HBC_MessageUnit *)acb->pmu; in arcmsr_get_iop_wqbuffer()
1219 struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu; in arcmsr_get_iop_wqbuffer()
1225 struct HBE_MessageUnit *phbcmu = (struct HBE_MessageUnit *)acb->pmu; in arcmsr_get_iop_wqbuffer()
1237 static void arcmsr_iop_message_read(struct AdapterControlBlock *acb) in arcmsr_iop_message_read() argument
1239 switch (acb->adapter_type) { in arcmsr_iop_message_read()
1246 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_iop_message_read()
1263 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK; in arcmsr_iop_message_read()
1264 … CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell); in arcmsr_iop_message_read()
1273 static void arcmsr_iop_message_wrote(struct AdapterControlBlock *acb) in arcmsr_iop_message_wrote() argument
1275 switch (acb->adapter_type) { in arcmsr_iop_message_wrote()
1285 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_iop_message_wrote()
1314 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_WRITE_OK; in arcmsr_iop_message_wrote()
1315 … CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell); in arcmsr_iop_message_wrote()
1324 static void arcmsr_stop_hba_bgrb(struct AdapterControlBlock *acb) in arcmsr_stop_hba_bgrb() argument
1326 acb->acb_flags &= ~ACB_F_MSG_START_BGRB; in arcmsr_stop_hba_bgrb()
1329 if(!arcmsr_hba_wait_msgint_ready(acb)) { in arcmsr_stop_hba_bgrb()
1331 , acb->pci_unit); in arcmsr_stop_hba_bgrb()
1338 static void arcmsr_stop_hbb_bgrb(struct AdapterControlBlock *acb) in arcmsr_stop_hbb_bgrb() argument
1340 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_stop_hbb_bgrb()
1341 acb->acb_flags &= ~ACB_F_MSG_START_BGRB; in arcmsr_stop_hbb_bgrb()
1343 if(!arcmsr_hbb_wait_msgint_ready(acb)) { in arcmsr_stop_hbb_bgrb()
1345 , acb->pci_unit); in arcmsr_stop_hbb_bgrb()
1352 static void arcmsr_stop_hbc_bgrb(struct AdapterControlBlock *acb) in arcmsr_stop_hbc_bgrb() argument
1354 acb->acb_flags &= ~ACB_F_MSG_START_BGRB; in arcmsr_stop_hbc_bgrb()
1357 if(!arcmsr_hbc_wait_msgint_ready(acb)) { in arcmsr_stop_hbc_bgrb()
1358 … kprintf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit); in arcmsr_stop_hbc_bgrb()
1365 static void arcmsr_stop_hbd_bgrb(struct AdapterControlBlock *acb) in arcmsr_stop_hbd_bgrb() argument
1367 acb->acb_flags &= ~ACB_F_MSG_START_BGRB; in arcmsr_stop_hbd_bgrb()
1369 if(!arcmsr_hbd_wait_msgint_ready(acb)) { in arcmsr_stop_hbd_bgrb()
1370 … kprintf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit); in arcmsr_stop_hbd_bgrb()
1377 static void arcmsr_stop_hbe_bgrb(struct AdapterControlBlock *acb) in arcmsr_stop_hbe_bgrb() argument
1379 acb->acb_flags &= ~ACB_F_MSG_START_BGRB; in arcmsr_stop_hbe_bgrb()
1381 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_stop_hbe_bgrb()
1382 CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell); in arcmsr_stop_hbe_bgrb()
1383 if(!arcmsr_hbe_wait_msgint_ready(acb)) { in arcmsr_stop_hbe_bgrb()
1384 … kprintf("arcmsr%d: wait 'stop adapter background rebulid' timeout \n", acb->pci_unit); in arcmsr_stop_hbe_bgrb()
1391 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb) in arcmsr_stop_adapter_bgrb() argument
1393 switch (acb->adapter_type) { in arcmsr_stop_adapter_bgrb()
1395 arcmsr_stop_hba_bgrb(acb); in arcmsr_stop_adapter_bgrb()
1399 arcmsr_stop_hbb_bgrb(acb); in arcmsr_stop_adapter_bgrb()
1403 arcmsr_stop_hbc_bgrb(acb); in arcmsr_stop_adapter_bgrb()
1407 arcmsr_stop_hbd_bgrb(acb); in arcmsr_stop_adapter_bgrb()
1411 arcmsr_stop_hbe_bgrb(acb); in arcmsr_stop_adapter_bgrb()
1422 struct AdapterControlBlock *acb; in arcmsr_poll() local
1425 acb = (struct AdapterControlBlock *)cam_sim_softc(psim); in arcmsr_poll()
1426 mutex = lockstatus(&acb->isr_lock, curthread); in arcmsr_poll()
1428 ARCMSR_LOCK_ACQUIRE(&acb->isr_lock); in arcmsr_poll()
1429 arcmsr_interrupt(acb); in arcmsr_poll()
1431 ARCMSR_LOCK_RELEASE(&acb->isr_lock); in arcmsr_poll()
1437 static u_int32_t arcmsr_Read_iop_rqbuffer_data_D(struct AdapterControlBlock *acb, in arcmsr_Read_iop_rqbuffer_data_D() argument
1464 pQbuffer = &acb->rqbuffer[acb->rqbuf_lastindex]; in arcmsr_Read_iop_rqbuffer_data_D()
1466 acb->rqbuf_lastindex++; in arcmsr_Read_iop_rqbuffer_data_D()
1468 acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER; in arcmsr_Read_iop_rqbuffer_data_D()
1475 arcmsr_iop_message_read(acb); in arcmsr_Read_iop_rqbuffer_data_D()
1482 static u_int32_t arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb, in arcmsr_Read_iop_rqbuffer_data() argument
1489 if(acb->adapter_type >= ACB_ADAPTER_TYPE_B) { in arcmsr_Read_iop_rqbuffer_data()
1490 return(arcmsr_Read_iop_rqbuffer_data_D(acb, prbuffer)); in arcmsr_Read_iop_rqbuffer_data()
1495 pQbuffer = &acb->rqbuffer[acb->rqbuf_lastindex]; in arcmsr_Read_iop_rqbuffer_data()
1497 acb->rqbuf_lastindex++; in arcmsr_Read_iop_rqbuffer_data()
1499 acb->rqbuf_lastindex %= ARCMSR_MAX_QBUFFER; in arcmsr_Read_iop_rqbuffer_data()
1504 arcmsr_iop_message_read(acb); in arcmsr_Read_iop_rqbuffer_data()
1511 static void arcmsr_iop2drv_data_wrote_handle(struct AdapterControlBlock *acb) in arcmsr_iop2drv_data_wrote_handle() argument
1517 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); in arcmsr_iop2drv_data_wrote_handle()
1518 prbuffer = arcmsr_get_iop_rqbuffer(acb); in arcmsr_iop2drv_data_wrote_handle()
1519 my_empty_len = (acb->rqbuf_lastindex - acb->rqbuf_firstindex - 1) & in arcmsr_iop2drv_data_wrote_handle()
1522 if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0) in arcmsr_iop2drv_data_wrote_handle()
1523 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop2drv_data_wrote_handle()
1525 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop2drv_data_wrote_handle()
1527 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); in arcmsr_iop2drv_data_wrote_handle()
1533 static void arcmsr_Write_data_2iop_wqbuffer_D(struct AdapterControlBlock *acb) in arcmsr_Write_data_2iop_wqbuffer_D() argument
1541 if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READ) { in arcmsr_Write_data_2iop_wqbuffer_D()
1547 acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ); in arcmsr_Write_data_2iop_wqbuffer_D()
1548 pwbuffer = arcmsr_get_iop_wqbuffer(acb); in arcmsr_Write_data_2iop_wqbuffer_D()
1550 while((acb->wqbuf_firstindex != acb->wqbuf_lastindex) in arcmsr_Write_data_2iop_wqbuffer_D()
1552 pQbuffer = &acb->wqbuffer[acb->wqbuf_firstindex]; in arcmsr_Write_data_2iop_wqbuffer_D()
1554 acb->wqbuf_firstindex++; in arcmsr_Write_data_2iop_wqbuffer_D()
1555 acb->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER; in arcmsr_Write_data_2iop_wqbuffer_D()
1570 arcmsr_iop_message_wrote(acb); in arcmsr_Write_data_2iop_wqbuffer_D()
1577 static void arcmsr_Write_data_2iop_wqbuffer(struct AdapterControlBlock *acb) in arcmsr_Write_data_2iop_wqbuffer() argument
1584 if(acb->adapter_type >= ACB_ADAPTER_TYPE_B) { in arcmsr_Write_data_2iop_wqbuffer()
1585 arcmsr_Write_data_2iop_wqbuffer_D(acb); in arcmsr_Write_data_2iop_wqbuffer()
1588 if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READ) { in arcmsr_Write_data_2iop_wqbuffer()
1589 acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READ); in arcmsr_Write_data_2iop_wqbuffer()
1590 pwbuffer = arcmsr_get_iop_wqbuffer(acb); in arcmsr_Write_data_2iop_wqbuffer()
1592 while((acb->wqbuf_firstindex != acb->wqbuf_lastindex) in arcmsr_Write_data_2iop_wqbuffer()
1594 pQbuffer = &acb->wqbuffer[acb->wqbuf_firstindex]; in arcmsr_Write_data_2iop_wqbuffer()
1596 acb->wqbuf_firstindex++; in arcmsr_Write_data_2iop_wqbuffer()
1597 acb->wqbuf_firstindex %= ARCMSR_MAX_QBUFFER; in arcmsr_Write_data_2iop_wqbuffer()
1602 arcmsr_iop_message_wrote(acb); in arcmsr_Write_data_2iop_wqbuffer()
1609 static void arcmsr_iop2drv_data_read_handle(struct AdapterControlBlock *acb) in arcmsr_iop2drv_data_read_handle() argument
1611 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); in arcmsr_iop2drv_data_read_handle()
1612 acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_READ; in arcmsr_iop2drv_data_read_handle()
1619 if(acb->wqbuf_firstindex != acb->wqbuf_lastindex) { in arcmsr_iop2drv_data_read_handle()
1620 arcmsr_Write_data_2iop_wqbuffer(acb); in arcmsr_iop2drv_data_read_handle()
1622 if(acb->wqbuf_firstindex == acb->wqbuf_lastindex) { in arcmsr_iop2drv_data_read_handle()
1623 acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_CLEARED; in arcmsr_iop2drv_data_read_handle()
1625 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); in arcmsr_iop2drv_data_read_handle()
1645 static void arcmsr_rescan_lun(struct AdapterControlBlock *acb, int target, int lun) in arcmsr_rescan_lun() argument
1652 … if (xpt_create_path(&path, xpt_periph, cam_sim_path(acb->psim), target, lun) != CAM_REQ_CMP) in arcmsr_rescan_lun()
1665 static void arcmsr_abort_dr_ccbs(struct AdapterControlBlock *acb, int target, int lun) in arcmsr_abort_dr_ccbs() argument
1672 intmask_org = arcmsr_disable_allintr(acb); in arcmsr_abort_dr_ccbs()
1675 srb = acb->psrb_pool[i]; in arcmsr_abort_dr_ccbs()
1683 … kprintf("arcmsr%d: abort scsi id %d lun %d srb=%p \n", acb->pci_unit, target, lun, srb); in arcmsr_abort_dr_ccbs()
1688 arcmsr_enable_allintr(acb, intmask_org); in arcmsr_abort_dr_ccbs()
1694 static void arcmsr_dr_handle(struct AdapterControlBlock *acb) { in arcmsr_dr_handle() argument
1700 switch (acb->adapter_type) { in arcmsr_dr_handle()
1705 … deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap); in arcmsr_dr_handle()
1714 … deviceMapCurrent[target]=bus_space_read_4(acb->btag[1], acb->bhandle[1], devicemap); in arcmsr_dr_handle()
1723 … deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap); in arcmsr_dr_handle()
1731 … deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap); in arcmsr_dr_handle()
1739 … deviceMapCurrent[target]=bus_space_read_4(acb->btag[0], acb->bhandle[0], devicemap); in arcmsr_dr_handle()
1745 if(acb->acb_flags & ACB_F_BUS_HANG_ON) in arcmsr_dr_handle()
1747 acb->acb_flags &= ~ACB_F_BUS_HANG_ON; in arcmsr_dr_handle()
1756 if (*pDevMap != acb->device_map[target]) in arcmsr_dr_handle()
1760 difference = *pDevMap ^ acb->device_map[target]; in arcmsr_dr_handle()
1766 if(acb->device_map[target] & bit_check) in arcmsr_dr_handle()
1769 arcmsr_abort_dr_ccbs(acb, target, lun); in arcmsr_dr_handle()
1770 arcmsr_rescan_lun(acb, target, lun); in arcmsr_dr_handle()
1771 … acb->devstate[target][lun] = ARECA_RAID_GONE; in arcmsr_dr_handle()
1776 arcmsr_rescan_lun(acb, target, lun); in arcmsr_dr_handle()
1777 … acb->devstate[target][lun] = ARECA_RAID_GOOD; in arcmsr_dr_handle()
1782 acb->device_map[target] = *pDevMap; in arcmsr_dr_handle()
1791 static void arcmsr_hba_message_isr(struct AdapterControlBlock *acb) { in arcmsr_hba_message_isr() argument
1797 arcmsr_dr_handle( acb ); in arcmsr_hba_message_isr()
1803 static void arcmsr_hbb_message_isr(struct AdapterControlBlock *acb) { in arcmsr_hbb_message_isr() argument
1805 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_hbb_message_isr()
1811 arcmsr_dr_handle( acb ); in arcmsr_hbb_message_isr()
1817 static void arcmsr_hbc_message_isr(struct AdapterControlBlock *acb) { in arcmsr_hbc_message_isr() argument
1823 arcmsr_dr_handle( acb ); in arcmsr_hbc_message_isr()
1829 static void arcmsr_hbd_message_isr(struct AdapterControlBlock *acb) { in arcmsr_hbd_message_isr() argument
1835 arcmsr_dr_handle( acb ); in arcmsr_hbd_message_isr()
1841 static void arcmsr_hbe_message_isr(struct AdapterControlBlock *acb) { in arcmsr_hbe_message_isr() argument
1847 arcmsr_dr_handle( acb ); in arcmsr_hbe_message_isr()
1853 static void arcmsr_hba_doorbell_isr(struct AdapterControlBlock *acb) in arcmsr_hba_doorbell_isr() argument
1867 arcmsr_iop2drv_data_wrote_handle(acb); in arcmsr_hba_doorbell_isr()
1870 arcmsr_iop2drv_data_read_handle(acb); in arcmsr_hba_doorbell_isr()
1877 static void arcmsr_hbc_doorbell_isr(struct AdapterControlBlock *acb) in arcmsr_hbc_doorbell_isr() argument
1891 arcmsr_iop2drv_data_wrote_handle(acb); in arcmsr_hbc_doorbell_isr()
1894 arcmsr_iop2drv_data_read_handle(acb); in arcmsr_hbc_doorbell_isr()
1897 arcmsr_hbc_message_isr(acb); /* messenger of "driver to iop commands" */ in arcmsr_hbc_doorbell_isr()
1904 static void arcmsr_hbd_doorbell_isr(struct AdapterControlBlock *acb) in arcmsr_hbd_doorbell_isr() argument
1920 arcmsr_iop2drv_data_wrote_handle(acb); in arcmsr_hbd_doorbell_isr()
1923 arcmsr_iop2drv_data_read_handle(acb); in arcmsr_hbd_doorbell_isr()
1926 … arcmsr_hbd_message_isr(acb); /* messenger of "driver to iop commands" */ in arcmsr_hbd_doorbell_isr()
1937 static void arcmsr_hbe_doorbell_isr(struct AdapterControlBlock *acb) in arcmsr_hbe_doorbell_isr() argument
1950 doorbell_status = in_doorbell ^ acb->in_doorbell; in arcmsr_hbe_doorbell_isr()
1952 arcmsr_iop2drv_data_wrote_handle(acb); in arcmsr_hbe_doorbell_isr()
1955 arcmsr_iop2drv_data_read_handle(acb); in arcmsr_hbe_doorbell_isr()
1958 arcmsr_hbe_message_isr(acb); /* messenger of "driver to iop commands" */ in arcmsr_hbe_doorbell_isr()
1960 acb->in_doorbell = in_doorbell; in arcmsr_hbe_doorbell_isr()
1966 static void arcmsr_hba_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hba_postqueue_isr() argument
1976 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, in arcmsr_hba_postqueue_isr()
1982 arcmsr_drain_donequeue(acb, flag_srb, error); in arcmsr_hba_postqueue_isr()
1989 static void arcmsr_hbb_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hbb_postqueue_isr() argument
1991 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_hbb_postqueue_isr()
2001 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, in arcmsr_hbb_postqueue_isr()
2011 arcmsr_drain_donequeue(acb, flag_srb, error); in arcmsr_hbb_postqueue_isr()
2018 static void arcmsr_hbc_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hbc_postqueue_isr() argument
2028 … bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); in arcmsr_hbc_postqueue_isr()
2035 arcmsr_drain_donequeue(acb, flag_srb, error); in arcmsr_hbc_postqueue_isr()
2072 static void arcmsr_hbd_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hbd_postqueue_isr() argument
2074 struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu; in arcmsr_hbd_postqueue_isr()
2087 bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, in arcmsr_hbd_postqueue_isr()
2095 … arcmsr_drain_donequeue(acb, addressLow, error); /*Check if command done with no error */ in arcmsr_hbd_postqueue_isr()
2106 static void arcmsr_hbe_postqueue_isr(struct AdapterControlBlock *acb) in arcmsr_hbe_postqueue_isr() argument
2117 … bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); in arcmsr_hbe_postqueue_isr()
2118 doneq_index = acb->doneq_index; in arcmsr_hbe_postqueue_isr()
2120 cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID; in arcmsr_hbe_postqueue_isr()
2121 …error = (acb->pCompletionQ[doneq_index].cmdFlag & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE; in arcmsr_hbe_postqueue_isr()
2122 arcmsr_drain_donequeue(acb, (u_int32_t)cmdSMID, error); in arcmsr_hbe_postqueue_isr()
2124 if (doneq_index >= acb->completionQ_entry) in arcmsr_hbe_postqueue_isr()
2127 acb->doneq_index = doneq_index; in arcmsr_hbe_postqueue_isr()
2134 static void arcmsr_handle_hba_isr( struct AdapterControlBlock *acb) in arcmsr_handle_hba_isr() argument
2142 …outbound_intStatus = CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_e… in arcmsr_handle_hba_isr()
2150 arcmsr_hba_doorbell_isr(acb); in arcmsr_handle_hba_isr()
2154 arcmsr_hba_postqueue_isr(acb); in arcmsr_handle_hba_isr()
2157 arcmsr_hba_message_isr(acb); in arcmsr_handle_hba_isr()
2164 static void arcmsr_handle_hbb_isr( struct AdapterControlBlock *acb) in arcmsr_handle_hbb_isr() argument
2167 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_handle_hbb_isr()
2173 … outbound_doorbell = READ_CHIP_REG32(0, phbbmu->iop2drv_doorbell) & acb->outbound_int_enable; in arcmsr_handle_hbb_isr()
2183 arcmsr_iop2drv_data_wrote_handle(acb); in arcmsr_handle_hbb_isr()
2186 arcmsr_iop2drv_data_read_handle(acb); in arcmsr_handle_hbb_isr()
2190 arcmsr_hbb_postqueue_isr(acb); in arcmsr_handle_hbb_isr()
2193 arcmsr_hbb_message_isr(acb); in arcmsr_handle_hbb_isr()
2200 static void arcmsr_handle_hbc_isr( struct AdapterControlBlock *acb) in arcmsr_handle_hbc_isr() argument
2218 arcmsr_hbc_doorbell_isr(acb); in arcmsr_handle_hbc_isr()
2222 arcmsr_hbc_postqueue_isr(acb); in arcmsr_handle_hbc_isr()
2231 static void arcmsr_handle_hbd_isr( struct AdapterControlBlock *acb) in arcmsr_handle_hbd_isr() argument
2240 …host_interrupt_status = CHIP_REG_READ32(HBD_MessageUnit, 0, host_int_status) & acb->outbound_int_e… in arcmsr_handle_hbd_isr()
2250 arcmsr_hbd_doorbell_isr(acb); in arcmsr_handle_hbd_isr()
2254 arcmsr_hbd_postqueue_isr(acb); in arcmsr_handle_hbd_isr()
2264 static void arcmsr_handle_hbe_isr( struct AdapterControlBlock *acb) in arcmsr_handle_hbe_isr() argument
2282 arcmsr_hbe_doorbell_isr(acb); in arcmsr_handle_hbe_isr()
2286 arcmsr_hbe_postqueue_isr(acb); in arcmsr_handle_hbe_isr()
2295 static void arcmsr_interrupt(struct AdapterControlBlock *acb) in arcmsr_interrupt() argument
2297 switch (acb->adapter_type) { in arcmsr_interrupt()
2299 arcmsr_handle_hba_isr(acb); in arcmsr_interrupt()
2302 arcmsr_handle_hbb_isr(acb); in arcmsr_interrupt()
2305 arcmsr_handle_hbc_isr(acb); in arcmsr_interrupt()
2308 arcmsr_handle_hbd_isr(acb); in arcmsr_interrupt()
2311 arcmsr_handle_hbe_isr(acb); in arcmsr_interrupt()
2315 " unknown adapter type =%d\n", acb->pci_unit, acb->adapter_type); in arcmsr_interrupt()
2325 struct AdapterControlBlock *acb = (struct AdapterControlBlock *)arg; in arcmsr_intr_handler() local
2327 arcmsr_interrupt(acb); in arcmsr_intr_handler()
2335 struct AdapterControlBlock *acb = (struct AdapterControlBlock *)arg; in arcmsr_polling_devmap() local
2336 switch (acb->adapter_type) { in arcmsr_polling_devmap()
2342 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_polling_devmap()
2358 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_polling_devmap()
2359 CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell); in arcmsr_polling_devmap()
2363 if((acb->acb_flags & ACB_F_SCSISTOPADAPTER) == 0) in arcmsr_polling_devmap()
2365 …callout_reset(&acb->devmap_callout, 5 * hz, arcmsr_polling_devmap, acb); /* polling per 5 s… in arcmsr_polling_devmap()
2374 static void arcmsr_iop_parking(struct AdapterControlBlock *acb) in arcmsr_iop_parking() argument
2378 if(acb != NULL) { in arcmsr_iop_parking()
2380 if(acb->acb_flags & ACB_F_MSG_START_BGRB) { in arcmsr_iop_parking()
2381 intmask_org = arcmsr_disable_allintr(acb); in arcmsr_iop_parking()
2382 arcmsr_stop_adapter_bgrb(acb); in arcmsr_iop_parking()
2383 arcmsr_flush_adapter_cache(acb); in arcmsr_iop_parking()
2384 arcmsr_enable_allintr(acb, intmask_org); in arcmsr_iop_parking()
2393 static u_int32_t arcmsr_iop_ioctlcmd(struct AdapterControlBlock *acb, u_int32_t ioctl_cmd, caddr_t … in arcmsr_iop_ioctlcmd() argument
2402 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); in arcmsr_iop_ioctlcmd()
2409 while((acb->rqbuf_firstindex != acb->rqbuf_lastindex) in arcmsr_iop_ioctlcmd()
2412 pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex]; in arcmsr_iop_ioctlcmd()
2414 acb->rqbuf_firstindex++; in arcmsr_iop_ioctlcmd()
2415 acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER; in arcmsr_iop_ioctlcmd()
2420 if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_iop_ioctlcmd()
2423 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_ioctlcmd()
2424 prbuffer = arcmsr_get_iop_rqbuffer(acb); in arcmsr_iop_ioctlcmd()
2425 if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0) in arcmsr_iop_ioctlcmd()
2426 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_ioctlcmd()
2440 wqbuf_lastindex = acb->wqbuf_lastindex; in arcmsr_iop_ioctlcmd()
2441 wqbuf_firstindex = acb->wqbuf_firstindex; in arcmsr_iop_ioctlcmd()
2443 arcmsr_Write_data_2iop_wqbuffer(acb); in arcmsr_iop_ioctlcmd()
2451 … pQbuffer = &acb->wqbuffer[acb->wqbuf_lastindex]; in arcmsr_iop_ioctlcmd()
2453 acb->wqbuf_lastindex++; in arcmsr_iop_ioctlcmd()
2454 … acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER; in arcmsr_iop_ioctlcmd()
2460 … if(acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) { in arcmsr_iop_ioctlcmd()
2461 … acb->acb_flags &= ~ACB_F_MESSAGE_WQBUFFER_CLEARED; in arcmsr_iop_ioctlcmd()
2462 arcmsr_Write_data_2iop_wqbuffer(acb); in arcmsr_iop_ioctlcmd()
2473 u_int8_t *pQbuffer = acb->rqbuffer; in arcmsr_iop_ioctlcmd()
2475 if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_iop_ioctlcmd()
2476 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_ioctlcmd()
2477 arcmsr_iop_message_read(acb); in arcmsr_iop_ioctlcmd()
2480 acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED; in arcmsr_iop_ioctlcmd()
2481 acb->rqbuf_firstindex = 0; in arcmsr_iop_ioctlcmd()
2482 acb->rqbuf_lastindex = 0; in arcmsr_iop_ioctlcmd()
2490 u_int8_t *pQbuffer = acb->wqbuffer; in arcmsr_iop_ioctlcmd()
2492 if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_iop_ioctlcmd()
2493 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_ioctlcmd()
2494 arcmsr_iop_message_read(acb); in arcmsr_iop_ioctlcmd()
2497 … acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED|ACB_F_MESSAGE_WQBUFFER_READ); in arcmsr_iop_ioctlcmd()
2498 acb->wqbuf_firstindex = 0; in arcmsr_iop_ioctlcmd()
2499 acb->wqbuf_lastindex = 0; in arcmsr_iop_ioctlcmd()
2508 if(acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_iop_ioctlcmd()
2509 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_ioctlcmd()
2510 arcmsr_iop_message_read(acb); in arcmsr_iop_ioctlcmd()
2513 acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED in arcmsr_iop_ioctlcmd()
2516 acb->rqbuf_firstindex = 0; in arcmsr_iop_ioctlcmd()
2517 acb->rqbuf_lastindex = 0; in arcmsr_iop_ioctlcmd()
2518 acb->wqbuf_firstindex = 0; in arcmsr_iop_ioctlcmd()
2519 acb->wqbuf_lastindex = 0; in arcmsr_iop_ioctlcmd()
2520 pQbuffer = acb->rqbuffer; in arcmsr_iop_ioctlcmd()
2522 pQbuffer = acb->wqbuffer; in arcmsr_iop_ioctlcmd()
2539 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); in arcmsr_iop_ioctlcmd()
2547 arcmsr_iop_parking(acb); in arcmsr_iop_ioctlcmd()
2552 arcmsr_flush_adapter_cache(acb); in arcmsr_iop_ioctlcmd()
2557 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); in arcmsr_iop_ioctlcmd()
2566 struct AdapterControlBlock *acb; in arcmsr_free_srb() local
2568 acb = srb->acb; in arcmsr_free_srb()
2569 ARCMSR_LOCK_ACQUIRE(&acb->srb_lock); in arcmsr_free_srb()
2572 acb->srbworkingQ[acb->workingsrb_doneindex] = srb; in arcmsr_free_srb()
2573 acb->workingsrb_doneindex++; in arcmsr_free_srb()
2574 acb->workingsrb_doneindex %= ARCMSR_MAX_FREESRB_NUM; in arcmsr_free_srb()
2575 ARCMSR_LOCK_RELEASE(&acb->srb_lock); in arcmsr_free_srb()
2581 static struct CommandControlBlock *arcmsr_get_freesrb(struct AdapterControlBlock *acb) in arcmsr_get_freesrb() argument
2586 ARCMSR_LOCK_ACQUIRE(&acb->srb_lock); in arcmsr_get_freesrb()
2587 workingsrb_doneindex = acb->workingsrb_doneindex; in arcmsr_get_freesrb()
2588 workingsrb_startindex = acb->workingsrb_startindex; in arcmsr_get_freesrb()
2589 srb = acb->srbworkingQ[workingsrb_startindex]; in arcmsr_get_freesrb()
2593 acb->workingsrb_startindex = workingsrb_startindex; in arcmsr_get_freesrb()
2597 ARCMSR_LOCK_RELEASE(&acb->srb_lock); in arcmsr_get_freesrb()
2604 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, union ccb *pccb) in arcmsr_iop_message_xfer() argument
2632 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); in arcmsr_iop_message_xfer()
2633 while ((acb->rqbuf_firstindex != acb->rqbuf_lastindex) in arcmsr_iop_message_xfer()
2635 pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex]; in arcmsr_iop_message_xfer()
2637 acb->rqbuf_firstindex++; in arcmsr_iop_message_xfer()
2638 acb->rqbuf_firstindex %= ARCMSR_MAX_QBUFFER; in arcmsr_iop_message_xfer()
2642 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_iop_message_xfer()
2645 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_message_xfer()
2646 prbuffer = arcmsr_get_iop_rqbuffer(acb); in arcmsr_iop_message_xfer()
2647 if(arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0) in arcmsr_iop_message_xfer()
2648 acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_message_xfer()
2653 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); in arcmsr_iop_message_xfer()
2662 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); in arcmsr_iop_message_xfer()
2663 wqbuf_lastindex = acb->wqbuf_lastindex; in arcmsr_iop_message_xfer()
2664 wqbuf_firstindex = acb->wqbuf_firstindex; in arcmsr_iop_message_xfer()
2666 arcmsr_Write_data_2iop_wqbuffer(acb); in arcmsr_iop_message_xfer()
2684 … pQbuffer = &acb->wqbuffer[acb->wqbuf_lastindex]; in arcmsr_iop_message_xfer()
2686 acb->wqbuf_lastindex++; in arcmsr_iop_message_xfer()
2687 … acb->wqbuf_lastindex %= ARCMSR_MAX_QBUFFER; in arcmsr_iop_message_xfer()
2691 … if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) { in arcmsr_iop_message_xfer()
2692 acb->acb_flags &= in arcmsr_iop_message_xfer()
2694 arcmsr_Write_data_2iop_wqbuffer(acb); in arcmsr_iop_message_xfer()
2711 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); in arcmsr_iop_message_xfer()
2715 u_int8_t *pQbuffer = acb->rqbuffer; in arcmsr_iop_message_xfer()
2717 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); in arcmsr_iop_message_xfer()
2718 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_iop_message_xfer()
2719 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_message_xfer()
2720 arcmsr_iop_message_read(acb); in arcmsr_iop_message_xfer()
2722 acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED; in arcmsr_iop_message_xfer()
2723 acb->rqbuf_firstindex = 0; in arcmsr_iop_message_xfer()
2724 acb->rqbuf_lastindex = 0; in arcmsr_iop_message_xfer()
2728 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); in arcmsr_iop_message_xfer()
2732 u_int8_t *pQbuffer = acb->wqbuffer; in arcmsr_iop_message_xfer()
2734 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); in arcmsr_iop_message_xfer()
2735 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_iop_message_xfer()
2736 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_message_xfer()
2737 arcmsr_iop_message_read(acb); in arcmsr_iop_message_xfer()
2739 acb->acb_flags |= in arcmsr_iop_message_xfer()
2742 acb->wqbuf_firstindex = 0; in arcmsr_iop_message_xfer()
2743 acb->wqbuf_lastindex = 0; in arcmsr_iop_message_xfer()
2747 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); in arcmsr_iop_message_xfer()
2753 ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock); in arcmsr_iop_message_xfer()
2754 if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) { in arcmsr_iop_message_xfer()
2755 acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW; in arcmsr_iop_message_xfer()
2756 arcmsr_iop_message_read(acb); in arcmsr_iop_message_xfer()
2758 acb->acb_flags |= in arcmsr_iop_message_xfer()
2762 acb->rqbuf_firstindex = 0; in arcmsr_iop_message_xfer()
2763 acb->rqbuf_lastindex = 0; in arcmsr_iop_message_xfer()
2764 acb->wqbuf_firstindex = 0; in arcmsr_iop_message_xfer()
2765 acb->wqbuf_lastindex = 0; in arcmsr_iop_message_xfer()
2766 pQbuffer = acb->rqbuffer; in arcmsr_iop_message_xfer()
2768 pQbuffer = acb->wqbuffer; in arcmsr_iop_message_xfer()
2771 ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock); in arcmsr_iop_message_xfer()
2787 arcmsr_iop_parking(acb); in arcmsr_iop_message_xfer()
2790 arcmsr_flush_adapter_cache(acb); in arcmsr_iop_message_xfer()
2805 struct AdapterControlBlock *acb = (struct AdapterControlBlock *)srb->acb; in arcmsr_execute_srb() local
2812 acb->pktRequestCount++; in arcmsr_execute_srb()
2817 , acb->pci_unit, error); in arcmsr_execute_srb()
2830 if(acb->acb_flags & ACB_F_BUS_RESET) { in arcmsr_execute_srb()
2831 kprintf("arcmsr%d: bus reset and return busy \n", acb->pci_unit); in arcmsr_execute_srb()
2836 if(acb->devstate[target][lun] == ARECA_RAID_GONE) { in arcmsr_execute_srb()
2844 , acb->pci_unit, cmd, target, lun); in arcmsr_execute_srb()
2852 ARCMSR_LOCK_ACQUIRE(&acb->io_lock); in arcmsr_execute_srb()
2853 bus_dmamap_unload(acb->dm_segs_dmat, srb->dm_segs_dmamap); in arcmsr_execute_srb()
2854 ARCMSR_LOCK_RELEASE(&acb->io_lock); in arcmsr_execute_srb()
2859 if(acb->srboutstandingcount >= acb->maxOutstanding) { in arcmsr_execute_srb()
2860 if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) == 0) in arcmsr_execute_srb()
2862 xpt_freeze_simq(acb->psim, 1); in arcmsr_execute_srb()
2863 acb->acb_flags |= ACB_F_CAM_DEV_QFRZN; in arcmsr_execute_srb()
2872 arcmsr_post_srb(acb, srb); in arcmsr_execute_srb()
2875 callout_init_lk(&srb->ccb_callout, &srb->acb->isr_lock); in arcmsr_execute_srb()
2887 …struct AdapterControlBlock *acb = (struct AdapterControlBlock *) abortccb->ccb_h.arcmsr_ccbacb_ptr; in arcmsr_seek_cmd2abort() local
2891 acb->num_aborts++; in arcmsr_seek_cmd2abort()
2901 if(acb->srboutstandingcount != 0) { in arcmsr_seek_cmd2abort()
2903 intmask_org = arcmsr_disable_allintr(acb); in arcmsr_seek_cmd2abort()
2905 srb = acb->psrb_pool[i]; in arcmsr_seek_cmd2abort()
2911 … , acb->pci_unit, abortccb->ccb_h.target_id in arcmsr_seek_cmd2abort()
2913 arcmsr_polling_srbdone(acb, srb); in arcmsr_seek_cmd2abort()
2915 arcmsr_enable_allintr(acb, intmask_org); in arcmsr_seek_cmd2abort()
2921 arcmsr_enable_allintr(acb, intmask_org); in arcmsr_seek_cmd2abort()
2929 static void arcmsr_bus_reset(struct AdapterControlBlock *acb) in arcmsr_bus_reset() argument
2933 acb->num_resets++; in arcmsr_bus_reset()
2934 acb->acb_flags |= ACB_F_BUS_RESET; in arcmsr_bus_reset()
2935 while(acb->srboutstandingcount != 0 && retry < 400) { in arcmsr_bus_reset()
2936 arcmsr_interrupt(acb); in arcmsr_bus_reset()
2940 arcmsr_iop_reset(acb); in arcmsr_bus_reset()
2941 acb->acb_flags &= ~ACB_F_BUS_RESET; in arcmsr_bus_reset()
2947 static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb, in arcmsr_handle_virtual_command() argument
2978 if (arcmsr_iop_message_xfer(acb, pccb)) { in arcmsr_handle_virtual_command()
2995 struct AdapterControlBlock *acb; in arcmsr_action() local
2997 acb = (struct AdapterControlBlock *) cam_sim_softc(psim); in arcmsr_action()
2998 if(acb == NULL) { in arcmsr_action()
3010 arcmsr_handle_virtual_command(acb, pccb); in arcmsr_action()
3013 if((srb = arcmsr_get_freesrb(acb)) == NULL) { in arcmsr_action()
3019 pccb->ccb_h.arcmsr_ccbacb_ptr = acb; in arcmsr_action()
3029 ARCMSR_LOCK_ACQUIRE(&acb->io_lock); in arcmsr_action()
3030 … error = bus_dmamap_load(acb->dm_segs_dmat in arcmsr_action()
3035 ARCMSR_LOCK_RELEASE(&acb->io_lock); in arcmsr_action()
3037 xpt_freeze_simq(acb->psim, 1); in arcmsr_action()
3090 if(acb->adapter_bus_speed == ACB_BUS_SPEED_12G) in arcmsr_action()
3092 else if(acb->adapter_bus_speed == ACB_BUS_SPEED_6G) in arcmsr_action()
3096 if((acb->vendor_device_id == PCIDevVenIDARC1880) || in arcmsr_action()
3097 (acb->vendor_device_id == PCIDevVenIDARC1884) || in arcmsr_action()
3098 (acb->vendor_device_id == PCIDevVenIDARC1680) || in arcmsr_action()
3099 (acb->vendor_device_id == PCIDevVenIDARC1214)) in arcmsr_action()
3148 arcmsr_bus_reset(acb); in arcmsr_action()
3180 if((acb->vendor_device_id == PCIDevVenIDARC1880) || in arcmsr_action()
3181 (acb->vendor_device_id == PCIDevVenIDARC1884) || in arcmsr_action()
3182 (acb->vendor_device_id == PCIDevVenIDARC1680) || in arcmsr_action()
3183 (acb->vendor_device_id == PCIDevVenIDARC1214)) in arcmsr_action()
3190 if (acb->adapter_bus_speed == ACB_BUS_SPEED_12G) in arcmsr_action()
3192 … else if(acb->adapter_bus_speed == ACB_BUS_SPEED_6G) in arcmsr_action()
3194 … else if(acb->adapter_bus_speed == ACB_BUS_SPEED_3G) in arcmsr_action()
3204 if (acb->adapter_bus_speed == ACB_BUS_SPEED_6G) in arcmsr_action()
3244 static void arcmsr_start_hba_bgrb(struct AdapterControlBlock *acb) in arcmsr_start_hba_bgrb() argument
3246 acb->acb_flags |= ACB_F_MSG_START_BGRB; in arcmsr_start_hba_bgrb()
3248 if(!arcmsr_hba_wait_msgint_ready(acb)) { in arcmsr_start_hba_bgrb()
3249 … kprintf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit); in arcmsr_start_hba_bgrb()
3256 static void arcmsr_start_hbb_bgrb(struct AdapterControlBlock *acb) in arcmsr_start_hbb_bgrb() argument
3258 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_start_hbb_bgrb()
3259 acb->acb_flags |= ACB_F_MSG_START_BGRB; in arcmsr_start_hbb_bgrb()
3261 if(!arcmsr_hbb_wait_msgint_ready(acb)) { in arcmsr_start_hbb_bgrb()
3262 … kprintf( "arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit); in arcmsr_start_hbb_bgrb()
3269 static void arcmsr_start_hbc_bgrb(struct AdapterControlBlock *acb) in arcmsr_start_hbc_bgrb() argument
3271 acb->acb_flags |= ACB_F_MSG_START_BGRB; in arcmsr_start_hbc_bgrb()
3274 if(!arcmsr_hbc_wait_msgint_ready(acb)) { in arcmsr_start_hbc_bgrb()
3275 … kprintf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit); in arcmsr_start_hbc_bgrb()
3282 static void arcmsr_start_hbd_bgrb(struct AdapterControlBlock *acb) in arcmsr_start_hbd_bgrb() argument
3284 acb->acb_flags |= ACB_F_MSG_START_BGRB; in arcmsr_start_hbd_bgrb()
3286 if(!arcmsr_hbd_wait_msgint_ready(acb)) { in arcmsr_start_hbd_bgrb()
3287 … kprintf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit); in arcmsr_start_hbd_bgrb()
3294 static void arcmsr_start_hbe_bgrb(struct AdapterControlBlock *acb) in arcmsr_start_hbe_bgrb() argument
3296 acb->acb_flags |= ACB_F_MSG_START_BGRB; in arcmsr_start_hbe_bgrb()
3298 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_start_hbe_bgrb()
3299 CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell); in arcmsr_start_hbe_bgrb()
3300 if(!arcmsr_hbe_wait_msgint_ready(acb)) { in arcmsr_start_hbe_bgrb()
3301 … kprintf("arcmsr%d: wait 'start adapter background rebulid' timeout \n", acb->pci_unit); in arcmsr_start_hbe_bgrb()
3308 static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb) in arcmsr_start_adapter_bgrb() argument
3310 switch (acb->adapter_type) { in arcmsr_start_adapter_bgrb()
3312 arcmsr_start_hba_bgrb(acb); in arcmsr_start_adapter_bgrb()
3315 arcmsr_start_hbb_bgrb(acb); in arcmsr_start_adapter_bgrb()
3318 arcmsr_start_hbc_bgrb(acb); in arcmsr_start_adapter_bgrb()
3321 arcmsr_start_hbd_bgrb(acb); in arcmsr_start_adapter_bgrb()
3324 arcmsr_start_hbe_bgrb(acb); in arcmsr_start_adapter_bgrb()
3333 static void arcmsr_polling_hba_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock … in arcmsr_polling_hba_srbdone() argument
3341 …outbound_intstatus=CHIP_REG_READ32(HBA_MessageUnit, 0, outbound_intstatus) & acb->outbound_int_ena… in arcmsr_polling_hba_srbdone()
3343 … bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); in arcmsr_polling_hba_srbdone()
3359 … (acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/ in arcmsr_polling_hba_srbdone()
3362 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) { in arcmsr_polling_hba_srbdone()
3366 , acb->pci_unit in arcmsr_polling_hba_srbdone()
3375 , acb->pci_unit in arcmsr_polling_hba_srbdone()
3376 , srb, acb->srboutstandingcount); in arcmsr_polling_hba_srbdone()
3379 arcmsr_report_srb_state(acb, srb, error); in arcmsr_polling_hba_srbdone()
3387 static void arcmsr_polling_hbb_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock … in arcmsr_polling_hbb_srbdone() argument
3389 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_polling_hbb_srbdone()
3398 … bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); in arcmsr_polling_hbb_srbdone()
3418 … (acb->vir2phy_offset+(flag_srb << 5));/*frame must be 32 bytes aligned*/ in arcmsr_polling_hbb_srbdone()
3421 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) { in arcmsr_polling_hbb_srbdone()
3425 , acb->pci_unit in arcmsr_polling_hbb_srbdone()
3434 , acb->pci_unit in arcmsr_polling_hbb_srbdone()
3435 , srb, acb->srboutstandingcount); in arcmsr_polling_hbb_srbdone()
3438 arcmsr_report_srb_state(acb, srb, error); in arcmsr_polling_hbb_srbdone()
3446 static void arcmsr_polling_hbc_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock … in arcmsr_polling_hbc_srbdone() argument
3454 … bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); in arcmsr_polling_hbc_srbdone()
3464 if (acb->srboutstandingcount == 0) { in arcmsr_polling_hbc_srbdone()
3472 …srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0));/*frame must be … in arcmsr_polling_hbc_srbdone()
3476 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) { in arcmsr_polling_hbc_srbdone()
3479 … , acb->pci_unit, srb->pccb->ccb_h.target_id, (uintmax_t)srb->pccb->ccb_h.target_lun, srb); in arcmsr_polling_hbc_srbdone()
3485 , acb->pci_unit, srb, acb->srboutstandingcount); in arcmsr_polling_hbc_srbdone()
3488 arcmsr_report_srb_state(acb, srb, error); in arcmsr_polling_hbc_srbdone()
3496 static void arcmsr_polling_hbd_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock … in arcmsr_polling_hbd_srbdone() argument
3498 struct HBD_MessageUnit0 *phbdmu = (struct HBD_MessageUnit0 *)acb->pmu; in arcmsr_polling_hbd_srbdone()
3506 … bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); in arcmsr_polling_hbd_srbdone()
3518 if (acb->srboutstandingcount == 0) { in arcmsr_polling_hbd_srbdone()
3527 …srb = (struct CommandControlBlock *)(acb->vir2phy_offset+(flag_srb & 0xFFFFFFE0));/*frame must be … in arcmsr_polling_hbd_srbdone()
3532 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) { in arcmsr_polling_hbd_srbdone()
3535 … , acb->pci_unit, srb->pccb->ccb_h.target_id, (uintmax_t)srb->pccb->ccb_h.target_lun, srb); in arcmsr_polling_hbd_srbdone()
3541 , acb->pci_unit, srb, acb->srboutstandingcount); in arcmsr_polling_hbd_srbdone()
3544 arcmsr_report_srb_state(acb, srb, error); in arcmsr_polling_hbd_srbdone()
3552 static void arcmsr_polling_hbe_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock … in arcmsr_polling_hbe_srbdone() argument
3560 … bus_dmamap_sync(acb->srb_dmat, acb->srb_dmamap, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); in arcmsr_polling_hbe_srbdone()
3562 doneq_index = acb->doneq_index; in arcmsr_polling_hbe_srbdone()
3571 if (acb->srboutstandingcount == 0) { in arcmsr_polling_hbe_srbdone()
3577 cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID; in arcmsr_polling_hbe_srbdone()
3579 if (doneq_index >= acb->completionQ_entry) in arcmsr_polling_hbe_srbdone()
3581 acb->doneq_index = doneq_index; in arcmsr_polling_hbe_srbdone()
3582 srb = acb->psrb_pool[cmdSMID]; in arcmsr_polling_hbe_srbdone()
3583 …error = (acb->pCompletionQ[doneq_index].cmdFlag & ARCMSR_SRBREPLY_FLAG_ERROR_MODE1) ? TRUE : FALSE; in arcmsr_polling_hbe_srbdone()
3586 if((srb->acb != acb) || (srb->srb_state != ARCMSR_SRB_START)) { in arcmsr_polling_hbe_srbdone()
3589 … , acb->pci_unit, srb->pccb->ccb_h.target_id, (uintmax_t)srb->pccb->ccb_h.target_lun, srb); in arcmsr_polling_hbe_srbdone()
3595 , acb->pci_unit, srb, acb->srboutstandingcount); in arcmsr_polling_hbe_srbdone()
3598 arcmsr_report_srb_state(acb, srb, error); in arcmsr_polling_hbe_srbdone()
3606 static void arcmsr_polling_srbdone(struct AdapterControlBlock *acb, struct CommandControlBlock *pol… in arcmsr_polling_srbdone() argument
3608 switch (acb->adapter_type) { in arcmsr_polling_srbdone()
3610 arcmsr_polling_hba_srbdone(acb, poll_srb); in arcmsr_polling_srbdone()
3614 arcmsr_polling_hbb_srbdone(acb, poll_srb); in arcmsr_polling_srbdone()
3618 arcmsr_polling_hbc_srbdone(acb, poll_srb); in arcmsr_polling_srbdone()
3622 arcmsr_polling_hbd_srbdone(acb, poll_srb); in arcmsr_polling_srbdone()
3626 arcmsr_polling_hbe_srbdone(acb, poll_srb); in arcmsr_polling_srbdone()
3635 static void arcmsr_get_hba_config(struct AdapterControlBlock *acb) in arcmsr_get_hba_config() argument
3637 char *acb_firm_model = acb->firm_model; in arcmsr_get_hba_config()
3638 char *acb_firm_version = acb->firm_version; in arcmsr_get_hba_config()
3639 char *acb_device_map = acb->device_map; in arcmsr_get_hba_config()
3646 if(!arcmsr_hba_wait_msgint_ready(acb)) { in arcmsr_get_hba_config()
3647 … kprintf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit); in arcmsr_get_hba_config()
3651 … *acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i); in arcmsr_get_hba_config()
3658 … *acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i); in arcmsr_get_hba_config()
3665 … *acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i); in arcmsr_get_hba_config()
3669 …kprintf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_ve… in arcmsr_get_hba_config()
3670 …acb->firm_request_len = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[1]); /*firm_request… in arcmsr_get_hba_config()
3671 …acb->firm_numbers_queue = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_numbers… in arcmsr_get_hba_config()
3672 …acb->firm_sdram_size = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_sdram_s… in arcmsr_get_hba_config()
3673 …acb->firm_ide_channels = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_ide_cha… in arcmsr_get_hba_config()
3674 …acb->firm_cfg_version = CHIP_REG_READ32(HBA_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFS… in arcmsr_get_hba_config()
3675 if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD) in arcmsr_get_hba_config()
3676 acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1; in arcmsr_get_hba_config()
3678 acb->maxOutstanding = acb->firm_numbers_queue - 1; in arcmsr_get_hba_config()
3684 static void arcmsr_get_hbb_config(struct AdapterControlBlock *acb) in arcmsr_get_hbb_config() argument
3686 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_get_hbb_config()
3687 char *acb_firm_model = acb->firm_model; in arcmsr_get_hbb_config()
3688 char *acb_firm_version = acb->firm_version; in arcmsr_get_hbb_config()
3689 char *acb_device_map = acb->device_map; in arcmsr_get_hbb_config()
3696 if(!arcmsr_hbb_wait_msgint_ready(acb)) { in arcmsr_get_hbb_config()
3697 … kprintf( "arcmsr%d: wait" "'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit); in arcmsr_get_hbb_config()
3701 … *acb_firm_model = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_firm_model+i); in arcmsr_get_hbb_config()
3708 … *acb_firm_version = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_firm_version+i); in arcmsr_get_hbb_config()
3715 … *acb_device_map = bus_space_read_1(acb->btag[1], acb->bhandle[1], iop_device_map+i); in arcmsr_get_hbb_config()
3719 …kprintf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_ve… in arcmsr_get_hbb_config()
3720 …acb->firm_request_len = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[1]); /*firm_request_le… in arcmsr_get_hbb_config()
3721 …acb->firm_numbers_queue = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[2]); /*firm_numbers_qu… in arcmsr_get_hbb_config()
3722 …acb->firm_sdram_size = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[3]); /*firm_sdram_size… in arcmsr_get_hbb_config()
3723 …acb->firm_ide_channels = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[4]); /*firm_ide_channe… in arcmsr_get_hbb_config()
3724 …acb->firm_cfg_version = CHIP_REG_READ32(HBB_RWBUFFER, 1, msgcode_rwbuffer[ARCMSR_FW_CFGVER_OFFSET]… in arcmsr_get_hbb_config()
3725 if(acb->firm_numbers_queue > ARCMSR_MAX_HBB_POSTQUEUE) in arcmsr_get_hbb_config()
3726 acb->maxOutstanding = ARCMSR_MAX_HBB_POSTQUEUE - 1; in arcmsr_get_hbb_config()
3728 acb->maxOutstanding = acb->firm_numbers_queue - 1; in arcmsr_get_hbb_config()
3734 static void arcmsr_get_hbc_config(struct AdapterControlBlock *acb) in arcmsr_get_hbc_config() argument
3736 char *acb_firm_model = acb->firm_model; in arcmsr_get_hbc_config()
3737 char *acb_firm_version = acb->firm_version; in arcmsr_get_hbc_config()
3738 char *acb_device_map = acb->device_map; in arcmsr_get_hbc_config()
3746 if(!arcmsr_hbc_wait_msgint_ready(acb)) { in arcmsr_get_hbc_config()
3747 … kprintf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit); in arcmsr_get_hbc_config()
3751 … *acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i); in arcmsr_get_hbc_config()
3758 … *acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i); in arcmsr_get_hbc_config()
3765 … *acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i); in arcmsr_get_hbc_config()
3769 …kprintf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_ve… in arcmsr_get_hbc_config()
3770 …acb->firm_request_len = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[1]); /*firm_r… in arcmsr_get_hbc_config()
3771 …acb->firm_numbers_queue = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_n… in arcmsr_get_hbc_config()
3772 …acb->firm_sdram_size = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_s… in arcmsr_get_hbc_config()
3773 …acb->firm_ide_channels = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_i… in arcmsr_get_hbc_config()
3774 …acb->firm_cfg_version = CHIP_REG_READ32(HBC_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFG… in arcmsr_get_hbc_config()
3775 if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD) in arcmsr_get_hbc_config()
3776 acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1; in arcmsr_get_hbc_config()
3778 acb->maxOutstanding = acb->firm_numbers_queue - 1; in arcmsr_get_hbc_config()
3784 static void arcmsr_get_hbd_config(struct AdapterControlBlock *acb) in arcmsr_get_hbd_config() argument
3786 char *acb_firm_model = acb->firm_model; in arcmsr_get_hbd_config()
3787 char *acb_firm_version = acb->firm_version; in arcmsr_get_hbd_config()
3788 char *acb_device_map = acb->device_map; in arcmsr_get_hbd_config()
3797 if(!arcmsr_hbd_wait_msgint_ready(acb)) { in arcmsr_get_hbd_config()
3798 … kprintf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit); in arcmsr_get_hbd_config()
3802 … *acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i); in arcmsr_get_hbd_config()
3809 … *acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i); in arcmsr_get_hbd_config()
3816 … *acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i); in arcmsr_get_hbd_config()
3820 …kprintf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_ve… in arcmsr_get_hbd_config()
3821 …acb->firm_request_len = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[1]); /*firm_r… in arcmsr_get_hbd_config()
3822 …acb->firm_numbers_queue = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_n… in arcmsr_get_hbd_config()
3823 …acb->firm_sdram_size = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_s… in arcmsr_get_hbd_config()
3824 …acb->firm_ide_channels = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_i… in arcmsr_get_hbd_config()
3825 …acb->firm_cfg_version = CHIP_REG_READ32(HBD_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFG… in arcmsr_get_hbd_config()
3826 if(acb->firm_numbers_queue > ARCMSR_MAX_HBD_POSTQUEUE) in arcmsr_get_hbd_config()
3827 acb->maxOutstanding = ARCMSR_MAX_HBD_POSTQUEUE - 1; in arcmsr_get_hbd_config()
3829 acb->maxOutstanding = acb->firm_numbers_queue - 1; in arcmsr_get_hbd_config()
3835 static void arcmsr_get_hbe_config(struct AdapterControlBlock *acb) in arcmsr_get_hbe_config() argument
3837 char *acb_firm_model = acb->firm_model; in arcmsr_get_hbe_config()
3838 char *acb_firm_version = acb->firm_version; in arcmsr_get_hbe_config()
3839 char *acb_device_map = acb->device_map; in arcmsr_get_hbe_config()
3846 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_get_hbe_config()
3847 CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell); in arcmsr_get_hbe_config()
3848 if(!arcmsr_hbe_wait_msgint_ready(acb)) { in arcmsr_get_hbe_config()
3849 … kprintf("arcmsr%d: wait 'get adapter firmware miscellaneous data' timeout \n", acb->pci_unit); in arcmsr_get_hbe_config()
3854 … *acb_firm_model = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_model+i); in arcmsr_get_hbe_config()
3861 … *acb_firm_version = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_firm_version+i); in arcmsr_get_hbe_config()
3868 … *acb_device_map = bus_space_read_1(acb->btag[0], acb->bhandle[0], iop_device_map+i); in arcmsr_get_hbe_config()
3872 …kprintf("Areca RAID adapter%d: %s F/W version %s \n", acb->pci_unit, acb->firm_model, acb->firm_ve… in arcmsr_get_hbe_config()
3873 …acb->firm_request_len = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[1]); /*firm_r… in arcmsr_get_hbe_config()
3874 …acb->firm_numbers_queue = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[2]); /*firm_n… in arcmsr_get_hbe_config()
3875 …acb->firm_sdram_size = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[3]); /*firm_s… in arcmsr_get_hbe_config()
3876 …acb->firm_ide_channels = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[4]); /*firm_i… in arcmsr_get_hbe_config()
3877 …acb->firm_cfg_version = CHIP_REG_READ32(HBE_MessageUnit, 0, msgcode_rwbuffer[ARCMSR_FW_CFG… in arcmsr_get_hbe_config()
3878 if(acb->firm_numbers_queue > ARCMSR_MAX_OUTSTANDING_CMD) in arcmsr_get_hbe_config()
3879 acb->maxOutstanding = ARCMSR_MAX_OUTSTANDING_CMD - 1; in arcmsr_get_hbe_config()
3881 acb->maxOutstanding = acb->firm_numbers_queue - 1; in arcmsr_get_hbe_config()
3887 static void arcmsr_get_firmware_spec(struct AdapterControlBlock *acb) in arcmsr_get_firmware_spec() argument
3889 switch (acb->adapter_type) { in arcmsr_get_firmware_spec()
3891 arcmsr_get_hba_config(acb); in arcmsr_get_firmware_spec()
3895 arcmsr_get_hbb_config(acb); in arcmsr_get_firmware_spec()
3899 arcmsr_get_hbc_config(acb); in arcmsr_get_firmware_spec()
3903 arcmsr_get_hbd_config(acb); in arcmsr_get_firmware_spec()
3907 arcmsr_get_hbe_config(acb); in arcmsr_get_firmware_spec()
3916 static void arcmsr_wait_firmware_ready( struct AdapterControlBlock *acb) in arcmsr_wait_firmware_ready() argument
3920 switch (acb->adapter_type) { in arcmsr_wait_firmware_ready()
3926 … kprintf( "arcmsr%d:timed out waiting for firmware \n", acb->pci_unit); in arcmsr_wait_firmware_ready()
3934 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_wait_firmware_ready()
3939 … kprintf( "arcmsr%d: timed out waiting for firmware \n", acb->pci_unit); in arcmsr_wait_firmware_ready()
3952 … kprintf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit); in arcmsr_wait_firmware_ready()
3964 … kprintf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit); in arcmsr_wait_firmware_ready()
3976 … kprintf( "arcmsr%d:timed out waiting for firmware ready\n", acb->pci_unit); in arcmsr_wait_firmware_ready()
3989 static void arcmsr_clear_doorbell_queue_buffer( struct AdapterControlBlock *acb) in arcmsr_clear_doorbell_queue_buffer() argument
3993 switch (acb->adapter_type) { in arcmsr_clear_doorbell_queue_buffer()
4002 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_clear_doorbell_queue_buffer()
4026 … acb->in_doorbell = CHIP_REG_READ32(HBE_MessageUnit, 0, iobound_doorbell); in arcmsr_clear_doorbell_queue_buffer()
4028 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK; in arcmsr_clear_doorbell_queue_buffer()
4029 … CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell); in arcmsr_clear_doorbell_queue_buffer()
4038 static u_int32_t arcmsr_iop_confirm(struct AdapterControlBlock *acb) in arcmsr_iop_confirm() argument
4050 srb_phyaddr = (unsigned long) acb->srb_phyaddr.phyaddr; in arcmsr_iop_confirm()
4051 srb_phyaddr_hi32 = acb->srb_phyaddr.B.phyadd_high; in arcmsr_iop_confirm()
4052 srb_phyaddr_lo32 = acb->srb_phyaddr.B.phyadd_low; in arcmsr_iop_confirm()
4053 switch (acb->adapter_type) { in arcmsr_iop_confirm()
4059 if(!arcmsr_hba_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4060 … kprintf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit); in arcmsr_iop_confirm()
4075 phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_iop_confirm()
4079 if(!arcmsr_hbb_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4080 … kprintf( "arcmsr%d: 'set window of post command Q' timeout\n", acb->pci_unit); in arcmsr_iop_confirm()
4091 if(!arcmsr_hbb_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4092 … kprintf( "arcmsr%d: 'set command Q window' timeout \n", acb->pci_unit); in arcmsr_iop_confirm()
4096 if(!arcmsr_hbb_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4097 … kprintf( "arcmsr%d: 'start diver mode' timeout \n", acb->pci_unit); in arcmsr_iop_confirm()
4108 if(!arcmsr_hbc_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4109 … kprintf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit); in arcmsr_iop_confirm()
4119 phbdmu = (struct HBD_MessageUnit0 *)acb->pmu; in arcmsr_iop_confirm()
4132 if(!arcmsr_hbd_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4133 … kprintf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit); in arcmsr_iop_confirm()
4151 acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE; in arcmsr_iop_confirm()
4152 … CHIP_REG_WRITE32(HBE_MessageUnit, 0, iobound_doorbell, acb->out_doorbell); in arcmsr_iop_confirm()
4153 if(!arcmsr_hbe_wait_msgint_ready(acb)) { in arcmsr_iop_confirm()
4154 … kprintf( "arcmsr%d: 'set srb high part physical address' timeout \n", acb->pci_unit); in arcmsr_iop_confirm()
4166 static void arcmsr_enable_eoi_mode(struct AdapterControlBlock *acb) in arcmsr_enable_eoi_mode() argument
4168 if (acb->adapter_type == ACB_ADAPTER_TYPE_B) in arcmsr_enable_eoi_mode()
4170 struct HBB_MessageUnit *phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_enable_eoi_mode()
4172 if(!arcmsr_hbb_wait_msgint_ready(acb)) { in arcmsr_enable_eoi_mode()
4173 kprintf( "arcmsr%d: 'iop enable eoi mode' timeout \n", acb->pci_unit); in arcmsr_enable_eoi_mode()
4182 static void arcmsr_iop_init(struct AdapterControlBlock *acb) in arcmsr_iop_init() argument
4187 intmask_org = arcmsr_disable_allintr(acb); in arcmsr_iop_init()
4188 arcmsr_wait_firmware_ready(acb); in arcmsr_iop_init()
4189 arcmsr_iop_confirm(acb); in arcmsr_iop_init()
4190 arcmsr_get_firmware_spec(acb); in arcmsr_iop_init()
4192 arcmsr_start_adapter_bgrb(acb); in arcmsr_iop_init()
4194 arcmsr_clear_doorbell_queue_buffer(acb); in arcmsr_iop_init()
4195 arcmsr_enable_eoi_mode(acb); in arcmsr_iop_init()
4197 arcmsr_enable_allintr(acb, intmask_org); in arcmsr_iop_init()
4198 acb->acb_flags |= ACB_F_IOP_INITED; in arcmsr_iop_init()
4206 struct AdapterControlBlock *acb = arg; in arcmsr_map_free_srb() local
4211 acb->srb_phyaddr.phyaddr = srb_phyaddr; in arcmsr_map_free_srb()
4212 srb_tmp = (struct CommandControlBlock *)acb->uncacheptr; in arcmsr_map_free_srb()
4214 if(bus_dmamap_create(acb->dm_segs_dmat, in arcmsr_map_free_srb()
4216 acb->acb_flags |= ACB_F_MAPFREESRB_FAILD; in arcmsr_map_free_srb()
4218 " srb dmamap bus_dmamap_create error\n", acb->pci_unit); in arcmsr_map_free_srb()
4221 … if((acb->adapter_type == ACB_ADAPTER_TYPE_C) || (acb->adapter_type == ACB_ADAPTER_TYPE_D) in arcmsr_map_free_srb()
4222 || (acb->adapter_type == ACB_ADAPTER_TYPE_E)) in arcmsr_map_free_srb()
4229 srb_tmp->acb = acb; in arcmsr_map_free_srb()
4231 acb->srbworkingQ[i] = acb->psrb_pool[i] = srb_tmp; in arcmsr_map_free_srb()
4235 acb->pCompletionQ = (pCompletion_Q)srb_tmp; in arcmsr_map_free_srb()
4236 acb->vir2phy_offset = (unsigned long)srb_tmp - (unsigned long)srb_phyaddr; in arcmsr_map_free_srb()
4242 static void arcmsr_free_resource(struct AdapterControlBlock *acb) in arcmsr_free_resource() argument
4245 if(acb->ioctl_dev != NULL) { in arcmsr_free_resource()
4246 destroy_dev(acb->ioctl_dev); in arcmsr_free_resource()
4248 bus_dmamap_unload(acb->srb_dmat, acb->srb_dmamap); in arcmsr_free_resource()
4249 bus_dmamap_destroy(acb->srb_dmat, acb->srb_dmamap); in arcmsr_free_resource()
4250 bus_dma_tag_destroy(acb->srb_dmat); in arcmsr_free_resource()
4251 bus_dma_tag_destroy(acb->dm_segs_dmat); in arcmsr_free_resource()
4252 bus_dma_tag_destroy(acb->parent_dmat); in arcmsr_free_resource()
4258 static void arcmsr_mutex_init(struct AdapterControlBlock *acb) in arcmsr_mutex_init() argument
4260 ARCMSR_LOCK_INIT(&acb->isr_lock, "arcmsr isr lock"); in arcmsr_mutex_init()
4261 ARCMSR_LOCK_INIT(&acb->srb_lock, "arcmsr srb lock"); in arcmsr_mutex_init()
4262 ARCMSR_LOCK_INIT(&acb->postDone_lock, "arcmsr postQ lock"); in arcmsr_mutex_init()
4263 ARCMSR_LOCK_INIT(&acb->qbuffer_lock, "arcmsr RW buffer lock"); in arcmsr_mutex_init()
4264 ARCMSR_LOCK_INIT(&acb->io_lock, "arcmsr io lock"); in arcmsr_mutex_init()
4265 ARCMSR_LOCK_INIT(&acb->sim_lock, "arcmsr sim lock"); in arcmsr_mutex_init()
4271 static void arcmsr_mutex_destroy(struct AdapterControlBlock *acb) in arcmsr_mutex_destroy() argument
4273 ARCMSR_LOCK_DESTROY(&acb->sim_lock); in arcmsr_mutex_destroy()
4274 ARCMSR_LOCK_DESTROY(&acb->io_lock); in arcmsr_mutex_destroy()
4275 ARCMSR_LOCK_DESTROY(&acb->qbuffer_lock); in arcmsr_mutex_destroy()
4276 ARCMSR_LOCK_DESTROY(&acb->postDone_lock); in arcmsr_mutex_destroy()
4277 ARCMSR_LOCK_DESTROY(&acb->srb_lock); in arcmsr_mutex_destroy()
4278 ARCMSR_LOCK_DESTROY(&acb->isr_lock); in arcmsr_mutex_destroy()
4286 struct AdapterControlBlock *acb = device_get_softc(dev); in arcmsr_initialize() local
4292 acb->vendor_device_id = vendor_dev_id; in arcmsr_initialize()
4293 acb->sub_device_id = pci_read_config(dev, PCIR_SUBDEV_0, 2); in arcmsr_initialize()
4299 acb->adapter_type = ACB_ADAPTER_TYPE_C; in arcmsr_initialize()
4300 if ((acb->sub_device_id == ARECA_SUB_DEV_ID_1883) || in arcmsr_initialize()
4301 (acb->sub_device_id == ARECA_SUB_DEV_ID_1216) || in arcmsr_initialize()
4302 (acb->sub_device_id == ARECA_SUB_DEV_ID_1226)) in arcmsr_initialize()
4303 acb->adapter_bus_speed = ACB_BUS_SPEED_12G; in arcmsr_initialize()
4305 acb->adapter_bus_speed = ACB_BUS_SPEED_6G; in arcmsr_initialize()
4310 acb->adapter_type = ACB_ADAPTER_TYPE_E; in arcmsr_initialize()
4311 acb->adapter_bus_speed = ACB_BUS_SPEED_12G; in arcmsr_initialize()
4313 … acb->completionQ_entry = COMPLETION_Q_POOL_SIZE / sizeof(struct deliver_completeQ); in arcmsr_initialize()
4316 acb->adapter_type = ACB_ADAPTER_TYPE_D; in arcmsr_initialize()
4317 acb->adapter_bus_speed = ACB_BUS_SPEED_6G; in arcmsr_initialize()
4323 acb->adapter_type = ACB_ADAPTER_TYPE_B; in arcmsr_initialize()
4324 acb->adapter_bus_speed = ACB_BUS_SPEED_3G; in arcmsr_initialize()
4329 acb->adapter_type = ACB_ADAPTER_TYPE_B; in arcmsr_initialize()
4330 acb->adapter_bus_speed = ACB_BUS_SPEED_6G; in arcmsr_initialize()
4353 acb->adapter_type = ACB_ADAPTER_TYPE_A; in arcmsr_initialize()
4354 acb->adapter_bus_speed = ACB_BUS_SPEED_3G; in arcmsr_initialize()
4373 &acb->parent_dmat) != 0) in arcmsr_initialize()
4379 if(bus_dma_tag_create( /*parent_dmat*/ acb->parent_dmat, in arcmsr_initialize()
4388 &acb->dm_segs_dmat) != 0) in arcmsr_initialize()
4390 bus_dma_tag_destroy(acb->parent_dmat); in arcmsr_initialize()
4396 if(bus_dma_tag_create( /*parent_dmat*/ acb->parent_dmat, in arcmsr_initialize()
4405 &acb->srb_dmat) != 0) in arcmsr_initialize()
4407 bus_dma_tag_destroy(acb->dm_segs_dmat); in arcmsr_initialize()
4408 bus_dma_tag_destroy(acb->parent_dmat); in arcmsr_initialize()
4413 …if(bus_dmamem_alloc(acb->srb_dmat, (void **)&acb->uncacheptr, BUS_DMA_WAITOK | BUS_DMA_COHERENT | … in arcmsr_initialize()
4414 bus_dma_tag_destroy(acb->srb_dmat); in arcmsr_initialize()
4415 bus_dma_tag_destroy(acb->dm_segs_dmat); in arcmsr_initialize()
4416 bus_dma_tag_destroy(acb->parent_dmat); in arcmsr_initialize()
4421 …if(bus_dmamap_load(acb->srb_dmat, acb->srb_dmamap, acb->uncacheptr, max_coherent_size, arcmsr_map_… in arcmsr_initialize()
4422 bus_dma_tag_destroy(acb->srb_dmat); in arcmsr_initialize()
4423 bus_dma_tag_destroy(acb->dm_segs_dmat); in arcmsr_initialize()
4424 bus_dma_tag_destroy(acb->parent_dmat); in arcmsr_initialize()
4434 switch(acb->adapter_type) { in arcmsr_initialize()
4439 … acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev,SYS_RES_MEMORY, &rid0, RF_ACTIVE); in arcmsr_initialize()
4440 if(acb->sys_res_arcmsr[0] == NULL) { in arcmsr_initialize()
4441 arcmsr_free_resource(acb); in arcmsr_initialize()
4445 if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) { in arcmsr_initialize()
4446 arcmsr_free_resource(acb); in arcmsr_initialize()
4450 mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4452 arcmsr_free_resource(acb); in arcmsr_initialize()
4456 acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4457 acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4458 acb->pmu = (struct MessageUnit_UNION *)mem_base0; in arcmsr_initialize()
4459 acb->rid[0] = rid0; in arcmsr_initialize()
4473 … acb->sys_res_arcmsr[i] = bus_alloc_resource_any(dev,SYS_RES_MEMORY, &rid[i], RF_ACTIVE); in arcmsr_initialize()
4474 if(acb->sys_res_arcmsr[i] == NULL) { in arcmsr_initialize()
4475 arcmsr_free_resource(acb); in arcmsr_initialize()
4479 if(rman_get_start(acb->sys_res_arcmsr[i]) <= 0) { in arcmsr_initialize()
4480 arcmsr_free_resource(acb); in arcmsr_initialize()
4484 mem_base[i] = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[i]); in arcmsr_initialize()
4486 arcmsr_free_resource(acb); in arcmsr_initialize()
4490 acb->btag[i] = rman_get_bustag(acb->sys_res_arcmsr[i]); in arcmsr_initialize()
4491 acb->bhandle[i] = rman_get_bushandle(acb->sys_res_arcmsr[i]); in arcmsr_initialize()
4493 freesrb = (struct CommandControlBlock *)acb->uncacheptr; in arcmsr_initialize()
4494 … acb->pmu = (struct MessageUnit_UNION *)((unsigned long)freesrb+ARCMSR_SRBS_POOL_SIZE); in arcmsr_initialize()
4495 phbbmu = (struct HBB_MessageUnit *)acb->pmu; in arcmsr_initialize()
4509 acb->rid[0] = rid[0]; in arcmsr_initialize()
4510 acb->rid[1] = rid[1]; in arcmsr_initialize()
4517 … acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev,SYS_RES_MEMORY, &rid0, RF_ACTIVE); in arcmsr_initialize()
4518 if(acb->sys_res_arcmsr[0] == NULL) { in arcmsr_initialize()
4519 arcmsr_free_resource(acb); in arcmsr_initialize()
4523 if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) { in arcmsr_initialize()
4524 arcmsr_free_resource(acb); in arcmsr_initialize()
4528 mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4530 arcmsr_free_resource(acb); in arcmsr_initialize()
4534 acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4535 acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4536 acb->pmu = (struct MessageUnit_UNION *)mem_base0; in arcmsr_initialize()
4537 acb->rid[0] = rid0; in arcmsr_initialize()
4545 … acb->sys_res_arcmsr[0] = bus_alloc_resource_any(dev,SYS_RES_MEMORY, &rid0, RF_ACTIVE); in arcmsr_initialize()
4546 if(acb->sys_res_arcmsr[0] == NULL) { in arcmsr_initialize()
4547 arcmsr_free_resource(acb); in arcmsr_initialize()
4551 if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) { in arcmsr_initialize()
4552 arcmsr_free_resource(acb); in arcmsr_initialize()
4556 mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4558 arcmsr_free_resource(acb); in arcmsr_initialize()
4562 acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4563 acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4564 … acb->pmu = (struct MessageUnit_UNION *)((unsigned long)acb->uncacheptr+ARCMSR_SRBS_POOL_SIZE); in arcmsr_initialize()
4565 phbdmu = (struct HBD_MessageUnit0 *)acb->pmu; in arcmsr_initialize()
4567 acb->rid[0] = rid0; in arcmsr_initialize()
4574 …acb->sys_res_arcmsr[0] = bus_alloc_resource(dev,SYS_RES_MEMORY, &rid0, 0ul, ~0ul, sizeof(struct HB… in arcmsr_initialize()
4575 if(acb->sys_res_arcmsr[0] == NULL) { in arcmsr_initialize()
4576 arcmsr_free_resource(acb); in arcmsr_initialize()
4580 if(rman_get_start(acb->sys_res_arcmsr[0]) <= 0) { in arcmsr_initialize()
4581 arcmsr_free_resource(acb); in arcmsr_initialize()
4585 mem_base0 = (vm_offset_t) rman_get_virtual(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4587 arcmsr_free_resource(acb); in arcmsr_initialize()
4591 acb->btag[0] = rman_get_bustag(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4592 acb->bhandle[0] = rman_get_bushandle(acb->sys_res_arcmsr[0]); in arcmsr_initialize()
4593 acb->pmu = (struct MessageUnit_UNION *)mem_base0; in arcmsr_initialize()
4594 acb->doneq_index = 0; in arcmsr_initialize()
4595 acb->in_doorbell = 0; in arcmsr_initialize()
4596 acb->out_doorbell = 0; in arcmsr_initialize()
4597 acb->rid[0] = rid0; in arcmsr_initialize()
4603 if(acb->acb_flags & ACB_F_MAPFREESRB_FAILD) { in arcmsr_initialize()
4604 arcmsr_free_resource(acb); in arcmsr_initialize()
4608 …acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED|ACB_F_MESSAGE_RQBUFFER_CLEARED|ACB_F_MESSAGE_WQ… in arcmsr_initialize()
4609 acb->acb_flags &= ~ACB_F_SCSISTOPADAPTER; in arcmsr_initialize()
4617 acb->devstate[i][j] = ARECA_RAID_GONE; in arcmsr_initialize()
4620 arcmsr_iop_init(acb); in arcmsr_initialize()
4628 static void arcmsr_teardown_intr(device_t dev, struct AdapterControlBlock *acb) in arcmsr_teardown_intr() argument
4632 if (acb->acb_flags & ACB_F_MSIX_ENABLED) { in arcmsr_teardown_intr()
4633 for (i = 0; i < acb->msix_vectors; i++) { in arcmsr_teardown_intr()
4634 if (acb->ih[i]) in arcmsr_teardown_intr()
4635 bus_teardown_intr(dev, acb->irqres[i], acb->ih[i]); in arcmsr_teardown_intr()
4640 acb->ih[i] = NULL; in arcmsr_teardown_intr()
4644 if ((acb->ih[0] != NULL) && (acb->irqres[0] != NULL)) in arcmsr_teardown_intr()
4645 bus_teardown_intr(dev, acb->irqres[0], acb->ih[0]); in arcmsr_teardown_intr()
4646 if (acb->irqres[0] != NULL) in arcmsr_teardown_intr()
4648 acb->irq_id[0], acb->irqres[0]); in arcmsr_teardown_intr()
4649 if (acb->irq_type == PCI_INTR_TYPE_MSI) in arcmsr_teardown_intr()
4651 acb->ih[0] = NULL; in arcmsr_teardown_intr()
4652 acb->irqres[0] = NULL; in arcmsr_teardown_intr()
4653 acb->irq_type = 0; in arcmsr_teardown_intr()
4663 struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev); in arcmsr_attach() local
4670 if(acb == NULL) { in arcmsr_attach()
4674 arcmsr_mutex_init(acb); in arcmsr_attach()
4675 acb->pci_dev = dev; in arcmsr_attach()
4676 acb->pci_unit = unit; in arcmsr_attach()
4682 acb->irq_id[0] = 0; in arcmsr_attach()
4683 acb->irq_type = pci_alloc_1intr(dev, arcmsr_msi_enable, &acb->irq_id[0], &irq_flags); in arcmsr_attach()
4684 irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &acb->irq_id[0], irq_flags); in arcmsr_attach()
4689 … if(bus_setup_intr(dev, irqres, INTR_MPSAFE, arcmsr_intr_handler, acb, &acb->ih[0], NULL)) { in arcmsr_attach()
4693 acb->irqres[0] = irqres; in arcmsr_attach()
4700 devq = cam_simq_alloc(acb->maxOutstanding); in arcmsr_attach()
4705 …acb->psim = cam_sim_alloc(arcmsr_action, arcmsr_poll, "arcmsr", acb, unit, &acb->isr_lock, 1, ARCM… in arcmsr_attach()
4707 if(acb->psim == NULL) { in arcmsr_attach()
4711 ARCMSR_LOCK_ACQUIRE(&acb->isr_lock); in arcmsr_attach()
4712 if(xpt_bus_register(acb->psim, 0) != CAM_SUCCESS) { in arcmsr_attach()
4720 …if(xpt_create_path(&ccb->ccb_h.path, xpt_periph, cam_sim_path(acb->psim), CAM_TARGET_WILDCARD, CAM… in arcmsr_attach()
4732 ARCMSR_LOCK_RELEASE(&acb->isr_lock); in arcmsr_attach()
4735 …acb->ioctl_dev = make_dev(&arcmsr_ops, unit, UID_ROOT, GID_WHEEL /* GID_OPERATOR */, S_IRUSR | S_I… in arcmsr_attach()
4736 acb->ioctl_dev->si_drv1 = acb; in arcmsr_attach()
4737 (void)make_dev_alias(acb->ioctl_dev, "arc%d", unit); in arcmsr_attach()
4738 arcmsr_callout_init(&acb->devmap_callout); in arcmsr_attach()
4739 callout_reset(&acb->devmap_callout, 60 * hz, arcmsr_polling_devmap, acb); in arcmsr_attach()
4745 xpt_bus_deregister(cam_sim_path(acb->psim)); in arcmsr_attach()
4747 ARCMSR_LOCK_RELEASE(&acb->isr_lock); in arcmsr_attach()
4748 cam_sim_free(acb->psim); in arcmsr_attach()
4752 arcmsr_teardown_intr(dev, acb); in arcmsr_attach()
4754 arcmsr_free_resource(acb); in arcmsr_attach()
4755 bus_release_resource(dev, SYS_RES_IRQ, acb->irq_id[0], irqres); in arcmsr_attach()
4757 if (acb->irq_type == PCI_INTR_TYPE_MSI) in arcmsr_attach()
4760 arcmsr_mutex_destroy(acb); in arcmsr_attach()
4850 struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev); in arcmsr_shutdown() local
4853 ARCMSR_LOCK_ACQUIRE(&acb->isr_lock); in arcmsr_shutdown()
4855 arcmsr_disable_allintr(acb); in arcmsr_shutdown()
4856 arcmsr_stop_adapter_bgrb(acb); in arcmsr_shutdown()
4857 arcmsr_flush_adapter_cache(acb); in arcmsr_shutdown()
4859 acb->acb_flags |= ACB_F_SCSISTOPADAPTER; in arcmsr_shutdown()
4860 acb->acb_flags &= ~ACB_F_IOP_INITED; in arcmsr_shutdown()
4861 if(acb->srboutstandingcount != 0) { in arcmsr_shutdown()
4863 arcmsr_done4abort_postqueue(acb); in arcmsr_shutdown()
4865 arcmsr_abort_allcmd(acb); in arcmsr_shutdown()
4867 srb = acb->psrb_pool[i]; in arcmsr_shutdown()
4875 acb->srboutstandingcount = 0; in arcmsr_shutdown()
4876 acb->workingsrb_doneindex = 0; in arcmsr_shutdown()
4877 acb->workingsrb_startindex = 0; in arcmsr_shutdown()
4878 acb->pktRequestCount = 0; in arcmsr_shutdown()
4879 acb->pktReturnCount = 0; in arcmsr_shutdown()
4880 ARCMSR_LOCK_RELEASE(&acb->isr_lock); in arcmsr_shutdown()
4889 struct AdapterControlBlock *acb=(struct AdapterControlBlock *)device_get_softc(dev); in arcmsr_detach() local
4892 callout_stop(&acb->devmap_callout); in arcmsr_detach()
4893 arcmsr_teardown_intr(dev, acb); in arcmsr_detach()
4895 arcmsr_free_resource(acb); in arcmsr_detach()
4896 for(i=0; (i < 2) && (acb->sys_res_arcmsr[i]!=NULL); i++) { in arcmsr_detach()
4897 bus_release_resource(dev, SYS_RES_MEMORY, acb->rid[i], acb->sys_res_arcmsr[i]); in arcmsr_detach()
4899 ARCMSR_LOCK_ACQUIRE(&acb->isr_lock); in arcmsr_detach()
4900 xpt_bus_deregister(cam_sim_path(acb->psim)); in arcmsr_detach()
4901 cam_sim_free(acb->psim); in arcmsr_detach()
4902 ARCMSR_LOCK_RELEASE(&acb->isr_lock); in arcmsr_detach()
4903 arcmsr_mutex_destroy(acb); in arcmsr_detach()
4908 static void arcmsr_dump_data(struct AdapterControlBlock *acb) in arcmsr_dump_data() argument
4910 if((acb->pktRequestCount - acb->pktReturnCount) == 0) in arcmsr_dump_data()
4912 kprintf("Command Request Count =0x%x\n",acb->pktRequestCount); in arcmsr_dump_data()
4913 kprintf("Command Return Count =0x%x\n",acb->pktReturnCount); in arcmsr_dump_data()
4914 kprintf("Command (Req-Rtn) Count =0x%x\n",(acb->pktRequestCount - acb->pktReturnCount)); in arcmsr_dump_data()
4915 kprintf("Queued Command Count =0x%x\n",acb->srboutstandingcount); in arcmsr_dump_data()