Lines Matching refs:softs
117 static void amr_done(struct amr_softs *softs);
124 static int amr_setup_mbox(struct amr_softs *softs);
125 static int amr_setup_sg(struct amr_softs *softs);
130 static int amr_query_controller(struct amr_softs *softs);
131 static void *amr_enquiry(struct amr_softs *softs, size_t bufsize,
133 static int amr_flush(struct amr_softs *softs);
138 static void amr_rw_command(struct amr_softs *softs,
309 struct amr_softs *softs; in amr_attach() local
333 softs = ddi_get_soft_state(amr_softstatep, instance); in amr_attach()
334 softs->state |= AMR_STATE_SOFT_STATE_SETUP; in amr_attach()
336 softs->dev_info_p = dev; in amr_attach()
339 (void *)softs, (void *)&(softs->amr_busyslots))); in amr_attach()
341 if (pci_config_setup(dev, &(softs->pciconfig_handle)) in amr_attach()
345 softs->state |= AMR_STATE_PCI_CONFIG_SETUP; in amr_attach()
348 &accattr, &(softs->regsmap_handle)); in amr_attach()
352 softs->state |= AMR_STATE_PCI_MEM_MAPPED; in amr_attach()
357 command = pci_config_get16(softs->pciconfig_handle, PCI_CONF_COMM); in amr_attach()
370 pci_config_put16(softs->pciconfig_handle, in amr_attach()
372 command = pci_config_get16(softs->pciconfig_handle, in amr_attach()
387 if (ddi_get_iblock_cookie(dev, 0, &softs->iblock_cookiep) in amr_attach()
392 mutex_init(&softs->cmd_mutex, NULL, MUTEX_DRIVER, in amr_attach()
393 softs->iblock_cookiep); /* should be used in interrupt */ in amr_attach()
394 mutex_init(&softs->queue_mutex, NULL, MUTEX_DRIVER, in amr_attach()
395 softs->iblock_cookiep); /* should be used in interrupt */ in amr_attach()
396 mutex_init(&softs->periodic_mutex, NULL, MUTEX_DRIVER, in amr_attach()
397 softs->iblock_cookiep); /* should be used in interrupt */ in amr_attach()
399 cv_init(&softs->cmd_cv, NULL, CV_DRIVER, NULL); in amr_attach()
400 softs->state |= AMR_STATE_KMUTEX_INITED; in amr_attach()
405 if (amr_setup_mbox(softs) != DDI_SUCCESS) in amr_attach()
407 softs->state |= AMR_STATE_MAILBOX_SETUP; in amr_attach()
409 if (amr_setup_sg(softs) != DDI_SUCCESS) in amr_attach()
412 softs->state |= AMR_STATE_SG_TABLES_SETUP; in amr_attach()
414 if (amr_query_controller(softs) != DDI_SUCCESS) in amr_attach()
423 if ((softs->amr_taskq = ddi_taskq_create(dev, "amr_taskq", in amr_attach()
424 MAX(softs->amr_nlogdrives, 1), TASKQ_DEFAULTPRI, 0)) == NULL) { in amr_attach()
427 softs->state |= AMR_STATE_TASKQ_SETUP; in amr_attach()
429 if (ddi_add_intr(dev, 0, &softs->iblock_cookiep, NULL, in amr_attach()
430 amr_intr, (caddr_t)softs) != DDI_SUCCESS) { in amr_attach()
433 softs->state |= AMR_STATE_INTR_SETUP; in amr_attach()
436 if (amr_setup_tran(softs->dev_info_p, softs) != DDI_SUCCESS) { in amr_attach()
440 softs->state |= AMR_STATE_TRAN_SETUP; in amr_attach()
443 mutex_enter(&softs->periodic_mutex); in amr_attach()
444 softs->timeout_t = timeout(amr_periodic, (void *)softs, in amr_attach()
446 softs->state |= AMR_STATE_TIMEOUT_ENABLED; in amr_attach()
447 mutex_exit(&softs->periodic_mutex); in amr_attach()
451 softs->amr_product_info.pi_product_name, in amr_attach()
452 softs->amr_product_info.pi_firmware_ver); in amr_attach()
455 AMR_QCLEAR_INTR(softs); in amr_attach()
459 if (softs->state & AMR_STATE_INTR_SETUP) { in amr_attach()
460 ddi_remove_intr(dev, 0, softs->iblock_cookiep); in amr_attach()
462 if (softs->state & AMR_STATE_TASKQ_SETUP) { in amr_attach()
463 ddi_taskq_destroy(softs->amr_taskq); in amr_attach()
465 if (softs->state & AMR_STATE_SG_TABLES_SETUP) { in amr_attach()
466 for (i = 0; i < softs->sg_max_count; i++) { in amr_attach()
468 softs->sg_items[i].sg_handle); in amr_attach()
470 &((softs->sg_items[i]).sg_acc_handle)); in amr_attach()
472 &(softs->sg_items[i].sg_handle)); in amr_attach()
475 if (softs->state & AMR_STATE_MAILBOX_SETUP) { in amr_attach()
476 (void) ddi_dma_unbind_handle(softs->mbox_dma_handle); in amr_attach()
477 (void) ddi_dma_mem_free(&softs->mbox_acc_handle); in amr_attach()
478 (void) ddi_dma_free_handle(&softs->mbox_dma_handle); in amr_attach()
480 if (softs->state & AMR_STATE_KMUTEX_INITED) { in amr_attach()
481 mutex_destroy(&softs->queue_mutex); in amr_attach()
482 mutex_destroy(&softs->cmd_mutex); in amr_attach()
483 mutex_destroy(&softs->periodic_mutex); in amr_attach()
484 cv_destroy(&softs->cmd_cv); in amr_attach()
486 if (softs->state & AMR_STATE_PCI_MEM_MAPPED) in amr_attach()
487 ddi_regs_map_free(&softs->regsmap_handle); in amr_attach()
488 if (softs->state & AMR_STATE_PCI_CONFIG_SETUP) in amr_attach()
489 pci_config_teardown(&softs->pciconfig_handle); in amr_attach()
490 if (softs->state & AMR_STATE_SOFT_STATE_SETUP) in amr_attach()
505 struct amr_softs *softs; in amr_detach() local
510 softs = ddi_get_soft_state(amr_softstatep, instance); in amr_detach()
513 if (amr_flush(softs) != 0) { in amr_detach()
519 mutex_enter(&softs->periodic_mutex); in amr_detach()
520 softs->state &= ~AMR_STATE_TIMEOUT_ENABLED; in amr_detach()
521 if (softs->timeout_t) { in amr_detach()
522 (void) untimeout(softs->timeout_t); in amr_detach()
523 softs->timeout_t = 0; in amr_detach()
525 mutex_exit(&softs->periodic_mutex); in amr_detach()
527 for (i = 0; i < softs->sg_max_count; i++) { in amr_detach()
529 softs->sg_items[i].sg_handle); in amr_detach()
531 &((softs->sg_items[i]).sg_acc_handle)); in amr_detach()
533 &(softs->sg_items[i].sg_handle)); in amr_detach()
536 (void) ddi_dma_unbind_handle(softs->mbox_dma_handle); in amr_detach()
537 (void) ddi_dma_mem_free(&softs->mbox_acc_handle); in amr_detach()
538 (void) ddi_dma_free_handle(&softs->mbox_dma_handle); in amr_detach()
541 ddi_remove_intr(softs->dev_info_p, 0, softs->iblock_cookiep); in amr_detach()
544 AMR_DELAY((softs->amr_interrupts_counter == 0), 1000, done_flag); in amr_detach()
549 ddi_taskq_destroy(softs->amr_taskq); in amr_detach()
552 scsi_hba_tran_free(softs->hba_tran); in amr_detach()
553 ddi_regs_map_free(&softs->regsmap_handle); in amr_detach()
554 pci_config_teardown(&softs->pciconfig_handle); in amr_detach()
556 mutex_destroy(&softs->queue_mutex); in amr_detach()
557 mutex_destroy(&softs->cmd_mutex); in amr_detach()
558 mutex_destroy(&softs->periodic_mutex); in amr_detach()
559 cv_destroy(&softs->cmd_cv); in amr_detach()
563 softs->amr_product_info.pi_product_name, in amr_detach()
564 softs->amr_product_info.pi_firmware_ver); in amr_detach()
576 struct amr_softs *softs; in amr_info() local
583 softs = ddi_get_soft_state(amr_softstatep, instance); in amr_info()
584 if (softs != NULL) { in amr_info()
585 *result = softs->dev_info_p; in amr_info()
607 struct amr_softs *softs = (struct amr_softs *)arg; in amr_intr() local
609 softs->amr_interrupts_counter++; in amr_intr()
611 if (AMR_QGET_ODB(softs) != AMR_QODB_READY) { in amr_intr()
612 softs->amr_interrupts_counter--; in amr_intr()
617 amr_done(softs); in amr_intr()
619 softs->amr_interrupts_counter--; in amr_intr()
629 amr_setup_mbox(struct amr_softs *softs) in amr_setup_mbox() argument
635 softs->dev_info_p, in amr_setup_mbox()
639 &softs->mbox_dma_handle) != DDI_SUCCESS) { in amr_setup_mbox()
645 softs->mbox_dma_handle, in amr_setup_mbox()
651 (caddr_t *)(&softs->mbox), in amr_setup_mbox()
653 &softs->mbox_acc_handle) != in amr_setup_mbox()
661 softs->mbox_dma_handle, in amr_setup_mbox()
663 (caddr_t)softs->mbox, in amr_setup_mbox()
668 &softs->mbox_dma_cookie, in amr_setup_mbox()
669 &softs->mbox_dma_cookien) != DDI_DMA_MAPPED) { in amr_setup_mbox()
675 if (softs->mbox_dma_cookien != 1) in amr_setup_mbox()
679 move = 16 - (((uint32_t)softs->mbox_dma_cookie.dmac_address)&0xf); in amr_setup_mbox()
680 softs->mbox_phyaddr = in amr_setup_mbox()
681 (softs->mbox_dma_cookie.dmac_address + move); in amr_setup_mbox()
683 softs->mailbox = in amr_setup_mbox()
684 (struct amr_mailbox *)(((uintptr_t)softs->mbox) + move); in amr_setup_mbox()
687 softs->mbox_phyaddr, (void *)softs->mailbox, in amr_setup_mbox()
688 softs->mbox, move)); in amr_setup_mbox()
693 if (softs->mbox_dma_cookien) in amr_setup_mbox()
694 (void) ddi_dma_unbind_handle(softs->mbox_dma_handle); in amr_setup_mbox()
695 if (softs->mbox_acc_handle) { in amr_setup_mbox()
696 (void) ddi_dma_mem_free(&(softs->mbox_acc_handle)); in amr_setup_mbox()
697 softs->mbox_acc_handle = NULL; in amr_setup_mbox()
699 if (softs->mbox_dma_handle) { in amr_setup_mbox()
700 (void) ddi_dma_free_handle(&softs->mbox_dma_handle); in amr_setup_mbox()
701 softs->mbox_dma_handle = NULL; in amr_setup_mbox()
714 struct amr_softs *softs = (struct amr_softs *)data; in amr_periodic() local
718 for (i = 0; i < softs->sg_max_count; i++) { in amr_periodic()
719 if (softs->busycmd[i] == NULL) in amr_periodic()
722 mutex_enter(&softs->cmd_mutex); in amr_periodic()
724 if (softs->busycmd[i] == NULL) { in amr_periodic()
725 mutex_exit(&softs->cmd_mutex); in amr_periodic()
729 pkt = softs->busycmd[i]->pkt; in amr_periodic()
733 softs->busycmd[i]->ac_timestamp > in amr_periodic()
739 (void *)softs, in amr_periodic()
742 (void *)softs->busycmd[i]); in amr_periodic()
744 ac = softs->busycmd[i]; in amr_periodic()
748 softs->busycmd[i] = NULL; in amr_periodic()
749 if (softs->amr_busyslots > 0) in amr_periodic()
750 softs->amr_busyslots--; in amr_periodic()
751 if (softs->amr_busyslots == 0) in amr_periodic()
752 cv_broadcast(&softs->cmd_cv); in amr_periodic()
754 mutex_exit(&softs->cmd_mutex); in amr_periodic()
766 mutex_exit(&softs->cmd_mutex); in amr_periodic()
771 mutex_enter(&softs->periodic_mutex); in amr_periodic()
772 if (softs->state & AMR_STATE_TIMEOUT_ENABLED) in amr_periodic()
773 softs->timeout_t = timeout(amr_periodic, (void *)softs, in amr_periodic()
775 mutex_exit(&softs->periodic_mutex); in amr_periodic()
782 amr_query_controller(struct amr_softs *softs) in amr_query_controller() argument
794 if (softs->maxio == 0) in amr_query_controller()
795 softs->maxio = 2; in amr_query_controller()
797 instance = ddi_get_instance(softs->dev_info_p); in amr_query_controller()
802 if ((aex = amr_enquiry(softs, AMR_ENQ_BUFFER_SIZE, AMR_CMD_CONFIG, in amr_query_controller()
808 softs->logic_drive[ldrv].al_size = in amr_query_controller()
810 softs->logic_drive[ldrv].al_state = in amr_query_controller()
812 softs->logic_drive[ldrv].al_properties = in amr_query_controller()
817 softs->logic_drive[ldrv].al_size, in amr_query_controller()
818 softs->logic_drive[ldrv].al_state, in amr_query_controller()
819 softs->logic_drive[ldrv].al_properties)); in amr_query_controller()
821 if (softs->logic_drive[ldrv].al_state == in amr_query_controller()
827 softs->amr_nlogdrives++; in amr_query_controller()
831 if ((ap = amr_enquiry(softs, AMR_ENQ_BUFFER_SIZE, in amr_query_controller()
838 softs->maxdrives = AMR_40LD_MAXDRIVES; in amr_query_controller()
839 softs->maxchan = ap->ap_nschan; in amr_query_controller()
840 softs->maxio = ap->ap_maxio; in amr_query_controller()
842 bcopy(ap->ap_firmware, softs->amr_product_info.pi_firmware_ver, in amr_query_controller()
844 softs->amr_product_info. in amr_query_controller()
847 bcopy(ap->ap_product, softs->amr_product_info.pi_product_name, in amr_query_controller()
849 softs->amr_product_info. in amr_query_controller()
853 AMRDB_PRINT((CE_NOTE, "maxio=%d", softs->maxio)); in amr_query_controller()
860 if ((ae = (struct amr_enquiry *)amr_enquiry(softs, in amr_query_controller()
864 if ((ae = (struct amr_enquiry *)amr_enquiry(softs, in amr_query_controller()
878 softs->logic_drive[ldrv].al_size = in amr_query_controller()
880 softs->logic_drive[ldrv].al_state = in amr_query_controller()
882 softs->logic_drive[ldrv].al_properties = in amr_query_controller()
887 softs->logic_drive[ldrv].al_size, in amr_query_controller()
888 softs->logic_drive[ldrv].al_state, in amr_query_controller()
889 softs->logic_drive[ldrv].al_properties)); in amr_query_controller()
891 if (softs->logic_drive[ldrv].al_state == in amr_query_controller()
897 softs->amr_nlogdrives++; in amr_query_controller()
900 softs->maxdrives = AMR_8LD_MAXDRIVES; in amr_query_controller()
901 softs->maxchan = ae->ae_adapter.aa_channels; in amr_query_controller()
902 softs->maxio = ae->ae_adapter.aa_maxio; in amr_query_controller()
910 softs->logic_drive[ldrv].al_state = AMR_LDRV_OFFLINE; in amr_query_controller()
917 softs->maxio = MIN(softs->maxio, AMR_LIMITCMD); in amr_query_controller()
926 amr_enquiry(struct amr_softs *softs, size_t bufsize, uint8_t cmd, in amr_enquiry() argument
935 ac.ac_softs = softs; in amr_enquiry()
967 amr_flush(struct amr_softs *softs) in amr_flush() argument
973 ac.ac_softs = softs; in amr_flush()
996 struct amr_softs *softs = ac->ac_softs; in amr_poll_command() local
1001 (void *)softs->mailbox, in amr_poll_command()
1004 mutex_enter(&softs->cmd_mutex); in amr_poll_command()
1006 while (softs->amr_busyslots != 0) in amr_poll_command()
1007 cv_wait(&softs->cmd_cv, &softs->cmd_mutex); in amr_poll_command()
1016 softs->sg_items[softs->sg_max_count - 1].sg_table, in amr_poll_command()
1020 softs->sg_items[softs->sg_max_count - 1].sg_handle, in amr_poll_command()
1024 softs->sg_items[softs->sg_max_count - 1].sg_phyaddr; in amr_poll_command()
1027 bcopy(&ac->mailbox, (void *)softs->mailbox, AMR_MBOX_CMDSIZE); in amr_poll_command()
1030 (void) ddi_dma_sync(softs->mbox_dma_handle, 0, 0, DDI_DMA_SYNC_FORDEV); in amr_poll_command()
1033 softs->mailbox->mb_ident = AMR_POLL_COMMAND_ID; in amr_poll_command()
1034 softs->mailbox->mb_nstatus = AMR_POLL_DEFAULT_NSTATUS; in amr_poll_command()
1035 softs->mailbox->mb_status = AMR_POLL_DEFAULT_STATUS; in amr_poll_command()
1036 softs->mailbox->mb_poll = 0; in amr_poll_command()
1037 softs->mailbox->mb_ack = 0; in amr_poll_command()
1038 softs->mailbox->mb_busy = 1; in amr_poll_command()
1040 AMR_QPUT_IDB(softs, softs->mbox_phyaddr | AMR_QIDB_SUBMIT); in amr_poll_command()
1043 (void) ddi_dma_sync(softs->mbox_dma_handle, 0, 0, DDI_DMA_SYNC_FORCPU); in amr_poll_command()
1045 AMR_DELAY((softs->mailbox->mb_nstatus != AMR_POLL_DEFAULT_NSTATUS), in amr_poll_command()
1048 mutex_exit(&softs->cmd_mutex); in amr_poll_command()
1052 ac->ac_status = softs->mailbox->mb_status; in amr_poll_command()
1054 AMR_DELAY((softs->mailbox->mb_poll == AMR_POLL_ACK), 1000, done_flag); in amr_poll_command()
1056 mutex_exit(&softs->cmd_mutex); in amr_poll_command()
1060 softs->mailbox->mb_poll = 0; in amr_poll_command()
1061 softs->mailbox->mb_ack = AMR_POLL_ACK; in amr_poll_command()
1064 AMR_QPUT_IDB(softs, softs->mbox_phyaddr | AMR_QIDB_ACK); in amr_poll_command()
1066 AMR_DELAY(!(AMR_QGET_IDB(softs) & AMR_QIDB_ACK), 1000, done_flag); in amr_poll_command()
1068 mutex_exit(&softs->cmd_mutex); in amr_poll_command()
1072 mutex_exit(&softs->cmd_mutex); in amr_poll_command()
1080 amr_setup_sg(struct amr_softs *softs) in amr_setup_sg() argument
1087 softs->sg_max_count = 0; in amr_setup_sg()
1094 (softs->sg_items[i]).sg_handle = NULL; in amr_setup_sg()
1096 softs->dev_info_p, in amr_setup_sg()
1100 &((softs->sg_items[i]).sg_handle)) != DDI_SUCCESS) { in amr_setup_sg()
1107 if (ddi_dma_mem_alloc((softs->sg_items[i]).sg_handle, in amr_setup_sg()
1112 (caddr_t *)(&(softs->sg_items[i]).sg_table), in amr_setup_sg()
1114 &(softs->sg_items[i]).sg_acc_handle) in amr_setup_sg()
1123 (softs->sg_items[i]).sg_handle, in amr_setup_sg()
1125 (caddr_t)((softs->sg_items[i]).sg_table), in amr_setup_sg()
1141 softs->sg_items[i].sg_phyaddr = cookie.dmac_address; in amr_setup_sg()
1142 softs->sg_max_count++; in amr_setup_sg()
1153 (void) ddi_dma_unbind_handle((softs->sg_items[i]).sg_handle); in amr_setup_sg()
1155 if ((softs->sg_items[i]).sg_acc_handle) { in amr_setup_sg()
1156 (void) ddi_dma_mem_free(&((softs->sg_items[i]).sg_acc_handle)); in amr_setup_sg()
1157 (softs->sg_items[i]).sg_acc_handle = NULL; in amr_setup_sg()
1159 if ((softs->sg_items[i]).sg_handle) { in amr_setup_sg()
1160 (void) ddi_dma_free_handle(&((softs->sg_items[i]).sg_handle)); in amr_setup_sg()
1161 (softs->sg_items[i]).sg_handle = NULL; in amr_setup_sg()
1168 return (softs->sg_max_count > 1 ? DDI_SUCCESS : DDI_FAILURE); in amr_setup_sg()
1214 struct amr_softs *softs = ac->ac_softs; in amr_enquiry_mapcmd() local
1230 if (ddi_dma_alloc_handle(softs->dev_info_p, in amr_enquiry_mapcmd()
1479 struct amr_softs *softs; in amr_tran_tgt_init() local
1483 softs = (struct amr_softs *) in amr_tran_tgt_init()
1487 if (softs->logic_drive[target].al_state != AMR_LDRV_OFFLINE) in amr_tran_tgt_init()
1496 struct amr_softs *softs; in amr_tran_start() local
1506 softs = (struct amr_softs *)(ap->a_hba_tran->tran_hba_private); in amr_tran_start()
1508 (softs->logic_drive[ap->a_target].al_state == in amr_tran_start()
1527 amr_rw_command(softs, pkt, ap->a_target); in amr_tran_start()
1539 mutex_enter(&softs->queue_mutex); in amr_tran_start()
1540 if (softs->waiting_q_head == NULL) { in amr_tran_start()
1543 softs->waiting_q_head = ac; in amr_tran_start()
1544 softs->waiting_q_tail = ac; in amr_tran_start()
1547 ac->ac_prev = softs->waiting_q_tail; in amr_tran_start()
1548 softs->waiting_q_tail->ac_next = ac; in amr_tran_start()
1549 softs->waiting_q_tail = ac; in amr_tran_start()
1551 mutex_exit(&softs->queue_mutex); in amr_tran_start()
1552 amr_start_waiting_queue((void *)softs); in amr_tran_start()
1579 bcopy(softs->amr_product_info.pi_product_name, in amr_tran_start()
1582 bcopy(softs->amr_product_info.pi_firmware_ver, in amr_tran_start()
1610 capacity = softs->logic_drive[ap->a_target].al_size - 1; in amr_tran_start()
1635 capacity = softs->logic_drive[ap->a_target].al_size - 1; in amr_tran_start()
1713 struct amr_softs *softs; in amr_tran_reset() local
1717 softs = (struct amr_softs *)(ap->a_hba_tran->tran_hba_private); in amr_tran_reset()
1720 while (softs->amr_busyslots > 0) { in amr_tran_reset()
1721 AMR_DELAY((softs->mailbox->mb_busy == 0), in amr_tran_reset()
1733 AMR_QPUT_IDB(softs, softs->mbox_phyaddr | AMR_QIDB_ACK); in amr_tran_reset()
1736 AMR_BUSYWAIT(!(AMR_QGET_IDB(softs) & AMR_QIDB_ACK), in amr_tran_reset()
1745 mutex_exit(&softs->cmd_mutex); in amr_tran_reset()
1749 softs->amr_busyslots -= softs->mailbox->mb_nstatus; in amr_tran_reset()
1753 (void) amr_flush(softs); in amr_tran_reset()
1783 struct amr_softs *softs; in amr_tran_getcap() local
1791 softs = ((struct amr_softs *)(ap->a_hba_tran)->tran_hba_private); in amr_tran_getcap()
1802 return (softs->logic_drive[ap->a_target].al_size); in amr_tran_getcap()
1846 struct amr_softs *softs; in amr_tran_init_pkt() local
1850 softs = (struct amr_softs *)(ap->a_hba_tran->tran_hba_private); in amr_tran_init_pkt()
1853 (softs->logic_drive[ap->a_target].al_state == in amr_tran_init_pkt()
1862 pkt = scsi_hba_pkt_alloc(softs->dev_info_p, ap, cmdlen, in amr_tran_init_pkt()
1879 ac->ac_softs = softs; in amr_tran_init_pkt()
1888 if (ddi_dma_alloc_handle(softs->dev_info_p, &buffer_dma_attr, in amr_tran_init_pkt()
1985 amr_rw_command(struct amr_softs *softs, struct scsi_pkt *pkt, int target) in amr_rw_command() argument
2081 struct amr_softs *softs = (struct amr_softs *)softp; in amr_start_waiting_queue() local
2084 mutex_enter(&softs->queue_mutex); in amr_start_waiting_queue()
2085 mutex_enter(&softs->cmd_mutex); in amr_start_waiting_queue()
2087 while ((ac = softs->waiting_q_head) != NULL) { in amr_start_waiting_queue()
2092 for (slot = 0; slot < (softs->sg_max_count - 1); slot++) { in amr_start_waiting_queue()
2093 if (softs->busycmd[slot] == NULL) { in amr_start_waiting_queue()
2094 if (AMR_QGET_IDB(softs) & AMR_QIDB_SUBMIT) { in amr_start_waiting_queue()
2099 mutex_exit(&softs->cmd_mutex); in amr_start_waiting_queue()
2100 mutex_exit(&softs->queue_mutex); in amr_start_waiting_queue()
2108 softs->busycmd[slot] = ac; in amr_start_waiting_queue()
2110 softs->amr_busyslots++; in amr_start_waiting_queue()
2113 softs->sg_items[slot].sg_table, in amr_start_waiting_queue()
2118 softs->sg_items[slot].sg_handle, in amr_start_waiting_queue()
2122 softs->sg_items[slot].sg_phyaddr; in amr_start_waiting_queue()
2126 softs->waiting_q_head = ac->ac_next; in amr_start_waiting_queue()
2135 softs->mailbox->mb_poll = 0; in amr_start_waiting_queue()
2136 softs->mailbox->mb_ack = 0; in amr_start_waiting_queue()
2138 AMR_DELAY((softs->mailbox->mb_busy == 0), in amr_start_waiting_queue()
2150 bcopy(&ac->mailbox, (void *)softs->mailbox, in amr_start_waiting_queue()
2154 (void) ddi_dma_sync(softs->mbox_dma_handle, in amr_start_waiting_queue()
2157 AMR_QPUT_IDB(softs, in amr_start_waiting_queue()
2158 softs->mbox_phyaddr | AMR_QIDB_SUBMIT); in amr_start_waiting_queue()
2169 if (slot == softs->maxio) in amr_start_waiting_queue()
2174 mutex_exit(&softs->cmd_mutex); in amr_start_waiting_queue()
2175 mutex_exit(&softs->queue_mutex); in amr_start_waiting_queue()
2179 amr_done(struct amr_softs *softs) in amr_done() argument
2189 AMR_QPUT_ODB(softs, AMR_QODB_READY); in amr_done()
2192 (void) AMR_QGET_ODB(softs); in amr_done()
2194 mutex_enter(&softs->cmd_mutex); in amr_done()
2196 if (softs->mailbox->mb_nstatus != 0) { in amr_done()
2197 (void) ddi_dma_sync(softs->mbox_dma_handle, in amr_done()
2201 bcopy((void *)(uintptr_t)(volatile void *)softs->mailbox, in amr_done()
2206 AMR_QPUT_IDB(softs, softs->mbox_phyaddr | AMR_QIDB_ACK); in amr_done()
2209 AMR_BUSYWAIT(!(AMR_QGET_IDB(softs) & AMR_QIDB_ACK), in amr_done()
2218 mutex_exit(&softs->cmd_mutex); in amr_done()
2224 ac = softs->busycmd[idx]; in amr_done()
2228 softs->busycmd[idx] = NULL; in amr_done()
2229 if (softs->amr_busyslots > 0) in amr_done()
2230 softs->amr_busyslots--; in amr_done()
2231 if (softs->amr_busyslots == 0) in amr_done()
2232 cv_broadcast(&softs->cmd_cv); in amr_done()
2256 mutex_exit(&softs->cmd_mutex); in amr_done()
2263 if ((ddi_taskq_dispatch(softs->amr_taskq, amr_start_waiting_queue, in amr_done()
2264 (void *)softs, DDI_NOSLEEP)) != DDI_SUCCESS) { in amr_done()