wlan: reload WLAN driver if cannot recover from RX low resource
If WLAN host driver could not recover Out of RX buffer problem,
Trigger re-load host driver to recover from dead end
Change-Id: I144ff97a8a4c8e458990aa61956f4cc8b6af7356
CRs-fixed: 500022
diff --git a/CORE/DXE/src/wlan_qct_dxe.c b/CORE/DXE/src/wlan_qct_dxe.c
index ff2b5ed..b4bc280 100644
--- a/CORE/DXE/src/wlan_qct_dxe.c
+++ b/CORE/DXE/src/wlan_qct_dxe.c
@@ -1858,6 +1858,35 @@
}
/*==========================================================================
+ @ Function Name
+ dxeRXResourceAvailableTimerExpHandler
+
+ @ Description
+ During pre-set timeperiod, if free available RX buffer is not allocated
+ Trigger Driver re-loading to recover RX dead end
+
+ @ Parameters
+ v_VOID_t *usrData
+ DXE context
+
+ @ Return
+ NONE
+
+===========================================================================*/
+void dxeRXResourceAvailableTimerExpHandler
+(
+ void *usrData
+)
+{
+ HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL,
+ "RX Low resource, Durign wait time period %d, RX resource not allocated",
+ T_WLANDXE_MAX_RX_PACKET_WAIT);
+ wpalWlanReload();
+
+ return;
+}
+
+/*==========================================================================
@ Function Name
dxeRXPacketAvailableCB
@@ -1988,8 +2017,8 @@
}
else if(!dxeCtxt->rxPalPacketUnavailable)
{
- /* Allocate platform Packet buffer and OS Frame Buffer at here */
- currentPalPacketBuffer = wpalPacketAlloc(eWLAN_PAL_PKT_TYPE_RX_RAW,
+ /* Allocate platform Packet buffer and OS Frame Buffer at here */
+ currentPalPacketBuffer = wpalPacketAlloc(eWLAN_PAL_PKT_TYPE_RX_RAW,
WLANDXE_DEFAULT_RX_OS_BUFFER_SIZE,
dxeRXPacketAvailableCB,
(void *)dxeCtxt);
@@ -1997,6 +2026,16 @@
if(NULL == currentPalPacketBuffer)
{
dxeCtxt->rxPalPacketUnavailable = eWLAN_PAL_TRUE;
+ /* Out of RX free buffer,
+ * Start timer to recover from RX dead end */
+ if(VOS_TIMER_STATE_RUNNING !=
+ wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
+ {
+ HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
+ "RX Low resource, wait available resource");
+ wpalTimerStart(&dxeCtxt->rxResourceAvailableTimer,
+ T_WLANDXE_MAX_RX_PACKET_WAIT);
+ }
}
}
@@ -2870,6 +2909,13 @@
}
dxeCtxt = (WLANDXE_CtrlBlkType *)(rxPktAvailMsg->pContext);
+ /* Available resource allocated
+ * Stop timer not needed */
+ if(VOS_TIMER_STATE_RUNNING ==
+ wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
+ {
+ wpalTimerStop(&dxeCtxt->rxResourceAvailableTimer);
+ }
do
{
@@ -4358,6 +4404,10 @@
return NULL;
}
+ wpalTimerInit(&tempDxeCtrlBlk->rxResourceAvailableTimer,
+ dxeRXResourceAvailableTimerExpHandler,
+ tempDxeCtrlBlk);
+
HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_WARN,
"WLANDXE_Open Success");
HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
@@ -4868,6 +4918,12 @@
wpalUnRegisterInterrupt(DXE_INTERRUPT_TX_COMPLE);
wpalUnRegisterInterrupt(DXE_INTERRUPT_RX_READY);
+ if(VOS_TIMER_STATE_STOPPED !=
+ wpalTimerGetCurStatus(&dxeCtxt->rxResourceAvailableTimer))
+ {
+ wpalTimerStop(&dxeCtxt->rxResourceAvailableTimer);
+ }
+
HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_LOW,
"%s Exit", __func__);
return status;
@@ -4917,6 +4973,7 @@
}
dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
+ wpalTimerDelete(&dxeCtxt->rxResourceAvailableTimer);
for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
{
wpalMutexDelete(&dxeCtxt->dxeChannel[idx].dxeChannelLock);
diff --git a/CORE/DXE/src/wlan_qct_dxe_i.h b/CORE/DXE/src/wlan_qct_dxe_i.h
index 5f95b33..6d5980c 100644
--- a/CORE/DXE/src/wlan_qct_dxe_i.h
+++ b/CORE/DXE/src/wlan_qct_dxe_i.h
@@ -644,6 +644,7 @@
wpt_boolean rxPalPacketUnavailable;
wpt_boolean driverReloadInProcessing;
wpt_boolean smsmToggled;
+ wpt_timer rxResourceAvailableTimer;
} WLANDXE_CtrlBlkType;
/*==========================================================================