/************************************************************** * ar5212SetupGrpPollChain * * Fills in the control fields of the group poll desc chain * * Assumes: frameLen does not include the FCS */ void ar5212SetupGrpPollChain(WLAN_DEV_INFO* pDev, ATHEROS_DESC *pHead, ATHEROS_DESC *pTail, A_UINT32 hwIndex) { VPORT_BSS *pVportXrBss = GET_XR_BSS(pDev); OP_BSS *pOpBss; AR5212_TX_CONTROL *pTxControl; ATHEROS_DESC *pDesc; if (!isXrAp(pDev)) { return; } ASSERT(pVportXrBss); pOpBss = &pVportXrBss->bss; for (pDesc = pHead; pDesc != pTail; pDesc = pDesc->pNextVirtPtr) { pTxControl = TX_CONTROL(pDesc); pTxControl->transmitPwrCtrl = MAX_RATE_POWER; pTxControl->clearDestMask = (pDesc == pHead); pTxControl->destIdxValid = (hwIndex != HWINDEX_INVALID); pTxControl->destIdx = hwIndex; pTxControl->antModeXmit = 0; pTxControl->TXRate0 = pOpBss->pRateTable->info[pOpBss->defaultRateIndex].rateCode; pTxControl->TXDataTries0 = 1; pTxControl->PktType = HAL_DESC_PKT_TYPE_GRP_POLL; pTxControl->CTSEnable = 1; pTxControl->RTSCTSRate = XR_CTS_RATE(pDev); pTxControl->RTSCTSDur = XR_UPLINK_TRANSACTION_TIME(pDev); } pTxControl = TX_CONTROL(pTail); pTxControl->transmitPwrCtrl = MAX_RATE_POWER; pTxControl->clearDestMask = 1; pTxControl->destIdxValid = (hwIndex != HWINDEX_INVALID); pTxControl->destIdx = hwIndex; pTxControl->antModeXmit = 0; pTxControl->PktType = HAL_DESC_PKT_TYPE_NORMAL; pTxControl->TXRate0 = XR_CTS_RATE(pDev); pTxControl->TXDataTries0 = 1; pTxControl->noAck = 1; pTxControl->VEOL = 1; pTail->nextPhysPtr = pHead->thisPhysPtr; /* * when compression is enabled, swSwapDesc is set (due to hardware * bug 7740). This is why the group polls also need to swap the * descriptions in software and not rely on hardware */ if (pDev->pHalInfo->swSwapDesc) { ar5212SwapHwDesc(pDev, pHead, pTail, 0); } }
/* * Determines and returns the new Tx rate index. */ A_UINT16 rcRateFind(struct ath_softc *sc, struct atheros_node *pSib, A_UINT32 frameLen, const RATE_TABLE *pRateTable, HAL_CHANNEL *curchan, int isretry) { #ifdef notyet WLAN_STA_CONFIG *pConfig = &pdevInfo->staConfig; VPORT_BSS *pVportXrBss = GET_XR_BSS(pdevInfo); WLAN_DATA_MAC_HEADER *pHdr = pDesc->pBufferVirtPtr.header; #endif struct TxRateCtrl_s *pRc; A_UINT32 dt; A_UINT32 bestThruput,thisThruput = 0; A_UINT32 nowMsec; A_UINT8 rate, nextRate, bestRate; A_RSSI rssiLast, rssiReduce; #if ATH_SUPERG_DYNTURBO A_UINT8 currentPrimeState = IS_CHAN_TURBO(curchan); /* 0 = regular; 1 = turbo */ A_UINT8 primeInUse = sc->sc_dturbo; #else A_UINT8 primeInUse = 0; A_UINT8 currentPrimeState = 0; #endif #ifdef notyet A_UINT8 xrRateAdaptation = FALSE; #endif int isChanTurbo = FALSE; A_UINT8 maxIndex, minIndex; A_INT8 index; int isProbing = FALSE; /* have the real rate control logic kick in */ pRc = &pSib->txRateCtrl; #if ATH_SUPERG_DYNTURBO /* * Reset primeInUse state, if we are currently using XR * rate tables or if we have any clients associated in XR mode */ #ifdef notyet if ((pRateTable == sc->sc_rates[WLAN_MODE_XR]) || (isXrAp(sc) && (pVportXrBss->bss.numAssociatedClients > 0))) { currentPrimeState = 0; primeInUse = 0; } #endif /* make sure that rateMax is correct when using TURBO_PRIME tables */ if (currentPrimeState) { pRc->rateMax = pRateTable->rateCount - 1; } else { pRc->rateMax = pRateTable->rateCount - 1 - pRateTable->numTurboRates; } #endif /* ATH_SUPERG_DYNTURBO */ rssiLast = median(pRc->rssiLast, pRc->rssiLastPrev, pRc->rssiLastPrev2); rssiReduce = 0; /* * Age (reduce) last ack rssi based on how old it is. * The bizarre numbers are so the delta is 160msec, * meaning we divide by 16. * 0msec <= dt <= 25msec: don't derate * 25msec <= dt <= 185msec: derate linearly from 0 to 10dB * 185msec <= dt: derate by 10dB */ nowMsec = A_MS_TICKGET(); dt = nowMsec - pRc->rssiTime; if (dt >= 185) { rssiReduce = 10; } else if (dt >= 25) { rssiReduce = (A_UINT8)((dt - 25) >> 4); }
/* * Determines and returns the new Tx rate index. */ A_UINT16 rcRateFind(struct ath_softc *sc, struct atheros_node *pSib, A_UINT32 frameLen) { struct ieee80211com *ic = &sc->sc_ic; #ifdef notyet WLAN_STA_CONFIG *pConfig = &pdevInfo->staConfig; VPORT_BSS *pVportXrBss = GET_XR_BSS(pdevInfo); WLAN_DATA_MAC_HEADER *pHdr = pDesc->pBufferVirtPtr.header; #endif struct atheros_softc *asc = (struct atheros_softc *) sc->sc_rc; const RATE_TABLE *pRateTable = asc->hwRateTable[sc->sc_curmode]; struct TxRateCtrl_s *pRc; A_UINT32 dt; A_UINT32 bestThruput,thisThruput; A_UINT32 nowMsec; A_UINT8 rate, nextRate, bestRate; A_RSSI rssiLast, rssiReduce; #if TURBO_PRIME A_UINT8 primeInUse = sc->sc_dturbo; //A_UINT8 currentPrimeState = ((ic->ic_ath_cap & IEEE80211_ATHC_BOOST) > 0) ; A_UINT8 currentPrimeState = ((sc->sc_curmode == IEEE80211_MODE_TURBO_A) || (sc->sc_curmode == IEEE80211_MODE_TURBO_G)) ; /* 0 = regular; 1 = turbo */ #else A_UINT8 primeInUse = 0; A_UINT8 currentPrimeState = 0; #endif #ifdef notyet A_UINT8 xrRateAdaptation = FALSE; #endif A_BOOL isChanTurbo = FALSE; A_UINT8 maxIndex, minIndex; A_INT8 index; A_BOOL isProbing = FALSE; /* have the real rate control logic kick in */ pRc = &pSib->txRateCtrl; #if TURBO_PRIME /* * Reset primeInUse state, if we are currently using XR * rate tables or if we have any clients associated in XR mode */ #ifdef notyet if ((pRateTable == sc->sc_rates[WLAN_MODE_XR]) || (isXrAp(sc) && (pVportXrBss->bss.numAssociatedClients > 0))) { primeInUse = 0; } #endif #endif /* make sure that rateMax is correct when in TURBO_PRIME mode */ if (primeInUse) { if (currentPrimeState == 1) { pRc->rateMax = pRateTable->rateCount - 1; } else if (currentPrimeState == 0) { pRc->rateMax = pRateTable->rateCount - 1 - pRateTable->numTurboRates; } } rssiLast = median(pRc->rssiLast, pRc->rssiLastPrev, pRc->rssiLastPrev2); rssiReduce = 0; /* * Age (reduce) last ack rssi based on how old it is. * The bizarre numbers are so the delta is 160msec, * meaning we divide by 16. * 0msec <= dt <= 25msec: don't derate * 25msec <= dt <= 185msec: derate linearly from 0 to 10dB * 185msec <= dt: derate by 10dB */ nowMsec = A_MS_TICKGET(); dt = nowMsec - pRc->rssiTime; if (dt >= 185) { rssiReduce = 10; } else if (dt >= 25) { rssiReduce = (A_UINT8)((dt - 25) >> 4); }