source: trunk/package/mac80211/patches/591-ath9k_per_chain_signal_strength.patch @ 28384

Last change on this file since 28384 was 28384, checked in by nbd, 5 years ago

ath9k: add support for per-chain signal strength info

File size: 12.3 KB
  • include/net/mac80211.h

    a b enum mac80211_rx_flags { 
    666666 * @mactime: value in microseconds of the 64-bit Time Synchronization Function 
    667667 *      (TSF) timer when the first data symbol (MPDU) arrived at the hardware. 
    668668 * @band: the active band when this frame was received 
     669 * @chains: bitmask of receive chains for which separate signal strength 
     670 *      values were filled. 
     671 * @chain_signal: per-chain signal strength, same format as @signal 
    669672 * @freq: frequency the radio was tuned to when receiving this frame, in MHz 
    670673 * @signal: signal strength when receiving this frame, either in dBm, in dB or 
    671674 *      unspecified depending on the hardware capabilities flags 
    enum mac80211_rx_flags { 
    679682struct ieee80211_rx_status { 
    680683        u64 mactime; 
    681684        enum ieee80211_band band; 
     685 
     686        u8 chains; 
     687        s8 chain_signal[4]; 
     688 
    682689        int freq; 
    683690        int signal; 
    684691        int antenna; 
  • net/mac80211/sta_info.h

    a b struct sta_info { 
    292292        unsigned long rx_dropped; 
    293293        int last_signal; 
    294294        struct ewma avg_signal; 
     295 
     296        u8 chains; 
     297        s8 chain_signal_last[4]; 
     298        struct ewma chain_signal_avg[4]; 
     299 
    295300        /* Plus 1 for non-QoS frames */ 
    296301        __le16 last_seq_ctrl[NUM_RX_DATA_QUEUES + 1]; 
    297302 
  • net/mac80211/rx.c

    a b ieee80211_rx_h_sta_process(struct ieee80 
    11691169        struct sk_buff *skb = rx->skb; 
    11701170        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 
    11711171        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 
     1172        int i; 
    11721173 
    11731174        if (!sta) 
    11741175                return RX_CONTINUE; 
    ieee80211_rx_h_sta_process(struct ieee80 
    12111212        sta->last_signal = status->signal; 
    12121213        ewma_add(&sta->avg_signal, -status->signal); 
    12131214 
     1215        if (status->chains) { 
     1216                sta->chains = status->chains; 
     1217                for (i = 0; i < 4; i++) { 
     1218                        int signal = status->chain_signal[i]; 
     1219 
     1220                        if (!(status->chains & BIT(i))) 
     1221                                continue; 
     1222 
     1223                        sta->chain_signal_last[i] = signal; 
     1224                        ewma_add(&sta->chain_signal_avg[i], -signal); 
     1225                } 
     1226        } 
     1227 
    12141228        /* 
    12151229         * Change STA power saving mode only at the end of a frame 
    12161230         * exchange sequence. 
  • net/mac80211/sta_info.c

    a b struct sta_info *sta_info_alloc(struct i 
    295295        do_posix_clock_monotonic_gettime(&uptime); 
    296296        sta->last_connected = uptime.tv_sec; 
    297297        ewma_init(&sta->avg_signal, 1024, 8); 
     298        for (i = 0; i < ARRAY_SIZE(sta->chain_signal_avg); i++) 
     299                ewma_init(&sta->chain_signal_avg[i], 1024, 8); 
    298300 
    299301        if (sta_prepare_rate_control(local, sta, gfp)) { 
    300302                kfree(sta); 
  • include/net/cfg80211.h

    a b struct station_parameters { 
    481481 * @STATION_INFO_BSS_PARAM: @bss_param filled 
    482482 * @STATION_INFO_CONNECTED_TIME: @connected_time filled 
    483483 * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled 
     484 * @STATION_INFO_CHAIN_SIGNAL: @chain_signal filled 
     485 * @STATION_INFO_CHAIN_SIGNAL_AVG: @chain_signal_avg filled 
    484486 */ 
    485487enum station_info_flags { 
    486488        STATION_INFO_INACTIVE_TIME      = 1<<0, 
    enum station_info_flags { 
    500502        STATION_INFO_RX_BITRATE         = 1<<14, 
    501503        STATION_INFO_BSS_PARAM          = 1<<15, 
    502504        STATION_INFO_CONNECTED_TIME     = 1<<16, 
    503         STATION_INFO_ASSOC_REQ_IES      = 1<<17 
     505        STATION_INFO_ASSOC_REQ_IES      = 1<<17, 
     506        STATION_INFO_CHAIN_SIGNAL       = 1<<18, 
     507        STATION_INFO_CHAIN_SIGNAL_AVG   = 1<<19, 
    504508}; 
    505509 
    506510/** 
    struct sta_bss_parameters { 
    580584 * @plink_state: mesh peer link state 
    581585 * @signal: signal strength of last received packet in dBm 
    582586 * @signal_avg: signal strength average in dBm 
     587 * @chains: bitmask for filled values in @chain_signal, @chain_signal_avg 
     588 * @chain_signal: per-chain signal strength of last received packet in dBm 
     589 * @chain_signal_avg: per-chain signal strength average in dBm 
    583590 * @txrate: current unicast bitrate from this station 
    584591 * @rxrate: current unicast bitrate to this station 
    585592 * @rx_packets: packets received from this station 
    struct station_info { 
    609616        u8 plink_state; 
    610617        s8 signal; 
    611618        s8 signal_avg; 
     619 
     620        u8 chains; 
     621        s8 chain_signal[4]; 
     622        s8 chain_signal_avg[4]; 
     623 
    612624        struct rate_info txrate; 
    613625        struct rate_info rxrate; 
    614626        u32 rx_packets; 
  • drivers/net/wireless/ath/ath9k/mac.h

    a b struct ath_rx_status { 
    133133        u8 rs_rate; 
    134134        u8 rs_antenna; 
    135135        u8 rs_more; 
    136         int8_t rs_rssi_ctl0; 
    137         int8_t rs_rssi_ctl1; 
    138         int8_t rs_rssi_ctl2; 
    139         int8_t rs_rssi_ext0; 
    140         int8_t rs_rssi_ext1; 
    141         int8_t rs_rssi_ext2; 
     136        int8_t rs_rssi_ctl[3]; 
     137        int8_t rs_rssi_ext[3]; 
    142138        u8 rs_isaggr; 
    143139        u8 rs_moreaggr; 
    144140        u8 rs_num_delims; 
  • drivers/net/wireless/ath/ath9k/recv.c

    a b static int ath9k_rx_skb_preprocess(struc 
    983983                                   bool *decrypt_error) 
    984984{ 
    985985        struct ath_hw *ah = common->ah; 
     986        int i, j; 
    986987 
    987988        memset(rx_status, 0, sizeof(struct ieee80211_rx_status)); 
    988989 
    static int ath9k_rx_skb_preprocess(struc 
    10081009        rx_status->antenna = rx_stats->rs_antenna; 
    10091010        rx_status->flag |= RX_FLAG_MACTIME_MPDU; 
    10101011 
     1012        for (i = 0, j = 0; i < ARRAY_SIZE(rx_stats->rs_rssi_ctl); i++) { 
     1013                s8 rssi; 
     1014 
     1015                if (!(ah->rxchainmask & BIT(i))) 
     1016                        continue; 
     1017 
     1018                rssi = rx_stats->rs_rssi_ctl[i]; 
     1019                if (rssi != ATH9K_RSSI_BAD) { 
     1020                    rx_status->chains |= BIT(j); 
     1021                    rx_status->chain_signal[j] = ah->noise + rssi; 
     1022                } 
     1023                j++; 
     1024        } 
     1025 
    10111026        return 0; 
    10121027} 
    10131028 
    static void ath_ant_comb_scan(struct ath 
    15381553        struct ath_ant_comb *antcomb = &sc->ant_comb; 
    15391554        int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set; 
    15401555        int curr_main_set; 
    1541         int main_rssi = rs->rs_rssi_ctl0; 
    1542         int alt_rssi = rs->rs_rssi_ctl1; 
     1556        int main_rssi = rs->rs_rssi_ctl[0]; 
     1557        int alt_rssi = rs->rs_rssi_ctl[1]; 
    15431558        int rx_ant_conf,  main_ant_conf; 
    15441559        bool short_scan = false; 
    15451560 
    1546         rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) & 
     1561        rx_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_CURRENT_SHIFT) & 
    15471562                       ATH_ANT_RX_MASK; 
    1548         main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) & 
     1563        main_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_MAIN_SHIFT) & 
    15491564                         ATH_ANT_RX_MASK; 
    15501565 
    15511566        /* Record packet only when both main_rssi and  alt_rssi is positive */ 
  • drivers/net/wireless/ath/ath9k/ar9003_mac.c

    a b int ath9k_hw_process_rxdesc_edma(struct  
    451451 
    452452        /* XXX: Keycache */ 
    453453        rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined); 
    454         rxs->rs_rssi_ctl0 = MS(rxsp->status1, AR_RxRSSIAnt00); 
    455         rxs->rs_rssi_ctl1 = MS(rxsp->status1, AR_RxRSSIAnt01); 
    456         rxs->rs_rssi_ctl2 = MS(rxsp->status1, AR_RxRSSIAnt02); 
    457         rxs->rs_rssi_ext0 = MS(rxsp->status5, AR_RxRSSIAnt10); 
    458         rxs->rs_rssi_ext1 = MS(rxsp->status5, AR_RxRSSIAnt11); 
    459         rxs->rs_rssi_ext2 = MS(rxsp->status5, AR_RxRSSIAnt12); 
     454        rxs->rs_rssi_ctl[0] = MS(rxsp->status1, AR_RxRSSIAnt00); 
     455        rxs->rs_rssi_ctl[1] = MS(rxsp->status1, AR_RxRSSIAnt01); 
     456        rxs->rs_rssi_ctl[2] = MS(rxsp->status1, AR_RxRSSIAnt02); 
     457        rxs->rs_rssi_ext[0] = MS(rxsp->status5, AR_RxRSSIAnt10); 
     458        rxs->rs_rssi_ext[1] = MS(rxsp->status5, AR_RxRSSIAnt11); 
     459        rxs->rs_rssi_ext[2] = MS(rxsp->status5, AR_RxRSSIAnt12); 
    460460 
    461461        if (rxsp->status11 & AR_RxKeyIdxValid) 
    462462                rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx); 
  • drivers/net/wireless/ath/ath9k/mac.c

    a b int ath9k_hw_rxprocdesc(struct ath_hw *a 
    558558 
    559559        if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) { 
    560560                rs->rs_rssi = ATH9K_RSSI_BAD; 
    561                 rs->rs_rssi_ctl0 = ATH9K_RSSI_BAD; 
    562                 rs->rs_rssi_ctl1 = ATH9K_RSSI_BAD; 
    563                 rs->rs_rssi_ctl2 = ATH9K_RSSI_BAD; 
    564                 rs->rs_rssi_ext0 = ATH9K_RSSI_BAD; 
    565                 rs->rs_rssi_ext1 = ATH9K_RSSI_BAD; 
    566                 rs->rs_rssi_ext2 = ATH9K_RSSI_BAD; 
     561                rs->rs_rssi_ctl[0] = ATH9K_RSSI_BAD; 
     562                rs->rs_rssi_ctl[1] = ATH9K_RSSI_BAD; 
     563                rs->rs_rssi_ctl[2] = ATH9K_RSSI_BAD; 
     564                rs->rs_rssi_ext[0] = ATH9K_RSSI_BAD; 
     565                rs->rs_rssi_ext[1] = ATH9K_RSSI_BAD; 
     566                rs->rs_rssi_ext[2] = ATH9K_RSSI_BAD; 
    567567        } else { 
    568568                rs->rs_rssi = MS(ads.ds_rxstatus4, AR_RxRSSICombined); 
    569                 rs->rs_rssi_ctl0 = MS(ads.ds_rxstatus0, 
     569                rs->rs_rssi_ctl[0] = MS(ads.ds_rxstatus0, 
    570570                                                AR_RxRSSIAnt00); 
    571                 rs->rs_rssi_ctl1 = MS(ads.ds_rxstatus0, 
     571                rs->rs_rssi_ctl[1] = MS(ads.ds_rxstatus0, 
    572572                                                AR_RxRSSIAnt01); 
    573                 rs->rs_rssi_ctl2 = MS(ads.ds_rxstatus0, 
     573                rs->rs_rssi_ctl[2] = MS(ads.ds_rxstatus0, 
    574574                                                AR_RxRSSIAnt02); 
    575                 rs->rs_rssi_ext0 = MS(ads.ds_rxstatus4, 
     575                rs->rs_rssi_ext[0] = MS(ads.ds_rxstatus4, 
    576576                                                AR_RxRSSIAnt10); 
    577                 rs->rs_rssi_ext1 = MS(ads.ds_rxstatus4, 
     577                rs->rs_rssi_ext[1] = MS(ads.ds_rxstatus4, 
    578578                                                AR_RxRSSIAnt11); 
    579                 rs->rs_rssi_ext2 = MS(ads.ds_rxstatus4, 
     579                rs->rs_rssi_ext[2] = MS(ads.ds_rxstatus4, 
    580580                                                AR_RxRSSIAnt12); 
    581581        } 
    582582        if (ads.ds_rxstatus8 & AR_RxKeyIdxValid) 
  • drivers/net/wireless/ath/ath9k/debug.c

    a b void ath_debug_stat_rx(struct ath_softc  
    10321032 
    10331033        spin_lock(&sc->debug.samp_lock); 
    10341034        RX_SAMP_DBG(jiffies) = jiffies; 
    1035         RX_SAMP_DBG(rssi_ctl0) = rs->rs_rssi_ctl0; 
    1036         RX_SAMP_DBG(rssi_ctl1) = rs->rs_rssi_ctl1; 
    1037         RX_SAMP_DBG(rssi_ctl2) = rs->rs_rssi_ctl2; 
    1038         RX_SAMP_DBG(rssi_ext0) = rs->rs_rssi_ext0; 
    1039         RX_SAMP_DBG(rssi_ext1) = rs->rs_rssi_ext1; 
    1040         RX_SAMP_DBG(rssi_ext2) = rs->rs_rssi_ext2; 
     1035        RX_SAMP_DBG(rssi_ctl0) = rs->rs_rssi_ctl[0]; 
     1036        RX_SAMP_DBG(rssi_ctl1) = rs->rs_rssi_ctl[1]; 
     1037        RX_SAMP_DBG(rssi_ctl2) = rs->rs_rssi_ctl[2]; 
     1038        RX_SAMP_DBG(rssi_ext0) = rs->rs_rssi_ext[0]; 
     1039        RX_SAMP_DBG(rssi_ext1) = rs->rs_rssi_ext[1]; 
     1040        RX_SAMP_DBG(rssi_ext2) = rs->rs_rssi_ext[2]; 
    10411041        RX_SAMP_DBG(antenna) = rs->rs_antenna; 
    10421042        RX_SAMP_DBG(rssi) = rs->rs_rssi; 
    10431043        RX_SAMP_DBG(rate) = rs->rs_rate; 
  • include/linux/nl80211.h

    a b enum nl80211_sta_bss_param { 
    14971497 * @NL80211_STA_INFO_BSS_PARAM: current station's view of BSS, nested attribute 
    14981498 *     containing info as possible, see &enum nl80211_sta_bss_param 
    14991499 * @NL80211_STA_INFO_CONNECTED_TIME: time since the station is last connected 
     1500 * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU 
     1501 * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average 
    15001502 * @__NL80211_STA_INFO_AFTER_LAST: internal 
    15011503 * @NL80211_STA_INFO_MAX: highest possible station info attribute 
    15021504 */ 
    enum nl80211_sta_info { 
    15181520        NL80211_STA_INFO_RX_BITRATE, 
    15191521        NL80211_STA_INFO_BSS_PARAM, 
    15201522        NL80211_STA_INFO_CONNECTED_TIME, 
     1523        NL80211_STA_INFO_CHAIN_SIGNAL, 
     1524        NL80211_STA_INFO_CHAIN_SIGNAL_AVG, 
    15211525 
    15221526        /* keep last */ 
    15231527        __NL80211_STA_INFO_AFTER_LAST, 
  • net/wireless/nl80211.c

    a b nla_put_failure: 
    22382238        return false; 
    22392239} 
    22402240 
     2241static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, 
     2242                               int id) 
     2243{ 
     2244        void *attr; 
     2245        int i = 0; 
     2246 
     2247        if (!mask) 
     2248                return true; 
     2249 
     2250        attr = nla_nest_start(msg, id); 
     2251        if (!attr) 
     2252                goto nla_put_failure; 
     2253 
     2254        for (i = 0; i < 4; i++) { 
     2255                if (!(mask & BIT(i))) 
     2256                        continue; 
     2257 
     2258                NLA_PUT_U8(msg, i, signal[i]); 
     2259        } 
     2260 
     2261        nla_nest_end(msg, attr); 
     2262 
     2263        return true; 
     2264nla_put_failure: 
     2265        return false; 
     2266} 
     2267 
    22412268static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq, 
    22422269                                int flags, struct net_device *dev, 
    22432270                                const u8 *mac_addr, struct station_info *sinfo) 
    static int nl80211_send_station(struct s 
    22842311        if (sinfo->filled & STATION_INFO_SIGNAL_AVG) 
    22852312                NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL_AVG, 
    22862313                           sinfo->signal_avg); 
     2314        if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL) { 
     2315                if (!nl80211_put_signal(msg, sinfo->chains, 
     2316                                        sinfo->chain_signal, 
     2317                                        NL80211_STA_INFO_CHAIN_SIGNAL)) 
     2318                        goto nla_put_failure; 
     2319        } 
     2320        if (sinfo->filled & STATION_INFO_CHAIN_SIGNAL_AVG) { 
     2321                if (!nl80211_put_signal(msg, sinfo->chains, 
     2322                                        sinfo->chain_signal_avg, 
     2323                                        NL80211_STA_INFO_CHAIN_SIGNAL_AVG)) 
     2324                        goto nla_put_failure; 
     2325        } 
    22872326        if (sinfo->filled & STATION_INFO_TX_BITRATE) { 
    22882327                if (!nl80211_put_sta_rate(msg, &sinfo->txrate, 
    22892328                                          NL80211_STA_INFO_TX_BITRATE)) 
  • net/mac80211/cfg.c

    a b static void sta_set_sinfo(struct sta_inf 
    329329{ 
    330330        struct ieee80211_sub_if_data *sdata = sta->sdata; 
    331331        struct timespec uptime; 
     332        int i; 
    332333 
    333334        sinfo->generation = sdata->local->sta_generation; 
    334335 
    static void sta_set_sinfo(struct sta_inf 
    363364                sinfo->signal = (s8)sta->last_signal; 
    364365                sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal); 
    365366        } 
     367        if (sta->chains) { 
     368                sinfo->filled |= STATION_INFO_CHAIN_SIGNAL | 
     369                                 STATION_INFO_CHAIN_SIGNAL_AVG; 
     370 
     371                sinfo->chains = sta->chains; 
     372                for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) { 
     373                        sinfo->chain_signal[i] = sta->chain_signal_last[i]; 
     374                        sinfo->chain_signal_avg[i] = 
     375                                (s8) -ewma_read(&sta->chain_signal_avg[i]); 
     376                } 
     377        } 
    366378 
    367379        sinfo->txrate.flags = 0; 
    368380        if (sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS) 
Note: See TracBrowser for help on using the repository browser.