diff mbox series

[2/2] scsi: megaraid_sas: Add megasas_dcmd_timeout helper

Message ID 20240530094514.2750723-2-mengfanhui@kylinos.cn (mailing list archive)
State New
Headers show
Series [1/2] scsi: megaraid_sas: Fix DCMD issue command handling | expand

Commit Message

mengfanhui May 30, 2024, 9:45 a.m. UTC
DCMD timeout is handled in many places, it makes sense to
add a hepler to handle it. This patch adds a new helper
named megasas_dcmd_timeout() to reduce duplicate code.

Co-developed-by: Jackie Liu <liuyun01@kylinos.cn>
Signed-off-by: Jackie Liu <liuyun01@kylinos.cn>
Signed-off-by: mengfanhui <mengfanhui@kylinos.cn>
Suggested-by: Geliang Tang <geliang@kernel.org>
---
 drivers/scsi/megaraid/megaraid_sas.h        |   2 +
 drivers/scsi/megaraid/megaraid_sas_base.c   | 199 ++++----------------
 drivers/scsi/megaraid/megaraid_sas_fusion.c |  34 +---
 3 files changed, 38 insertions(+), 197 deletions(-)

Comments

mengfanhui June 13, 2024, 6:19 a.m. UTC | #1
Can someone help review it? Thank you!

