Lines Matching refs:instance

307 	struct megasas_instance	*instance;  in megasas_attach()  local
340 instance = (struct megasas_instance *)ddi_get_soft_state in megasas_attach()
343 if (instance == NULL) { in megasas_attach()
352 bzero((caddr_t)instance, in megasas_attach()
355 instance->func_ptr = kmem_zalloc( in megasas_attach()
357 ASSERT(instance->func_ptr); in megasas_attach()
360 if (pci_config_setup(dip, &instance->pci_handle) != in megasas_attach()
366 kmem_free(instance->func_ptr, in megasas_attach()
377 pci_config_teardown(&instance->pci_handle); in megasas_attach()
378 kmem_free(instance->func_ptr, in megasas_attach()
385 vendor_id = pci_config_get16(instance->pci_handle, in megasas_attach()
387 device_id = pci_config_get16(instance->pci_handle, in megasas_attach()
390 subsysvid = pci_config_get16(instance->pci_handle, in megasas_attach()
392 subsysid = pci_config_get16(instance->pci_handle, in megasas_attach()
395 pci_config_put16(instance->pci_handle, PCI_CONF_COMM, in megasas_attach()
396 (pci_config_get16(instance->pci_handle, in megasas_attach()
398 irq = pci_config_get8(instance->pci_handle, in megasas_attach()
407 command = pci_config_get16(instance->pci_handle, in megasas_attach()
413 pci_config_put16(instance->pci_handle, in megasas_attach()
428 instance->func_ptr->read_fw_status_reg = in megasas_attach()
430 instance->func_ptr->issue_cmd = issue_cmd_ppc; in megasas_attach()
431 instance->func_ptr->issue_cmd_in_sync_mode = in megasas_attach()
433 instance->func_ptr->issue_cmd_in_poll_mode = in megasas_attach()
435 instance->func_ptr->enable_intr = in megasas_attach()
437 instance->func_ptr->disable_intr = in megasas_attach()
439 instance->func_ptr->intr_ack = intr_ack_ppc; in megasas_attach()
443 instance->func_ptr->read_fw_status_reg = in megasas_attach()
445 instance->func_ptr->issue_cmd = in megasas_attach()
447 instance->func_ptr->issue_cmd_in_sync_mode = in megasas_attach()
449 instance->func_ptr->issue_cmd_in_poll_mode = in megasas_attach()
451 instance->func_ptr->enable_intr = in megasas_attach()
453 instance->func_ptr->disable_intr = in megasas_attach()
455 instance->func_ptr->intr_ack = in megasas_attach()
459 instance->baseaddress = pci_config_get32( in megasas_attach()
460 instance->pci_handle, PCI_CONF_BASE0); in megasas_attach()
461 instance->baseaddress &= 0x0fffc; in megasas_attach()
463 instance->dip = dip; in megasas_attach()
464 instance->vendor_id = vendor_id; in megasas_attach()
465 instance->device_id = device_id; in megasas_attach()
466 instance->subsysvid = subsysvid; in megasas_attach()
467 instance->subsysid = subsysid; in megasas_attach()
470 instance->fm_capabilities = ddi_prop_get_int( in megasas_attach()
471 DDI_DEV_T_ANY, instance->dip, DDI_PROP_DONTPASS, in megasas_attach()
476 megasas_fm_init(instance); in megasas_attach()
479 if (init_mfi(instance) != DDI_SUCCESS) { in megasas_attach()
496 &instance->iblock_cookie) != DDI_SUCCESS) { in megasas_attach()
502 &instance->soft_iblock_cookie) != DDI_SUCCESS) { in megasas_attach()
512 instance->isr_level = HIGH_LEVEL_INTR; in megasas_attach()
513 mutex_init(&instance->cmd_pool_mtx, in megasas_attach()
515 instance->soft_iblock_cookie); in megasas_attach()
516 mutex_init(&instance->cmd_pend_mtx, in megasas_attach()
518 instance->soft_iblock_cookie); in megasas_attach()
524 instance->isr_level = NORMAL_LEVEL_INTR; in megasas_attach()
525 mutex_init(&instance->cmd_pool_mtx, in megasas_attach()
527 instance->iblock_cookie); in megasas_attach()
528 mutex_init(&instance->cmd_pend_mtx, in megasas_attach()
530 instance->iblock_cookie); in megasas_attach()
533 mutex_init(&instance->completed_pool_mtx, in megasas_attach()
535 instance->iblock_cookie); in megasas_attach()
536 mutex_init(&instance->int_cmd_mtx, "int_cmd_mtx", in megasas_attach()
537 MUTEX_DRIVER, instance->iblock_cookie); in megasas_attach()
538 mutex_init(&instance->aen_cmd_mtx, "aen_cmd_mtx", in megasas_attach()
539 MUTEX_DRIVER, instance->iblock_cookie); in megasas_attach()
540 mutex_init(&instance->abort_cmd_mtx, "abort_cmd_mtx", in megasas_attach()
541 MUTEX_DRIVER, instance->iblock_cookie); in megasas_attach()
543 cv_init(&instance->int_cmd_cv, NULL, CV_DRIVER, NULL); in megasas_attach()
544 cv_init(&instance->abort_cmd_cv, NULL, CV_DRIVER, NULL); in megasas_attach()
546 INIT_LIST_HEAD(&instance->completed_pool_list); in megasas_attach()
550 (caddr_t)instance) != DDI_SUCCESS) { in megasas_attach()
560 if (instance->isr_level == HIGH_LEVEL_INTR) { in megasas_attach()
562 &instance->soft_intr_id, NULL, NULL, in megasas_attach()
563 megasas_softintr, (caddr_t)instance) != in megasas_attach()
585 instance->tran = tran; in megasas_attach()
587 tran->tran_hba_private = instance; in megasas_attach()
607 tran_dma_attr.dma_attr_sgllen = instance->max_num_sge; in megasas_attach()
643 (void) sprintf(instance->iocnode, "%d:lsirdctl", in megasas_attach()
650 if (ddi_create_minor_node(dip, instance->iocnode, in megasas_attach()
662 instance->func_ptr->enable_intr(instance); in megasas_attach()
665 if (start_mfi_aen(instance)) { in megasas_attach()
677 if (megasas_check_acc_handle(instance->regmap_handle) != in megasas_attach()
681 if (megasas_check_acc_handle(instance->pci_handle) != in megasas_attach()
713 ddi_remove_minor_node(dip, instance->iocnode); in megasas_attach()
722 ddi_remove_softintr(instance->soft_intr_id); in megasas_attach()
726 ddi_remove_intr(dip, 0, instance->iblock_cookie); in megasas_attach()
729 megasas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE); in megasas_attach()
730 ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST); in megasas_attach()
732 megasas_fm_fini(instance); in megasas_attach()
734 pci_config_teardown(&instance->pci_handle); in megasas_attach()
765 struct megasas_instance *instance; in megasas_getinfo() local
771 instance = (struct megasas_instance *) in megasas_getinfo()
775 if (instance == NULL) { in megasas_getinfo()
779 *resultp = instance->dip; in megasas_getinfo()
784 *resultp = (void *)instance; in megasas_getinfo()
813 struct megasas_instance *instance; in megasas_detach() local
822 instance = (struct megasas_instance *)ddi_get_soft_state(megasas_state, in megasas_detach()
825 if (!instance) { in megasas_detach()
835 instance_no, instance->vendor_id, instance->device_id, in megasas_detach()
836 instance->subsysvid, instance->subsysid)); in megasas_detach()
851 scsi_hba_tran_free(instance->tran); in megasas_detach()
853 if (abort_aen_cmd(instance, instance->aen_cmd)) { in megasas_detach()
860 instance->func_ptr->disable_intr(instance); in megasas_detach()
862 if (instance->isr_level == HIGH_LEVEL_INTR) { in megasas_detach()
863 ddi_remove_softintr(instance->soft_intr_id); in megasas_detach()
866 ddi_remove_intr(dip, 0, instance->iblock_cookie); in megasas_detach()
868 free_space_for_mfi(instance); in megasas_detach()
870 megasas_fm_fini(instance); in megasas_detach()
872 pci_config_teardown(&instance->pci_handle); in megasas_detach()
874 kmem_free(instance->func_ptr, in megasas_detach()
997 struct megasas_instance *instance; in megasas_ioctl() local
1003 instance = ddi_get_soft_state(megasas_state, MINOR2INST(getminor(dev))); in megasas_ioctl()
1005 if (instance == NULL) { in megasas_ioctl()
1021 rval = handle_drv_ioctl(instance, &ioctl, mode); in megasas_ioctl()
1023 rval = handle_mfi_ioctl(instance, &ioctl, mode); in megasas_ioctl()
1042 rval = handle_mfi_aen(instance, &aen); in megasas_ioctl()
1083 struct megasas_instance *instance; in megasas_reset() local
1086 instance = (struct megasas_instance *)ddi_get_soft_state in megasas_reset()
1091 if (!instance) { in megasas_reset()
1101 flush_cache(instance); in megasas_reset()
1163 struct megasas_instance *instance; in megasas_tran_init_pkt() local
1168 instance = ADDR2MEGA(ap); in megasas_tran_init_pkt()
1172 pkt = scsi_hba_pkt_alloc(instance->dip, ap, cmdlen, statuslen, in megasas_tran_init_pkt()
1211 if (megasas_dma_alloc(instance, pkt, bp, flags, in megasas_tran_init_pkt()
1220 if (megasas_dma_move(instance, pkt, bp) == -1) { in megasas_tran_init_pkt()
1250 struct megasas_instance *instance = ADDR2MEGA(ap); in megasas_tran_start() local
1259 cmd = build_cmd(instance, ap, pkt, &cmd_done); in megasas_tran_start()
1282 if (instance->fw_outstanding > instance->max_fw_cmds) { in megasas_tran_start()
1284 return_mfi_pkt(instance, cmd); in megasas_tran_start()
1292 instance->func_ptr->issue_cmd(cmd, instance); in megasas_tran_start()
1299 instance->func_ptr-> issue_cmd_in_poll_mode(instance, cmd); in megasas_tran_start()
1327 return_mfi_pkt(instance, cmd); in megasas_tran_start()
1328 (void) megasas_common_check(instance, cmd); in megasas_tran_start()
1376 struct megasas_instance *instance = ADDR2MEGA(ap); in megasas_tran_reset() local
1380 if (wait_for_outstanding(instance)) { in megasas_tran_reset()
1405 struct megasas_instance *instance = ddi_get_soft_state(megasas_state, in megasas_tran_bus_reset() local
1410 if (wait_for_outstanding(instance)) { in megasas_tran_bus_reset()
1435 struct megasas_instance *instance = ADDR2MEGA(ap); in megasas_tran_getcap() local
1471 rval = instance->init_id; in megasas_tran_getcap()
1688 megasas_isr(struct megasas_instance *instance) in megasas_isr() argument
1699 ASSERT(instance); in megasas_isr()
1700 if (!instance->func_ptr->intr_ack(instance)) { in megasas_isr()
1704 (void) ddi_dma_sync(instance->mfi_internal_dma_obj.dma_handle, in megasas_isr()
1707 if (megasas_check_dma_handle(instance->mfi_internal_dma_obj.dma_handle) in megasas_isr()
1709 megasas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE); in megasas_isr()
1710 ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST); in megasas_isr()
1714 producer = *instance->producer; in megasas_isr()
1715 consumer = *instance->consumer; in megasas_isr()
1720 mutex_enter(&instance->completed_pool_mtx); in megasas_isr()
1723 context = instance->reply_queue[consumer]; in megasas_isr()
1724 cmd = instance->cmd_list[context]; in megasas_isr()
1725 mlist_add_tail(&cmd->list, &instance->completed_pool_list); in megasas_isr()
1728 if (consumer == (instance->max_fw_cmds + 1)) { in megasas_isr()
1733 mutex_exit(&instance->completed_pool_mtx); in megasas_isr()
1735 *instance->consumer = consumer; in megasas_isr()
1736 (void) ddi_dma_sync(instance->mfi_internal_dma_obj.dma_handle, in megasas_isr()
1739 if (instance->softint_running) { in megasas_isr()
1745 if (instance->isr_level == HIGH_LEVEL_INTR) { in megasas_isr()
1747 ddi_trigger_softintr(instance->soft_intr_id); in megasas_isr()
1754 (void) megasas_softintr(instance); in megasas_isr()
1772 get_mfi_pkt(struct megasas_instance *instance) in get_mfi_pkt() argument
1774 mlist_t *head = &instance->cmd_pool_list; in get_mfi_pkt()
1777 mutex_enter(&instance->cmd_pool_mtx); in get_mfi_pkt()
1778 ASSERT(mutex_owned(&instance->cmd_pool_mtx)); in get_mfi_pkt()
1786 mutex_exit(&instance->cmd_pool_mtx); in get_mfi_pkt()
1795 return_mfi_pkt(struct megasas_instance *instance, struct megasas_cmd *cmd) in return_mfi_pkt() argument
1797 mutex_enter(&instance->cmd_pool_mtx); in return_mfi_pkt()
1798 ASSERT(mutex_owned(&instance->cmd_pool_mtx)); in return_mfi_pkt()
1800 mlist_add(&cmd->list, &instance->cmd_pool_list); in return_mfi_pkt()
1802 mutex_exit(&instance->cmd_pool_mtx); in return_mfi_pkt()
1809 destroy_mfi_frame_pool(struct megasas_instance *instance) in destroy_mfi_frame_pool() argument
1812 uint32_t max_cmd = instance->max_fw_cmds; in destroy_mfi_frame_pool()
1819 cmd = instance->cmd_list[i]; in destroy_mfi_frame_pool()
1822 (void) mega_free_dma_obj(instance, cmd->frame_dma_obj); in destroy_mfi_frame_pool()
1833 create_mfi_frame_pool(struct megasas_instance *instance) in create_mfi_frame_pool() argument
1844 max_cmd = instance->max_fw_cmds; in create_mfi_frame_pool()
1849 sgl_sz = sge_sz * instance->max_num_sge; in create_mfi_frame_pool()
1856 cmd = instance->cmd_list[i]; in create_mfi_frame_pool()
1866 cookie_cnt = mega_alloc_dma_obj(instance, &cmd->frame_dma_obj); in create_mfi_frame_pool()
1909 free_additional_dma_buffer(struct megasas_instance *instance) in free_additional_dma_buffer() argument
1911 if (instance->mfi_internal_dma_obj.status == DMA_OBJ_ALLOCATED) { in free_additional_dma_buffer()
1912 (void) mega_free_dma_obj(instance, in free_additional_dma_buffer()
1913 instance->mfi_internal_dma_obj); in free_additional_dma_buffer()
1914 instance->mfi_internal_dma_obj.status = DMA_OBJ_FREED; in free_additional_dma_buffer()
1917 if (instance->mfi_evt_detail_obj.status == DMA_OBJ_ALLOCATED) { in free_additional_dma_buffer()
1918 (void) mega_free_dma_obj(instance, in free_additional_dma_buffer()
1919 instance->mfi_evt_detail_obj); in free_additional_dma_buffer()
1920 instance->mfi_evt_detail_obj.status = DMA_OBJ_FREED; in free_additional_dma_buffer()
1928 alloc_additional_dma_buffer(struct megasas_instance *instance) in alloc_additional_dma_buffer() argument
1934 reply_q_sz = sizeof (uint32_t) * (instance->max_fw_cmds + 1 + 2); in alloc_additional_dma_buffer()
1936 instance->mfi_internal_dma_obj.size = internal_buf_size; in alloc_additional_dma_buffer()
1937 instance->mfi_internal_dma_obj.dma_attr = megasas_generic_dma_attr; in alloc_additional_dma_buffer()
1938 instance->mfi_internal_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; in alloc_additional_dma_buffer()
1939 instance->mfi_internal_dma_obj.dma_attr.dma_attr_count_max = in alloc_additional_dma_buffer()
1941 instance->mfi_internal_dma_obj.dma_attr.dma_attr_sgllen = 1; in alloc_additional_dma_buffer()
1943 if (mega_alloc_dma_obj(instance, &instance->mfi_internal_dma_obj) in alloc_additional_dma_buffer()
1949 bzero(instance->mfi_internal_dma_obj.buffer, internal_buf_size); in alloc_additional_dma_buffer()
1951 instance->mfi_internal_dma_obj.status |= DMA_OBJ_ALLOCATED; in alloc_additional_dma_buffer()
1953 instance->producer = (uint32_t *)((unsigned long) in alloc_additional_dma_buffer()
1954 instance->mfi_internal_dma_obj.buffer); in alloc_additional_dma_buffer()
1955 instance->consumer = (uint32_t *)((unsigned long) in alloc_additional_dma_buffer()
1956 instance->mfi_internal_dma_obj.buffer + 4); in alloc_additional_dma_buffer()
1957 instance->reply_queue = (uint32_t *)((unsigned long) in alloc_additional_dma_buffer()
1958 instance->mfi_internal_dma_obj.buffer + 8); in alloc_additional_dma_buffer()
1959 instance->internal_buf = (caddr_t)(((unsigned long) in alloc_additional_dma_buffer()
1960 instance->mfi_internal_dma_obj.buffer) + reply_q_sz + 8); in alloc_additional_dma_buffer()
1961 instance->internal_buf_dmac_add = in alloc_additional_dma_buffer()
1962 instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + in alloc_additional_dma_buffer()
1964 instance->internal_buf_size = internal_buf_size - in alloc_additional_dma_buffer()
1968 instance->mfi_evt_detail_obj.size = sizeof (struct megasas_evt_detail); in alloc_additional_dma_buffer()
1969 instance->mfi_evt_detail_obj.dma_attr = megasas_generic_dma_attr; in alloc_additional_dma_buffer()
1970 instance->mfi_evt_detail_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; in alloc_additional_dma_buffer()
1971 instance->mfi_evt_detail_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU; in alloc_additional_dma_buffer()
1972 instance->mfi_evt_detail_obj.dma_attr.dma_attr_sgllen = 1; in alloc_additional_dma_buffer()
1973 instance->mfi_evt_detail_obj.dma_attr.dma_attr_align = 1; in alloc_additional_dma_buffer()
1975 if (mega_alloc_dma_obj(instance, &instance->mfi_evt_detail_obj) != 1) { in alloc_additional_dma_buffer()
1981 bzero(instance->mfi_evt_detail_obj.buffer, in alloc_additional_dma_buffer()
1984 instance->mfi_evt_detail_obj.status |= DMA_OBJ_ALLOCATED; in alloc_additional_dma_buffer()
1993 free_space_for_mfi(struct megasas_instance *instance) in free_space_for_mfi() argument
1996 uint32_t max_cmd = instance->max_fw_cmds; in free_space_for_mfi()
1999 if (instance->cmd_list == NULL) { in free_space_for_mfi()
2003 free_additional_dma_buffer(instance); in free_space_for_mfi()
2006 destroy_mfi_frame_pool(instance); in free_space_for_mfi()
2009 for (i = 0; i < instance->max_fw_cmds; i++) { in free_space_for_mfi()
2010 kmem_free(instance->cmd_list[i], in free_space_for_mfi()
2013 instance->cmd_list[i] = NULL; in free_space_for_mfi()
2017 kmem_free(instance->cmd_list, in free_space_for_mfi()
2020 instance->cmd_list = NULL; in free_space_for_mfi()
2022 INIT_LIST_HEAD(&instance->cmd_pool_list); in free_space_for_mfi()
2029 alloc_space_for_mfi(struct megasas_instance *instance) in alloc_space_for_mfi() argument
2037 max_cmd = instance->max_fw_cmds; in alloc_space_for_mfi()
2045 instance->cmd_list = kmem_zalloc(sz, KM_SLEEP); in alloc_space_for_mfi()
2046 ASSERT(instance->cmd_list); in alloc_space_for_mfi()
2049 instance->cmd_list[i] = kmem_zalloc(sizeof (struct megasas_cmd), in alloc_space_for_mfi()
2051 ASSERT(instance->cmd_list[i]); in alloc_space_for_mfi()
2054 INIT_LIST_HEAD(&instance->cmd_pool_list); in alloc_space_for_mfi()
2058 cmd = instance->cmd_list[i]; in alloc_space_for_mfi()
2061 mlist_add_tail(&cmd->list, &instance->cmd_pool_list); in alloc_space_for_mfi()
2065 if (create_mfi_frame_pool(instance)) { in alloc_space_for_mfi()
2071 if (alloc_additional_dma_buffer(instance)) { in alloc_space_for_mfi()
2083 get_ctrl_info(struct megasas_instance *instance, in get_ctrl_info() argument
2092 cmd = get_mfi_pkt(instance); in get_ctrl_info()
2102 ci = (struct megasas_ctrl_info *)instance->internal_buf; in get_ctrl_info()
2107 return_mfi_pkt(instance, cmd); in get_ctrl_info()
2123 dcmd->sgl.sge32[0].phys_addr = instance->internal_buf_dmac_add; in get_ctrl_info()
2128 if (!instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) { in get_ctrl_info()
2136 return_mfi_pkt(instance, cmd); in get_ctrl_info()
2137 if (megasas_common_check(instance, cmd) != DDI_SUCCESS) { in get_ctrl_info()
2148 abort_aen_cmd(struct megasas_instance *instance, in abort_aen_cmd() argument
2156 cmd = get_mfi_pkt(instance); in abort_aen_cmd()
2174 instance->aen_cmd->abort_aen = 1; in abort_aen_cmd()
2179 if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) { in abort_aen_cmd()
2187 instance->aen_cmd->abort_aen = 1; in abort_aen_cmd()
2188 instance->aen_cmd = 0; in abort_aen_cmd()
2190 return_mfi_pkt(instance, cmd); in abort_aen_cmd()
2191 (void) megasas_common_check(instance, cmd); in abort_aen_cmd()
2200 init_mfi(struct megasas_instance *instance) in init_mfi() argument
2208 if ((ddi_dev_regsize(instance->dip, REGISTER_SET_IO, &reglength) in init_mfi()
2219 if (ddi_regs_map_setup(instance->dip, REGISTER_SET_IO, in init_mfi()
2220 &instance->regmap, 0, reglength, &endian_attr, in init_mfi()
2221 &instance->regmap_handle) != DDI_SUCCESS) { in init_mfi()
2229 if (mfi_state_transition_to_ready(instance)) { in init_mfi()
2235 instance->max_num_sge = in init_mfi()
2236 (instance->func_ptr->read_fw_status_reg(instance) & in init_mfi()
2243 instance->max_fw_cmds = in init_mfi()
2244 instance->func_ptr->read_fw_status_reg(instance) & 0xFFFF; in init_mfi()
2245 instance->max_fw_cmds = instance->max_fw_cmds - 1; in init_mfi()
2247 instance->max_num_sge = in init_mfi()
2248 (instance->max_num_sge > MEGASAS_MAX_SGE_CNT) ? in init_mfi()
2249 MEGASAS_MAX_SGE_CNT : instance->max_num_sge; in init_mfi()
2252 if (alloc_space_for_mfi(instance)) in init_mfi()
2256 instance->func_ptr->disable_intr(instance); in init_mfi()
2264 cmd = get_mfi_pkt(instance); in init_mfi()
2275 initq_info->reply_queue_entries = instance->max_fw_cmds + 1; in init_mfi()
2279 instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address; in init_mfi()
2283 instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + 4; in init_mfi()
2287 instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + 8; in init_mfi()
2301 if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) { in init_mfi()
2306 return_mfi_pkt(instance, cmd); in init_mfi()
2307 if (megasas_common_check(instance, cmd) != DDI_SUCCESS) { in init_mfi()
2312 if (!get_ctrl_info(instance, &ctrl_info)) { in init_mfi()
2313 instance->max_sectors_per_req = ctrl_info.max_request_size; in init_mfi()
2317 instance->max_sectors_per_req = instance->max_num_sge * in init_mfi()
2321 if (megasas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) { in init_mfi()
2330 free_space_for_mfi(instance); in init_mfi()
2333 ddi_regs_map_free(&instance->regmap_handle); in init_mfi()
2345 mfi_state_transition_to_ready(struct megasas_instance *instance) in mfi_state_transition_to_ready() argument
2354 instance->func_ptr->read_fw_status_reg(instance) & MFI_STATE_MASK; in mfi_state_transition_to_ready()
2379 MFI_INIT_HOTPLUG, instance); in mfi_state_transition_to_ready()
2393 WR_IB_DOORBELL(MFI_INIT_HOTPLUG, instance); in mfi_state_transition_to_ready()
2400 instance->func_ptr->disable_intr(instance); in mfi_state_transition_to_ready()
2409 WR_IB_DOORBELL(MFI_RESET_FLAGS, instance); in mfi_state_transition_to_ready()
2443 instance->func_ptr->read_fw_status_reg(instance) & in mfi_state_transition_to_ready()
2461 fw_ctrl = RD_IB_DOORBELL(instance); in mfi_state_transition_to_ready()
2474 WR_IB_DOORBELL(0xF, instance); in mfi_state_transition_to_ready()
2476 if (megasas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) { in mfi_state_transition_to_ready()
2486 get_seq_num(struct megasas_instance *instance, in get_seq_num() argument
2495 cmd = get_mfi_pkt(instance); in get_seq_num()
2512 if (mega_alloc_dma_obj(instance, &dcmd_dma_obj) != 1) { in get_seq_num()
2536 if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) { in get_seq_num()
2547 if (mega_free_dma_obj(instance, dcmd_dma_obj) != DDI_SUCCESS) in get_seq_num()
2550 return_mfi_pkt(instance, cmd); in get_seq_num()
2551 if (megasas_common_check(instance, cmd) != DDI_SUCCESS) { in get_seq_num()
2561 start_mfi_aen(struct megasas_instance *instance) in start_mfi_aen() argument
2571 if (get_seq_num(instance, &eli)) { in start_mfi_aen()
2581 ret = register_mfi_aen(instance, eli.newest_seq_num + 1, in start_mfi_aen()
2596 flush_cache(struct megasas_instance *instance) in flush_cache() argument
2601 if (!(cmd = get_mfi_pkt(instance))) in flush_cache()
2619 if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) { in flush_cache()
2624 return_mfi_pkt(instance, cmd); in flush_cache()
2625 (void) megasas_common_check(instance, cmd); in flush_cache()
2635 service_mfi_aen(struct megasas_instance *instance, struct megasas_cmd *cmd) in service_mfi_aen() argument
2639 (struct megasas_evt_detail *)instance->mfi_evt_detail_obj.buffer; in service_mfi_aen()
2651 if (ddi_log_sysevent(instance->dip, DDI_VENDOR_LSI, "LSIMEGA", "SAS", in service_mfi_aen()
2653 int instance_no = ddi_get_instance(instance->dip); in service_mfi_aen()
2661 (void) memset(instance->mfi_evt_detail_obj.buffer, 0, in service_mfi_aen()
2667 instance->aen_seq_num = seq_num; in service_mfi_aen()
2672 instance->func_ptr->issue_cmd(cmd, instance); in service_mfi_aen()
2685 complete_cmd_in_sync_mode(struct megasas_instance *instance, in complete_cmd_in_sync_mode() argument
2696 cv_broadcast(&instance->int_cmd_cv); in complete_cmd_in_sync_mode()
2707 megasas_softintr(struct megasas_instance *instance) in megasas_softintr() argument
2719 ASSERT(instance); in megasas_softintr()
2720 mutex_enter(&instance->completed_pool_mtx); in megasas_softintr()
2722 if (mlist_empty(&instance->completed_pool_list)) { in megasas_softintr()
2723 mutex_exit(&instance->completed_pool_mtx); in megasas_softintr()
2727 instance->softint_running = 1; in megasas_softintr()
2730 mlist_splice(&instance->completed_pool_list, &process_list); in megasas_softintr()
2731 INIT_LIST_HEAD(&instance->completed_pool_list); in megasas_softintr()
2733 mutex_exit(&instance->completed_pool_mtx); in megasas_softintr()
2745 megasas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE); in megasas_softintr()
2746 ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST); in megasas_softintr()
2767 complete_cmd_in_sync_mode(instance, cmd); in megasas_softintr()
2912 atomic_add_16(&instance->fw_outstanding, (-1)); in megasas_softintr()
2914 return_mfi_pkt(instance, cmd); in megasas_softintr()
2916 (void) megasas_common_check(instance, cmd); in megasas_softintr()
2921 ddi_fm_service_impact(instance->dip, in megasas_softintr()
2936 complete_cmd_in_sync_mode(instance, cmd); in megasas_softintr()
2942 if ((instance->aen_cmd == cmd) && in megasas_softintr()
2943 (instance->aen_cmd->abort_aen)) { in megasas_softintr()
2948 service_mfi_aen(instance, cmd); in megasas_softintr()
2950 atomic_add_16(&instance->fw_outstanding, in megasas_softintr()
2954 complete_cmd_in_sync_mode(instance, cmd); in megasas_softintr()
2964 complete_cmd_in_sync_mode(instance, cmd); in megasas_softintr()
2967 megasas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE); in megasas_softintr()
2968 ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST); in megasas_softintr()
2981 instance->softint_running = 0; in megasas_softintr()
2992 mega_alloc_dma_obj(struct megasas_instance *instance, dma_obj_t *obj) in mega_alloc_dma_obj() argument
3001 i = ddi_dma_alloc_handle(instance->dip, &obj->dma_attr, in mega_alloc_dma_obj()
3048 ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST); in mega_alloc_dma_obj()
3053 ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST); in mega_alloc_dma_obj()
3067 mega_free_dma_obj(struct megasas_instance *instance, dma_obj_t obj) in mega_free_dma_obj() argument
3071 ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED); in mega_free_dma_obj()
3076 ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED); in mega_free_dma_obj()
3094 megasas_dma_alloc(struct megasas_instance *instance, struct scsi_pkt *pkt, in megasas_dma_alloc() argument
3127 tmp_dma_attr.dma_attr_sgllen = instance->max_num_sge; in megasas_dma_alloc()
3130 if ((i = ddi_dma_alloc_handle(instance->dip, &tmp_dma_attr, in megasas_dma_alloc()
3188 if (i == instance->max_num_sge || in megasas_dma_alloc()
3241 megasas_dma_move(struct megasas_instance *instance, struct scsi_pkt *pkt, in megasas_dma_move() argument
3281 if (i == instance->max_num_sge || in megasas_dma_move()
3305 build_cmd(struct megasas_instance *instance, struct scsi_address *ap, in build_cmd() argument
3320 acmd->device_id = MAP_DEVICE_ID(instance, ap); in build_cmd()
3324 if (!(cmd = get_mfi_pkt(instance))) { in build_cmd()
3508 wait_for_outstanding(struct megasas_instance *instance) in wait_for_outstanding() argument
3514 if (!instance->fw_outstanding) { in wait_for_outstanding()
3521 if (instance->fw_outstanding) { in wait_for_outstanding()
3525 ddi_fm_acc_err_clear(instance->regmap_handle, DDI_FME_VERSION); in wait_for_outstanding()
3534 issue_mfi_pthru(struct megasas_instance *instance, struct megasas_ioctl *ioctl, in issue_mfi_pthru() argument
3582 if (mega_alloc_dma_obj(instance, &pthru_dma_obj) != 1) { in issue_mfi_pthru()
3625 if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) { in issue_mfi_pthru()
3648 if (mega_free_dma_obj(instance, pthru_dma_obj) != DDI_SUCCESS) in issue_mfi_pthru()
3659 issue_mfi_dcmd(struct megasas_instance *instance, struct megasas_ioctl *ioctl, in issue_mfi_dcmd() argument
3707 if (mega_alloc_dma_obj(instance, &dcmd_dma_obj) != 1) { in issue_mfi_dcmd()
3742 if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) { in issue_mfi_dcmd()
3760 if (mega_free_dma_obj(instance, dcmd_dma_obj) != DDI_SUCCESS) in issue_mfi_dcmd()
3771 issue_mfi_smp(struct megasas_instance *instance, struct megasas_ioctl *ioctl, in issue_mfi_smp() argument
3850 if (mega_alloc_dma_obj(instance, &request_dma_obj) != 1) { in issue_mfi_smp()
3876 if (mega_alloc_dma_obj(instance, &response_dma_obj) != 1) { in issue_mfi_smp()
3947 if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) { in issue_mfi_smp()
3980 if (mega_free_dma_obj(instance, request_dma_obj) != DDI_SUCCESS) in issue_mfi_smp()
3986 if (mega_free_dma_obj(instance, response_dma_obj) != in issue_mfi_smp()
3998 issue_mfi_stp(struct megasas_instance *instance, struct megasas_ioctl *ioctl, in issue_mfi_stp() argument
4063 if (mega_alloc_dma_obj(instance, &fis_dma_obj) != 1) { in issue_mfi_stp()
4092 if (mega_alloc_dma_obj(instance, &data_dma_obj) != 1) { in issue_mfi_stp()
4128 if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) { in issue_mfi_stp()
4155 if (mega_free_dma_obj(instance, fis_dma_obj) != DDI_SUCCESS) in issue_mfi_stp()
4161 if (mega_free_dma_obj(instance, data_dma_obj) != DDI_SUCCESS) in issue_mfi_stp()
4188 handle_drv_ioctl(struct megasas_instance *instance, struct megasas_ioctl *ioctl, in handle_drv_ioctl() argument
4254 if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, instance->dip, in handle_drv_ioctl()
4274 pci_config_get8(instance->pci_handle, i); in handle_drv_ioctl()
4303 handle_mfi_ioctl(struct megasas_instance *instance, struct megasas_ioctl *ioctl, in handle_mfi_ioctl() argument
4311 cmd = get_mfi_pkt(instance); in handle_mfi_ioctl()
4323 rval = issue_mfi_dcmd(instance, ioctl, cmd, mode); in handle_mfi_ioctl()
4326 rval = issue_mfi_smp(instance, ioctl, cmd, mode); in handle_mfi_ioctl()
4329 rval = issue_mfi_stp(instance, ioctl, cmd, mode); in handle_mfi_ioctl()
4333 rval = issue_mfi_pthru(instance, ioctl, cmd, mode); in handle_mfi_ioctl()
4343 return_mfi_pkt(instance, cmd); in handle_mfi_ioctl()
4344 if (megasas_common_check(instance, cmd) != DDI_SUCCESS) in handle_mfi_ioctl()
4353 handle_mfi_aen(struct megasas_instance *instance, struct megasas_aen *aen) in handle_mfi_aen() argument
4357 rval = register_mfi_aen(instance, instance->aen_seq_num, in handle_mfi_aen()
4366 register_mfi_aen(struct megasas_instance *instance, uint32_t seq_num, in register_mfi_aen() argument
4391 if (instance->aen_cmd) { in register_mfi_aen()
4392 prev_aen.word = instance->aen_cmd->frame->dcmd.mbox.w[1]; in register_mfi_aen()
4419 ret_val = abort_aen_cmd(instance, instance->aen_cmd); in register_mfi_aen()
4432 cmd = get_mfi_pkt(instance); in register_mfi_aen()
4442 (void) memset(instance->mfi_evt_detail_obj.buffer, 0, in register_mfi_aen()
4456 instance->mfi_evt_detail_obj.dma_cookie[0].dmac_address; in register_mfi_aen()
4459 instance->aen_seq_num = seq_num; in register_mfi_aen()
4466 instance->aen_cmd = cmd; in register_mfi_aen()
4472 instance->func_ptr->issue_cmd(cmd, instance); in register_mfi_aen()
4547 read_fw_status_reg_xscale(struct megasas_instance *instance) in read_fw_status_reg_xscale() argument
4549 return ((int)RD_OB_MSG_0(instance)); in read_fw_status_reg_xscale()
4553 read_fw_status_reg_ppc(struct megasas_instance *instance) in read_fw_status_reg_ppc() argument
4555 return ((int)RD_OB_SCRATCH_PAD_0(instance)); in read_fw_status_reg_ppc()
4559 issue_cmd_xscale(struct megasas_cmd *cmd, struct megasas_instance *instance) in issue_cmd_xscale() argument
4561 atomic_inc_16(&instance->fw_outstanding); in issue_cmd_xscale()
4565 (cmd->frame_count - 1), instance); in issue_cmd_xscale()
4569 issue_cmd_ppc(struct megasas_cmd *cmd, struct megasas_instance *instance) in issue_cmd_ppc() argument
4571 atomic_inc_16(&instance->fw_outstanding); in issue_cmd_ppc()
4575 (((cmd->frame_count - 1) << 1) | 1), instance); in issue_cmd_ppc()
4582 issue_cmd_in_sync_mode_xscale(struct megasas_instance *instance, in issue_cmd_in_sync_mode_xscale() argument
4591 (cmd->frame_count - 1), instance); in issue_cmd_in_sync_mode_xscale()
4593 mutex_enter(&instance->int_cmd_mtx); in issue_cmd_in_sync_mode_xscale()
4596 cv_wait(&instance->int_cmd_cv, &instance->int_cmd_mtx); in issue_cmd_in_sync_mode_xscale()
4599 mutex_exit(&instance->int_cmd_mtx); in issue_cmd_in_sync_mode_xscale()
4609 issue_cmd_in_sync_mode_ppc(struct megasas_instance *instance, in issue_cmd_in_sync_mode_ppc() argument
4620 (((cmd->frame_count - 1) << 1) | 1), instance); in issue_cmd_in_sync_mode_ppc()
4622 mutex_enter(&instance->int_cmd_mtx); in issue_cmd_in_sync_mode_ppc()
4625 cv_wait(&instance->int_cmd_cv, &instance->int_cmd_mtx); in issue_cmd_in_sync_mode_ppc()
4628 mutex_exit(&instance->int_cmd_mtx); in issue_cmd_in_sync_mode_ppc()
4643 issue_cmd_in_poll_mode_xscale(struct megasas_instance *instance, in issue_cmd_in_poll_mode_xscale() argument
4656 (cmd->frame_count - 1), instance); in issue_cmd_in_poll_mode_xscale()
4674 issue_cmd_in_poll_mode_ppc(struct megasas_instance *instance, in issue_cmd_in_poll_mode_ppc() argument
4689 (((cmd->frame_count - 1) << 1) | 1), instance); in issue_cmd_in_poll_mode_ppc()
4707 enable_intr_xscale(struct megasas_instance *instance) in enable_intr_xscale() argument
4709 MFI_ENABLE_INTR(instance); in enable_intr_xscale()
4713 enable_intr_ppc(struct megasas_instance *instance) in enable_intr_ppc() argument
4720 WR_OB_DOORBELL_CLEAR(OB_DOORBELL_CLEAR_MASK, instance); in enable_intr_ppc()
4727 WR_OB_INTR_MASK(~(MFI_REPLY_1078_MESSAGE_INTR), instance); in enable_intr_ppc()
4730 mask = RD_OB_INTR_MASK(instance); in enable_intr_ppc()
4737 disable_intr_xscale(struct megasas_instance *instance) in disable_intr_xscale() argument
4739 MFI_DISABLE_INTR(instance); in disable_intr_xscale()
4743 disable_intr_ppc(struct megasas_instance *instance) in disable_intr_ppc() argument
4748 "outbound_intr_mask = 0x%x\n", RD_OB_INTR_MASK(instance))); in disable_intr_ppc()
4751 WR_OB_INTR_MASK(OB_INTR_MASK, instance); in disable_intr_ppc()
4754 "outbound_intr_mask = 0x%x\n", RD_OB_INTR_MASK(instance))); in disable_intr_ppc()
4757 (void) RD_OB_INTR_MASK(instance); in disable_intr_ppc()
4761 intr_ack_xscale(struct megasas_instance *instance) in intr_ack_xscale() argument
4766 status = RD_OB_INTR_STATUS(instance); in intr_ack_xscale()
4773 WR_OB_INTR_STATUS(status, instance); in intr_ack_xscale()
4779 intr_ack_ppc(struct megasas_instance *instance) in intr_ack_ppc() argument
4786 status = RD_OB_INTR_STATUS(instance); in intr_ack_ppc()
4799 WR_OB_DOORBELL_CLEAR(status, instance); in intr_ack_ppc()
4802 status = RD_OB_INTR_STATUS(instance); in intr_ack_ppc()
4810 megasas_common_check(struct megasas_instance *instance, in megasas_common_check() argument
4817 ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED); in megasas_common_check()
4824 if (megasas_check_dma_handle(instance->mfi_internal_dma_obj.dma_handle) in megasas_common_check()
4826 ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED); in megasas_common_check()
4833 if (megasas_check_dma_handle(instance->mfi_evt_detail_obj.dma_handle) != in megasas_common_check()
4835 ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED); in megasas_common_check()
4842 if (megasas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) { in megasas_common_check()
4843 ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED); in megasas_common_check()
4844 ddi_fm_acc_err_clear(instance->regmap_handle, DDI_FME_VER0); in megasas_common_check()
4868 megasas_fm_init(struct megasas_instance *instance) in megasas_fm_init() argument
4874 if (instance->fm_capabilities) { in megasas_fm_init()
4885 ddi_fm_init(instance->dip, &instance->fm_capabilities, &fm_ibc); in megasas_fm_init()
4892 if (DDI_FM_EREPORT_CAP(instance->fm_capabilities) || in megasas_fm_init()
4893 DDI_FM_ERRCB_CAP(instance->fm_capabilities)) { in megasas_fm_init()
4894 pci_ereport_setup(instance->dip); in megasas_fm_init()
4900 if (DDI_FM_ERRCB_CAP(instance->fm_capabilities)) { in megasas_fm_init()
4901 ddi_fm_handler_register(instance->dip, in megasas_fm_init()
4902 megasas_fm_error_cb, (void*) instance); in megasas_fm_init()
4911 megasas_fm_fini(struct megasas_instance *instance) in megasas_fm_fini() argument
4914 if (instance->fm_capabilities) { in megasas_fm_fini()
4918 if (DDI_FM_ERRCB_CAP(instance->fm_capabilities)) { in megasas_fm_fini()
4919 ddi_fm_handler_unregister(instance->dip); in megasas_fm_fini()
4925 if (DDI_FM_EREPORT_CAP(instance->fm_capabilities) || in megasas_fm_fini()
4926 DDI_FM_ERRCB_CAP(instance->fm_capabilities)) { in megasas_fm_fini()
4927 pci_ereport_teardown(instance->dip); in megasas_fm_fini()
4931 ddi_fm_fini(instance->dip); in megasas_fm_fini()
4968 megasas_fm_ereport(struct megasas_instance *instance, char *detail) in megasas_fm_ereport() argument
4975 if (DDI_FM_EREPORT_CAP(instance->fm_capabilities)) { in megasas_fm_ereport()
4976 ddi_fm_ereport_post(instance->dip, buf, ena, DDI_NOSLEEP, in megasas_fm_ereport()