diff options
| author | Andy Fiddaman <omnios@citrus-it.net> | 2017-04-21 10:29:55 +0000 |
|---|---|---|
| committer | Richard Lowe <richlowe@richlowe.net> | 2017-06-02 22:18:15 +0100 |
| commit | eef6dbdfddc0c59fd812f04dd0521e8356b617e5 (patch) | |
| tree | bd419bfb6cce51b550d5975f3df51adba7820aff /usr | |
| parent | 0890d2f3364ef2bc17e6f3c41933166ac751b172 (diff) | |
| download | illumos-joyent-eef6dbdfddc0c59fd812f04dd0521e8356b617e5.tar.gz | |
8055 mr_sas online-controller-reset (OCR) does not work with some gen3 adapters.
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jason King <jason.brian.king@gmail.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr')
| -rw-r--r-- | usr/src/uts/common/io/mr_sas/mr_sas.h | 4 | ||||
| -rw-r--r-- | usr/src/uts/common/io/mr_sas/mr_sas_tbolt.c | 85 |
2 files changed, 29 insertions, 60 deletions
diff --git a/usr/src/uts/common/io/mr_sas/mr_sas.h b/usr/src/uts/common/io/mr_sas/mr_sas.h index fe4c3659af..30d2aedb3a 100644 --- a/usr/src/uts/common/io/mr_sas/mr_sas.h +++ b/usr/src/uts/common/io/mr_sas/mr_sas.h @@ -62,8 +62,8 @@ extern "C" { /* * MegaRAID SAS2.0 Driver meta data */ -#define MRSAS_VERSION "6.503.00.00ILLUMOS-20170421" -#define MRSAS_RELDATE "April 21, 2017" +#define MRSAS_VERSION "6.503.00.00ILLUMOS-20170524" +#define MRSAS_RELDATE "May 24, 2017" #define MRSAS_TRUE 1 #define MRSAS_FALSE 0 diff --git a/usr/src/uts/common/io/mr_sas/mr_sas_tbolt.c b/usr/src/uts/common/io/mr_sas/mr_sas_tbolt.c index 9ff12ffb07..f29d04a913 100644 --- a/usr/src/uts/common/io/mr_sas/mr_sas_tbolt.c +++ b/usr/src/uts/common/io/mr_sas/mr_sas_tbolt.c @@ -75,7 +75,7 @@ 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; +static int mrsas_debug_tbolt_fw_faults_after_ocr = 0; /* * destroy_mfi_mpi_frame_pool @@ -3204,73 +3204,64 @@ mrsas_tbolt_reset_ppc(struct mrsas_instance *instance) uint32_t abs_state; uint32_t i; - con_log(CL_ANN, (CE_NOTE, - "mrsas_tbolt_reset_ppc entered")); - if (instance->deadadapter == 1) { dev_err(instance->dip, CE_WARN, "mrsas_tbolt_reset_ppc: " - "no more resets as HBA has been marked dead "); + "no more resets as HBA has been marked dead"); return (DDI_FAILURE); } mutex_enter(&instance->ocr_flags_mtx); instance->adapterresetinprogress = 1; - con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc:" - "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++) { + /* Add delay in order 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 ")); + con_log(CL_ANN, (CE_NOTE, "mrsas_tbolt_reset_ppc: Resetting TBOLT")); + /* Flush */ + WR_TBOLT_IB_WRITE_SEQ(0x0, instance); + /* Write magic number */ WR_TBOLT_IB_WRITE_SEQ(0xF, instance); - WR_TBOLT_IB_WRITE_SEQ(4, instance); + WR_TBOLT_IB_WRITE_SEQ(0x4, instance); WR_TBOLT_IB_WRITE_SEQ(0xb, instance); - WR_TBOLT_IB_WRITE_SEQ(2, instance); - WR_TBOLT_IB_WRITE_SEQ(7, instance); + WR_TBOLT_IB_WRITE_SEQ(0x2, instance); + WR_TBOLT_IB_WRITE_SEQ(0x7, 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) { + /* Wait for the diag write enable (DRWE) bit to be set */ + retry = 0; + status = RD_TBOLT_HOST_DIAG(instance); + while (!(status & DIAG_WRITE_ENABLE)) { delay(100 * drv_usectohz(MILLISEC)); status = RD_TBOLT_HOST_DIAG(instance); - if (retry++ == 100) { + if (retry++ >= 100) { dev_err(instance->dip, CE_WARN, - "mrsas_tbolt_reset_ppc:" - "resetadapter bit is set already " - "check retry count %d", retry); + "%s(): timeout waiting for DRWE.", __func__); return (DDI_FAILURE); } } + /* Send reset command */ 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); - + /* Wait for reset bit to clear */ + retry = 0; + status = RD_TBOLT_HOST_DIAG(instance); 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); + status = RD_TBOLT_HOST_DIAG(instance); if (retry++ == 100) { /* Dont call kill adapter here */ /* RESET BIT ADAPTER is cleared by firmare */ @@ -3283,8 +3274,6 @@ retry_reset: 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; @@ -3301,7 +3290,7 @@ retry_reset: /* Mark HBA as bad, if FW is fault after 3 continuous resets */ if (mfi_state_transition_to_ready(instance) || - debug_tbolt_fw_faults_after_ocr_g == 1) { + mrsas_debug_tbolt_fw_faults_after_ocr == 1) { cur_abs_reg_val = instance->func_ptr->read_fw_status_reg(instance); fw_state = cur_abs_reg_val & MFI_STATE_MASK; @@ -3309,7 +3298,7 @@ retry_reset: con_log(CL_ANN1, (CE_NOTE, "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) + if (mrsas_debug_tbolt_fw_faults_after_ocr == 1) fw_state = MFI_STATE_FAULT; con_log(CL_ANN, @@ -3345,54 +3334,34 @@ retry_reset: 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) { dev_err(instance->dip, 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); + dev_err(instance->dip, CE_NOTE, "TBOLT adapter reset successfully"); + return (DDI_SUCCESS); } - /* * mrsas_sync_map_info - Returns FW's ld_map structure * @instance: Adapter soft state |
