Fix Array Out of Bounds in rcSibUpdate_ht()
[open-ath9k-htc-firmware.git] / target_firmware / wlan / ratectrl_11n_ln.c
index de8655016d2761327c8b6c63b7771795d40a38a6..de10a2757055ccd91d232d1f1aea07560165be1c 100755 (executable)
@@ -47,7 +47,6 @@
 #include <adf_os_atomic.h>
 #include <adf_nbuf.h>
 #include <adf_net.h>
-#include <adf_net_types.h>
 
 #include <ieee80211_var.h>
 
@@ -57,8 +56,6 @@
 #include "ratectrl.h"
 #include "ratectrl11n.h"
 
-INLINE A_RSSI median(A_RSSI a, A_RSSI b, A_RSSI c);
-
 static void ath_rate_newassoc_11n(struct ath_softc_tgt *sc, struct ath_node_target *an, int isnew, 
                                  unsigned int capflag, struct ieee80211_rate *rs);
 
@@ -123,13 +120,6 @@ rcSetValidTxMask(TX_RATE_CTRL *pRc, A_UINT8 index, A_BOOL validTxRate)
 
 }
 
-static INLINE A_BOOL
-rcIsValidTxMask(TX_RATE_CTRL *pRc, A_UINT8 index)
-{
-       ASSERT(index < pRc->rateTableSize);
-       return (pRc->validRateIndex[index]);
-}
-
 /* Iterators for validTxRateMask */
 static INLINE A_BOOL
 rcGetNextValidTxRate(const RATE_TABLE_11N *pRateTable, TX_RATE_CTRL *pRc, 
@@ -379,7 +369,7 @@ rcSibUpdate_ht(struct ath_softc_tgt *sc, struct ath_node_target *an,
        rcInitValidTxMask(pRc);
 
        for (i = 0; i < WLAN_RC_PHY_MAX; i++) {
-               for (j = 0; j < MAX_TX_RATE_PHY; j++) {
+               for (j = 0; j < MAX_TX_RATE_TBL; j++) {
                        mPhyCtrlState.validPhyRateIndex[i][j] = 0;
                }   
                mPhyCtrlState.validPhyRateCount[i] = 0;
@@ -429,45 +419,6 @@ rcSibUpdate_ht(struct ath_softc_tgt *sc, struct ath_node_target *an,
        rcSortValidRates(pRateTable, pRc);
 }
 
-void 
-rcSibUpdate_11n(struct ath_softc_tgt *sc, struct ath_node_target *pSib, 
-               A_UINT32 capflag, A_BOOL keepState, struct ieee80211_rate  *pRateSet)
-{
-       rcSibUpdate_ht(sc, 
-                      pSib, 
-                      ((capflag & ATH_RC_DS_FLAG)   ? WLAN_RC_DS_FLAG  : 0) |
-                      ((capflag & ATH_RC_HT40_SGI_FLAG)  ? WLAN_RC_HT40_SGI_FLAG : 0) | 
-                      ((capflag & ATH_RC_HT_FLAG)   ? WLAN_RC_HT_FLAG  : 0) |
-                      ((capflag & ATH_RC_CW40_FLAG) ? WLAN_RC_40_FLAG  : 0) |
-                      ((capflag & ATH_RC_TX_STBC_FLAG)   ? WLAN_RC_STBC_FLAG  : 0), 
-                      keepState,
-                      pRateSet);
-}
-
-/*
- * Return the median of three numbers
- */
-INLINE A_RSSI median(A_RSSI a, A_RSSI b, A_RSSI c)
-{
-       if (a >= b) {
-               if (b >= c) {
-                       return b;
-               } else if (a > c) {
-                       return c;
-               } else {
-                       return a;
-               }
-       } else {
-               if (a >= c) {
-                       return a;
-               } else if (b >= c) {
-                       return c;
-               } else {
-                       return b;
-               }
-       }
-}
-
 static A_UINT8
 rcRateFind_ht(struct ath_softc_tgt *sc, struct atheros_node *pSib,
              const RATE_TABLE_11N *pRateTable, A_BOOL probeAllowed, A_BOOL *isProbing)
@@ -1089,12 +1040,6 @@ ath_rate_attach(struct ath_softc_tgt *sc)
        return &asc->arc;
 }
 
-void
-ath_rate_detach(struct ath_ratectrl *rc)
-{
-       adf_os_mem_free(rc);
-}
-
 void
 ath_rate_findrate(struct ath_softc_tgt *sc,
                   struct ath_node_target *an,
@@ -1211,58 +1156,11 @@ ath_rate_newassoc_11n(struct ath_softc_tgt *sc, struct ath_node_target *an, int
                      unsigned int capflag, struct ieee80211_rate *rs)
 {
        if (isnew) {
-               struct atheros_node *oan = ATH_NODE_ATHEROS(an);
-
-               oan->htcap = ((capflag & ATH_RC_DS_FLAG) ? WLAN_RC_DS_FLAG : 0) |
-                       ((capflag & ATH_RC_HT40_SGI_FLAG) ? WLAN_RC_HT40_SGI_FLAG : 0) | 
-                       ((capflag & ATH_RC_HT_FLAG)  ? WLAN_RC_HT_FLAG : 0) |
-                       ((capflag & ATH_RC_CW40_FLAG) ? WLAN_RC_40_FLAG : 0) |
-                       ((capflag & ATH_RC_WEP_TKIP_FLAG) ? WLAN_RC_WEP_TKIP_FLAG : 0);    
-    
 #ifdef MAGPIE_MERLIN
-               /* Rx STBC is a 2-bit mask. Needs to convert from ath definition to wlan definition. */
-        
-               oan->htcap |= (((capflag & ATH_RC_RX_STBC_FLAG) >> ATH_RC_RX_STBC_FLAG_S)
-                              << WLAN_RC_STBC_FLAG_S);
-                       
-               /* If only one chain is enabled, do not do stbc. */
-               if (sc->sc_txstbcsupport) {
-                       oan->stbc = (capflag & ATH_RC_RX_STBC_FLAG) >> ATH_RC_RX_STBC_FLAG_S;
-               } else {
-                       oan->stbc = 0;
-               }
-        
+               struct atheros_node *oan = ATH_NODE_ATHEROS(an);
+               /* Only MERLIN can send STBC */
+               oan->stbc = (capflag & ATH_RC_TX_STBC_FLAG) ? 1 : 0;
 #endif
-               rcSibUpdate_11n(sc, an, oan->htcap, 0, rs);
-       }
-}
-
-void ath_rate_mcs2rate(struct ath_softc_tgt *sc,a_uint8_t sgi, a_uint8_t ht40, 
-                      a_uint8_t rateCode, a_uint32_t *txrate, a_uint32_t *rxrate)
-{
-       int idx;
-       struct atheros_softc *asc = (struct atheros_softc*)sc->sc_rc;
-       RATE_TABLE_11N *pRateTable = (RATE_TABLE_11N *)asc->hwRateTable[sc->sc_curmode];
-       a_uint32_t rateKbps = 0;
-   
-       *txrate = asc->currentTxRateKbps;
-
-       /* look  11NA table for rateKbps*/
-       for (idx = 0; idx < pRateTable->rateCount && !rateKbps; ++idx) {   
-               if (pRateTable->info[idx].rateCode == rateCode) {
-                       if(ht40 && sgi) {
-                               if(pRateTable->info[idx].valid == TRUE_40 &&
-                                  pRateTable->info[idx].phy == WLAN_RC_PHY_HT_40_DS_HGI)
-                                       rateKbps = pRateTable->info[idx].rateKbps;
-                       } else if (ht40) {
-                               if (pRateTable->info[idx].valid == TRUE_40)/* HT40 only*/
-                                       rateKbps = pRateTable->info[idx].rateKbps;
-                       } else { 
-                               if (pRateTable->info[idx].valid != FALSE)
-                                       rateKbps = pRateTable->info[idx].rateKbps;
-                       }
-               }
+               rcSibUpdate_ht(sc, an, capflag, 0, rs);
        }
-    
-       *rxrate = rateKbps;
 }