--- ./source/private_module/bdm/sdm/sd/adapter/sd_adapter_device.c	2018-02-09 07:36:26.000000000 +0000
+++ ./source/private_module/bdm/sdm/sd/adapter/sd_adapter_device.c.hotpatch	2022-11-07 08:00:29.000000000 +0000
@@ -2218,11 +2218,13 @@
     }
     spin_unlock(&adpDev->lock);
 }
-
+void SdPatchTrigger(void);
+extern void sdCheckAllDiskBurstSizePatch(void);
 STATIC void sdAdapterHangIOTimeout(void *param)
-{
-    UNREFERENCE_PARAM(param);
+{   UNREFERENCE_PARAM(param);
+    SdPatchTrigger();
     DBG_LogDebug(LOG_ID_SD_0049, "Check device hang IO timer.");
+	sdCheckAllDiskBurstSizePatch();
     (void)sdListForEachAdapterDevice(sdAdapterDeviceHangIOTimeout, NULL);
 }
 
@@ -3612,4 +3614,98 @@
 EXPORT_SYMBOL(sdGetDiskDiagState);
 /*Begin Modified by l0245290 SR_0000157392_07 20170711*/
 
+#include "util/customize.h"
+#include "om/econf.h"
+#include "xve_spec.h"
+#include "sd_start_work.h"
+#define SD_TIMEOUT_ADJUST_FEATURE_NAME     "SsdTimeoutAdujustSwitch"
+bool g_sdSsdTimeoutAdujustSwitch = FALSE; /* ĬϹر */
+bool g_patchTriggered = FALSE;
+
+bool bdmIsSsdDiskByType(uint32_t diskType)
+{
+    bool ret = FALSE; /* ĬϳʼΪFALSE */
+
+    /* жϢֲķǰ棬ЧжϣIO */
+    switch (diskType) {
+        case DISK_TYPE_SSD:
+        case DISK_TYPE_NVME_SSD:
+        case DISK_TYPE_SSD_SED:
+        case DISK_TYPE_SLC_SSD:
+        case DISK_TYPE_MLC_SSD:
+        case DISK_TYPE_SLC_SSD_SED:
+        case DISK_TYPE_MLC_SSD_SED:
+            ret = TRUE;
+            break;
+        
+        case DISK_TYPE_SAS:
+            /* ret = FALSE; retѾʼΪFALSE,ֱbreak */
+            break;
+
+        default:
+            break;
+    }
+    return ret;
+}
+
+bool SdTimeOutAdjustSwitchStat(void)
+{
+    return g_sdSsdTimeoutAdujustSwitch;
+}
+
+int32_t SdConfSetTimeOutAdjustSwitch(uint32_t switchflag)
+{
+    CST_ITEM_T item;
+    int32_t retVal = RETURN_ERROR;
+
+    BDM_MEMSET_S(&item, sizeof(CST_ITEM_T), 0, sizeof(CST_ITEM_T));
+    BDM_SNPRINTF_S(item.acValue, CST_MAX_ITEM_VALUE_LEN, "%u", switchflag);
+    LVOS_strncpy(item.acName, SD_TIMEOUT_ADJUST_FEATURE_NAME, CST_MAX_ITEM_NAME_LEN);
+
+    retVal = CST_SetItem("BDM", &item);
+    if (retVal != RETURN_OK) {
+        DBG_LogInfo(DBG_LOGID_BUTT, "BDM_SPH139:Can not set SsdTimeoutAdujustSwitch to config item.");
+        return RETURN_ERROR;
+    }
+
+    retVal = ECONF_ModifyConfig("BDM", item.acName, item.acValue);
+    if (retVal != RETURN_OK) {
+        DBG_LogInfo(DBG_LOGID_BUTT, "BDM_SPH139:Can not save SsdTimeoutAdujustSwitch to config file.");
+        return RETURN_ERROR;
+    }
 
+    DBG_LogInfo(DBG_LOGID_BUTT, "BDM_SPH139:Save SsdTimeoutAdujustSwitch to config file, value %u.", switchflag);
+    g_sdSsdTimeoutAdujustSwitch = (bool)switchflag;
+    return RETURN_OK;
+}
+
+void SdUpdateSsdTimeoutAdjustSwitch(void)
+{
+    CST_ITEM_T item;
+
+    BDM_MEMSET_S(&item, sizeof(item), 0, sizeof(item));
+    if (CST_GetItem("BDM", SD_TIMEOUT_ADJUST_FEATURE_NAME, &item)) {
+        g_sdSsdTimeoutAdujustSwitch = (bool)LVOS_StrToU64(item.acValue);
+        DBG_LogInfo(DBG_LOGID_BUTT,
+            "BDM_SPH139:read %s=%u from product.ini conf.", SD_TIMEOUT_ADJUST_FEATURE_NAME, g_sdSsdTimeoutAdujustSwitch);
+    } else {
+        g_sdSsdTimeoutAdujustSwitch = FALSE; /* ĬϹر */
+        DBG_LogError(DBG_LOGID_BUTT, "BDM_SPH139:Can not read [%s] %s from product.ini conf.", "BDM", SD_TIMEOUT_ADJUST_FEATURE_NAME);
+    }
+}
+
+extern uint64_t g_sdSysFlowCtrlFlag;
+void SdPatchTrigger(void)
+{
+    if (g_patchTriggered) {
+        return;
+    }
+
+    if (BDM_TEST_BIT(SD_SYS_FLOW_CTRL_FLAG_START_WORK, (void*)&g_sdSysFlowCtrlFlag)) {
+        SdUpdateSsdTimeoutAdjustSwitch();
+        g_patchTriggered = TRUE;
+    }
+}
+EXPORT_SYMBOL(bdmIsSsdDiskByType);
+EXPORT_SYMBOL(SdTimeOutAdjustSwitchStat);
+EXPORT_SYMBOL(SdConfSetTimeOutAdjustSwitch);
--- ./source/private_module/bdm/sdm/sd/sd_debug.c	2018-02-09 07:36:26.000000000 +0000
+++ ./source/private_module/bdm/sdm/sd/sd_debug.c.hotpatch	2022-11-07 08:00:29.000000000 +0000
@@ -2846,7 +2846,7 @@
     return;
 }
 /*End DTS2017022400881 z00225684 2017.2.23*/
