summaryrefslogtreecommitdiff
path: root/usr
diff options
context:
space:
mode:
authorAndy Fiddaman <omnios@citrus-it.net>2017-04-21 10:29:55 +0000
committerRichard Lowe <richlowe@richlowe.net>2017-06-02 22:18:15 +0100
commiteef6dbdfddc0c59fd812f04dd0521e8356b617e5 (patch)
treebd419bfb6cce51b550d5975f3df51adba7820aff /usr
parent0890d2f3364ef2bc17e6f3c41933166ac751b172 (diff)
downloadillumos-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.h4
-rw-r--r--usr/src/uts/common/io/mr_sas/mr_sas_tbolt.c85
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