在 2024/5/30 17:45, mengfanhui 写道:
> DCMD timeout is handled in many places, it makes sense to
> add a hepler to handle it. This patch adds a new helper
> named megasas_dcmd_timeout() to reduce duplicate code.
> 
> Co-developed-by: Jackie Liu <liuyun01@kylinos.cn>
> Signed-off-by: Jackie Liu <liuyun01@kylinos.cn>
> Signed-off-by: mengfanhui <mengfanhui@kylinos.cn>
> Suggested-by: Geliang Tang <geliang@kernel.org>
> ---
>  drivers/scsi/megaraid/megaraid_sas.h        |   2 +
>  drivers/scsi/megaraid/megaraid_sas_base.c   | 199 ++++----------------
>  drivers/scsi/megaraid/megaraid_sas_fusion.c |  34 +---
>  3 files changed, 38 insertions(+), 197 deletions(-)
> 
> diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h
> index 91570c5e8456..d96dc446c3aa 100644
> --- a/drivers/scsi/megaraid/megaraid_sas.h
> +++ b/drivers/scsi/megaraid/megaraid_sas.h
> @@ -2761,5 +2761,7 @@ void megasas_setup_debugfs(struct megasas_instance *instance);
>  void megasas_destroy_debugfs(struct megasas_instance *instance);
>  int megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num);
>  int dcmd_timeout_ocr_possible(struct megasas_instance *instance);
> +void megasas_dcmd_timeout(struct megasas_instance *instance,
> +			struct megasas_cmd *cmd);
>  
>  #endif				/*LSI_MEGARAID_SAS_H */
> diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
> index ba8061ea2078..9325a011746d 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_base.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
> @@ -4531,6 +4531,30 @@ int dcmd_timeout_ocr_possible(struct megasas_instance *instance)
>  		return INITIATE_OCR;
>  }
>  
> +/*
> + * megasas_dcmd_timeout -	Classification processing dcmd timeout.
> + * @instance:				Adapter soft state
> + */
> +void megasas_dcmd_timeout(struct megasas_instance *instance, struct megasas_cmd *cmd)
> +{
> +	switch (dcmd_timeout_ocr_possible(instance)) {
> +	case INITIATE_OCR:
> +		cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> +		mutex_unlock(&instance->reset_mutex);
> +		megasas_reset_fusion(instance->host,
> +					MFI_IO_TIMEOUT_OCR);
> +		mutex_lock(&instance->reset_mutex);
> +		break;
> +	case KILL_ADAPTER:
> +		megaraid_sas_kill_hba(instance);
> +		break;
> +	case IGNORE_TIMEOUT:
> +		dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
> +			__func__, __LINE__);
> +		break;
> +	}
> +}
> +
>  static void
>  megasas_get_pd_info(struct megasas_instance *instance, struct scsi_device *sdev)
>  {
> @@ -4582,24 +4606,7 @@ megasas_get_pd_info(struct megasas_instance *instance, struct scsi_device *sdev)
>  		break;
>  
>  	case DCMD_TIMEOUT:
> -
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			mutex_unlock(&instance->reset_mutex);
> -			megasas_reset_fusion(instance->host,
> -				MFI_IO_TIMEOUT_OCR);
> -			mutex_lock(&instance->reset_mutex);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
> -				__func__, __LINE__);
> -			break;
> -		}
> -
> +		megasas_dcmd_timeout(instance, cmd);
>  		break;
>  	}
>  
> @@ -4678,29 +4685,7 @@ megasas_get_pd_list(struct megasas_instance *instance)
>  			instance->pd_list_not_supported = 1;
>  		break;
>  	case DCMD_TIMEOUT:
> -
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			/*
> -			 * DCMD failed from AEN path.
> -			 * AEN path already hold reset_mutex to avoid PCI access
> -			 * while OCR is in progress.
> -			 */
> -			mutex_unlock(&instance->reset_mutex);
> -			megasas_reset_fusion(instance->host,
> -						MFI_IO_TIMEOUT_OCR);
> -			mutex_lock(&instance->reset_mutex);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d \n",
> -				__func__, __LINE__);
> -			break;
> -		}
> -
> +		megasas_dcmd_timeout(instance, cmd);
>  		break;
>  
>  	case DCMD_SUCCESS:
> @@ -4805,29 +4790,7 @@ megasas_get_ld_list(struct megasas_instance *instance)
>  		megaraid_sas_kill_hba(instance);
>  		break;
>  	case DCMD_TIMEOUT:
> -
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			/*
> -			 * DCMD failed from AEN path.
> -			 * AEN path already hold reset_mutex to avoid PCI access
> -			 * while OCR is in progress.
> -			 */
> -			mutex_unlock(&instance->reset_mutex);
> -			megasas_reset_fusion(instance->host,
> -						MFI_IO_TIMEOUT_OCR);
> -			mutex_lock(&instance->reset_mutex);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
> -				__func__, __LINE__);
> -			break;
> -		}
> -
> +		megasas_dcmd_timeout(instance, cmd);
>  		break;
>  
>  	case DCMD_SUCCESS:
> @@ -4925,28 +4888,7 @@ megasas_ld_list_query(struct megasas_instance *instance, u8 query_type)
>  		ret = megasas_get_ld_list(instance);
>  		break;
>  	case DCMD_TIMEOUT:
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			/*
> -			 * DCMD failed from AEN path.
> -			 * AEN path already hold reset_mutex to avoid PCI access
> -			 * while OCR is in progress.
> -			 */
> -			mutex_unlock(&instance->reset_mutex);
> -			megasas_reset_fusion(instance->host,
> -						MFI_IO_TIMEOUT_OCR);
> -			mutex_lock(&instance->reset_mutex);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
> -				__func__, __LINE__);
> -			break;
> -		}
> -
> +		megasas_dcmd_timeout(instance, cmd);
>  		break;
>  	case DCMD_SUCCESS:
>  		tgtid_count = le32_to_cpu(ci->count);
> @@ -5081,22 +5023,7 @@ megasas_host_device_list_query(struct megasas_instance *instance,
>  		break;
>  
>  	case DCMD_TIMEOUT:
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			mutex_unlock(&instance->reset_mutex);
> -			megasas_reset_fusion(instance->host,
> -				MFI_IO_TIMEOUT_OCR);
> -			mutex_lock(&instance->reset_mutex);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
> -				 __func__, __LINE__);
> -			break;
> -		}
> +		megasas_dcmd_timeout(instance, cmd);
>  		break;
>  	case DCMD_FAILED:
>  		dev_err(&instance->pdev->dev,
> @@ -5232,22 +5159,7 @@ void megasas_get_snapdump_properties(struct megasas_instance *instance)
>  		break;
>  
>  	case DCMD_TIMEOUT:
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			mutex_unlock(&instance->reset_mutex);
> -			megasas_reset_fusion(instance->host,
> -				MFI_IO_TIMEOUT_OCR);
> -			mutex_lock(&instance->reset_mutex);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
> -				__func__, __LINE__);
> -			break;
> -		}
> +		megasas_dcmd_timeout(instance, cmd);
>  	}
>  
>  	if (ret != DCMD_TIMEOUT)
> @@ -5372,22 +5284,7 @@ megasas_get_ctrl_info(struct megasas_instance *instance)
>  		break;
>  
>  	case DCMD_TIMEOUT:
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			mutex_unlock(&instance->reset_mutex);
> -			megasas_reset_fusion(instance->host,
> -				MFI_IO_TIMEOUT_OCR);
> -			mutex_lock(&instance->reset_mutex);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
> -				__func__, __LINE__);
> -			break;
> -		}
> +		megasas_dcmd_timeout(instance, cmd);
>  		break;
>  	case DCMD_FAILED:
>  		megaraid_sas_kill_hba(instance);
> @@ -5454,20 +5351,8 @@ int megasas_set_crash_dump_params(struct megasas_instance *instance,
>  		ret = megasas_issue_polled(instance, cmd);
>  
>  	if (ret == DCMD_TIMEOUT) {
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			megasas_reset_fusion(instance->host,
> -					MFI_IO_TIMEOUT_OCR);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
> -				__func__, __LINE__);
> -			break;
> -		}
> +		megasas_dcmd_timeout(instance, cmd);
> +
>  	} else
>  		megasas_return_cmd(instance, cmd);
>  
> @@ -6840,23 +6725,7 @@ megasas_get_target_prop(struct megasas_instance *instance,
>  
>  	switch (ret) {
>  	case DCMD_TIMEOUT:
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			mutex_unlock(&instance->reset_mutex);
> -			megasas_reset_fusion(instance->host,
> -					     MFI_IO_TIMEOUT_OCR);
> -			mutex_lock(&instance->reset_mutex);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev,
> -				 "Ignore DCMD timeout: %s %d\n",
> -				 __func__, __LINE__);
> -			break;
> -		}
> +		megasas_dcmd_timeout(instance, cmd);
>  		break;
>  
>  	default:
> diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c
> index f0aeb1ee83a2..1d0991650062 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
> @@ -1371,22 +1371,7 @@ megasas_sync_pd_seq_num(struct megasas_instance *instance, bool pend) {
>  		instance->pd_seq_map_id++;
>  		break;
>  	case DCMD_TIMEOUT:
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			mutex_unlock(&instance->reset_mutex);
> -			megasas_reset_fusion(instance->host,
> -					     MFI_IO_TIMEOUT_OCR);
> -			mutex_lock(&instance->reset_mutex);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
> -				 __func__, __LINE__);
> -			break;
> -		}
> +		megasas_dcmd_timeout(instance, cmd);
>  		break;
>  	case DCMD_FAILED:
>  		dev_err(&instance->pdev->dev,
> @@ -1476,22 +1461,7 @@ megasas_get_ld_map_info(struct megasas_instance *instance)
>  
>  	switch (ret) {
>  	case DCMD_TIMEOUT:
> -		switch (dcmd_timeout_ocr_possible(instance)) {
> -		case INITIATE_OCR:
> -			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
> -			mutex_unlock(&instance->reset_mutex);
> -			megasas_reset_fusion(instance->host,
> -					     MFI_IO_TIMEOUT_OCR);
> -			mutex_lock(&instance->reset_mutex);
> -			break;
> -		case KILL_ADAPTER:
> -			megaraid_sas_kill_hba(instance);
> -			break;
> -		case IGNORE_TIMEOUT:
> -			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
> -				 __func__, __LINE__);
> -			break;
> -		}
> +		megasas_dcmd_timeout(instance, cmd);
>  		break;
>  	case DCMD_FAILED:
>  		dev_err(&instance->pdev->dev,
diff mbox series

Patch

diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h
index 91570c5e8456..d96dc446c3aa 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2761,5 +2761,7 @@  void megasas_setup_debugfs(struct megasas_instance *instance);
 void megasas_destroy_debugfs(struct megasas_instance *instance);
 int megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num);
 int dcmd_timeout_ocr_possible(struct megasas_instance *instance);
+void megasas_dcmd_timeout(struct megasas_instance *instance,
+			struct megasas_cmd *cmd);
 
 #endif				/*LSI_MEGARAID_SAS_H */
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index ba8061ea2078..9325a011746d 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4531,6 +4531,30 @@  int dcmd_timeout_ocr_possible(struct megasas_instance *instance)
 		return INITIATE_OCR;
 }
 
