[WCNCR00145904] perf: Support using only EP4IN to improve USB2 throughput

[Description]
Change to support only using EP4IN without EP5IN to improve USB2
throughput (mainly RX).

Change-Id: I7840980aebcf23a24901af8d1b38108a2a70e9f8
Feature: perf
Signed-off-by: Desmond Lin <desmond.lin@mediatek.com>
CR-Id: WCNCR00145904
diff --git a/common/wlan_lib.c b/common/wlan_lib.c
index d10053a..74c8e8a 100644
--- a/common/wlan_lib.c
+++ b/common/wlan_lib.c
@@ -883,6 +883,7 @@
 	WLAN_STATUS rStatus;
 	/* Hif power off wifi */
 	rStatus = halHifPowerOffWifi(prAdapter);
+	prAdapter->fgIsCr4FwDownloaded = FALSE;
 
 	return rStatus;
 }
@@ -3590,6 +3591,7 @@
 #if CFG_SUPPORT_COMPRESSION_FW_OPTION
 		rDlStatus = wlanImageSectionDownloadStage(prAdapter, prFwBuffer,
 				u4FwSize, CR4_FWDL_SECTION_NUM, IMG_DL_IDX_CR4_FW, &fgIsCompressed, &rFwImageInFo);
+		prAdapter->fgIsCr4FwDownloaded = TRUE;
 		if (fgIsCompressed == TRUE)
 			rCfgStatus = wlanCompressedFWConfigWifiFunc(prAdapter, FALSE, 0, PDA_CR4, &rFwImageInFo);
 		else
@@ -3598,6 +3600,7 @@
 #else
 		rDlStatus = wlanImageSectionDownloadStage(prAdapter, prFwBuffer,
 			u4FwSize, CR4_FWDL_SECTION_NUM, IMG_DL_IDX_CR4_FW);
+		prAdapter->fgIsCr4FwDownloaded = TRUE;
 		rCfgStatus = wlanConfigWifiFunc(prAdapter, FALSE, 0, PDA_CR4);
 #endif
 		kalFirmwareImageUnmapping(prAdapter->prGlueInfo, NULL, prFwBuffer);
diff --git a/include/nic/adapter.h b/include/nic/adapter.h
index ac32558..be3a923 100644
--- a/include/nic/adapter.h
+++ b/include/nic/adapter.h
@@ -1156,6 +1156,7 @@
 	UINT_32 u4FreeBlockNum;
 	UINT_32 u4GetTxPower;
 /*#endif*/
+	BOOLEAN fgIsCr4FwDownloaded;
 	BOOLEAN fgIsFwDownloaded;
 	BOOLEAN fgIsSupportBufferBinSize16Byte;
 	BOOLEAN fgIsSupportDelayCal;