-
+bool SdDoDebugSetSsdTimeoutAjustSwitch(int32_t argc, char *argv[]);
 /**************************************************************************
 *     :sddebugӡIOͳϢ
 * : argc
@@ -2857,9 +2857,9 @@
 **************************************************************************/
 void sdDoDebugShowIo(int32_t argc, char *argv[])
 {
-    UNREFERENCE_PARAM(argc);
-    UNREFERENCE_PARAM(argv);
-    
+    if (SdDoDebugSetSsdTimeoutAjustSwitch(argc, argv)) {
+        return;
+    }
     /*Begin Modified by l00245290 DTS2015062304179 20150624*/
     DBG_Print("Total io gen %llu, total req delete %llu\n", 
         atomic64_read(&g_genIoCnt), atomic64_read(&g_genIoDelCnt));
@@ -4922,4 +4922,43 @@
 /* PC-Lint */
 SD_USE_TRACE_POINT
 
+extern bool SdTimeOutAdjustSwitchStat(void);
+extern int32_t SdConfSetTimeOutAdjustSwitch(uint32_t switchflag);
+bool SdDoDebugSetSsdTimeoutAjustSwitch(int32_t argc, char *argv[])
+{
+    uint32_t switchflag = 0;
+    uint32_t mode;
+    int32_t ret = RETURN_ERROR;
+    if ( argc < 3)
+    {
+        return FALSE;
+    }
+ 
+    mode = (uint32_t)LVOS_StrToU64(argv[2]);
+    if (mode == 0) {
+        DBG_Print("Success to get timeout adjust switch %u.\n", SdTimeOutAdjustSwitchStat());
+        return TRUE;
+    }
+ 	 	 
+    if (mode != 1 || argc != 4) {
+        DBG_Print("Not timeout adjust switch operate(mode-0 or 1, switch-0 or 1).\n");
+        return FALSE;
+    }
+ 	 
+    switchflag = (uint32_t)LVOS_StrToU64(argv[3]);
+    if(switchflag > 1) {
+        DBG_Print("Please input timeout adjust switch value(0 or 1).\n");
+        return FALSE;
+    }
+
+    ret = SdConfSetTimeOutAdjustSwitch(switchflag);
+    if(ret != RETURN_OK) {
+        DBG_Print("Write timeout adjust switch %u faild.\n", switchflag);
+        return TRUE;
+    }
+
+    DBG_Print("Success to set timeout adjust switch %u.\n", switchflag);
+    return TRUE;
+}
+
 
--- ./source/private_module/bdm/sdm/sio/stub_v3/stub_sio_timeout.c	2018-04-20 08:27:24.000000000 +0000
+++ ./source/private_module/bdm/sdm/sio/stub_v3/stub_sio_timeout.c.hotpatch	2022-11-07 08:00:29.000000000 +0000
@@ -932,7 +932,10 @@
 
     spin_unlock_irqrestore(&queue->timerLock, flags);
 }
