Print this page
5775 mr_sas initialisation pauses unecessarily for 60 seconds.
@@ -893,11 +893,12 @@
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;
+ MRSAS_REQUEST_DESCRIPTOR_UNION req_desc;
+ uint32_t timeout;
con_log(CL_ANN, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
#ifdef DEBUG
@@ -1043,25 +1044,36 @@
(int)sizeof (struct mrsas_init_frame2)));
/* disable interrupts before sending INIT2 frame */
instance->func_ptr->disable_intr(instance);
- req_desc = (MRSAS_REQUEST_DESCRIPTOR_UNION *)
- instance->request_message_pool;
- req_desc->Words = cmd->scsi_io_request_phys_addr;
- req_desc->MFAIo.RequestFlags =
+ req_desc.Words = cmd->scsi_io_request_phys_addr;
+ req_desc.MFAIo.RequestFlags =
(MPI2_REQ_DESCRIPT_FLAGS_MFA << MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
- cmd->request_desc = req_desc;
+ cmd->request_desc = &req_desc;
/* issue the init frame */
- instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd);
+ 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);
+
con_log(CL_ANN1, (CE_CONT, "[cmd = %d] ", frame_hdr->cmd));
con_log(CL_ANN1, (CE_CONT, "[cmd Status= %x] ",
frame_hdr->cmd_status));
+ timeout = drv_usectohz(MFI_POLL_TIMEOUT_SECS * MICROSEC);
+ do {
+ if (ddi_get8(cmd->frame_dma_obj.acc_handle,
+ &mfiFrameInit2->cmd_status) != MFI_CMD_STATUS_POLL_MODE)
+ break;
+ delay(1);
+ timeout--;
+ } while (timeout > 0);
+
if (ddi_get8(instance->mpi2_frame_pool_dma_obj.acc_handle,
&mfiFrameInit2->cmd_status) == 0) {
con_log(CL_ANN, (CE_NOTE, "INIT2 Success"));
} else {
con_log(CL_ANN, (CE_WARN, "INIT2 Fail"));
@@ -2041,10 +2053,12 @@
== MFI_CMD_STATUS_POLL_MODE); i++) {
/* wait for cmd_status to change from 0xFF */
drv_usecwait(MILLISEC); /* wait for 1000 usecs */
}
+ DTRACE_PROBE1(tbolt_complete_poll_cmd, uint8_t, i);
+
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);