[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;