+/*
+ * megasas_dcmd_timeout -	Classification processing dcmd timeout.
+ * @instance:				Adapter soft state
+ */
+void megasas_dcmd_timeout(struct megasas_instance *instance, struct megasas_cmd *cmd)
+{
+	switch (dcmd_timeout_ocr_possible(instance)) {
+	case INITIATE_OCR:
+		cmd->flags |= DRV_DCMD_SKIP_REFIRE;
+		mutex_unlock(&instance->reset_mutex);
+		megasas_reset_fusion(instance->host,
+					MFI_IO_TIMEOUT_OCR);
+		mutex_lock(&instance->reset_mutex);
+		break;
+	case KILL_ADAPTER:
+		megaraid_sas_kill_hba(instance);
+		break;
+	case IGNORE_TIMEOUT:
+		dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
+			__func__, __LINE__);
+		break;
+	}
+}
+
 static void
 megasas_get_pd_info(struct megasas_instance *instance, struct scsi_device *sdev)
 {
@@ -4582,24 +4606,7 @@  megasas_get_pd_info(struct megasas_instance *instance, struct scsi_device *sdev)
 		break;
 
 	case DCMD_TIMEOUT:
-
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			mutex_unlock(&instance->reset_mutex);
-			megasas_reset_fusion(instance->host,
-				MFI_IO_TIMEOUT_OCR);
-			mutex_lock(&instance->reset_mutex);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
-				__func__, __LINE__);
-			break;
-		}
-
+		megasas_dcmd_timeout(instance, cmd);
 		break;
 	}
 
