X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=package%2Fmac80211%2Fpatches%2F522-ath9k_per_chain_signal_strength.patch;h=ee31e8f5969f6efd7e3174d85169a93d94bf2a7d;hb=b35c47cc3abb33663258cf7a416f18e303f7379b;hp=acaea62f0cb1f56e91c808284570fe64c2d51cfd;hpb=691b253e47367f64097023ba2afcc595ca120786;p=openwrt.git diff --git a/package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch b/package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch index acaea62f0c..ee31e8f596 100644 --- a/package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch +++ b/package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch @@ -1,43 +1,41 @@ --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -693,6 +693,9 @@ enum mac80211_rx_flags { - * @mactime: value in microseconds of the 64-bit Time Synchronization Function - * (TSF) timer when the first data symbol (MPDU) arrived at the hardware. - * @band: the active band when this frame was received +@@ -816,6 +816,9 @@ enum mac80211_rx_flags { + * @signal: signal strength when receiving this frame, either in dBm, in dB or + * unspecified depending on the hardware capabilities flags + * @IEEE80211_HW_SIGNAL_* + * @chains: bitmask of receive chains for which separate signal strength + * values were filled. + * @chain_signal: per-chain signal strength, same format as @signal - * @freq: frequency the radio was tuned to when receiving this frame, in MHz - * @signal: signal strength when receiving this frame, either in dBm, in dB or - * unspecified depending on the hardware capabilities flags -@@ -706,6 +709,10 @@ enum mac80211_rx_flags { - struct ieee80211_rx_status { - u64 mactime; - enum ieee80211_band band; -+ + * @antenna: antenna used + * @rate_idx: index of data rate into band's supported rates or MCS index if + * HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT) +@@ -847,6 +850,8 @@ struct ieee80211_rx_status { + u8 band; + u8 antenna; + s8 signal; + u8 chains; + s8 chain_signal[4]; -+ - int freq; - int signal; - int antenna; + u8 ampdu_delimiter_crc; + u8 vendor_radiotap_align; + u8 vendor_radiotap_oui[3]; --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h -@@ -320,6 +320,11 @@ struct sta_info { - unsigned long rx_dropped; +@@ -329,6 +329,11 @@ struct sta_info { int last_signal; struct ewma avg_signal; + int last_ack_signal; + + u8 chains; + s8 chain_signal_last[4]; + struct ewma chain_signal_avg[4]; + /* Plus 1 for non-QoS frames */ - __le16 last_seq_ctrl[NUM_RX_DATA_QUEUES + 1]; + __le16 last_seq_ctrl[IEEE80211_NUM_TIDS + 1]; --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c -@@ -1262,6 +1262,7 @@ ieee80211_rx_h_sta_process(struct ieee80 +@@ -1375,6 +1375,7 @@ ieee80211_rx_h_sta_process(struct ieee80 struct sk_buff *skb = rx->skb; struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; @@ -45,7 +43,7 @@ if (!sta) return RX_CONTINUE; -@@ -1306,6 +1307,19 @@ ieee80211_rx_h_sta_process(struct ieee80 +@@ -1425,6 +1426,19 @@ ieee80211_rx_h_sta_process(struct ieee80 ewma_add(&sta->avg_signal, -status->signal); } @@ -67,7 +65,7 @@ * exchange sequence. --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c -@@ -256,6 +256,8 @@ struct sta_info *sta_info_alloc(struct i +@@ -324,6 +324,8 @@ struct sta_info *sta_info_alloc(struct i do_posix_clock_monotonic_gettime(&uptime); sta->last_connected = uptime.tv_sec; ewma_init(&sta->avg_signal, 1024, 8); @@ -78,7 +76,7 @@ kfree(sta); --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h -@@ -522,6 +522,8 @@ struct station_parameters { +@@ -653,6 +653,8 @@ struct station_parameters { * @STATION_INFO_STA_FLAGS: @sta_flags filled * @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled * @STATION_INFO_T_OFFSET: @t_offset filled @@ -87,7 +85,7 @@ */ enum station_info_flags { STATION_INFO_INACTIVE_TIME = 1<<0, -@@ -545,6 +547,8 @@ enum station_info_flags { +@@ -676,6 +678,8 @@ enum station_info_flags { STATION_INFO_STA_FLAGS = 1<<18, STATION_INFO_BEACON_LOSS_COUNT = 1<<19, STATION_INFO_T_OFFSET = 1<<20, @@ -96,17 +94,17 @@ }; /** -@@ -626,6 +630,9 @@ struct sta_bss_parameters { - NOTE: For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. - * @signal_avg: avg signal strength, type depends on the wiphy's signal_type - NOTE: For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. +@@ -769,6 +773,9 @@ struct sta_bss_parameters { + * For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. + * @signal_avg: Average signal strength, type depends on the wiphy's signal_type. + * For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_. + * @chains: bitmask for filled values in @chain_signal, @chain_signal_avg + * @chain_signal: per-chain signal strength of last received packet in dBm + * @chain_signal_avg: per-chain signal strength average in dBm * @txrate: current unicast bitrate from this station * @rxrate: current unicast bitrate to this station * @rx_packets: packets received from this station -@@ -658,6 +665,11 @@ struct station_info { +@@ -801,6 +808,11 @@ struct station_info { u8 plink_state; s8 signal; s8 signal_avg; @@ -137,7 +135,7 @@ u8 rs_num_delims; --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c -@@ -987,6 +987,7 @@ static int ath9k_rx_skb_preprocess(struc +@@ -955,6 +955,7 @@ static int ath9k_rx_skb_preprocess(struc bool *decrypt_error) { struct ath_hw *ah = common->ah; @@ -145,7 +143,7 @@ /* * everything but the rate is checked here, the rate check is done -@@ -1012,6 +1013,20 @@ static int ath9k_rx_skb_preprocess(struc +@@ -980,6 +981,20 @@ static int ath9k_rx_skb_preprocess(struc if (rx_stats->rs_moreaggr) rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL; @@ -166,28 +164,9 @@ return 0; } -@@ -1542,14 +1557,14 @@ static void ath_ant_comb_scan(struct ath - struct ath_ant_comb *antcomb = &sc->ant_comb; - int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set; - int curr_main_set; -- int main_rssi = rs->rs_rssi_ctl0; -- int alt_rssi = rs->rs_rssi_ctl1; -+ int main_rssi = rs->rs_rssi_ctl[0]; -+ int alt_rssi = rs->rs_rssi_ctl[1]; - int rx_ant_conf, main_ant_conf; - bool short_scan = false; - -- rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) & -+ rx_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_CURRENT_SHIFT) & - ATH_ANT_RX_MASK; -- main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) & -+ main_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_MAIN_SHIFT) & - ATH_ANT_RX_MASK; - - /* Record packet only when both main_rssi and alt_rssi is positive */ --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c -@@ -453,12 +453,12 @@ int ath9k_hw_process_rxdesc_edma(struct +@@ -475,12 +475,12 @@ int ath9k_hw_process_rxdesc_edma(struct /* XXX: Keycache */ rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined); @@ -248,7 +227,7 @@ if (ads.ds_rxstatus8 & AR_RxKeyIdxValid) --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c -@@ -1009,12 +1009,12 @@ void ath_debug_stat_rx(struct ath_softc +@@ -939,12 +939,12 @@ void ath_debug_stat_rx(struct ath_softc #ifdef CONFIG_ATH9K_MAC_DEBUG spin_lock(&sc->debug.samp_lock); RX_SAMP_DBG(jiffies) = jiffies; @@ -267,9 +246,9 @@ RX_SAMP_DBG(antenna) = rs->rs_antenna; RX_SAMP_DBG(rssi) = rs->rs_rssi; RX_SAMP_DBG(rate) = rs->rs_rate; ---- a/include/linux/nl80211.h -+++ b/include/linux/nl80211.h -@@ -1693,6 +1693,8 @@ enum nl80211_sta_bss_param { +--- a/include/uapi/linux/nl80211.h ++++ b/include/uapi/linux/nl80211.h +@@ -1834,6 +1834,8 @@ enum nl80211_sta_bss_param { * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update. * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32) * @NL80211_STA_INFO_T_OFFSET: timing offset with respect to this STA (s64) @@ -278,7 +257,7 @@ * @__NL80211_STA_INFO_AFTER_LAST: internal * @NL80211_STA_INFO_MAX: highest possible station info attribute */ -@@ -1717,6 +1719,8 @@ enum nl80211_sta_info { +@@ -1858,6 +1860,8 @@ enum nl80211_sta_info { NL80211_STA_INFO_STA_FLAGS, NL80211_STA_INFO_BEACON_LOSS, NL80211_STA_INFO_T_OFFSET, @@ -289,8 +268,8 @@ __NL80211_STA_INFO_AFTER_LAST, --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c -@@ -2406,6 +2406,33 @@ nla_put_failure: - return false; +@@ -2910,6 +2910,32 @@ static bool nl80211_put_sta_rate(struct + return true; } +static bool nl80211_put_signal(struct sk_buff *msg, u8 mask, s8 *signal, @@ -304,26 +283,25 @@ + + attr = nla_nest_start(msg, id); + if (!attr) -+ goto nla_put_failure; ++ return false; + + for (i = 0; i < 4; i++) { + if (!(mask & BIT(i))) + continue; + -+ NLA_PUT_U8(msg, i, signal[i]); ++ if (nla_put_u8(msg, i, signal[i])) ++ return false; + } + + nla_nest_end(msg, attr); + + return true; -+nla_put_failure: -+ return false; +} + - static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq, + static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq, int flags, struct cfg80211_registered_device *rdev, -@@ -2460,6 +2487,18 @@ static int nl80211_send_station(struct s +@@ -2971,6 +2997,18 @@ static int nl80211_send_station(struct s default: break; } @@ -344,16 +322,16 @@ NL80211_STA_INFO_TX_BITRATE)) --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -354,6 +354,7 @@ static void sta_set_sinfo(struct sta_inf - { +@@ -435,6 +435,7 @@ static void sta_set_sinfo(struct sta_inf struct ieee80211_sub_if_data *sdata = sta->sdata; + struct ieee80211_local *local = sdata->local; struct timespec uptime; + int i; sinfo->generation = sdata->local->sta_generation; -@@ -391,6 +392,17 @@ static void sta_set_sinfo(struct sta_inf - sinfo->signal = (s8)sta->last_signal; +@@ -474,6 +475,17 @@ static void sta_set_sinfo(struct sta_inf + sinfo->signal = (s8)sta->last_signal; sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal); } + if (sta->chains) { @@ -369,4 +347,38 @@ + } sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate); + sta_set_rate_info_rx(sta, &sinfo->rxrate); +--- a/drivers/net/wireless/ath/ath9k/dfs.c ++++ b/drivers/net/wireless/ath/ath9k/dfs.c +@@ -164,8 +164,8 @@ void ath9k_dfs_process_phyerr(struct ath + return; + } +- ard.rssi = rs->rs_rssi_ctl0; +- ard.ext_rssi = rs->rs_rssi_ext0; ++ ard.rssi = rs->rs_rssi_ctl[0]; ++ ard.ext_rssi = rs->rs_rssi_ext[0]; + + /* + * hardware stores this as 8 bit signed value. +--- a/drivers/net/wireless/ath/ath9k/antenna.c ++++ b/drivers/net/wireless/ath/ath9k/antenna.c +@@ -546,14 +546,14 @@ void ath_ant_comb_scan(struct ath_softc + struct ath_ant_comb *antcomb = &sc->ant_comb; + int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set; + int curr_main_set; +- int main_rssi = rs->rs_rssi_ctl0; +- int alt_rssi = rs->rs_rssi_ctl1; ++ int main_rssi = rs->rs_rssi_ctl[0]; ++ int alt_rssi = rs->rs_rssi_ctl[1]; + int rx_ant_conf, main_ant_conf; + bool short_scan = false; + +- rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) & ++ rx_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_CURRENT_SHIFT) & + ATH_ANT_RX_MASK; +- main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) & ++ main_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_MAIN_SHIFT) & + ATH_ANT_RX_MASK; + + /* Record packet only when both main_rssi and alt_rssi is positive */