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