Lines Matching defs:instance

58 extern int mrsas_complete_pending_cmds(struct mrsas_instance *instance);
84 destroy_mfi_mpi_frame_pool(struct mrsas_instance *instance)
92 cmd = instance->cmd_list[i];
94 (void) mrsas_free_dma_obj(instance,
105 destroy_mpi2_frame_pool(struct mrsas_instance *instance)
108 if (instance->mpi2_frame_pool_dma_obj.status == DMA_OBJ_ALLOCATED) {
109 (void) mrsas_free_dma_obj(instance,
110 instance->mpi2_frame_pool_dma_obj);
111 instance->mpi2_frame_pool_dma_obj.status |= DMA_OBJ_FREED;
120 mrsas_tbolt_free_additional_dma_buffer(struct mrsas_instance *instance)
124 if (instance->mfi_internal_dma_obj.status == DMA_OBJ_ALLOCATED) {
125 (void) mrsas_free_dma_obj(instance,
126 instance->mfi_internal_dma_obj);
127 instance->mfi_internal_dma_obj.status = DMA_OBJ_FREED;
129 if (instance->mfi_evt_detail_obj.status == DMA_OBJ_ALLOCATED) {
130 (void) mrsas_free_dma_obj(instance,
131 instance->mfi_evt_detail_obj);
132 instance->mfi_evt_detail_obj.status = DMA_OBJ_FREED;
136 if (instance->ld_map_obj[i].status == DMA_OBJ_ALLOCATED) {
137 (void) mrsas_free_dma_obj(instance,
138 instance->ld_map_obj[i]);
139 instance->ld_map_obj[i].status = DMA_OBJ_FREED;
149 free_req_rep_desc_pool(struct mrsas_instance *instance)
151 if (instance->request_desc_dma_obj.status == DMA_OBJ_ALLOCATED) {
152 (void) mrsas_free_dma_obj(instance,
153 instance->request_desc_dma_obj);
154 instance->request_desc_dma_obj.status = DMA_OBJ_FREED;
157 if (instance->reply_desc_dma_obj.status == DMA_OBJ_ALLOCATED) {
158 (void) mrsas_free_dma_obj(instance,
159 instance->reply_desc_dma_obj);
160 instance->reply_desc_dma_obj.status = DMA_OBJ_FREED;
171 create_mpi2_frame_pool(struct mrsas_instance *instance)
183 max_cmd = instance->max_fw_cmds;
206 instance->mpi2_frame_pool_dma_obj.size = total_size;
207 instance->mpi2_frame_pool_dma_obj.dma_attr = mrsas_generic_dma_attr;
208 instance->mpi2_frame_pool_dma_obj.dma_attr.dma_attr_addr_hi =
210 instance->mpi2_frame_pool_dma_obj.dma_attr.dma_attr_count_max =
212 instance->mpi2_frame_pool_dma_obj.dma_attr.dma_attr_sgllen = 1;
213 instance->mpi2_frame_pool_dma_obj.dma_attr.dma_attr_align = 256;
215 if (mrsas_alloc_dma_obj(instance, &instance->mpi2_frame_pool_dma_obj,
217 dev_err(instance->dip, CE_WARN,
222 bzero(instance->mpi2_frame_pool_dma_obj.buffer, total_size);
223 instance->mpi2_frame_pool_dma_obj.status |= DMA_OBJ_ALLOCATED;
225 instance->io_request_frames =
226 (uint8_t *)instance->mpi2_frame_pool_dma_obj.buffer;
227 instance->io_request_frames_phy =
229 instance->mpi2_frame_pool_dma_obj.dma_cookie[0].dmac_address;
232 (void *)instance->io_request_frames));
235 instance->io_request_frames_phy));
237 io_req_base = (uint8_t *)instance->io_request_frames +
239 io_req_base_phys = instance->io_request_frames_phy +
246 cmd = instance->cmd_list[i];
299 mrsas_tbolt_alloc_additional_dma_buffer(struct mrsas_instance *instance)
305 instance->mfi_internal_dma_obj.status = DMA_OBJ_FREED;
306 instance->mfi_evt_detail_obj.status = DMA_OBJ_FREED;
307 instance->ld_map_obj[0].status = DMA_OBJ_FREED;
308 instance->ld_map_obj[1].status = DMA_OBJ_FREED;
311 instance->mfi_internal_dma_obj.size = internal_buf_size;
312 instance->mfi_internal_dma_obj.dma_attr = mrsas_generic_dma_attr;
313 instance->mfi_internal_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
314 instance->mfi_internal_dma_obj.dma_attr.dma_attr_count_max =
316 instance->mfi_internal_dma_obj.dma_attr.dma_attr_sgllen = 1;
318 if (mrsas_alloc_dma_obj(instance, &instance->mfi_internal_dma_obj,
320 dev_err(instance->dip, CE_WARN,
325 bzero(instance->mfi_internal_dma_obj.buffer, internal_buf_size);
327 instance->mfi_internal_dma_obj.status |= DMA_OBJ_ALLOCATED;
328 instance->internal_buf =
329 (caddr_t)(((unsigned long)instance->mfi_internal_dma_obj.buffer));
330 instance->internal_buf_dmac_add =
331 instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address;
332 instance->internal_buf_size = internal_buf_size;
335 instance->mfi_evt_detail_obj.size = sizeof (struct mrsas_evt_detail);
336 instance->mfi_evt_detail_obj.dma_attr = mrsas_generic_dma_attr;
337 instance->mfi_evt_detail_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
338 instance->mfi_evt_detail_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
339 instance->mfi_evt_detail_obj.dma_attr.dma_attr_sgllen = 1;
340 instance->mfi_evt_detail_obj.dma_attr.dma_attr_align = 8;
342 if (mrsas_alloc_dma_obj(instance, &instance->mfi_evt_detail_obj,
344 dev_err(instance->dip, CE_WARN,
350 bzero(instance->mfi_evt_detail_obj.buffer,
353 instance->mfi_evt_detail_obj.status |= DMA_OBJ_ALLOCATED;
355 instance->size_map_info = sizeof (MR_FW_RAID_MAP) +
360 instance->ld_map_obj[i].size = instance->size_map_info;
361 instance->ld_map_obj[i].dma_attr = mrsas_generic_dma_attr;
362 instance->ld_map_obj[i].dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
363 instance->ld_map_obj[i].dma_attr.dma_attr_count_max =
365 instance->ld_map_obj[i].dma_attr.dma_attr_sgllen = 1;
366 instance->ld_map_obj[i].dma_attr.dma_attr_align = 1;
368 if (mrsas_alloc_dma_obj(instance, &instance->ld_map_obj[i],
370 dev_err(instance->dip, CE_WARN,
375 instance->ld_map_obj[i].status |= DMA_OBJ_ALLOCATED;
377 bzero(instance->ld_map_obj[i].buffer, instance->size_map_info);
379 instance->ld_map[i] =
380 (MR_FW_RAID_MAP_ALL *)instance->ld_map_obj[i].buffer;
381 instance->ld_map_phy[i] = (uint32_t)instance->
385 "ld_map Addr Phys 0x%x", instance->ld_map_phy[i]));
388 "size_map_info 0x%x", instance->size_map_info));
394 mrsas_tbolt_free_additional_dma_buffer(instance);
400 mr_sas_get_request_descriptor(struct mrsas_instance *instance, uint16_t index)
404 if (index > instance->max_fw_cmds) {
408 "max_fw_cmds : 0x%x", instance->max_fw_cmds));
413 ((char *)instance->request_message_pool +
421 (unsigned long)instance->request_message_pool_phy));
431 alloc_req_rep_desc(struct mrsas_instance *instance)
449 max_reply_q_sz = ((instance->max_fw_cmds + 1 + 15)/16)*16;
457 instance->reply_desc_dma_obj.size = reply_q_sz;
458 instance->reply_desc_dma_obj.dma_attr = mrsas_generic_dma_attr;
459 instance->reply_desc_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
460 instance->reply_desc_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
461 instance->reply_desc_dma_obj.dma_attr.dma_attr_sgllen = 1;
462 instance->reply_desc_dma_obj.dma_attr.dma_attr_align = 16;
464 if (mrsas_alloc_dma_obj(instance, &instance->reply_desc_dma_obj,
466 dev_err(instance->dip, CE_WARN, "could not alloc reply queue");
470 bzero(instance->reply_desc_dma_obj.buffer, reply_q_sz);
471 instance->reply_desc_dma_obj.status |= DMA_OBJ_ALLOCATED;
474 instance->reply_frame_pool = (MPI2_REPLY_DESCRIPTORS_UNION *)(
475 instance->reply_desc_dma_obj.buffer);
477 instance->reply_q_depth = max_reply_q_sz;
480 instance->reply_q_depth));
483 (void *)instance->reply_frame_pool));
486 reply_desc = instance->reply_frame_pool;
488 for (i = 0; i < instance->reply_q_depth; i++) {
494 instance->reply_frame_pool_phy =
495 (uint32_t)instance->reply_desc_dma_obj.dma_cookie[0].dmac_address;
498 "[reply queue phys addr]0x%x", instance->reply_frame_pool_phy));
501 instance->reply_pool_limit_phy = (instance->reply_frame_pool_phy +
505 instance->reply_pool_limit_phy));
516 (instance->max_fw_cmds);
518 instance->request_desc_dma_obj.size = request_q_sz;
519 instance->request_desc_dma_obj.dma_attr = mrsas_generic_dma_attr;
520 instance->request_desc_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
521 instance->request_desc_dma_obj.dma_attr.dma_attr_count_max =
523 instance->request_desc_dma_obj.dma_attr.dma_attr_sgllen = 1;
524 instance->request_desc_dma_obj.dma_attr.dma_attr_align = 16;
526 if (mrsas_alloc_dma_obj(instance, &instance->request_desc_dma_obj,
528 dev_err(instance->dip, CE_WARN,
533 bzero(instance->request_desc_dma_obj.buffer, request_q_sz);
534 instance->request_desc_dma_obj.status |= DMA_OBJ_ALLOCATED;
537 instance->request_message_pool = (MRSAS_REQUEST_DESCRIPTOR_UNION *)
538 (instance->request_desc_dma_obj.buffer);
540 instance->request_message_pool_phy =
541 (uint32_t)instance->request_desc_dma_obj.dma_cookie[0].dmac_address;
546 if (instance->reply_desc_dma_obj.status == DMA_OBJ_ALLOCATED) {
547 (void) mrsas_free_dma_obj(instance,
548 instance->reply_desc_dma_obj);
549 instance->reply_desc_dma_obj.status = DMA_OBJ_FREED;
562 mrsas_alloc_cmd_pool_tbolt(struct mrsas_instance *instance)
572 max_cmd = instance->max_fw_cmds;
580 * instance->cmd_list is an array of struct mrsas_cmd pointers.
584 instance->cmd_list = kmem_zalloc(sz, KM_SLEEP);
588 instance->cmd_list[count] =
594 INIT_LIST_HEAD(&instance->cmd_pool_list);
595 INIT_LIST_HEAD(&instance->cmd_pend_list);
596 INIT_LIST_HEAD(&instance->cmd_app_pool_list);
602 cmd = instance->cmd_list[i];
604 mlist_add_tail(&cmd->list, &instance->cmd_app_pool_list);
609 cmd = instance->cmd_list[i];
611 mlist_add_tail(&cmd->list, &instance->cmd_pool_list);
620 if (instance->cmd_list[i] != NULL) {
621 kmem_free(instance->cmd_list[i],
624 instance->cmd_list[i] = NULL;
629 if (instance->cmd_list != NULL)
630 kmem_free(instance->cmd_list, sz);
631 instance->cmd_list = NULL;
641 free_space_for_mpi2(struct mrsas_instance *instance)
644 if (instance->cmd_list == NULL) {
649 mrsas_tbolt_free_additional_dma_buffer(instance);
652 free_req_rep_desc_pool(instance);
655 destroy_mpi2_frame_pool(instance);
658 destroy_mfi_frame_pool(instance);
662 mrsas_free_cmd_pool(instance);
670 alloc_space_for_mpi2(struct mrsas_instance *instance)
673 if (mrsas_alloc_cmd_pool_tbolt(instance)) {
674 dev_err(instance->dip, CE_WARN, "Error creating cmd pool");
679 instance->reply_size = MRSAS_THUNDERBOLT_REPLY_SIZE;
680 instance->raid_io_msg_size = MRSAS_THUNDERBOLT_MSG_SIZE;
682 instance->max_sge_in_main_msg = (MRSAS_THUNDERBOLT_MSG_SIZE -
685 instance->max_sge_in_chain = (MR_COMMAND_SIZE -
689 instance->max_num_sge = (instance->max_sge_in_main_msg +
690 instance->max_sge_in_chain - 2);
691 instance->chain_offset_mpt_msg =
693 instance->chain_offset_io_req = (MRSAS_THUNDERBOLT_MSG_SIZE -
695 instance->reply_read_index = 0;
700 if (alloc_req_rep_desc(instance)) {
701 dev_err(instance->dip, CE_WARN,
706 instance->request_message_pool_phy));
710 if (create_mfi_frame_pool(instance)) {
711 dev_err(instance->dip, CE_WARN,
723 if (create_mpi2_frame_pool(instance)) {
724 dev_err(instance->dip, CE_WARN,
731 instance->max_sge_in_main_msg));
733 instance->max_sge_in_chain));
735 "[max_sge]0x%x", instance->max_num_sge));
737 instance->chain_offset_mpt_msg));
739 instance->chain_offset_io_req));
744 if (mrsas_tbolt_alloc_additional_dma_buffer(instance)) {
745 dev_err(instance->dip, CE_WARN,
753 destroy_mpi2_frame_pool(instance);
756 destroy_mfi_frame_pool(instance);
759 free_req_rep_desc_pool(instance);
762 mrsas_free_cmd_pool(instance);
772 mrsas_init_adapter_tbolt(struct mrsas_instance *instance)
781 if (instance->max_fw_cmds > 1008) {
782 instance->max_fw_cmds = 1008;
783 instance->max_fw_cmds = instance->max_fw_cmds-1;
787 "instance->max_fw_cmds 0x%X.", instance->max_fw_cmds));
791 if (alloc_space_for_mpi2(instance) != DDI_SUCCESS) {
792 dev_err(instance->dip, CE_WARN,
800 if (mrsas_issue_init_mpi2(instance) != DDI_SUCCESS) {
801 dev_err(instance->dip, CE_WARN,
807 instance->unroll.alloc_space_mpi2 = 1;
815 free_space_for_mpi2(instance);
826 mrsas_issue_init_mpi2(struct mrsas_instance *instance)
839 if (mrsas_alloc_dma_obj(instance, &init2_dma_obj,
841 dev_err(instance->dip, CE_WARN, "mr_sas_issue_init_mpi2 "
853 ret_val = mrsas_tbolt_ioc_init(instance, &init2_dma_obj);
861 if (mrsas_free_dma_obj(instance, init2_dma_obj)
869 instance->map_id = 0;
870 if (mrsas_tbolt_check_map_info(instance) == DDI_SUCCESS)
871 (void) mrsas_tbolt_sync_map_info(instance);
875 if (mrsas_common_check(instance, NULL) != DDI_SUCCESS)
884 (void) mrsas_free_dma_obj(instance, init2_dma_obj);
890 mrsas_tbolt_ioc_init(struct mrsas_instance *instance, dma_obj_t *mpi2_dma_obj)
933 instance->raid_io_msg_size / 4);
940 instance->reply_q_depth);
952 instance->io_request_frames_phy);
956 instance->reply_frame_pool_phy);
961 cmd = instance->cmd_list[0];
987 ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle,
992 ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle,
998 ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle,
1002 ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle,
1013 instance->drv_ver_dma_obj.size = sizeof (drv_ver_info.drv_ver);
1014 instance->drv_ver_dma_obj.dma_attr = mrsas_generic_dma_attr;
1015 instance->drv_ver_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
1016 instance->drv_ver_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
1017 instance->drv_ver_dma_obj.dma_attr.dma_attr_sgllen = 1;
1018 instance->drv_ver_dma_obj.dma_attr.dma_attr_align = 1;
1020 if (mrsas_alloc_dma_obj(instance, &instance->drv_ver_dma_obj,
1022 dev_err(instance->dip, CE_WARN,
1027 bzero(instance->drv_ver_dma_obj.buffer, sizeof (drv_ver_info.drv_ver));
1030 (uint8_t *)instance->drv_ver_dma_obj.buffer,
1035 instance->drv_ver_dma_obj.dma_cookie[0].dmac_address);
1048 instance->func_ptr->disable_intr(instance);
1058 mutex_enter(&instance->reg_write_mtx);
1059 WR_IB_LOW_QPORT((uint32_t)(req_desc.Words), instance);
1060 WR_IB_HIGH_QPORT((uint32_t)(req_desc.Words >> 32), instance);
1061 mutex_exit(&instance->reg_write_mtx);
1076 if (ddi_get8(instance->mpi2_frame_pool_dma_obj.acc_handle,
1081 mrsas_dump_reply_desc(instance);
1085 mrsas_dump_reply_desc(instance);
1087 instance->unroll.verBuff = 1;
1096 (void) mrsas_free_dma_obj(instance, instance->drv_ver_dma_obj);
1102 wait_for_outstanding_poll_io(struct mrsas_instance *instance)
1111 if (instance->fw_outstanding <= 2) {
1116 (void) mr_sas_tbolt_process_outstanding_cmd(instance);
1118 if (instance->fw_outstanding > 2) {
1132 struct mrsas_instance *instance = ADDR2MR(ap);
1138 if (instance->deadadapter == 1) {
1139 dev_err(instance->dip, CE_WARN,
1148 if (instance->adapterresetinprogress) {
1155 cmd = mrsas_tbolt_build_cmd(instance, ap, pkt, &cmd_done);
1180 if (instance->fw_outstanding > instance->max_fw_cmds) {
1181 dev_err(instance->dip, CE_WARN,
1184 uint16_t, instance->fw_outstanding,
1185 uint16_t, instance->max_fw_cmds);
1186 return_raid_msg_pkt(instance, cmd);
1198 instance->func_ptr->issue_cmd(cmd, instance);
1200 instance->func_ptr->issue_cmd(cmd, instance);
1201 (void) wait_for_outstanding_poll_io(instance);
1202 (void) mrsas_common_check(instance, cmd);
1241 mr_sas_tbolt_build_sgl(struct mrsas_instance *instance,
1254 instance->mpi2_frame_pool_dma_obj.acc_handle;
1255 uint16_t devid = instance->device_id;
1264 MaxSGEs = instance->max_sge_in_main_msg;
1283 if (numElements > instance->max_num_sge) {
1302 sgl_ptr_end += instance->max_sge_in_main_msg - 1;
1354 (U8)instance->chain_offset_io_req);
1361 (U8)instance->chain_offset_io_req);
1438 mrsas_tbolt_build_cmd(struct mrsas_instance *instance, struct scsi_address *ap,
1446 uint16_t devid = instance->device_id;
1448 instance->mpi2_frame_pool_dma_obj.acc_handle;
1463 acmd->device_id = MAP_DEVICE_ID(instance, ap);
1468 if (!(cmd = get_raid_msg_pkt(instance))) {
1470 instance->fw_outstanding, uint16_t, instance->max_fw_cmds);
1475 ReqDescUnion = mr_sas_get_request_descriptor(instance, index);
1607 if (instance->tbolt &&
1609 dev_err(instance->dip, CE_WARN,
1628 mutex_enter(&instance->sync_map_mtx);
1631 instance->ld_map[(instance->map_id & 1)];
1635 MAX_LOGICAL_DRIVES) || !instance->fast_path_io) {
1636 dev_err(instance->dip, CE_NOTE,
1639 "!instance->fast_path_io");
1646 if (MR_BuildRaidContext(instance, &io_info,
1655 "instance->fast_path_io %d fp_possible %d",
1656 enable_fp, instance->fast_path_io, fp_possible));
1663 mrsas_tbolt_prepare_cdb(instance,
1712 if ((instance->load_balance_info[
1716 get_updated_dev_handle(&instance->
1772 mutex_exit(&instance->sync_map_mtx);
1777 return_raid_msg_pkt(instance, cmd);
1793 return_raid_msg_pkt(instance, cmd);
1817 mutex_enter(&instance->sync_map_mtx);
1819 local_map_ptr = instance->ld_map[instance->map_id & 1];
1852 if (instance->fast_path_io &&
1853 ((instance->device_id == PCI_DEVICE_ID_LSI_INVADER) ||
1854 (instance->device_id == PCI_DEVICE_ID_LSI_FURY))) {
1865 mutex_exit(&instance->sync_map_mtx);
1881 (void) mr_sas_tbolt_build_sgl(instance, acmd, cmd,
1900 tbolt_read_fw_status_reg(struct mrsas_instance *instance)
1902 return ((uint32_t)RD_OB_SCRATCH_PAD_0(instance));
1906 tbolt_issue_cmd(struct mrsas_cmd *cmd, struct mrsas_instance *instance)
1909 atomic_inc_16(&instance->fw_outstanding);
1928 ": %p instance : %p pkt : %p pkt_time : %x\n",
1929 gethrtime(), (void *)cmd, (void *)instance,
1931 if (instance->adapterresetinprogress) {
1936 push_pending_mfi_pkt(instance, cmd);
1941 "ISSUED CMD TO FW : called : cmd : %p, instance: %p"
1942 "(NO PKT)\n", gethrtime(), (void *)cmd, (void *)instance));
1946 mutex_enter(&instance->reg_write_mtx);
1947 WR_IB_LOW_QPORT((uint32_t)(req_desc->Words), instance);
1948 WR_IB_HIGH_QPORT((uint32_t)(req_desc->Words >> 32), instance);
1949 mutex_exit(&instance->reg_write_mtx);
1956 tbolt_issue_cmd_in_sync_mode(struct mrsas_instance *instance,
1971 if (instance->adapterresetinprogress) {
1979 mutex_enter(&instance->reg_write_mtx);
1980 WR_IB_LOW_QPORT((uint32_t)(req_desc->Words), instance);
1981 WR_IB_HIGH_QPORT((uint32_t)(req_desc->Words >> 32), instance);
1982 mutex_exit(&instance->reg_write_mtx);
1988 push_pending_mfi_pkt(instance, cmd);
1993 (void *)((uintptr_t)(instance)->regmap + IB_HIGH_QPORT)));
1996 (void *)((uintptr_t)(instance)->regmap + IB_LOW_QPORT)));
2002 mutex_enter(&instance->reg_write_mtx);
2003 WR_IB_LOW_QPORT((uint32_t)(req_desc->Words), instance);
2004 WR_IB_HIGH_QPORT((uint32_t)(req_desc->Words >> 32), instance);
2005 mutex_exit(&instance->reg_write_mtx);
2012 mutex_enter(&instance->int_cmd_mtx);
2014 cv_wait(&instance->int_cmd_cv, &instance->int_cmd_mtx);
2016 mutex_exit(&instance->int_cmd_mtx);
2030 tbolt_issue_cmd_in_poll_mode(struct mrsas_instance *instance,
2057 mutex_enter(&instance->reg_write_mtx);
2058 WR_IB_LOW_QPORT((uint32_t)(req_desc->Words), instance);
2059 WR_IB_HIGH_QPORT((uint32_t)(req_desc->Words >> 32), instance);
2060 mutex_exit(&instance->reg_write_mtx);
2082 tbolt_enable_intr(struct mrsas_instance *instance)
2088 WR_OB_INTR_MASK(~(MFI_FUSION_ENABLE_INTERRUPT_MASK), instance);
2091 (void) RD_OB_INTR_MASK(instance);
2096 tbolt_disable_intr(struct mrsas_instance *instance)
2100 WR_OB_INTR_MASK(mask, instance);
2104 (void) RD_OB_INTR_MASK(instance);
2109 tbolt_intr_ack(struct mrsas_instance *instance)
2114 status = RD_OB_INTR_STATUS(instance);
2122 if (mrsas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) {
2123 ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
2129 WR_OB_INTR_STATUS(status, instance);
2131 (void) RD_OB_INTR_STATUS(instance);
2148 get_raid_msg_pkt(struct mrsas_instance *instance)
2150 mlist_t *head = &instance->cmd_pool_list;
2153 mutex_enter(&instance->cmd_pool_mtx);
2154 ASSERT(mutex_owned(&instance->cmd_pool_mtx));
2166 mutex_exit(&instance->cmd_pool_mtx);
2175 get_raid_msg_mfi_pkt(struct mrsas_instance *instance)
2177 mlist_t *head = &instance->cmd_app_pool_list;
2180 mutex_enter(&instance->cmd_app_pool_mtx);
2181 ASSERT(mutex_owned(&instance->cmd_app_pool_mtx));
2195 mutex_exit(&instance->cmd_app_pool_mtx);
2209 return_raid_msg_pkt(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
2211 mutex_enter(&instance->cmd_pool_mtx);
2212 ASSERT(mutex_owned(&instance->cmd_pool_mtx));
2215 mlist_add_tail(&cmd->list, &instance->cmd_pool_list);
2217 mutex_exit(&instance->cmd_pool_mtx);
2221 return_raid_msg_mfi_pkt(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
2223 mutex_enter(&instance->cmd_app_pool_mtx);
2224 ASSERT(mutex_owned(&instance->cmd_app_pool_mtx));
2226 mlist_add_tail(&cmd->list, &instance->cmd_app_pool_list);
2228 mutex_exit(&instance->cmd_app_pool_mtx);
2233 mr_sas_tbolt_build_mfi_cmd(struct mrsas_instance *instance,
2241 instance->mpi2_frame_pool_dma_obj.acc_handle;
2243 if (!instance->tbolt) {
2250 ReqDescUnion = mr_sas_get_request_descriptor(instance, index);
2272 if ((instance->device_id == PCI_DEVICE_ID_LSI_INVADER) ||
2273 (instance->device_id == PCI_DEVICE_ID_LSI_FURY)) {
2276 sgl_ptr_end += instance->max_sge_in_main_msg - 1;
2316 tbolt_complete_cmd(struct mrsas_instance *instance,
2329 instance->mpi2_frame_pool_dma_obj.acc_handle;
2357 lbinfo = &instance->load_balance_info[acmd->device_id];
2428 dev_err(instance->dip, CE_WARN,
2466 dev_err(instance->dip, CE_WARN,
2516 dev_err(instance->dip, CE_WARN,
2523 atomic_add_16(&instance->fw_outstanding, (-1));
2525 (void) mrsas_common_check(instance, cmd);
2529 ddi_fm_service_impact(instance->dip,
2546 return_raid_msg_pkt(instance, cmd);
2554 mutex_enter(&instance->sync_map_mtx);
2560 dev_err(instance->dip, CE_WARN,
2564 instance->map_id++;
2567 PRIu64, instance->map_id));
2571 instance->ld_map[instance->map_id & 1],
2572 instance->load_balance_info)) {
2573 instance->fast_path_io = 1;
2575 instance->fast_path_io = 0;
2579 "instance->fast_path_io %d",
2580 instance->fast_path_io));
2582 instance->unroll.syncCmd = 0;
2584 if (instance->map_update_cmd == cmd) {
2585 return_raid_msg_pkt(instance, cmd);
2586 atomic_add_16(&instance->fw_outstanding, (-1));
2587 (void) mrsas_tbolt_sync_map_info(instance);
2592 instance->ld_map[instance->map_id & 1]
2594 mutex_exit(&instance->sync_map_mtx);
2602 if ((instance->aen_cmd == cmd) &&
2603 (instance->aen_cmd->abort_aen)) {
2607 atomic_add_16(&instance->fw_outstanding, (-1));
2608 service_mfi_aen(instance, cmd);
2617 tbolt_complete_cmd_in_sync_mode(instance, cmd);
2625 mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE);
2626 ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
2636 mr_sas_tbolt_process_outstanding_cmd(struct mrsas_instance *instance)
2648 (void) ddi_dma_sync(instance->reply_desc_dma_obj.dma_handle,
2651 (void) ddi_dma_sync(instance->reply_desc_dma_obj.dma_handle,
2654 desc = instance->reply_frame_pool;
2655 desc += instance->reply_read_index;
2664 if (mrsas_check_dma_handle(instance->mfi_internal_dma_obj.dma_handle)
2666 mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE);
2667 ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
2684 (void) ddi_dma_sync(instance->reply_desc_dma_obj.dma_handle,
2689 if (!smid || smid > instance->max_fw_cmds + 1) {
2696 cmd = instance->cmd_list[smid - 1];
2702 mutex_enter(&instance->cmd_pend_mtx);
2721 mutex_exit(&instance->cmd_pend_mtx);
2723 tbolt_complete_cmd(instance, cmd);
2728 instance->reply_read_index++;
2730 if (instance->reply_read_index >= (instance->reply_q_depth)) {
2732 instance->reply_read_index = 0;
2736 if (!instance->reply_read_index)
2737 desc = instance->reply_frame_pool;
2758 WR_MPI2_REPLY_POST_INDEX(instance->reply_read_index, instance);
2761 (void) ddi_dma_sync(instance->reply_desc_dma_obj.dma_handle,
2764 (void) ddi_dma_sync(instance->reply_desc_dma_obj.dma_handle,
2774 * @instance: Adapter soft state
2782 tbolt_complete_cmd_in_sync_mode(struct mrsas_instance *instance,
2791 mutex_enter(&instance->int_cmd_mtx);
2795 cv_broadcast(&instance->int_cmd_cv);
2796 mutex_exit(&instance->int_cmd_mtx);
2802 * instance: Adapter soft state
2809 mrsas_tbolt_get_ld_map_info(struct mrsas_instance *instance)
2818 cmd = get_raid_msg_pkt(instance);
2821 dev_err(instance->dip, CE_WARN,
2835 ci = instance->ld_map[instance->map_id & 1];
2836 ci_h = instance->ld_map_phy[instance->map_id & 1];
2839 dev_err(instance->dip, CE_WARN,
2841 return_raid_msg_pkt(instance, cmd);
2860 mr_sas_tbolt_build_mfi_cmd(instance, cmd);
2862 if (!instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
2866 dev_err(instance->dip, CE_WARN, "Get LD Map Info failed");
2870 return_raid_msg_pkt(instance, cmd);
2876 mrsas_dump_reply_desc(struct mrsas_instance *instance)
2882 reply_desc = instance->reply_frame_pool;
2884 for (i = 0; i < instance->reply_q_depth; i++, reply_desc++) {
2900 mrsas_tbolt_prepare_cdb(struct mrsas_instance *instance, U8 cdb[],
2907 instance->mpi2_frame_pool_dma_obj.acc_handle;
3130 mrsas_tbolt_check_map_info(struct mrsas_instance *instance)
3134 if (!mrsas_tbolt_get_ld_map_info(instance)) {
3136 ld_map = instance->ld_map[instance->map_id & 1];
3142 instance->ld_map[instance->map_id & 1],
3143 instance->load_balance_info)) {
3147 instance->fast_path_io = 1;
3149 (CE_NOTE, "instance->fast_path_io %d",
3150 instance->fast_path_io));
3157 instance->fast_path_io = 0;
3158 dev_err(instance->dip, CE_WARN, "MR_ValidateMapInfo failed");
3160 "instance->fast_path_io %d", instance->fast_path_io));
3172 mrsas_tbolt_kill_adapter(struct mrsas_instance *instance)
3174 dev_err(instance->dip, CE_NOTE, "TBOLT Kill adapter called");
3176 if (instance->deadadapter == 1)
3181 mutex_enter(&instance->ocr_flags_mtx);
3182 instance->deadadapter = 1;
3183 mutex_exit(&instance->ocr_flags_mtx);
3184 instance->func_ptr->disable_intr(instance);
3185 WR_RESERVED0_REGISTER(MFI_STOP_ADP, instance);
3187 (void) RD_RESERVED0_REGISTER(instance);
3189 (void) mrsas_print_pending_cmds(instance);
3190 (void) mrsas_complete_pending_cmds(instance);
3194 mrsas_reset_reply_desc(struct mrsas_instance *instance)
3198 instance->reply_read_index = 0;
3201 reply_desc = instance->reply_frame_pool;
3203 for (i = 0; i < instance->reply_q_depth; i++) {
3210 mrsas_tbolt_reset_ppc(struct mrsas_instance *instance)
3222 if (instance->deadadapter == 1) {
3223 dev_err(instance->dip, CE_WARN, "mrsas_tbolt_reset_ppc: "
3228 mutex_enter(&instance->ocr_flags_mtx);
3229 instance->adapterresetinprogress = 1;
3232 mutex_exit(&instance->ocr_flags_mtx);
3234 instance->func_ptr->disable_intr(instance);
3241 instance->reply_read_index = 0;
3247 WR_TBOLT_IB_WRITE_SEQ(0xF, instance);
3248 WR_TBOLT_IB_WRITE_SEQ(4, instance);
3249 WR_TBOLT_IB_WRITE_SEQ(0xb, instance);
3250 WR_TBOLT_IB_WRITE_SEQ(2, instance);
3251 WR_TBOLT_IB_WRITE_SEQ(7, instance);
3252 WR_TBOLT_IB_WRITE_SEQ(0xd, instance);
3257 status = RD_TBOLT_HOST_DIAG(instance);
3264 status = RD_TBOLT_HOST_DIAG(instance);
3266 dev_err(instance->dip, CE_WARN,
3274 WR_TBOLT_HOST_DIAG(status | DIAG_TBOLT_RESET_ADAPTER, instance);
3277 ddi_rep_get8((instance)->regmap_handle, (uint8_t *)&status,
3278 (uint8_t *)((uintptr_t)(instance)->regmap +
3283 ddi_rep_get8((instance)->regmap_handle, (uint8_t *)&status,
3284 (uint8_t *)((uintptr_t)(instance)->regmap +
3289 /* mrsas_tbolt_kill_adapter(instance); */
3290 dev_err(instance->dip, CE_WARN,
3301 abs_state = instance->func_ptr->read_fw_status_reg(instance);
3305 abs_state = instance->func_ptr->read_fw_status_reg(instance);
3308 dev_err(instance->dip, CE_WARN,
3315 if (mfi_state_transition_to_ready(instance) ||
3318 instance->func_ptr->read_fw_status_reg(instance);
3333 instance->fw_fault_count_after_ocr++;
3334 if (instance->fw_fault_count_after_ocr
3336 dev_err(instance->dip, CE_WARN,
3340 instance->fw_fault_count_after_ocr);
3344 dev_err(instance->dip, CE_WARN, "%s:"
3349 mrsas_tbolt_kill_adapter(instance);
3356 instance->fw_fault_count_after_ocr = 0;
3358 mrsas_reset_reply_desc(instance);
3363 abs_state = mrsas_issue_init_mpi2(instance);
3365 dev_err(instance->dip, CE_WARN, "mrsas_tbolt_reset_ppc: "
3374 (void) mrsas_print_pending_cmds(instance);
3378 instance->func_ptr->enable_intr(instance);
3379 instance->fw_outstanding = 0;
3383 (void) mrsas_issue_pending_cmds(instance);
3390 instance->aen_cmd->retry_count_for_ocr = 0;
3391 instance->aen_cmd->drv_pkt_time = 0;
3393 instance->func_ptr->issue_cmd(instance->aen_cmd, instance);
3396 mutex_enter(&instance->ocr_flags_mtx);
3397 instance->adapterresetinprogress = 0;
3398 mutex_exit(&instance->ocr_flags_mtx);
3410 * @instance: Adapter soft state
3418 mrsas_tbolt_sync_map_info(struct mrsas_instance *instance)
3431 cmd = get_raid_msg_pkt(instance);
3434 dev_err(instance->dip, CE_WARN,
3447 map = instance->ld_map[instance->map_id & 1];
3458 ci = (LD_TARGET_SYNC *)instance->ld_map[(instance->map_id - 1) & 1];
3461 ci_h = instance->ld_map_phy[(instance->map_id - 1) & 1];
3501 instance->map_update_cmd = cmd;
3502 mr_sas_tbolt_build_mfi_cmd(instance, cmd);
3504 instance->func_ptr->issue_cmd(cmd, instance);
3506 instance->unroll.syncCmd = 1;
3516 abort_syncmap_cmd(struct mrsas_instance *instance,
3526 cmd = get_raid_msg_mfi_pkt(instance);
3529 dev_err(instance->dip, CE_WARN,
3555 mr_sas_tbolt_build_mfi_cmd(instance, cmd);
3557 if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
3565 return_raid_msg_mfi_pkt(instance, cmd);
3567 atomic_add_16(&instance->fw_outstanding, (-1));
3583 mrsas_tbolt_config_pd(struct mrsas_instance *instance, uint16_t tgt,
3594 if ((child = mrsas_find_child(instance, tgt, lun)) != NULL) {
3598 if (instance->mr_tbolt_pd_list[tgt].flag != MRDRV_TGT_VALID) {
3599 rval = mrsas_service_evt(instance, tgt, 1,
3611 mrsas_tbolt_get_pd_info(instance, pds, tgt);
3622 sd->sd_address.a_hba_tran = instance->tran;
3627 rval = mrsas_config_scsi_device(instance, sd, ldip);
3628 dev_err(instance->dip, CE_CONT,
3658 mrsas_tbolt_get_pd_info(struct mrsas_instance *instance,
3665 ASSERT(instance->tbolt || instance->skinny);
3667 if (instance->tbolt)
3668 cmd = get_raid_msg_pkt(instance);
3670 cmd = mrsas_get_mfi_pkt(instance);
3692 (void) mrsas_alloc_dma_obj(instance, &dcmd_dma_obj,
3715 if (instance->tbolt)
3716 mr_sas_tbolt_build_mfi_cmd(instance, cmd);
3718 instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd);
3723 (void) mrsas_free_dma_obj(instance, dcmd_dma_obj);
3725 if (instance->tbolt)
3726 return_raid_msg_pkt(instance, cmd);
3728 mrsas_return_mfi_pkt(instance, cmd);