/*----------------------------------------------------------------------------*/ VOID cnmTimerInitTimer ( IN P_ADAPTER_T prAdapter, IN P_TIMER_T prTimer, IN PFN_MGMT_TIMEOUT_FUNC pfFunc, IN UINT_32 u4Data ) { ASSERT(prAdapter); ASSERT(prTimer); #if DBG /* Note: NULL function pointer is permitted for HEM POWER */ if (pfFunc == NULL) { DBGLOG(CNM, WARN, ("Init timer with NULL callback function!\n")); } #endif #if DBG ASSERT(prAdapter->rRootTimer.rLinkHead.prNext); { P_LINK_T prTimerList; P_LINK_ENTRY_T prLinkEntry; P_TIMER_T prPendingTimer; prTimerList = &(prAdapter->rRootTimer.rLinkHead); LINK_FOR_EACH(prLinkEntry, prTimerList) { prPendingTimer = LINK_ENTRY(prLinkEntry, TIMER_T, rLinkEntry); ASSERT(prPendingTimer); ASSERT(prPendingTimer != prTimer); } }
/*----------------------------------------------------------------------------*/ VOID timerDoTimeOutCheck ( IN P_ADAPTER_T prAdapter ) { P_LINK_T prTimerList; P_LINK_ENTRY_T prLinkEntry; P_TIMER_T prTimer; OS_SYSTIME rCurSysTime; DEBUGFUNC("timerDoTimeOutCheck"); ASSERT(prAdapter); prTimerList= &prAdapter->rTimerList; GET_CURRENT_SYSTIME(&rCurSysTime); /* Set the permitted max timeout value for new one */ prAdapter->rNextExpiredSysTime = rCurSysTime + MGMT_MAX_TIMEOUT_INTERVAL; LINK_FOR_EACH(prLinkEntry, prTimerList) { prTimer = LINK_ENTRY(prLinkEntry, TIMER_T, rLinkEntry); /* Check if this entry is timeout. */ if (!TIME_BEFORE(rCurSysTime, prTimer->rExpiredSysTime)) { timerStopTimer(prAdapter, prTimer); #if CFG_USE_SW_ROOT_TIMER if (prTimer->fgNeedHwAccess) { ARB_ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter); DBGLOG(INIT, INFO, ("Timer Handler: ->%s(): SYS_TIME = %ld\n", prTimer->aucDbgString, u4CurTime)); (prTimer->pfMgmtTimeOutFunc)(prTimer->u4Data); // It may add timer there. DBGLOG(INIT, INFO, ("Timer Handler: <-%s()\n", prTimer->aucDbgString)); ARB_RECLAIM_POWER_CONTROL_TO_PM(prAdapter); } else #endif { DBGLOG(INIT, INFO, ("(NO HW ACCESS)Timer Handler: ->%s(): SYS_TIME = %ld\n", prTimer->aucDbgString, rCurSysTime)); (prTimer->pfMgmtTimeOutFunc)(prTimer->u4Data); // It may add timer there. DBGLOG(INIT, INFO, ("(NO HW ACCESS)Timer Handler: <-%s()\n", prTimer->aucDbgString)); } /* Search entire list again because of nest del and add timers * and current MGMT_TIMER could be volatile after stopped */ prLinkEntry = (P_LINK_ENTRY_T)prTimerList; } else if (TIME_BEFORE(prTimer->rExpiredSysTime, prAdapter->rNextExpiredSysTime)) { prAdapter->rNextExpiredSysTime = prTimer->rExpiredSysTime; } } /* end of for loop */