source: trunk/package/madwifi/patches/414-txpower.patch @ 17687

Last change on this file since 17687 was 17687, checked in by nbd, 7 years ago

madwifi: fix maximum txpower display

File size: 9.3 KB
  • net80211/ieee80211.c

    a b ieee80211_ifattach(struct ieee80211com * 
    270270                ("invalid number of channels specified: %u", ic->ic_nchans)); 
    271271        memset(ic->ic_chan_avail, 0, sizeof(ic->ic_chan_avail)); 
    272272        ic->ic_modecaps |= 1 << IEEE80211_MODE_AUTO; 
     273        ic->ic_max_txpower = IEEE80211_TXPOWER_MIN; 
    273274 
    274275        for (i = 0; i < ic->ic_nchans; i++) { 
    275276                c = &ic->ic_channels[i]; 
    ieee80211_ifattach(struct ieee80211com * 
    277278                KASSERT(c->ic_ieee < IEEE80211_CHAN_MAX, 
    278279                        ("channel with bogus ieee number %u", c->ic_ieee)); 
    279280                setbit(ic->ic_chan_avail, c->ic_ieee); 
     281                ic->ic_max_txpower = max(ic->ic_max_txpower, (u16) (c->ic_maxpower * 2)); 
    280282 
    281283                if (c->ic_scanflags & IEEE80211_NOSCAN_DEFAULT) 
    282284                        c->ic_scanflags |= IEEE80211_NOSCAN_SET; 
    ieee80211_ifattach(struct ieee80211com * 
    346348        TAILQ_INIT(&ic->ic_vaps); 
    347349 
    348350        ic->ic_txpowlimit = IEEE80211_TXPOWER_MAX; 
    349         ic->ic_txpowlimit = IEEE80211_TXPOWER_MIN; 
    350         ic->ic_newtxpowlimit = IEEE80211_TXPOWER_MAX; 
    351351 
    352352        init_timer(&ic->ic_dfs_excl_timer); 
    353353        ic->ic_dfs_excl_timer.function =  
  • net80211/ieee80211_node.c

    a b ieee80211_alloc_node(struct ieee80211vap 
    11251125 
    11261126                ni->ni_chan = IEEE80211_CHAN_ANYC; 
    11271127                ni->ni_authmode = IEEE80211_AUTH_OPEN; 
    1128                 ni->ni_txpower = ic->ic_txpowlimit; 
     1128                ni->ni_txpower = IEEE80211_TXPOWER_MAX; 
    11291129 
    11301130                ieee80211_crypto_resetkey(vap, &ni->ni_ucastkey, 
    11311131                        IEEE80211_KEYIX_NONE); 
  • net80211/ieee80211_var.h

    a b struct ieee80211com { 
    343343        u_int16_t ic_holdover;                  /* PM hold over duration */ 
    344344        u_int16_t ic_bmissthreshold;            /* beacon miss threshold (# beacons) */ 
    345345        unsigned long ic_bmiss_guard;           /* when to cease ignoring bmiss (jiffies) */ 
    346         u_int16_t ic_txpowlimit;                /* global tx power limit (in 0.5 dBm) */ 
    347         u_int16_t ic_newtxpowlimit;             /* tx power limit to change to (in 0.5 dBm) */ 
     346        u_int16_t ic_txpowlimit;                /* configured global tx power limit (in 0.5 dBm) */ 
     347        u_int16_t ic_max_txpower;                       /* global hardware tx power limit */ 
    348348        u_int16_t ic_uapsdmaxtriggers;          /* max triggers that could arrive */ 
    349349        u_int8_t ic_coverageclass;              /* coverage class */ 
    350350        u_int8_t ic_protmode_rssi;                      /* rssi threshold for protection mode */ 
  • net80211/ieee80211_wireless.c

    a b ieee80211_ioctl_giwessid(struct net_devi 
    908908        return 0; 
    909909} 
    910910 
     911static u16 
     912ieee80211_get_maxtxpow(struct ieee80211com *ic) 
     913{ 
     914        u_int16_t txp = IEEE80211_TXPOWER_MAX; 
     915 
     916        if (ic->ic_bsschan && (ic->ic_bsschan != IEEE80211_CHAN_ANYC)) 
     917                txp = min(txp, (u16) ic->ic_bsschan->ic_maxpower); 
     918 
     919        if (ic->ic_max_txpower > 0) 
     920                txp = min(txp, ic->ic_max_txpower); 
     921 
     922        return txp; 
     923} 
     924 
     925 
    911926static int 
    912927ieee80211_ioctl_giwrange(struct net_device *dev, struct iw_request_info *info, 
    913928        struct iw_point *data, char *extra) 
    ieee80211_ioctl_giwrange(struct net_devi 
    920935        u_int8_t reported[IEEE80211_CHAN_BYTES];        /* XXX stack usage? */ 
    921936        int i, r; 
    922937        int step = 0; 
     938        u_int16_t power; 
    923939 
    924940        data->length = sizeof(struct iw_range); 
    925941        memset(range, 0, sizeof(struct iw_range)); 
    926942 
     943        power = ieee80211_get_maxtxpow(ic); 
     944 
    927945        /* txpower (128 values, but will print out only IW_MAX_TXPOWER) */ 
    928         range->num_txpower = (ic->ic_txpowlimit >= 8) ? IW_MAX_TXPOWER : ic->ic_txpowlimit; 
    929         step = ic->ic_txpowlimit / (2 * (IW_MAX_TXPOWER - 1)); 
     946        power /= 2; /* Unit: 0.5 dBm */ 
     947        range->num_txpower = (power >= 8) ? IW_MAX_TXPOWER : power; 
     948        step = power / (IW_MAX_TXPOWER - 1); 
    930949 
    931950        range->txpower[0] = 0; 
    932951        for (i = 1; i < IW_MAX_TXPOWER; i++) 
    933                 range->txpower[i] = (ic->ic_txpowlimit/2) 
     952                range->txpower[i] = power 
    934953                        - (IW_MAX_TXPOWER - i - 1) * step; 
    935954 
    936955        range->txpower_capa = IW_TXPOW_DBM; 
    ieee80211_ioctl_siwtxpow(struct net_devi 
    13791398        int fixed, disabled; 
    13801399 
    13811400        fixed = (ic->ic_flags & IEEE80211_F_TXPOW_FIXED); 
    1382         disabled = (fixed && vap->iv_bss->ni_txpower == 0); 
     1401        disabled = (fixed && ic->ic_txpowlimit == 0); 
    13831402        if (rrq->disabled) { 
    13841403                if (!disabled) { 
    1385                         if ((ic->ic_caps & IEEE80211_C_TXPMGT) == 0) 
    1386                                 return -EOPNOTSUPP; 
    13871404                        ic->ic_flags |= IEEE80211_F_TXPOW_FIXED; 
    1388                         vap->iv_bss->ni_txpower = 0; 
     1405                        ic->ic_txpowlimit = 0; 
    13891406                        goto done; 
    13901407                } 
    13911408                return 0; 
    ieee80211_ioctl_siwtxpow(struct net_devi 
    13961413                        return -EOPNOTSUPP; 
    13971414                if (rrq->flags != IW_TXPOW_DBM) 
    13981415                        return -EINVAL; 
    1399                 if (ic->ic_bsschan != IEEE80211_CHAN_ANYC) { 
    1400                         if ((ic->ic_bsschan->ic_maxregpower >= rrq->value) && 
    1401                             (ic->ic_txpowlimit/2 >= rrq->value)) { 
    1402                                 vap->iv_bss->ni_txpower = 2 * rrq->value; 
    1403                                 ic->ic_newtxpowlimit = 2 * rrq->value; 
    1404                                 ic->ic_flags |= IEEE80211_F_TXPOW_FIXED; 
    1405                         } else 
    1406                                 return -EINVAL; 
    1407                 } else { 
    1408                         /* 
    1409                          * No channel set yet 
    1410                          */ 
    1411                         if (ic->ic_txpowlimit/2 >= rrq->value) { 
    1412                                 vap->iv_bss->ni_txpower = 2 * rrq->value; 
    1413                                 ic->ic_newtxpowlimit = 2 * rrq->value; 
    1414                                 ic->ic_flags |= IEEE80211_F_TXPOW_FIXED; 
    1415                         } 
    1416                         else 
    1417                                 return -EINVAL; 
    1418                 } 
     1416                ic->ic_txpowlimit = 2 * rrq->value; 
     1417                ic->ic_flags |= IEEE80211_F_TXPOW_FIXED; 
    14191418        } else { 
    14201419                if (!fixed)             /* no change */ 
    14211420                        return 0; 
    1422                 ic->ic_newtxpowlimit = IEEE80211_TXPOWER_MAX; 
     1421                ic->ic_txpowlimit = IEEE80211_TXPOWER_MAX; 
    14231422                ic->ic_flags &= ~IEEE80211_F_TXPOW_FIXED; 
    14241423        } 
    14251424done: 
    ieee80211_ioctl_giwtxpow(struct net_devi 
    15881587{ 
    15891588        struct ieee80211vap *vap = dev->priv; 
    15901589        struct ieee80211com *ic = vap->iv_ic; 
    1591  
    1592         rrq->value = vap->iv_bss->ni_txpower / 2; 
    1593         rrq->fixed = (ic->ic_flags & IEEE80211_F_TXPOW_FIXED) != 0; 
     1590        unsigned int power = ic->ic_txpowlimit; 
     1591        struct ieee80211_channel *c; 
     1592        u_int16_t txp; 
     1593 
     1594        txp = ieee80211_get_maxtxpow(ic); 
     1595        if (ic->ic_flags & IEEE80211_F_TXPOW_FIXED) { 
     1596                txp = min(txp, ic->ic_txpowlimit); 
     1597                rrq->fixed = 1; 
     1598        } else { 
     1599                rrq->fixed = 0; 
     1600        } 
     1601        rrq->value = txp / 2; 
    15941602        rrq->disabled = (rrq->fixed && rrq->value == 0); 
    15951603        rrq->flags = IW_TXPOW_DBM; 
    15961604        return 0; 
  • ath/if_ath.c

    a b static unsigned int ath_dump_hal_map(str 
    380380static u_int32_t ath_get_clamped_maxtxpower(struct ath_softc *sc); 
    381381static u_int32_t ath_set_clamped_maxtxpower(struct ath_softc *sc,  
    382382                u_int32_t new_clamped_maxtxpower); 
    383 static u_int32_t ath_get_real_maxtxpower(struct ath_softc *sc); 
    384383 
    385384static void ath_poll_disable(struct net_device *dev); 
    386385static void ath_poll_enable(struct net_device *dev); 
    ath_tx_startraw(struct net_device *dev,  
    31683167        try0 = ph->try0; 
    31693168        rt = sc->sc_currates; 
    31703169        txrate = dot11_to_ratecode(sc, rt, ph->rate0); 
    3171         power = ph->power > 60 ? 60 : ph->power; 
     3170        power = ph->power > 63 ? 63 : ph->power; 
    31723171        hdrlen = ieee80211_anyhdrsize(wh); 
    31733172        pktlen = skb->len + IEEE80211_CRC_LEN; 
    31743173 
    ath_tx_start(struct net_device *dev, str 
    83948393                            pktlen,                     /* packet length */ 
    83958394                            hdrlen,                     /* header length */ 
    83968395                            atype,                      /* Atheros packet type */ 
    8397                             MIN(ni->ni_txpower, 60),    /* txpower */ 
     8396                            MIN(ni->ni_txpower, 63),    /* txpower */ 
    83988397                            txrate, try0,               /* series 0 rate/tries */ 
    83998398                            keyix,                      /* key cache index */ 
    84008399                            antenna,                    /* antenna mode */ 
    ath_get_clamped_maxtxpower(struct ath_so 
    1038710386 
    1038810387/* XXX: this function needs some locking to avoid being called  
    1038910388 * twice/interrupted */ 
    10390 /* 1. Save the currently specified maximum txpower (as clamped by madwifi) 
    10391  * 2. Determine the real maximum txpower the card can support by 
    10392  *    setting a value that exceeds the maximum range (by one) and 
    10393  *    finding out what it limits us to. 
    10394  * 3. Restore the saved maxtxpower value we had previously specified */ 
    10395 static u_int32_t 
    10396 ath_get_real_maxtxpower(struct ath_softc *sc) 
    10397 { 
    10398         u_int32_t saved_clamped_maxtxpower; 
    10399         u_int32_t real_maxtxpower; 
    10400  
    10401         saved_clamped_maxtxpower = ath_get_clamped_maxtxpower(sc); 
    10402         real_maxtxpower =  
    10403                 ath_set_clamped_maxtxpower(sc, IEEE80211_TXPOWER_MAX + 1); 
    10404         ath_set_clamped_maxtxpower(sc, saved_clamped_maxtxpower); 
    10405         return real_maxtxpower; 
    10406 } 
    10407  
    10408  
    10409 /* XXX: this function needs some locking to avoid being called  
    10410  * twice/interrupted */ 
    1041110389static void 
    1041210390ath_update_txpow(struct ath_softc *sc) 
    1041310391{ 
    1041410392        struct ieee80211com *ic = &sc->sc_ic; 
    1041510393        struct ieee80211vap *vap = NULL; 
    1041610394        struct ath_hal *ah = sc->sc_ah; 
    10417         u_int32_t prev_clamped_maxtxpower = 0; 
    10418         u_int32_t new_clamped_maxtxpower = 0; 
    1041910395 
    1042010396        /* Determine the previous value of maxtxpower */ 
    10421         prev_clamped_maxtxpower = ath_get_clamped_maxtxpower(sc); 
    10422         /* Determine the real maximum txpower the card can support */ 
    10423         ic->ic_txpowlimit = ath_get_real_maxtxpower(sc); 
    10424         /* Grab the new maxtxpower setting (which may have changed) */ 
    10425         new_clamped_maxtxpower = ic->ic_newtxpowlimit; 
    10426         /* Make sure the change is within limits, clamp it otherwise */ 
    10427         if (ic->ic_newtxpowlimit > ic->ic_txpowlimit) 
    10428                 new_clamped_maxtxpower = ic->ic_txpowlimit; 
    10429         /* Search for the VAP that needs a txpow change, if any */ 
    10430         TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) { 
    10431                 if (!tpc || ic->ic_newtxpowlimit != vap->iv_bss->ni_txpower) { 
    10432                         vap->iv_bss->ni_txpower = new_clamped_maxtxpower; 
    10433                         ieee80211_iterate_nodes(&vap->iv_ic->ic_sta,  
    10434                                         set_node_txpower,  
    10435                                         &new_clamped_maxtxpower); 
    10436                 } 
    10437         } 
    10438  
    10439         /* Store the assigned (clamped) maximum txpower and update the HAL */ 
    10440         sc->sc_curtxpow = new_clamped_maxtxpower; 
    10441         if (new_clamped_maxtxpower != prev_clamped_maxtxpower) 
    10442                 ath_hal_settxpowlimit(ah, new_clamped_maxtxpower); 
     10397        ath_set_clamped_maxtxpower(sc, ic->ic_txpowlimit); 
     10398        ic->ic_max_txpower = ath_get_clamped_maxtxpower(sc); 
    1044310399} 
    1044410400 
    1044510401#ifdef ATH_SUPERG_XR 
Note: See TracBrowser for help on using the repository browser.