-
+void SioAdjustSsdReqDrvDeadline(REQ_S *req, SIO_S *sio);
+bool SioIsSsdDev(SD_SCSI_DEVICE_S *dev);
+extern bool SdTimeOutAdjustSwitchStat(void);
+extern bool bdmIsSsdDiskByType(uint32_t diskType);
 /*Begin Modified by l00245290 DTS2017011606750  20170222*/
 /**************************************************************************
    : stub_sioAdjustDiskReqDrvDeadline
@@ -941,7 +944,6 @@
  : REQ_S *req :IO
  : 
    ֵ: 
-     : 
 **************************************************************************/
 void stub_sioAdjustDiskReqDrvDeadline(REQ_S *req)
 {
@@ -950,27 +952,26 @@
 /* Dorado 5000 modified begin */
     SIO_QUEUE_S *queue = SIO_SIO_TO_QUEUE(sio);
 /* Dorado 5000 modified end */
-
     /*ֻӲIOЧ*/
     if(!sioTestReqFlag(req, BDM_REQ_FLAG_IO_TYPE_DISK))
     {
         return;
     }
     
-    /*ͨdiagnoseòв*/
     if(unlikely(g_debugSwitch.adjustDeadlineDisable))
     {
         return;
     }
 
-/* Dorado 5000 modified begin */
     if (sdIsNvmeDev(queue->disk))
     {
         sioNvmeAdjustDiskReqDrvDeadline(req, sio);
         return;
     }
-/* Dorado 5000 modified end */
-    
+    if (SdTimeOutAdjustSwitchStat() && SioIsSsdDev(queue->disk)) {
+        SioAdjustSsdReqDrvDeadline(req, sio);
+        return;
+    }
     /*ȡǰʱ*/
     curTime = jiffies;
 
@@ -983,8 +984,6 @@
     return;
 }
 /*End Modified by l00245290 DTS2017011606750  20170222*/
-
-/* Dorado 5000 modified begin */
 /*******************************************************************************
       : stub_sioHandleTimeoutAllocReq            
         : µREQ            
@@ -1246,3 +1245,36 @@
 EXPORT_SYMBOL(sioDiskIOFastReturnWithTimeoutError);
 /*End Modified by j00285232 SR.SF-0000248697.001 20180304*/
 
+#include "sio_scsi.h"
+void SioAdjustSsdReqDrvDeadline(REQ_S *req, SIO_S *sio)
+{
+    SD_CMND_S *cmd = SIO_REQ_TO_CMD(req);
+    uint64_t curTime = jiffies;
+
+    if (cmd->cdb[0] == READ_10
+                || cmd->cdb[0] == WRITE_10
+                || cmd->cdb[0] == READ_16
+                || cmd->cdb[0] == WRITE_16) {
+                sio->priv.deadline = curTime + SIO_MS_TO_JIFFIES(SIO_RW_DISK_IO_DRV_MIN_TIMEOUT_MS);
+        } else if ((sio->priv.deadline < curTime)  || (sio->priv.deadline - curTime) < SIO_DISK_IO_DRV_MIN_TIMEOUT) {
+                sio->priv.deadline = curTime + SIO_DISK_IO_DRV_MIN_TIMEOUT;
+        }
+}
+ 	 	 
+bool SioIsSsdDev(SD_SCSI_DEVICE_S *dev)
+{
+ 	SCSI_DISK_DEVICE_S *disk = NULL;
+ 	 	 
+ 	if (dev->type == SCSI_DEVICE_TYPE_DISK)
+ 	{
+ 	 	disk = SD_GENERIC_TO_DISK(dev);
+ 	} else {
+        return FALSE;
+    }
+
+    if (bdmIsSsdDiskByType(disk->type)) {
+        return TRUE;
+    }
+ 
+    return FALSE;
+}
\ No newline at end of file