diff --git a/os/linux/hif/usb/hal_api.c b/os/linux/hif/usb/hal_api.c
index f9c5235..023a792 100644
--- a/os/linux/hif/usb/hal_api.c
+++ b/os/linux/hif/usb/hal_api.c
@@ -174,8 +174,10 @@
 halRxWaitResponse(IN P_ADAPTER_T prAdapter, IN UINT_8 ucPortIdx, OUT PUINT_8 pucRspBuffer,
 		  IN UINT_32 u4MaxRespBufferLen, OUT PUINT_32 pu4Length)
 {
+	P_GL_HIF_INFO_T prHifInfo = &prAdapter->prGlueInfo->rHifInfo;
 	WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
 	P_RX_CTRL_T prRxCtrl;
+	BOOL ret = FALSE;
 
 	DEBUGFUNC("halRxWaitResponse");
 
@@ -184,8 +186,47 @@
 
 	prRxCtrl = &prAdapter->rRxCtrl;
 
-	HAL_PORT_RD(prAdapter, USB_EVENT_EP_IN, ALIGN_4(u4MaxRespBufferLen) + LEN_USB_RX_PADDING_CSO,
+	if (prHifInfo->fgEventEpDetected == FALSE) {
+		/* NOTE: This is temporary compatiable code with old/new CR4 FW to detect which EVENT endpoint that
+		 *       CR4 FW is using. If the new EP4IN-using CR4 FW works without any issue for a while,
+		 *       this code block will be removed.
+		 */
+		if (prAdapter->fgIsCr4FwDownloaded) {
+			ucPortIdx = USB_DATA_EP_IN;
+			ret = kalDevPortRead(prAdapter->prGlueInfo, ucPortIdx,
+				ALIGN_4(u4MaxRespBufferLen) + LEN_USB_RX_PADDING_CSO,
+				prRxCtrl->pucRxCoalescingBufPtr, HIF_RX_COALESCING_BUFFER_SIZE);
+
+			if (ret == TRUE) {
+				prHifInfo->eEventEpType = EVENT_EP_TYPE_DATA_EP;
+			} else {
+				ucPortIdx = USB_EVENT_EP_IN;
+				ret = kalDevPortRead(prAdapter->prGlueInfo, ucPortIdx,
+					ALIGN_4(u4MaxRespBufferLen) + LEN_USB_RX_PADDING_CSO,
+					prRxCtrl->pucRxCoalescingBufPtr, HIF_RX_COALESCING_BUFFER_SIZE);
+			}
+			prHifInfo->fgEventEpDetected = TRUE;
+
+			kalMemCopy(pucRspBuffer, prRxCtrl->pucRxCoalescingBufPtr, u4MaxRespBufferLen);
+			*pu4Length = u4MaxRespBufferLen;
+
+			return u4Status;
+		}
+
+		ucPortIdx = USB_EVENT_EP_IN;
+	} else {
+		if (prHifInfo->eEventEpType == EVENT_EP_TYPE_DATA_EP)
+			if (prAdapter->fgIsCr4FwDownloaded)
+				ucPortIdx = USB_DATA_EP_IN;
+			else
+				ucPortIdx = USB_EVENT_EP_IN;
+		else
+			ucPortIdx = USB_EVENT_EP_IN;
+
+	}
+	HAL_PORT_RD(prAdapter, ucPortIdx, ALIGN_4(u4MaxRespBufferLen) + LEN_USB_RX_PADDING_CSO,
 		prRxCtrl->pucRxCoalescingBufPtr, HIF_RX_COALESCING_BUFFER_SIZE);
+
 	kalMemCopy(pucRspBuffer, prRxCtrl->pucRxCoalescingBufPtr, u4MaxRespBufferLen);
 	*pu4Length = u4MaxRespBufferLen;
 
@@ -927,8 +968,9 @@
 /*----------------------------------------------------------------------------*/
 VOID halEnableInterrupt(IN P_ADAPTER_T prAdapter)
 {
-	halRxUSBReceiveEvent(prAdapter, TRUE);
 	halRxUSBReceiveData(prAdapter);
+	if (prAdapter->prGlueInfo->rHifInfo.eEventEpType != EVENT_EP_TYPE_DATA_EP)
+		halRxUSBReceiveEvent(prAdapter, TRUE);
 } /* end of halEnableInterrupt() */
 
 /*----------------------------------------------------------------------------*/
diff --git a/os/linux/hif/usb/include/hif.h b/os/linux/hif/usb/include/hif.h
index 0989a68..445db50 100644
--- a/os/linux/hif/usb/include/hif.h
+++ b/os/linux/hif/usb/include/hif.h
@@ -116,6 +116,8 @@
 #define HIF_TX_PAGE_SIZE                 2048	/* in unit of bytes */
 #endif
 
+#define USB_EVENT_TYPE                  (EVENT_EP_TYPE_UNKONW)
+
 #define USB_CMD_EP_OUT                  (USB_DATA_BULK_OUT_EP8)
 #define USB_EVENT_EP_IN                 (0x85)
 #define USB_DATA_EP_IN                  (0x84)
@@ -265,6 +267,7 @@
 	struct mutex vendor_req_sem;
 	BOOLEAN fgIntReadClear;
 	BOOLEAN fgMbxReadClear;
+	BOOLEAN fgEventEpDetected;
 	EVENT_EP_TYPE eEventEpType;
 } GL_HIF_INFO_T, *P_GL_HIF_INFO_T;
 
diff --git a/os/linux/hif/usb/usb.c b/os/linux/hif/usb/usb.c
index 767f807..f5fd468 100644
--- a/os/linux/hif/usb/usb.c
+++ b/os/linux/hif/usb/usb.c
@@ -439,7 +439,7 @@
 	if (!ret) {
 #if 0 /* maximize buff len for usb in */
 		if (count != len) {
-			DBGLOG(HAL, WARN, "usb_bulk_msg(IN=%d) Warning. Data is not completed. (receive %u/%u)\n",
+			DBGLOG(HAL, WARN, "usb_bulk_msg(IN=%d) Warning. Data is not completed. (receive %d/%u)\n",
 			       InEp, count, len);
 		}
 #endif
@@ -471,7 +471,7 @@
 	if (!ret) {
 #if 0 /* maximize buff len for usb in */
 		if (count != len) {
-			DBGLOG(HAL, WARN, "usb_interrupt_msg(IN=%d) Warning. Data is not completed. (receive %u/%u)\n",
+			DBGLOG(HAL, WARN, "usb_interrupt_msg(IN=%d) Warning. Data is not completed. (receive %d/%u)\n",
 			       InEp, count, len);
 		}
 #endif
@@ -514,7 +514,7 @@
 
 	if (!ret) {
 		if (count != len) {
-			DBGLOG(HAL, ERROR, "usb_bulk_msg(OUT=%d) Warning. Data is not completed. (send %u/%u)\n", OutEp,
+			DBGLOG(HAL, ERROR, "usb_bulk_msg(OUT=%d) Warning. Data is not completed. (send %d/%u)\n", OutEp,
 			       count, len);
 		}
 		return ret;
@@ -663,7 +663,8 @@
 	UINT_8 ucTc;
 #endif
 
-	prHifInfo->eEventEpType = EVENT_EP_TYPE_UNKONW;
+	prHifInfo->eEventEpType = USB_EVENT_TYPE;
+	prHifInfo->fgEventEpDetected = FALSE;
 
 	prHifInfo->intf = (struct usb_interface *)ulCookie;
 	prHifInfo->udev = interface_to_usbdev(prHifInfo->intf);
@@ -1205,7 +1206,7 @@
 		/* maximize buff len for usb in */
 		ret = mtk_usb_intr_in_msg(prGlueInfo, u4ValidOutBufSize, pucDst, u2Port);
 		if (ret != u4Len) {
-			DBGLOG(HAL, WARN, "usb_interrupt_msg(IN=%d) Warning. Data is not completed. (receive %u/%u)\n",
+			DBGLOG(HAL, WARN, "usb_interrupt_msg(IN=%d) Warning. Data is not completed. (receive %d/%u)\n",
 			       u2Port, ret, u4Len);
 		}
 		ret = ret >= 0 ? 0 : ret;
@@ -1213,7 +1214,7 @@
 		/* maximize buff len for usb in */
 		ret = mtk_usb_bulk_in_msg(prGlueInfo, u4ValidOutBufSize, pucDst, u2Port);
 		if (ret != u4Len) {
-			DBGLOG(HAL, WARN, "usb_bulk_msg(IN=%d) Warning. Data is not completed. (receive %u/%u)\n",
+			DBGLOG(HAL, WARN, "usb_bulk_msg(IN=%d) Warning. Data is not completed. (receive %d/%u)\n",
 			       u2Port, ret, u4Len);
 		}
 		ret = ret >= 0 ? 0 : ret;