/*----------------------------------------------------------------------------*/ VOID timerStartTimer ( IN P_ADAPTER_T prAdapter, IN P_TIMER_T prTimer, IN UINT_32 u4TimeoutMs ) { P_LINK_T prTimerList; OS_SYSTIME rExpiredSysTime; ASSERT(prAdapter); ASSERT(prTimer); prTimerList= &prAdapter->rTimerList; /* To avoid infinite loop in function wlanDoTimeOutCheck(), * zero interval is not permitted. */ if (u4TimeoutMs == 0) { u4TimeoutMs = 1; } rExpiredSysTime = kalGetTimeTick() + MSEC_TO_SYSTIME(u4TimeoutMs); /* If no timer pending or the fast time interval is used. */ if (prTimerList->prNext == (P_LINK_ENTRY_T)prTimerList || TIME_BEFORE(rExpiredSysTime, prAdapter->rNextExpiredSysTime)) { if (timerSetTimer(prAdapter, MSEC_TO_SYSTIME(u4TimeoutMs))) { prAdapter->rNextExpiredSysTime = rExpiredSysTime; } } /* Add this timer to checking list */ prTimer->rExpiredSysTime = rExpiredSysTime; if (!timerPendingTimer(prTimer)) { LINK_INSERT_TAIL(prTimerList, &prTimer->rLinkEntry); } return; } /* timerStartTimer */
/*----------------------------------------------------------------------------*/ BOOLEAN nicpmSetDriverOwn(IN P_ADAPTER_T prAdapter) { #define LP_OWN_BACK_TOTAL_DELAY_MS 2048 /* exponential of 2 */ #define LP_OWN_BACK_LOOP_DELAY_MS 1 /* exponential of 2 */ #define LP_OWN_BACK_CLR_OWN_ITERATION 256 /* exponential of 2 */ #define LP_OWN_BACK_FAILED_RETRY_CNT 5 #define LP_OWN_BACK_FAILED_LOG_SKIP_MS 2000 #define LP_OWN_BACK_FAILED_RESET_CNT 5 BOOLEAN fgStatus = TRUE; UINT_32 i, u4CurrTick, u4RegValue = 0; BOOLEAN fgTimeout; ASSERT(prAdapter); if (prAdapter->fgIsFwOwn == FALSE) return fgStatus; DBGLOG(INIT, INFO, ("DRIVER OWN\n")); u4CurrTick = kalGetTimeTick(); i = 0; while (1) { HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue); fgTimeout = ((kalGetTimeTick() - u4CurrTick) > LP_OWN_BACK_TOTAL_DELAY_MS) ? TRUE : FALSE; if (u4RegValue & WHLPCR_FW_OWN_REQ_SET) { prAdapter->fgIsFwOwn = FALSE; prAdapter->u4OwnFailedCount = 0; prAdapter->u4OwnFailedLogCount = 0; break; } else if((i > LP_OWN_BACK_FAILED_RETRY_CNT) && (kalIsCardRemoved(prAdapter->prGlueInfo) || fgIsBusAccessFailed || fgTimeout || wlanIsChipNoAck(prAdapter))) { if ((prAdapter->u4OwnFailedCount == 0) || CHECK_FOR_TIMEOUT(u4CurrTick, prAdapter->rLastOwnFailedLogTime, MSEC_TO_SYSTIME(LP_OWN_BACK_FAILED_LOG_SKIP_MS))) { DBGLOG(INIT, ERROR, ("LP cannot be own back, Timeout[%u](%ums), BusAccessError[%u], Reseting[%u], CardRemoved[%u] NoAck[%u] Cnt[%u]\n", fgTimeout, kalGetTimeTick() - u4CurrTick, fgIsBusAccessFailed, kalIsResetting(), kalIsCardRemoved(prAdapter->prGlueInfo), wlanIsChipNoAck(prAdapter), prAdapter->u4OwnFailedCount)); DBGLOG(INIT, INFO, ("Skip LP own back failed log for next %ums\n", LP_OWN_BACK_FAILED_LOG_SKIP_MS)); prAdapter->u4OwnFailedLogCount++; if(prAdapter->u4OwnFailedLogCount > LP_OWN_BACK_FAILED_RESET_CNT) { /* Trigger RESET */ #if CFG_CHIP_RESET_SUPPORT glResetTrigger(prAdapter); #endif } GET_CURRENT_SYSTIME(&prAdapter->rLastOwnFailedLogTime); } prAdapter->u4OwnFailedCount++; fgStatus = FALSE; break; } else { if ((i & (LP_OWN_BACK_CLR_OWN_ITERATION - 1)) == 0) { /* Software get LP ownership - per 256 iterations */ HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR); } /* Delay for LP engine to complete its operation. */ kalMsleep(LP_OWN_BACK_LOOP_DELAY_MS); i++; } } return fgStatus; }