Merge "[Bugfix][API-879]GPIO 004 is not high after sleeping" into MR3.0-merge
diff --git a/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/drivers/spm/mt_spm_suspend.c b/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/drivers/spm/mt_spm_suspend.c
index 1a3263f..2638448 100644
--- a/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/drivers/spm/mt_spm_suspend.c
+++ b/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/drivers/spm/mt_spm_suspend.c
@@ -27,9 +27,10 @@
 	(SPM_FLAG_DISABLE_VCORE_DFS) | \
 	(SPM_FLAG_ENABLE_LVTS_WORKAROUND) | \
 	(SPM_FLAG_ENABLE_PCIE_0P6V_WORKAROUND) | \
+	(SPM_FLAG_ENABLE_MD_MUMTAS) | \
 	(SPM_FLAG_USE_SRCCLKENO2) | \
 	(SPM_FLAG_NETSYS_DVFS_ENABLE))
-
+//jb.qi change for abnormal resume on 20230328
 #define SPM_SUSPEND_SLEEP_PCM_FLAG1		(0)
 
 #define SPM_SUSPEND_PCM_FLAG	( \
@@ -37,8 +38,9 @@
 	(SPM_FLAG_DISABLE_VCORE_DFS) | \
 	(SPM_FLAG_ENABLE_LVTS_WORKAROUND) | \
 	(SPM_FLAG_ENABLE_PCIE_0P6V_WORKAROUND) | \
+	(SPM_FLAG_ENABLE_MD_MUMTAS) | \
 	(SPM_FLAG_NETSYS_DVFS_ENABLE))
-
+//jb.qi change for abnormal resume on 20230328
 #define SPM_SUSPEND_PCM_FLAG1		(0)
 
 /* Suspend spm power control */
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/eccci/hif/ccci_hif_ccif.c b/src/kernel/linux/v4.19/drivers/misc/mediatek/eccci/hif/ccci_hif_ccif.c
index c00d4f7..0e491ff 100644
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/eccci/hif/ccci_hif_ccif.c
+++ b/src/kernel/linux/v4.19/drivers/misc/mediatek/eccci/hif/ccci_hif_ccif.c
@@ -202,8 +202,7 @@
 		i += 4;
 	}
 
