Print this page

        

*** 14,60 **** * Rasheed * Shakeel Bukhari */ - #include <stddef.h> #include <sys/types.h> #include <sys/file.h> #include <sys/atomic.h> #include <sys/scsi/scsi.h> #include <sys/byteorder.h> #include "ld_pd_map.h" #include "mr_sas.h" #include "fusion.h" ! // Pre-TB command size and TB command size. ! #define MR_COMMAND_SIZE (64*20) // 1280 bytes MR_LD_RAID *MR_LdRaidGet(U32 ld, MR_FW_RAID_MAP_ALL *map); U16 MR_TargetIdToLdGet(U32 ldTgtId, MR_FW_RAID_MAP_ALL *map); U16 MR_GetLDTgtId(U32 ld, MR_FW_RAID_MAP_ALL *map); ! U16 get_updated_dev_handle(PLD_LOAD_BALANCE_INFO lbInfo, struct IO_REQUEST_INFO *in_info); extern ddi_dma_attr_t mrsas_generic_dma_attr; extern uint32_t mrsas_tbolt_max_cap_maxxfer; extern struct ddi_device_acc_attr endian_attr; extern int debug_level_g; extern unsigned int enable_fp; volatile int dump_io_wait_time = 90; extern void io_timeout_checker(void *arg); - extern int - mfi_state_transition_to_ready(struct mrsas_instance *instance); extern volatile int debug_timeout_g; extern int mrsas_issue_pending_cmds(struct mrsas_instance *); extern int mrsas_complete_pending_cmds(struct mrsas_instance *instance); extern void push_pending_mfi_pkt(struct mrsas_instance *, struct mrsas_cmd *); extern U8 MR_BuildRaidContext(struct mrsas_instance *, struct IO_REQUEST_INFO *, MPI2_SCSI_IO_VENDOR_UNIQUE *, MR_FW_RAID_MAP_ALL *); ! static volatile int debug_tbolt_fw_faults_after_ocr_g = 0; /* * destroy_mfi_mpi_frame_pool */ void destroy_mfi_mpi_frame_pool(struct mrsas_instance *instance) --- 14,79 ---- * Rasheed * Shakeel Bukhari */ #include <sys/types.h> #include <sys/file.h> #include <sys/atomic.h> #include <sys/scsi/scsi.h> #include <sys/byteorder.h> #include "ld_pd_map.h" #include "mr_sas.h" #include "fusion.h" + /* + * FMA header files + */ + #include <sys/ddifm.h> + #include <sys/fm/protocol.h> + #include <sys/fm/util.h> + #include <sys/fm/io/ddi.h> ! ! /* Pre-TB command size and TB command size. */ ! #define MR_COMMAND_SIZE (64*20) /* 1280 bytes */ MR_LD_RAID *MR_LdRaidGet(U32 ld, MR_FW_RAID_MAP_ALL *map); U16 MR_TargetIdToLdGet(U32 ldTgtId, MR_FW_RAID_MAP_ALL *map); U16 MR_GetLDTgtId(U32 ld, MR_FW_RAID_MAP_ALL *map); ! U16 get_updated_dev_handle(PLD_LOAD_BALANCE_INFO, struct IO_REQUEST_INFO *); extern ddi_dma_attr_t mrsas_generic_dma_attr; extern uint32_t mrsas_tbolt_max_cap_maxxfer; extern struct ddi_device_acc_attr endian_attr; extern int debug_level_g; extern unsigned int enable_fp; volatile int dump_io_wait_time = 90; extern void io_timeout_checker(void *arg); extern volatile int debug_timeout_g; extern int mrsas_issue_pending_cmds(struct mrsas_instance *); extern int mrsas_complete_pending_cmds(struct mrsas_instance *instance); extern void push_pending_mfi_pkt(struct mrsas_instance *, struct mrsas_cmd *); extern U8 MR_BuildRaidContext(struct mrsas_instance *, struct IO_REQUEST_INFO *, MPI2_SCSI_IO_VENDOR_UNIQUE *, MR_FW_RAID_MAP_ALL *); ! /* Local static prototypes. */ ! static struct mrsas_cmd *mrsas_tbolt_build_cmd(struct mrsas_instance *, ! struct scsi_address *, struct scsi_pkt *, uchar_t *); ! static void mrsas_tbolt_set_pd_lba(U8 cdb[], uint8_t *cdb_len_ptr, ! U64 start_blk, U32 num_blocks); ! static int mrsas_tbolt_check_map_info(struct mrsas_instance *); ! static int mrsas_tbolt_sync_map_info(struct mrsas_instance *); ! static int mrsas_tbolt_prepare_pkt(struct scsa_cmd *); ! static int mrsas_tbolt_ioc_init(struct mrsas_instance *, dma_obj_t *); ! #ifdef PDSUPPORT ! static void mrsas_tbolt_get_pd_info(struct mrsas_instance *, ! struct mrsas_tbolt_pd_info *, int); ! #endif /* PDSUPPORT */ + static int debug_tbolt_fw_faults_after_ocr_g = 0; + /* * destroy_mfi_mpi_frame_pool */ void destroy_mfi_mpi_frame_pool(struct mrsas_instance *instance)
*** 64,76 **** struct mrsas_cmd *cmd; /* return all mfi frames to pool */ for (i = 0; i < MRSAS_APP_RESERVED_CMDS; i++) { cmd = instance->cmd_list[i]; ! if (cmd->frame_dma_obj_status == DMA_OBJ_ALLOCATED) (void) mrsas_free_dma_obj(instance, cmd->frame_dma_obj); cmd->frame_dma_obj_status = DMA_OBJ_FREED; } } /* --- 83,96 ---- struct mrsas_cmd *cmd; /* return all mfi frames to pool */ for (i = 0; i < MRSAS_APP_RESERVED_CMDS; i++) { cmd = instance->cmd_list[i]; ! if (cmd->frame_dma_obj_status == DMA_OBJ_ALLOCATED) { (void) mrsas_free_dma_obj(instance, cmd->frame_dma_obj); + } cmd->frame_dma_obj_status = DMA_OBJ_FREED; } } /*
*** 93,102 **** --- 113,123 ---- */ void mrsas_tbolt_free_additional_dma_buffer(struct mrsas_instance *instance) { int i; + if (instance->mfi_internal_dma_obj.status == DMA_OBJ_ALLOCATED) { (void) mrsas_free_dma_obj(instance, instance->mfi_internal_dma_obj); instance->mfi_internal_dma_obj.status = DMA_OBJ_FREED; }
*** 143,153 **** */ int create_mpi2_frame_pool(struct mrsas_instance *instance) { int i = 0; - int cookie_cnt; uint16_t max_cmd; uint32_t sgl_sz; uint32_t raid_msg_size; uint32_t total_size; uint32_t offset; --- 164,173 ----
*** 158,173 **** max_cmd = instance->max_fw_cmds; sgl_sz = 1024; raid_msg_size = MRSAS_THUNDERBOLT_MSG_SIZE; ! // Allocating additional 256 bytes to accomodate SMID 0. total_size = MRSAS_THUNDERBOLT_MSG_SIZE + (max_cmd * raid_msg_size) + (max_cmd * sgl_sz) + (max_cmd * SENSE_LENGTH); con_log(CL_ANN1, (CE_NOTE, "create_mpi2_frame_pool: " ! "max_cmd %x ", max_cmd)); con_log(CL_DLEVEL3, (CE_NOTE, "create_mpi2_frame_pool: " "request message frame pool size %x", total_size)); /* --- 178,193 ---- max_cmd = instance->max_fw_cmds; sgl_sz = 1024; raid_msg_size = MRSAS_THUNDERBOLT_MSG_SIZE; ! /* Allocating additional 256 bytes to accomodate SMID 0. */ total_size = MRSAS_THUNDERBOLT_MSG_SIZE + (max_cmd * raid_msg_size) + (max_cmd * sgl_sz) + (max_cmd * SENSE_LENGTH); con_log(CL_ANN1, (CE_NOTE, "create_mpi2_frame_pool: " ! "max_cmd %x", max_cmd)); con_log(CL_DLEVEL3, (CE_NOTE, "create_mpi2_frame_pool: " "request message frame pool size %x", total_size)); /*
*** 201,216 **** (uint8_t *)instance->mpi2_frame_pool_dma_obj.buffer; instance->io_request_frames_phy = (uint32_t) instance->mpi2_frame_pool_dma_obj.dma_cookie[0].dmac_address; ! con_log(CL_DLEVEL3, (CE_NOTE, ! "io_request_frames 0x%x", ! instance->io_request_frames)); ! con_log(CL_DLEVEL3, (CE_NOTE, ! "io_request_frames_phy 0x%x", instance->io_request_frames_phy)); io_req_base = (uint8_t *)instance->io_request_frames + MRSAS_THUNDERBOLT_MSG_SIZE; io_req_base_phys = instance->io_request_frames_phy + --- 221,234 ---- (uint8_t *)instance->mpi2_frame_pool_dma_obj.buffer; instance->io_request_frames_phy = (uint32_t) instance->mpi2_frame_pool_dma_obj.dma_cookie[0].dmac_address; ! con_log(CL_DLEVEL3, (CE_NOTE, "io_request_frames 0x%p", ! (void *)instance->io_request_frames)); ! con_log(CL_DLEVEL3, (CE_NOTE, "io_request_frames_phy 0x%x", instance->io_request_frames_phy)); io_req_base = (uint8_t *)instance->io_request_frames + MRSAS_THUNDERBOLT_MSG_SIZE; io_req_base_phys = instance->io_request_frames_phy +
*** 226,279 **** cmd->scsi_io_request = (Mpi2RaidSCSIIORequest_t *) ((uint8_t *)io_req_base + offset); cmd->scsi_io_request_phys_addr = io_req_base_phys + offset; ! cmd->sgl = (Mpi2SGEIOUnion_t *) ! ((uint8_t *)io_req_base + (max_cmd * raid_msg_size) + i * sgl_sz); ! cmd->sgl_phys_addr = ! (io_req_base_phys + (max_cmd * raid_msg_size) + i * sgl_sz); ! cmd->sense1 = (uint8_t *) ! ((uint8_t *)io_req_base + (max_cmd * raid_msg_size) + (max_cmd * sgl_sz) + (i * SENSE_LENGTH)); ! cmd->sense_phys_addr1 = ! (io_req_base_phys + (max_cmd * raid_msg_size) + (max_cmd * sgl_sz) + (i * SENSE_LENGTH)); ! cmd->SMID = i+1; ! con_log(CL_DLEVEL3, (CE_NOTE, ! "Frame Pool Addr [%x]0x%x", ! cmd->index, cmd->scsi_io_request)); ! con_log(CL_DLEVEL3, (CE_NOTE, ! "Frame Pool Phys Addr [%x]0x%x", cmd->index, cmd->scsi_io_request_phys_addr)); ! con_log(CL_DLEVEL3, (CE_NOTE, ! "Sense Addr [%x]0x%x", ! cmd->index, cmd->sense1)); ! con_log(CL_DLEVEL3, (CE_NOTE, ! "Sense Addr Phys [%x]0x%x", cmd->index, cmd->sense_phys_addr1)); ! con_log(CL_DLEVEL3, (CE_NOTE, ! "Sgl bufffers [%x]0x%x", ! cmd->index, cmd->sgl)); ! ! con_log(CL_DLEVEL3, (CE_NOTE, ! "Sgl bufffers phys [%x]0x%x", cmd->index, cmd->sgl_phys_addr)); } return (DDI_SUCCESS); --- 244,286 ---- cmd->scsi_io_request = (Mpi2RaidSCSIIORequest_t *) ((uint8_t *)io_req_base + offset); cmd->scsi_io_request_phys_addr = io_req_base_phys + offset; ! cmd->sgl = (Mpi2SGEIOUnion_t *)((uint8_t *)io_req_base + (max_cmd * raid_msg_size) + i * sgl_sz); ! cmd->sgl_phys_addr = (io_req_base_phys + (max_cmd * raid_msg_size) + i * sgl_sz); ! cmd->sense1 = (uint8_t *)((uint8_t *)io_req_base + (max_cmd * raid_msg_size) + (max_cmd * sgl_sz) + (i * SENSE_LENGTH)); ! cmd->sense_phys_addr1 = (io_req_base_phys + (max_cmd * raid_msg_size) + (max_cmd * sgl_sz) + (i * SENSE_LENGTH)); ! cmd->SMID = i + 1; ! con_log(CL_DLEVEL3, (CE_NOTE, "Frame Pool Addr [%x]0x%p", ! cmd->index, (void *)cmd->scsi_io_request)); ! con_log(CL_DLEVEL3, (CE_NOTE, "Frame Pool Phys Addr [%x]0x%x", cmd->index, cmd->scsi_io_request_phys_addr)); ! con_log(CL_DLEVEL3, (CE_NOTE, "Sense Addr [%x]0x%p", ! cmd->index, (void *)cmd->sense1)); ! con_log(CL_DLEVEL3, (CE_NOTE, "Sense Addr Phys [%x]0x%x", cmd->index, cmd->sense_phys_addr1)); + con_log(CL_DLEVEL3, (CE_NOTE, "Sgl bufffers [%x]0x%p", + cmd->index, (void *)cmd->sgl)); ! con_log(CL_DLEVEL3, (CE_NOTE, "Sgl bufffers phys [%x]0x%x", cmd->index, cmd->sgl_phys_addr)); } return (DDI_SUCCESS);
*** 297,307 **** instance->mfi_internal_dma_obj.size = internal_buf_size; instance->mfi_internal_dma_obj.dma_attr = mrsas_generic_dma_attr; instance->mfi_internal_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; ! instance->mfi_internal_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU; instance->mfi_internal_dma_obj.dma_attr.dma_attr_sgllen = 1; if (mrsas_alloc_dma_obj(instance, &instance->mfi_internal_dma_obj, (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) { cmn_err(CE_WARN, --- 304,315 ---- instance->mfi_internal_dma_obj.size = internal_buf_size; instance->mfi_internal_dma_obj.dma_attr = mrsas_generic_dma_attr; instance->mfi_internal_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; ! instance->mfi_internal_dma_obj.dma_attr.dma_attr_count_max = ! 0xFFFFFFFFU; instance->mfi_internal_dma_obj.dma_attr.dma_attr_sgllen = 1; if (mrsas_alloc_dma_obj(instance, &instance->mfi_internal_dma_obj, (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) { cmn_err(CE_WARN,
*** 310,321 **** } bzero(instance->mfi_internal_dma_obj.buffer, internal_buf_size); instance->mfi_internal_dma_obj.status |= DMA_OBJ_ALLOCATED; ! instance->internal_buf = (caddr_t)(((unsigned long) ! instance->mfi_internal_dma_obj.buffer)); instance->internal_buf_dmac_add = instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address; instance->internal_buf_size = internal_buf_size; /* allocate evt_detail */ --- 318,329 ---- } bzero(instance->mfi_internal_dma_obj.buffer, internal_buf_size); instance->mfi_internal_dma_obj.status |= DMA_OBJ_ALLOCATED; ! instance->internal_buf = ! (caddr_t)(((unsigned long)instance->mfi_internal_dma_obj.buffer)); instance->internal_buf_dmac_add = instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address; instance->internal_buf_size = internal_buf_size; /* allocate evt_detail */
*** 326,337 **** instance->mfi_evt_detail_obj.dma_attr.dma_attr_sgllen = 1; instance->mfi_evt_detail_obj.dma_attr.dma_attr_align = 8; if (mrsas_alloc_dma_obj(instance, &instance->mfi_evt_detail_obj, (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) { ! cmn_err(CE_WARN, ! "mrsas_tbolt_alloc_additional_dma_buffer: " "could not allocate data transfer buffer."); goto fail_tbolt_additional_buff; } bzero(instance->mfi_evt_detail_obj.buffer, --- 334,344 ---- instance->mfi_evt_detail_obj.dma_attr.dma_attr_sgllen = 1; instance->mfi_evt_detail_obj.dma_attr.dma_attr_align = 8; if (mrsas_alloc_dma_obj(instance, &instance->mfi_evt_detail_obj, (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) { ! cmn_err(CE_WARN, "mrsas_tbolt_alloc_additional_dma_buffer: " "could not allocate data transfer buffer."); goto fail_tbolt_additional_buff; } bzero(instance->mfi_evt_detail_obj.buffer,
*** 345,355 **** for (i = 0; i < 2; i++) { /* allocate the data transfer buffer */ instance->ld_map_obj[i].size = instance->size_map_info; instance->ld_map_obj[i].dma_attr = mrsas_generic_dma_attr; instance->ld_map_obj[i].dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; ! instance->ld_map_obj[i].dma_attr.dma_attr_count_max = 0xFFFFFFFFU; instance->ld_map_obj[i].dma_attr.dma_attr_sgllen = 1; instance->ld_map_obj[i].dma_attr.dma_attr_align = 1; if (mrsas_alloc_dma_obj(instance, &instance->ld_map_obj[i], (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) { --- 352,363 ---- for (i = 0; i < 2; i++) { /* allocate the data transfer buffer */ instance->ld_map_obj[i].size = instance->size_map_info; instance->ld_map_obj[i].dma_attr = mrsas_generic_dma_attr; instance->ld_map_obj[i].dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; ! instance->ld_map_obj[i].dma_attr.dma_attr_count_max = ! 0xFFFFFFFFU; instance->ld_map_obj[i].dma_attr.dma_attr_sgllen = 1; instance->ld_map_obj[i].dma_attr.dma_attr_align = 1; if (mrsas_alloc_dma_obj(instance, &instance->ld_map_obj[i], (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
*** 358,380 **** goto fail_tbolt_additional_buff; } instance->ld_map_obj[i].status |= DMA_OBJ_ALLOCATED; ! (void) memset(instance->ld_map_obj[i].buffer, 0, ! instance->size_map_info); ! instance->ld_map[i] = (MR_FW_RAID_MAP_ALL *)instance->ld_map_obj[i].buffer; ! instance->ld_map_phy[i] = ! (uint32_t)instance->ld_map_obj[i].dma_cookie[0].dmac_address; con_log(CL_DLEVEL3, (CE_NOTE, "ld_map Addr Phys 0x%x", instance->ld_map_phy[i])); con_log(CL_DLEVEL3, (CE_NOTE, "size_map_info 0x%x", instance->size_map_info)); - } return (DDI_SUCCESS); fail_tbolt_additional_buff: --- 366,387 ---- goto fail_tbolt_additional_buff; } instance->ld_map_obj[i].status |= DMA_OBJ_ALLOCATED; ! bzero(instance->ld_map_obj[i].buffer, instance->size_map_info); ! instance->ld_map[i] = ! (MR_FW_RAID_MAP_ALL *)instance->ld_map_obj[i].buffer; ! instance->ld_map_phy[i] = (uint32_t)instance-> ! ld_map_obj[i].dma_cookie[0].dmac_address; con_log(CL_DLEVEL3, (CE_NOTE, "ld_map Addr Phys 0x%x", instance->ld_map_phy[i])); con_log(CL_DLEVEL3, (CE_NOTE, "size_map_info 0x%x", instance->size_map_info)); } return (DDI_SUCCESS); fail_tbolt_additional_buff:
*** 382,413 **** return (DDI_FAILURE); } MRSAS_REQUEST_DESCRIPTOR_UNION * ! mr_sas_get_request_descriptor(struct mrsas_instance *instance, ! uint16_t index, struct mrsas_cmd *cmd) { MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc; if (index > instance->max_fw_cmds) { con_log(CL_ANN1, (CE_NOTE, "Invalid SMID 0x%x request for descriptor", index)); con_log(CL_ANN1, (CE_NOTE, ! "max_fw_cmds : 0x%x\n", instance->max_fw_cmds)); return (NULL); } req_desc = (MRSAS_REQUEST_DESCRIPTOR_UNION *) ((char *)instance->request_message_pool + (sizeof (MRSAS_REQUEST_DESCRIPTOR_UNION) * index)); con_log(CL_ANN1, (CE_NOTE, ! "request descriptor : 0x%08lx\n", (unsigned long)req_desc)); con_log(CL_ANN1, (CE_NOTE, ! "request descriptor base phy : 0x%08lx\n", (unsigned long)instance->request_message_pool_phy)); return ((MRSAS_REQUEST_DESCRIPTOR_UNION *)req_desc); } --- 389,419 ---- return (DDI_FAILURE); } MRSAS_REQUEST_DESCRIPTOR_UNION * ! mr_sas_get_request_descriptor(struct mrsas_instance *instance, uint16_t index) { MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc; if (index > instance->max_fw_cmds) { con_log(CL_ANN1, (CE_NOTE, "Invalid SMID 0x%x request for descriptor", index)); con_log(CL_ANN1, (CE_NOTE, ! "max_fw_cmds : 0x%x", instance->max_fw_cmds)); return (NULL); } req_desc = (MRSAS_REQUEST_DESCRIPTOR_UNION *) ((char *)instance->request_message_pool + (sizeof (MRSAS_REQUEST_DESCRIPTOR_UNION) * index)); con_log(CL_ANN1, (CE_NOTE, ! "request descriptor : 0x%08lx", (unsigned long)req_desc)); con_log(CL_ANN1, (CE_NOTE, ! "request descriptor base phy : 0x%08lx", (unsigned long)instance->request_message_pool_phy)); return ((MRSAS_REQUEST_DESCRIPTOR_UNION *)req_desc); }
*** 417,450 **** */ int alloc_req_rep_desc(struct mrsas_instance *instance) { uint32_t request_q_sz, reply_q_sz; ! int i, max_request_q_sz, max_reply_q_sz; ! uint64_t request_desc; MPI2_REPLY_DESCRIPTORS_UNION *reply_desc; - uint64_t *reply_ptr; /* * ThunderBolt(TB) There's no longer producer consumer mechanism. * Once we have an interrupt we are supposed to scan through the list of * reply descriptors and process them accordingly. We would be needing * to allocate memory for 1024 reply descriptors */ /* Allocate Reply Descriptors */ ! con_log(CL_ANN1, (CE_NOTE, " reply q desc len = %x\n", ! sizeof (MPI2_REPLY_DESCRIPTORS_UNION))); ! // reply queue size should be multiple of 16 max_reply_q_sz = ((instance->max_fw_cmds + 1 + 15)/16)*16; reply_q_sz = 8 * max_reply_q_sz; ! con_log(CL_ANN1, (CE_NOTE, " reply q desc len = %x\n", ! sizeof (MPI2_REPLY_DESCRIPTORS_UNION))); instance->reply_desc_dma_obj.size = reply_q_sz; instance->reply_desc_dma_obj.dma_attr = mrsas_generic_dma_attr; instance->reply_desc_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; instance->reply_desc_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU; --- 423,454 ---- */ int alloc_req_rep_desc(struct mrsas_instance *instance) { uint32_t request_q_sz, reply_q_sz; ! int i, max_reply_q_sz; MPI2_REPLY_DESCRIPTORS_UNION *reply_desc; /* * ThunderBolt(TB) There's no longer producer consumer mechanism. * Once we have an interrupt we are supposed to scan through the list of * reply descriptors and process them accordingly. We would be needing * to allocate memory for 1024 reply descriptors */ /* Allocate Reply Descriptors */ ! con_log(CL_ANN1, (CE_NOTE, " reply q desc len = %x", ! (uint_t)sizeof (MPI2_REPLY_DESCRIPTORS_UNION))); ! /* reply queue size should be multiple of 16 */ max_reply_q_sz = ((instance->max_fw_cmds + 1 + 15)/16)*16; reply_q_sz = 8 * max_reply_q_sz; ! con_log(CL_ANN1, (CE_NOTE, " reply q desc len = %x", ! (uint_t)sizeof (MPI2_REPLY_DESCRIPTORS_UNION))); instance->reply_desc_dma_obj.size = reply_q_sz; instance->reply_desc_dma_obj.dma_attr = mrsas_generic_dma_attr; instance->reply_desc_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; instance->reply_desc_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
*** 459,479 **** } bzero(instance->reply_desc_dma_obj.buffer, reply_q_sz); instance->reply_desc_dma_obj.status |= DMA_OBJ_ALLOCATED; ! // virtual address of reply queue instance->reply_frame_pool = (MPI2_REPLY_DESCRIPTORS_UNION *)( instance->reply_desc_dma_obj.buffer); instance->reply_q_depth = max_reply_q_sz; con_log(CL_ANN1, (CE_NOTE, "[reply queue depth]0x%x", instance->reply_q_depth)); ! con_log(CL_ANN1, (CE_NOTE, "[reply queue virt addr]0x%x", ! instance->reply_frame_pool)); /* initializing reply address to 0xFFFFFFFF */ reply_desc = instance->reply_frame_pool; for (i = 0; i < instance->reply_q_depth; i++) { --- 463,483 ---- } bzero(instance->reply_desc_dma_obj.buffer, reply_q_sz); instance->reply_desc_dma_obj.status |= DMA_OBJ_ALLOCATED; ! /* virtual address of reply queue */ instance->reply_frame_pool = (MPI2_REPLY_DESCRIPTORS_UNION *)( instance->reply_desc_dma_obj.buffer); instance->reply_q_depth = max_reply_q_sz; con_log(CL_ANN1, (CE_NOTE, "[reply queue depth]0x%x", instance->reply_q_depth)); ! con_log(CL_ANN1, (CE_NOTE, "[reply queue virt addr]0x%p", ! (void *)instance->reply_frame_pool)); /* initializing reply address to 0xFFFFFFFF */ reply_desc = instance->reply_frame_pool; for (i = 0; i < instance->reply_q_depth; i++) {
*** 494,517 **** con_log(CL_ANN1, (CE_NOTE, "[reply pool limit phys addr]0x%x", instance->reply_pool_limit_phy)); ! con_log(CL_ANN1, (CE_NOTE, " request q desc len = %x\n", ! sizeof (MRSAS_REQUEST_DESCRIPTOR_UNION))); /* Allocate Request Descriptors */ ! con_log(CL_ANN1, (CE_NOTE, " request q desc len = %x\n", ! sizeof (MRSAS_REQUEST_DESCRIPTOR_UNION))); request_q_sz = 8 * (instance->max_fw_cmds); instance->request_desc_dma_obj.size = request_q_sz; instance->request_desc_dma_obj.dma_attr = mrsas_generic_dma_attr; instance->request_desc_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; ! instance->request_desc_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU; instance->request_desc_dma_obj.dma_attr.dma_attr_sgllen = 1; instance->request_desc_dma_obj.dma_attr.dma_attr_align = 16; if (mrsas_alloc_dma_obj(instance, &instance->request_desc_dma_obj, (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) { --- 498,522 ---- con_log(CL_ANN1, (CE_NOTE, "[reply pool limit phys addr]0x%x", instance->reply_pool_limit_phy)); ! con_log(CL_ANN1, (CE_NOTE, " request q desc len = %x", ! (int)sizeof (MRSAS_REQUEST_DESCRIPTOR_UNION))); /* Allocate Request Descriptors */ ! con_log(CL_ANN1, (CE_NOTE, " request q desc len = %x", ! (int)sizeof (MRSAS_REQUEST_DESCRIPTOR_UNION))); request_q_sz = 8 * (instance->max_fw_cmds); instance->request_desc_dma_obj.size = request_q_sz; instance->request_desc_dma_obj.dma_attr = mrsas_generic_dma_attr; instance->request_desc_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; ! instance->request_desc_dma_obj.dma_attr.dma_attr_count_max = ! 0xFFFFFFFFU; instance->request_desc_dma_obj.dma_attr.dma_attr_sgllen = 1; instance->request_desc_dma_obj.dma_attr.dma_attr_align = 16; if (mrsas_alloc_dma_obj(instance, &instance->request_desc_dma_obj, (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
*** 528,539 **** (instance->request_desc_dma_obj.buffer); instance->request_message_pool_phy = (uint32_t)instance->request_desc_dma_obj.dma_cookie[0].dmac_address; - max_request_q_sz = instance->max_fw_cmds; - return (DDI_SUCCESS); fail_undo_reply_queue: if (instance->reply_desc_dma_obj.status == DMA_OBJ_ALLOCATED) { (void) mrsas_free_dma_obj(instance, --- 533,542 ----
*** 544,554 **** return (DDI_FAILURE); } /* * mrsas_alloc_cmd_pool_tbolt ! * TODO: merge tbolt-specific codee into mrsas_alloc_cmd_pool() to have single routine */ int mrsas_alloc_cmd_pool_tbolt(struct mrsas_instance *instance) { int i; --- 547,559 ---- return (DDI_FAILURE); } /* * mrsas_alloc_cmd_pool_tbolt ! * ! * TODO: merge tbolt-specific code into mrsas_alloc_cmd_pool() to have single ! * routine */ int mrsas_alloc_cmd_pool_tbolt(struct mrsas_instance *instance) { int i;
*** 570,605 **** * instance->cmd_list is an array of struct mrsas_cmd pointers. * Allocate the dynamic array first and then allocate individual * commands. */ instance->cmd_list = kmem_zalloc(sz, KM_SLEEP); - if (instance->cmd_list == NULL) { - con_log(CL_NONE, (CE_WARN, - "Failed to allocate memory for cmd_list")); - return (DDI_FAILURE); - } /* create a frame pool and assign one frame to each cmd */ for (count = 0; count < max_cmd; count++) { ! instance->cmd_list[count] = kmem_zalloc(sizeof (struct mrsas_cmd), ! KM_SLEEP); ! if (instance->cmd_list[count] == NULL) { ! con_log(CL_NONE, (CE_WARN, ! "Failed to allocate memory for mrsas_cmd")); ! goto mrsas_undo_cmds; } - } /* add all the commands to command pool */ INIT_LIST_HEAD(&instance->cmd_pool_list); INIT_LIST_HEAD(&instance->cmd_pend_list); INIT_LIST_HEAD(&instance->cmd_app_pool_list); reserve_cmd = MRSAS_APP_RESERVED_CMDS; ! for (i = 1; i < reserve_cmd; i++) { //cmd index 0 reservered for IOC INIT cmd = instance->cmd_list[i]; cmd->index = i; mlist_add_tail(&cmd->list, &instance->cmd_app_pool_list); } --- 575,601 ---- * instance->cmd_list is an array of struct mrsas_cmd pointers. * Allocate the dynamic array first and then allocate individual * commands. */ instance->cmd_list = kmem_zalloc(sz, KM_SLEEP); /* create a frame pool and assign one frame to each cmd */ for (count = 0; count < max_cmd; count++) { ! instance->cmd_list[count] = ! kmem_zalloc(sizeof (struct mrsas_cmd), KM_SLEEP); } /* add all the commands to command pool */ INIT_LIST_HEAD(&instance->cmd_pool_list); INIT_LIST_HEAD(&instance->cmd_pend_list); INIT_LIST_HEAD(&instance->cmd_app_pool_list); reserve_cmd = MRSAS_APP_RESERVED_CMDS; ! /* cmd index 0 reservered for IOC INIT */ ! for (i = 1; i < reserve_cmd; i++) { cmd = instance->cmd_list[i]; cmd->index = i; mlist_add_tail(&cmd->list, &instance->cmd_app_pool_list); }
*** 614,632 **** mrsas_undo_cmds: if (count > 0) { /* free each cmd */ for (i = 0; i < count; i++) { ! if (instance->cmd_list[i] != NULL) ! kmem_free(instance->cmd_list[i],sizeof (struct mrsas_cmd)); instance->cmd_list[i] = NULL; } } mrsas_undo_cmd_list: if (instance->cmd_list != NULL) ! kmem_free(instance->cmd_list,sz); instance->cmd_list = NULL; return (DDI_FAILURE); } --- 610,630 ---- mrsas_undo_cmds: if (count > 0) { /* free each cmd */ for (i = 0; i < count; i++) { ! if (instance->cmd_list[i] != NULL) { ! kmem_free(instance->cmd_list[i], ! sizeof (struct mrsas_cmd)); ! } instance->cmd_list[i] = NULL; } } mrsas_undo_cmd_list: if (instance->cmd_list != NULL) ! kmem_free(instance->cmd_list, sz); instance->cmd_list = NULL; return (DDI_FAILURE); }
*** 664,674 **** * ThunderBolt(TB) memory allocations for commands/messages/frames. */ int alloc_space_for_mpi2(struct mrsas_instance *instance) { ! /* Allocate command pool ( memory for cmd_list & individual commands )*/ if (mrsas_alloc_cmd_pool_tbolt(instance)) { cmn_err(CE_WARN, "Error creating cmd pool"); return (DDI_FAILURE); } --- 662,672 ---- * ThunderBolt(TB) memory allocations for commands/messages/frames. */ int alloc_space_for_mpi2(struct mrsas_instance *instance) { ! /* Allocate command pool (memory for cmd_list & individual commands) */ if (mrsas_alloc_cmd_pool_tbolt(instance)) { cmn_err(CE_WARN, "Error creating cmd pool"); return (DDI_FAILURE); }
*** 764,774 **** /* * mrsas_init_adapter_tbolt - Initialize fusion interface adapter. */ int ! mrsas_init_adapter_tbolt (struct mrsas_instance *instance) { /* * Reduce the max supported cmds by 1. This is to ensure that the * reply_q_sz (1 more than the max cmd that driver may send) --- 762,772 ---- /* * mrsas_init_adapter_tbolt - Initialize fusion interface adapter. */ int ! mrsas_init_adapter_tbolt(struct mrsas_instance *instance) { /* * Reduce the max supported cmds by 1. This is to ensure that the * reply_q_sz (1 more than the max cmd that driver may send)
*** 783,817 **** con_log(CL_ANN, (CE_NOTE, "mrsas_init_adapter_tbolt: " " instance->max_fw_cmds 0x%X.", instance->max_fw_cmds)); /* create a pool of commands */ ! if ( alloc_space_for_mpi2(instance) != DDI_SUCCESS) { cmn_err(CE_WARN, " alloc_space_for_mpi2() failed."); return (DDI_FAILURE); } /* Send ioc init message */ ! if ( mrsas_issue_init_mpi2(instance) != DDI_SUCCESS) { cmn_err(CE_WARN, " mrsas_issue_init_mpi2() failed."); goto fail_init_fusion; } instance->unroll.alloc_space_mpi2 = 1; con_log(CL_ANN, (CE_NOTE, ! "mrsas_init_adapter_tbolt: SUCCESSFULL\n")); return (DDI_SUCCESS); fail_init_fusion: - - fail_undo_alloc_mpi2: free_space_for_mpi2(instance); return (DDI_FAILURE); } --- 781,814 ---- con_log(CL_ANN, (CE_NOTE, "mrsas_init_adapter_tbolt: " " instance->max_fw_cmds 0x%X.", instance->max_fw_cmds)); /* create a pool of commands */ ! if (alloc_space_for_mpi2(instance) != DDI_SUCCESS) { cmn_err(CE_WARN, " alloc_space_for_mpi2() failed."); return (DDI_FAILURE); } /* Send ioc init message */ ! /* NOTE: the issue_init call does FMA checking already. */ ! if (mrsas_issue_init_mpi2(instance) != DDI_SUCCESS) { cmn_err(CE_WARN, " mrsas_issue_init_mpi2() failed."); goto fail_init_fusion; } instance->unroll.alloc_space_mpi2 = 1; con_log(CL_ANN, (CE_NOTE, ! "mrsas_init_adapter_tbolt: SUCCESSFUL")); return (DDI_SUCCESS); fail_init_fusion: free_space_for_mpi2(instance); return (DDI_FAILURE); }
*** 838,919 **** (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) { cmn_err(CE_WARN, "mr_sas_issue_init_mpi2 " "could not allocate data transfer buffer."); return (DDI_FAILURE); } ! (void) memset(init2_dma_obj.buffer, 2, ! sizeof (Mpi2IOCInitRequest_t)); con_log(CL_ANN1, (CE_NOTE, ! "mrsas_issue_init_mpi2 _phys adr: %x \n", init2_dma_obj.dma_cookie[0].dmac_address)); /* Initialize and send ioc init message */ ! ret_val = mrsas_tbolt_ioc_init(instance, &init2_dma_obj, ! init2_dma_obj.acc_handle); if (ret_val == DDI_FAILURE) { con_log(CL_ANN1, (CE_WARN, ! "mrsas_issue_init_mpi2: Failed\n")); goto fail_init_mpi2; } /* free IOC init DMA buffer */ if (mrsas_free_dma_obj(instance, init2_dma_obj) != DDI_SUCCESS) { con_log(CL_ANN1, (CE_WARN, ! "mrsas_issue_init_mpi2: Free Failed\n")); return (DDI_FAILURE); } - /* Get/Check and sync ld_map info */ instance->map_id = 0; ! if( mrsas_tbolt_check_map_info(instance) == DDI_SUCCESS ) ! mrsas_tbolt_sync_map_info(instance); con_log(CL_ANN, (CE_NOTE, ! "mrsas_issue_init_mpi2: SUCCESSFULL\n")); return (DDI_SUCCESS); fail_init_mpi2: ! mrsas_free_dma_obj(instance, init2_dma_obj); return (DDI_FAILURE); } ! int ! mrsas_tbolt_ioc_init(struct mrsas_instance *instance, dma_obj_t *mpi2_dma_obj, ! ddi_acc_handle_t accessp) { ! int numbytes, i; ! int ret = DDI_SUCCESS; uint16_t flags; - int status; - timespec_t time; - uint64_t mSec; - uint32_t msecs = MFI_POLL_TIMEOUT_SECS * MILLISEC; struct mrsas_init_frame2 *mfiFrameInit2; struct mrsas_header *frame_hdr; Mpi2IOCInitRequest_t *init; struct mrsas_cmd *cmd = NULL; struct mrsas_drv_ver drv_ver_info; MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc; - con_log(CL_ANN, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__)); #ifdef DEBUG con_log(CL_ANN1, (CE_CONT, " mfiFrameInit2 len = %x\n", ! sizeof (*mfiFrameInit2))); ! con_log(CL_ANN1, (CE_CONT, " MPI len = %x\n", sizeof (*init))); con_log(CL_ANN1, (CE_CONT, " mfiFrameInit2 len = %x\n", ! sizeof (struct mrsas_init_frame2))); con_log(CL_ANN1, (CE_CONT, " MPI len = %x\n", ! sizeof (Mpi2IOCInitRequest_t))); #endif init = (Mpi2IOCInitRequest_t *)mpi2_dma_obj->buffer; numbytes = sizeof (*init); bzero(init, numbytes); --- 835,911 ---- (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) { cmn_err(CE_WARN, "mr_sas_issue_init_mpi2 " "could not allocate data transfer buffer."); return (DDI_FAILURE); } ! (void) memset(init2_dma_obj.buffer, 2, sizeof (Mpi2IOCInitRequest_t)); con_log(CL_ANN1, (CE_NOTE, ! "mrsas_issue_init_mpi2 _phys adr: %x", init2_dma_obj.dma_cookie[0].dmac_address)); /* Initialize and send ioc init message */ ! ret_val = mrsas_tbolt_ioc_init(instance, &init2_dma_obj); if (ret_val == DDI_FAILURE) { con_log(CL_ANN1, (CE_WARN, ! "mrsas_issue_init_mpi2: Failed")); goto fail_init_mpi2; } /* free IOC init DMA buffer */ if (mrsas_free_dma_obj(instance, init2_dma_obj) != DDI_SUCCESS) { con_log(CL_ANN1, (CE_WARN, ! "mrsas_issue_init_mpi2: Free Failed")); return (DDI_FAILURE); } /* Get/Check and sync ld_map info */ instance->map_id = 0; ! if (mrsas_tbolt_check_map_info(instance) == DDI_SUCCESS) ! (void) mrsas_tbolt_sync_map_info(instance); + + /* No mrsas_cmd to send, so send NULL. */ + if (mrsas_common_check(instance, NULL) != DDI_SUCCESS) + goto fail_init_mpi2; + con_log(CL_ANN, (CE_NOTE, ! "mrsas_issue_init_mpi2: SUCCESSFUL")); return (DDI_SUCCESS); fail_init_mpi2: ! (void) mrsas_free_dma_obj(instance, init2_dma_obj); return (DDI_FAILURE); } ! static int ! mrsas_tbolt_ioc_init(struct mrsas_instance *instance, dma_obj_t *mpi2_dma_obj) { ! int numbytes; uint16_t flags; struct mrsas_init_frame2 *mfiFrameInit2; struct mrsas_header *frame_hdr; Mpi2IOCInitRequest_t *init; struct mrsas_cmd *cmd = NULL; struct mrsas_drv_ver drv_ver_info; MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc; con_log(CL_ANN, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__)); #ifdef DEBUG con_log(CL_ANN1, (CE_CONT, " mfiFrameInit2 len = %x\n", ! (int)sizeof (*mfiFrameInit2))); ! con_log(CL_ANN1, (CE_CONT, " MPI len = %x\n", (int)sizeof (*init))); con_log(CL_ANN1, (CE_CONT, " mfiFrameInit2 len = %x\n", ! (int)sizeof (struct mrsas_init_frame2))); con_log(CL_ANN1, (CE_CONT, " MPI len = %x\n", ! (int)sizeof (Mpi2IOCInitRequest_t))); #endif init = (Mpi2IOCInitRequest_t *)mpi2_dma_obj->buffer; numbytes = sizeof (*init); bzero(init, numbytes);
*** 967,977 **** cmd->retry_count_for_ocr = 0; cmd->pkt = NULL; cmd->drv_pkt_time = 0; mfiFrameInit2 = (struct mrsas_init_frame2 *)cmd->scsi_io_request; ! con_log(CL_ANN1, (CE_CONT, "[mfi vaddr]%x", mfiFrameInit2)); frame_hdr = &cmd->frame->hdr; ddi_put8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status, MFI_CMD_STATUS_POLL_MODE); --- 959,969 ---- cmd->retry_count_for_ocr = 0; cmd->pkt = NULL; cmd->drv_pkt_time = 0; mfiFrameInit2 = (struct mrsas_init_frame2 *)cmd->scsi_io_request; ! con_log(CL_ANN1, (CE_CONT, "[mfi vaddr]%p", (void *)mfiFrameInit2)); frame_hdr = &cmd->frame->hdr; ddi_put8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status, MFI_CMD_STATUS_POLL_MODE);
*** 983,993 **** ddi_put16(cmd->frame_dma_obj.acc_handle, &frame_hdr->flags, flags); con_log(CL_ANN, (CE_CONT, "mrsas_tbolt_ioc_init: SMID:%x\n", cmd->SMID)); ! // Init the MFI Header ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, &mfiFrameInit2->cmd, MFI_CMD_OP_INIT); con_log(CL_ANN1, (CE_CONT, "[CMD]%x", mfiFrameInit2->cmd)); --- 975,985 ---- ddi_put16(cmd->frame_dma_obj.acc_handle, &frame_hdr->flags, flags); con_log(CL_ANN, (CE_CONT, "mrsas_tbolt_ioc_init: SMID:%x\n", cmd->SMID)); ! /* Init the MFI Header */ ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, &mfiFrameInit2->cmd, MFI_CMD_OP_INIT); con_log(CL_ANN1, (CE_CONT, "[CMD]%x", mfiFrameInit2->cmd));
*** 1004,1020 **** ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, &mfiFrameInit2->data_xfer_len, sizeof (Mpi2IOCInitRequest_t)); con_log(CL_ANN1, (CE_CONT, "[reply q desc addr]%x", ! init->ReplyDescriptorPostQueueAddress)); ! /* fill driver version information*/ fill_up_drv_ver(&drv_ver_info); /* allocate the driver version data transfer buffer */ ! instance->drv_ver_dma_obj.size = sizeof(drv_ver_info.drv_ver); instance->drv_ver_dma_obj.dma_attr = mrsas_generic_dma_attr; instance->drv_ver_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; instance->drv_ver_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU; instance->drv_ver_dma_obj.dma_attr.dma_attr_sgllen = 1; instance->drv_ver_dma_obj.dma_attr.dma_attr_align = 1; --- 996,1012 ---- ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, &mfiFrameInit2->data_xfer_len, sizeof (Mpi2IOCInitRequest_t)); con_log(CL_ANN1, (CE_CONT, "[reply q desc addr]%x", ! (int)init->ReplyDescriptorPostQueueAddress)); ! /* fill driver version information */ fill_up_drv_ver(&drv_ver_info); /* allocate the driver version data transfer buffer */ ! instance->drv_ver_dma_obj.size = sizeof (drv_ver_info.drv_ver); instance->drv_ver_dma_obj.dma_attr = mrsas_generic_dma_attr; instance->drv_ver_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU; instance->drv_ver_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU; instance->drv_ver_dma_obj.dma_attr.dma_attr_sgllen = 1; instance->drv_ver_dma_obj.dma_attr.dma_attr_align = 1;
*** 1023,1051 **** (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) { cmn_err(CE_WARN, "fusion init: Could not allocate driver version buffer."); return (DDI_FAILURE); } ! /* copy driver version to dma buffer*/ ! (void) memset(instance->drv_ver_dma_obj.buffer, 0,sizeof(drv_ver_info.drv_ver)); ddi_rep_put8(cmd->frame_dma_obj.acc_handle, (uint8_t *)drv_ver_info.drv_ver, (uint8_t *)instance->drv_ver_dma_obj.buffer, ! sizeof(drv_ver_info.drv_ver), DDI_DEV_AUTOINCR); ! /*send driver version physical address to firmware*/ ! ddi_put64(cmd->frame_dma_obj.acc_handle, ! &mfiFrameInit2->driverversion, instance->drv_ver_dma_obj.dma_cookie[0].dmac_address); con_log(CL_ANN1, (CE_CONT, "[MPIINIT2 frame Phys addr ]0x%x len = %x", mfiFrameInit2->queue_info_new_phys_addr_lo, ! sizeof (Mpi2IOCInitRequest_t))); con_log(CL_ANN1, (CE_CONT, "[Length]%x", mfiFrameInit2->data_xfer_len)); con_log(CL_ANN1, (CE_CONT, "[MFI frame Phys Address]%x len = %x", ! cmd->scsi_io_request_phys_addr, sizeof (struct mrsas_init_frame2))); /* disable interrupts before sending INIT2 frame */ instance->func_ptr->disable_intr(instance); req_desc = (MRSAS_REQUEST_DESCRIPTOR_UNION *) --- 1015,1044 ---- (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) { cmn_err(CE_WARN, "fusion init: Could not allocate driver version buffer."); return (DDI_FAILURE); } ! /* copy driver version to dma buffer */ ! bzero(instance->drv_ver_dma_obj.buffer, sizeof (drv_ver_info.drv_ver)); ddi_rep_put8(cmd->frame_dma_obj.acc_handle, (uint8_t *)drv_ver_info.drv_ver, (uint8_t *)instance->drv_ver_dma_obj.buffer, ! sizeof (drv_ver_info.drv_ver), DDI_DEV_AUTOINCR); ! /* send driver version physical address to firmware */ ! ddi_put64(cmd->frame_dma_obj.acc_handle, &mfiFrameInit2->driverversion, ! instance->drv_ver_dma_obj.dma_cookie[0].dmac_address); con_log(CL_ANN1, (CE_CONT, "[MPIINIT2 frame Phys addr ]0x%x len = %x", mfiFrameInit2->queue_info_new_phys_addr_lo, ! (int)sizeof (Mpi2IOCInitRequest_t))); con_log(CL_ANN1, (CE_CONT, "[Length]%x", mfiFrameInit2->data_xfer_len)); con_log(CL_ANN1, (CE_CONT, "[MFI frame Phys Address]%x len = %x", ! cmd->scsi_io_request_phys_addr, ! (int)sizeof (struct mrsas_init_frame2))); /* disable interrupts before sending INIT2 frame */ instance->func_ptr->disable_intr(instance); req_desc = (MRSAS_REQUEST_DESCRIPTOR_UNION *)
*** 1064,1074 **** frame_hdr->cmd_status)); if (ddi_get8(instance->mpi2_frame_pool_dma_obj.acc_handle, &mfiFrameInit2->cmd_status) == 0) { con_log(CL_ANN, (CE_NOTE, "INIT2 Success")); - ret = DDI_SUCCESS; } else { con_log(CL_ANN, (CE_WARN, "INIT2 Fail")); mrsas_dump_reply_desc(instance); goto fail_ioc_init; } --- 1057,1066 ----
*** 1075,1099 **** mrsas_dump_reply_desc(instance); instance->unroll.verBuff = 1; ! con_log(CL_ANN, (CE_NOTE, ! "mrsas_tbolt_ioc_init: SUCCESSFULL\n")); - return (DDI_SUCCESS); fail_ioc_init: ! mrsas_free_dma_obj(instance, instance->drv_ver_dma_obj); return (DDI_FAILURE); } ! int wait_for_outstanding_poll_io(struct mrsas_instance *instance) { int i; uint32_t wait_time = dump_io_wait_time; for (i = 0; i < wait_time; i++) { /* --- 1067,1090 ---- mrsas_dump_reply_desc(instance); instance->unroll.verBuff = 1; ! con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_ioc_init: SUCCESSFUL")); return (DDI_SUCCESS); fail_ioc_init: ! (void) mrsas_free_dma_obj(instance, instance->drv_ver_dma_obj); return (DDI_FAILURE); } ! int ! wait_for_outstanding_poll_io(struct mrsas_instance *instance) { int i; uint32_t wait_time = dump_io_wait_time; for (i = 0; i < wait_time; i++) { /*
*** 1122,1135 **** mrsas_tbolt_tran_start(struct scsi_address *ap, struct scsi_pkt *pkt) { struct mrsas_instance *instance = ADDR2MR(ap); struct scsa_cmd *acmd = PKT2CMD(pkt); struct mrsas_cmd *cmd = NULL; - int rval, i; uchar_t cmd_done = 0; - Mpi2RaidSCSIIORequest_t *scsi_raid_io; - uint32_t msecs = 120 * MILLISEC; con_log(CL_DLEVEL1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__)); if (instance->deadadapter == 1) { cmn_err(CE_WARN, "mrsas_tran_start:TBOLT return TRAN_FATAL_ERROR " --- 1113,1123 ----
*** 1143,1153 **** if (instance->adapterresetinprogress) { con_log(CL_ANN, (CE_NOTE, "Reset flag set, " "returning mfi_pkt and setting TRAN_BUSY\n")); return (TRAN_BUSY); } ! rval = mrsas_tbolt_prepare_pkt(acmd); cmd = mrsas_tbolt_build_cmd(instance, ap, pkt, &cmd_done); /* * Check if the command is already completed by the mrsas_build_cmd() --- 1131,1141 ---- if (instance->adapterresetinprogress) { con_log(CL_ANN, (CE_NOTE, "Reset flag set, " "returning mfi_pkt and setting TRAN_BUSY\n")); return (TRAN_BUSY); } ! (void) mrsas_tbolt_prepare_pkt(acmd); cmd = mrsas_tbolt_build_cmd(instance, ap, pkt, &cmd_done); /* * Check if the command is already completed by the mrsas_build_cmd()
*** 1172,1210 **** if ((pkt->pkt_flags & FLAG_NOINTR) == 0) { if (instance->fw_outstanding > instance->max_fw_cmds) { cmn_err(CE_WARN, ! "Command Queue Full... Returning BUSY \n"); return_raid_msg_pkt(instance, cmd); return (TRAN_BUSY); } /* Synchronize the Cmd frame for the controller */ (void) ddi_dma_sync(cmd->frame_dma_obj.dma_handle, 0, 0, DDI_DMA_SYNC_FORDEV); con_log(CL_ANN, (CE_CONT, "tbolt_issue_cmd: SCSI CDB[0]=0x%x " ! "cmd->index:0x%x SMID %0x%x\n", pkt->pkt_cdbp[0], cmd->index, cmd->SMID)); instance->func_ptr->issue_cmd(cmd, instance); - - return (TRAN_ACCEPT); - } else { instance->func_ptr->issue_cmd(cmd, instance); (void) wait_for_outstanding_poll_io(instance); ! return (TRAN_ACCEPT); } } /* * prepare the pkt: * the pkt may have been resubmitted or just reused so * initialize some fields and do some checks. */ ! int mrsas_tbolt_prepare_pkt(struct scsa_cmd *acmd) { struct scsi_pkt *pkt = CMD2PKT(acmd); --- 1160,1198 ---- if ((pkt->pkt_flags & FLAG_NOINTR) == 0) { if (instance->fw_outstanding > instance->max_fw_cmds) { cmn_err(CE_WARN, ! "Command Queue Full... Returning BUSY"); return_raid_msg_pkt(instance, cmd); return (TRAN_BUSY); } /* Synchronize the Cmd frame for the controller */ (void) ddi_dma_sync(cmd->frame_dma_obj.dma_handle, 0, 0, DDI_DMA_SYNC_FORDEV); con_log(CL_ANN, (CE_CONT, "tbolt_issue_cmd: SCSI CDB[0]=0x%x " ! "cmd->index:0x%x SMID 0x%x\n", pkt->pkt_cdbp[0], ! cmd->index, cmd->SMID)); instance->func_ptr->issue_cmd(cmd, instance); } else { instance->func_ptr->issue_cmd(cmd, instance); (void) wait_for_outstanding_poll_io(instance); ! (void) mrsas_common_check(instance, cmd); } + + return (TRAN_ACCEPT); } /* * prepare the pkt: * the pkt may have been resubmitted or just reused so * initialize some fields and do some checks. */ ! static int mrsas_tbolt_prepare_pkt(struct scsa_cmd *acmd) { struct scsi_pkt *pkt = CMD2PKT(acmd);
*** 1233,1271 **** Mpi2RaidSCSIIORequest_t *scsi_raid_io, uint32_t *datalen) { uint32_t MaxSGEs; int sg_to_process; ! uint32_t i, j, SGEdwords = 0; uint32_t numElements, endElement; Mpi25IeeeSgeChain64_t *ieeeChainElement = NULL; Mpi25IeeeSgeChain64_t *scsi_raid_io_sgl_ieee = NULL; ! uint32_t SGLFlags = 0; con_log(CL_ANN1, (CE_NOTE, "chkpnt: Building Chained SGL :%d", __LINE__)); /* Calulate SGE size in number of Words(32bit) */ /* Clear the datalen before updating it. */ *datalen = 0; - SGEdwords = sizeof (Mpi25IeeeSgeChain64_t) / 4; - MaxSGEs = instance->max_sge_in_main_msg; ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->SGLFlags, MPI2_SGE_FLAGS_64_BIT_ADDRESSING); ! // set data transfer flag. if (acmd->cmd_flags & CFLAG_DMASEND) { ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->Control, MPI2_SCSIIO_CONTROL_WRITE); } else { ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->Control, MPI2_SCSIIO_CONTROL_READ); } numElements = acmd->cmd_cookiecnt; --- 1221,1256 ---- Mpi2RaidSCSIIORequest_t *scsi_raid_io, uint32_t *datalen) { uint32_t MaxSGEs; int sg_to_process; ! uint32_t i, j; uint32_t numElements, endElement; Mpi25IeeeSgeChain64_t *ieeeChainElement = NULL; Mpi25IeeeSgeChain64_t *scsi_raid_io_sgl_ieee = NULL; ! ddi_acc_handle_t acc_handle = ! instance->mpi2_frame_pool_dma_obj.acc_handle; con_log(CL_ANN1, (CE_NOTE, "chkpnt: Building Chained SGL :%d", __LINE__)); /* Calulate SGE size in number of Words(32bit) */ /* Clear the datalen before updating it. */ *datalen = 0; MaxSGEs = instance->max_sge_in_main_msg; ! ddi_put16(acc_handle, &scsi_raid_io->SGLFlags, MPI2_SGE_FLAGS_64_BIT_ADDRESSING); ! /* set data transfer flag. */ if (acmd->cmd_flags & CFLAG_DMASEND) { ! ddi_put32(acc_handle, &scsi_raid_io->Control, MPI2_SCSIIO_CONTROL_WRITE); } else { ! ddi_put32(acc_handle, &scsi_raid_io->Control, ! MPI2_SCSIIO_CONTROL_READ); } numElements = acmd->cmd_cookiecnt;
*** 1275,1286 **** con_log(CL_ANN, (CE_NOTE, "[Max SGE Count Exceeded]:%x", numElements)); return (numElements); } ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.numSGE, (uint8_t)numElements); /* set end element in main message frame */ endElement = (numElements <= MaxSGEs) ? numElements : (MaxSGEs - 1); /* prepare the scatter-gather list for the firmware */ --- 1260,1271 ---- con_log(CL_ANN, (CE_NOTE, "[Max SGE Count Exceeded]:%x", numElements)); return (numElements); } ! ddi_put8(acc_handle, &scsi_raid_io->RaidContext.numSGE, ! (uint8_t)numElements); /* set end element in main message frame */ endElement = (numElements <= MaxSGEs) ? numElements : (MaxSGEs - 1); /* prepare the scatter-gather list for the firmware */
*** 1289,1378 **** if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { Mpi25IeeeSgeChain64_t *sgl_ptr_end = scsi_raid_io_sgl_ieee; sgl_ptr_end += instance->max_sge_in_main_msg - 1; ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &sgl_ptr_end->Flags, 0); } for (i = 0; i < endElement; i++, scsi_raid_io_sgl_ieee++) { ! ddi_put64(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Address, acmd->cmd_dmacookies[i].dmac_laddress); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Length, acmd->cmd_dmacookies[i].dmac_size); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Flags, 0); if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! if (i == (numElements - 1)) ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Flags, IEEE_SGE_FLAGS_END_OF_LIST); } *datalen += acmd->cmd_dmacookies[i].dmac_size; #ifdef DEBUG ! con_log(CL_DLEVEL1, (CE_NOTE, "[SGL Address]:%llx", scsi_raid_io_sgl_ieee->Address)); con_log(CL_DLEVEL1, (CE_NOTE, "[SGL Length]:%x", scsi_raid_io_sgl_ieee->Length)); con_log(CL_DLEVEL1, (CE_NOTE, "[SGL Flags]:%x", scsi_raid_io_sgl_ieee->Flags)); #endif } ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->ChainOffset, 0); /* check if chained SGL required */ if (i < numElements) { con_log(CL_ANN1, (CE_NOTE, "[Chain Element index]:%x", i)); if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! uint16_t ioFlags = ddi_get16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->IoFlags); ! if ((ioFlags & MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) != MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->ChainOffset, (U8)instance->chain_offset_io_req); ! else ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->ChainOffset, 0); } ! else { ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->ChainOffset, (U8)instance->chain_offset_io_req); } /* prepare physical chain element */ ieeeChainElement = scsi_raid_io_sgl_ieee; ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &ieeeChainElement->NextChainOffset, 0); ! if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &ieeeChainElement->Flags, IEEE_SGE_FLAGS_CHAIN_ELEMENT ); ! else ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &ieeeChainElement->Flags, (IEEE_SGE_FLAGS_CHAIN_ELEMENT | MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR)); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &ieeeChainElement->Length, (sizeof (MPI2_SGE_IO_UNION) * (numElements - i))); ! ddi_put64(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &ieeeChainElement->Address, (U64)cmd->sgl_phys_addr); sg_to_process = numElements - i; con_log(CL_ANN1, (CE_NOTE, --- 1274,1359 ---- if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { Mpi25IeeeSgeChain64_t *sgl_ptr_end = scsi_raid_io_sgl_ieee; sgl_ptr_end += instance->max_sge_in_main_msg - 1; ! ddi_put8(acc_handle, &sgl_ptr_end->Flags, 0); } for (i = 0; i < endElement; i++, scsi_raid_io_sgl_ieee++) { ! ddi_put64(acc_handle, &scsi_raid_io_sgl_ieee->Address, acmd->cmd_dmacookies[i].dmac_laddress); ! ddi_put32(acc_handle, &scsi_raid_io_sgl_ieee->Length, acmd->cmd_dmacookies[i].dmac_size); ! ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, 0); if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! if (i == (numElements - 1)) { ! ddi_put8(acc_handle, ! &scsi_raid_io_sgl_ieee->Flags, ! IEEE_SGE_FLAGS_END_OF_LIST); } + } *datalen += acmd->cmd_dmacookies[i].dmac_size; #ifdef DEBUG ! con_log(CL_DLEVEL1, (CE_NOTE, "[SGL Address]: %" PRIx64, scsi_raid_io_sgl_ieee->Address)); con_log(CL_DLEVEL1, (CE_NOTE, "[SGL Length]:%x", scsi_raid_io_sgl_ieee->Length)); con_log(CL_DLEVEL1, (CE_NOTE, "[SGL Flags]:%x", scsi_raid_io_sgl_ieee->Flags)); #endif } ! ddi_put8(acc_handle, &scsi_raid_io->ChainOffset, 0); /* check if chained SGL required */ if (i < numElements) { con_log(CL_ANN1, (CE_NOTE, "[Chain Element index]:%x", i)); if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! uint16_t ioFlags = ! ddi_get16(acc_handle, &scsi_raid_io->IoFlags); ! if ((ioFlags & ! MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) != ! MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) { ! ddi_put8(acc_handle, &scsi_raid_io->ChainOffset, ! (U8)instance->chain_offset_io_req); ! } else { ! ddi_put8(acc_handle, &scsi_raid_io->ChainOffset, 0); } ! } else { ! ddi_put8(acc_handle, &scsi_raid_io->ChainOffset, ! (U8)instance->chain_offset_io_req); } /* prepare physical chain element */ ieeeChainElement = scsi_raid_io_sgl_ieee; ! ddi_put8(acc_handle, &ieeeChainElement->NextChainOffset, 0); ! if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! ddi_put8(acc_handle, &ieeeChainElement->Flags, ! IEEE_SGE_FLAGS_CHAIN_ELEMENT); ! } else { ! ddi_put8(acc_handle, &ieeeChainElement->Flags, (IEEE_SGE_FLAGS_CHAIN_ELEMENT | MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR)); + } ! ddi_put32(acc_handle, &ieeeChainElement->Length, (sizeof (MPI2_SGE_IO_UNION) * (numElements - i))); ! ddi_put64(acc_handle, &ieeeChainElement->Address, (U64)cmd->sgl_phys_addr); sg_to_process = numElements - i; con_log(CL_ANN1, (CE_NOTE,
*** 1383,1414 **** /* build rest of the SGL in chained buffer */ for (j = 0; j < sg_to_process; j++, scsi_raid_io_sgl_ieee++) { con_log(CL_DLEVEL3, (CE_NOTE, "[remaining SGL]:%x", i)); ! ddi_put64(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Address, acmd->cmd_dmacookies[i].dmac_laddress); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Length, acmd->cmd_dmacookies[i].dmac_size); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Flags, 0); if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! if (i == (numElements - 1)) ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Flags, IEEE_SGE_FLAGS_END_OF_LIST); } *datalen += acmd->cmd_dmacookies[i].dmac_size; #if DEBUG con_log(CL_DLEVEL1, (CE_NOTE, ! "[SGL Address]:%llx", scsi_raid_io_sgl_ieee->Address)); con_log(CL_DLEVEL1, (CE_NOTE, "[SGL Length]:%x", scsi_raid_io_sgl_ieee->Length)); con_log(CL_DLEVEL1, (CE_NOTE, "[SGL Flags]:%x", scsi_raid_io_sgl_ieee->Flags)); --- 1364,1394 ---- /* build rest of the SGL in chained buffer */ for (j = 0; j < sg_to_process; j++, scsi_raid_io_sgl_ieee++) { con_log(CL_DLEVEL3, (CE_NOTE, "[remaining SGL]:%x", i)); ! ddi_put64(acc_handle, &scsi_raid_io_sgl_ieee->Address, acmd->cmd_dmacookies[i].dmac_laddress); ! ddi_put32(acc_handle, &scsi_raid_io_sgl_ieee->Length, acmd->cmd_dmacookies[i].dmac_size); ! ddi_put8(acc_handle, &scsi_raid_io_sgl_ieee->Flags, 0); if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! if (i == (numElements - 1)) { ! ddi_put8(acc_handle, ! &scsi_raid_io_sgl_ieee->Flags, ! IEEE_SGE_FLAGS_END_OF_LIST); } + } *datalen += acmd->cmd_dmacookies[i].dmac_size; #if DEBUG con_log(CL_DLEVEL1, (CE_NOTE, ! "[SGL Address]: %" PRIx64, scsi_raid_io_sgl_ieee->Address)); con_log(CL_DLEVEL1, (CE_NOTE, "[SGL Length]:%x", scsi_raid_io_sgl_ieee->Length)); con_log(CL_DLEVEL1, (CE_NOTE, "[SGL Flags]:%x", scsi_raid_io_sgl_ieee->Flags));
*** 1423,1457 **** /* * build_cmd */ ! struct mrsas_cmd * mrsas_tbolt_build_cmd(struct mrsas_instance *instance, struct scsi_address *ap, struct scsi_pkt *pkt, uchar_t *cmd_done) { uint8_t fp_possible = 0; ! uint16_t flags = 0; ! uint32_t i, index; ! uint32_t context; ! uint32_t sge_bytes; ! uint8_t ChainOffsetValue; ! uint32_t SGLFlags; ! uint32_t lba_count=0; ! uint32_t start_lba_hi=0; ! uint32_t start_lba_lo=0; ! ddi_acc_handle_t acc_handle; struct mrsas_cmd *cmd = NULL; struct scsa_cmd *acmd = PKT2CMD(pkt); MRSAS_REQUEST_DESCRIPTOR_UNION *ReqDescUnion; Mpi2RaidSCSIIORequest_t *scsi_raid_io; - Mpi25IeeeSgeChain64_t *scsi_raid_io_sgl_ieee; uint32_t datalen; struct IO_REQUEST_INFO io_info; MR_FW_RAID_MAP_ALL *local_map_ptr; - MR_LD_RAID *raid; - U32 ld; uint16_t pd_cmd_cdblen; con_log(CL_DLEVEL1, (CE_NOTE, "chkpnt: Entered mrsas_tbolt_build_cmd:%d", __LINE__)); --- 1403,1430 ---- /* * build_cmd */ ! static struct mrsas_cmd * mrsas_tbolt_build_cmd(struct mrsas_instance *instance, struct scsi_address *ap, struct scsi_pkt *pkt, uchar_t *cmd_done) { uint8_t fp_possible = 0; ! uint32_t index; ! uint32_t lba_count = 0; ! uint32_t start_lba_hi = 0; ! uint32_t start_lba_lo = 0; ! ddi_acc_handle_t acc_handle = ! instance->mpi2_frame_pool_dma_obj.acc_handle; struct mrsas_cmd *cmd = NULL; struct scsa_cmd *acmd = PKT2CMD(pkt); MRSAS_REQUEST_DESCRIPTOR_UNION *ReqDescUnion; Mpi2RaidSCSIIORequest_t *scsi_raid_io; uint32_t datalen; struct IO_REQUEST_INFO io_info; MR_FW_RAID_MAP_ALL *local_map_ptr; uint16_t pd_cmd_cdblen; con_log(CL_DLEVEL1, (CE_NOTE, "chkpnt: Entered mrsas_tbolt_build_cmd:%d", __LINE__));
*** 1465,1475 **** if (!(cmd = get_raid_msg_pkt(instance))) { return (NULL); } index = cmd->index; ! ReqDescUnion = mr_sas_get_request_descriptor(instance, index, cmd); ReqDescUnion->Words = 0; ReqDescUnion->SCSIIO.SMID = cmd->SMID; ReqDescUnion->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_LD_IO << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); --- 1438,1448 ---- if (!(cmd = get_raid_msg_pkt(instance))) { return (NULL); } index = cmd->index; ! ReqDescUnion = mr_sas_get_request_descriptor(instance, index); ReqDescUnion->Words = 0; ReqDescUnion->SCSIIO.SMID = cmd->SMID; ReqDescUnion->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_LD_IO << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
*** 1491,1528 **** (void) ddi_dma_sync(acmd->cmd_dmahandle, acmd->cmd_dma_offset, acmd->cmd_dma_len, DDI_DMA_SYNC_FORCPU); } } else { ! con_log(CL_ANN, (CE_NOTE, "NO DMA\n")); } ! // get SCSI_IO raid message frame pointer scsi_raid_io = (Mpi2RaidSCSIIORequest_t *)cmd->scsi_io_request; /* zero out SCSI_IO raid message frame */ ! memset(scsi_raid_io, 0, sizeof(Mpi2RaidSCSIIORequest_t)); ! /*Set the ldTargetId set by BuildRaidContext() */ ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.ldTargetId, acmd->device_id); /* Copy CDB to scsi_io_request message frame */ ! ddi_rep_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! (uint8_t *)pkt->pkt_cdbp, ! (uint8_t *)scsi_raid_io->CDB.CDB32, acmd->cmd_cdblen, DDI_DEV_AUTOINCR); /* ! * Just the CDB length,rest of the Flags are zero * This will be modified later. */ ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->IoFlags, ! acmd->cmd_cdblen); pd_cmd_cdblen = acmd->cmd_cdblen; switch (pkt->pkt_cdbp[0]) { case SCMD_READ: --- 1464,1497 ---- (void) ddi_dma_sync(acmd->cmd_dmahandle, acmd->cmd_dma_offset, acmd->cmd_dma_len, DDI_DMA_SYNC_FORCPU); } } else { ! con_log(CL_ANN, (CE_NOTE, "NO DMA")); } ! /* get SCSI_IO raid message frame pointer */ scsi_raid_io = (Mpi2RaidSCSIIORequest_t *)cmd->scsi_io_request; /* zero out SCSI_IO raid message frame */ ! bzero(scsi_raid_io, sizeof (Mpi2RaidSCSIIORequest_t)); ! /* Set the ldTargetId set by BuildRaidContext() */ ! ddi_put16(acc_handle, &scsi_raid_io->RaidContext.ldTargetId, acmd->device_id); /* Copy CDB to scsi_io_request message frame */ ! ddi_rep_put8(acc_handle, ! (uint8_t *)pkt->pkt_cdbp, (uint8_t *)scsi_raid_io->CDB.CDB32, acmd->cmd_cdblen, DDI_DEV_AUTOINCR); /* ! * Just the CDB length, rest of the Flags are zero * This will be modified later. */ ! ddi_put16(acc_handle, &scsi_raid_io->IoFlags, acmd->cmd_cdblen); pd_cmd_cdblen = acmd->cmd_cdblen; switch (pkt->pkt_cdbp[0]) { case SCMD_READ:
*** 1535,1558 **** case SCMD_WRITE_G5: if (acmd->islogical) { /* Initialize sense Information */ if (cmd->sense1 == NULL) { ! con_log(CL_ANN, (CE_NOTE, ! "tbolt_build_cmd: Sense buffer ptr NULL \n")); } bzero(cmd->sense1, SENSE_LENGTH); ! con_log(CL_DLEVEL2, (CE_NOTE, ! "tbolt_build_cmd CDB[0] = %x\n", pkt->pkt_cdbp[0])); ! if (acmd->cmd_cdblen == CDB_GROUP0) { /* 6-byte cdb */ lba_count = (uint16_t)(pkt->pkt_cdbp[4]); ! start_lba_lo = ! ((uint32_t)(pkt->pkt_cdbp[3]) | ((uint32_t)(pkt->pkt_cdbp[2]) << 8) | ! ((uint32_t)((pkt->pkt_cdbp[1]) & 0x1F) << 16)); ! } else if (acmd->cmd_cdblen == CDB_GROUP1) { /* 10-byte cdb */ lba_count = (((uint16_t)(pkt->pkt_cdbp[8])) | ((uint16_t)(pkt->pkt_cdbp[7]) << 8)); start_lba_lo = --- 1504,1529 ---- case SCMD_WRITE_G5: if (acmd->islogical) { /* Initialize sense Information */ if (cmd->sense1 == NULL) { ! con_log(CL_ANN, (CE_NOTE, "tbolt_build_cmd: " ! "Sense buffer ptr NULL ")); } bzero(cmd->sense1, SENSE_LENGTH); ! con_log(CL_DLEVEL2, (CE_NOTE, "tbolt_build_cmd " ! "CDB[0] = %x\n", pkt->pkt_cdbp[0])); ! if (acmd->cmd_cdblen == CDB_GROUP0) { ! /* 6-byte cdb */ lba_count = (uint16_t)(pkt->pkt_cdbp[4]); ! start_lba_lo = ((uint32_t)(pkt->pkt_cdbp[3]) | ((uint32_t)(pkt->pkt_cdbp[2]) << 8) | ! ((uint32_t)((pkt->pkt_cdbp[1]) & 0x1F) ! << 16)); ! } else if (acmd->cmd_cdblen == CDB_GROUP1) { ! /* 10-byte cdb */ lba_count = (((uint16_t)(pkt->pkt_cdbp[8])) | ((uint16_t)(pkt->pkt_cdbp[7]) << 8)); start_lba_lo =
*** 1559,1569 **** (((uint32_t)(pkt->pkt_cdbp[5])) | ((uint32_t)(pkt->pkt_cdbp[4]) << 8) | ((uint32_t)(pkt->pkt_cdbp[3]) << 16) | ((uint32_t)(pkt->pkt_cdbp[2]) << 24)); ! } else if (acmd->cmd_cdblen == CDB_GROUP5) { /* 12-byte cdb */ lba_count = ( ((uint32_t)(pkt->pkt_cdbp[9])) | ((uint32_t)(pkt->pkt_cdbp[8]) << 8) | ((uint32_t)(pkt->pkt_cdbp[7]) << 16) | ((uint32_t)(pkt->pkt_cdbp[6]) << 24)); --- 1530,1541 ---- (((uint32_t)(pkt->pkt_cdbp[5])) | ((uint32_t)(pkt->pkt_cdbp[4]) << 8) | ((uint32_t)(pkt->pkt_cdbp[3]) << 16) | ((uint32_t)(pkt->pkt_cdbp[2]) << 24)); ! } else if (acmd->cmd_cdblen == CDB_GROUP5) { ! /* 12-byte cdb */ lba_count = ( ((uint32_t)(pkt->pkt_cdbp[9])) | ((uint32_t)(pkt->pkt_cdbp[8]) << 8) | ((uint32_t)(pkt->pkt_cdbp[7]) << 16) | ((uint32_t)(pkt->pkt_cdbp[6]) << 24));
*** 1572,1582 **** (((uint32_t)(pkt->pkt_cdbp[5])) | ((uint32_t)(pkt->pkt_cdbp[4]) << 8) | ((uint32_t)(pkt->pkt_cdbp[3]) << 16) | ((uint32_t)(pkt->pkt_cdbp[2]) << 24)); ! } else if (acmd->cmd_cdblen == CDB_GROUP4) { /* 16-byte cdb */ lba_count = ( ((uint32_t)(pkt->pkt_cdbp[13])) | ((uint32_t)(pkt->pkt_cdbp[12]) << 8) | ((uint32_t)(pkt->pkt_cdbp[11]) << 16) | ((uint32_t)(pkt->pkt_cdbp[10]) << 24)); --- 1544,1555 ---- (((uint32_t)(pkt->pkt_cdbp[5])) | ((uint32_t)(pkt->pkt_cdbp[4]) << 8) | ((uint32_t)(pkt->pkt_cdbp[3]) << 16) | ((uint32_t)(pkt->pkt_cdbp[2]) << 24)); ! } else if (acmd->cmd_cdblen == CDB_GROUP4) { ! /* 16-byte cdb */ lba_count = ( ((uint32_t)(pkt->pkt_cdbp[13])) | ((uint32_t)(pkt->pkt_cdbp[12]) << 8) | ((uint32_t)(pkt->pkt_cdbp[11]) << 16) | ((uint32_t)(pkt->pkt_cdbp[10]) << 24));
*** 1593,1770 **** ((uint32_t)(pkt->pkt_cdbp[3]) << 16) | ((uint32_t)(pkt->pkt_cdbp[2]) << 24)); } if (instance->tbolt && ! ((lba_count * 512) > mrsas_tbolt_max_cap_maxxfer) ) ! cmn_err(CE_WARN," IO SECTOR COUNT exceeds controller limit 0x%x sectors\n", lba_count); ! memset(&io_info, 0, sizeof (struct IO_REQUEST_INFO)); ! io_info.ldStartBlock = ((uint64_t)start_lba_hi << 32) | start_lba_lo; io_info.numBlocks = lba_count; io_info.ldTgtId = acmd->device_id; if (acmd->cmd_flags & CFLAG_DMASEND) io_info.isRead = 0; else io_info.isRead = 1; ! /*Aquire SYNC MAP UPDATE lock */ mutex_enter(&instance->sync_map_mtx); ! local_map_ptr = instance->ld_map[(instance->map_id & 1)]; ! if ( (MR_TargetIdToLdGet(acmd->device_id, local_map_ptr) >= MAX_LOGICAL_DRIVES) || !instance->fast_path_io ){ ! cmn_err(CE_NOTE, ! "Fast Path NOT Possible, targetId >= MAX_LOGICAL_DRIVES || !instance->fast_path_io\n"); fp_possible = 0; ! /* Set Regionlock flags to BYPASS ! io_request->RaidContext.regLockFlags = 0; */ ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->RaidContext.regLockFlags, 0); } else { if (MR_BuildRaidContext(instance, &io_info, &scsi_raid_io->RaidContext, local_map_ptr)) fp_possible = io_info.fpOkForIo; } ! if (!enable_fp) { fp_possible = 0; ! } ! con_log(CL_ANN1, (CE_NOTE, ! "enable_fp %d instance->fast_path_io %d fp_possible %d \n", enable_fp, instance->fast_path_io, fp_possible)); if (fp_possible) { /* Check for DIF enabled LD */ if (MR_CheckDIF(acmd->device_id, local_map_ptr)) { /* Prepare 32 Byte CDB for DIF capable Disk */ mrsas_tbolt_prepare_cdb(instance, scsi_raid_io->CDB.CDB32, ! &io_info, ! scsi_raid_io, ! start_lba_lo); } else { mrsas_tbolt_set_pd_lba(scsi_raid_io->CDB.CDB32, ! (uint8_t *)&pd_cmd_cdblen, io_info.pdBlock, io_info.numBlocks, 0); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->IoFlags, ! pd_cmd_cdblen); } ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->Function, MPI2_FUNCTION_SCSI_IO_REQUEST); ReqDescUnion->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! uint8_t regLockFlags = ddi_get8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->RaidContext.regLockFlags); ! uint16_t IoFlags = ddi_get16(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->IoFlags); if (regLockFlags == REGION_TYPE_UNUSED) ReqDescUnion->SCSIIO.RequestFlags = ! (MPI2_REQ_DESCRIPT_FLAGS_NO_LOCK << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); ! IoFlags |= MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH; ! regLockFlags |= (MR_RL_FLAGS_GRANT_DESTINATION_CUDA | MR_RL_FLAGS_SEQ_NUM_ENABLE); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->ChainOffset, 0); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.nsegType, ((0x01 << MPI2_NSEG_FLAGS_SHIFT) | MPI2_TYPE_CUDA)); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.regLockFlags, regLockFlags); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->IoFlags, IoFlags); } ! if ((instance->load_balance_info[acmd->device_id].loadBalanceFlag) && (io_info.isRead)) { ! io_info.devHandle = get_updated_dev_handle(&instance->load_balance_info[acmd->device_id], &io_info); ! cmd->load_balance_flag |= MEGASAS_LOAD_BALANCE_FLAG; ! } else ! cmd->load_balance_flag &= ~MEGASAS_LOAD_BALANCE_FLAG; ReqDescUnion->SCSIIO.DevHandle = io_info.devHandle; ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->DevHandle, io_info.devHandle); } else { ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->Function, MPI2_FUNCTION_LD_IO_REQUEST); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->DevHandle, acmd->device_id); ReqDescUnion->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_LD_IO << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.timeoutValue, local_map_ptr->raidMap.fpPdIoTimeoutSec); if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! uint8_t regLockFlags = ddi_get8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->RaidContext.regLockFlags); ! if (regLockFlags == REGION_TYPE_UNUSED) ReqDescUnion->SCSIIO.RequestFlags = ! (MPI2_REQ_DESCRIPT_FLAGS_NO_LOCK << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); ! regLockFlags |= (MR_RL_FLAGS_GRANT_DESTINATION_CPU0 | MR_RL_FLAGS_SEQ_NUM_ENABLE); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.nsegType, ((0x01 << MPI2_NSEG_FLAGS_SHIFT) | MPI2_TYPE_CUDA)); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.regLockFlags, regLockFlags); } - } /* Not FP */ ! /*Release SYNC MAP UPDATE lock */ mutex_exit(&instance->sync_map_mtx); ! /* Set sense buffer physical address/length in scsi_io_request.*/ ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->SenseBufferLowAddress, cmd->sense_phys_addr1); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->SenseBufferLength, SENSE_LENGTH); ! /* Construct SGL*/ ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->SGLOffset0, offsetof(MPI2_RAID_SCSI_IO_REQUEST, SGL) / 4); ! mr_sas_tbolt_build_sgl(instance, acmd, cmd, scsi_raid_io, &datalen); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->DataLength, datalen); break; - - } - else { #ifndef PDSUPPORT /* if PDSUPPORT, skip break and fall through */ break; #endif } /* fall through For all non-rd/wr cmds */ default: switch (pkt->pkt_cdbp[0]) { ! case 0x35: { // SCMD_SYNCHRONIZE_CACHE return_raid_msg_pkt(instance, cmd); *cmd_done = 1; return (NULL); } --- 1566,1764 ---- ((uint32_t)(pkt->pkt_cdbp[3]) << 16) | ((uint32_t)(pkt->pkt_cdbp[2]) << 24)); } if (instance->tbolt && ! ((lba_count * 512) > mrsas_tbolt_max_cap_maxxfer)) { ! cmn_err(CE_WARN, " IO SECTOR COUNT exceeds " ! "controller limit 0x%x sectors", ! lba_count); ! } ! bzero(&io_info, sizeof (struct IO_REQUEST_INFO)); ! io_info.ldStartBlock = ((uint64_t)start_lba_hi << 32) | ! start_lba_lo; io_info.numBlocks = lba_count; io_info.ldTgtId = acmd->device_id; if (acmd->cmd_flags & CFLAG_DMASEND) io_info.isRead = 0; else io_info.isRead = 1; ! /* Acquire SYNC MAP UPDATE lock */ mutex_enter(&instance->sync_map_mtx); ! local_map_ptr = ! instance->ld_map[(instance->map_id & 1)]; ! if ((MR_TargetIdToLdGet( ! acmd->device_id, local_map_ptr) >= ! MAX_LOGICAL_DRIVES) || !instance->fast_path_io) { ! cmn_err(CE_NOTE, "Fast Path NOT Possible, " ! "targetId >= MAX_LOGICAL_DRIVES || " ! "!instance->fast_path_io"); fp_possible = 0; ! /* Set Regionlock flags to BYPASS */ ! /* io_request->RaidContext.regLockFlags = 0; */ ! ddi_put8(acc_handle, &scsi_raid_io->RaidContext.regLockFlags, 0); } else { if (MR_BuildRaidContext(instance, &io_info, &scsi_raid_io->RaidContext, local_map_ptr)) fp_possible = io_info.fpOkForIo; } ! if (!enable_fp) fp_possible = 0; ! ! con_log(CL_ANN1, (CE_NOTE, "enable_fp %d " ! "instance->fast_path_io %d fp_possible %d", enable_fp, instance->fast_path_io, fp_possible)); if (fp_possible) { /* Check for DIF enabled LD */ if (MR_CheckDIF(acmd->device_id, local_map_ptr)) { /* Prepare 32 Byte CDB for DIF capable Disk */ mrsas_tbolt_prepare_cdb(instance, scsi_raid_io->CDB.CDB32, ! &io_info, scsi_raid_io, start_lba_lo); } else { mrsas_tbolt_set_pd_lba(scsi_raid_io->CDB.CDB32, ! (uint8_t *)&pd_cmd_cdblen, ! io_info.pdBlock, io_info.numBlocks); ! ddi_put16(acc_handle, ! &scsi_raid_io->IoFlags, pd_cmd_cdblen); } ! ddi_put8(acc_handle, &scsi_raid_io->Function, MPI2_FUNCTION_SCSI_IO_REQUEST); ReqDescUnion->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! uint8_t regLockFlags = ddi_get8(acc_handle, &scsi_raid_io->RaidContext.regLockFlags); ! uint16_t IoFlags = ddi_get16(acc_handle, &scsi_raid_io->IoFlags); if (regLockFlags == REGION_TYPE_UNUSED) ReqDescUnion->SCSIIO.RequestFlags = ! (MPI2_REQ_DESCRIPT_FLAGS_NO_LOCK << ! MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); ! IoFlags |= ! MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH; ! regLockFlags |= ! (MR_RL_FLAGS_GRANT_DESTINATION_CUDA | ! MR_RL_FLAGS_SEQ_NUM_ENABLE); ! ddi_put8(acc_handle, &scsi_raid_io->ChainOffset, 0); ! ddi_put8(acc_handle, ! &scsi_raid_io->RaidContext.nsegType, ! ((0x01 << MPI2_NSEG_FLAGS_SHIFT) | ! MPI2_TYPE_CUDA)); ! ddi_put8(acc_handle, ! &scsi_raid_io->RaidContext.regLockFlags, ! regLockFlags); ! ddi_put16(acc_handle, &scsi_raid_io->IoFlags, IoFlags); } ! if ((instance->load_balance_info[ ! acmd->device_id].loadBalanceFlag) && ! (io_info.isRead)) { ! io_info.devHandle = ! get_updated_dev_handle(&instance-> ! load_balance_info[acmd->device_id], ! &io_info); ! cmd->load_balance_flag |= ! MEGASAS_LOAD_BALANCE_FLAG; ! } else { ! cmd->load_balance_flag &= ! ~MEGASAS_LOAD_BALANCE_FLAG; ! } ReqDescUnion->SCSIIO.DevHandle = io_info.devHandle; ! ddi_put16(acc_handle, &scsi_raid_io->DevHandle, io_info.devHandle); } else { ! ddi_put8(acc_handle, &scsi_raid_io->Function, MPI2_FUNCTION_LD_IO_REQUEST); ! ddi_put16(acc_handle, &scsi_raid_io->DevHandle, acmd->device_id); ReqDescUnion->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_LD_IO << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); ! ddi_put16(acc_handle, ! &scsi_raid_io->RaidContext.timeoutValue, ! local_map_ptr->raidMap.fpPdIoTimeoutSec); if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! uint8_t regLockFlags = ddi_get8(acc_handle, &scsi_raid_io->RaidContext.regLockFlags); ! if (regLockFlags == REGION_TYPE_UNUSED) { ReqDescUnion->SCSIIO.RequestFlags = ! (MPI2_REQ_DESCRIPT_FLAGS_NO_LOCK << ! MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); ! } ! regLockFlags |= ! (MR_RL_FLAGS_GRANT_DESTINATION_CPU0 | ! MR_RL_FLAGS_SEQ_NUM_ENABLE); ! ddi_put8(acc_handle, ! &scsi_raid_io->RaidContext.nsegType, ! ((0x01 << MPI2_NSEG_FLAGS_SHIFT) | ! MPI2_TYPE_CUDA)); ! ddi_put8(acc_handle, ! &scsi_raid_io->RaidContext.regLockFlags, ! regLockFlags); } } /* Not FP */ ! /* Release SYNC MAP UPDATE lock */ mutex_exit(&instance->sync_map_mtx); ! /* ! * Set sense buffer physical address/length in scsi_io_request. ! */ ! ddi_put32(acc_handle, &scsi_raid_io->SenseBufferLowAddress, cmd->sense_phys_addr1); ! ddi_put8(acc_handle, &scsi_raid_io->SenseBufferLength, SENSE_LENGTH); ! /* Construct SGL */ ! ddi_put8(acc_handle, &scsi_raid_io->SGLOffset0, offsetof(MPI2_RAID_SCSI_IO_REQUEST, SGL) / 4); ! (void) mr_sas_tbolt_build_sgl(instance, acmd, cmd, scsi_raid_io, &datalen); ! ddi_put32(acc_handle, &scsi_raid_io->DataLength, datalen); break; #ifndef PDSUPPORT /* if PDSUPPORT, skip break and fall through */ + } else { break; #endif } /* fall through For all non-rd/wr cmds */ default: switch (pkt->pkt_cdbp[0]) { ! case 0x35: { /* SCMD_SYNCHRONIZE_CACHE */ return_raid_msg_pkt(instance, cmd); *cmd_done = 1; return (NULL); }
*** 1785,1862 **** } break; } default: { ! /* Here we need to handle PASSTHRU for ! Logical Devices. Like Inquiry etc.*/ ! if(!(acmd->islogical)) { ! /* Aquire SYNC MAP UPDATE lock */ mutex_enter(&instance->sync_map_mtx); ! local_map_ptr = instance->ld_map[(instance->map_id & 1)]; ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->Function, MPI2_FUNCTION_SCSI_IO_REQUEST); ReqDescUnion->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->DevHandle, ! local_map_ptr->raidMap.devHndlInfo[acmd->device_id].curDevHdl); ! /*Set regLockFlasgs to REGION_TYPE_BYPASS */ ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->RaidContext.regLockFlags, 0); ! ddi_put64(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.regLockRowLBA, 0); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.regLockLength, 0); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->RaidContext.RAIDFlags, ! MR_RAID_FLAGS_IO_SUB_TYPE_SYSTEM_PD << MR_RAID_CTX_RAID_FLAGS_IO_SUB_TYPE_SHIFT); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.timeoutValue, local_map_ptr->raidMap.fpPdIoTimeoutSec); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.ldTargetId, acmd->device_id); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->LUN[1], acmd->lun); /* Release SYNC MAP UPDATE lock */ mutex_exit(&instance->sync_map_mtx); } else { ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->Function, MPI2_FUNCTION_LD_IO_REQUEST); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->LUN[1], acmd->lun); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->DevHandle, acmd->device_id); ReqDescUnion->SCSIIO.RequestFlags = ! (MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); } ! /* Set sense buffer physical address/length in scsi_io_request.*/ ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->SenseBufferLowAddress, cmd->sense_phys_addr1); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->SenseBufferLength, SENSE_LENGTH); ! /* Construct SGL*/ ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->SGLOffset0, offsetof(MPI2_RAID_SCSI_IO_REQUEST, SGL) / 4); ! mr_sas_tbolt_build_sgl(instance, acmd, cmd, scsi_raid_io, &datalen); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->DataLength, datalen); con_log(CL_ANN, (CE_CONT, "tbolt_build_cmd CDB[0] =%x, TargetID =%x\n", --- 1779,1868 ---- } break; } default: { ! /* ! * Here we need to handle PASSTHRU for ! * Logical Devices. Like Inquiry etc. ! */ ! if (!(acmd->islogical)) { ! /* Acquire SYNC MAP UPDATE lock */ mutex_enter(&instance->sync_map_mtx); ! local_map_ptr = ! instance->ld_map[(instance->map_id & 1)]; ! ddi_put8(acc_handle, &scsi_raid_io->Function, ! MPI2_FUNCTION_SCSI_IO_REQUEST); ReqDescUnion->SCSIIO.RequestFlags = (MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); ! ddi_put16(acc_handle, &scsi_raid_io->DevHandle, ! local_map_ptr->raidMap. ! devHndlInfo[acmd->device_id].curDevHdl); ! /* Set regLockFlasgs to REGION_TYPE_BYPASS */ ! ddi_put8(acc_handle, &scsi_raid_io->RaidContext.regLockFlags, 0); ! ddi_put64(acc_handle, ! &scsi_raid_io->RaidContext.regLockRowLBA, ! 0); ! ddi_put32(acc_handle, ! &scsi_raid_io->RaidContext.regLockLength, ! 0); ! ddi_put8(acc_handle, ! &scsi_raid_io->RaidContext.RAIDFlags, ! MR_RAID_FLAGS_IO_SUB_TYPE_SYSTEM_PD << ! MR_RAID_CTX_RAID_FLAGS_IO_SUB_TYPE_SHIFT); ! ddi_put16(acc_handle, ! &scsi_raid_io->RaidContext.timeoutValue, ! local_map_ptr->raidMap.fpPdIoTimeoutSec); ! ddi_put16(acc_handle, ! &scsi_raid_io->RaidContext.ldTargetId, ! acmd->device_id); ! ddi_put8(acc_handle, &scsi_raid_io->LUN[1], acmd->lun); /* Release SYNC MAP UPDATE lock */ mutex_exit(&instance->sync_map_mtx); } else { ! ddi_put8(acc_handle, &scsi_raid_io->Function, ! MPI2_FUNCTION_LD_IO_REQUEST); ! ddi_put8(acc_handle, &scsi_raid_io->LUN[1], acmd->lun); ! ddi_put16(acc_handle, &scsi_raid_io->DevHandle, acmd->device_id); ReqDescUnion->SCSIIO.RequestFlags = ! (MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO << ! MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT); } ! /* ! * Set sense buffer physical address/length in ! * scsi_io_request. ! */ ! ddi_put32(acc_handle, &scsi_raid_io->SenseBufferLowAddress, cmd->sense_phys_addr1); ! ddi_put8(acc_handle, &scsi_raid_io->SenseBufferLength, SENSE_LENGTH); ! /* Construct SGL */ ! ddi_put8(acc_handle, &scsi_raid_io->SGLOffset0, offsetof(MPI2_RAID_SCSI_IO_REQUEST, SGL) / 4); ! (void) mr_sas_tbolt_build_sgl(instance, acmd, cmd, scsi_raid_io, &datalen); ! ddi_put32(acc_handle, &scsi_raid_io->DataLength, datalen); con_log(CL_ANN, (CE_CONT, "tbolt_build_cmd CDB[0] =%x, TargetID =%x\n",
*** 1870,1882 **** } break; } } - #ifdef lint - context = context; - #endif return (cmd); } /* --- 1876,1885 ----
*** 1981,1998 **** MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc = cmd->request_desc; atomic_add_16(&instance->fw_outstanding, 1); struct scsi_pkt *pkt; ! con_log(CL_ANN1, (CE_NOTE, "tbolt_issue_cmd: cmd->[SMID]=0x%X", cmd->SMID)); con_log(CL_DLEVEL1, (CE_CONT, ! " [req desc Words] %llx \n", req_desc->Words)); con_log(CL_DLEVEL1, (CE_CONT, ! " [req desc low part] %x \n", req_desc->Words)); con_log(CL_DLEVEL1, (CE_CONT, ! " [req desc high part] %x \n", (req_desc->Words >> 32))); pkt = cmd->pkt; if (pkt) { con_log(CL_ANN1, (CE_CONT, "%llx :TBOLT issue_cmd_ppc:" "ISSUED CMD TO FW : called : cmd:" --- 1984,2003 ---- MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc = cmd->request_desc; atomic_add_16(&instance->fw_outstanding, 1); struct scsi_pkt *pkt; ! con_log(CL_ANN1, ! (CE_NOTE, "tbolt_issue_cmd: cmd->[SMID]=0x%X", cmd->SMID)); con_log(CL_DLEVEL1, (CE_CONT, ! " [req desc Words] %" PRIx64 " \n", req_desc->Words)); con_log(CL_DLEVEL1, (CE_CONT, ! " [req desc low part] %x \n", ! (uint_t)(req_desc->Words & 0xffffffffff))); con_log(CL_DLEVEL1, (CE_CONT, ! " [req desc high part] %x \n", (uint_t)(req_desc->Words >> 32))); pkt = cmd->pkt; if (pkt) { con_log(CL_ANN1, (CE_CONT, "%llx :TBOLT issue_cmd_ppc:" "ISSUED CMD TO FW : called : cmd:"
*** 2032,2069 **** MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc = cmd->request_desc; struct mrsas_header *hdr; hdr = (struct mrsas_header *)&cmd->frame->hdr; ! con_log(CL_ANN, (CE_NOTE, "tbolt_issue_cmd_in_sync_mode: cmd->[SMID]=0x%X", cmd->SMID)); if (instance->adapterresetinprogress) { cmd->drv_pkt_time = ddi_get16 (cmd->frame_dma_obj.acc_handle, &hdr->timeout); if (cmd->drv_pkt_time < debug_timeout_g) cmd->drv_pkt_time = (uint16_t)debug_timeout_g; con_log(CL_ANN, (CE_NOTE, "tbolt_issue_cmd_in_sync_mode:" ! "RESET-IN-PROGRESS, issue cmd & return.\n")); mutex_enter(&instance->reg_write_mtx); WR_IB_LOW_QPORT((uint32_t)(req_desc->Words), instance); WR_IB_HIGH_QPORT((uint32_t)(req_desc->Words >> 32), instance); mutex_exit(&instance->reg_write_mtx); return (DDI_SUCCESS); } else { ! con_log(CL_ANN1, (CE_NOTE, "tbolt_issue_cmd_in_sync_mode: pushing the pkt\n")); push_pending_mfi_pkt(instance, cmd); } con_log(CL_DLEVEL2, (CE_NOTE, ! "HighQport offset :%lx", ! (uint32_t *)((uintptr_t)(instance)->regmap + IB_HIGH_QPORT))); con_log(CL_DLEVEL2, (CE_NOTE, ! "LowQport offset :%lx", ! (uint32_t *)((uintptr_t)(instance)->regmap + IB_LOW_QPORT))); cmd->sync_cmd = MRSAS_TRUE; cmd->cmd_status = ENODATA; --- 2037,2077 ---- MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc = cmd->request_desc; struct mrsas_header *hdr; hdr = (struct mrsas_header *)&cmd->frame->hdr; ! con_log(CL_ANN, ! (CE_NOTE, "tbolt_issue_cmd_in_sync_mode: cmd->[SMID]=0x%X", ! cmd->SMID)); if (instance->adapterresetinprogress) { cmd->drv_pkt_time = ddi_get16 (cmd->frame_dma_obj.acc_handle, &hdr->timeout); if (cmd->drv_pkt_time < debug_timeout_g) cmd->drv_pkt_time = (uint16_t)debug_timeout_g; con_log(CL_ANN, (CE_NOTE, "tbolt_issue_cmd_in_sync_mode:" ! "RESET-IN-PROGRESS, issue cmd & return.")); mutex_enter(&instance->reg_write_mtx); WR_IB_LOW_QPORT((uint32_t)(req_desc->Words), instance); WR_IB_HIGH_QPORT((uint32_t)(req_desc->Words >> 32), instance); mutex_exit(&instance->reg_write_mtx); return (DDI_SUCCESS); } else { ! con_log(CL_ANN1, (CE_NOTE, ! "tbolt_issue_cmd_in_sync_mode: pushing the pkt")); push_pending_mfi_pkt(instance, cmd); } con_log(CL_DLEVEL2, (CE_NOTE, ! "HighQport offset :%p", ! (void *)((uintptr_t)(instance)->regmap + IB_HIGH_QPORT))); con_log(CL_DLEVEL2, (CE_NOTE, ! "LowQport offset :%p", ! (void *)((uintptr_t)(instance)->regmap + IB_LOW_QPORT))); cmd->sync_cmd = MRSAS_TRUE; cmd->cmd_status = ENODATA;
*** 2071,2083 **** WR_IB_LOW_QPORT((uint32_t)(req_desc->Words), instance); WR_IB_HIGH_QPORT((uint32_t)(req_desc->Words >> 32), instance); mutex_exit(&instance->reg_write_mtx); con_log(CL_ANN1, (CE_NOTE, ! " req desc high part %x \n", (req_desc->Words >> 32))); ! con_log(CL_ANN1, (CE_NOTE, ! " req desc low part %x \n", req_desc->Words)); mutex_enter(&instance->int_cmd_mtx); for (i = 0; i < msecs && (cmd->cmd_status == ENODATA); i++) { cv_wait(&instance->int_cmd_cv, &instance->int_cmd_mtx); } --- 2079,2091 ---- WR_IB_LOW_QPORT((uint32_t)(req_desc->Words), instance); WR_IB_HIGH_QPORT((uint32_t)(req_desc->Words >> 32), instance); mutex_exit(&instance->reg_write_mtx); con_log(CL_ANN1, (CE_NOTE, ! " req desc high part %x", (uint_t)(req_desc->Words >> 32))); ! con_log(CL_ANN1, (CE_NOTE, " req desc low part %x", ! (uint_t)(req_desc->Words & 0xffffffff))); mutex_enter(&instance->int_cmd_mtx); for (i = 0; i < msecs && (cmd->cmd_status == ENODATA); i++) { cv_wait(&instance->int_cmd_cv, &instance->int_cmd_mtx); }
*** 2101,2111 **** int i; uint16_t flags; uint32_t msecs = MFI_POLL_TIMEOUT_SECS * MILLISEC; struct mrsas_header *frame_hdr; ! con_log(CL_ANN, (CE_NOTE, "tbolt_issue_cmd_in_poll_mode: cmd->[SMID]=0x%X", cmd->SMID)); MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc = cmd->request_desc; frame_hdr = (struct mrsas_header *)&cmd->frame->hdr; ddi_put8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status, --- 2109,2121 ---- int i; uint16_t flags; uint32_t msecs = MFI_POLL_TIMEOUT_SECS * MILLISEC; struct mrsas_header *frame_hdr; ! con_log(CL_ANN, ! (CE_NOTE, "tbolt_issue_cmd_in_poll_mode: cmd->[SMID]=0x%X", ! cmd->SMID)); MRSAS_REQUEST_DESCRIPTOR_UNION *req_desc = cmd->request_desc; frame_hdr = (struct mrsas_header *)&cmd->frame->hdr; ddi_put8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status,
*** 2112,2125 **** MFI_CMD_STATUS_POLL_MODE); flags = ddi_get16(cmd->frame_dma_obj.acc_handle, &frame_hdr->flags); flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE; ddi_put16(cmd->frame_dma_obj.acc_handle, &frame_hdr->flags, flags); con_log(CL_ANN1, (CE_NOTE, ! " req desc low part %x \n", req_desc->Words)); ! con_log(CL_ANN1, (CE_NOTE, ! " req desc high part %x \n", (req_desc->Words >> 32))); /* issue the frame using inbound queue port */ mutex_enter(&instance->reg_write_mtx); WR_IB_LOW_QPORT((uint32_t)(req_desc->Words), instance); WR_IB_HIGH_QPORT((uint32_t)(req_desc->Words >> 32), instance); --- 2122,2135 ---- MFI_CMD_STATUS_POLL_MODE); flags = ddi_get16(cmd->frame_dma_obj.acc_handle, &frame_hdr->flags); flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE; ddi_put16(cmd->frame_dma_obj.acc_handle, &frame_hdr->flags, flags); + con_log(CL_ANN1, (CE_NOTE, " req desc low part %x", + (uint_t)(req_desc->Words & 0xffffffff))); con_log(CL_ANN1, (CE_NOTE, ! " req desc high part %x", (uint_t)(req_desc->Words >> 32))); /* issue the frame using inbound queue port */ mutex_enter(&instance->reg_write_mtx); WR_IB_LOW_QPORT((uint32_t)(req_desc->Words), instance); WR_IB_HIGH_QPORT((uint32_t)(req_desc->Words >> 32), instance);
*** 2133,2177 **** } if (ddi_get8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status) == MFI_CMD_STATUS_POLL_MODE) { con_log(CL_ANN1, (CE_NOTE, ! " cmd failed %x \n", (req_desc->Words))); return (DDI_FAILURE); } return (DDI_SUCCESS); } void tbolt_enable_intr(struct mrsas_instance *instance) { - uint32_t mask; - /* TODO: For Thunderbolt/Invader also clear intr on enable */ ! //writel(~0, &regs->outbound_intr_status); ! //readl(&regs->outbound_intr_status); WR_OB_INTR_MASK(~(MFI_FUSION_ENABLE_INTERRUPT_MASK), instance); /* dummy read to force PCI flush */ ! mask = RD_OB_INTR_MASK(instance); } void tbolt_disable_intr(struct mrsas_instance *instance) { uint32_t mask = 0xFFFFFFFF; - uint32_t status; - WR_OB_INTR_MASK(mask, instance); /* Dummy readl to force pci flush */ ! status = RD_OB_INTR_MASK(instance); } int tbolt_intr_ack(struct mrsas_instance *instance) --- 2143,2183 ---- } if (ddi_get8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status) == MFI_CMD_STATUS_POLL_MODE) { con_log(CL_ANN1, (CE_NOTE, ! " cmd failed %" PRIx64, (req_desc->Words))); return (DDI_FAILURE); } return (DDI_SUCCESS); } void tbolt_enable_intr(struct mrsas_instance *instance) { /* TODO: For Thunderbolt/Invader also clear intr on enable */ ! /* writel(~0, &regs->outbound_intr_status); */ ! /* readl(&regs->outbound_intr_status); */ WR_OB_INTR_MASK(~(MFI_FUSION_ENABLE_INTERRUPT_MASK), instance); /* dummy read to force PCI flush */ ! (void) RD_OB_INTR_MASK(instance); } void tbolt_disable_intr(struct mrsas_instance *instance) { uint32_t mask = 0xFFFFFFFF; WR_OB_INTR_MASK(mask, instance); /* Dummy readl to force pci flush */ ! (void) RD_OB_INTR_MASK(instance); } int tbolt_intr_ack(struct mrsas_instance *instance)
*** 2179,2199 **** uint32_t status; /* check if it is our interrupt */ status = RD_OB_INTR_STATUS(instance); con_log(CL_ANN1, (CE_NOTE, ! "chkpnt: Entered tbolt_intr_ack status = %d \n", status)); if (!(status & MFI_FUSION_ENABLE_INTERRUPT_MASK)) { return (DDI_INTR_UNCLAIMED); } if ((status & 1) || (status & MFI_FUSION_ENABLE_INTERRUPT_MASK)) { /* clear the interrupt by writing back the same value */ WR_OB_INTR_STATUS(status, instance); /* dummy READ */ ! RD_OB_INTR_STATUS(instance); } return (DDI_INTR_CLAIMED); } /* --- 2185,2210 ---- uint32_t status; /* check if it is our interrupt */ status = RD_OB_INTR_STATUS(instance); con_log(CL_ANN1, (CE_NOTE, ! "chkpnt: Entered tbolt_intr_ack status = %d", status)); if (!(status & MFI_FUSION_ENABLE_INTERRUPT_MASK)) { return (DDI_INTR_UNCLAIMED); } + if (mrsas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) { + ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST); + return (DDI_INTR_UNCLAIMED); + } + if ((status & 1) || (status & MFI_FUSION_ENABLE_INTERRUPT_MASK)) { /* clear the interrupt by writing back the same value */ WR_OB_INTR_STATUS(status, instance); /* dummy READ */ ! (void) RD_OB_INTR_STATUS(instance); } return (DDI_INTR_CLAIMED); } /*
*** 2298,2320 **** { Mpi2RaidSCSIIORequest_t *scsi_raid_io; Mpi25IeeeSgeChain64_t *scsi_raid_io_sgl_ieee; MRSAS_REQUEST_DESCRIPTOR_UNION *ReqDescUnion; uint32_t index; if (!instance->tbolt) { ! con_log(CL_ANN, (CE_NOTE, "Not MFA enabled.\n")); return; } index = cmd->index; ! ReqDescUnion = ! mr_sas_get_request_descriptor(instance, index, cmd); if (!ReqDescUnion) { ! con_log(CL_ANN1, (CE_NOTE, "[NULL REQDESC]%x")); return; } con_log(CL_ANN1, (CE_NOTE, "[SMID]%x", cmd->SMID)); --- 2309,2332 ---- { Mpi2RaidSCSIIORequest_t *scsi_raid_io; Mpi25IeeeSgeChain64_t *scsi_raid_io_sgl_ieee; MRSAS_REQUEST_DESCRIPTOR_UNION *ReqDescUnion; uint32_t index; + ddi_acc_handle_t acc_handle = + instance->mpi2_frame_pool_dma_obj.acc_handle; if (!instance->tbolt) { ! con_log(CL_ANN, (CE_NOTE, "Not MFA enabled.")); return; } index = cmd->index; ! ReqDescUnion = mr_sas_get_request_descriptor(instance, index); if (!ReqDescUnion) { ! con_log(CL_ANN1, (CE_NOTE, "[NULL REQDESC]")); return; } con_log(CL_ANN1, (CE_NOTE, "[SMID]%x", cmd->SMID));
*** 2326,2378 **** ReqDescUnion->SCSIIO.SMID = cmd->SMID; cmd->request_desc = ReqDescUnion; ! // get raid message frame pointer scsi_raid_io = (Mpi2RaidSCSIIORequest_t *)cmd->scsi_io_request; if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! Mpi25IeeeSgeChain64_t *sgl_ptr_end = (Mpi25IeeeSgeChain64_t *)&scsi_raid_io->SGL.IeeeChain; sgl_ptr_end += instance->max_sge_in_main_msg - 1; ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &sgl_ptr_end->Flags, 0); } ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->Function, MPI2_FUNCTION_PASSTHRU_IO_REQUEST); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->SGLOffset0, offsetof(MPI2_RAID_SCSI_IO_REQUEST, SGL) / 4); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->ChainOffset, (U8)offsetof(MPI2_RAID_SCSI_IO_REQUEST, SGL) / 16); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->SenseBufferLowAddress, cmd->sense_phys_addr1); scsi_raid_io_sgl_ieee = (Mpi25IeeeSgeChain64_t *)&scsi_raid_io->SGL.IeeeChain; ! ddi_put64(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Address, (U64)cmd->frame_phys_addr); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Flags, ! (IEEE_SGE_FLAGS_CHAIN_ELEMENT | MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR)); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io_sgl_ieee->Length, 1024); //MEGASAS_MAX_SZ_CHAIN_FRAME con_log(CL_ANN1, (CE_NOTE, ! "[MFI CMD PHY ADDRESS]:%x", scsi_raid_io_sgl_ieee->Address)); con_log(CL_ANN1, (CE_NOTE, "[SGL Length]:%x", scsi_raid_io_sgl_ieee->Length)); con_log(CL_ANN1, (CE_NOTE, "[SGL Flags]:%x", scsi_raid_io_sgl_ieee->Flags)); --- 2338,2384 ---- ReqDescUnion->SCSIIO.SMID = cmd->SMID; cmd->request_desc = ReqDescUnion; ! /* get raid message frame pointer */ scsi_raid_io = (Mpi2RaidSCSIIORequest_t *)cmd->scsi_io_request; if (instance->device_id == PCI_DEVICE_ID_LSI_INVADER) { ! Mpi25IeeeSgeChain64_t *sgl_ptr_end = (Mpi25IeeeSgeChain64_t *) ! &scsi_raid_io->SGL.IeeeChain; sgl_ptr_end += instance->max_sge_in_main_msg - 1; ! ddi_put8(acc_handle, &sgl_ptr_end->Flags, 0); } ! ddi_put8(acc_handle, &scsi_raid_io->Function, MPI2_FUNCTION_PASSTHRU_IO_REQUEST); ! ddi_put8(acc_handle, &scsi_raid_io->SGLOffset0, offsetof(MPI2_RAID_SCSI_IO_REQUEST, SGL) / 4); ! ddi_put8(acc_handle, &scsi_raid_io->ChainOffset, (U8)offsetof(MPI2_RAID_SCSI_IO_REQUEST, SGL) / 16); ! ddi_put32(acc_handle, &scsi_raid_io->SenseBufferLowAddress, cmd->sense_phys_addr1); scsi_raid_io_sgl_ieee = (Mpi25IeeeSgeChain64_t *)&scsi_raid_io->SGL.IeeeChain; ! ddi_put64(acc_handle, &scsi_raid_io_sgl_ieee->Address, (U64)cmd->frame_phys_addr); ! ddi_put8(acc_handle, ! &scsi_raid_io_sgl_ieee->Flags, (IEEE_SGE_FLAGS_CHAIN_ELEMENT | MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR)); ! /* LSI put hardcoded 1024 instead of MEGASAS_MAX_SZ_CHAIN_FRAME. */ ! ddi_put32(acc_handle, &scsi_raid_io_sgl_ieee->Length, 1024); con_log(CL_ANN1, (CE_NOTE, ! "[MFI CMD PHY ADDRESS]:%" PRIx64, scsi_raid_io_sgl_ieee->Address)); con_log(CL_ANN1, (CE_NOTE, "[SGL Length]:%x", scsi_raid_io_sgl_ieee->Length)); con_log(CL_ANN1, (CE_NOTE, "[SGL Flags]:%x", scsi_raid_io_sgl_ieee->Flags));
*** 2389,2406 **** struct scsa_cmd *acmd; struct scsi_pkt *pkt; struct scsi_arq_status *arqstat; Mpi2RaidSCSIIORequest_t *scsi_raid_io; LD_LOAD_BALANCE_INFO *lbinfo; ! int i; scsi_raid_io = (Mpi2RaidSCSIIORequest_t *)cmd->scsi_io_request; ! status = ddi_get8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.status); ! extStatus = ddi_get8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.extStatus); con_log(CL_DLEVEL3, (CE_NOTE, "status %x", status)); con_log(CL_DLEVEL3, (CE_NOTE, "extStatus %x", extStatus)); if (status != MFI_STAT_OK) { --- 2395,2411 ---- struct scsa_cmd *acmd; struct scsi_pkt *pkt; struct scsi_arq_status *arqstat; Mpi2RaidSCSIIORequest_t *scsi_raid_io; LD_LOAD_BALANCE_INFO *lbinfo; ! ddi_acc_handle_t acc_handle = ! instance->mpi2_frame_pool_dma_obj.acc_handle; scsi_raid_io = (Mpi2RaidSCSIIORequest_t *)cmd->scsi_io_request; ! status = ddi_get8(acc_handle, &scsi_raid_io->RaidContext.status); ! extStatus = ddi_get8(acc_handle, &scsi_raid_io->RaidContext.extStatus); con_log(CL_DLEVEL3, (CE_NOTE, "status %x", status)); con_log(CL_DLEVEL3, (CE_NOTE, "extStatus %x", extStatus)); if (status != MFI_STAT_OK) {
*** 2411,2458 **** "IO Cmd Success SMID %x", cmd->SMID)); } /* regular commands */ ! switch (ddi_get8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->Function)) { case MPI2_FUNCTION_SCSI_IO_REQUEST : /* Fast Path IO. */ acmd = (struct scsa_cmd *)cmd->cmd; lbinfo = &instance->load_balance_info[acmd->device_id]; if (cmd->load_balance_flag & MEGASAS_LOAD_BALANCE_FLAG) { ! arm = lbinfo->raid1DevHandle[0] == scsi_raid_io->DevHandle ? 0 : 1; lbinfo->scsi_pending_cmds[arm]--; cmd->load_balance_flag &= ~MEGASAS_LOAD_BALANCE_FLAG; } con_log(CL_DLEVEL3, (CE_NOTE, "FastPath IO Completion Success ")); ! case MPI2_FUNCTION_LD_IO_REQUEST : {// Regular Path IO. acmd = (struct scsa_cmd *)cmd->cmd; pkt = (struct scsi_pkt *)CMD2PKT(acmd); if (acmd->cmd_flags & CFLAG_DMAVALID) { if (acmd->cmd_flags & CFLAG_CONSISTENT) { (void) ddi_dma_sync(acmd->cmd_dmahandle, ! acmd->cmd_dma_offset, ! acmd->cmd_dma_len, DDI_DMA_SYNC_FORCPU); } } pkt->pkt_reason = CMD_CMPLT; pkt->pkt_statistics = 0; ! pkt->pkt_state = STATE_GOT_BUS ! | STATE_GOT_TARGET | STATE_SENT_CMD ! | STATE_XFERRED_DATA | STATE_GOT_STATUS; ! con_log(CL_ANN, (CE_CONT, ! " CDB[0] = %x completed for %s: size %lx SMID %x cmd_status %x", ! pkt->pkt_cdbp[0], ((acmd->islogical) ? "LD" : "PD"), acmd->cmd_dmacount, cmd->SMID, status)); if (pkt->pkt_cdbp[0] == SCMD_INQUIRY) { struct scsi_inquiry *inq; --- 2416,2461 ---- "IO Cmd Success SMID %x", cmd->SMID)); } /* regular commands */ ! switch (ddi_get8(acc_handle, &scsi_raid_io->Function)) { case MPI2_FUNCTION_SCSI_IO_REQUEST : /* Fast Path IO. */ acmd = (struct scsa_cmd *)cmd->cmd; lbinfo = &instance->load_balance_info[acmd->device_id]; if (cmd->load_balance_flag & MEGASAS_LOAD_BALANCE_FLAG) { ! arm = lbinfo->raid1DevHandle[0] == ! scsi_raid_io->DevHandle ? 0 : 1; lbinfo->scsi_pending_cmds[arm]--; cmd->load_balance_flag &= ~MEGASAS_LOAD_BALANCE_FLAG; } con_log(CL_DLEVEL3, (CE_NOTE, "FastPath IO Completion Success ")); + /* FALLTHRU */ ! case MPI2_FUNCTION_LD_IO_REQUEST : { /* Regular Path IO. */ acmd = (struct scsa_cmd *)cmd->cmd; pkt = (struct scsi_pkt *)CMD2PKT(acmd); if (acmd->cmd_flags & CFLAG_DMAVALID) { if (acmd->cmd_flags & CFLAG_CONSISTENT) { (void) ddi_dma_sync(acmd->cmd_dmahandle, ! acmd->cmd_dma_offset, acmd->cmd_dma_len, DDI_DMA_SYNC_FORCPU); } } pkt->pkt_reason = CMD_CMPLT; pkt->pkt_statistics = 0; ! pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | ! STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS; ! con_log(CL_ANN, (CE_CONT, " CDB[0] = %x completed for %s: " ! "size %lx SMID %x cmd_status %x", pkt->pkt_cdbp[0], ((acmd->islogical) ? "LD" : "PD"), acmd->cmd_dmacount, cmd->SMID, status)); if (pkt->pkt_cdbp[0] == SCMD_INQUIRY) { struct scsi_inquiry *inq;
*** 2463,2488 **** acmd->cmd_buf->b_un.b_addr; /* don't expose physical drives to OS */ if (acmd->islogical && (status == MFI_STAT_OK)) { ! display_scsi_inquiry( ! (caddr_t)inq); ! } #ifdef PDSUPPORT ! else if ((status == ! MFI_STAT_OK) && inq->inq_dtype == ! DTYPE_DIRECT) { ! ! display_scsi_inquiry( ! (caddr_t)inq); ! } #endif ! else { /* for physical disk */ ! status = ! MFI_STAT_DEVICE_NOT_FOUND; } } } switch (status) { --- 2466,2484 ---- acmd->cmd_buf->b_un.b_addr; /* don't expose physical drives to OS */ if (acmd->islogical && (status == MFI_STAT_OK)) { ! display_scsi_inquiry((caddr_t)inq); #ifdef PDSUPPORT ! } else if ((status == MFI_STAT_OK) && ! inq->inq_dtype == DTYPE_DIRECT) { ! display_scsi_inquiry((caddr_t)inq); #endif ! } else { /* for physical disk */ ! status = MFI_STAT_DEVICE_NOT_FOUND; } } } switch (status) {
*** 2503,2517 **** case MFI_STAT_SCSI_DONE_WITH_ERROR: con_log(CL_ANN, (CE_WARN, "tbolt_complete_cmd: scsi_done with error")); pkt->pkt_reason = CMD_CMPLT; ! ((struct scsi_status *) ! pkt->pkt_scbp)->sts_chk = 1; if (pkt->pkt_cdbp[0] == SCMD_TEST_UNIT_READY) { ! con_log(CL_ANN, (CE_WARN, "TEST_UNIT_READY fail")); } else { pkt->pkt_state |= STATE_ARQ_DONE; arqstat = (void *)(pkt->pkt_scbp); arqstat->sts_rqpkt_reason = CMD_CMPLT; arqstat->sts_rqpkt_resid = 0; --- 2499,2513 ---- case MFI_STAT_SCSI_DONE_WITH_ERROR: con_log(CL_ANN, (CE_WARN, "tbolt_complete_cmd: scsi_done with error")); pkt->pkt_reason = CMD_CMPLT; ! ((struct scsi_status *)pkt->pkt_scbp)->sts_chk = 1; if (pkt->pkt_cdbp[0] == SCMD_TEST_UNIT_READY) { ! con_log(CL_ANN, ! (CE_WARN, "TEST_UNIT_READY fail")); } else { pkt->pkt_state |= STATE_ARQ_DONE; arqstat = (void *)(pkt->pkt_scbp); arqstat->sts_rqpkt_reason = CMD_CMPLT; arqstat->sts_rqpkt_resid = 0;
*** 2519,2550 **** STATE_GOT_BUS | STATE_GOT_TARGET | STATE_SENT_CMD | STATE_XFERRED_DATA; *(uint8_t *)&arqstat->sts_rqpkt_status = STATUS_GOOD; ! con_log(CL_ANN1, (CE_NOTE, ! "Copying Sense data %x", cmd->SMID)); ! ddi_rep_get8( ! instance-> ! mpi2_frame_pool_dma_obj.acc_handle, ! (uint8_t *) ! &(arqstat->sts_sensedata), cmd->sense1, sizeof (struct scsi_extended_sense), DDI_DEV_AUTOINCR); } break; case MFI_STAT_LD_OFFLINE: cmn_err(CE_WARN, "tbolt_complete_cmd: ld offline " ! "CDB[0]=0x%x targetId=0x%x devhandle=0x%x\n", //UNDO: ! ddi_get8(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->CDB.CDB32[0]), ! ddi_get16(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->RaidContext.ldTargetId), ! ddi_get16(instance->mpi2_frame_pool_dma_obj.acc_handle, &scsi_raid_io->DevHandle) ); pkt->pkt_reason = CMD_DEV_GONE; pkt->pkt_statistics = STAT_DISCON; break; case MFI_STAT_DEVICE_NOT_FOUND: con_log(CL_ANN, (CE_CONT, --- 2515,2548 ---- STATE_GOT_BUS | STATE_GOT_TARGET | STATE_SENT_CMD | STATE_XFERRED_DATA; *(uint8_t *)&arqstat->sts_rqpkt_status = STATUS_GOOD; ! con_log(CL_ANN1, ! (CE_NOTE, "Copying Sense data %x", cmd->SMID)); ! ddi_rep_get8(acc_handle, ! (uint8_t *)&(arqstat->sts_sensedata), cmd->sense1, sizeof (struct scsi_extended_sense), DDI_DEV_AUTOINCR); } break; case MFI_STAT_LD_OFFLINE: cmn_err(CE_WARN, "tbolt_complete_cmd: ld offline " ! "CDB[0]=0x%x targetId=0x%x devhandle=0x%x", ! /* UNDO: */ ! ddi_get8(acc_handle, &scsi_raid_io->CDB.CDB32[0]), ! ! ddi_get16(acc_handle, ! &scsi_raid_io->RaidContext.ldTargetId), ! ! ddi_get16(acc_handle, &scsi_raid_io->DevHandle)); ! pkt->pkt_reason = CMD_DEV_GONE; pkt->pkt_statistics = STAT_DISCON; break; case MFI_STAT_DEVICE_NOT_FOUND: con_log(CL_ANN, (CE_CONT,
*** 2554,2580 **** break; case MFI_STAT_LD_LBA_OUT_OF_RANGE: pkt->pkt_state |= STATE_ARQ_DONE; pkt->pkt_reason = CMD_CMPLT; ! ((struct scsi_status *) ! pkt->pkt_scbp)->sts_chk = 1; arqstat = (void *)(pkt->pkt_scbp); arqstat->sts_rqpkt_reason = CMD_CMPLT; arqstat->sts_rqpkt_resid = 0; arqstat->sts_rqpkt_state |= STATE_GOT_BUS | STATE_GOT_TARGET | STATE_SENT_CMD | STATE_XFERRED_DATA; ! *(uint8_t *)&arqstat->sts_rqpkt_status = ! STATUS_GOOD; arqstat->sts_sensedata.es_valid = 1; ! arqstat->sts_sensedata.es_key = ! KEY_ILLEGAL_REQUEST; ! arqstat->sts_sensedata.es_class = ! CLASS_EXTENDED_SENSE; /* * LOGICAL BLOCK ADDRESS OUT OF RANGE: * ASC: 0x21h; ASCQ: 0x00h; */ --- 2552,2574 ---- break; case MFI_STAT_LD_LBA_OUT_OF_RANGE: pkt->pkt_state |= STATE_ARQ_DONE; pkt->pkt_reason = CMD_CMPLT; ! ((struct scsi_status *)pkt->pkt_scbp)->sts_chk = 1; arqstat = (void *)(pkt->pkt_scbp); arqstat->sts_rqpkt_reason = CMD_CMPLT; arqstat->sts_rqpkt_resid = 0; arqstat->sts_rqpkt_state |= STATE_GOT_BUS | STATE_GOT_TARGET | STATE_SENT_CMD | STATE_XFERRED_DATA; ! *(uint8_t *)&arqstat->sts_rqpkt_status = STATUS_GOOD; arqstat->sts_sensedata.es_valid = 1; ! arqstat->sts_sensedata.es_key = KEY_ILLEGAL_REQUEST; ! arqstat->sts_sensedata.es_class = CLASS_EXTENDED_SENSE; /* * LOGICAL BLOCK ADDRESS OUT OF RANGE: * ASC: 0x21h; ASCQ: 0x00h; */
*** 2592,2657 **** break; } atomic_add_16(&instance->fw_outstanding, (-1)); /* Call the callback routine */ ! if (((pkt->pkt_flags & FLAG_NOINTR) == 0) && ! pkt->pkt_comp) { (*pkt->pkt_comp)(pkt); - } con_log(CL_ANN1, (CE_NOTE, "Free smid %x", cmd->SMID)); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.status, 0); ! ddi_put8(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_raid_io->RaidContext.extStatus, 0); return_raid_msg_pkt(instance, cmd); break; } ! case MPI2_FUNCTION_PASSTHRU_IO_REQUEST: // MFA command. ! if (cmd->frame->dcmd.opcode ! == MR_DCMD_LD_MAP_GET_INFO && ! cmd->frame->dcmd.mbox.b[1] ! == 1) { mutex_enter(&instance->sync_map_mtx); con_log(CL_ANN, (CE_NOTE, "LDMAP sync command SMID RECEIVED 0x%X", cmd->SMID)); if (cmd->frame->hdr.cmd_status != 0) { cmn_err(CE_WARN, ! "map sync failed, status = 0x%x.\n",cmd->frame->hdr.cmd_status); ! } ! else { instance->map_id++; cmn_err(CE_NOTE, ! "map sync received, switched map_id to %ld \n",instance->map_id); } ! if (MR_ValidateMapInfo(instance->ld_map[(instance->map_id & 1)], instance->load_balance_info)) instance->fast_path_io = 1; ! else instance->fast_path_io = 0; con_log(CL_ANN, (CE_NOTE, ! "instance->fast_path_io %d \n",instance->fast_path_io)); instance->unroll.syncCmd = 0; ! if(instance->map_update_cmd == cmd) { return_raid_msg_pkt(instance, cmd); atomic_add_16(&instance->fw_outstanding, (-1)); ! mrsas_tbolt_sync_map_info(instance); } ! cmn_err(CE_NOTE, "LDMAP sync completed.\n"); mutex_exit(&instance->sync_map_mtx); break; } if (cmd->frame->dcmd.opcode == MR_DCMD_CTRL_EVENT_WAIT) { --- 2586,2661 ---- break; } atomic_add_16(&instance->fw_outstanding, (-1)); + (void) mrsas_common_check(instance, cmd); + if (acmd->cmd_dmahandle) { + if (mrsas_check_dma_handle(acmd->cmd_dmahandle) != + DDI_SUCCESS) { + ddi_fm_service_impact(instance->dip, + DDI_SERVICE_UNAFFECTED); + pkt->pkt_reason = CMD_TRAN_ERR; + pkt->pkt_statistics = 0; + } + } + /* Call the callback routine */ ! if (((pkt->pkt_flags & FLAG_NOINTR) == 0) && pkt->pkt_comp) (*pkt->pkt_comp)(pkt); con_log(CL_ANN1, (CE_NOTE, "Free smid %x", cmd->SMID)); ! ddi_put8(acc_handle, &scsi_raid_io->RaidContext.status, 0); ! ddi_put8(acc_handle, &scsi_raid_io->RaidContext.extStatus, 0); return_raid_msg_pkt(instance, cmd); break; } ! case MPI2_FUNCTION_PASSTHRU_IO_REQUEST: /* MFA command. */ ! if (cmd->frame->dcmd.opcode == MR_DCMD_LD_MAP_GET_INFO && ! cmd->frame->dcmd.mbox.b[1] == 1) { mutex_enter(&instance->sync_map_mtx); con_log(CL_ANN, (CE_NOTE, "LDMAP sync command SMID RECEIVED 0x%X", cmd->SMID)); if (cmd->frame->hdr.cmd_status != 0) { cmn_err(CE_WARN, ! "map sync failed, status = 0x%x.", ! cmd->frame->hdr.cmd_status); ! } else { instance->map_id++; cmn_err(CE_NOTE, ! "map sync received, switched map_id to %" ! PRIu64 " \n", instance->map_id); } ! if (MR_ValidateMapInfo(instance->ld_map[ ! (instance->map_id & 1)], ! instance->load_balance_info)) { instance->fast_path_io = 1; ! } else { instance->fast_path_io = 0; + } con_log(CL_ANN, (CE_NOTE, ! "instance->fast_path_io %d", ! instance->fast_path_io)); instance->unroll.syncCmd = 0; ! if (instance->map_update_cmd == cmd) { return_raid_msg_pkt(instance, cmd); atomic_add_16(&instance->fw_outstanding, (-1)); ! (void) mrsas_tbolt_sync_map_info(instance); } ! cmn_err(CE_NOTE, "LDMAP sync completed."); mutex_exit(&instance->sync_map_mtx); break; } if (cmd->frame->dcmd.opcode == MR_DCMD_CTRL_EVENT_WAIT) {
*** 2658,2695 **** con_log(CL_ANN1, (CE_CONT, "AEN command SMID RECEIVED 0x%X", cmd->SMID)); if ((instance->aen_cmd == cmd) && (instance->aen_cmd->abort_aen)) { ! con_log(CL_ANN, (CE_WARN, ! "mrsas_softintr: " "aborted_aen returned")); ! } ! else ! { atomic_add_16(&instance->fw_outstanding, (-1)); service_mfi_aen(instance, cmd); } } ! if (cmd->sync_cmd == MRSAS_TRUE ) { con_log(CL_ANN1, (CE_CONT, "Sync-mode Command Response SMID RECEIVED 0x%X", cmd->SMID)); tbolt_complete_cmd_in_sync_mode(instance, cmd); ! } ! else ! { con_log(CL_ANN, (CE_CONT, "tbolt_complete_cmd: Wrong SMID RECEIVED 0x%X", cmd->SMID)); } break; default: /* free message */ ! con_log(CL_ANN, (CE_NOTE, "tbolt_complete_cmd: Unknown Type!!!!!!!!")); break; } } uint_t --- 2662,2698 ---- con_log(CL_ANN1, (CE_CONT, "AEN command SMID RECEIVED 0x%X", cmd->SMID)); if ((instance->aen_cmd == cmd) && (instance->aen_cmd->abort_aen)) { ! con_log(CL_ANN, (CE_WARN, "mrsas_softintr: " "aborted_aen returned")); ! } else { atomic_add_16(&instance->fw_outstanding, (-1)); service_mfi_aen(instance, cmd); } } ! if (cmd->sync_cmd == MRSAS_TRUE) { con_log(CL_ANN1, (CE_CONT, "Sync-mode Command Response SMID RECEIVED 0x%X", cmd->SMID)); tbolt_complete_cmd_in_sync_mode(instance, cmd); ! } else { con_log(CL_ANN, (CE_CONT, "tbolt_complete_cmd: Wrong SMID RECEIVED 0x%X", cmd->SMID)); } break; default: + mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE); + ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST); + /* free message */ ! con_log(CL_ANN, ! (CE_NOTE, "tbolt_complete_cmd: Unknown Type!!!!!!!!")); break; } } uint_t
*** 2699,2711 **** Mpi2SCSIIOSuccessReplyDescriptor_t *replyDesc; Mpi2ReplyDescriptorsUnion_t *desc; uint16_t smid; union desc_value d_val; struct mrsas_cmd *cmd; - uint32_t i; - Mpi2RaidSCSIIORequest_t *scsi_raid_io; - uint8_t status; struct mrsas_header *hdr; struct scsi_pkt *pkt; (void) ddi_dma_sync(instance->reply_desc_dma_obj.dma_handle, --- 2702,2711 ----
*** 2722,2734 **** MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK; if (replyType == MPI2_RPY_DESCRIPT_FLAGS_UNUSED) return (DDI_INTR_UNCLAIMED); ! con_log(CL_ANN1, (CE_NOTE, "Reply Desc = %llx Words = %llx \n", ! desc, desc->Words)); d_val.word = desc->Words; /* Read Reply descriptor */ while ((d_val.u1.low != 0xffffffff) && --- 2722,2744 ---- MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK; if (replyType == MPI2_RPY_DESCRIPT_FLAGS_UNUSED) return (DDI_INTR_UNCLAIMED); ! if (mrsas_check_dma_handle(instance->mfi_internal_dma_obj.dma_handle) ! != DDI_SUCCESS) { ! mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE); ! ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST); ! con_log(CL_ANN1, ! (CE_WARN, "mr_sas_tbolt_process_outstanding_cmd(): " ! "FMA check, returning DDI_INTR_UNCLAIMED")); ! return (DDI_INTR_CLAIMED); ! } + con_log(CL_ANN1, (CE_NOTE, "Reply Desc = %p Words = %" PRIx64, + (void *)desc, desc->Words)); + d_val.word = desc->Words; /* Read Reply descriptor */ while ((d_val.u1.low != 0xffffffff) &&
*** 2739,2785 **** smid = replyDesc->SMID; if (!smid || smid > instance->max_fw_cmds + 1) { con_log(CL_ANN1, (CE_NOTE, ! "Reply Desc at Break = %llx Words = %llx \n", ! desc, desc->Words)); break; } cmd = instance->cmd_list[smid - 1]; ! if(!cmd ) { ! con_log(CL_ANN1, (CE_NOTE, ! "mr_sas_tbolt_process_outstanding_cmd: Invalid command " ! " or Poll commad Received in completion path\n")); ! } ! else { mutex_enter(&instance->cmd_pend_mtx); if (cmd->sync_cmd == MRSAS_TRUE) { hdr = (struct mrsas_header *)&cmd->frame->hdr; if (hdr) { ! con_log(CL_ANN1, (CE_NOTE, ! "mr_sas_tbolt_process_outstanding_cmd:" ! " mlist_del_init(&cmd->list).\n")); mlist_del_init(&cmd->list); } } else { pkt = cmd->pkt; if (pkt) { ! con_log(CL_ANN1, (CE_NOTE, ! "mr_sas_tbolt_process_outstanding_cmd:" ! "mlist_del_init(&cmd->list).\n")); mlist_del_init(&cmd->list); } } mutex_exit(&instance->cmd_pend_mtx); tbolt_complete_cmd(instance, cmd); } ! // set it back to all 0xfffffffff. ! desc->Words = (uint64_t)~0; instance->reply_read_index++; if (instance->reply_read_index >= (instance->reply_q_depth)) { con_log(CL_ANN1, (CE_NOTE, "wrap around")); --- 2749,2794 ---- smid = replyDesc->SMID; if (!smid || smid > instance->max_fw_cmds + 1) { con_log(CL_ANN1, (CE_NOTE, ! "Reply Desc at Break = %p Words = %" PRIx64, ! (void *)desc, desc->Words)); break; } cmd = instance->cmd_list[smid - 1]; ! if (!cmd) { ! con_log(CL_ANN1, (CE_NOTE, "mr_sas_tbolt_process_" ! "outstanding_cmd: Invalid command " ! " or Poll commad Received in completion path")); ! } else { mutex_enter(&instance->cmd_pend_mtx); if (cmd->sync_cmd == MRSAS_TRUE) { hdr = (struct mrsas_header *)&cmd->frame->hdr; if (hdr) { ! con_log(CL_ANN1, (CE_NOTE, "mr_sas_" ! "tbolt_process_outstanding_cmd:" ! " mlist_del_init(&cmd->list).")); mlist_del_init(&cmd->list); } } else { pkt = cmd->pkt; if (pkt) { ! con_log(CL_ANN1, (CE_NOTE, "mr_sas_" ! "tbolt_process_outstanding_cmd:" ! "mlist_del_init(&cmd->list).")); mlist_del_init(&cmd->list); } } mutex_exit(&instance->cmd_pend_mtx); tbolt_complete_cmd(instance, cmd); } ! /* set it back to all 1s. */ ! desc->Words = -1LL; instance->reply_read_index++; if (instance->reply_read_index >= (instance->reply_q_depth)) { con_log(CL_ANN1, (CE_NOTE, "wrap around"));
*** 2795,2806 **** replyDesc = (MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR *)desc; d_val.word = desc->Words; con_log(CL_ANN1, (CE_NOTE, ! "Next Reply Desc = %llx Words = %llx\n", ! desc, desc->Words)); replyType = replyDesc->ReplyFlags & MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK; if (replyType == MPI2_RPY_DESCRIPT_FLAGS_UNUSED) --- 2804,2815 ---- replyDesc = (MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR *)desc; d_val.word = desc->Words; con_log(CL_ANN1, (CE_NOTE, ! "Next Reply Desc = %p Words = %" PRIx64, ! (void *)desc, desc->Words)); replyType = replyDesc->ReplyFlags & MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK; if (replyType == MPI2_RPY_DESCRIPT_FLAGS_UNUSED)
*** 2888,2905 **** ci = instance->ld_map[(instance->map_id & 1)]; ci_h = instance->ld_map_phy[(instance->map_id & 1)]; if (!ci) { ! cmn_err(CE_WARN, ! "Failed to alloc mem for ld_map_info"); return_raid_msg_pkt(instance, cmd); return (-1); } ! memset(ci, 0, sizeof (*ci)); ! memset(dcmd->mbox.b, 0, DCMD_MBOX_SZ); dcmd->cmd = MFI_CMD_OP_DCMD; dcmd->cmd_status = 0xFF; dcmd->sge_count = 1; dcmd->flags = MFI_FRAME_DIR_READ; --- 2897,2913 ---- ci = instance->ld_map[(instance->map_id & 1)]; ci_h = instance->ld_map_phy[(instance->map_id & 1)]; if (!ci) { ! cmn_err(CE_WARN, "Failed to alloc mem for ld_map_info"); return_raid_msg_pkt(instance, cmd); return (-1); } ! bzero(ci, sizeof (*ci)); ! bzero(dcmd->mbox.b, DCMD_MBOX_SZ); dcmd->cmd = MFI_CMD_OP_DCMD; dcmd->cmd_status = 0xFF; dcmd->sge_count = 1; dcmd->flags = MFI_FRAME_DIR_READ;
*** 2913,2927 **** mr_sas_tbolt_build_mfi_cmd(instance, cmd); if (!instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) { ret = 0; ! con_log(CL_ANN1, (CE_NOTE, ! "Get LD Map Info success\n")); } else { ! cmn_err(CE_WARN, ! "Get LD Map Info failed\n"); ret = -1; } return_raid_msg_pkt(instance, cmd); --- 2921,2933 ---- mr_sas_tbolt_build_mfi_cmd(instance, cmd); if (!instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) { ret = 0; ! con_log(CL_ANN1, (CE_NOTE, "Get LD Map Info success")); } else { ! cmn_err(CE_WARN, "Get LD Map Info failed"); ret = -1; } return_raid_msg_pkt(instance, cmd);
*** 2943,2982 **** "i=%d, %x:%x", i, d_val.u1.high, d_val.u1.low)); } } ! /** * mrsas_tbolt_command_create - Create command for fast path. * @io_info: MegaRAID IO request packet pointer. * @ref_tag: Reference tag for RD/WRPROTECT * * Create the command for fast path. */ void ! mrsas_tbolt_prepare_cdb(struct mrsas_instance *instance, U8 cdb[],struct IO_REQUEST_INFO *io_info,Mpi2RaidSCSIIORequest_t *scsi_io_request, U32 ref_tag) { uint16_t EEDPFlags; uint32_t Control; ! // Prepare 32-byte CDB if DIF is supported on this device ! con_log(CL_ANN, (CE_NOTE, "Prepare DIF CDB\n")); ! memset(cdb, 0, 32); cdb[0] = MRSAS_SCSI_VARIABLE_LENGTH_CMD; cdb[7] = MRSAS_SCSI_ADDL_CDB_LEN; ! if (io_info->isRead) { cdb[9] = MRSAS_SCSI_SERVICE_ACTION_READ32; ! } ! else { cdb[9] = MRSAS_SCSI_SERVICE_ACTION_WRITE32; - } ! cdb[10] = MRSAS_RD_WR_PROTECT; // Verify with in linux driver, set to MEGASAS_RD_WR_PROTECT_CHECK_ALL /* LOGICAL BLOCK ADDRESS */ cdb[12] = (U8)(((io_info->pdBlock) >> 56) & 0xff); cdb[13] = (U8)(((io_info->pdBlock) >> 48) & 0xff); cdb[14] = (U8)(((io_info->pdBlock) >> 40) & 0xff); --- 2949,2992 ---- "i=%d, %x:%x", i, d_val.u1.high, d_val.u1.low)); } } ! /* * mrsas_tbolt_command_create - Create command for fast path. * @io_info: MegaRAID IO request packet pointer. * @ref_tag: Reference tag for RD/WRPROTECT * * Create the command for fast path. */ void ! mrsas_tbolt_prepare_cdb(struct mrsas_instance *instance, U8 cdb[], ! struct IO_REQUEST_INFO *io_info, Mpi2RaidSCSIIORequest_t *scsi_io_request, ! U32 ref_tag) { uint16_t EEDPFlags; uint32_t Control; ! ddi_acc_handle_t acc_handle = ! instance->mpi2_frame_pool_dma_obj.acc_handle; ! /* Prepare 32-byte CDB if DIF is supported on this device */ ! con_log(CL_ANN, (CE_NOTE, "Prepare DIF CDB")); + bzero(cdb, 32); + cdb[0] = MRSAS_SCSI_VARIABLE_LENGTH_CMD; cdb[7] = MRSAS_SCSI_ADDL_CDB_LEN; ! if (io_info->isRead) cdb[9] = MRSAS_SCSI_SERVICE_ACTION_READ32; ! else cdb[9] = MRSAS_SCSI_SERVICE_ACTION_WRITE32; ! /* Verify within linux driver, set to MEGASAS_RD_WR_PROTECT_CHECK_ALL */ ! cdb[10] = MRSAS_RD_WR_PROTECT; /* LOGICAL BLOCK ADDRESS */ cdb[12] = (U8)(((io_info->pdBlock) >> 56) & 0xff); cdb[13] = (U8)(((io_info->pdBlock) >> 48) & 0xff); cdb[14] = (U8)(((io_info->pdBlock) >> 40) & 0xff);
*** 2985,3048 **** cdb[17] = (U8)(((io_info->pdBlock) >> 16) & 0xff); cdb[18] = (U8)(((io_info->pdBlock) >> 8) & 0xff); cdb[19] = (U8)((io_info->pdBlock) & 0xff); /* Logical block reference tag */ ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_io_request->CDB.EEDP32.PrimaryReferenceTag, ! BIG_ENDIAN(ref_tag)); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_io_request->CDB.EEDP32.PrimaryApplicationTagMask, ! 0xffff); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_io_request->DataLength, ((io_info->numBlocks)*512)); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_io_request->IoFlags,32); /* Specify 32-byte cdb */ /* Transfer length */ cdb[28] = (U8)(((io_info->numBlocks) >> 24) & 0xff); cdb[29] = (U8)(((io_info->numBlocks) >> 16) & 0xff); cdb[30] = (U8)(((io_info->numBlocks) >> 8) & 0xff); cdb[31] = (U8)((io_info->numBlocks) & 0xff); /* set SCSI IO EEDPFlags */ ! EEDPFlags = ddi_get16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_io_request->EEDPFlags); ! Control = ddi_get32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_io_request->Control); ! // set SCSI IO EEDPFlags bits if (io_info->isRead) { ! // For READ commands, the EEDPFlags shall be set to specify to ! // Increment the Primary Reference Tag, to Check the Reference ! // Tag, and to Check and Remove the Protection Information ! // fields. EEDPFlags = MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG | MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG | MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP | MPI2_SCSIIO_EEDPFLAGS_CHECK_APPTAG | MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD; ! } ! else { ! // For WRITE commands, the EEDPFlags shall be set to specify to ! // Increment the Primary Reference Tag, and to Insert ! // Protection Information fields. EEDPFlags = MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG | MPI2_SCSIIO_EEDPFLAGS_INSERT_OP; } Control |= (0x4 << 26); ! ddi_put16(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_io_request->EEDPFlags, EEDPFlags); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_io_request->Control, Control); ! ddi_put32(instance->mpi2_frame_pool_dma_obj.acc_handle, ! &scsi_io_request->EEDPBlockSize, ! MRSAS_EEDPBLOCKSIZE); } /* * mrsas_tbolt_set_pd_lba - Sets PD LBA --- 2995,3053 ---- cdb[17] = (U8)(((io_info->pdBlock) >> 16) & 0xff); cdb[18] = (U8)(((io_info->pdBlock) >> 8) & 0xff); cdb[19] = (U8)((io_info->pdBlock) & 0xff); /* Logical block reference tag */ ! ddi_put32(acc_handle, &scsi_io_request->CDB.EEDP32.PrimaryReferenceTag, ! BE_32(ref_tag)); ! ddi_put16(acc_handle, ! &scsi_io_request->CDB.EEDP32.PrimaryApplicationTagMask, 0xffff); ! ddi_put32(acc_handle, &scsi_io_request->DataLength, ((io_info->numBlocks)*512)); ! /* Specify 32-byte cdb */ ! ddi_put16(acc_handle, &scsi_io_request->IoFlags, 32); /* Transfer length */ cdb[28] = (U8)(((io_info->numBlocks) >> 24) & 0xff); cdb[29] = (U8)(((io_info->numBlocks) >> 16) & 0xff); cdb[30] = (U8)(((io_info->numBlocks) >> 8) & 0xff); cdb[31] = (U8)((io_info->numBlocks) & 0xff); /* set SCSI IO EEDPFlags */ ! EEDPFlags = ddi_get16(acc_handle, &scsi_io_request->EEDPFlags); ! Control = ddi_get32(acc_handle, &scsi_io_request->Control); ! /* set SCSI IO EEDPFlags bits */ if (io_info->isRead) { ! /* ! * For READ commands, the EEDPFlags shall be set to specify to ! * Increment the Primary Reference Tag, to Check the Reference ! * Tag, and to Check and Remove the Protection Information ! * fields. ! */ EEDPFlags = MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG | MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG | MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP | MPI2_SCSIIO_EEDPFLAGS_CHECK_APPTAG | MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD; ! } else { ! /* ! * For WRITE commands, the EEDPFlags shall be set to specify to ! * Increment the Primary Reference Tag, and to Insert ! * Protection Information fields. ! */ EEDPFlags = MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG | MPI2_SCSIIO_EEDPFLAGS_INSERT_OP; } Control |= (0x4 << 26); ! ddi_put16(acc_handle, &scsi_io_request->EEDPFlags, EEDPFlags); ! ddi_put32(acc_handle, &scsi_io_request->Control, Control); ! ddi_put32(acc_handle, ! &scsi_io_request->EEDPBlockSize, MRSAS_EEDPBLOCKSIZE); } /* * mrsas_tbolt_set_pd_lba - Sets PD LBA
*** 3050,3083 **** * @cdb_len: cdb length * @start_blk: Start block of IO * * Used to set the PD LBA in CDB for FP IOs */ ! void ! mrsas_tbolt_set_pd_lba(U8 cdb[], uint8_t *cdb_len_ptr, U64 start_blk, U32 num_blocks, U8 DifCapable) { U8 cdb_len = *cdb_len_ptr; U8 flagvals = 0, opcode = 0, groupnum = 0, control = 0; /* Some drives don't support 16/12 byte CDB's, convert to 10 */ if (((cdb_len == 12) || (cdb_len == 16)) && (start_blk <= 0xffffffff)) { if (cdb_len == 16) { ! con_log(CL_ANN, (CE_NOTE, "Converting READ/WRITE(16) to READ10\n")); opcode = cdb[0] == READ_16 ? READ_10 : WRITE_10; flagvals = cdb[1]; groupnum = cdb[14]; control = cdb[15]; } else { ! con_log(CL_ANN, (CE_NOTE, "Converting READ/WRITE(12) to READ10\n")); opcode = cdb[0] == READ_12 ? READ_10 : WRITE_10; flagvals = cdb[1]; groupnum = cdb[10]; control = cdb[11]; } ! memset(cdb, 0, sizeof(cdb)); cdb[0] = opcode; cdb[1] = flagvals; cdb[6] = groupnum; cdb[9] = control; --- 3055,3091 ---- * @cdb_len: cdb length * @start_blk: Start block of IO * * Used to set the PD LBA in CDB for FP IOs */ ! static void ! mrsas_tbolt_set_pd_lba(U8 cdb[], uint8_t *cdb_len_ptr, U64 start_blk, ! U32 num_blocks) { U8 cdb_len = *cdb_len_ptr; U8 flagvals = 0, opcode = 0, groupnum = 0, control = 0; /* Some drives don't support 16/12 byte CDB's, convert to 10 */ if (((cdb_len == 12) || (cdb_len == 16)) && (start_blk <= 0xffffffff)) { if (cdb_len == 16) { ! con_log(CL_ANN, ! (CE_NOTE, "Converting READ/WRITE(16) to READ10")); opcode = cdb[0] == READ_16 ? READ_10 : WRITE_10; flagvals = cdb[1]; groupnum = cdb[14]; control = cdb[15]; } else { ! con_log(CL_ANN, ! (CE_NOTE, "Converting READ/WRITE(12) to READ10")); opcode = cdb[0] == READ_12 ? READ_10 : WRITE_10; flagvals = cdb[1]; groupnum = cdb[10]; control = cdb[11]; } ! bzero(cdb, sizeof (cdb)); cdb[0] = opcode; cdb[1] = flagvals; cdb[6] = groupnum; cdb[9] = control;
*** 3085,3095 **** cdb[8] = (U8)(num_blocks & 0xff); cdb[7] = (U8)((num_blocks >> 8) & 0xff); cdb_len = 10; } else if ((cdb_len < 16) && (start_blk > 0xffffffff)) { /* Convert to 16 byte CDB for large LBA's */ ! con_log(CL_ANN, (CE_NOTE, "Converting 6/10/12 CDB to 16 byte CDB\n")); switch (cdb_len) { case 6: opcode = cdb[0] == READ_6 ? READ_16 : WRITE_16; control = cdb[5]; break; --- 3093,3104 ---- cdb[8] = (U8)(num_blocks & 0xff); cdb[7] = (U8)((num_blocks >> 8) & 0xff); cdb_len = 10; } else if ((cdb_len < 16) && (start_blk > 0xffffffff)) { /* Convert to 16 byte CDB for large LBA's */ ! con_log(CL_ANN, ! (CE_NOTE, "Converting 6/10/12 CDB to 16 byte CDB")); switch (cdb_len) { case 6: opcode = cdb[0] == READ_6 ? READ_16 : WRITE_16; control = cdb[5]; break;
*** 3105,3115 **** groupnum = cdb[10]; control = cdb[11]; break; } ! memset(cdb, 0, sizeof(cdb)); cdb[0] = opcode; cdb[1] = flagvals; cdb[14] = groupnum; cdb[15] = control; --- 3114,3124 ---- groupnum = cdb[10]; control = cdb[11]; break; } ! bzero(cdb, sizeof (cdb)); cdb[0] = opcode; cdb[1] = flagvals; cdb[14] = groupnum; cdb[15] = control;
*** 3125,3135 **** } else if ((cdb_len == 6) && (start_blk > 0x1fffff)) { /* convert to 10 byte CDB */ opcode = cdb[0] == READ_6 ? READ_10 : WRITE_10; control = cdb[5]; ! memset(cdb, 0, sizeof(cdb)); cdb[0] = opcode; cdb[9] = control; /* Set transfer length */ cdb[8] = (U8)(num_blocks & 0xff); --- 3134,3144 ---- } else if ((cdb_len == 6) && (start_blk > 0x1fffff)) { /* convert to 10 byte CDB */ opcode = cdb[0] == READ_6 ? READ_10 : WRITE_10; control = cdb[5]; ! bzero(cdb, sizeof (cdb)); cdb[0] = opcode; cdb[9] = control; /* Set transfer length */ cdb[8] = (U8)(num_blocks & 0xff);
*** 3177,3252 **** *cdb_len_ptr = cdb_len; } ! U8 mrsas_tbolt_check_map_info(struct mrsas_instance *instance) { MR_FW_RAID_MAP_ALL *ld_map; if (!mrsas_tbolt_get_ld_map_info(instance)) { ld_map = instance->ld_map[(instance->map_id & 1)]; ! con_log(CL_ANN1, (CE_NOTE, "ldCount=%d, map size=%d\n", ld_map->raidMap.ldCount, ld_map->raidMap.totalSize)); ! if (MR_ValidateMapInfo(instance->ld_map[(instance->map_id & 1)], instance->load_balance_info)) { ! con_log(CL_ANN, (CE_CONT, ! "MR_ValidateMapInfo success")); instance->fast_path_io = 1; ! con_log(CL_ANN, (CE_NOTE, ! "instance->fast_path_io %d \n",instance->fast_path_io)); return (DDI_SUCCESS); } } instance->fast_path_io = 0; cmn_err(CE_WARN, "MR_ValidateMapInfo failed"); con_log(CL_ANN, (CE_NOTE, ! "instance->fast_path_io %d \n",instance->fast_path_io)); - return (DDI_FAILURE); } /* * Marks HBA as bad. This will be called either when an * IO packet times out even after 3 FW resets * or FW is found to be fault even after 3 continuous resets. */ ! int mrsas_tbolt_kill_adapter(struct mrsas_instance *instance) { ! cmn_err(CE_WARN, "TBOLT Kill adapter called\n"); if (instance->deadadapter == 1) ! return (DDI_FAILURE); con_log(CL_ANN1, (CE_NOTE, "tbolt_kill_adapter: " "Writing to doorbell with MFI_STOP_ADP ")); mutex_enter(&instance->ocr_flags_mtx); instance->deadadapter = 1; mutex_exit(&instance->ocr_flags_mtx); instance->func_ptr->disable_intr(instance); WR_RESERVED0_REGISTER(MFI_STOP_ADP, instance); /* Flush */ ! RD_RESERVED0_REGISTER(instance); (void) mrsas_print_pending_cmds(instance); ! mrsas_complete_pending_cmds(instance); ! return (DDI_SUCCESS); } ! void mrsas_reset_reply_desc(struct mrsas_instance *instance) { int i; MPI2_REPLY_DESCRIPTORS_UNION *reply_desc; ! instance->reply_read_index= 0; /* initializing reply address to 0xFFFFFFFF */ reply_desc = instance->reply_frame_pool; for (i = 0; i < instance->reply_q_depth; i++) { --- 3186,3264 ---- *cdb_len_ptr = cdb_len; } ! static int mrsas_tbolt_check_map_info(struct mrsas_instance *instance) { MR_FW_RAID_MAP_ALL *ld_map; if (!mrsas_tbolt_get_ld_map_info(instance)) { ld_map = instance->ld_map[(instance->map_id & 1)]; ! con_log(CL_ANN1, (CE_NOTE, "ldCount=%d, map size=%d", ld_map->raidMap.ldCount, ld_map->raidMap.totalSize)); ! if (MR_ValidateMapInfo(instance->ld_map[ ! (instance->map_id & 1)], instance->load_balance_info)) { ! con_log(CL_ANN, ! (CE_CONT, "MR_ValidateMapInfo success")); instance->fast_path_io = 1; ! con_log(CL_ANN, ! (CE_NOTE, "instance->fast_path_io %d", ! instance->fast_path_io)); return (DDI_SUCCESS); } } instance->fast_path_io = 0; cmn_err(CE_WARN, "MR_ValidateMapInfo failed"); con_log(CL_ANN, (CE_NOTE, ! "instance->fast_path_io %d", instance->fast_path_io)); return (DDI_FAILURE); } + /* * Marks HBA as bad. This will be called either when an * IO packet times out even after 3 FW resets * or FW is found to be fault even after 3 continuous resets. */ ! void mrsas_tbolt_kill_adapter(struct mrsas_instance *instance) { ! cmn_err(CE_NOTE, "TBOLT Kill adapter called"); if (instance->deadadapter == 1) ! return; con_log(CL_ANN1, (CE_NOTE, "tbolt_kill_adapter: " "Writing to doorbell with MFI_STOP_ADP ")); mutex_enter(&instance->ocr_flags_mtx); instance->deadadapter = 1; mutex_exit(&instance->ocr_flags_mtx); instance->func_ptr->disable_intr(instance); WR_RESERVED0_REGISTER(MFI_STOP_ADP, instance); /* Flush */ ! (void) RD_RESERVED0_REGISTER(instance); (void) mrsas_print_pending_cmds(instance); ! (void) mrsas_complete_pending_cmds(instance); } ! ! void ! mrsas_reset_reply_desc(struct mrsas_instance *instance) { int i; MPI2_REPLY_DESCRIPTORS_UNION *reply_desc; ! instance->reply_read_index = 0; /* initializing reply address to 0xFFFFFFFF */ reply_desc = instance->reply_frame_pool; for (i = 0; i < instance->reply_q_depth; i++) {
*** 3256,3276 **** } int mrsas_tbolt_reset_ppc(struct mrsas_instance *instance) { ! uint32_t status=0x00; uint32_t retry = 0; - uint32_t seq_num; uint32_t cur_abs_reg_val; uint32_t fw_state; - union mrsas_evt_class_locale class_locale; uint32_t abs_state; uint32_t i; con_log(CL_ANN, (CE_NOTE, ! "mrsas_tbolt_reset_ppc entered\n ")); if (instance->deadadapter == 1) { cmn_err(CE_WARN, "mrsas_tbolt_reset_ppc: " "no more resets as HBA has been marked dead "); return (DDI_FAILURE); --- 3268,3286 ---- } int mrsas_tbolt_reset_ppc(struct mrsas_instance *instance) { ! uint32_t status = 0x00; uint32_t retry = 0; uint32_t cur_abs_reg_val; uint32_t fw_state; uint32_t abs_state; uint32_t i; con_log(CL_ANN, (CE_NOTE, ! "mrsas_tbolt_reset_ppc entered")); if (instance->deadadapter == 1) { cmn_err(CE_WARN, "mrsas_tbolt_reset_ppc: " "no more resets as HBA has been marked dead "); return (DDI_FAILURE);
*** 3282,3297 **** "adpterresetinprogress flag set, time %llx", gethrtime())); mutex_exit(&instance->ocr_flags_mtx); instance->func_ptr->disable_intr(instance); ! /*Add delay inorder to complete the ioctl & io cmds in-flight */ ! for (i = 0; i<3000; i++) { drv_usecwait(MILLISEC); /* wait for 1000 usecs */ } ! instance->reply_read_index= 0; retry_reset: con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc: " ":Resetting TBOLT ")); --- 3292,3307 ---- "adpterresetinprogress flag set, time %llx", gethrtime())); mutex_exit(&instance->ocr_flags_mtx); instance->func_ptr->disable_intr(instance); ! /* Add delay inorder to complete the ioctl & io cmds in-flight */ ! for (i = 0; i < 3000; i++) { drv_usecwait(MILLISEC); /* wait for 1000 usecs */ } ! instance->reply_read_index = 0; retry_reset: con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc: " ":Resetting TBOLT "));
*** 3301,3351 **** WR_TBOLT_IB_WRITE_SEQ(2, instance); WR_TBOLT_IB_WRITE_SEQ(7, instance); WR_TBOLT_IB_WRITE_SEQ(0xd, instance); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: magic number written " ! "to write sequence register\n")); delay(100 * drv_usectohz(MILLISEC)); status = RD_TBOLT_HOST_DIAG(instance); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: READ HOSTDIAG SUCCESS " ! "to write sequence register\n")); while (status & DIAG_TBOLT_RESET_ADAPTER) { delay(100 * drv_usectohz(MILLISEC)); status = RD_TBOLT_HOST_DIAG(instance); if (retry++ == 100) { cmn_err(CE_WARN, "mrsas_tbolt_reset_ppc:" "resetadapter bit is set already " ! "check retry count %d\n", retry); return (DDI_FAILURE); } } WR_TBOLT_HOST_DIAG(status | DIAG_TBOLT_RESET_ADAPTER, instance); delay(100 * drv_usectohz(MILLISEC)); ddi_rep_get8((instance)->regmap_handle, (uint8_t *)&status, (uint8_t *)((uintptr_t)(instance)->regmap + ! RESET_TBOLT_STATUS_OFF),4,DDI_DEV_AUTOINCR); while ((status & DIAG_TBOLT_RESET_ADAPTER)) { delay(100 * drv_usectohz(MILLISEC)); ddi_rep_get8((instance)->regmap_handle, (uint8_t *)&status, (uint8_t *)((uintptr_t)(instance)->regmap + ! RESET_TBOLT_STATUS_OFF),4,DDI_DEV_AUTOINCR); if (retry++ == 100) { /* Dont call kill adapter here */ /* RESET BIT ADAPTER is cleared by firmare */ ! //mrsas_tbolt_kill_adapter(instance); ! cmn_err(CE_WARN, "mr_sas %d: %s(): RESET FAILED; return failure!!!", instance->instance, __func__); return (DDI_FAILURE); } } ! con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc: Adapter reset complete")); con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "Calling mfi_state_transition_to_ready")); abs_state = instance->func_ptr->read_fw_status_reg(instance); retry = 0; --- 3311,3364 ---- WR_TBOLT_IB_WRITE_SEQ(2, instance); WR_TBOLT_IB_WRITE_SEQ(7, instance); WR_TBOLT_IB_WRITE_SEQ(0xd, instance); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: magic number written " ! "to write sequence register")); delay(100 * drv_usectohz(MILLISEC)); status = RD_TBOLT_HOST_DIAG(instance); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: READ HOSTDIAG SUCCESS " ! "to write sequence register")); while (status & DIAG_TBOLT_RESET_ADAPTER) { delay(100 * drv_usectohz(MILLISEC)); status = RD_TBOLT_HOST_DIAG(instance); if (retry++ == 100) { cmn_err(CE_WARN, "mrsas_tbolt_reset_ppc:" "resetadapter bit is set already " ! "check retry count %d", retry); return (DDI_FAILURE); } } WR_TBOLT_HOST_DIAG(status | DIAG_TBOLT_RESET_ADAPTER, instance); delay(100 * drv_usectohz(MILLISEC)); ddi_rep_get8((instance)->regmap_handle, (uint8_t *)&status, (uint8_t *)((uintptr_t)(instance)->regmap + ! RESET_TBOLT_STATUS_OFF), 4, DDI_DEV_AUTOINCR); while ((status & DIAG_TBOLT_RESET_ADAPTER)) { delay(100 * drv_usectohz(MILLISEC)); ddi_rep_get8((instance)->regmap_handle, (uint8_t *)&status, (uint8_t *)((uintptr_t)(instance)->regmap + ! RESET_TBOLT_STATUS_OFF), 4, DDI_DEV_AUTOINCR); if (retry++ == 100) { /* Dont call kill adapter here */ /* RESET BIT ADAPTER is cleared by firmare */ ! /* mrsas_tbolt_kill_adapter(instance); */ ! cmn_err(CE_WARN, ! "mr_sas %d: %s(): RESET FAILED; return failure!!!", ! instance->instance, __func__); return (DDI_FAILURE); } } ! con_log(CL_ANN, ! (CE_NOTE, "mrsas_tbolt_reset_ppc: Adapter reset complete")); con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "Calling mfi_state_transition_to_ready")); abs_state = instance->func_ptr->read_fw_status_reg(instance); retry = 0;
*** 3352,3363 **** while ((abs_state <= MFI_STATE_FW_INIT) && (retry++ < 1000)) { delay(100 * drv_usectohz(MILLISEC)); abs_state = instance->func_ptr->read_fw_status_reg(instance); } if (abs_state <= MFI_STATE_FW_INIT) { ! cmn_err(CE_WARN, "mrsas_tbolt_reset_ppc: firmware state < MFI_STATE_FW_INIT" ! "state = 0x%x, RETRY RESET.\n", abs_state); goto retry_reset; } /* Mark HBA as bad, if FW is fault after 3 continuous resets */ if (mfi_state_transition_to_ready(instance) || --- 3365,3377 ---- while ((abs_state <= MFI_STATE_FW_INIT) && (retry++ < 1000)) { delay(100 * drv_usectohz(MILLISEC)); abs_state = instance->func_ptr->read_fw_status_reg(instance); } if (abs_state <= MFI_STATE_FW_INIT) { ! cmn_err(CE_WARN, ! "mrsas_tbolt_reset_ppc: firmware state < MFI_STATE_FW_INIT" ! "state = 0x%x, RETRY RESET.", abs_state); goto retry_reset; } /* Mark HBA as bad, if FW is fault after 3 continuous resets */ if (mfi_state_transition_to_ready(instance) ||
*** 3370,3384 **** "mrsas_tbolt_reset_ppc :before fake: FW is not ready " "FW state = 0x%x", fw_state)); if (debug_tbolt_fw_faults_after_ocr_g == 1) fw_state = MFI_STATE_FAULT; ! con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc : FW is not ready " "FW state = 0x%x", fw_state)); if (fw_state == MFI_STATE_FAULT) { ! // increment the count instance->fw_fault_count_after_ocr++; if (instance->fw_fault_count_after_ocr < MAX_FW_RESET_COUNT) { cmn_err(CE_WARN, "mrsas_tbolt_reset_ppc: " "FW is in fault after OCR count %d " --- 3384,3399 ---- "mrsas_tbolt_reset_ppc :before fake: FW is not ready " "FW state = 0x%x", fw_state)); if (debug_tbolt_fw_faults_after_ocr_g == 1) fw_state = MFI_STATE_FAULT; ! con_log(CL_ANN, ! (CE_NOTE, "mrsas_tbolt_reset_ppc : FW is not ready " "FW state = 0x%x", fw_state)); if (fw_state == MFI_STATE_FAULT) { ! /* increment the count */ instance->fw_fault_count_after_ocr++; if (instance->fw_fault_count_after_ocr < MAX_FW_RESET_COUNT) { cmn_err(CE_WARN, "mrsas_tbolt_reset_ppc: " "FW is in fault after OCR count %d "
*** 3388,3453 **** } else { cmn_err(CE_WARN, "mrsas %d: %s:" "Max Reset Count exceeded >%d" "Mark HBA as bad, KILL adapter", ! instance->instance, __func__, MAX_FW_RESET_COUNT); mrsas_tbolt_kill_adapter(instance); return (DDI_FAILURE); } } } ! // reset the counter as FW is up after OCR instance->fw_fault_count_after_ocr = 0; mrsas_reset_reply_desc(instance); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "Calling mrsas_issue_init_mpi2")); abs_state = mrsas_issue_init_mpi2(instance); ! if(abs_state == DDI_FAILURE) { cmn_err(CE_WARN, "mrsas_tbolt_reset_ppc: " "INIT failed Retrying Reset"); goto retry_reset; } con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "mrsas_issue_init_mpi2 Done")); con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc: " ! "Calling mrsas_print_pending_cmd\n")); ! mrsas_print_pending_cmds(instance); con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc: " ! "mrsas_print_pending_cmd done\n")); instance->func_ptr->enable_intr(instance); instance->fw_outstanding = 0; con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "Calling mrsas_issue_pending_cmds")); ! mrsas_issue_pending_cmds(instance); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " ! "issue_pending_cmds done.\n")); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "Calling aen registration")); instance->aen_cmd->retry_count_for_ocr = 0; instance->aen_cmd->drv_pkt_time = 0; instance->func_ptr->issue_cmd(instance->aen_cmd, instance); ! con_log(CL_ANN1, (CE_NOTE, "Unsetting adpresetinprogress flag.\n")); mutex_enter(&instance->ocr_flags_mtx); instance->adapterresetinprogress = 0; mutex_exit(&instance->ocr_flags_mtx); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "adpterresetinprogress flag unset")); ! con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc done\n")); return (DDI_SUCCESS); } --- 3403,3469 ---- } else { cmn_err(CE_WARN, "mrsas %d: %s:" "Max Reset Count exceeded >%d" "Mark HBA as bad, KILL adapter", ! instance->instance, __func__, ! MAX_FW_RESET_COUNT); mrsas_tbolt_kill_adapter(instance); return (DDI_FAILURE); } } } ! /* reset the counter as FW is up after OCR */ instance->fw_fault_count_after_ocr = 0; mrsas_reset_reply_desc(instance); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "Calling mrsas_issue_init_mpi2")); abs_state = mrsas_issue_init_mpi2(instance); ! if (abs_state == (uint32_t)DDI_FAILURE) { cmn_err(CE_WARN, "mrsas_tbolt_reset_ppc: " "INIT failed Retrying Reset"); goto retry_reset; } con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "mrsas_issue_init_mpi2 Done")); con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc: " ! "Calling mrsas_print_pending_cmd")); ! (void) mrsas_print_pending_cmds(instance); con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc: " ! "mrsas_print_pending_cmd done")); instance->func_ptr->enable_intr(instance); instance->fw_outstanding = 0; con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "Calling mrsas_issue_pending_cmds")); ! (void) mrsas_issue_pending_cmds(instance); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " ! "issue_pending_cmds done.")); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "Calling aen registration")); instance->aen_cmd->retry_count_for_ocr = 0; instance->aen_cmd->drv_pkt_time = 0; instance->func_ptr->issue_cmd(instance->aen_cmd, instance); ! con_log(CL_ANN1, (CE_NOTE, "Unsetting adpresetinprogress flag.")); mutex_enter(&instance->ocr_flags_mtx); instance->adapterresetinprogress = 0; mutex_exit(&instance->ocr_flags_mtx); con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_reset_ppc: " "adpterresetinprogress flag unset")); ! con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc done")); return (DDI_SUCCESS); }
*** 3458,3468 **** * Issues an internal command (DCMD) to get the FW's controller PD * list structure. This information is mainly used to find out SYSTEM * supported by the FW. */ ! int mrsas_tbolt_sync_map_info(struct mrsas_instance *instance) { int ret = 0, i; struct mrsas_cmd *cmd = NULL; struct mrsas_dcmd_frame *dcmd; --- 3474,3484 ---- * Issues an internal command (DCMD) to get the FW's controller PD * list structure. This information is mainly used to find out SYSTEM * supported by the FW. */ ! static int mrsas_tbolt_sync_map_info(struct mrsas_instance *instance) { int ret = 0, i; struct mrsas_cmd *cmd = NULL; struct mrsas_dcmd_frame *dcmd;
*** 3475,3491 **** uint32_t size_map_info; cmd = get_raid_msg_pkt(instance); if (cmd == NULL) { ! cmn_err(CE_WARN, ! "Failed to get a cmd from free-pool in mrsas_tbolt_sync_map_info(). "); return (DDI_FAILURE); } /* Clear the frame buffer and assign back the context id */ ! (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame)); ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context, cmd->index); bzero(cmd->scsi_io_request, sizeof (Mpi2RaidSCSIIORequest_t)); --- 3491,3507 ---- uint32_t size_map_info; cmd = get_raid_msg_pkt(instance); if (cmd == NULL) { ! cmn_err(CE_WARN, "Failed to get a cmd from free-pool in " ! "mrsas_tbolt_sync_map_info(). "); return (DDI_FAILURE); } /* Clear the frame buffer and assign back the context id */ ! bzero((char *)&cmd->frame[0], sizeof (union mrsas_frame)); ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context, cmd->index); bzero(cmd->scsi_io_request, sizeof (Mpi2RaidSCSIIORequest_t));
*** 3495,3543 **** dcmd = &cmd->frame->dcmd; size_sync_info = sizeof (LD_TARGET_SYNC) * num_lds; ! con_log(CL_ANN, (CE_NOTE, ! "size_sync_info =0x%x ; ld count = 0x%x \n ", size_sync_info, num_lds)); ci = (LD_TARGET_SYNC *)instance->ld_map[(instance->map_id - 1) & 1]; ! memset(ci, 0, sizeof(MR_FW_RAID_MAP_ALL)); ci_h = instance->ld_map_phy[(instance->map_id - 1) & 1]; ! (void) memset(dcmd->mbox.b, 0, DCMD_MBOX_SZ); ld_sync = (LD_TARGET_SYNC *)ci; for (i = 0; i < num_lds; i++, ld_sync++) { raid = MR_LdRaidGet(i, map); ! con_log(CL_ANN1, (CE_NOTE, "i : 0x%x, Seq Num : 0x%x, Sync Reqd : 0x%x\n", i, raid->seqNum, raid->flags.ldSyncRequired)); ld_sync->ldTargetId = MR_GetLDTgtId(i, map); ! con_log(CL_ANN1, (CE_NOTE, "i : 0x%x, tgt : 0x%x \n", i, ld_sync->ldTargetId)); ld_sync->seqNum = raid->seqNum; } ! size_map_info = sizeof(MR_FW_RAID_MAP) + ! (sizeof(MR_LD_SPAN_MAP) * (MAX_LOGICAL_DRIVES - 1)); dcmd->cmd = MFI_CMD_OP_DCMD; dcmd->cmd_status = 0xFF; dcmd->sge_count = 1; dcmd->flags = MFI_FRAME_DIR_WRITE; dcmd->timeout = 0; dcmd->pad_0 = 0; dcmd->data_xfer_len = size_map_info; ! dcmd->mbox.b[0] = num_lds; dcmd->mbox.b[1] = 1; /* Pend */ dcmd->opcode = MR_DCMD_LD_MAP_GET_INFO; dcmd->sgl.sge32[0].phys_addr = ci_h; dcmd->sgl.sge32[0].length = size_map_info; --- 3511,3560 ---- dcmd = &cmd->frame->dcmd; size_sync_info = sizeof (LD_TARGET_SYNC) * num_lds; ! con_log(CL_ANN, (CE_NOTE, "size_sync_info =0x%x ; ld count = 0x%x", size_sync_info, num_lds)); ci = (LD_TARGET_SYNC *)instance->ld_map[(instance->map_id - 1) & 1]; ! bzero(ci, sizeof (MR_FW_RAID_MAP_ALL)); ci_h = instance->ld_map_phy[(instance->map_id - 1) & 1]; ! bzero(dcmd->mbox.b, DCMD_MBOX_SZ); ld_sync = (LD_TARGET_SYNC *)ci; for (i = 0; i < num_lds; i++, ld_sync++) { raid = MR_LdRaidGet(i, map); ! con_log(CL_ANN1, ! (CE_NOTE, "i : 0x%x, Seq Num : 0x%x, Sync Reqd : 0x%x", i, raid->seqNum, raid->flags.ldSyncRequired)); ld_sync->ldTargetId = MR_GetLDTgtId(i, map); ! con_log(CL_ANN1, (CE_NOTE, "i : 0x%x, tgt : 0x%x", i, ld_sync->ldTargetId)); ld_sync->seqNum = raid->seqNum; } ! size_map_info = sizeof (MR_FW_RAID_MAP) + ! (sizeof (MR_LD_SPAN_MAP) * (MAX_LOGICAL_DRIVES - 1)); dcmd->cmd = MFI_CMD_OP_DCMD; dcmd->cmd_status = 0xFF; dcmd->sge_count = 1; dcmd->flags = MFI_FRAME_DIR_WRITE; dcmd->timeout = 0; dcmd->pad_0 = 0; dcmd->data_xfer_len = size_map_info; ! ASSERT(num_lds <= 255); ! dcmd->mbox.b[0] = (U8)num_lds; dcmd->mbox.b[1] = 1; /* Pend */ dcmd->opcode = MR_DCMD_LD_MAP_GET_INFO; dcmd->sgl.sge32[0].phys_addr = ci_h; dcmd->sgl.sge32[0].length = size_map_info;
*** 3546,3556 **** mr_sas_tbolt_build_mfi_cmd(instance, cmd); instance->func_ptr->issue_cmd(cmd, instance); instance->unroll.syncCmd = 1; ! con_log(CL_ANN1, (CE_NOTE, "sync cmd issued. [SMID]:%x",cmd->SMID)); return (ret); } /* --- 3563,3573 ---- mr_sas_tbolt_build_mfi_cmd(instance, cmd); instance->func_ptr->issue_cmd(cmd, instance); instance->unroll.syncCmd = 1; ! con_log(CL_ANN1, (CE_NOTE, "sync cmd issued. [SMID]:%x", cmd->SMID)); return (ret); } /*
*** 3573,3583 **** cmn_err(CE_WARN, "Failed to get a cmd from free-pool abort_syncmap_cmd()."); return (DDI_FAILURE); } /* Clear the frame buffer and assign back the context id */ ! (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame)); ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context, cmd->index); abort_fr = &cmd->frame->abort; --- 3590,3600 ---- cmn_err(CE_WARN, "Failed to get a cmd from free-pool abort_syncmap_cmd()."); return (DDI_FAILURE); } /* Clear the frame buffer and assign back the context id */ ! bzero((char *)&cmd->frame[0], sizeof (union mrsas_frame)); ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context, cmd->index); abort_fr = &cmd->frame->abort;
*** 3621,3633 **** { struct scsi_device *sd; dev_info_t *child; int rval, dtype; struct mrsas_tbolt_pd_info *pds = NULL; - uint64_t *wwn; - con_log(CL_ANN1, (CE_NOTE, "mrsas_tbolt_config_pd: t = %d l = %d", tgt, lun)); if ((child = mrsas_find_child(instance, tgt, lun)) != NULL) { if (ldip) { --- 3638,3648 ----
*** 3636,3646 **** if (instance->mr_tbolt_pd_list[tgt].flag != MRDRV_TGT_VALID) { rval = mrsas_service_evt(instance, tgt, 1, MRSAS_EVT_UNCONFIG_TGT, NULL); con_log(CL_ANN1, (CE_WARN, "mr_sas:DELETING STALE ENTRY rval = %d " ! "tgt id = %d ", rval, tgt)); return (NDI_FAILURE); } return (NDI_SUCCESS); } --- 3651,3661 ---- if (instance->mr_tbolt_pd_list[tgt].flag != MRDRV_TGT_VALID) { rval = mrsas_service_evt(instance, tgt, 1, MRSAS_EVT_UNCONFIG_TGT, NULL); con_log(CL_ANN1, (CE_WARN, "mr_sas:DELETING STALE ENTRY rval = %d " ! "tgt id = %d", rval, tgt)); return (NDI_FAILURE); } return (NDI_SUCCESS); }
*** 3647,3660 **** pds = (struct mrsas_tbolt_pd_info *) kmem_zalloc(sizeof (struct mrsas_tbolt_pd_info), KM_SLEEP); mrsas_tbolt_get_pd_info(instance, pds, tgt); dtype = pds->scsiDevType; ! /* Check for Disk*/ if ((dtype == DTYPE_DIRECT)) { if ((dtype == DTYPE_DIRECT) && (LE_16(pds->fwState) != PD_SYSTEM)) { return (NDI_FAILURE); } sd = kmem_zalloc(sizeof (struct scsi_device), KM_SLEEP); sd->sd_address.a_hba_tran = instance->tran; sd->sd_address.a_target = (uint16_t)tgt; --- 3662,3676 ---- pds = (struct mrsas_tbolt_pd_info *) kmem_zalloc(sizeof (struct mrsas_tbolt_pd_info), KM_SLEEP); mrsas_tbolt_get_pd_info(instance, pds, tgt); dtype = pds->scsiDevType; ! /* Check for Disk */ if ((dtype == DTYPE_DIRECT)) { if ((dtype == DTYPE_DIRECT) && (LE_16(pds->fwState) != PD_SYSTEM)) { + kmem_free(pds, sizeof (struct mrsas_tbolt_pd_info)); return (NDI_FAILURE); } sd = kmem_zalloc(sizeof (struct scsi_device), KM_SLEEP); sd->sd_address.a_hba_tran = instance->tran; sd->sd_address.a_target = (uint16_t)tgt;
*** 3665,3676 **** con_log(CL_DLEVEL1, (CE_NOTE, "Phys. device found: tgt %d dtype %d: %s", tgt, dtype, sd->sd_inq->inq_vid)); } else { rval = NDI_FAILURE; ! con_log(CL_DLEVEL1, (CE_NOTE, ! "Phys. device Not found scsi_hba_probe Failed: tgt %d dtype %d: %s", tgt, dtype, sd->sd_inq->inq_vid)); } /* sd_unprobe is blank now. Free buffer manually */ if (sd->sd_inq) { --- 3681,3692 ---- con_log(CL_DLEVEL1, (CE_NOTE, "Phys. device found: tgt %d dtype %d: %s", tgt, dtype, sd->sd_inq->inq_vid)); } else { rval = NDI_FAILURE; ! con_log(CL_DLEVEL1, (CE_NOTE, "Phys. device Not found " ! "scsi_hba_probe Failed: tgt %d dtype %d: %s", tgt, dtype, sd->sd_inq->inq_vid)); } /* sd_unprobe is blank now. Free buffer manually */ if (sd->sd_inq) {
*** 3689,3715 **** kmem_free(pds, sizeof (struct mrsas_tbolt_pd_info)); con_log(CL_ANN1, (CE_NOTE, "mrsas_config_pd: return rval = %d", rval)); return (rval); } static void ! mrsas_tbolt_get_pd_info(struct mrsas_instance *instance, struct mrsas_tbolt_pd_info *pds, ! int tgt) { struct mrsas_cmd *cmd; struct mrsas_dcmd_frame *dcmd; dma_obj_t dcmd_dma_obj; cmd = get_raid_msg_pkt(instance); if (!cmd) { ! con_log(CL_ANN1, (CE_WARN, "Failed to get a cmd for get pd info")); return; } /* Clear the frame buffer and assign back the context id */ ! memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame)); ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context, cmd->index); dcmd = &cmd->frame->dcmd; --- 3705,3733 ---- kmem_free(pds, sizeof (struct mrsas_tbolt_pd_info)); con_log(CL_ANN1, (CE_NOTE, "mrsas_config_pd: return rval = %d", rval)); return (rval); } + static void ! mrsas_tbolt_get_pd_info(struct mrsas_instance *instance, ! struct mrsas_tbolt_pd_info *pds, int tgt) { struct mrsas_cmd *cmd; struct mrsas_dcmd_frame *dcmd; dma_obj_t dcmd_dma_obj; cmd = get_raid_msg_pkt(instance); if (!cmd) { ! con_log(CL_ANN1, ! (CE_WARN, "Failed to get a cmd for get pd info")); return; } /* Clear the frame buffer and assign back the context id */ ! bzero((char *)&cmd->frame[0], sizeof (union mrsas_frame)); ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context, cmd->index); dcmd = &cmd->frame->dcmd;
*** 3720,3735 **** dcmd_dma_obj.dma_attr.dma_attr_sgllen = 1; dcmd_dma_obj.dma_attr.dma_attr_align = 1; (void) mrsas_alloc_dma_obj(instance, &dcmd_dma_obj, DDI_STRUCTURE_LE_ACC); ! (void) memset(dcmd_dma_obj.buffer, 0, sizeof (struct mrsas_tbolt_pd_info)); ! (void) memset(dcmd->mbox.b, 0, 12); ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd, MFI_CMD_OP_DCMD); ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd_status, 0); ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->sge_count, 1); ! ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->flags, MFI_FRAME_DIR_READ); ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->timeout, 0); ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->data_xfer_len, sizeof (struct mrsas_tbolt_pd_info)); ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->opcode, MR_DCMD_PD_GET_INFO); --- 3738,3754 ---- dcmd_dma_obj.dma_attr.dma_attr_sgllen = 1; dcmd_dma_obj.dma_attr.dma_attr_align = 1; (void) mrsas_alloc_dma_obj(instance, &dcmd_dma_obj, DDI_STRUCTURE_LE_ACC); ! bzero(dcmd_dma_obj.buffer, sizeof (struct mrsas_tbolt_pd_info)); ! bzero(dcmd->mbox.b, 12); ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd, MFI_CMD_OP_DCMD); ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd_status, 0); ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->sge_count, 1); ! ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->flags, ! MFI_FRAME_DIR_READ); ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->timeout, 0); ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->data_xfer_len, sizeof (struct mrsas_tbolt_pd_info)); ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->opcode, MR_DCMD_PD_GET_INFO);