Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 72cdfd32 authored by Leo Chang's avatar Leo Chang Committed by Kiet Lam
Browse files

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
parent be97df0a
Loading
Loading
Loading
Loading
+59 −2
Original line number Diff line number Diff line
@@ -1857,6 +1857,35 @@ static wpt_status dxeChannelCleanInt
   return status;
}

/*==========================================================================
  @  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
@@ -1997,6 +2026,16 @@ static wpt_status dxeRXFrameSingleBufferAlloc
      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 @@ void dxeRXPacketAvailableEventHandler
   }

   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 @@ void *WLANDXE_Open
      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 @@ wpt_status WLANDXE_Stop
   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 @@ wpt_status WLANDXE_Close
   }

   dxeCtxt = (WLANDXE_CtrlBlkType *)pDXEContext;
   wpalTimerDelete(&dxeCtxt->rxResourceAvailableTimer);
   for(idx = 0; idx < WDTS_CHANNEL_MAX; idx++)
   {
      wpalMutexDelete(&dxeCtxt->dxeChannel[idx].dxeChannelLock);
+1 −0
Original line number Diff line number Diff line
@@ -644,6 +644,7 @@ typedef struct
   wpt_boolean                     rxPalPacketUnavailable;
   wpt_boolean                     driverReloadInProcessing;
   wpt_boolean                     smsmToggled;
   wpt_timer                       rxResourceAvailableTimer;
} WLANDXE_CtrlBlkType;

/*==========================================================================