@@ -4678,29 +4685,7 @@  megasas_get_pd_list(struct megasas_instance *instance)
 			instance->pd_list_not_supported = 1;
 		break;
 	case DCMD_TIMEOUT:
-
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			/*
-			 * DCMD failed from AEN path.
-			 * AEN path already hold reset_mutex to avoid PCI access
-			 * while OCR is in progress.
-			 */
-			mutex_unlock(&instance->reset_mutex);
-			megasas_reset_fusion(instance->host,
-						MFI_IO_TIMEOUT_OCR);
-			mutex_lock(&instance->reset_mutex);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d \n",
-				__func__, __LINE__);
-			break;
-		}
-
+		megasas_dcmd_timeout(instance, cmd);
 		break;
 
 	case DCMD_SUCCESS:
@@ -4805,29 +4790,7 @@  megasas_get_ld_list(struct megasas_instance *instance)
 		megaraid_sas_kill_hba(instance);
 		break;
 	case DCMD_TIMEOUT:
-
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			/*
-			 * DCMD failed from AEN path.
-			 * AEN path already hold reset_mutex to avoid PCI access
-			 * while OCR is in progress.
-			 */
-			mutex_unlock(&instance->reset_mutex);
-			megasas_reset_fusion(instance->host,
-						MFI_IO_TIMEOUT_OCR);
-			mutex_lock(&instance->reset_mutex);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
-				__func__, __LINE__);
-			break;
-		}
-
+		megasas_dcmd_timeout(instance, cmd);
 		break;
 
 	case DCMD_SUCCESS:
@@ -4925,28 +4888,7 @@  megasas_ld_list_query(struct megasas_instance *instance, u8 query_type)
 		ret = megasas_get_ld_list(instance);
 		break;
 	case DCMD_TIMEOUT:
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			/*
-			 * DCMD failed from AEN path.
-			 * AEN path already hold reset_mutex to avoid PCI access
-			 * while OCR is in progress.
-			 */
-			mutex_unlock(&instance->reset_mutex);
-			megasas_reset_fusion(instance->host,
-						MFI_IO_TIMEOUT_OCR);
-			mutex_lock(&instance->reset_mutex);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
-				__func__, __LINE__);
-			break;
-		}
-
+		megasas_dcmd_timeout(instance, cmd);
 		break;
 	case DCMD_SUCCESS:
 		tgtid_count = le32_to_cpu(ci->count);
