Lines Matching refs:softs
80 #define AAC_DEV(softs, t) (((t) < AAC_MAX_LD) ? \ argument
81 &(softs)->containers[(t)].dev : \
82 ((t) < AAC_MAX_DEV(softs)) ? \
83 &(softs)->nondasds[AAC_PD(t)].dev : NULL)
84 #define AAC_DEVCFG_BEGIN(softs, tgt) \ argument
85 aac_devcfg((softs), (tgt), 1)
86 #define AAC_DEVCFG_END(softs, tgt) \ argument
87 aac_devcfg((softs), (tgt), 0)
139 #define AAC_MIR_SIZE(softs, acc, mir) \ argument
140 (((softs)->flags & AAC_FLAGS_LBA_64BIT) ? \
153 #define PCI_MEM_GET32(softs, off) \ argument
154 ddi_get32((softs)->pci_mem_handle, \
155 (void *)((softs)->pci_mem_base_vaddr + (off)))
156 #define PCI_MEM_PUT32(softs, off, val) \ argument
157 ddi_put32((softs)->pci_mem_handle, \
158 (void *)((softs)->pci_mem_base_vaddr + (off)), \
160 #define PCI_MEM_GET16(softs, off) \ argument
161 ddi_get16((softs)->pci_mem_handle, \
162 (void *)((softs)->pci_mem_base_vaddr + (off)))
163 #define PCI_MEM_PUT16(softs, off, val) \ argument
164 ddi_put16((softs)->pci_mem_handle, \
165 (void *)((softs)->pci_mem_base_vaddr + (off)), (uint16_t)(val))
167 #define PCI_MEM_REP_PUT8(softs, off, valp, count) \ argument
168 ddi_rep_put8((softs)->pci_mem_handle, (uint8_t *)(valp), \
169 (uint8_t *)((softs)->pci_mem_base_vaddr + (off)), \
172 #define PCI_MEM_REP_GET8(softs, off, valp, count) \ argument
173 ddi_rep_get8((softs)->pci_mem_handle, (uint8_t *)(valp), \
174 (uint8_t *)((softs)->pci_mem_base_vaddr + (off)), \
189 #define AAC_ENABLE_INTR(softs) { \ argument
190 if (softs->flags & AAC_FLAGS_NEW_COMM) \
191 PCI_MEM_PUT32(softs, AAC_OIMR, ~AAC_DB_INTR_NEW); \
193 PCI_MEM_PUT32(softs, AAC_OIMR, ~AAC_DB_INTR_BITS); \
194 softs->state |= AAC_STATE_INTR; \
197 #define AAC_DISABLE_INTR(softs) { \ argument
198 PCI_MEM_PUT32(softs, AAC_OIMR, ~0); \
199 softs->state &= ~AAC_STATE_INTR; \
201 #define AAC_STATUS_CLR(softs, mask) PCI_MEM_PUT32(softs, AAC_ODBR, mask) argument
202 #define AAC_STATUS_GET(softs) PCI_MEM_GET32(softs, AAC_ODBR) argument
203 #define AAC_NOTIFY(softs, val) PCI_MEM_PUT32(softs, AAC_IDBR, val) argument
204 #define AAC_OUTB_GET(softs) PCI_MEM_GET32(softs, AAC_OQUE) argument
205 #define AAC_OUTB_SET(softs, val) PCI_MEM_PUT32(softs, AAC_OQUE, val) argument
206 #define AAC_FWSTATUS_GET(softs) \ argument
207 ((softs)->aac_if.aif_get_fwstatus(softs))
208 #define AAC_MAILBOX_GET(softs, mb) \ argument
209 ((softs)->aac_if.aif_get_mailbox((softs), (mb)))
210 #define AAC_MAILBOX_SET(softs, cmd, arg0, arg1, arg2, arg3) \ argument
211 ((softs)->aac_if.aif_set_mailbox((softs), (cmd), \
334 static int aac_do_quiesce(struct aac_softstate *softs);
335 static int aac_do_unquiesce(struct aac_softstate *softs);
765 struct aac_softstate *softs = NULL; in aac_attach() local
784 AACDB_PRINT(softs, CE_WARN, "Cannot alloc soft state"); in aac_attach()
787 softs = ddi_get_soft_state(aac_softstatep, instance); in aac_attach()
790 softs->instance = instance; in aac_attach()
791 softs->devinfo_p = dip; in aac_attach()
792 softs->buf_dma_attr = softs->addr_dma_attr = aac_dma_attr; in aac_attach()
793 softs->addr_dma_attr.dma_attr_granular = 1; in aac_attach()
794 softs->acc_attr = aac_acc_attr; in aac_attach()
795 softs->reg_attr = aac_acc_attr; in aac_attach()
796 softs->card = AAC_UNKNOWN_CARD; in aac_attach()
798 softs->debug_flags = aac_debug_flags; in aac_attach()
799 softs->debug_fib_flags = aac_debug_fib_flags; in aac_attach()
803 aac_fm_init(softs); in aac_attach()
806 if (aac_check_card_type(softs) == AACERR) { in aac_attach()
807 AACDB_PRINT(softs, CE_WARN, "Card not supported"); in aac_attach()
815 (caddr_t *)&softs->pci_mem_base_vaddr, 0, in aac_attach()
816 softs->map_size_min, &softs->reg_attr, in aac_attach()
817 &softs->pci_mem_handle) != DDI_SUCCESS) in aac_attach()
820 softs->map_size = softs->map_size_min; in aac_attach()
823 AAC_DISABLE_INTR(softs); in aac_attach()
826 mutex_init(&softs->io_lock, NULL, MUTEX_DRIVER, in aac_attach()
827 DDI_INTR_PRI(softs->intr_pri)); in aac_attach()
828 mutex_init(&softs->q_comp_mutex, NULL, MUTEX_DRIVER, in aac_attach()
829 DDI_INTR_PRI(softs->intr_pri)); in aac_attach()
830 mutex_init(&softs->time_mutex, NULL, MUTEX_DRIVER, in aac_attach()
831 DDI_INTR_PRI(softs->intr_pri)); in aac_attach()
832 mutex_init(&softs->ev_lock, NULL, MUTEX_DRIVER, in aac_attach()
833 DDI_INTR_PRI(softs->intr_pri)); in aac_attach()
834 mutex_init(&softs->aifq_mutex, NULL, in aac_attach()
835 MUTEX_DRIVER, DDI_INTR_PRI(softs->intr_pri)); in aac_attach()
836 cv_init(&softs->event, NULL, CV_DRIVER, NULL); in aac_attach()
837 cv_init(&softs->sync_fib_cv, NULL, CV_DRIVER, NULL); in aac_attach()
838 cv_init(&softs->drain_cv, NULL, CV_DRIVER, NULL); in aac_attach()
839 cv_init(&softs->event_wait_cv, NULL, CV_DRIVER, NULL); in aac_attach()
840 cv_init(&softs->event_disp_cv, NULL, CV_DRIVER, NULL); in aac_attach()
841 cv_init(&softs->aifq_cv, NULL, CV_DRIVER, NULL); in aac_attach()
846 aac_cmd_initq(&softs->q_wait[i]); in aac_attach()
847 aac_cmd_initq(&softs->q_busy); in aac_attach()
848 aac_cmd_initq(&softs->q_comp); in aac_attach()
851 softs->legacy = 1; /* default to use legacy name */ in aac_attach()
855 AACDB_PRINT(softs, CE_NOTE, "legacy-name disabled"); in aac_attach()
856 softs->legacy = 0; in aac_attach()
865 mutex_enter(&softs->io_lock); in aac_attach()
866 if (aac_common_attach(softs) == AACERR) { in aac_attach()
867 mutex_exit(&softs->io_lock); in aac_attach()
870 mutex_exit(&softs->io_lock); in aac_attach()
877 AACDB_PRINT(softs, CE_NOTE, "buf breakup enabled"); in aac_attach()
878 softs->flags |= AAC_FLAGS_BRKUP; in aac_attach()
882 softs->dma_max = softs->buf_dma_attr.dma_attr_maxxfer; in aac_attach()
883 if (softs->flags & AAC_FLAGS_BRKUP) { in aac_attach()
884 softs->dma_max = ddi_prop_get_int(DDI_DEV_T_ANY, dip, in aac_attach()
885 DDI_PROP_DONTPASS, "dma-max", softs->dma_max); in aac_attach()
888 if (aac_hba_setup(softs) != AACOK) in aac_attach()
895 AACDB_PRINT(softs, CE_WARN, "failed to create devctl node"); in aac_attach()
902 AACDB_PRINT(softs, CE_WARN, "failed to create scsi node"); in aac_attach()
910 AACDB_PRINT(softs, CE_WARN, "failed to create aac node"); in aac_attach()
915 softs->state |= AAC_STATE_RUN; in aac_attach()
918 softs->fibctx_p = &softs->aifctx; in aac_attach()
919 if ((softs->event_thread = thread_create(NULL, 0, aac_event_thread, in aac_attach()
920 softs, 0, &p0, TS_RUN, minclsyspri)) == NULL) { in aac_attach()
921 AACDB_PRINT(softs, CE_WARN, "aif thread create failed"); in aac_attach()
922 softs->state &= ~AAC_STATE_RUN; in aac_attach()
926 aac_unhold_bus(softs, AAC_IOCMD_SYNC | AAC_IOCMD_ASYNC); in aac_attach()
929 softs->timeout_id = timeout(aac_timer, (void *)softs, in aac_attach()
934 AACDB_PRINT(softs, CE_NOTE, "aac attached ok"); in aac_attach()
943 aac_common_detach(softs); in aac_attach()
949 mutex_destroy(&softs->io_lock); in aac_attach()
950 mutex_destroy(&softs->q_comp_mutex); in aac_attach()
951 mutex_destroy(&softs->time_mutex); in aac_attach()
952 mutex_destroy(&softs->ev_lock); in aac_attach()
953 mutex_destroy(&softs->aifq_mutex); in aac_attach()
954 cv_destroy(&softs->event); in aac_attach()
955 cv_destroy(&softs->sync_fib_cv); in aac_attach()
956 cv_destroy(&softs->drain_cv); in aac_attach()
957 cv_destroy(&softs->event_wait_cv); in aac_attach()
958 cv_destroy(&softs->event_disp_cv); in aac_attach()
959 cv_destroy(&softs->aifq_cv); in aac_attach()
962 ddi_regs_map_free(&softs->pci_mem_handle); in aac_attach()
963 aac_fm_fini(softs); in aac_attach()
965 softs->card = AACERR; in aac_attach()
975 struct aac_softstate *softs = AAC_TRAN2SOFTS(tran); in aac_detach() local
977 DBCALLED(softs, 1); in aac_detach()
988 mutex_enter(&softs->io_lock); in aac_detach()
989 AAC_DISABLE_INTR(softs); in aac_detach()
990 softs->state = AAC_STATE_STOPPED; in aac_detach()
995 mutex_exit(&softs->io_lock); in aac_detach()
997 aac_common_detach(softs); in aac_detach()
999 mutex_enter(&softs->io_lock); in aac_detach()
1002 mutex_exit(&softs->io_lock); in aac_detach()
1005 mutex_enter(&softs->time_mutex); in aac_detach()
1006 if (softs->timeout_id) { in aac_detach()
1007 timeout_id_t tid = softs->timeout_id; in aac_detach()
1008 softs->timeout_id = 0; in aac_detach()
1010 mutex_exit(&softs->time_mutex); in aac_detach()
1012 mutex_enter(&softs->time_mutex); in aac_detach()
1014 mutex_exit(&softs->time_mutex); in aac_detach()
1017 mutex_enter(&softs->ev_lock); in aac_detach()
1018 cv_signal(&softs->event_disp_cv); in aac_detach()
1019 cv_wait(&softs->event_wait_cv, &softs->ev_lock); in aac_detach()
1020 mutex_exit(&softs->ev_lock); in aac_detach()
1022 cv_destroy(&softs->aifq_cv); in aac_detach()
1023 cv_destroy(&softs->event_disp_cv); in aac_detach()
1024 cv_destroy(&softs->event_wait_cv); in aac_detach()
1025 cv_destroy(&softs->drain_cv); in aac_detach()
1026 cv_destroy(&softs->sync_fib_cv); in aac_detach()
1027 cv_destroy(&softs->event); in aac_detach()
1028 mutex_destroy(&softs->aifq_mutex); in aac_detach()
1029 mutex_destroy(&softs->ev_lock); in aac_detach()
1030 mutex_destroy(&softs->time_mutex); in aac_detach()
1031 mutex_destroy(&softs->q_comp_mutex); in aac_detach()
1032 mutex_destroy(&softs->io_lock); in aac_detach()
1034 ddi_regs_map_free(&softs->pci_mem_handle); in aac_detach()
1035 aac_fm_fini(softs); in aac_detach()
1036 softs->hwif = AAC_HWIF_UNKNOWN; in aac_detach()
1037 softs->card = AAC_UNKNOWN_CARD; in aac_detach()
1047 struct aac_softstate *softs = AAC_DIP2SOFTS(dip); in aac_reset() local
1049 DBCALLED(softs, 1); in aac_reset()
1051 mutex_enter(&softs->io_lock); in aac_reset()
1052 AAC_DISABLE_INTR(softs); in aac_reset()
1053 (void) aac_shutdown(softs); in aac_reset()
1054 mutex_exit(&softs->io_lock); in aac_reset()
1072 struct aac_softstate *softs = AAC_DIP2SOFTS(dip); in aac_quiesce() local
1074 if (softs == NULL) in aac_quiesce()
1077 _NOTE(ASSUMING_PROTECTED(softs->state)) in aac_quiesce()
1078 AAC_DISABLE_INTR(softs); in aac_quiesce()
1107 aac_shutdown(struct aac_softstate *softs) in aac_shutdown() argument
1113 (void) aac_sync_fib_slot_bind(softs, &softs->sync_ac); in aac_shutdown()
1114 acc = softs->sync_ac.slotp->fib_acc_handle; in aac_shutdown()
1116 cc = (struct aac_close_command *)&softs->sync_ac.slotp->fibp->data[0]; in aac_shutdown()
1122 rval = aac_sync_fib(softs, ContainerCommand, in aac_shutdown()
1124 aac_sync_fib_slot_release(softs, &softs->sync_ac); in aac_shutdown()
1126 AACDB_PRINT(softs, CE_NOTE, in aac_shutdown()
1134 struct aac_softstate *softs = (void *)arg; in aac_softintr() local
1136 if (!AAC_IS_Q_EMPTY(&softs->q_comp)) { in aac_softintr()
1137 aac_drain_comp_q(softs); in aac_softintr()
1221 aac_send_command(struct aac_softstate *softs, struct aac_slot *slotp) in aac_send_command() argument
1225 index = PCI_MEM_GET32(softs, AAC_IQUE); in aac_send_command()
1227 index = PCI_MEM_GET32(softs, AAC_IQUE); in aac_send_command()
1233 PCI_MEM_PUT32(softs, device, in aac_send_command()
1236 PCI_MEM_PUT32(softs, device, (uint32_t)(slotp->fib_phyaddr >> 32)); in aac_send_command()
1238 PCI_MEM_PUT32(softs, device, slotp->acp->fib_size); in aac_send_command()
1239 PCI_MEM_PUT32(softs, AAC_IQUE, index); in aac_send_command()
1244 aac_end_io(struct aac_softstate *softs, struct aac_cmd *acp) in aac_end_io() argument
1251 aac_release_slot(softs, acp->slotp); in aac_end_io()
1258 aac_set_throttle(softs, dvp, q, in aac_end_io()
1259 softs->total_slots); in aac_end_io()
1273 AACDB_PRINT(softs, CE_NOTE, in aac_end_io()
1281 softs->bus_ncmds[q]--; in aac_end_io()
1282 aac_cmd_delete(&softs->q_busy, acp); in aac_end_io()
1284 aac_cmd_delete(&softs->q_wait[q], acp); in aac_end_io()
1288 mutex_enter(&softs->q_comp_mutex); in aac_end_io()
1289 aac_cmd_enqueue(&softs->q_comp, acp); in aac_end_io()
1290 mutex_exit(&softs->q_comp_mutex); in aac_end_io()
1292 cv_broadcast(&softs->event); in aac_end_io()
1297 aac_handle_io(struct aac_softstate *softs, int index) in aac_handle_io() argument
1307 ASSERT(index >= 0 && index < softs->total_slots); in aac_handle_io()
1308 slotp = &softs->io_slot[index]; in aac_handle_io()
1344 acp->ac_comp(softs, acp); in aac_handle_io()
1346 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_UNAFFECTED); in aac_handle_io()
1353 aac_end_io(softs, acp); in aac_handle_io()
1363 aac_process_intr_new(struct aac_softstate *softs) in aac_process_intr_new() argument
1367 index = AAC_OUTB_GET(softs); in aac_process_intr_new()
1369 index = AAC_OUTB_GET(softs); in aac_process_intr_new()
1370 if (aac_check_acc_handle(softs->pci_mem_handle) != DDI_SUCCESS) { in aac_process_intr_new()
1371 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_UNAFFECTED); in aac_process_intr_new()
1377 aac_handle_io(softs, index); in aac_process_intr_new()
1389 fibp = (struct aac_fib *)(softs-> \ in aac_process_intr_new()
1391 fib_size = PCI_MEM_GET16(softs, index + \ in aac_process_intr_new()
1394 aac_save_aif(softs, softs->pci_mem_handle, in aac_process_intr_new()
1401 AAC_OUTB_SET(softs, index); in aac_process_intr_new()
1402 AAC_STATUS_CLR(softs, AAC_DB_RESPONSE_READY); in aac_process_intr_new()
1405 index = AAC_OUTB_GET(softs); in aac_process_intr_new()
1412 aac_start_waiting_io(softs); in aac_process_intr_new()
1422 struct aac_softstate *softs = (void *)arg; in aac_intr_new() local
1425 mutex_enter(&softs->io_lock); in aac_intr_new()
1426 if (aac_process_intr_new(softs)) in aac_intr_new()
1430 mutex_exit(&softs->io_lock); in aac_intr_new()
1432 aac_drain_comp_q(softs); in aac_intr_new()
1443 aac_process_intr_old(struct aac_softstate *softs) in aac_process_intr_old() argument
1447 status = AAC_STATUS_GET(softs); in aac_process_intr_old()
1448 if (aac_check_acc_handle(softs->pci_mem_handle) != DDI_SUCCESS) { in aac_process_intr_old()
1449 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_UNAFFECTED); in aac_process_intr_old()
1456 AAC_STATUS_CLR(softs, AAC_DB_RESPONSE_READY); in aac_process_intr_old()
1457 (void) AAC_STATUS_GET(softs); in aac_process_intr_old()
1458 while (aac_fib_dequeue(softs, AAC_HOST_NORM_RESP_Q, in aac_process_intr_old()
1460 aac_handle_io(softs, slot_idx); in aac_process_intr_old()
1466 aac_start_waiting_io(softs); in aac_process_intr_old()
1471 AAC_STATUS_CLR(softs, AAC_DB_COMMAND_READY); in aac_process_intr_old()
1472 (void) AAC_STATUS_GET(softs); in aac_process_intr_old()
1473 if (aac_fib_dequeue(softs, AAC_HOST_NORM_CMD_Q, &aif_idx) == in aac_process_intr_old()
1475 ddi_acc_handle_t acc = softs->comm_space_acc_handle; in aac_process_intr_old()
1483 #define AAC_SYNC_AIF(softs, aif_idx, type) \ in aac_process_intr_old() argument
1484 { (void) ddi_dma_sync((softs)->comm_space_dma_handle, \ in aac_process_intr_old()
1490 AAC_SYNC_AIF(softs, aif_idx, DDI_DMA_SYNC_FORCPU); in aac_process_intr_old()
1491 fibp = &softs->comm_space->adapter_fibs[aif_idx]; in aac_process_intr_old()
1494 aac_save_aif(softs, acc, fibp, fib_size); in aac_process_intr_old()
1505 AAC_SYNC_AIF(softs, aif_idx, in aac_process_intr_old()
1511 &softs->comm_space->adapter_fibs[aif_idx]. \ in aac_process_intr_old()
1514 &softs->comm_space->adapter_fibs[aif_idx]. \ in aac_process_intr_old()
1517 &softs->comm_space->adapter_fibs[aif_idx]. \ in aac_process_intr_old()
1519 if (aac_fib_enqueue(softs, AAC_ADAP_NORM_RESP_Q, in aac_process_intr_old()
1526 AAC_STATUS_CLR(softs, AAC_DB_PRINTF_READY); in aac_process_intr_old()
1527 (void) AAC_STATUS_GET(softs); in aac_process_intr_old()
1528 (void) ddi_dma_sync(softs->comm_space_dma_handle, in aac_process_intr_old()
1531 if (aac_check_dma_handle(softs->comm_space_dma_handle) == in aac_process_intr_old()
1534 softs->comm_space->adapter_print_buf); in aac_process_intr_old()
1536 ddi_fm_service_impact(softs->devinfo_p, in aac_process_intr_old()
1538 AAC_NOTIFY(softs, AAC_DB_PRINTF_READY); in aac_process_intr_old()
1547 AAC_STATUS_CLR(softs, AAC_DB_COMMAND_NOT_FULL); in aac_process_intr_old()
1550 AAC_STATUS_CLR(softs, AAC_DB_COMMAND_NOT_FULL); in aac_process_intr_old()
1551 AAC_STATUS_CLR(softs, AAC_DB_RESPONSE_NOT_FULL); in aac_process_intr_old()
1561 struct aac_softstate *softs = (void *)arg; in aac_intr_old() local
1564 mutex_enter(&softs->io_lock); in aac_intr_old()
1565 if (aac_process_intr_old(softs)) in aac_intr_old()
1569 mutex_exit(&softs->io_lock); in aac_intr_old()
1571 aac_drain_comp_q(softs); in aac_intr_old()
1579 aac_query_intrs(struct aac_softstate *softs, int intr_type) in aac_query_intrs() argument
1581 dev_info_t *dip = softs->devinfo_p; in aac_query_intrs()
1585 AACDB_PRINT(softs, CE_NOTE, in aac_query_intrs()
1591 AACDB_PRINT(softs, CE_WARN, in aac_query_intrs()
1600 AACDB_PRINT(softs, CE_WARN, in aac_query_intrs()
1606 AACDB_PRINT(softs, CE_NOTE, in aac_query_intrs()
1611 softs->intr_size = count * sizeof (ddi_intr_handle_t); in aac_query_intrs()
1612 softs->htable = kmem_alloc(softs->intr_size, KM_SLEEP); in aac_query_intrs()
1622 ret = ddi_intr_alloc(dip, softs->htable, intr_type, 0, in aac_query_intrs()
1626 AACDB_PRINT(softs, CE_WARN, in aac_query_intrs()
1633 AACDB_PRINT(softs, CE_NOTE, in aac_query_intrs()
1638 softs->intr_cnt = actual; in aac_query_intrs()
1641 if ((ret = ddi_intr_get_pri(softs->htable[0], in aac_query_intrs()
1642 &softs->intr_pri)) != DDI_SUCCESS) { in aac_query_intrs()
1643 AACDB_PRINT(softs, CE_WARN, in aac_query_intrs()
1649 if (softs->intr_pri >= ddi_intr_get_hilevel_pri()) { in aac_query_intrs()
1650 AACDB_PRINT(softs, CE_WARN, in aac_query_intrs()
1660 (void) ddi_intr_free(softs->htable[i]); in aac_query_intrs()
1662 kmem_free(softs->htable, softs->intr_size); in aac_query_intrs()
1671 aac_add_intrs(struct aac_softstate *softs) in aac_add_intrs() argument
1677 actual = softs->intr_cnt; in aac_add_intrs()
1678 aac_intr = ((softs->flags & AAC_FLAGS_NEW_COMM) ? in aac_add_intrs()
1683 if ((ret = ddi_intr_add_handler(softs->htable[i], in aac_add_intrs()
1684 aac_intr, (caddr_t)softs, NULL)) != DDI_SUCCESS) { in aac_add_intrs()
1690 (void) ddi_intr_free(softs->htable[i]); in aac_add_intrs()
1692 kmem_free(softs->htable, softs->intr_size); in aac_add_intrs()
1697 if ((ret = ddi_intr_get_cap(softs->htable[0], &softs->intr_cap)) in aac_add_intrs()
1703 (void) ddi_intr_free(softs->htable[i]); in aac_add_intrs()
1705 kmem_free(softs->htable, softs->intr_size); in aac_add_intrs()
1716 aac_remove_intrs(struct aac_softstate *softs) in aac_remove_intrs() argument
1721 (void) aac_disable_intrs(softs); in aac_remove_intrs()
1723 for (i = 0; i < softs->intr_cnt; i++) { in aac_remove_intrs()
1724 (void) ddi_intr_remove_handler(softs->htable[i]); in aac_remove_intrs()
1725 (void) ddi_intr_free(softs->htable[i]); in aac_remove_intrs()
1728 kmem_free(softs->htable, softs->intr_size); in aac_remove_intrs()
1732 aac_enable_intrs(struct aac_softstate *softs) in aac_enable_intrs() argument
1736 if (softs->intr_cap & DDI_INTR_FLAG_BLOCK) { in aac_enable_intrs()
1738 if (ddi_intr_block_enable(softs->htable, softs->intr_cnt) != in aac_enable_intrs()
1745 for (i = 0; i < softs->intr_cnt; i++) { in aac_enable_intrs()
1746 if (ddi_intr_enable(softs->htable[i]) != DDI_SUCCESS) in aac_enable_intrs()
1754 aac_disable_intrs(struct aac_softstate *softs) in aac_disable_intrs() argument
1758 if (softs->intr_cap & DDI_INTR_FLAG_BLOCK) { in aac_disable_intrs()
1760 if (ddi_intr_block_disable(softs->htable, softs->intr_cnt) != in aac_disable_intrs()
1766 for (i = 0; i < softs->intr_cnt; i++) { in aac_disable_intrs()
1767 if (ddi_intr_disable(softs->htable[i]) != DDI_SUCCESS) in aac_disable_intrs()
1778 aac_set_pkt_reason(struct aac_softstate *softs, struct aac_cmd *acp, in aac_set_pkt_reason() argument
1782 _NOTE(ARGUNUSED(softs)) in aac_set_pkt_reason()
1793 aac_soft_callback(struct aac_softstate *softs, struct aac_cmd *acp) in aac_soft_callback() argument
1806 mutex_enter(&softs->q_comp_mutex); in aac_soft_callback()
1807 aac_cmd_enqueue(&softs->q_comp, acp); in aac_soft_callback()
1808 mutex_exit(&softs->q_comp_mutex); in aac_soft_callback()
1809 ddi_trigger_softintr(softs->softint_id); in aac_soft_callback()
1822 aac_ld_complete(struct aac_softstate *softs, struct aac_cmd *acp) in aac_ld_complete() argument
1851 aac_pd_complete(struct aac_softstate *softs, struct aac_cmd *acp) in aac_pd_complete() argument
1884 AACDB_PRINT(softs, CE_NOTE, "DATA_OVERRUN: " \ in aac_pd_complete()
1898 aac_set_pkt_reason(softs, acp, in aac_pd_complete()
1919 AACDB_PRINT(softs, CE_NOTE, in aac_pd_complete()
1922 aac_set_pkt_reason(softs, acp, CMD_ABORTED, in aac_pd_complete()
1926 AACDB_PRINT(softs, CE_NOTE, in aac_pd_complete()
1930 aac_set_pkt_reason(softs, acp, CMD_ABORT_FAIL, in aac_pd_complete()
1934 AACDB_PRINT(softs, CE_NOTE, in aac_pd_complete()
1938 aac_set_pkt_reason(softs, acp, CMD_PER_FAIL, 0); in aac_pd_complete()
1947 AACDB_PRINT(softs, CE_NOTE, in aac_pd_complete()
1954 aac_set_pkt_reason(softs, acp, CMD_DEV_GONE, 0); in aac_pd_complete()
1958 AACDB_PRINT(softs, CE_NOTE, in aac_pd_complete()
1962 aac_set_pkt_reason(softs, acp, CMD_TIMEOUT, in aac_pd_complete()
1966 AACDB_PRINT(softs, CE_NOTE, in aac_pd_complete()
1970 aac_set_pkt_reason(softs, acp, CMD_RESET, in aac_pd_complete()
1974 AACDB_PRINT(softs, CE_NOTE, "srb_status=%d, " \ in aac_pd_complete()
1977 aac_set_pkt_reason(softs, acp, CMD_TRAN_ERR, 0); in aac_pd_complete()
2001 AACDB_PRINT(softs, CE_NOTE, in aac_pd_complete()
2011 AACDB_PRINT(softs, CE_WARN, "invaild scsi status: " \ in aac_pd_complete()
2014 aac_set_pkt_reason(softs, acp, CMD_TRAN_ERR, 0); in aac_pd_complete()
2017 AACDB_PRINT(softs, CE_NOTE, "SRB failed: fib status %d", in aac_pd_complete()
2019 aac_set_pkt_reason(softs, acp, CMD_TRAN_ERR, 0); in aac_pd_complete()
2028 aac_ioctl_complete(struct aac_softstate *softs, struct aac_cmd *acp) in aac_ioctl_complete() argument
2044 ASSERT(acp->fib_size <= softs->aac_max_fib_size); in aac_ioctl_complete()
2054 aac_sync_complete(struct aac_softstate *softs, struct aac_cmd *acp) in aac_sync_complete() argument
2063 aac_synccache_complete(struct aac_softstate *softs, struct aac_cmd *acp) in aac_synccache_complete() argument
2082 aac_startstop_complete(struct aac_softstate *softs, struct aac_cmd *acp) in aac_startstop_complete() argument
2096 AACDB_PRINT(softs, CE_WARN, "Cannot start/stop a unit"); in aac_startstop_complete()
2105 aac_check_card_type(struct aac_softstate *softs) in aac_check_card_type() argument
2112 if ((pci_config_setup(softs->devinfo_p, &pci_config_handle)) != in aac_check_card_type()
2114 AACDB_PRINT(softs, CE_WARN, "Cannot setup pci config space"); in aac_check_card_type()
2118 softs->vendid = pci_config_get16(pci_config_handle, PCI_CONF_VENID); in aac_check_card_type()
2119 softs->devid = pci_config_get16(pci_config_handle, PCI_CONF_DEVID); in aac_check_card_type()
2120 softs->subvendid = pci_config_get16(pci_config_handle, in aac_check_card_type()
2122 softs->subsysid = pci_config_get16(pci_config_handle, in aac_check_card_type()
2127 if ((aac_cards[card_index].vendor == softs->vendid) && in aac_check_card_type()
2128 (aac_cards[card_index].device == softs->devid) && in aac_check_card_type()
2129 (aac_cards[card_index].subvendor == softs->subvendid) && in aac_check_card_type()
2130 (aac_cards[card_index].subsys == softs->subsysid)) { in aac_check_card_type()
2136 softs->card = card_index; in aac_check_card_type()
2137 softs->hwif = aac_cards[card_index].hwif; in aac_check_card_type()
2145 if (softs->vendid != 0x9005) { in aac_check_card_type()
2146 AACDB_PRINT(softs, CE_WARN, in aac_check_card_type()
2147 "Unknown vendor 0x%x", softs->vendid); in aac_check_card_type()
2150 switch (softs->devid) { in aac_check_card_type()
2152 softs->hwif = AAC_HWIF_I960RX; in aac_check_card_type()
2155 softs->hwif = AAC_HWIF_RKT; in aac_check_card_type()
2158 AACDB_PRINT(softs, CE_WARN, in aac_check_card_type()
2159 "Unknown device \"pci9005,%x\"", softs->devid); in aac_check_card_type()
2165 switch (softs->hwif) { in aac_check_card_type()
2167 softs->aac_if = aac_rx_interface; in aac_check_card_type()
2168 softs->map_size_min = AAC_MAP_SIZE_MIN_RX; in aac_check_card_type()
2171 softs->aac_if = aac_rkt_interface; in aac_check_card_type()
2172 softs->map_size_min = AAC_MAP_SIZE_MIN_RKT; in aac_check_card_type()
2175 AACDB_PRINT(softs, CE_WARN, in aac_check_card_type()
2176 "Unknown hardware interface %d", softs->hwif); in aac_check_card_type()
2181 (void *)strncpy(softs->vendor_name, aac_cards[card_index].vid, in aac_check_card_type()
2183 (void *)strncpy(softs->product_name, aac_cards[card_index].desc, in aac_check_card_type()
2187 softs->flags = aac_cards[card_index].quirks; in aac_check_card_type()
2202 softs->pci_mem_base_paddr = 0xfffffff0UL & \ in aac_check_card_type()
2217 aac_register_intrs(struct aac_softstate *softs) in aac_register_intrs() argument
2222 ASSERT(softs->devinfo_p); in aac_register_intrs()
2223 dip = softs->devinfo_p; in aac_register_intrs()
2227 AACDB_PRINT(softs, CE_WARN, in aac_register_intrs()
2231 AACDB_PRINT(softs, CE_NOTE, in aac_register_intrs()
2236 if (aac_query_intrs(softs, DDI_INTR_TYPE_MSI) in aac_register_intrs()
2238 AACDB_PRINT(softs, CE_WARN, in aac_register_intrs()
2242 softs->intr_type = DDI_INTR_TYPE_MSI; in aac_register_intrs()
2244 if (aac_query_intrs(softs, DDI_INTR_TYPE_FIXED) in aac_register_intrs()
2246 AACDB_PRINT(softs, CE_WARN, in aac_register_intrs()
2250 softs->intr_type = DDI_INTR_TYPE_FIXED; in aac_register_intrs()
2252 AACDB_PRINT(softs, CE_WARN, in aac_register_intrs()
2258 if (aac_add_intrs(softs) != DDI_SUCCESS) { in aac_register_intrs()
2259 AACDB_PRINT(softs, CE_WARN, in aac_register_intrs()
2261 softs->intr_type == DDI_INTR_TYPE_MSI ? "MSI" : "FIXED"); in aac_register_intrs()
2264 (void) aac_enable_intrs(softs); in aac_register_intrs()
2266 if (ddi_add_softintr(dip, DDI_SOFTINT_LOW, &softs->softint_id, in aac_register_intrs()
2267 NULL, NULL, aac_softintr, (caddr_t)softs) != DDI_SUCCESS) { in aac_register_intrs()
2268 AACDB_PRINT(softs, CE_WARN, in aac_register_intrs()
2270 aac_remove_intrs(softs); in aac_register_intrs()
2278 aac_unregister_intrs(struct aac_softstate *softs) in aac_unregister_intrs() argument
2280 aac_remove_intrs(softs); in aac_unregister_intrs()
2281 ddi_remove_softintr(softs->softint_id); in aac_unregister_intrs()
2289 aac_check_firmware(struct aac_softstate *softs) in aac_check_firmware() argument
2306 if ((aac_sync_mbcommand(softs, AAC_MONKER_GETINFO, 0, 0, 0, 0, in aac_check_firmware()
2316 options = AAC_MAILBOX_GET(softs, 1); in aac_check_firmware()
2317 atu_size = AAC_MAILBOX_GET(softs, 2); in aac_check_firmware()
2320 if (softs->state & AAC_STATE_RESET) { in aac_check_firmware()
2321 if ((softs->support_opt == options) && in aac_check_firmware()
2322 (softs->atu_size == atu_size)) in aac_check_firmware()
2334 softs->support_opt = options; in aac_check_firmware()
2335 softs->atu_size = atu_size; in aac_check_firmware()
2339 (softs->flags & AAC_FLAGS_NO4GB) == 0) { in aac_check_firmware()
2340 AACDB_PRINT(softs, CE_NOTE, "!Enable FIB map 4GB window"); in aac_check_firmware()
2341 softs->flags |= AAC_FLAGS_4GB_WINDOW; in aac_check_firmware()
2349 softs->addr_dma_attr.dma_attr_addr_lo = 0x2000ull; in aac_check_firmware()
2350 softs->addr_dma_attr.dma_attr_addr_hi = 0x7fffffffull; in aac_check_firmware()
2354 AACDB_PRINT(softs, CE_NOTE, "!Enable SG map 64-bit address"); in aac_check_firmware()
2355 softs->buf_dma_attr.dma_attr_addr_hi = 0xffffffffffffffffull; in aac_check_firmware()
2356 softs->buf_dma_attr.dma_attr_seg = 0xffffffffffffffffull; in aac_check_firmware()
2357 softs->flags |= AAC_FLAGS_SG_64BIT; in aac_check_firmware()
2361 softs->flags |= AAC_FLAGS_ARRAY_64BIT; in aac_check_firmware()
2362 AACDB_PRINT(softs, CE_NOTE, "!Enable 64-bit array size"); in aac_check_firmware()
2366 if ((ddi_prop_lookup_string(DDI_DEV_T_ANY, softs->devinfo_p, 0, in aac_check_firmware()
2369 AACDB_PRINT(softs, CE_NOTE, in aac_check_firmware()
2371 softs->flags |= AAC_FLAGS_NONDASD; in aac_check_firmware()
2379 if ((aac_sync_mbcommand(softs, AAC_MONKER_GETCOMMPREF, in aac_check_firmware()
2381 options = AAC_MAILBOX_GET(softs, 1); in aac_check_firmware()
2384 options = AAC_MAILBOX_GET(softs, 2); in aac_check_firmware()
2386 options = AAC_MAILBOX_GET(softs, 3); in aac_check_firmware()
2391 if ((softs->support_opt & AAC_SUPPORTED_NEW_COMM) && in aac_check_firmware()
2394 if ((atu_size > softs->map_size) && in aac_check_firmware()
2395 (ddi_regs_map_setup(softs->devinfo_p, 1, in aac_check_firmware()
2396 (caddr_t *)&data, 0, atu_size, &softs->reg_attr, in aac_check_firmware()
2398 ddi_regs_map_free(&softs->pci_mem_handle); in aac_check_firmware()
2399 softs->pci_mem_handle = pci_handle; in aac_check_firmware()
2400 softs->pci_mem_base_vaddr = data; in aac_check_firmware()
2401 softs->map_size = atu_size; in aac_check_firmware()
2403 if (atu_size == softs->map_size) { in aac_check_firmware()
2404 softs->flags |= AAC_FLAGS_NEW_COMM; in aac_check_firmware()
2405 AACDB_PRINT(softs, CE_NOTE, in aac_check_firmware()
2411 if (softs->flags & AAC_FLAGS_NEW_COMM) { in aac_check_firmware()
2412 softs->aac_max_fibs = max_fibs; in aac_check_firmware()
2413 softs->aac_max_fib_size = max_fib_size; in aac_check_firmware()
2414 softs->aac_max_sectors = max_sectors; in aac_check_firmware()
2415 softs->aac_sg_tablesize = sg_tablesize; in aac_check_firmware()
2417 softs->flags |= AAC_FLAGS_RAW_IO; in aac_check_firmware()
2418 AACDB_PRINT(softs, CE_NOTE, "!Enable RawIO"); in aac_check_firmware()
2420 softs->aac_max_fibs = in aac_check_firmware()
2421 (softs->flags & AAC_FLAGS_256FIBS) ? 256 : 512; in aac_check_firmware()
2422 softs->aac_max_fib_size = AAC_FIB_SIZE; in aac_check_firmware()
2423 softs->aac_max_sectors = 128; /* 64K */ in aac_check_firmware()
2424 if (softs->flags & AAC_FLAGS_17SG) in aac_check_firmware()
2425 softs->aac_sg_tablesize = 17; in aac_check_firmware()
2426 else if (softs->flags & AAC_FLAGS_34SG) in aac_check_firmware()
2427 softs->aac_sg_tablesize = 34; in aac_check_firmware()
2428 else if (softs->flags & AAC_FLAGS_SG_64BIT) in aac_check_firmware()
2429 softs->aac_sg_tablesize = (AAC_FIB_DATASIZE - in aac_check_firmware()
2434 softs->aac_sg_tablesize = (AAC_FIB_DATASIZE - in aac_check_firmware()
2440 if ((softs->flags & AAC_FLAGS_RAW_IO) && in aac_check_firmware()
2441 (softs->flags & AAC_FLAGS_ARRAY_64BIT)) { in aac_check_firmware()
2442 softs->flags |= AAC_FLAGS_LBA_64BIT; in aac_check_firmware()
2443 AACDB_PRINT(softs, CE_NOTE, "!Enable 64-bit array"); in aac_check_firmware()
2445 softs->buf_dma_attr.dma_attr_sgllen = softs->aac_sg_tablesize; in aac_check_firmware()
2446 softs->buf_dma_attr.dma_attr_maxxfer = softs->aac_max_sectors << 9; in aac_check_firmware()
2457 softs->buf_dma_attr.dma_attr_count_max = in aac_check_firmware()
2458 softs->buf_dma_attr.dma_attr_maxxfer - 1; in aac_check_firmware()
2461 if (softs->flags & AAC_FLAGS_RAW_IO) in aac_check_firmware()
2462 softs->aac_cmd_fib = aac_cmd_fib_rawio; in aac_check_firmware()
2463 else if (softs->flags & AAC_FLAGS_SG_64BIT) in aac_check_firmware()
2464 softs->aac_cmd_fib = aac_cmd_fib_brw64; in aac_check_firmware()
2466 softs->aac_cmd_fib = aac_cmd_fib_brw; in aac_check_firmware()
2467 softs->aac_cmd_fib_scsi = (softs->flags & AAC_FLAGS_SG_64BIT) ? \ in aac_check_firmware()
2471 softs->slen = sizeof (struct scsi_arq_status); in aac_check_firmware()
2472 if ((softs->flags & AAC_FLAGS_LBA_64BIT) && in aac_check_firmware()
2473 softs->slen < AAC_ARQ64_LENGTH) in aac_check_firmware()
2474 softs->slen = AAC_ARQ64_LENGTH; in aac_check_firmware()
2476 AACDB_PRINT(softs, CE_NOTE, in aac_check_firmware()
2478 softs->aac_max_fibs, softs->aac_max_fib_size, in aac_check_firmware()
2479 softs->aac_max_sectors, softs->aac_sg_tablesize); in aac_check_firmware()
2485 aac_fsa_rev(struct aac_softstate *softs, struct FsaRev *fsarev0, in aac_fsa_rev() argument
2488 ddi_acc_handle_t acc = softs->sync_ac.slotp->fib_acc_handle; in aac_fsa_rev()
2503 aac_get_adapter_info(struct aac_softstate *softs, in aac_get_adapter_info() argument
2506 struct aac_cmd *acp = &softs->sync_ac; in aac_get_adapter_info()
2513 (void) aac_sync_fib_slot_bind(softs, acp); in aac_get_adapter_info()
2518 if (aac_sync_fib(softs, RequestAdapterInfo, in aac_get_adapter_info()
2520 AACDB_PRINT(softs, CE_WARN, "RequestAdapterInfo failed"); in aac_get_adapter_info()
2534 aac_fsa_rev(softs, &ainfp->KernelRevision, in aac_get_adapter_info()
2536 aac_fsa_rev(softs, &ainfp->MonitorRevision, in aac_get_adapter_info()
2538 aac_fsa_rev(softs, &ainfp->HardwareRevision, in aac_get_adapter_info()
2540 aac_fsa_rev(softs, &ainfp->BIOSRevision, in aac_get_adapter_info()
2550 if (!(softs->support_opt & in aac_get_adapter_info()
2552 AACDB_PRINT(softs, CE_WARN, in aac_get_adapter_info()
2558 if (aac_sync_fib(softs, RequestSupplementAdapterInfo, in aac_get_adapter_info()
2561 AACDB_PRINT(softs, CE_WARN, in aac_get_adapter_info()
2580 aac_fsa_rev(softs, &sinfp->FlashFirmwareRevision, in aac_get_adapter_info()
2583 aac_fsa_rev(softs, &sinfp->FlashFirmwareBootRevision, in aac_get_adapter_info()
2601 aac_sync_fib_slot_release(softs, acp); in aac_get_adapter_info()
2606 aac_get_bus_info(struct aac_softstate *softs, uint32_t *bus_max, in aac_get_bus_info() argument
2609 struct aac_cmd *acp = &softs->sync_ac; in aac_get_bus_info()
2619 (void) aac_sync_fib_slot_bind(softs, acp); in aac_get_bus_info()
2628 rval = aac_sync_fib(softs, ContainerCommand, in aac_get_bus_info()
2632 AACDB_PRINT(softs, CE_WARN, in aac_get_bus_info()
2652 rval = aac_sync_fib(softs, ContainerCommand, in aac_get_bus_info()
2658 AACDB_PRINT(softs, CE_WARN, "GetBusInfo command fail"); in aac_get_bus_info()
2666 aac_sync_fib_slot_release(softs, acp); in aac_get_bus_info()
2709 aac_handle_adapter_config_issues(struct aac_softstate *softs) in aac_handle_adapter_config_issues() argument
2711 struct aac_cmd *acp = &softs->sync_ac; in aac_handle_adapter_config_issues()
2722 (void) aac_sync_fib_slot_bind(softs, acp); in aac_handle_adapter_config_issues()
2734 rval = aac_sync_fib(softs, ContainerCommand, in aac_handle_adapter_config_issues()
2750 rval = aac_sync_fib(softs, ContainerCommand, in aac_handle_adapter_config_issues()
2774 aac_sync_fib_slot_release(softs, acp); in aac_handle_adapter_config_issues()
2782 aac_common_attach(struct aac_softstate *softs) in aac_common_attach() argument
2788 DBCALLED(softs, 1); in aac_common_attach()
2797 while (AAC_OUTB_GET(softs) != 0xfffffffful) in aac_common_attach()
2804 status = AAC_FWSTATUS_GET(softs); in aac_common_attach()
2808 AAC_BUSYWAIT(AAC_FWSTATUS_GET(softs) & AAC_KERNEL_UP_AND_RUNNING, i); in aac_common_attach()
2811 aac_fm_ereport(softs, DDI_FM_DEVICE_NO_RESPONSE); in aac_common_attach()
2812 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_LOST); in aac_common_attach()
2817 if (aac_check_firmware(softs) == AACERR) { in aac_common_attach()
2818 aac_fm_ereport(softs, DDI_FM_DEVICE_NO_RESPONSE); in aac_common_attach()
2819 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_LOST); in aac_common_attach()
2824 if (aac_register_intrs(softs) == AACERR) { in aac_common_attach()
2831 if (softs->comm_space_dma_handle == NULL) { in aac_common_attach()
2832 if (aac_alloc_comm_space(softs) != AACOK) in aac_common_attach()
2835 if (aac_setup_comm_space(softs) != AACOK) { in aac_common_attach()
2837 aac_fm_ereport(softs, DDI_FM_DEVICE_NO_RESPONSE); in aac_common_attach()
2838 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_LOST); in aac_common_attach()
2843 if (aac_get_fw_debug_buffer(softs) != AACOK) in aac_common_attach()
2848 if ((softs->total_slots == 0) && (aac_create_slots(softs) != AACOK)) { in aac_common_attach()
2852 AACDB_PRINT(softs, CE_NOTE, "%d slots allocated", softs->total_slots); in aac_common_attach()
2855 if (softs->total_fibs < softs->total_slots) { in aac_common_attach()
2856 aac_alloc_fibs(softs); in aac_common_attach()
2857 if (softs->total_fibs == 0) in aac_common_attach()
2859 AACDB_PRINT(softs, CE_NOTE, "%d fibs allocated", in aac_common_attach()
2860 softs->total_fibs); in aac_common_attach()
2863 AAC_STATUS_CLR(softs, ~0); /* Clear out all interrupts */ in aac_common_attach()
2864 AAC_ENABLE_INTR(softs); /* Enable the interrupts we can handle */ in aac_common_attach()
2866 if (aac_get_adapter_info(softs, NULL, &sinf) == AACOK) { in aac_common_attach()
2867 softs->feature_bits = sinf.FeatureBits; in aac_common_attach()
2868 softs->support_opt2 = sinf.SupportedOptions2; in aac_common_attach()
2871 if (CARD_IS_UNKNOWN(softs->card)) { in aac_common_attach()
2879 AACDB_PRINT(softs, CE_NOTE, "sinf.AdapterTypeText = " in aac_common_attach()
2898 (void *)strncpy(softs->vendor_name, p0, in aac_common_attach()
2900 (void *)strncpy(softs->product_name, p1, in aac_common_attach()
2906 (void *)strncpy(softs->product_name, in aac_common_attach()
2922 softs->vendor_name, softs->product_name, in aac_common_attach()
2923 softs->vendid, softs->devid, softs->subvendid, softs->subsysid, in aac_common_attach()
2924 softs->pci_mem_base_paddr); in aac_common_attach()
2927 if (aac_handle_adapter_config_issues(softs) != AACMPE_OK) { in aac_common_attach()
2929 aac_fm_ereport(softs, DDI_FM_DEVICE_NO_RESPONSE); in aac_common_attach()
2930 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_LOST); in aac_common_attach()
2935 if (aac_probe_containers(softs) != AACOK) { in aac_common_attach()
2942 if (softs->feature_bits & AAC_FEATURE_SUPPORTED_JBOD) { in aac_common_attach()
2943 if ((ddi_prop_lookup_string(DDI_DEV_T_ANY, softs->devinfo_p, in aac_common_attach()
2946 AACDB_PRINT(softs, CE_NOTE, in aac_common_attach()
2948 softs->flags |= AAC_FLAGS_JBOD; in aac_common_attach()
2955 if (softs->flags & (AAC_FLAGS_NONDASD | AAC_FLAGS_JBOD)) { in aac_common_attach()
2960 if (aac_get_bus_info(softs, &bus_max, &tgt_max) != AACOK) { in aac_common_attach()
2964 AACDB_PRINT(softs, CE_NOTE, "bus_max=%d, tgt_max=%d", in aac_common_attach()
2966 if (bus_max != softs->bus_max || tgt_max != softs->tgt_max) { in aac_common_attach()
2967 if (softs->state & AAC_STATE_RESET) { in aac_common_attach()
2972 softs->bus_max = bus_max; in aac_common_attach()
2973 softs->tgt_max = tgt_max; in aac_common_attach()
2974 if (softs->nondasds) { in aac_common_attach()
2975 kmem_free(softs->nondasds, AAC_MAX_PD(softs) * \ in aac_common_attach()
2978 softs->nondasds = kmem_zalloc(AAC_MAX_PD(softs) * \ in aac_common_attach()
2982 for (bus = 0; bus < softs->bus_max; bus++) { in aac_common_attach()
2983 for (tgt = 0; tgt < softs->tgt_max; tgt++) { in aac_common_attach()
2985 &softs->nondasds[index++]; in aac_common_attach()
2995 if (aac_check_dma_handle(softs->comm_space_dma_handle) != DDI_SUCCESS) { in aac_common_attach()
2996 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_LOST); in aac_common_attach()
3000 if (aac_check_acc_handle(softs->pci_mem_handle) != DDI_SUCCESS) { in aac_common_attach()
3001 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_LOST); in aac_common_attach()
3005 for (i = 0; i < softs->total_slots; i++) { in aac_common_attach()
3006 if (aac_check_dma_handle(softs->io_slot[i].fib_dma_handle) != in aac_common_attach()
3008 ddi_fm_service_impact(softs->devinfo_p, in aac_common_attach()
3016 if (softs->state & AAC_STATE_RESET) in aac_common_attach()
3018 if (softs->nondasds) { in aac_common_attach()
3019 kmem_free(softs->nondasds, AAC_MAX_PD(softs) * \ in aac_common_attach()
3021 softs->nondasds = NULL; in aac_common_attach()
3023 if (softs->total_fibs > 0) in aac_common_attach()
3024 aac_destroy_fibs(softs); in aac_common_attach()
3025 if (softs->total_slots > 0) in aac_common_attach()
3026 aac_destroy_slots(softs); in aac_common_attach()
3027 if (softs->comm_space_dma_handle) in aac_common_attach()
3028 aac_free_comm_space(softs); in aac_common_attach()
3036 aac_common_detach(struct aac_softstate *softs) in aac_common_detach() argument
3038 DBCALLED(softs, 1); in aac_common_detach()
3040 aac_unregister_intrs(softs); in aac_common_detach()
3042 mutex_enter(&softs->io_lock); in aac_common_detach()
3043 (void) aac_shutdown(softs); in aac_common_detach()
3045 if (softs->nondasds) { in aac_common_detach()
3046 kmem_free(softs->nondasds, AAC_MAX_PD(softs) * \ in aac_common_detach()
3048 softs->nondasds = NULL; in aac_common_detach()
3050 aac_destroy_fibs(softs); in aac_common_detach()
3051 aac_destroy_slots(softs); in aac_common_detach()
3052 aac_free_comm_space(softs); in aac_common_detach()
3053 mutex_exit(&softs->io_lock); in aac_common_detach()
3061 aac_sync_mbcommand(struct aac_softstate *softs, uint32_t cmd, in aac_sync_mbcommand() argument
3072 AAC_MAILBOX_SET(softs, cmd, arg0, arg1, arg2, arg3); in aac_sync_mbcommand()
3075 AAC_STATUS_CLR(softs, AAC_DB_SYNC_COMMAND); in aac_sync_mbcommand()
3078 AAC_NOTIFY(softs, AAC_DB_SYNC_COMMAND); in aac_sync_mbcommand()
3082 AAC_BUSYWAIT(AAC_STATUS_GET(softs) & AAC_DB_SYNC_COMMAND, timeout); in aac_sync_mbcommand()
3084 AACDB_PRINT(softs, CE_WARN, in aac_sync_mbcommand()
3086 AAC_IMMEDIATE_TIMEOUT, AAC_FWSTATUS_GET(softs)); in aac_sync_mbcommand()
3091 AAC_STATUS_CLR(softs, AAC_DB_SYNC_COMMAND); in aac_sync_mbcommand()
3094 status = AAC_MAILBOX_GET(softs, 0); in aac_sync_mbcommand()
3098 AACDB_PRINT(softs, CE_WARN, in aac_sync_mbcommand()
3110 aac_sync_fib(struct aac_softstate *softs, uint16_t cmd, uint16_t fibsize) in aac_sync_fib() argument
3112 struct aac_cmd *acp = &softs->sync_ac; in aac_sync_fib()
3115 if (softs->state & AAC_STATE_INTR) in aac_sync_fib()
3128 aac_cmd_fib_header(softs, acp, cmd); in aac_sync_fib()
3133 aac_start_io(softs, acp); in aac_sync_fib()
3135 if (softs->state & AAC_STATE_INTR) in aac_sync_fib()
3136 return (aac_do_sync_io(softs, acp)); in aac_sync_fib()
3138 return (aac_do_poll_io(softs, acp)); in aac_sync_fib()
3208 aac_fib_enqueue(struct aac_softstate *softs, int queue, uint32_t fib_addr, in aac_fib_enqueue() argument
3211 ddi_dma_handle_t dma = softs->comm_space_dma_handle; in aac_fib_enqueue()
3212 ddi_acc_handle_t acc = softs->comm_space_acc_handle; in aac_fib_enqueue()
3215 DBCALLED(softs, 2); in aac_fib_enqueue()
3220 (void) ddi_dma_sync(dma, (uintptr_t)softs->qtablep->qt_qindex[queue] - \ in aac_fib_enqueue()
3221 (uintptr_t)softs->comm_space, sizeof (uint32_t) * 2, in aac_fib_enqueue()
3224 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_UNAFFECTED); in aac_fib_enqueue()
3229 &softs->qtablep->qt_qindex[queue][AAC_PRODUCER_INDEX]); in aac_fib_enqueue()
3231 &softs->qtablep->qt_qindex[queue][AAC_CONSUMER_INDEX]); in aac_fib_enqueue()
3245 ddi_put32(acc, &((softs->qentries[queue] + pi)->aq_fib_size), fib_size); in aac_fib_enqueue()
3246 ddi_put32(acc, &((softs->qentries[queue] + pi)->aq_fib_addr), fib_addr); in aac_fib_enqueue()
3247 (void) ddi_dma_sync(dma, (uintptr_t)(softs->qentries[queue] + pi) - \ in aac_fib_enqueue()
3248 (uintptr_t)softs->comm_space, sizeof (struct aac_queue_entry), in aac_fib_enqueue()
3252 ddi_put32(acc, &softs->qtablep->qt_qindex[queue][AAC_PRODUCER_INDEX], in aac_fib_enqueue()
3255 (uintptr_t)&softs->qtablep->qt_qindex[queue][AAC_PRODUCER_INDEX] - \ in aac_fib_enqueue()
3256 (uintptr_t)softs->comm_space, sizeof (uint32_t), in aac_fib_enqueue()
3260 AAC_NOTIFY(softs, aac_qinfo[queue].notify); in aac_fib_enqueue()
3269 aac_fib_dequeue(struct aac_softstate *softs, int queue, int *idxp) in aac_fib_dequeue() argument
3271 ddi_acc_handle_t acc = softs->comm_space_acc_handle; in aac_fib_dequeue()
3272 ddi_dma_handle_t dma = softs->comm_space_dma_handle; in aac_fib_dequeue()
3276 DBCALLED(softs, 2); in aac_fib_dequeue()
3281 (void) ddi_dma_sync(dma, (uintptr_t)softs->qtablep->qt_qindex[queue] - \ in aac_fib_dequeue()
3282 (uintptr_t)softs->comm_space, sizeof (uint32_t) * 2, in aac_fib_dequeue()
3285 &softs->qtablep->qt_qindex[queue][AAC_PRODUCER_INDEX]); in aac_fib_dequeue()
3287 &softs->qtablep->qt_qindex[queue][AAC_CONSUMER_INDEX]); in aac_fib_dequeue()
3308 (void) ddi_dma_sync(dma, (uintptr_t)(softs->qentries[queue] + pi) - \ in aac_fib_dequeue()
3309 (uintptr_t)softs->comm_space, sizeof (struct aac_queue_entry), in aac_fib_dequeue()
3312 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_UNAFFECTED); in aac_fib_dequeue()
3320 &(softs->qentries[queue] + ci)->aq_fib_addr); in aac_fib_dequeue()
3326 &(softs->qentries[queue] + ci)->aq_fib_addr) / AAC_FIB_SIZE; in aac_fib_dequeue()
3335 ddi_put32(acc, &softs->qtablep->qt_qindex[queue][AAC_CONSUMER_INDEX], in aac_fib_dequeue()
3338 (uintptr_t)&softs->qtablep->qt_qindex[queue][AAC_CONSUMER_INDEX] - \ in aac_fib_dequeue()
3339 (uintptr_t)softs->comm_space, sizeof (uint32_t), in aac_fib_dequeue()
3343 AAC_NOTIFY(softs, aac_qinfo[queue].notify); in aac_fib_dequeue()
3348 aac_get_mntinfo(struct aac_softstate *softs, int cid) in aac_get_mntinfo() argument
3350 ddi_acc_handle_t acc = softs->sync_ac.slotp->fib_acc_handle; in aac_get_mntinfo()
3351 struct aac_fib *fibp = softs->sync_ac.slotp->fibp; in aac_get_mntinfo()
3356 (softs->flags & AAC_FLAGS_LBA_64BIT) ? in aac_get_mntinfo()
3361 if (aac_sync_fib(softs, ContainerCommand, in aac_get_mntinfo()
3363 AACDB_PRINT(softs, CE_WARN, "Error probe container %d", cid); in aac_get_mntinfo()
3374 aac_get_container_count(struct aac_softstate *softs, int *count) in aac_get_container_count() argument
3380 (void) aac_sync_fib_slot_bind(softs, &softs->sync_ac); in aac_get_container_count()
3381 acc = softs->sync_ac.slotp->fib_acc_handle; in aac_get_container_count()
3383 if ((mir = aac_get_mntinfo(softs, 0)) == NULL) { in aac_get_container_count()
3389 AACDB_PRINT(softs, CE_CONT, in aac_get_container_count()
3397 aac_sync_fib_slot_release(softs, &softs->sync_ac); in aac_get_container_count()
3402 aac_get_container_uid(struct aac_softstate *softs, uint32_t cid, uint32_t *uid) in aac_get_container_uid() argument
3404 ddi_acc_handle_t acc = softs->sync_ac.slotp->fib_acc_handle; in aac_get_container_uid()
3406 &softs->sync_ac.slotp->fibp->data[0]; in aac_get_container_uid()
3413 if (aac_sync_fib(softs, ContainerCommand, in aac_get_container_uid()
3427 aac_get_container_info(struct aac_softstate *softs, int cid) in aac_get_container_info() argument
3429 ddi_acc_handle_t acc = softs->sync_ac.slotp->fib_acc_handle; in aac_get_container_info()
3435 rval_uid = aac_get_container_uid(softs, cid, &uid); in aac_get_container_info()
3438 if ((mir = aac_get_mntinfo(softs, cid)) == NULL) { in aac_get_container_info()
3439 AACDB_PRINT(softs, CE_CONT, in aac_get_container_info()
3446 AACDB_PRINT(softs, CE_CONT, in aac_get_container_info()
3456 aac_probe_container(struct aac_softstate *softs, uint32_t cid) in aac_probe_container() argument
3459 struct aac_container *dvp = &softs->containers[cid]; in aac_probe_container()
3463 (void) aac_sync_fib_slot_bind(softs, &softs->sync_ac); in aac_probe_container()
3464 acc = softs->sync_ac.slotp->fib_acc_handle; in aac_probe_container()
3467 if ((mir = aac_get_container_info(softs, cid)) == NULL) { in aac_probe_container()
3474 AACDB_PRINT(softs, CE_NOTE, in aac_probe_container()
3486 size = AAC_MIR_SIZE(softs, acc, mir); in aac_probe_container()
3490 AACDB_PRINT(softs, CE_WARN, in aac_probe_container()
3497 AACDB_PRINT(softs, CE_NOTE, in aac_probe_container()
3504 AACDB_PRINT(softs, CE_NOTE, in aac_probe_container()
3526 aac_sync_fib_slot_release(softs, &softs->sync_ac); in aac_probe_container()
3535 aac_probe_containers(struct aac_softstate *softs) in aac_probe_containers() argument
3540 count = softs->container_count; in aac_probe_containers()
3541 if (aac_get_container_count(softs, &count) == AACERR) in aac_probe_containers()
3545 enum aac_cfg_event event = aac_probe_container(softs, i); in aac_probe_containers()
3548 (void) aac_handle_dr(softs, i, -1, event); in aac_probe_containers()
3553 if (count < softs->container_count) { in aac_probe_containers()
3556 for (dvp = &softs->containers[count]; in aac_probe_containers()
3557 dvp < &softs->containers[softs->container_count]; dvp++) { in aac_probe_containers()
3560 AACDB_PRINT(softs, CE_NOTE, ">>> Container %d deleted", in aac_probe_containers()
3563 (void) aac_handle_dr(softs, dvp->cid, -1, in aac_probe_containers()
3568 softs->container_count = count; in aac_probe_containers()
3569 AACDB_PRINT(softs, CE_CONT, "?Total %d container(s) found", total); in aac_probe_containers()
3574 aac_probe_jbod(struct aac_softstate *softs, int tgt, int event) in aac_probe_jbod() argument
3577 ASSERT(tgt < AAC_MAX_DEV(softs)); in aac_probe_jbod()
3579 dvp = AAC_DEV(softs, tgt); in aac_probe_jbod()
3583 AACDB_PRINT(softs, CE_NOTE, in aac_probe_jbod()
3589 AACDB_PRINT(softs, CE_NOTE, in aac_probe_jbod()
3596 (void) aac_handle_dr(softs, tgt, 0, event); in aac_probe_jbod()
3601 aac_alloc_comm_space(struct aac_softstate *softs) in aac_alloc_comm_space() argument
3609 softs->devinfo_p, in aac_alloc_comm_space()
3610 &softs->addr_dma_attr, in aac_alloc_comm_space()
3613 &softs->comm_space_dma_handle) != DDI_SUCCESS) { in aac_alloc_comm_space()
3614 AACDB_PRINT(softs, CE_WARN, in aac_alloc_comm_space()
3619 softs->comm_space_dma_handle, in aac_alloc_comm_space()
3621 &softs->acc_attr, in aac_alloc_comm_space()
3625 (caddr_t *)&softs->comm_space, in aac_alloc_comm_space()
3627 &softs->comm_space_acc_handle) != DDI_SUCCESS) { in aac_alloc_comm_space()
3628 AACDB_PRINT(softs, CE_WARN, in aac_alloc_comm_space()
3633 softs->comm_space_dma_handle, in aac_alloc_comm_space()
3635 (caddr_t)softs->comm_space, in aac_alloc_comm_space()
3642 AACDB_PRINT(softs, CE_WARN, in aac_alloc_comm_space()
3646 softs->comm_space_phyaddr = cookie.dmac_address; in aac_alloc_comm_space()
3650 if (softs->comm_space_acc_handle) { in aac_alloc_comm_space()
3651 ddi_dma_mem_free(&softs->comm_space_acc_handle); in aac_alloc_comm_space()
3652 softs->comm_space_acc_handle = NULL; in aac_alloc_comm_space()
3654 if (softs->comm_space_dma_handle) { in aac_alloc_comm_space()
3655 ddi_dma_free_handle(&softs->comm_space_dma_handle); in aac_alloc_comm_space()
3656 softs->comm_space_dma_handle = NULL; in aac_alloc_comm_space()
3662 aac_free_comm_space(struct aac_softstate *softs) in aac_free_comm_space() argument
3665 (void) ddi_dma_unbind_handle(softs->comm_space_dma_handle); in aac_free_comm_space()
3666 ddi_dma_mem_free(&softs->comm_space_acc_handle); in aac_free_comm_space()
3667 softs->comm_space_acc_handle = NULL; in aac_free_comm_space()
3668 ddi_dma_free_handle(&softs->comm_space_dma_handle); in aac_free_comm_space()
3669 softs->comm_space_dma_handle = NULL; in aac_free_comm_space()
3670 softs->comm_space_phyaddr = 0; in aac_free_comm_space()
3678 aac_setup_comm_space(struct aac_softstate *softs) in aac_setup_comm_space() argument
3680 ddi_dma_handle_t dma = softs->comm_space_dma_handle; in aac_setup_comm_space()
3681 ddi_acc_handle_t acc = softs->comm_space_acc_handle; in aac_setup_comm_space()
3686 comm_space_phyaddr = softs->comm_space_phyaddr; in aac_setup_comm_space()
3689 initp = &softs->comm_space->init_data; in aac_setup_comm_space()
3696 if (softs->flags & AAC_FLAGS_RAW_IO) { in aac_setup_comm_space()
3699 if (softs->flags & AAC_FLAGS_NEW_COMM) in aac_setup_comm_space()
3709 ddi_put32(acc, &initp->MaxIoCommands, softs->aac_max_fibs); in aac_setup_comm_space()
3711 (softs->aac_max_sectors << 9)); in aac_setup_comm_space()
3712 ddi_put32(acc, &initp->MaxFibSize, softs->aac_max_fib_size); in aac_setup_comm_space()
3739 softs->qtablep = (struct aac_queue_table *) \ in aac_setup_comm_space()
3740 ((char *)&softs->comm_space->qtable + qoffset); in aac_setup_comm_space()
3745 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3748 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3751 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3754 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3757 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3760 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3763 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3766 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3769 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3772 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3775 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3778 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3781 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3784 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3787 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3790 ddi_put32(acc, &softs->qtablep-> \ in aac_setup_comm_space()
3795 softs->qentries[AAC_HOST_NORM_CMD_Q] = in aac_setup_comm_space()
3796 &softs->qtablep->qt_HostNormCmdQueue[0]; in aac_setup_comm_space()
3797 softs->qentries[AAC_HOST_HIGH_CMD_Q] = in aac_setup_comm_space()
3798 &softs->qtablep->qt_HostHighCmdQueue[0]; in aac_setup_comm_space()
3799 softs->qentries[AAC_ADAP_NORM_CMD_Q] = in aac_setup_comm_space()
3800 &softs->qtablep->qt_AdapNormCmdQueue[0]; in aac_setup_comm_space()
3801 softs->qentries[AAC_ADAP_HIGH_CMD_Q] = in aac_setup_comm_space()
3802 &softs->qtablep->qt_AdapHighCmdQueue[0]; in aac_setup_comm_space()
3803 softs->qentries[AAC_HOST_NORM_RESP_Q] = in aac_setup_comm_space()
3804 &softs->qtablep->qt_HostNormRespQueue[0]; in aac_setup_comm_space()
3805 softs->qentries[AAC_HOST_HIGH_RESP_Q] = in aac_setup_comm_space()
3806 &softs->qtablep->qt_HostHighRespQueue[0]; in aac_setup_comm_space()
3807 softs->qentries[AAC_ADAP_NORM_RESP_Q] = in aac_setup_comm_space()
3808 &softs->qtablep->qt_AdapNormRespQueue[0]; in aac_setup_comm_space()
3809 softs->qentries[AAC_ADAP_HIGH_RESP_Q] = in aac_setup_comm_space()
3810 &softs->qtablep->qt_AdapHighRespQueue[0]; in aac_setup_comm_space()
3815 if (aac_sync_mbcommand(softs, AAC_MONKER_INITSTRUCT, in aac_setup_comm_space()
3819 AACDB_PRINT(softs, CE_WARN, in aac_setup_comm_space()
3828 aac_vendor_id(struct aac_softstate *softs, uchar_t *buf) in aac_vendor_id() argument
3831 bcopy(softs->vendor_name, buf, strlen(softs->vendor_name)); in aac_vendor_id()
3836 aac_product_id(struct aac_softstate *softs, uchar_t *buf) in aac_product_id() argument
3839 bcopy(softs->product_name, buf, strlen(softs->product_name)); in aac_product_id()
3847 aac_lun_serialno(struct aac_softstate *softs, int tgt, uchar_t *buf) in aac_lun_serialno() argument
3854 uid = softs->containers[tgt].uid; in aac_lun_serialno()
3867 aac_inquiry(struct aac_softstate *softs, struct scsi_pkt *pkt, in aac_inquiry() argument
3918 (void) aac_lun_serialno(softs, tgt, sp); in aac_inquiry()
3945 sp = aac_vendor_id(softs, sp); in aac_inquiry()
3946 sp = aac_product_id(softs, sp); in aac_inquiry()
3947 sp = aac_lun_serialno(softs, tgt, sp); in aac_inquiry()
3977 (void) aac_vendor_id(softs, (uchar_t *)inqp->inq_vid); in aac_inquiry()
3978 (void) aac_product_id(softs, (uchar_t *)inqp->inq_pid); in aac_inquiry()
3995 aac_mode_sense(struct aac_softstate *softs, struct scsi_pkt *pkt, in aac_mode_sense() argument
4036 if (softs->flags & AAC_FLAGS_LBA_64BIT) { in aac_mode_sense()
4044 if (softs->flags & AAC_FLAGS_LBA_64BIT) { in aac_mode_sense()
4113 softs->flags & AAC_FLAGS_LBA_64BIT) { in aac_mode_sense()
4154 struct aac_softstate *softs = AAC_TRAN2SOFTS(tran); in aac_tran_tgt_init() local
4156 int ctl = ddi_get_instance(softs->devinfo_p); in aac_tran_tgt_init()
4162 DBCALLED(softs, 2); in aac_tran_tgt_init()
4169 if (aac_find_child(softs, tgt, lun) != NULL) { in aac_tran_tgt_init()
4182 mutex_enter(&softs->io_lock); in aac_tran_tgt_init()
4183 if (tgt >= AAC_MAX_DEV(softs)) { in aac_tran_tgt_init()
4184 AACDB_PRINT_TRAN(softs, in aac_tran_tgt_init()
4186 mutex_exit(&softs->io_lock); in aac_tran_tgt_init()
4191 dvp = (struct aac_device *)&softs->containers[tgt]; in aac_tran_tgt_init()
4193 AACDB_PRINT_TRAN(softs, "aac_tran_tgt_init: c%dt%dL%d", in aac_tran_tgt_init()
4195 mutex_exit(&softs->io_lock); in aac_tran_tgt_init()
4203 if (softs->containers[tgt].dev.dip == NULL && in aac_tran_tgt_init()
4205 softs->containers[tgt].dev.dip = tgt_dip; in aac_tran_tgt_init()
4207 dvp = (struct aac_device *)&softs->nondasds[AAC_PD(tgt)]; in aac_tran_tgt_init()
4214 if (softs->nondasds[AAC_PD(tgt)].dev.dip == NULL && in aac_tran_tgt_init()
4216 softs->nondasds[AAC_PD(tgt)].dev.dip = tgt_dip; in aac_tran_tgt_init()
4219 if (softs->flags & AAC_FLAGS_BRKUP) { in aac_tran_tgt_init()
4227 AACDB_PRINT(softs, CE_NOTE, in aac_tran_tgt_init()
4230 mutex_exit(&softs->io_lock); in aac_tran_tgt_init()
4242 struct aac_softstate *softs = SD2AAC(sd); in aac_tran_tgt_free() local
4245 mutex_enter(&softs->io_lock); in aac_tran_tgt_free()
4247 if (softs->containers[tgt].dev.dip == tgt_dip) in aac_tran_tgt_free()
4248 softs->containers[tgt].dev.dip = NULL; in aac_tran_tgt_free()
4250 if (softs->nondasds[AAC_PD(tgt)].dev.dip == tgt_dip) in aac_tran_tgt_free()
4251 softs->nondasds[AAC_PD(tgt)].dev.dip = NULL; in aac_tran_tgt_free()
4252 softs->nondasds[AAC_PD(tgt)].dev.flags &= ~AAC_DFLAG_VALID; in aac_tran_tgt_free()
4254 mutex_exit(&softs->io_lock); in aac_tran_tgt_free()
4265 aac_check_adapter_health(struct aac_softstate *softs) in aac_check_adapter_health() argument
4269 rval = PCI_MEM_GET32(softs, AAC_OMR0); in aac_check_adapter_health()
4284 aac_abort_iocmd(struct aac_softstate *softs, struct aac_cmd *acp, in aac_abort_iocmd() argument
4296 AACDB_PRINT(softs, CE_NOTE, "CMD_TIMEOUT: acp=0x%p", in aac_abort_iocmd()
4298 aac_set_pkt_reason(softs, acp, CMD_TIMEOUT, in aac_abort_iocmd()
4303 AACDB_PRINT(softs, CE_NOTE, "CMD_RESET: acp=0x%p", acp); in aac_abort_iocmd()
4304 aac_set_pkt_reason(softs, acp, CMD_RESET, in aac_abort_iocmd()
4308 AACDB_PRINT(softs, CE_NOTE, "CMD_ABORTED: acp=0x%p", in aac_abort_iocmd()
4310 aac_set_pkt_reason(softs, acp, CMD_ABORTED, in aac_abort_iocmd()
4315 aac_end_io(softs, acp); in aac_abort_iocmd()
4323 aac_abort_iocmds(struct aac_softstate *softs, int iocmd, struct scsi_pkt *pkt, in aac_abort_iocmds() argument
4346 if (AAC_DEV_IS_VALID(&softs->containers[i].dev)) in aac_abort_iocmds()
4347 softs->containers[i].reset = 1; in aac_abort_iocmds()
4349 while ((acp = softs->q_busy.q_head) != NULL) in aac_abort_iocmds()
4350 aac_abort_iocmd(softs, acp, reason); in aac_abort_iocmds()
4357 aac_abort_iocmd(softs, ac_arg, reason); in aac_abort_iocmds()
4359 while ((acp = softs->q_wait[i].q_head) != NULL) in aac_abort_iocmds()
4360 aac_abort_iocmd(softs, acp, reason); in aac_abort_iocmds()
4373 struct aac_softstate *softs = arg; in aac_check_drain() local
4375 mutex_enter(&softs->io_lock); in aac_check_drain()
4376 if (softs->ndrains) { in aac_check_drain()
4377 softs->drain_timeid = 0; in aac_check_drain()
4382 if ((softs->bus_throttle[AAC_CMDQ_ASYNC] > 0 || in aac_check_drain()
4383 softs->bus_ncmds[AAC_CMDQ_ASYNC] == 0) && in aac_check_drain()
4384 (softs->bus_throttle[AAC_CMDQ_SYNC] > 0 || in aac_check_drain()
4385 softs->bus_ncmds[AAC_CMDQ_SYNC] == 0)) in aac_check_drain()
4386 cv_broadcast(&softs->drain_cv); in aac_check_drain()
4388 softs->drain_timeid = timeout(aac_check_drain, softs, in aac_check_drain()
4391 mutex_exit(&softs->io_lock); in aac_check_drain()
4399 aac_start_drain(struct aac_softstate *softs) in aac_start_drain() argument
4401 if (softs->ndrains == 0) { in aac_start_drain()
4402 ASSERT(softs->drain_timeid == 0); in aac_start_drain()
4403 softs->drain_timeid = timeout(aac_check_drain, softs, in aac_start_drain()
4406 softs->ndrains++; in aac_start_drain()
4414 aac_stop_drain(struct aac_softstate *softs) in aac_stop_drain() argument
4416 softs->ndrains--; in aac_stop_drain()
4417 if (softs->ndrains == 0) { in aac_stop_drain()
4418 if (softs->drain_timeid != 0) { in aac_stop_drain()
4419 timeout_id_t tid = softs->drain_timeid; in aac_stop_drain()
4421 softs->drain_timeid = 0; in aac_stop_drain()
4422 mutex_exit(&softs->io_lock); in aac_stop_drain()
4424 mutex_enter(&softs->io_lock); in aac_stop_drain()
4439 aac_reset_adapter(struct aac_softstate *softs) in aac_reset_adapter() argument
4445 DBCALLED(softs, 1); in aac_reset_adapter()
4447 ASSERT(softs->state & AAC_STATE_RESET); in aac_reset_adapter()
4449 ddi_fm_acc_err_clear(softs->pci_mem_handle, DDI_FME_VER0); in aac_reset_adapter()
4451 AAC_DISABLE_INTR(softs); in aac_reset_adapter()
4453 health = aac_check_adapter_health(softs); in aac_reset_adapter()
4455 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_LOST); in aac_reset_adapter()
4459 (void) aac_shutdown(softs); in aac_reset_adapter()
4462 if ((aac_sync_mbcommand(softs, AAC_IOP_RESET, 0, 0, 0, 0, in aac_reset_adapter()
4479 PCI_MEM_PUT32(softs, AAC_IRCSR, AAC_IRCSR_CORES_RST); in aac_reset_adapter()
4497 (void) aac_sync_fib_slot_bind(softs, &softs->sync_ac); in aac_reset_adapter()
4498 acc = softs->sync_ac.slotp->fib_acc_handle; in aac_reset_adapter()
4500 fibp = softs->sync_ac.slotp->fibp; in aac_reset_adapter()
4510 (void) aac_sync_fib(softs, ContainerCommand, in aac_reset_adapter()
4512 aac_sync_fib_slot_release(softs, &softs->sync_ac); in aac_reset_adapter()
4514 if (aac_check_adapter_health(softs) != 0) in aac_reset_adapter()
4515 ddi_fm_service_impact(softs->devinfo_p, in aac_reset_adapter()
4531 if (aac_common_attach(softs) != AACOK) in aac_reset_adapter()
4537 AAC_ENABLE_INTR(softs); in aac_reset_adapter()
4542 aac_set_throttle(struct aac_softstate *softs, struct aac_device *dvp, int q, in aac_set_throttle() argument
4549 if ((softs->state & AAC_STATE_QUIESCED) || softs->ndrains) in aac_set_throttle()
4555 aac_hold_bus(struct aac_softstate *softs, int iocmds) in aac_hold_bus() argument
4562 softs->bus_throttle[q] = 0; in aac_hold_bus()
4564 aac_set_throttle(softs, in aac_hold_bus()
4565 &softs->containers[i].dev, q, 0); in aac_hold_bus()
4566 for (i = 0; i < AAC_MAX_PD(softs); i++) in aac_hold_bus()
4567 aac_set_throttle(softs, in aac_hold_bus()
4568 &softs->nondasds[i].dev, q, 0); in aac_hold_bus()
4574 aac_unhold_bus(struct aac_softstate *softs, int iocmds) in aac_unhold_bus() argument
4585 if (q == AAC_CMDQ_ASYNC && ((softs->state & in aac_unhold_bus()
4586 AAC_STATE_QUIESCED) || softs->ndrains)) in aac_unhold_bus()
4589 max_throttle = softs->total_slots - in aac_unhold_bus()
4592 max_throttle = softs->total_slots - 1; in aac_unhold_bus()
4593 softs->bus_throttle[q] = max_throttle; in aac_unhold_bus()
4595 aac_set_throttle(softs, in aac_unhold_bus()
4596 &softs->containers[i].dev, in aac_unhold_bus()
4598 for (i = 0; i < AAC_MAX_PD(softs); i++) in aac_unhold_bus()
4599 aac_set_throttle(softs, &softs->nondasds[i].dev, in aac_unhold_bus()
4606 aac_do_reset(struct aac_softstate *softs) in aac_do_reset() argument
4611 softs->state |= AAC_STATE_RESET; in aac_do_reset()
4612 health = aac_check_adapter_health(softs); in aac_do_reset()
4619 int sync_cmds = softs->bus_ncmds[AAC_CMDQ_SYNC]; in aac_do_reset()
4620 int async_cmds = softs->bus_ncmds[AAC_CMDQ_ASYNC]; in aac_do_reset()
4633 aac_hold_bus(softs, AAC_IOCMD_SYNC | AAC_IOCMD_ASYNC); in aac_do_reset()
4638 intr_handler = (softs->flags & AAC_FLAGS_NEW_COMM) ? in aac_do_reset()
4640 while ((softs->bus_ncmds[AAC_CMDQ_SYNC] || in aac_do_reset()
4641 softs->bus_ncmds[AAC_CMDQ_ASYNC]) && timeout) { in aac_do_reset()
4643 (void) intr_handler(softs); in aac_do_reset()
4646 aac_unhold_bus(softs, AAC_IOCMD_SYNC | AAC_IOCMD_ASYNC); in aac_do_reset()
4648 if (softs->bus_ncmds[AAC_CMDQ_SYNC] == 0 && in aac_do_reset()
4649 softs->bus_ncmds[AAC_CMDQ_ASYNC] == 0) { in aac_do_reset()
4653 } else if (softs->bus_ncmds[AAC_CMDQ_SYNC] < sync_cmds || in aac_do_reset()
4654 softs->bus_ncmds[AAC_CMDQ_ASYNC] < async_cmds) { in aac_do_reset()
4665 if ((rval = aac_reset_adapter(softs)) == AAC_IOP_RESET_FAILED) in aac_do_reset()
4666 softs->state |= AAC_STATE_DEAD; in aac_do_reset()
4669 softs->state &= ~AAC_STATE_RESET; in aac_do_reset()
4676 struct aac_softstate *softs = AAC_TRAN2SOFTS(ap->a_hba_tran); in aac_tran_reset() local
4679 DBCALLED(softs, 1); in aac_tran_reset()
4686 mutex_enter(&softs->io_lock); in aac_tran_reset()
4687 switch (rval = aac_do_reset(softs)) { in aac_tran_reset()
4689 aac_abort_iocmds(softs, AAC_IOCMD_OUTSTANDING | AAC_IOCMD_ASYNC, in aac_tran_reset()
4691 aac_start_waiting_io(softs); in aac_tran_reset()
4695 aac_abort_iocmds(softs, AAC_IOCMD_ALL, NULL, CMD_RESET); in aac_tran_reset()
4698 aac_start_waiting_io(softs); in aac_tran_reset()
4700 mutex_exit(&softs->io_lock); in aac_tran_reset()
4702 aac_drain_comp_q(softs); in aac_tran_reset()
4709 struct aac_softstate *softs = AAC_TRAN2SOFTS(ap->a_hba_tran); in aac_tran_abort() local
4711 DBCALLED(softs, 1); in aac_tran_abort()
4713 mutex_enter(&softs->io_lock); in aac_tran_abort()
4714 aac_abort_iocmds(softs, 0, pkt, CMD_ABORTED); in aac_tran_abort()
4715 mutex_exit(&softs->io_lock); in aac_tran_abort()
4717 aac_drain_comp_q(softs); in aac_tran_abort()
4748 aac_unknown_scmd(struct aac_softstate *softs, struct aac_cmd *acp) in aac_unknown_scmd() argument
4750 AACDB_PRINT(softs, CE_CONT, "SCMD 0x%x not supported", in aac_unknown_scmd()
4754 aac_soft_callback(softs, acp); in aac_unknown_scmd()
4761 aac_tran_start_ld(struct aac_softstate *softs, struct aac_cmd *acp) in aac_tran_start_ld() argument
4777 aac_inquiry(softs, pkt, cdbp, bp); in aac_tran_start_ld()
4778 aac_soft_callback(softs, acp); in aac_tran_start_ld()
4802 aac_soft_callback(softs, acp); in aac_tran_start_ld()
4824 aac_soft_callback(softs, acp); in aac_tran_start_ld()
4826 aac_unknown_scmd(softs, acp); in aac_tran_start_ld()
4833 if (softs->flags & AAC_FLAGS_RAW_IO) { in aac_tran_start_ld()
4840 AACDB_PRINT(softs, CE_WARN, "64-bit LBA not supported"); in aac_tran_start_ld()
4841 aac_unknown_scmd(softs, acp); in aac_tran_start_ld()
4871 rval = aac_do_io(softs, acp); in aac_tran_start_ld()
4881 aac_soft_callback(softs, acp); in aac_tran_start_ld()
4886 aac_soft_callback(softs, acp); in aac_tran_start_ld()
4902 aac_mode_sense(softs, pkt, cdbp, bp, capacity); in aac_tran_start_ld()
4903 aac_soft_callback(softs, acp); in aac_tran_start_ld()
4909 if (softs->support_opt2 & AAC_SUPPORTED_POWER_MANAGEMENT) { in aac_tran_start_ld()
4912 rval = aac_do_io(softs, acp); in aac_tran_start_ld()
4928 aac_soft_callback(softs, acp); in aac_tran_start_ld()
4936 rval = aac_do_io(softs, acp); in aac_tran_start_ld()
4942 aac_soft_callback(softs, acp); in aac_tran_start_ld()
4947 aac_unknown_scmd(softs, acp); in aac_tran_start_ld()
4958 struct aac_softstate *softs = AAC_TRAN2SOFTS(ap->a_hba_tran); in aac_tran_start() local
4963 DBCALLED(softs, 2); in aac_tran_start()
4988 ddi_fm_service_impact(softs->devinfo_p, in aac_tran_start()
4996 mutex_enter(&softs->io_lock); in aac_tran_start()
4997 AACDB_PRINT_SCMD(softs, acp); in aac_tran_start()
4999 !(softs->state & AAC_STATE_DEAD)) { in aac_tran_start()
5002 rval = aac_tran_start_ld(softs, acp); in aac_tran_start()
5006 rval = aac_do_io(softs, acp); in aac_tran_start()
5011 if (!(softs->state & AAC_STATE_DEAD)) { in aac_tran_start()
5012 AACDB_PRINT_TRAN(softs, in aac_tran_start()
5017 AACDB_PRINT(softs, CE_WARN, in aac_tran_start()
5025 mutex_exit(&softs->io_lock); in aac_tran_start()
5032 struct aac_softstate *softs = AAC_TRAN2SOFTS(ap->a_hba_tran); in aac_tran_getcap() local
5036 DBCALLED(softs, 2); in aac_tran_getcap()
5040 AACDB_PRINT(softs, CE_WARN, in aac_tran_getcap()
5045 mutex_enter(&softs->io_lock); in aac_tran_getcap()
5046 dvp = AAC_DEV(softs, ap->a_target); in aac_tran_getcap()
5048 mutex_exit(&softs->io_lock); in aac_tran_getcap()
5049 AACDB_PRINT_TRAN(softs, "Bad target t%dL%d to getcap", in aac_tran_getcap()
5063 rval = softs->dma_max; in aac_tran_getcap()
5069 mutex_exit(&softs->io_lock); in aac_tran_getcap()
5071 AACDB_PRINT_TRAN(softs, "GetCap> %s t%dL%d: rval=%d", in aac_tran_getcap()
5080 struct aac_softstate *softs = AAC_TRAN2SOFTS(ap->a_hba_tran); in aac_tran_setcap() local
5084 DBCALLED(softs, 2); in aac_tran_setcap()
5088 AACDB_PRINT(softs, CE_WARN, in aac_tran_setcap()
5093 mutex_enter(&softs->io_lock); in aac_tran_setcap()
5094 dvp = AAC_DEV(softs, ap->a_target); in aac_tran_setcap()
5096 mutex_exit(&softs->io_lock); in aac_tran_setcap()
5097 AACDB_PRINT_TRAN(softs, "Bad target t%dL%d to setcap", in aac_tran_setcap()
5115 mutex_exit(&softs->io_lock); in aac_tran_setcap()
5117 AACDB_PRINT_TRAN(softs, "SetCap> %s t%dL%d val=%d: rval=%d", in aac_tran_setcap()
5139 aac_cmd_dma_alloc(struct aac_softstate *softs, struct aac_cmd *acp, in aac_cmd_dma_alloc() argument
5159 AACDB_PRINT(softs, CE_WARN, in aac_cmd_dma_alloc()
5163 AACDB_PRINT(softs, CE_WARN, "Nothing to transfer"); in aac_cmd_dma_alloc()
5193 rval = ddi_dma_alloc_handle(softs->devinfo_p, in aac_cmd_dma_alloc()
5194 &softs->buf_dma_attr, cb, arg, in aac_cmd_dma_alloc()
5197 AACDB_PRINT(softs, CE_WARN, in aac_cmd_dma_alloc()
5212 AACDB_PRINT_TRAN(softs, in aac_cmd_dma_alloc()
5220 &softs->acc_attr, DDI_DMA_STREAMING, in aac_cmd_dma_alloc()
5224 AACDB_PRINT(softs, CE_NOTE, in aac_cmd_dma_alloc()
5245 AACDB_PRINT(softs, CE_WARN, in aac_cmd_dma_alloc()
5250 AACDB_PRINT_TRAN(softs, "buf bind, %d seg(s)", in aac_cmd_dma_alloc()
5256 AACDB_PRINT_TRAN(softs, "buf bind, %d seg(s)", in aac_cmd_dma_alloc()
5264 AACDB_PRINT(softs, CE_WARN, in aac_cmd_dma_alloc()
5270 AACDB_PRINT(softs, CE_WARN, in aac_cmd_dma_alloc()
5275 AACDB_PRINT(softs, CE_WARN, in aac_cmd_dma_alloc()
5281 AACDB_PRINT(softs, CE_WARN, in aac_cmd_dma_alloc()
5289 if (acp->left_cookien > softs->aac_sg_tablesize) { in aac_cmd_dma_alloc()
5290 AACDB_PRINT(softs, CE_NOTE, "large cookiec received %d", in aac_cmd_dma_alloc()
5304 AACDB_PRINT(softs, CE_WARN, in aac_cmd_dma_alloc()
5329 if (acp->bcount > softs->buf_dma_attr.dma_attr_maxxfer) { in aac_cmd_dma_alloc()
5330 AACDB_PRINT(softs, CE_NOTE, in aac_cmd_dma_alloc()
5352 AACDB_PRINT_TRAN(softs, in aac_cmd_dma_alloc()
5370 struct aac_softstate *softs = AAC_TRAN2SOFTS(ap->a_hba_tran); in aac_tran_init_pkt() local
5373 DBCALLED(softs, 2); in aac_tran_init_pkt()
5380 slen = (statuslen > softs->slen) ? statuslen : softs->slen; in aac_tran_init_pkt()
5381 pkt = scsi_hba_pkt_alloc(softs->devinfo_p, ap, cmdlen, in aac_tran_init_pkt()
5384 AACDB_PRINT(softs, CE_WARN, "Alloc scsi pkt failed"); in aac_tran_init_pkt()
5392 acp->dvp = &softs->containers[ap->a_target].dev; in aac_tran_init_pkt()
5393 acp->aac_cmd_fib = softs->aac_cmd_fib; in aac_tran_init_pkt()
5396 _NOTE(ASSUMING_PROTECTED(softs->nondasds)) in aac_tran_init_pkt()
5398 acp->dvp = &softs->nondasds[AAC_PD(ap->a_target)].dev; in aac_tran_init_pkt()
5399 acp->aac_cmd_fib = softs->aac_cmd_fib_scsi; in aac_tran_init_pkt()
5407 if (aac_cmd_dma_alloc(softs, acp, bp, flags, callback, arg) == AACOK) in aac_tran_init_pkt()
5447 aac_do_quiesce(struct aac_softstate *softs) in aac_do_quiesce() argument
5449 aac_hold_bus(softs, AAC_IOCMD_ASYNC); in aac_do_quiesce()
5450 if (softs->bus_ncmds[AAC_CMDQ_ASYNC]) { in aac_do_quiesce()
5451 aac_start_drain(softs); in aac_do_quiesce()
5453 if (cv_wait_sig(&softs->drain_cv, in aac_do_quiesce()
5454 &softs->io_lock) == 0) { in aac_do_quiesce()
5456 aac_stop_drain(softs); in aac_do_quiesce()
5457 aac_unhold_bus(softs, AAC_IOCMD_ASYNC); in aac_do_quiesce()
5458 aac_start_waiting_io(softs); in aac_do_quiesce()
5461 } while (softs->bus_ncmds[AAC_CMDQ_ASYNC]); in aac_do_quiesce()
5462 aac_stop_drain(softs); in aac_do_quiesce()
5465 softs->state |= AAC_STATE_QUIESCED; in aac_do_quiesce()
5472 struct aac_softstate *softs = AAC_DIP2SOFTS(dip); in aac_tran_quiesce() local
5475 DBCALLED(softs, 1); in aac_tran_quiesce()
5477 mutex_enter(&softs->io_lock); in aac_tran_quiesce()
5478 if (aac_do_quiesce(softs) == AACOK) in aac_tran_quiesce()
5482 mutex_exit(&softs->io_lock); in aac_tran_quiesce()
5487 aac_do_unquiesce(struct aac_softstate *softs) in aac_do_unquiesce() argument
5489 softs->state &= ~AAC_STATE_QUIESCED; in aac_do_unquiesce()
5490 aac_unhold_bus(softs, AAC_IOCMD_ASYNC); in aac_do_unquiesce()
5492 aac_start_waiting_io(softs); in aac_do_unquiesce()
5499 struct aac_softstate *softs = AAC_DIP2SOFTS(dip); in aac_tran_unquiesce() local
5502 DBCALLED(softs, 1); in aac_tran_unquiesce()
5504 mutex_enter(&softs->io_lock); in aac_tran_unquiesce()
5505 if (aac_do_unquiesce(softs) == AACOK) in aac_tran_unquiesce()
5509 mutex_exit(&softs->io_lock); in aac_tran_unquiesce()
5514 aac_hba_setup(struct aac_softstate *softs) in aac_hba_setup() argument
5519 hba_tran = scsi_hba_tran_alloc(softs->devinfo_p, SCSI_HBA_CANSLEEP); in aac_hba_setup()
5522 hba_tran->tran_hba_private = softs; in aac_hba_setup()
5538 rval = scsi_hba_attach_setup(softs->devinfo_p, &softs->buf_dma_attr, in aac_hba_setup()
5542 AACDB_PRINT(softs, CE_WARN, "aac_hba_setup failed"); in aac_hba_setup()
5546 softs->hba_tran = hba_tran; in aac_hba_setup()
5558 aac_cmd_fib_header(struct aac_softstate *softs, struct aac_cmd *acp, in aac_cmd_fib_header() argument
5583 ddi_put16(acc, &fibp->Header.SenderSize, softs->aac_max_fib_size); in aac_cmd_fib_header()
5593 aac_cmd_fib_rawio(struct aac_softstate *softs, struct aac_cmd *acp) in aac_cmd_fib_rawio() argument
5605 aac_cmd_fib_header(softs, acp, RawIo); in aac_cmd_fib_rawio()
5633 aac_cmd_fib_brw64(struct aac_softstate *softs, struct aac_cmd *acp) in aac_cmd_fib_brw64() argument
5645 aac_cmd_fib_header(softs, acp, ContainerCommand64); in aac_cmd_fib_brw64()
5673 aac_cmd_fib_brw(struct aac_softstate *softs, struct aac_cmd *acp) in aac_cmd_fib_brw() argument
5701 aac_cmd_fib_header(softs, acp, ContainerCommand); in aac_cmd_fib_brw()
5722 aac_cmd_fib_copy(struct aac_softstate *softs, struct aac_cmd *acp) in aac_cmd_fib_copy() argument
5736 aac_cmd_fib_sync(struct aac_softstate *softs, struct aac_cmd *acp) in aac_cmd_fib_sync() argument
5744 aac_cmd_fib_header(softs, acp, ContainerCommand); in aac_cmd_fib_sync()
5756 aac_cmd_fib_startstop(struct aac_softstate *softs, struct aac_cmd *acp) in aac_cmd_fib_startstop() argument
5765 aac_cmd_fib_header(softs, acp, ContainerCommand); in aac_cmd_fib_startstop()
5813 aac_cmd_fib_scsi32(struct aac_softstate *softs, struct aac_cmd *acp) in aac_cmd_fib_scsi32() argument
5825 aac_cmd_fib_header(softs, acp, ScsiPortCommand); in aac_cmd_fib_scsi32()
5840 aac_cmd_fib_scsi64(struct aac_softstate *softs, struct aac_cmd *acp) in aac_cmd_fib_scsi64() argument
5852 aac_cmd_fib_header(softs, acp, ScsiPortCommandU64); in aac_cmd_fib_scsi64()
5869 aac_cmd_slot_bind(struct aac_softstate *softs, struct aac_cmd *acp) in aac_cmd_slot_bind() argument
5873 if (slotp = aac_get_slot(softs)) { in aac_cmd_slot_bind()
5876 acp->aac_cmd_fib(softs, acp); in aac_cmd_slot_bind()
5885 aac_bind_io(struct aac_softstate *softs, struct aac_cmd *acp) in aac_bind_io() argument
5890 if (softs->bus_ncmds[q] < softs->bus_throttle[q]) { in aac_bind_io()
5895 return (aac_cmd_slot_bind(softs, acp)); in aac_bind_io()
5898 aac_set_throttle(softs, dvp, AAC_CMDQ_ASYNC, in aac_bind_io()
5902 return (aac_cmd_slot_bind(softs, acp)); in aac_bind_io()
5909 aac_sync_fib_slot_bind(struct aac_softstate *softs, struct aac_cmd *acp) in aac_sync_fib_slot_bind() argument
5913 while (softs->sync_ac.slotp) in aac_sync_fib_slot_bind()
5914 cv_wait(&softs->sync_fib_cv, &softs->io_lock); in aac_sync_fib_slot_bind()
5916 if (slotp = aac_get_slot(softs)) { in aac_sync_fib_slot_bind()
5927 aac_sync_fib_slot_release(struct aac_softstate *softs, struct aac_cmd *acp) in aac_sync_fib_slot_release() argument
5931 aac_release_slot(softs, acp->slotp); in aac_sync_fib_slot_release()
5935 cv_signal(&softs->sync_fib_cv); in aac_sync_fib_slot_release()
5939 aac_start_io(struct aac_softstate *softs, struct aac_cmd *acp) in aac_start_io() argument
5955 softs->bus_ncmds[q]++; in aac_start_io()
5956 aac_cmd_enqueue(&softs->q_busy, acp); in aac_start_io()
5958 AACDB_PRINT_FIB(softs, slotp); in aac_start_io()
5960 if (softs->flags & AAC_FLAGS_NEW_COMM) { in aac_start_io()
5961 rval = aac_send_command(softs, slotp); in aac_start_io()
5967 rval = aac_fib_enqueue(softs, AAC_ADAP_NORM_CMD_Q, in aac_start_io()
5972 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_UNAFFECTED); in aac_start_io()
5979 AACDB_PRINT(softs, CE_NOTE, "SCMD send failed"); in aac_start_io()
5982 aac_set_pkt_reason(softs, acp, CMD_INCOMPLETE, 0); in aac_start_io()
5984 aac_end_io(softs, acp); in aac_start_io()
5986 ddi_trigger_softintr(softs->softint_id); in aac_start_io()
5991 aac_start_waitq(struct aac_softstate *softs, struct aac_cmd_queue *q) in aac_start_waitq() argument
5998 if (aac_bind_io(softs, acp) == AACOK) { in aac_start_waitq()
6000 aac_start_io(softs, acp); in aac_start_waitq()
6002 if (softs->free_io_slot_head == NULL) in aac_start_waitq()
6008 aac_start_waiting_io(struct aac_softstate *softs) in aac_start_waiting_io() argument
6014 if (softs->q_wait[AAC_CMDQ_SYNC].q_head) in aac_start_waiting_io()
6015 aac_start_waitq(softs, &softs->q_wait[AAC_CMDQ_SYNC]); in aac_start_waiting_io()
6016 if (softs->q_wait[AAC_CMDQ_ASYNC].q_head) in aac_start_waiting_io()
6017 aac_start_waitq(softs, &softs->q_wait[AAC_CMDQ_ASYNC]); in aac_start_waiting_io()
6021 aac_drain_comp_q(struct aac_softstate *softs) in aac_drain_comp_q() argument
6028 mutex_enter(&softs->q_comp_mutex); in aac_drain_comp_q()
6029 acp = aac_cmd_dequeue(&softs->q_comp); in aac_drain_comp_q()
6030 mutex_exit(&softs->q_comp_mutex); in aac_drain_comp_q()
6043 softs->devinfo_p, in aac_drain_comp_q()
6049 if ((aac_check_acc_handle(softs-> \ in aac_drain_comp_q()
6051 (aac_check_acc_handle(softs-> \ in aac_drain_comp_q()
6053 ddi_fm_service_impact(softs->devinfo_p, in aac_drain_comp_q()
6055 ddi_fm_acc_err_clear(softs-> \ in aac_drain_comp_q()
6060 if (aac_check_dma_handle(softs-> \ in aac_drain_comp_q()
6062 ddi_fm_service_impact(softs->devinfo_p, in aac_drain_comp_q()
6076 aac_alloc_fib(struct aac_softstate *softs, struct aac_slot *slotp) in aac_alloc_fib() argument
6084 softs->devinfo_p, in aac_alloc_fib()
6085 &softs->addr_dma_attr, in aac_alloc_fib()
6089 AACDB_PRINT(softs, CE_WARN, in aac_alloc_fib()
6095 softs->aac_max_fib_size, in aac_alloc_fib()
6096 &softs->acc_attr, in aac_alloc_fib()
6103 AACDB_PRINT(softs, CE_WARN, in aac_alloc_fib()
6111 softs->aac_max_fib_size, in aac_alloc_fib()
6117 AACDB_PRINT(softs, CE_WARN, in aac_alloc_fib()
6124 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_LOST); in aac_alloc_fib()
6130 ddi_fm_service_impact(softs->devinfo_p, DDI_SERVICE_LOST); in aac_alloc_fib()
6161 aac_alloc_fibs(struct aac_softstate *softs) in aac_alloc_fibs() argument
6166 for (i = 0; i < softs->total_slots && in aac_alloc_fibs()
6167 softs->total_fibs < softs->total_slots; i++) { in aac_alloc_fibs()
6168 slotp = &(softs->io_slot[i]); in aac_alloc_fibs()
6171 if (aac_alloc_fib(softs, slotp) != AACOK) in aac_alloc_fibs()
6175 aac_release_slot(softs, slotp); in aac_alloc_fibs()
6176 softs->total_fibs++; in aac_alloc_fibs()
6181 aac_destroy_fibs(struct aac_softstate *softs) in aac_destroy_fibs() argument
6185 while ((slotp = softs->free_io_slot_head) != NULL) { in aac_destroy_fibs()
6187 softs->free_io_slot_head = slotp->next; in aac_destroy_fibs()
6189 ASSERT(slotp->index == (slotp - softs->io_slot)); in aac_destroy_fibs()
6190 softs->total_fibs--; in aac_destroy_fibs()
6192 ASSERT(softs->total_fibs == 0); in aac_destroy_fibs()
6196 aac_create_slots(struct aac_softstate *softs) in aac_create_slots() argument
6200 softs->total_slots = softs->aac_max_fibs; in aac_create_slots()
6201 softs->io_slot = kmem_zalloc(sizeof (struct aac_slot) * \ in aac_create_slots()
6202 softs->total_slots, KM_SLEEP); in aac_create_slots()
6203 if (softs->io_slot == NULL) { in aac_create_slots()
6204 AACDB_PRINT(softs, CE_WARN, "Cannot allocate slot"); in aac_create_slots()
6207 for (i = 0; i < softs->total_slots; i++) in aac_create_slots()
6208 softs->io_slot[i].index = i; in aac_create_slots()
6209 softs->free_io_slot_head = NULL; in aac_create_slots()
6210 softs->total_fibs = 0; in aac_create_slots()
6215 aac_destroy_slots(struct aac_softstate *softs) in aac_destroy_slots() argument
6217 ASSERT(softs->free_io_slot_head == NULL); in aac_destroy_slots()
6219 kmem_free(softs->io_slot, sizeof (struct aac_slot) * \ in aac_destroy_slots()
6220 softs->total_slots); in aac_destroy_slots()
6221 softs->io_slot = NULL; in aac_destroy_slots()
6222 softs->total_slots = 0; in aac_destroy_slots()
6226 aac_get_slot(struct aac_softstate *softs) in aac_get_slot() argument
6230 if ((slotp = softs->free_io_slot_head) != NULL) { in aac_get_slot()
6231 softs->free_io_slot_head = slotp->next; in aac_get_slot()
6238 aac_release_slot(struct aac_softstate *softs, struct aac_slot *slotp) in aac_release_slot() argument
6240 ASSERT((slotp->index >= 0) && (slotp->index < softs->total_slots)); in aac_release_slot()
6241 ASSERT(slotp == &softs->io_slot[slotp->index]); in aac_release_slot()
6244 slotp->next = softs->free_io_slot_head; in aac_release_slot()
6245 softs->free_io_slot_head = slotp; in aac_release_slot()
6249 aac_do_io(struct aac_softstate *softs, struct aac_cmd *acp) in aac_do_io() argument
6251 if (aac_bind_io(softs, acp) == AACOK) in aac_do_io()
6252 aac_start_io(softs, acp); in aac_do_io()
6254 aac_cmd_enqueue(&softs->q_wait[AAC_CMDQ(acp)], acp); in aac_do_io()
6263 if (aac_do_poll_io(softs, acp) == AACOK) in aac_do_io()
6266 if (aac_do_sync_io(softs, acp) == AACOK) in aac_do_io()
6273 aac_do_poll_io(struct aac_softstate *softs, struct aac_cmd *acp) in aac_do_poll_io() argument
6280 intr_handler = (softs->flags & AAC_FLAGS_NEW_COMM) ? in aac_do_poll_io()
6285 AAC_BUSYWAIT((intr_handler(softs) != AAC_DB_RESPONSE_READY), i); in aac_do_poll_io()
6287 aac_cmd_timeout(softs, acp); in aac_do_poll_io()
6290 ddi_trigger_softintr(softs->softint_id); in aac_do_poll_io()
6298 aac_do_sync_io(struct aac_softstate *softs, struct aac_cmd *acp) in aac_do_sync_io() argument
6300 ASSERT(softs && acp); in aac_do_sync_io()
6303 cv_wait(&softs->event, &softs->io_lock); in aac_do_sync_io()
6342 aac_save_aif(struct aac_softstate *softs, ddi_acc_handle_t acc, in aac_save_aif() argument
6357 mutex_enter(&softs->aifq_mutex); in aac_save_aif()
6360 fibp = &softs->aifq[softs->aifq_idx].d; in aac_save_aif()
6365 if (aac_check_acc_handle(softs->pci_mem_handle) != DDI_SUCCESS) { in aac_save_aif()
6366 ddi_fm_service_impact(softs->devinfo_p, in aac_save_aif()
6368 mutex_exit(&softs->aifq_mutex); in aac_save_aif()
6372 AACDB_PRINT_AIF(softs, (struct aac_aif_command *)&fibp->data[0]); in aac_save_aif()
6375 current = softs->aifq_idx; in aac_save_aif()
6380 softs->aifq_wrap = 1; in aac_save_aif()
6381 for (ctx_p = softs->fibctx_p; ctx_p; ctx_p = ctx_p->next) { in aac_save_aif()
6391 softs->aifq_idx = next; in aac_save_aif()
6394 cv_broadcast(&softs->aifq_cv); in aac_save_aif()
6395 mutex_exit(&softs->aifq_mutex); in aac_save_aif()
6398 aac_event_disp(softs, AAC_EVENT_AIF); in aac_save_aif()
6402 aac_return_aif_common(struct aac_softstate *softs, struct aac_fib_context *ctx, in aac_return_aif_common() argument
6408 if (current == softs->aifq_idx && in aac_return_aif_common()
6412 *fibpp = &softs->aifq[current].d; in aac_return_aif_common()
6420 aac_return_aif(struct aac_softstate *softs, struct aac_fib_context *ctx, in aac_return_aif() argument
6425 mutex_enter(&softs->aifq_mutex); in aac_return_aif()
6426 rval = aac_return_aif_common(softs, ctx, fibpp); in aac_return_aif()
6427 mutex_exit(&softs->aifq_mutex); in aac_return_aif()
6432 aac_return_aif_wait(struct aac_softstate *softs, struct aac_fib_context *ctx, in aac_return_aif_wait() argument
6437 mutex_enter(&softs->aifq_mutex); in aac_return_aif_wait()
6438 rval = aac_return_aif_common(softs, ctx, fibpp); in aac_return_aif_wait()
6440 AACDB_PRINT(softs, CE_NOTE, "Waiting for AIF"); in aac_return_aif_wait()
6441 rval = cv_wait_sig(&softs->aifq_cv, &softs->aifq_mutex); in aac_return_aif_wait()
6443 mutex_exit(&softs->aifq_mutex); in aac_return_aif_wait()
6458 aac_handle_aif(struct aac_softstate *softs, struct aac_aif_command *aif) in aac_handle_aif() argument
6460 ddi_acc_handle_t acc = softs->comm_space_acc_handle; in aac_handle_aif()
6477 if (AAC_DEV_IS_VALID(&softs->containers[cid].dev)) in aac_handle_aif()
6478 softs->devcfg_wait_on = AifEnConfigChange; in aac_handle_aif()
6481 if (softs->devcfg_wait_on == en_type) in aac_handle_aif()
6491 softs->devcfg_wait_on = AifEnConfigChange; in aac_handle_aif()
6494 if (!softs->devcfg_wait_on) in aac_handle_aif()
6495 softs->devcfg_wait_on = AifEnConfigChange; in aac_handle_aif()
6503 if (!(softs->flags & AAC_FLAGS_JBOD)) in aac_handle_aif()
6510 if (!(softs->flags & AAC_FLAGS_JBOD)) in aac_handle_aif()
6517 if (softs->devcfg_wait_on == en_type) in aac_handle_aif()
6532 softs->devcfg_wait_on = AifEnContainerChange; in aac_handle_aif()
6535 softs->devcfg_wait_on = AifEnContainerChange; in aac_handle_aif()
6541 softs->devcfg_wait_on = 0; in aac_handle_aif()
6542 (void) aac_probe_containers(softs); in aac_handle_aif()
6547 (void) aac_probe_jbod(softs, in aac_handle_aif()
6548 AAC_P2VTGT(softs, bus_id, tgt_id), event); in aac_handle_aif()
6558 aac_aif_event(struct aac_softstate *softs) in aac_aif_event() argument
6564 if (aac_return_aif(softs, &softs->aifctx, &fibp) != 0) in aac_aif_event()
6568 if (softs->aifctx.ctx_overrun) { in aac_aif_event()
6569 softs->aifctx.ctx_overrun = 0; in aac_aif_event()
6580 (void) aac_handle_aif(softs, aifp); in aac_aif_event()
6589 aac_cmd_timeout(struct aac_softstate *softs, struct aac_cmd *acp) in aac_cmd_timeout() argument
6593 AACDB_PRINT(softs, CE_WARN, "acp %p timed out", acp); in aac_cmd_timeout()
6594 AACDB_PRINT_FIB(softs, acp->slotp); in aac_cmd_timeout()
6606 switch (aac_do_reset(softs)) { in aac_cmd_timeout()
6608 aac_abort_iocmds(softs, AAC_IOCMD_OUTSTANDING, NULL, CMD_RESET); in aac_cmd_timeout()
6609 aac_start_waiting_io(softs); in aac_cmd_timeout()
6613 aac_abort_iocmds(softs, AAC_IOCMD_ALL, NULL, CMD_TIMEOUT); in aac_cmd_timeout()
6616 aac_start_waiting_io(softs); in aac_cmd_timeout()
6627 aac_sync_tick(struct aac_softstate *softs) in aac_sync_tick() argument
6632 mutex_enter(&softs->time_mutex); in aac_sync_tick()
6633 ASSERT(softs->time_sync <= softs->timebase); in aac_sync_tick()
6634 softs->time_sync = 0; in aac_sync_tick()
6635 mutex_exit(&softs->time_mutex); in aac_sync_tick()
6638 (void) aac_sync_fib_slot_bind(softs, &softs->sync_ac); in aac_sync_tick()
6639 acc = softs->sync_ac.slotp->fib_acc_handle; in aac_sync_tick()
6641 ddi_put32(acc, (void *)&softs->sync_ac.slotp->fibp->data[0], in aac_sync_tick()
6643 rval = aac_sync_fib(softs, SendHostTime, AAC_FIB_SIZEOF(uint32_t)); in aac_sync_tick()
6644 aac_sync_fib_slot_release(softs, &softs->sync_ac); in aac_sync_tick()
6646 mutex_enter(&softs->time_mutex); in aac_sync_tick()
6647 softs->time_sync = softs->timebase; in aac_sync_tick()
6650 softs->time_sync += aac_tick << 1; in aac_sync_tick()
6652 softs->time_sync += AAC_SYNC_TICK; in aac_sync_tick()
6653 mutex_exit(&softs->time_mutex); in aac_sync_tick()
6660 aac_daemon(struct aac_softstate *softs) in aac_daemon() argument
6666 mutex_enter(&softs->time_mutex); in aac_daemon()
6667 ASSERT(softs->time_out <= softs->timebase); in aac_daemon()
6668 softs->time_out = 0; in aac_daemon()
6669 softs_timebase = softs->timebase; in aac_daemon()
6670 mutex_exit(&softs->time_mutex); in aac_daemon()
6678 for (acp = softs->q_busy.q_head; acp; acp = acp->next) { in aac_daemon()
6692 aac_cmd_timeout(softs, acp); in aac_daemon()
6702 mutex_enter(&softs->time_mutex); in aac_daemon()
6703 softs->time_out = softs->timebase + aac_tick; in aac_daemon()
6704 mutex_exit(&softs->time_mutex); in aac_daemon()
6712 aac_event_thread(struct aac_softstate *softs) in aac_event_thread() argument
6716 DBCALLED(softs, 1); in aac_event_thread()
6718 mutex_enter(&softs->ev_lock); in aac_event_thread()
6722 if ((events = softs->events) == 0) { in aac_event_thread()
6723 cv_wait(&softs->event_disp_cv, &softs->ev_lock); in aac_event_thread()
6724 events = softs->events; in aac_event_thread()
6726 softs->events = 0; in aac_event_thread()
6727 mutex_exit(&softs->ev_lock); in aac_event_thread()
6729 mutex_enter(&softs->io_lock); in aac_event_thread()
6730 if ((softs->state & AAC_STATE_RUN) && in aac_event_thread()
6731 (softs->state & AAC_STATE_DEAD) == 0) { in aac_event_thread()
6733 aac_daemon(softs); in aac_event_thread()
6735 aac_sync_tick(softs); in aac_event_thread()
6737 aac_aif_event(softs); in aac_event_thread()
6741 mutex_exit(&softs->io_lock); in aac_event_thread()
6743 mutex_enter(&softs->ev_lock); in aac_event_thread()
6746 cv_signal(&softs->event_wait_cv); in aac_event_thread()
6747 mutex_exit(&softs->ev_lock); in aac_event_thread()
6758 struct aac_softstate *softs = arg; in aac_timer() local
6761 mutex_enter(&softs->time_mutex); in aac_timer()
6764 if (softs->timeout_id) { in aac_timer()
6765 softs->timeout_id = timeout(aac_timer, (void *)softs, in aac_timer()
6768 mutex_exit(&softs->time_mutex); in aac_timer()
6773 softs->timebase += aac_tick; in aac_timer()
6776 if (softs->time_out && softs->time_out <= softs->timebase) in aac_timer()
6778 if (softs->time_sync && softs->time_sync <= softs->timebase) in aac_timer()
6781 mutex_exit(&softs->time_mutex); in aac_timer()
6784 aac_event_disp(softs, events); in aac_timer()
6791 aac_event_disp(struct aac_softstate *softs, int events) in aac_event_disp() argument
6793 mutex_enter(&softs->ev_lock); in aac_event_disp()
6794 softs->events |= events; in aac_event_disp()
6795 cv_broadcast(&softs->event_disp_cv); in aac_event_disp()
6796 mutex_exit(&softs->ev_lock); in aac_event_disp()
6803 aac_rx_get_fwstatus(struct aac_softstate *softs) in aac_rx_get_fwstatus() argument
6805 return (PCI_MEM_GET32(softs, AAC_OMR0)); in aac_rx_get_fwstatus()
6809 aac_rx_get_mailbox(struct aac_softstate *softs, int mb) in aac_rx_get_mailbox() argument
6811 return (PCI_MEM_GET32(softs, AAC_RX_MAILBOX + mb * 4)); in aac_rx_get_mailbox()
6815 aac_rx_set_mailbox(struct aac_softstate *softs, uint32_t cmd, in aac_rx_set_mailbox() argument
6818 PCI_MEM_PUT32(softs, AAC_RX_MAILBOX, cmd); in aac_rx_set_mailbox()
6819 PCI_MEM_PUT32(softs, AAC_RX_MAILBOX + 4, arg0); in aac_rx_set_mailbox()
6820 PCI_MEM_PUT32(softs, AAC_RX_MAILBOX + 8, arg1); in aac_rx_set_mailbox()
6821 PCI_MEM_PUT32(softs, AAC_RX_MAILBOX + 12, arg2); in aac_rx_set_mailbox()
6822 PCI_MEM_PUT32(softs, AAC_RX_MAILBOX + 16, arg3); in aac_rx_set_mailbox()
6826 aac_rkt_get_fwstatus(struct aac_softstate *softs) in aac_rkt_get_fwstatus() argument
6828 return (PCI_MEM_GET32(softs, AAC_OMR0)); in aac_rkt_get_fwstatus()
6832 aac_rkt_get_mailbox(struct aac_softstate *softs, int mb) in aac_rkt_get_mailbox() argument
6834 return (PCI_MEM_GET32(softs, AAC_RKT_MAILBOX + mb *4)); in aac_rkt_get_mailbox()
6838 aac_rkt_set_mailbox(struct aac_softstate *softs, uint32_t cmd, in aac_rkt_set_mailbox() argument
6841 PCI_MEM_PUT32(softs, AAC_RKT_MAILBOX, cmd); in aac_rkt_set_mailbox()
6842 PCI_MEM_PUT32(softs, AAC_RKT_MAILBOX + 4, arg0); in aac_rkt_set_mailbox()
6843 PCI_MEM_PUT32(softs, AAC_RKT_MAILBOX + 8, arg1); in aac_rkt_set_mailbox()
6844 PCI_MEM_PUT32(softs, AAC_RKT_MAILBOX + 12, arg2); in aac_rkt_set_mailbox()
6845 PCI_MEM_PUT32(softs, AAC_RKT_MAILBOX + 16, arg3); in aac_rkt_set_mailbox()
6854 struct aac_softstate *softs; in aac_open() local
6873 softs = ddi_get_soft_state(aac_softstatep, instance); in aac_open()
6874 if (softs == NULL) in aac_open()
6909 struct aac_softstate *softs; in aac_ioctl() local
6926 softs = ddi_get_soft_state(aac_softstatep, instance); in aac_ioctl()
6927 return (aac_do_ioctl(softs, dev, cmd, arg, flag)); in aac_ioctl()
6952 aac_fm_init(struct aac_softstate *softs) in aac_fm_init() argument
6959 softs->fm_capabilities = ddi_getprop(DDI_DEV_T_ANY, softs->devinfo_p, in aac_fm_init()
6965 if (softs->fm_capabilities) { in aac_fm_init()
6967 softs->reg_attr.devacc_attr_access = DDI_FLAGERR_ACC; in aac_fm_init()
6968 softs->addr_dma_attr.dma_attr_flags |= DDI_DMA_FLAGERR; in aac_fm_init()
6969 softs->buf_dma_attr.dma_attr_flags |= DDI_DMA_FLAGERR; in aac_fm_init()
6976 ddi_fm_init(softs->devinfo_p, &softs->fm_capabilities, &fm_ibc); in aac_fm_init()
6982 if (DDI_FM_EREPORT_CAP(softs->fm_capabilities) || in aac_fm_init()
6983 DDI_FM_ERRCB_CAP(softs->fm_capabilities)) { in aac_fm_init()
6984 pci_ereport_setup(softs->devinfo_p); in aac_fm_init()
6990 if (DDI_FM_ERRCB_CAP(softs->fm_capabilities)) { in aac_fm_init()
6991 ddi_fm_handler_register(softs->devinfo_p, in aac_fm_init()
6992 aac_fm_error_cb, (void *) softs); in aac_fm_init()
7002 aac_fm_fini(struct aac_softstate *softs) in aac_fm_fini() argument
7005 if (softs->fm_capabilities) { in aac_fm_fini()
7009 if (DDI_FM_ERRCB_CAP(softs->fm_capabilities)) { in aac_fm_fini()
7010 ddi_fm_handler_unregister(softs->devinfo_p); in aac_fm_fini()
7016 if (DDI_FM_EREPORT_CAP(softs->fm_capabilities) || in aac_fm_fini()
7017 DDI_FM_ERRCB_CAP(softs->fm_capabilities)) { in aac_fm_fini()
7018 pci_ereport_teardown(softs->devinfo_p); in aac_fm_fini()
7022 ddi_fm_fini(softs->devinfo_p); in aac_fm_fini()
7025 softs->reg_attr.devacc_attr_access = DDI_DEFAULT_ACC; in aac_fm_fini()
7026 softs->addr_dma_attr.dma_attr_flags &= ~DDI_DMA_FLAGERR; in aac_fm_fini()
7027 softs->buf_dma_attr.dma_attr_flags &= ~DDI_DMA_FLAGERR; in aac_fm_fini()
7050 aac_fm_ereport(struct aac_softstate *softs, char *detail) in aac_fm_ereport() argument
7057 if (DDI_FM_EREPORT_CAP(softs->fm_capabilities)) { in aac_fm_ereport()
7058 ddi_fm_ereport_post(softs->devinfo_p, buf, ena, DDI_NOSLEEP, in aac_fm_ereport()
7109 aac_find_child(struct aac_softstate *softs, uint16_t tgt, uint8_t lun) in aac_find_child() argument
7117 struct aac_device *dvp = &softs->containers[tgt].dev; in aac_find_child()
7123 for (child = ddi_get_child(softs->devinfo_p); in aac_find_child()
7140 aac_config_child(struct aac_softstate *softs, struct scsi_device *sd, in aac_config_child() argument
7153 DBCALLED(softs, 2); in aac_config_child()
7158 AACDB_PRINT(softs, CE_WARN, in aac_config_child()
7163 childname = (softs->legacy && dtype == DTYPE_DIRECT) ? "sd" : nodename; in aac_config_child()
7166 rval = ndi_devi_alloc(softs->devinfo_p, childname, DEVI_SID_NODEID, in aac_config_child()
7171 AACDB_PRINT(softs, CE_WARN, "unable to create " in aac_config_child()
7178 AACDB_PRINT(softs, CE_WARN, "unable to create " in aac_config_child()
7186 AACDB_PRINT(softs, CE_WARN, "unable to create " in aac_config_child()
7194 AACDB_PRINT(softs, CE_WARN, "unable to online t%dL%d", in aac_config_child()
7210 aac_probe_lun(struct aac_softstate *softs, struct scsi_device *sd) in aac_probe_lun() argument
7215 DBCALLED(softs, 2); in aac_probe_lun()
7221 mutex_enter(&softs->io_lock); in aac_probe_lun()
7222 event = aac_probe_container(softs, tgt); in aac_probe_lun()
7223 mutex_exit(&softs->io_lock); in aac_probe_lun()
7242 AACDB_PRINT(softs, CE_NOTE, in aac_probe_lun()
7250 if (!(softs->flags & AAC_FLAGS_NONDASD)) in aac_probe_lun()
7252 AACDB_PRINT(softs, CE_NOTE, "non-DASD %d found", tgt); in aac_probe_lun()
7255 if (!(softs->flags & AAC_FLAGS_JBOD) || qual != 0) in aac_probe_lun()
7257 AACDB_PRINT(softs, CE_NOTE, "JBOD DASD %d found", tgt); in aac_probe_lun()
7260 mutex_enter(&softs->io_lock); in aac_probe_lun()
7261 softs->nondasds[AAC_PD(tgt)].dev.flags |= AAC_DFLAG_VALID; in aac_probe_lun()
7262 mutex_exit(&softs->io_lock); in aac_probe_lun()
7268 aac_config_lun(struct aac_softstate *softs, uint16_t tgt, uint8_t lun, in aac_config_lun() argument
7275 DBCALLED(softs, 2); in aac_config_lun()
7277 if ((child = aac_find_child(softs, tgt, lun)) != NULL) { in aac_config_lun()
7284 sd.sd_address.a_hba_tran = softs->hba_tran; in aac_config_lun()
7287 if ((rval = aac_probe_lun(softs, &sd)) == NDI_SUCCESS) in aac_config_lun()
7288 rval = aac_config_child(softs, &sd, ldip); in aac_config_lun()
7298 aac_config_tgt(struct aac_softstate *softs, int tgt) in aac_config_tgt() argument
7308 ap.a_hba_tran = softs->hba_tran; in aac_config_tgt()
7380 AACDB_PRINT(softs, CE_WARN, in aac_config_tgt()
7384 if (aac_config_lun(softs, tgt, lun, &ldip) == in aac_config_tgt()
7394 if (aac_config_lun(softs, tgt, 0, &ldip) == NDI_SUCCESS) in aac_config_tgt()
7402 aac_devcfg(struct aac_softstate *softs, int tgt, int en) in aac_devcfg() argument
7406 mutex_enter(&softs->io_lock); in aac_devcfg()
7407 dvp = AAC_DEV(softs, tgt); in aac_devcfg()
7412 mutex_exit(&softs->io_lock); in aac_devcfg()
7419 struct aac_softstate *softs; in aac_tran_bus_config() local
7422 if ((softs = ddi_get_soft_state(aac_softstatep, in aac_tran_bus_config()
7427 mutex_enter(&softs->io_lock); in aac_tran_bus_config()
7428 if (softs->state & AAC_STATE_QUIESCED) { in aac_tran_bus_config()
7429 AACDB_PRINT(softs, CE_NOTE, in aac_tran_bus_config()
7431 mutex_exit(&softs->io_lock); in aac_tran_bus_config()
7434 mutex_exit(&softs->io_lock); in aac_tran_bus_config()
7436 DBCALLED(softs, 1); in aac_tran_bus_config()
7449 if (tgt >= AAC_MAX_DEV(softs)) { in aac_tran_bus_config()
7455 AAC_DEVCFG_BEGIN(softs, tgt); in aac_tran_bus_config()
7456 rval = aac_config_lun(softs, tgt, lun, childp); in aac_tran_bus_config()
7457 AAC_DEVCFG_END(softs, tgt); in aac_tran_bus_config()
7467 AAC_DEVCFG_BEGIN(softs, tgt); in aac_tran_bus_config()
7468 (void) aac_config_lun(softs, tgt, 0, NULL); in aac_tran_bus_config()
7469 AAC_DEVCFG_END(softs, tgt); in aac_tran_bus_config()
7475 for (bus = 0; bus < softs->bus_max; bus++) { in aac_tran_bus_config()
7476 AACDB_PRINT(softs, CE_NOTE, "bus %d:", bus); in aac_tran_bus_config()
7477 for (tgt = 0; tgt < softs->tgt_max; tgt++, index++) { in aac_tran_bus_config()
7478 AAC_DEVCFG_BEGIN(softs, index); in aac_tran_bus_config()
7479 if (aac_config_tgt(softs, index)) in aac_tran_bus_config()
7481 AAC_DEVCFG_END(softs, index); in aac_tran_bus_config()
7484 AACDB_PRINT(softs, CE_CONT, in aac_tran_bus_config()
7499 aac_handle_dr(struct aac_softstate *softs, int tgt, int lun, int event) in aac_handle_dr() argument
7505 DBCALLED(softs, 1); in aac_handle_dr()
7508 dvp = AAC_DEV(softs, tgt); in aac_handle_dr()
7511 if (!(softs->state & AAC_STATE_RUN)) in aac_handle_dr()
7513 mutex_exit(&softs->io_lock); in aac_handle_dr()
7520 ndi_devi_enter(softs->devinfo_p); in aac_handle_dr()
7521 (void) aac_config_lun(softs, tgt, 0, NULL); in aac_handle_dr()
7522 AACDB_PRINT(softs, CE_NOTE, "c%dt%dL%d onlined", in aac_handle_dr()
7523 softs->instance, tgt, lun); in aac_handle_dr()
7524 ndi_devi_exit(softs->devinfo_p); in aac_handle_dr()
7528 mutex_enter(&softs->io_lock); in aac_handle_dr()
7529 (void) aac_do_reset(softs); in aac_handle_dr()
7530 mutex_exit(&softs->io_lock); in aac_handle_dr()
7533 AACDB_PRINT(softs, CE_NOTE, "c%dt%dL%d offlined", in aac_handle_dr()
7534 softs->instance, tgt, lun); in aac_handle_dr()
7539 mutex_enter(&softs->io_lock); in aac_handle_dr()
7995 aac_get_fw_debug_buffer(struct aac_softstate *softs) in aac_get_fw_debug_buffer() argument
7997 if (aac_sync_mbcommand(softs, AAC_MONKER_GETDRVPROP, in aac_get_fw_debug_buffer()
7999 uint32_t mondrv_buf_paddrl = AAC_MAILBOX_GET(softs, 1); in aac_get_fw_debug_buffer()
8000 uint32_t mondrv_buf_paddrh = AAC_MAILBOX_GET(softs, 2); in aac_get_fw_debug_buffer()
8001 uint32_t mondrv_buf_size = AAC_MAILBOX_GET(softs, 3); in aac_get_fw_debug_buffer()
8002 uint32_t mondrv_hdr_size = AAC_MAILBOX_GET(softs, 4); in aac_get_fw_debug_buffer()
8006 softs->pci_mem_base_paddr; in aac_get_fw_debug_buffer()
8013 (offset + mondrv_buf_size < softs->map_size)) { in aac_get_fw_debug_buffer()
8015 softs->debug_buf_offset = offset; in aac_get_fw_debug_buffer()
8016 softs->debug_header_size = mondrv_hdr_size; in aac_get_fw_debug_buffer()
8017 softs->debug_buf_size = mondrv_buf_size; in aac_get_fw_debug_buffer()
8018 softs->debug_fw_flags = 0; in aac_get_fw_debug_buffer()
8019 softs->debug_flags &= ~AACDB_FLAGS_FW_PRINT; in aac_get_fw_debug_buffer()
8030 aac_dbflag_on(struct aac_softstate *softs, int flag) in aac_dbflag_on() argument
8032 int debug_flags = softs ? softs->debug_flags : aac_debug_flags; in aac_dbflag_on()
8039 aac_cmn_err(struct aac_softstate *softs, uint_t lev, char sl, int noheader) in aac_cmn_err() argument
8052 softs->vendor_name, softs->instance, in aac_cmn_err()
8056 softs->vendor_name, softs->instance, in aac_cmn_err()
8069 aac_printf(struct aac_softstate *softs, uint_t lev, const char *fmt, ...) in aac_printf() argument
8087 if (softs) { in aac_printf()
8088 if ((softs->debug_flags & AACDB_FLAGS_FW_PRINT) && in aac_printf()
8090 (softs->debug_buf_size)) { in aac_printf()
8095 if (count > softs->debug_buf_size) in aac_printf()
8096 count = (uint16_t)softs->debug_buf_size; in aac_printf()
8103 if (!PCI_MEM_GET32(softs, in aac_printf()
8104 softs->debug_buf_offset + \ in aac_printf()
8117 if (!PCI_MEM_GET32(softs, softs->debug_buf_offset + \ in aac_printf()
8119 PCI_MEM_REP_PUT8(softs, in aac_printf()
8120 softs->debug_buf_offset + \ in aac_printf()
8121 softs->debug_header_size, in aac_printf()
8123 PCI_MEM_PUT32(softs, in aac_printf()
8124 softs->debug_buf_offset + \ in aac_printf()
8126 softs->debug_fw_flags); in aac_printf()
8127 PCI_MEM_PUT32(softs, in aac_printf()
8128 softs->debug_buf_offset + \ in aac_printf()
8132 softs->debug_flags &= ~AACDB_FLAGS_FW_PRINT; in aac_printf()
8140 if (softs->debug_flags & AACDB_FLAGS_KERNEL_PRINT) in aac_printf()
8141 aac_cmn_err(softs, lev, sl, in aac_printf()
8142 (softs->debug_flags & AACDB_FLAGS_NO_HEADERS)); in aac_printf()
8146 aac_cmn_err(softs, lev, sl, 1); in aac_printf()
8167 aac_print_scmd(struct aac_softstate *softs, struct aac_cmd *acp) in aac_print_scmd() argument
8172 int ctl = ddi_get_instance(softs->devinfo_p); in aac_print_scmd()
8188 aac_printf(softs, CE_NOTE, in aac_print_scmd()
8197 aac_printf(softs, CE_NOTE, in aac_print_scmd()
8205 aac_printf(softs, CE_NOTE, in aac_print_scmd()
8213 aac_printf(softs, CE_NOTE, in aac_print_scmd()
8222 aac_printf(softs, CE_NOTE, in aac_print_scmd()
8229 aac_printf(softs, CE_NOTE, "SCMD> %s --> c%dt%dL%d %s", in aac_print_scmd()
8235 aac_print_fib(struct aac_softstate *softs, struct aac_slot *slotp) in aac_print_fib() argument
8247 if (!(softs->debug_fib_flags & acp->fib_flags)) in aac_print_fib()
8258 if (!(softs->debug_fib_flags & AACDB_FLAGS_FIB_SYNC)) in aac_print_fib()
8269 if (softs->debug_fib_flags & AACDB_FLAGS_FIB_HEADER) { in aac_print_fib()
8270 aac_printf(softs, CE_NOTE, "FIB> from %s", caller); in aac_print_fib()
8271 aac_printf(softs, CE_NOTE, " XferState %d", in aac_print_fib()
8273 aac_printf(softs, CE_NOTE, " Command %d", in aac_print_fib()
8275 aac_printf(softs, CE_NOTE, " StructType %d", in aac_print_fib()
8277 aac_printf(softs, CE_NOTE, " Flags 0x%x", in aac_print_fib()
8279 aac_printf(softs, CE_NOTE, " Size %d", in aac_print_fib()
8281 aac_printf(softs, CE_NOTE, " SenderSize %d", in aac_print_fib()
8283 aac_printf(softs, CE_NOTE, " SenderAddr 0x%x", in aac_print_fib()
8285 aac_printf(softs, CE_NOTE, " RcvrAddr 0x%x", in aac_print_fib()
8287 aac_printf(softs, CE_NOTE, " SenderData 0x%x", in aac_print_fib()
8315 aac_printf(softs, CE_NOTE, "FIB> %s (0x%x, 0x%x, 0x%x)", in aac_print_fib()
8341 aac_printf(softs, CE_NOTE, in aac_print_fib()
8347 aac_printf(softs, CE_NOTE, in aac_print_fib()
8373 aac_printf(softs, CE_NOTE, in aac_print_fib()
8381 aac_printf(softs, CE_NOTE, in aac_print_fib()
8396 aac_printf(softs, CE_NOTE, in aac_print_fib()
8404 aac_printf(softs, CE_NOTE, " %d: 0x%08x.%08x/%d", i, in aac_print_fib()
8429 aac_printf(softs, CE_NOTE, "FIB> %s, sz=%d", in aac_print_fib()
8432 aac_printf(softs, CE_NOTE, "FIB> %s, sz=%d", in aac_print_fib()
8435 aac_printf(softs, CE_NOTE, "FIB> %s: Unknown(0x%x), sz=%d", in aac_print_fib()
8438 aac_printf(softs, CE_NOTE, "FIB> Unknown(0x%x), sz=%d", in aac_print_fib()
8443 aac_print_aif(struct aac_softstate *softs, struct aac_aif_command *aif) in aac_print_aif() argument
8458 aac_printf(softs, CE_NOTE, "AIF! %s", str); in aac_print_aif()
8460 aac_printf(softs, CE_NOTE, "AIF! Unknown(0x%x)", in aac_print_aif()
8481 aac_printf(softs, CE_NOTE, in aac_print_aif()
8489 aac_printf(softs, CE_NOTE, "AIF! APIReport (%d)", in aac_print_aif()
8494 aac_printf(softs, CE_NOTE, "AIF! DriverNotify (%d)", in aac_print_aif()
8499 aac_printf(softs, CE_NOTE, "AIF! AIF %d (%d)", in aac_print_aif()