[ath9k-devel] [PATCH 3/3] ath9k: check for Rx-STBC flag and pass it to ieee80211
Signed-off-by: Oleksij Rempel li...@rempel-privat.de --- drivers/net/wireless/ath/ath9k/mac.c | 5 + drivers/net/wireless/ath/ath9k/mac.h | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index a52081d..d055e38 100644 --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c @@ -593,6 +593,11 @@ int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds, (ads.ds_rxstatus3 AR_GI) ? RX_FLAG_SHORT_GI : 0; rs-flag |= (ads.ds_rxstatus3 AR_2040) ? RX_FLAG_40MHZ : 0; + if (AR_SREV_9280_20_OR_LATER(ah)) + rs-flag |= + (ads.ds_rxstatus3 AR_STBC) ? + /* we can only Nss=1 STBC */ + (1 RX_FLAG_STBC_SHIFT) : 0; if (ads.ds_rxstatus8 AR_PreDelimCRCErr) rs-rs_flags |= ATH9K_RX_DELIM_CRC_PRE; diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h index 3f1e775..b02dfce 100644 --- a/drivers/net/wireless/ath/ath9k/mac.h +++ b/drivers/net/wireless/ath/ath9k/mac.h @@ -534,7 +534,8 @@ struct ar5416_desc { #define AR_2040 0x0002 #define AR_Parallel40 0x0004 #define AR_Parallel40_S 2 -#define AR_RxStatusRsvd30 0x00f8 +#define AR_STBC 0x0008 /* on ar9280 and later */ +#define AR_RxStatusRsvd30 0x00f0 #define AR_RxAntenna 0xff00 #define AR_RxAntenna_S 8 -- 1.8.1.2 ___ ath9k-devel mailing list ath9k-devel@lists.ath9k.org https://lists.ath9k.org/mailman/listinfo/ath9k-devel
[ath9k-devel] [PATCH 0/3] Work on STBC Rx monitoring
This patch set will pass RxSTBC flags from ath9k to ieee80211 and to radiotap. This field is now a part of radiotap specification: http://www.radiotap.org/defined-fields/MCS Oleksij Rempel (3): mac80211: add STBC flag for radiotap ath9k: remove useless flag conversation. ath9k: check for Rx-STBC flag and pass it to ieee80211 drivers/net/wireless/ath/ath9k/ar9003_mac.c | 5 +++-- drivers/net/wireless/ath/ath9k/mac.c| 16 drivers/net/wireless/ath/ath9k/mac.h| 4 +++- drivers/net/wireless/ath/ath9k/recv.c | 5 + include/net/ieee80211_radiotap.h| 7 +++ include/net/mac80211.h | 4 net/mac80211/main.c | 3 ++- net/mac80211/rx.c | 4 net/mac80211/status.c | 3 ++- 9 files changed, 38 insertions(+), 13 deletions(-) -- 1.8.1.2 ___ ath9k-devel mailing list ath9k-devel@lists.ath9k.org https://lists.ath9k.org/mailman/listinfo/ath9k-devel
[ath9k-devel] [PATCH 1/3] mac80211: add STBC flag for radiotap
Signed-off-by: Oleksij Rempel li...@rempel-privat.de --- include/net/ieee80211_radiotap.h | 7 +++ include/net/mac80211.h | 4 net/mac80211/main.c | 3 ++- net/mac80211/rx.c| 4 net/mac80211/status.c| 3 ++- 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/include/net/ieee80211_radiotap.h b/include/net/ieee80211_radiotap.h index c399963..c6d07cb 100644 --- a/include/net/ieee80211_radiotap.h +++ b/include/net/ieee80211_radiotap.h @@ -269,6 +269,7 @@ enum ieee80211_radiotap_type { #define IEEE80211_RADIOTAP_MCS_HAVE_GI 0x04 #define IEEE80211_RADIOTAP_MCS_HAVE_FMT0x08 #define IEEE80211_RADIOTAP_MCS_HAVE_FEC0x10 +#define IEEE80211_RADIOTAP_MCS_HAVE_STBC 0x20 #define IEEE80211_RADIOTAP_MCS_BW_MASK 0x03 #defineIEEE80211_RADIOTAP_MCS_BW_200 @@ -278,6 +279,12 @@ enum ieee80211_radiotap_type { #define IEEE80211_RADIOTAP_MCS_SGI 0x04 #define IEEE80211_RADIOTAP_MCS_FMT_GF 0x08 #define IEEE80211_RADIOTAP_MCS_FEC_LDPC0x10 +#define IEEE80211_RADIOTAP_MCS_STBC_MASK 0x60 +#defineIEEE80211_RADIOTAP_MCS_STBC_1 1 +#defineIEEE80211_RADIOTAP_MCS_STBC_2 2 +#defineIEEE80211_RADIOTAP_MCS_STBC_3 3 + +#define IEEE80211_RADIOTAP_MCS_STBC_SHIFT 5 /* For IEEE80211_RADIOTAP_AMPDU_STATUS */ #define IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN0x0001 diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 885898a..16705a9 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -805,6 +805,7 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) * on this subframe * @RX_FLAG_AMPDU_DELIM_CRC_KNOWN: The delimiter CRC field is known (the CRC * is stored in the @ampdu_delimiter_crc field) + * @RX_FLAG_STBC_MASK: STBC 2 bit bitmask. 1 - Nss=1, 2 - Nss=2, 3 - Nss=3 */ enum mac80211_rx_flags { RX_FLAG_MMIC_ERROR = BIT(0), @@ -832,8 +833,11 @@ enum mac80211_rx_flags { RX_FLAG_80MHZ = BIT(23), RX_FLAG_80P80MHZ= BIT(24), RX_FLAG_160MHZ = BIT(25), + RX_FLAG_STBC_MASK = BIT(26) | BIT(27), }; +#define RX_FLAG_STBC_SHIFT 26 + /** * struct ieee80211_rx_status - receive status * diff --git a/net/mac80211/main.c b/net/mac80211/main.c index 8a7bfc4..44191a3 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -589,7 +589,8 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, local-hw.conf.short_frame_max_tx_count = wiphy-retry_short; local-hw.radiotap_mcs_details = IEEE80211_RADIOTAP_MCS_HAVE_MCS | IEEE80211_RADIOTAP_MCS_HAVE_GI | -IEEE80211_RADIOTAP_MCS_HAVE_BW; +IEEE80211_RADIOTAP_MCS_HAVE_BW | +IEEE80211_RADIOTAP_MCS_HAVE_STBC; local-hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI | IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; local-hw.uapsd_queues = IEEE80211_DEFAULT_UAPSD_QUEUES; diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 8e29526..22bb2af 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -258,6 +258,7 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, pos += 2; if (status-flag RX_FLAG_HT) { + unsigned int stbc = status-flag RX_FLAG_STBC_MASK; rthdr-it_present |= cpu_to_le32(1 IEEE80211_RADIOTAP_MCS); *pos++ = local-hw.radiotap_mcs_details; *pos = 0; @@ -267,6 +268,9 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, *pos |= IEEE80211_RADIOTAP_MCS_BW_40; if (status-flag RX_FLAG_HT_GF) *pos |= IEEE80211_RADIOTAP_MCS_FMT_GF; + if (stbc) + *pos |= (stbc RX_FLAG_STBC_SHIFT) +IEEE80211_RADIOTAP_MCS_STBC_SHIFT; pos++; *pos++ = status-rate_idx; } diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 4343920..41143f8 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c @@ -312,7 +312,8 @@ static void ieee80211_add_tx_radiotap_header(struct ieee80211_supported_band rthdr-it_present |= cpu_to_le32(1 IEEE80211_RADIOTAP_MCS); pos[0] = IEEE80211_RADIOTAP_MCS_HAVE_MCS | IEEE80211_RADIOTAP_MCS_HAVE_GI | -IEEE80211_RADIOTAP_MCS_HAVE_BW; +IEEE80211_RADIOTAP_MCS_HAVE_BW | +IEEE80211_RADIOTAP_MCS_HAVE_STBC; if (info-status.rates[0].flags IEEE80211_TX_RC_SHORT_GI)
[ath9k-devel] [PATCH 2/3] ath9k: remove useless flag conversation.
some flags used only outside of ath9k - In this case we can use enum mac80211_rx_flags and pass it upstream without extra conversation. Signed-off-by: Oleksij Rempel li...@rempel-privat.de --- drivers/net/wireless/ath/ath9k/ar9003_mac.c | 5 +++-- drivers/net/wireless/ath/ath9k/mac.c| 11 +++ drivers/net/wireless/ath/ath9k/mac.h| 1 + drivers/net/wireless/ath/ath9k/recv.c | 5 + 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c index 301bf72..5163abd 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c @@ -469,6 +469,7 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs, rxs-rs_status = 0; rxs-rs_flags = 0; + rxs-flag = 0; rxs-rs_datalen = rxsp-status2 AR_DataLen; rxs-rs_tstamp = rxsp-status3; @@ -493,8 +494,8 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs, rxs-rs_isaggr = (rxsp-status11 AR_RxAggr) ? 1 : 0; rxs-rs_moreaggr = (rxsp-status11 AR_RxMoreAggr) ? 1 : 0; rxs-rs_antenna = (MS(rxsp-status4, AR_RxAntenna) 0x7); - rxs-rs_flags = (rxsp-status4 AR_GI) ? ATH9K_RX_GI : 0; - rxs-rs_flags |= (rxsp-status4 AR_2040) ? ATH9K_RX_2040 : 0; + rxs-flag |= (rxsp-status4 AR_GI) ? RX_FLAG_SHORT_GI : 0; + rxs-flag |= (rxsp-status4 AR_2040) ? RX_FLAG_40MHZ : 0; rxs-evm0 = rxsp-status6; rxs-evm1 = rxsp-status7; diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index 498fee0..a52081d 100644 --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c @@ -547,6 +547,7 @@ int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds, rs-rs_status = 0; rs-rs_flags = 0; + rs-flag = 0; rs-rs_datalen = ads.ds_rxstatus1 AR_DataLen; rs-rs_tstamp = ads.AR_RcvTimestamp; @@ -586,10 +587,12 @@ int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds, rs-rs_moreaggr = (ads.ds_rxstatus8 AR_RxMoreAggr) ? 1 : 0; rs-rs_antenna = MS(ads.ds_rxstatus3, AR_RxAntenna); - rs-rs_flags = - (ads.ds_rxstatus3 AR_GI) ? ATH9K_RX_GI : 0; - rs-rs_flags |= - (ads.ds_rxstatus3 AR_2040) ? ATH9K_RX_2040 : 0; + + /* directly mapped flags for ieee80211_rx_status */ + rs-flag |= + (ads.ds_rxstatus3 AR_GI) ? RX_FLAG_SHORT_GI : 0; + rs-flag |= + (ads.ds_rxstatus3 AR_2040) ? RX_FLAG_40MHZ : 0; if (ads.ds_rxstatus8 AR_PreDelimCRCErr) rs-rs_flags |= ATH9K_RX_DELIM_CRC_PRE; diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h index 5865f92..3f1e775 100644 --- a/drivers/net/wireless/ath/ath9k/mac.h +++ b/drivers/net/wireless/ath/ath9k/mac.h @@ -149,6 +149,7 @@ struct ath_rx_status { u32 evm2; u32 evm3; u32 evm4; + u32 flag; /* see enum mac80211_rx_flags */ }; struct ath_htc_rx_status { diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index 8be2b5d..b4b758d 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c @@ -868,10 +868,7 @@ static int ath9k_process_rate(struct ath_common *common, if (rx_stats-rs_rate 0x80) { /* HT rate */ rxs-flag |= RX_FLAG_HT; - if (rx_stats-rs_flags ATH9K_RX_2040) - rxs-flag |= RX_FLAG_40MHZ; - if (rx_stats-rs_flags ATH9K_RX_GI) - rxs-flag |= RX_FLAG_SHORT_GI; + rxs-flag |= rx_stats-flag; rxs-rate_idx = rx_stats-rs_rate 0x7f; return 0; } -- 1.8.1.2 ___ ath9k-devel mailing list ath9k-devel@lists.ath9k.org https://lists.ath9k.org/mailman/listinfo/ath9k-devel