Пример #1
0
/**************************************************************
 * 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);
    }
}
Пример #2
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);
    }
Пример #3
0
/*
 * 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);
    }