2013-04-29 09:06:18

by Wojciech Dubowik

[permalink] [raw]
Subject: [PATCH 0/2] Add STBC rx flag for radiotap using ath9k driver

These patches add STBC rx flag for radiotap. They are based on
proposed field structure from radiotap.org. Only one STBC stream
is supported.

TODO: Implement mechanism for passing the number of STBC streams
being used. We could use mac80211_rx_flags to point number of
streams which would require 3 precious bits or use a separate structure.

Wojciech Dubowik (2):
mac80211: Add STBC RX flag to radiotap
ath9k: Add STBC flag to rx status

drivers/net/wireless/ath/ath9k/ar9003_mac.c | 1 +
drivers/net/wireless/ath/ath9k/mac.c | 2 ++
drivers/net/wireless/ath/ath9k/mac.h | 1 +
drivers/net/wireless/ath/ath9k/recv.c | 2 ++
include/net/ieee80211_radiotap.h | 6 ++++++
include/net/mac80211.h | 2 ++
net/mac80211/main.c | 3 ++-
net/mac80211/rx.c | 2 ++
8 files changed, 18 insertions(+), 1 deletion(-)

--
1.7.10.4



2013-04-29 09:06:19

by Wojciech Dubowik

[permalink] [raw]
Subject: [PATCH 2/2] ath9k: Add STBC flag to rx status

Pass RX flag to mac80211 layer when STBC stream has been received.

Signed-off-by: Wojciech Dubowik <[email protected]>
---
drivers/net/wireless/ath/ath9k/ar9003_mac.c | 1 +
drivers/net/wireless/ath/ath9k/mac.c | 2 ++
drivers/net/wireless/ath/ath9k/mac.h | 1 +
drivers/net/wireless/ath/ath9k/recv.c | 2 ++
4 files changed, 6 insertions(+)

diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
index 2570ccc..3318a5f 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
@@ -592,6 +592,7 @@ int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs,
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->rs_flags |= (rxsp->status4 & AR_RxStbc) ? ATH9K_RX_STBC : 0;