@@ -5081,22 +5023,7 @@  megasas_host_device_list_query(struct megasas_instance *instance,
 		break;
 
 	case DCMD_TIMEOUT:
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			mutex_unlock(&instance->reset_mutex);
-			megasas_reset_fusion(instance->host,
-				MFI_IO_TIMEOUT_OCR);
-			mutex_lock(&instance->reset_mutex);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
-				 __func__, __LINE__);
-			break;
-		}
+		megasas_dcmd_timeout(instance, cmd);
 		break;
 	case DCMD_FAILED:
 		dev_err(&instance->pdev->dev,
@@ -5232,22 +5159,7 @@  void megasas_get_snapdump_properties(struct megasas_instance *instance)
 		break;
 
 	case DCMD_TIMEOUT:
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			mutex_unlock(&instance->reset_mutex);
-			megasas_reset_fusion(instance->host,
-				MFI_IO_TIMEOUT_OCR);
-			mutex_lock(&instance->reset_mutex);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
-				__func__, __LINE__);
-			break;
-		}
+		megasas_dcmd_timeout(instance, cmd);
 	}
 
 	if (ret != DCMD_TIMEOUT)
@@ -5372,22 +5284,7 @@  megasas_get_ctrl_info(struct megasas_instance *instance)
 		break;
 
 	case DCMD_TIMEOUT:
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			mutex_unlock(&instance->reset_mutex);
-			megasas_reset_fusion(instance->host,
-				MFI_IO_TIMEOUT_OCR);
-			mutex_lock(&instance->reset_mutex);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
-				__func__, __LINE__);
-			break;
-		}
+		megasas_dcmd_timeout(instance, cmd);
 		break;
 	case DCMD_FAILED:
 		megaraid_sas_kill_hba(instance);
@@ -5454,20 +5351,8 @@  int megasas_set_crash_dump_params(struct megasas_instance *instance,
 		ret = megasas_issue_polled(instance, cmd);
 
 	if (ret == DCMD_TIMEOUT) {
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			megasas_reset_fusion(instance->host,
-					MFI_IO_TIMEOUT_OCR);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
-				__func__, __LINE__);
-			break;
-		}
+		megasas_dcmd_timeout(instance, cmd);
+
 	} else
 		megasas_return_cmd(instance, cmd);
 
@@ -6840,23 +6725,7 @@  megasas_get_target_prop(struct megasas_instance *instance,
 
 	switch (ret) {
 	case DCMD_TIMEOUT:
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			mutex_unlock(&instance->reset_mutex);
-			megasas_reset_fusion(instance->host,
-					     MFI_IO_TIMEOUT_OCR);
-			mutex_lock(&instance->reset_mutex);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev,
-				 "Ignore DCMD timeout: %s %d\n",
-				 __func__, __LINE__);
-			break;
-		}
+		megasas_dcmd_timeout(instance, cmd);
 		break;
 
 	default:
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index f0aeb1ee83a2..1d0991650062 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -1371,22 +1371,7 @@  megasas_sync_pd_seq_num(struct megasas_instance *instance, bool pend) {
 		instance->pd_seq_map_id++;
 		break;
 	case DCMD_TIMEOUT:
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			mutex_unlock(&instance->reset_mutex);
-			megasas_reset_fusion(instance->host,
-					     MFI_IO_TIMEOUT_OCR);
-			mutex_lock(&instance->reset_mutex);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
-				 __func__, __LINE__);
-			break;
-		}
+		megasas_dcmd_timeout(instance, cmd);
 		break;
 	case DCMD_FAILED:
 		dev_err(&instance->pdev->dev,
@@ -1476,22 +1461,7 @@  megasas_get_ld_map_info(struct megasas_instance *instance)
 
 	switch (ret) {
 	case DCMD_TIMEOUT:
-		switch (dcmd_timeout_ocr_possible(instance)) {
-		case INITIATE_OCR:
-			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
-			mutex_unlock(&instance->reset_mutex);
-			megasas_reset_fusion(instance->host,
-					     MFI_IO_TIMEOUT_OCR);
-			mutex_lock(&instance->reset_mutex);
-			break;
-		case KILL_ADAPTER:
-			megaraid_sas_kill_hba(instance);
-			break;
-		case IGNORE_TIMEOUT:
-			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
-				 __func__, __LINE__);
-			break;
-		}
+		megasas_dcmd_timeout(instance, cmd);
 		break;
 	case DCMD_FAILED:
 		dev_err(&instance->pdev->dev,