-	if (atomic_cmpxchg(&md_ctrl->wakeup_src, 1, 0) == 1) {
-		md_ctrl->wakeup_count++;
+	if (test_and_clear_bit((D2H_SRAM), &md_ctrl->wakeup_ch)) { //jb.qi change for abnormal resume on 20230328
 		CCCI_NOTICE_LOG(md_ctrl->md_id, TAG,
 			"CCIF_MD wakeup source:(SRX_IDX/%d)(%u)\n",
 			ccci_h->channel, md_ctrl->wakeup_count);
@@ -375,12 +374,15 @@
 		}
 		ccci_h = (struct ccci_header *)skb->data;
 
-		if (atomic_cmpxchg(&md_ctrl->wakeup_src, 1, 0) == 1) {
-			md_ctrl->wakeup_count++;
+		if (test_and_clear_bit(queue->index, &md_ctrl->wakeup_ch)) { //jb.qi change for abnormal resume on 20230328
 			CCCI_NOTICE_LOG(md_ctrl->md_id, TAG,
 				"CCIF_MD wakeup source:(%d/%d/%x)(%u)\n",
 				queue->index, ccci_h->channel,
 				ccci_h->reserved, md_ctrl->wakeup_count);
+			/*jb.qi change for abnormal resume start on 20230328*/
+			if (ccci_h->channel == CCCI_FS_RX)
+				ccci_h->data[0] |= CCCI_FS_AP_CCCI_WAKEUP;
+			/*jb.qi change for abnormal resume end on 20230328*/
 		}
 
 		ccci_hdr = *ccci_h;
@@ -713,8 +715,7 @@
 	if (md_ctrl->channel_id & (1 << AP_MD_CCB_WAKEUP)) {
 		clear_bit(AP_MD_CCB_WAKEUP, &md_ctrl->channel_id);
 		CCCI_DEBUG_LOG(md_ctrl->md_id, TAG, "CCB wakeup\n");
-		if (atomic_cmpxchg(&md_ctrl->wakeup_src, 1, 0) == 1) {
-			md_ctrl->wakeup_count++;
+		if (test_and_clear_bit(AP_MD_CCB_WAKEUP, &md_ctrl->wakeup_ch)) { //jb.qi change for abnormal resume on 20230328
 			CCCI_NOTICE_LOG(md_ctrl->md_id, TAG,
 			"CCIF_MD wakeup source:(CCB)(%u)\n",
 			md_ctrl->wakeup_count);
@@ -1259,7 +1260,7 @@
 	md_ctrl->md_id = md_id;
 	md_ctrl->hif_id = hif_id;
 	atomic_set(&md_ctrl->reset_on_going, 1);
-	atomic_set(&md_ctrl->wakeup_src, 0);
+	md_ctrl->wakeup_ch = 0; //jb.qi change for abnormal resume on 20230328
 	ccci_reset_seq_num(&md_ctrl->traffic_info);
 
 	/*init queue */
diff --git a/src/kernel/linux/v4.19/drivers/misc/mediatek/eccci/hif/ccci_hif_ccif.h b/src/kernel/linux/v4.19/drivers/misc/mediatek/eccci/hif/ccci_hif_ccif.h
index e79c0c0..29b2286 100644
--- a/src/kernel/linux/v4.19/drivers/misc/mediatek/eccci/hif/ccci_hif_ccif.h
+++ b/src/kernel/linux/v4.19/drivers/misc/mediatek/eccci/hif/ccci_hif_ccif.h
@@ -21,7 +21,11 @@
 #else
 #define QUEUE_NUM   8
 #endif
-
+/*jb.qi change for abnormal resume start on 20230328*/
+/* speciall for user: ccci_fsd data[0] */
+#define CCCI_FS_AP_CCCI_WAKEUP (0x40000000)
+#define CCCI_FS_REQ_SEND_AGAIN 0x80000000
+/*jb.qi change for abnormal resume end on 20230328*/
 /*#define FLOW_CTRL_ENABLE*/
 #define FLOW_CTRL_HEAD		0x464C4F57	/*FLOW*/
 #define FLOW_CTRL_TAIL		0x4354524C	/*CTRL*/
@@ -91,7 +95,7 @@
 	struct timer_list bus_timeout_timer;
 	void __iomem *ccif_ap_base;
 	void __iomem *ccif_md_base;
-	atomic_t wakeup_src;
+	unsigned long wakeup_ch; //jb.qi change for abnormal resume on 20230328
 	unsigned int wakeup_count;
 
 	struct work_struct wdt_work;
@@ -229,9 +233,18 @@
 {
 	struct md_ccif_ctrl *md_ctrl =
 		(struct md_ccif_ctrl *)ccci_hif_get_by_id(hif_id);
-
-	if (md_ctrl)
-		return atomic_set(&md_ctrl->wakeup_src, value);
+	unsigned int ccif_ch = 0; //jb.qi change for abnormal resume on 20230328
+	/*jb.qi change for abnormal resume start on 20230328 */
+	if (md_ctrl) {
+		ccif_ch = ccif_read32(md_ctrl->ccif_ap_base, APCCIF_RCHNUM);
+		pr_notice("[ccci1/cif] CCIF wakeup channel: 0x%x\n", ccif_ch);
+		if (value == 1) {
+			md_ctrl->wakeup_ch = ccif_ch;
+			md_ctrl->wakeup_count++;
+		}
+		return value;
+	}
+	/*jb.qi change for abnormal resume end on 20230328 */
 	else
 		return -1;
 }
diff --git a/src/telephonyware/3.0/ccci_fsd/src/ccci_fsd.c b/src/telephonyware/3.0/ccci_fsd/src/ccci_fsd.c
index a16e649..badf0d2 100644
--- a/src/telephonyware/3.0/ccci_fsd/src/ccci_fsd.c
+++ b/src/telephonyware/3.0/ccci_fsd/src/ccci_fsd.c
@@ -84,6 +84,8 @@
 #define FS_WAKE_UNLOCK() release_wake_lock(FS_WAKE_LOCK_NAME)
 
 static char	   md_id = 0;
+static char debug_wakeup = 0; // jb.qi change for abnormal resume on 20230328
+
 /*
  * The maximum log level for messages to be logged to the syslog.
  * Only messages with a level lower than this will be printed to the console.
@@ -94,32 +96,36 @@
     LOG_LEVEL_INFO,
     LOG_LEVEL_DEBUG,
 };
-
+/*jb.qi change for abnormal resume start on 20230328*/
 #define DEBUGLEVEL LOG_LEVEL_ERR
 #define LOGD(fmt, ...) \
 do { \
-    if (LOG_LEVEL_DEBUG <= DEBUGLEVEL) \
+    if (debug_wakeup) \
+        ERROR(fmt, ##__VA_ARGS__); \
+    else if (LOG_LEVEL_DEBUG <= DEBUGLEVEL) \
         LOG(fmt, ##__VA_ARGS__); \
 } while(0)
 
 #define LOGI(fmt, ...) \
 do { \
-    if (LOG_LEVEL_INFO <= DEBUGLEVEL) \
+    if (debug_wakeup) \
+        ERROR(fmt, ##__VA_ARGS__); \
+    else if (LOG_LEVEL_INFO <= DEBUGLEVEL) \
         LOG(fmt, ##__VA_ARGS__); \
 } while(0)
 
 #define LOGW(fmt, ...) \
 do { \
-    if (LOG_LEVEL_WARNING <= DEBUGLEVEL) \
+    if (debug_wakeup || LOG_LEVEL_WARNING <= DEBUGLEVEL) \
         ERROR(fmt, ##__VA_ARGS__); \
 } while(0)
 
 #define LOGE(fmt, ...) \
 do { \
-    if (LOG_LEVEL_ERR <= DEBUGLEVEL) \
+    if (debug_wakeup || LOG_LEVEL_ERR <= DEBUGLEVEL) \
         ERROR(fmt, ##__VA_ARGS__); \
 } while(0)
-
+/*jb.qi change for abnormal resume end on 20230328*/
 #ifdef CCCI_FSD_UT
 #define dbg_printf(...) printf(__VA_ARGS__) //__android_log_print(ANDROID_LOG_DEBUG, MD_COMN_TAG, __VA_ARGS__);
 #else
@@ -738,7 +744,26 @@
 	return;
 
 }
-
+/*jb.qi change for abnormal resume start on 20230328*/
+static void print_file_name(const char *op_str, char *str, int len)
+{
+    if (!op_str || len < 0)
+        return;
+    if (len >= 8 && str)
+        if (str[0] == 0x2F)
+            LOGW("%s: [%02X%02X%02X%02X%02X%02X%02X%02X]\n", op_str,
+                (str[len-8]-32), (str[len-7]-32), (str[len-6]-32),
+                (str[len-5]-32), (str[len-4]-32), (str[len-3]-32),
+                (str[len-2]-32),(str[len-1]-32));
+	else
+            LOGW("%s: [%02X][%02X%02X%02X%02X%02X%02X%02X%02X]\n", op_str, str[0],
+                (str[len-8]-32), (str[len-7]-32), (str[len-6]-32),
+                (str[len-5]-32), (str[len-4]-32), (str[len-3]-32),
+                (str[len-2]-32),(str[len-1]-32));
+    else
+        LOGW("%s: [str_len = %d or no sub str]\n", op_str, len);
+}
+/*jb.qi change for abnormal resume end on 20230328*/
 static bool FS_GetPackInfo(FS_PACKET_INFO* pPackInfo, char* pData)
 {
 	unsigned int PackNum = *((unsigned int*)pData);
@@ -4433,10 +4458,25 @@
 				stream = (STREAM_DATA *)pkt_buff;
 				ccci_h = (CCCI_BUFF_T *)&stream->header;
 				ReqBufIndex = ccci_h->reserved;
-				LOGD("Read %d bytes from slot %d, CCCI_H data[0]=0x%X "
-						"data[1]=0x%X channel=0x%X reserved=0x%X\n", RetVal,
-						ReqBufIndex, ccci_h->data[0], ccci_h->data[1],
-						ccci_h->channel, ccci_h->reserved);
+				/*jb.qi change for abnormal resume start on 20230328*/
+				if (ccci_h->data[0] & CCCI_FS_AP_CCCI_WAKEUP) {
+					debug_wakeup = 1;
+					ccci_h->data[0] &= (~CCCI_FS_AP_CCCI_WAKEUP);
+				} else if (debug_wakeup) {
+					debug_wakeup = 0;
+				}
+
+				if (debug_wakeup)
+					LOGW("wakeup: Read %d bytes from slot %d, CCCI_H(0x%X)(0x%X)(0x%X)(0x%X), 0x%X\n",
+							RetVal, ReqBufIndex,
+							ccci_h->data[0], ccci_h->data[1], ccci_h->channel, ccci_h->reserved,
+							RetVal > sizeof(CCCI_BUFF_T) ? stream->payload.OperateID : -1);
+				else
+					LOGD("Read %d bytes from slot %d, CCCI_H data[0]=0x%X "
+							"data[1]=0x%X channel=0x%X reserved=0x%X\n", RetVal,
+							ReqBufIndex, ccci_h->data[0], ccci_h->data[1],
+							ccci_h->channel, ccci_h->reserved);
+				/*jb.qi change for abnormal resume end on 20230328*/
 				buffer_slot = (STREAM_DATA *)((char *)g_FsInfo.pFsBuf + (FS_MAX_BUF_SIZE + sizeof(STREAM_DATA))*ReqBufIndex);
 				p_fs_buff = (char *)buffer_slot;
 			                /******************************************
@@ -4518,7 +4558,54 @@
 		}
 
 		LOGD("OpID = 0X%X\n", pFsBuf->OperateID);
-
+		/*jb.qi change for abnormal resume start on 20230328*/
+		if (debug_wakeup) {
+			LOGW("[wakeup message] OpID = 0X%X\n", pFsBuf->OperateID);
+			switch (pFsBuf->OperateID) {
+				case FS_CCCI_OP_OPEN: // O
+				case FS_CCCI_OP_CREATEDIR: // CD
+				case FS_CCCI_OP_REMOVEDIR: // MD
+				case FS_CCCI_OP_RENAME: // RN_0
+				case FS_CCCI_OP_DELETE: // D
+				case FS_CCCI_OP_GETFOLDERSIZE: // FS
+				case FS_CCCI_OP_COUNT: // CN
+				case FS_CCCI_OP_GETATTRIBUTES: // A
+				case FS_CCCI_OP_GETFILEDETAIL: // GetFileDetail
+				case FS_CCCI_OP_XDELETE: // X
+				case FS_CCCI_OP_MOVE: // M_0
+				case FS_CCCI_OP_FINDFIRST: // FF
+				case FS_CCCI_OP_RESTORE: // RS
+				{
+					wchar_t* FileName = (wchar_t*)PackInfo[0].pData;
+					char ConvFileName[PATH_MAX] = {0};
+					FS_ConvWcsToCs(FileName, ConvFileName);
+					print_file_name("FILE", ConvFileName, strlen(ConvFileName));
+					break;
+				}
+				case FS_CCCI_OP_SEEK: // S
+				case FS_CCCI_OP_READ: // R
+				case FS_CCCI_OP_WRITE: // W
+				case FS_CCCI_OP_CLOSE: // C
+				case FS_CCCI_OP_GETFILESIZE: // F
+				case FS_CCCI_OP_FINDCLOSE: // FC
+				case FS_CCCI_OP_FINDNEXT: // FN
+				{
+					int HandleIndex = *((unsigned int*)PackInfo[0].pData);
+					if (HandleIndex < FS_FILE_MAX && HandleIndex >= 0) {
+						print_file_name("HANDLE", g_FsInfo.hFileHandle[HandleIndex].pFsFileName,
+								strlen(g_FsInfo.hFileHandle[HandleIndex].pFsFileName));
+					}
+					break;
+				}
+				case FS_CCCI_OP_GETCLUSTERSIZE: // CS
+				case FS_CCCI_OP_GETDRIVE: // GD
+				case FS_CCCI_OP_CLOSEALL: // CA
+				case FS_CCCI_OP_GETDISKINFO: // I
+				default:
+					break;
+			}
+		}
+		/*jb.qi change for abnormal resume end on 20230328*/
 		switch(pFsBuf->OperateID) {
 #ifdef CCCI_FSD_UT
 			/*ut test*/
diff --git a/src/telephonyware/3.0/ccci_fsd/src/ccci_fsd.h b/src/telephonyware/3.0/ccci_fsd/src/ccci_fsd.h
index 0d5317c..46967d3 100644
--- a/src/telephonyware/3.0/ccci_fsd/src/ccci_fsd.h
+++ b/src/telephonyware/3.0/ccci_fsd/src/ccci_fsd.h
@@ -376,6 +376,7 @@
 #define MAX_FS_PKT_BYTE (3584-128)
 #define MAX_FS_BUF_BYTE 4096
 
+#define CCCI_FS_AP_CCCI_WAKEUP (0x40000000) //jb.qi change for abnormal resume on 20230328
 #define CCCI_FS_REQ_SEND_AGAIN 0x80000000
 #define CCCI_FS_PEER_REQ_SEND_AGAIN(_p) (((((CCCI_BUFF_T*)(_p))->data[0] & CCCI_FS_REQ_SEND_AGAIN) != 0)? 1: 0)