rxs->rs_hw_upload_data = (rxsp->status2 & AR_HwUploadData) ? 1 : 0;
rxs->rs_not_sounding = (rxsp->status4 & AR_RxNotSounding) ? 1 : 0;
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c
index 498fee0..288361d 100644
--- a/drivers/net/wireless/ath/ath9k/mac.c
+++ b/drivers/net/wireless/ath/ath9k/mac.c
@@ -590,6 +590,8 @@ int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds,
(ads.ds_rxstatus3 & AR_GI) ? ATH9K_RX_GI : 0;
rs->rs_flags |=
(ads.ds_rxstatus3 & AR_2040) ? ATH9K_RX_2040 : 0;
+ rs->rs_flags |=
+ (ads.ds_rxstatus3 & AR_RxStbc) ? ATH9K_RX_STBC : 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 da5ab6e..a2d17f4 100644
--- a/drivers/net/wireless/ath/ath9k/mac.h
+++ b/drivers/net/wireless/ath/ath9k/mac.h
@@ -199,6 +199,7 @@ struct ath_htc_rx_status {
#define ATH9K_RX_DELIM_CRC_PRE 0x10
#define ATH9K_RX_DELIM_CRC_POST 0x20
#define ATH9K_RX_DECRYPT_BUSY 0x40
+#define ATH9K_RX_STBC 0x80

#define ATH9K_RXKEYIX_INVALID ((u8)-1)
#define ATH9K_TXKEYIX_INVALID ((u8)-1)
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index 8be2b5d..f442c1e 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -872,6 +872,8 @@ static int ath9k_process_rate(struct ath_common *common,
rxs->flag |= RX_FLAG_40MHZ;
if (rx_stats->rs_flags & ATH9K_RX_GI)
rxs->flag |= RX_FLAG_SHORT_GI;
+ if (rx_stats->rs_flags & ATH9K_RX_STBC)
+ rxs->flag |= RX_FLAG_STBC;
rxs->rate_idx = rx_stats->rs_rate & 0x7f;
return 0;
}
--
1.7.10.4


2013-04-29 09:06:19

by Wojciech Dubowik

[permalink] [raw]
Subject: [PATCH 1/2] mac80211: Add STBC RX flag to radiotap

Add rx flag to radiotap header which tells whether
Space-Time Block Code was used. At the moment only
1 stream STBC is supported.

TODO: Pass information from the driver on how many STBC
streams have been received.

Signed-off-by: Wojciech Dubowik <[email protected]>
---
include/net/ieee80211_radiotap.h | 6 ++++++
include/net/mac80211.h | 2 ++
net/mac80211/main.c | 3 ++-
net/mac80211/rx.c | 2 ++
4 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/include/net/ieee80211_radiotap.h b/include/net/ieee80211_radiotap.h
index e07d7d7..0254cbd 100644
--- a/include/net/ieee80211_radiotap.h
+++ b/include/net/ieee80211_radiotap.h
@@ -271,6 +271,7 @@ enum ieee80211_radiotap_type {
#define IEEE80211_RADIOTAP_MCS_HAVE_GI 0x04
#define IEEE80211_RADIOTAP_MCS_HAVE_FMT 0x08
#define IEEE80211_RADIOTAP_MCS_HAVE_FEC 0x10
+#define IEEE80211_RADIOTAP_MCS_HAVE_STBC 0x20

#define IEEE80211_RADIOTAP_MCS_BW_MASK 0x03
#define IEEE80211_RADIOTAP_MCS_BW_20 0
@@ -280,6 +281,11 @@ enum ieee80211_radiotap_type {
#define IEEE80211_RADIOTAP_MCS_SGI 0x04
#define IEEE80211_RADIOTAP_MCS_FMT_GF 0x08
#define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10
+#define IEEE80211_RADIOTAP_MCS_STBC_MASK 0x60
+#define IEEE80211_RADIOTAP_MCS_STBC_0 0
+#define IEEE80211_RADIOTAP_MCS_STBC_1 1
+#define IEEE80211_RADIOTAP_MCS_STBC_2 2
+#define IEEE80211_RADIOTAP_MCS_STBC_3 3

/* For IEEE80211_RADIOTAP_AMPDU_STATUS */
#define IEEE80211_RADIOTAP_AMPDU_REPORT_ZEROLEN 0x0001
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 1fe1844..efa9fb1 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -808,6 +808,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: Space-Time Block Code was used
*/
enum mac80211_rx_flags {
RX_FLAG_MMIC_ERROR = BIT(0),
@@ -835,6 +836,7 @@ enum mac80211_rx_flags {
RX_FLAG_80MHZ = BIT(23),
RX_FLAG_80P80MHZ = BIT(24),
RX_FLAG_160MHZ = BIT(25),
+ RX_FLAG_STBC = BIT(26),
};

/**
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 c8447af..955a70f 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -267,6 +267,8 @@ 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 (status->flag & RX_FLAG_STBC)
+ *pos |= IEEE80211_RADIOTAP_MCS_STBC_1;
pos++;
*pos++ = status->rate_idx;
}
--
1.7.10.4


2013-04-29 10:12:45

by Oleksij Rempel

[permalink] [raw]
Subject: Re: [PATCH 1/2] mac80211: Add STBC RX flag to radiotap

Am 29.04.2013 11:04, schrieb Wojciech Dubowik:
> Add rx flag to radiotap header which tells whether
> Space-Time Block Code was used. At the moment only
> 1 stream STBC is supported.
>
> TODO: Pass information from the driver on how many STBC
> streams have been received.

Hi,
do i understand it correctly, on 2x2 or 2x1 system we will get one
stream STBC. On 4x4 or 4x2 we will get one or two stream STBC, is it
correct?
Is it possible that we will get some thing like this any time soon?
--
Regards,
Oleksij

2013-04-29 10:18:38

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH 1/2] mac80211: Add STBC RX flag to radiotap

On Mon, 2013-04-29 at 11:04 +0200, Wojciech Dubowik wrote:
> Add rx flag to radiotap header which tells whether

Same here, you can't just randomly add something to radiotap. Go
standardise it first.

johannes