void ath_rate_tx_complete(struct ath_softc_tgt *sc, struct ath_node_target *an, struct ath_tx_desc *ds, struct ath_rc_series rcs[], int nframes, int nbad) { struct atheros_softc *asc = (struct atheros_softc *) sc->sc_rc; const RATE_TABLE *pRateTable = (RATE_TABLE *)asc->hwRateTable[sc->sc_curmode]; u_int8_t txRate = ds->ds_txstat.ts_rate &~ HAL_TXSTAT_ALTRATE; ath_rate_tx_complete_11n(sc, an, ds, rcs, nframes, nbad); }
void ath_rate_tx_complete(struct ath_softc *sc, struct ath_node *an, struct ath_desc *ds, struct ath_rc_series rcs[], u_int8_t ac, int nframes, int nbad, int rts_retry_limit) #endif { struct atheros_node *atn = an->an_rc_node; struct atheros_vap *avap = atn->avp; const RATE_TABLE *pRateTable = avap->rateTable; u_int8_t txRateCode = ds->ds_txstat.ts_ratecode; u_int8_t totalTries = 0; #if 0 int short_retry_fail = ds->ds_txstat.ts_shortretry ; #endif if (sc->sc_ah->ah_magic == 0x19641014 || sc->sc_ah->ah_magic == 0x19741014) { #ifdef ATH_SUPPORT_VOWEXT ath_rate_tx_complete_11n(sc, an, &ds->ds_txstat, rcs, ac, nframes, nbad, nHeadFail, nTailFail, rts_retry_limit); #else ath_rate_tx_complete_11n(sc, an, &ds->ds_txstat, rcs, ac, nframes, nbad, rts_retry_limit); #endif return; } if (pRateTable->rateCodeToIndex[txRateCode] == (u_int8_t) -1) { /* * This can happen, for example, when switching bands * and pending tx's are processed before the queue * is flushed (should fix mode switch to ensure this * does not happen). */ // DPRINTF(sc, "%s: no mapping for rate code 0x%x", // __func__, txRate); return; } #ifdef AH_SUPPORT_AR5212 if (ds->ds_txstat.ts_rateindex != 0) { const struct ar5212_desc *ads = AR5212DESC(ds); int finalTSIdx = MS(ads->ds_txstatus1, AR_FinalTSIndex); int series; /* * Process intermediate rates that failed. */ for (series = 0; series < finalTSIdx; series++) { int rate, tries; /* NB: we know series <= 2 */ switch (series) { case 0: rate = MS(ads->ds_ctl3, AR_XmitRate0); tries = MS(ads->ds_ctl2, AR_XmitDataTries0); break; case 1: rate = MS(ads->ds_ctl3, AR_XmitRate1); tries = MS(ads->ds_ctl2, AR_XmitDataTries1); break; default: rate = MS(ads->ds_ctl3, AR_XmitRate2); tries = MS(ads->ds_ctl2, AR_XmitDataTries2); break; } if (pRateTable->rateCodeToIndex[rate] != (u_int8_t) -1) { /* * This can happen, for example, when switching bands * and pending tx's are processed before the queue * is flushed (should fix mode switch to ensure this * does not happen). */ // DPRINTF(sc, "%s: no mapping for rate code 0x%x", // __func__, txRate); rcUpdate(atn , 2 // Huh? Indicates an intermediate rate failure. Should use a macro instead. , pRateTable->rateCodeToIndex[rate] , tries , ds->ds_txstat.ts_rssi , ds->ds_txstat.ts_antenna , pRateTable , sc->sc_opmode , sc->sc_diversity , sc->sc_setdefantenna , (void *)sc , 0 ); } /* Account for retries on intermediate rates */ totalTries += tries; } } #endif /* * Exclude intermediate rate retries, or the last rate, which may have * succeeded, will incur a penalty higher than the intermediate rates that * failed. */ rcUpdate(atn , (ds->ds_txstat.ts_status & HAL_TXERR_XRETRY) != 0 , pRateTable->rateCodeToIndex[txRateCode] , ds->ds_txstat.ts_longretry - totalTries , ds->ds_txstat.ts_rssi , ds->ds_txstat.ts_antenna , pRateTable , sc->sc_opmode , sc->sc_diversity , sc->sc_setdefantenna , (void *)sc , 0 ); #if 0 if (short_retry_fail == rts_retry_limit) { atn->txRateCtrl.consecRtsFailCount++; } else { atn->txRateCtrl.consecRtsFailCount = 0; } #else atn->txRateCtrl.consecRtsFailCount = 0; #endif }