From: Vasanthakumar Thiagarajan <vthiagar@codeaurora.org>
To: John Crispin <john@phrozen.org>
Cc: ath11k@lists.infradead.org, Kalle Valo <kvalo@codeaurora.org>,
Shashidhar Lakkavalli <slakkavalli@datto.com>
Subject: Re: [PATCH V2] ath11k: add HE support
Date: Tue, 16 Apr 2019 22:39:31 +0530 [thread overview]
Message-ID: <1ede238a96b75df00ae61457235a91d0@codeaurora.org> (raw)
In-Reply-To: <00b059e27def4295ae1169cc332adb73@codeaurora.org>
On 2019-04-16 22:37, Vasanthakumar Thiagarajan wrote:
> On 2019-04-16 19:57, John Crispin wrote:
>> Add basic HE support to the driver. Things still missing are
>> * fixed HE mcs/nss rates
>> * reading the caps from the FW
>> * 80P80 support
>> * verify if the mac_caps are correct
>> * he_operations is not yet propagated to the FW yet
>>
>> For HE to work the following hostapd patches need to be used
>> --> http://lists.infradead.org/pipermail/hostap/2019-April/039962.html
>>
>> Signed-off-by: Shashidhar Lakkavalli <slakkavalli@datto.com>
>> Signed-off-by: John Crispin <john@phrozen.org>
>> ---
>> Changes in V2
>> * fix copy paste error twt_responder vs twt_requester
>>
>> drivers/net/wireless/ath/ath11k/core.h | 3 +
>> drivers/net/wireless/ath/ath11k/debugfs_sta.c | 24 +-
>> drivers/net/wireless/ath/ath11k/dp_rx.c | 3 +-
>> drivers/net/wireless/ath/ath11k/mac.c | 405
>> ++++++++++++++++++++++----
>> drivers/net/wireless/ath/ath11k/wmi.c | 1 +
>> drivers/net/wireless/ath/ath11k/wmi.h | 5 +-
>> 6 files changed, 382 insertions(+), 59 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath11k/core.h
>> b/drivers/net/wireless/ath/ath11k/core.h
>> index d51eddcd78a0..296c0a5bde7e 100644
>> --- a/drivers/net/wireless/ath/ath11k/core.h
>> +++ b/drivers/net/wireless/ath/ath11k/core.h
>> @@ -251,6 +251,7 @@ struct ath11k_peer {
>> struct dp_rx_tid rx_tid[IEEE80211_NUM_TIDS + 1];
>> };
>>
>> +#define ATH11K_HE_MCS_NUM 12
>> #define ATH11K_VHT_MCS_NUM 10
>> #define ATH11K_BW_NUM 4
>> #define ATH11K_NSS_NUM 4
>> @@ -304,6 +305,7 @@ struct ath11k_htt_data_stats {
>> u64 legacy[ATH11K_COUNTER_TYPE_MAX][ATH11K_LEGACY_NUM];
>> u64 ht[ATH11K_COUNTER_TYPE_MAX][ATH11K_HT_MCS_NUM];
>> u64 vht[ATH11K_COUNTER_TYPE_MAX][ATH11K_VHT_MCS_NUM];
>> + u64 he[ATH11K_COUNTER_TYPE_MAX][ATH11K_HE_MCS_NUM];
>> u64 bw[ATH11K_COUNTER_TYPE_MAX][ATH11K_BW_NUM];
>> u64 nss[ATH11K_COUNTER_TYPE_MAX][ATH11K_NSS_NUM];
>> u64 gi[ATH11K_COUNTER_TYPE_MAX][ATH11K_GI_NUM];
>> @@ -520,6 +522,7 @@ struct ath11k_pdev_cap {
>> u32 ampdu_density;
>> u32 vht_cap;
>> u32 vht_mcs;
>> + u32 he_mcs;
>> u32 tx_chain_mask;
>> u32 rx_chain_mask;
>> u32 tx_chain_mask_shift;
>> diff --git a/drivers/net/wireless/ath/ath11k/debugfs_sta.c
>> b/drivers/net/wireless/ath/ath11k/debugfs_sta.c
>> index 41b2221e0479..d05efe6c0498 100644
>> --- a/drivers/net/wireless/ath/ath11k/debugfs_sta.c
>> +++ b/drivers/net/wireless/ath/ath11k/debugfs_sta.c
>> @@ -45,7 +45,14 @@ ath11k_accumulate_per_peer_tx_stats(struct
>> ath11k_sta *arsta,
>>
>> #define STATS_OP_FMT(name) tx_stats->stats[ATH11K_STATS_TYPE_##name]
>>
>> - if (txrate->flags & RATE_INFO_FLAGS_VHT_MCS) {
>> + if (txrate->flags & RATE_INFO_FLAGS_HE_MCS) {
>> + STATS_OP_FMT(SUCC).he[0][mcs] += peer_stats->succ_bytes;
>> + STATS_OP_FMT(SUCC).he[1][mcs] += peer_stats->succ_pkts;
>> + STATS_OP_FMT(FAIL).he[0][mcs] += peer_stats->failed_bytes;
>> + STATS_OP_FMT(FAIL).he[1][mcs] += peer_stats->failed_pkts;
>> + STATS_OP_FMT(RETRY).he[0][mcs] += peer_stats->retry_bytes;
>> + STATS_OP_FMT(RETRY).he[1][mcs] += peer_stats->retry_pkts;
>> + } else if (txrate->flags & RATE_INFO_FLAGS_VHT_MCS) {
>> STATS_OP_FMT(SUCC).vht[0][mcs] += peer_stats->succ_bytes;
>> STATS_OP_FMT(SUCC).vht[1][mcs] += peer_stats->succ_pkts;
>> STATS_OP_FMT(FAIL).vht[0][mcs] += peer_stats->failed_bytes;
>> @@ -73,7 +80,12 @@ ath11k_accumulate_per_peer_tx_stats(struct
>> ath11k_sta *arsta,
>> if (peer_stats->is_ampdu) {
>> tx_stats->ba_fails += peer_stats->ba_fails;
>>
>> - if (txrate->flags & RATE_INFO_FLAGS_MCS) {
>> + if (txrate->flags & RATE_INFO_FLAGS_HE_MCS) {
>> + STATS_OP_FMT(AMPDU).he[0][mcs] +=
>> + peer_stats->succ_bytes + peer_stats->retry_bytes;
>> + STATS_OP_FMT(AMPDU).he[1][mcs] +=
>> + peer_stats->succ_pkts + peer_stats->retry_pkts;
>> + } else if (txrate->flags & RATE_INFO_FLAGS_MCS) {
>> STATS_OP_FMT(AMPDU).ht[0][mcs] +=
>> peer_stats->succ_bytes + peer_stats->retry_bytes;
>> STATS_OP_FMT(AMPDU).ht[1][mcs] +=
>> @@ -230,6 +242,14 @@ static ssize_t
>> ath11k_dbg_sta_dump_tx_stats(struct file *file,
>> str_name[k],
>> str[j]);
>> len += scnprintf(buf + len, size - len,
>> + " HE MCS %s\n",
>> + str[j]);
>> + for (i = 0; i < ATH11K_HE_MCS_NUM; i++)
>> + len += scnprintf(buf + len, size - len,
>> + " %llu ",
>> + stats->he[j][i]);
>> + len += scnprintf(buf + len, size - len, "\n");
>> + len += scnprintf(buf + len, size - len,
>> " VHT MCS %s\n",
>> str[j]);
>> for (i = 0; i < ATH11K_VHT_MCS_NUM; i++)
>> diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.c
>> b/drivers/net/wireless/ath/ath11k/dp_rx.c
>> index 06b3c2e494f8..e980fcb9b320 100644
>> --- a/drivers/net/wireless/ath/ath11k/dp_rx.c
>> +++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
>> @@ -1739,7 +1739,7 @@ static void ath11k_dp_rx_deliver_msdu(struct
>> ath11k *ar, struct napi_struct *nap
>> status = IEEE80211_SKB_RXCB(msdu);
>>
>> ath11k_dbg(ar->ab, ATH11K_DBG_DATA,
>> - "rx skb %pK len %u peer %pM %s %s sn %u %s%s%s%s%s%s %srate_idx
>> %u vht_nss %u freq %u band %u flag 0x%x fcs-err %i mic-err %i
>> amsdu-more %i\n",
>> + "rx skb %pK len %u peer %pM %s %s sn %u %s%s%s%s%s%s%s
>> %srate_idx %u vht_nss %u freq %u band %u flag 0x%x fcs-err %i mic-err
>> %i amsdu-more %i\n",
>> msdu,
>> msdu->len,
>> ieee80211_get_SA(hdr),
>> @@ -1750,6 +1750,7 @@ static void ath11k_dp_rx_deliver_msdu(struct
>> ath11k *ar, struct napi_struct *nap
>> (status->encoding == RX_ENC_LEGACY) ? "legacy" : "",
>> (status->encoding == RX_ENC_HT) ? "ht" : "",
>> (status->encoding == RX_ENC_VHT) ? "vht" : "",
>> + (status->encoding == RX_ENC_HE) ? "he" : "",
>> (status->bw == RATE_INFO_BW_40) ? "40" : "",
>> (status->bw == RATE_INFO_BW_80) ? "80" : "",
>> (status->bw == RATE_INFO_BW_160) ? "160" : "",
>> diff --git a/drivers/net/wireless/ath/ath11k/mac.c
>> b/drivers/net/wireless/ath/ath11k/mac.c
>> index 19d7cd4817f1..aa7603d5aa7f 100644
>> --- a/drivers/net/wireless/ath/ath11k/mac.c
>> +++ b/drivers/net/wireless/ath/ath11k/mac.c
>> @@ -152,59 +152,151 @@ static int get_num_chains(u32 mask)
>> }
>>
>> static inline enum wmi_phy_mode
>> -chan_to_phymode(const struct cfg80211_chan_def *chandef)
>> +chan_to_phymode_2ghz(const struct cfg80211_chan_def *chandef)
>> +{
>> + enum wmi_phy_mode phymode = MODE_UNKNOWN;
>> +
>> + switch (chandef->width) {
>> + case NL80211_CHAN_WIDTH_20_NOHT:
>> + if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
>> + phymode = MODE_11B;
>> + else
>> + phymode = MODE_11G;
>> + break;
>> + case NL80211_CHAN_WIDTH_20:
>> + phymode = MODE_11NG_HT20;
>> + break;
>> + case NL80211_CHAN_WIDTH_40:
>> + phymode = MODE_11NG_HT40;
>> + break;
>> + case NL80211_CHAN_WIDTH_5:
>> + case NL80211_CHAN_WIDTH_10:
>> + case NL80211_CHAN_WIDTH_80:
>> + case NL80211_CHAN_WIDTH_80P80:
>> + case NL80211_CHAN_WIDTH_160:
>> + phymode = MODE_UNKNOWN;
>> + break;
>> + }
>> +
>> + return phymode;
>> +}
>> +
>> +static inline enum wmi_phy_mode
>> +chan_to_phymode_5ghz(const struct cfg80211_chan_def *chandef)
>> +{
>> + enum wmi_phy_mode phymode = MODE_UNKNOWN;
>> +
>> + switch (chandef->width) {
>> + case NL80211_CHAN_WIDTH_20_NOHT:
>> + phymode = MODE_11A;
>> + break;
>> + case NL80211_CHAN_WIDTH_20:
>> + phymode = MODE_11NA_HT20;
>> + break;
>> + case NL80211_CHAN_WIDTH_40:
>> + phymode = MODE_11NA_HT40;
>> + break;
>> + case NL80211_CHAN_WIDTH_80:
>> + phymode = MODE_11AC_VHT80;
>> + break;
>> + case NL80211_CHAN_WIDTH_160:
>> + phymode = MODE_11AC_VHT160;
>> + break;
>> + case NL80211_CHAN_WIDTH_80P80:
>> + phymode = MODE_11AC_VHT80_80;
>> + break;
>> + case NL80211_CHAN_WIDTH_5:
>> + case NL80211_CHAN_WIDTH_10:
>> + phymode = MODE_UNKNOWN;
>> + break;
>> + }
>> +
>> + return phymode;
>> +}
>> +
>> +static inline enum wmi_phy_mode
>> +chan_to_phymode_2ghz_he(const struct cfg80211_chan_def *chandef)
>> +{
>> + enum wmi_phy_mode phymode = MODE_UNKNOWN;
>> +
>> + switch (chandef->width) {
>> + case NL80211_CHAN_WIDTH_20_NOHT:
>> + if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
>> + phymode = MODE_11B;
>> + else
>> + phymode = MODE_11G;
>> + break;
>> + case NL80211_CHAN_WIDTH_20:
>> + phymode = MODE_11AX_HE20_2G;
>> + break;
>> + case NL80211_CHAN_WIDTH_40:
>> + phymode = MODE_11AX_HE40_2G;
>> + break;
>> + case NL80211_CHAN_WIDTH_80:
>> + phymode = MODE_11AX_HE80_2G;
>> + break;
>> + case NL80211_CHAN_WIDTH_5:
>> + case NL80211_CHAN_WIDTH_10:
>> + case NL80211_CHAN_WIDTH_80P80:
>> + case NL80211_CHAN_WIDTH_160:
>> + phymode = MODE_UNKNOWN;
>> + break;
>> + }
>> +
>> + return phymode;
>> +}
>> +
>> +static inline enum wmi_phy_mode
>> +chan_to_phymode_5ghz_he(const struct cfg80211_chan_def *chandef)
>> +{
>> + enum wmi_phy_mode phymode = MODE_UNKNOWN;
>> +
>> + switch (chandef->width) {
>> + case NL80211_CHAN_WIDTH_20_NOHT:
>> + phymode = MODE_11A;
>> + break;
>> + case NL80211_CHAN_WIDTH_20:
>> + phymode = MODE_11AX_HE20;
>> + break;
>> + case NL80211_CHAN_WIDTH_40:
>> + phymode = MODE_11AX_HE40;
>> + break;
>> + case NL80211_CHAN_WIDTH_80:
>> + phymode = MODE_11AX_HE80;
>> + break;
>> + case NL80211_CHAN_WIDTH_160:
>> + phymode = MODE_11AX_HE160;
>> + break;
>> + case NL80211_CHAN_WIDTH_80P80:
>> + phymode = MODE_11AX_HE80_80;
>> + break;
>> + case NL80211_CHAN_WIDTH_5:
>> + case NL80211_CHAN_WIDTH_10:
>> + phymode = MODE_UNKNOWN;
>> + break;
>> + }
>> +
>> + return phymode;
>> +}
>> +
>> +static inline enum wmi_phy_mode
>> +chan_to_phymode(const struct cfg80211_chan_def *chandef, int
>> he_support)
>> {
>> enum wmi_phy_mode phymode = MODE_UNKNOWN;
>>
>> switch (chandef->chan->band) {
>> case NL80211_BAND_2GHZ:
>> - switch (chandef->width) {
>> - case NL80211_CHAN_WIDTH_20_NOHT:
>> - if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
>> - phymode = MODE_11B;
>> - else
>> - phymode = MODE_11G;
>> - break;
>> - case NL80211_CHAN_WIDTH_20:
>> - phymode = MODE_11NG_HT20;
>> - break;
>> - case NL80211_CHAN_WIDTH_40:
>> - phymode = MODE_11NG_HT40;
>> - break;
>> - case NL80211_CHAN_WIDTH_5:
>> - case NL80211_CHAN_WIDTH_10:
>> - case NL80211_CHAN_WIDTH_80:
>> - case NL80211_CHAN_WIDTH_80P80:
>> - case NL80211_CHAN_WIDTH_160:
>> - phymode = MODE_UNKNOWN;
>> - break;
>> - }
>> + if (he_support)
>> + phymode = chan_to_phymode_2ghz_he(chandef);
>> + else
>> + phymode = chan_to_phymode_2ghz(chandef);
>> break;
>> case NL80211_BAND_5GHZ:
>> - switch (chandef->width) {
>> - case NL80211_CHAN_WIDTH_20_NOHT:
>> - phymode = MODE_11A;
>> - break;
>> - case NL80211_CHAN_WIDTH_20:
>> - phymode = MODE_11AC_VHT20;
>> - break;
>> - case NL80211_CHAN_WIDTH_40:
>> - phymode = MODE_11AC_VHT40;
>> - break;
>
> This seems to revert the below commit which fixes target assert.
>
> commit e95894e0e5a7b575b681ed7ca550656b7fc72649
> Author: Sriram R <srirrama@codeaurora.org>
> Date: Fri Mar 29 14:53:05 2019 +0530
>
> ath11k: Fix fw assert in VHT20/VHT40 modes during peer assoc
>
> Whenever the AP vdev is brought up, the driver indicates the
> phymode
> as HT20/HT40 to the firmware since there are no means currently to
> identify if mode corresponding to the 20/40 channel bandwidth is
> 'ht' or
> 'vht'. This results in a fw assert during peer association where we
> indicate
> the firmware that a VHT STA is associated (This info is derrived
> from the
> STA caps). Since the firmware identifies that the sta has an
> incompatible
> phymode with the AP vdev, an assert is issued as below.
>
> "wlan_peer.c:2482 Assertion vdev->bss->ni_chan.phy_mode >=
> peer_ratectrl_params.phymode"
>
> Avoid this scenario by indicating the phymodes as VHT during AP
> vdev
> start for 5G 20/40/80/160 bw.
> This would not affect the rates since the firmware builds the rate
> table corresponding to the peer associated.
>
> Verified the change with ATH11k AP DUT in VHT20, VHT 40, HT 20, HT
> 40 and
> 11ac STA associated to it.
> and ATH11K STA DUT associated to reference AP in VHT 40, HT40, VHT
> 20, HT 20.
>
> This change would be applicable until the vht support info is
> properly indicated
> to the driver from mac80211.
>
> Signed-off-by: Sriram R <srirrama@codeaurora.org>
> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
>
Never mind, I misread the change.
Vasanth
_______________________________________________
ath11k mailing list
ath11k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath11k
next prev parent reply other threads:[~2019-04-16 17:09 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-16 14:27 [PATCH V2] ath11k: add HE support John Crispin
2019-04-16 17:07 ` Vasanthakumar Thiagarajan
2019-04-16 17:09 ` Vasanthakumar Thiagarajan [this message]
2019-04-16 17:12 ` John Crispin
2019-04-23 14:43 ` Kalle Valo
2019-04-23 14:45 ` John Crispin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1ede238a96b75df00ae61457235a91d0@codeaurora.org \
--to=vthiagar@codeaurora.org \
--cc=ath11k@lists.infradead.org \
--cc=john@phrozen.org \
--cc=kvalo@codeaurora.org \
--cc=slakkavalli@datto.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox