Commit 82cdbd11 authored by Miri Korenblit's avatar Miri Korenblit Committed by Luca Coelho

iwlwifi: mvm: Support version 3 of tlc_update_notif.

As part of the new rate_n_flags, a new version of tlc_update_notif
was added in FW in order to support the new rate_n_flags.
Add support for the new version, and move the all API to use the
new rate_n_flags only (if FW supports the old one - convert it).
Signed-off-by: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211017123741.9fc0cb5d5898.I1f88e02317f79f1be7f792c01236d836045a44b3@changeidSigned-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent 9998f81e
...@@ -184,6 +184,14 @@ struct iwl_tlc_update_notif { ...@@ -184,6 +184,14 @@ struct iwl_tlc_update_notif {
__le32 amsdu_enabled; __le32 amsdu_enabled;
} __packed; /* TLC_MNG_UPDATE_NTFY_API_S_VER_2 */ } __packed; /* TLC_MNG_UPDATE_NTFY_API_S_VER_2 */
#define IWL_MAX_MCS_DISPLAY_SIZE 12
struct iwl_rate_mcs_info {
char mbps[IWL_MAX_MCS_DISPLAY_SIZE];
char mcs[IWL_MAX_MCS_DISPLAY_SIZE];
};
/* /*
* These serve as indexes into * These serve as indexes into
* struct iwl_rate_info fw_rate_idx_to_plcp[IWL_RATE_COUNT]; * struct iwl_rate_info fw_rate_idx_to_plcp[IWL_RATE_COUNT];
...@@ -226,6 +234,8 @@ enum { ...@@ -226,6 +234,8 @@ enum {
IWL_LAST_HE_RATE = IWL_RATE_MCS_11_INDEX, IWL_LAST_HE_RATE = IWL_RATE_MCS_11_INDEX,
IWL_RATE_COUNT_LEGACY = IWL_LAST_NON_HT_RATE + 1, IWL_RATE_COUNT_LEGACY = IWL_LAST_NON_HT_RATE + 1,
IWL_RATE_COUNT = IWL_LAST_HE_RATE + 1, IWL_RATE_COUNT = IWL_LAST_HE_RATE + 1,
IWL_RATE_INVM_INDEX = IWL_RATE_COUNT,
IWL_RATE_INVALID = IWL_RATE_COUNT,
}; };
#define IWL_RATE_BIT_MSK(r) BIT(IWL_RATE_##r##M_INDEX) #define IWL_RATE_BIT_MSK(r) BIT(IWL_RATE_##r##M_INDEX)
...@@ -548,6 +558,7 @@ enum { ...@@ -548,6 +558,7 @@ enum {
#define RATE_MCS_SGI_POS RATE_MCS_HE_GI_LTF_POS #define RATE_MCS_SGI_POS RATE_MCS_HE_GI_LTF_POS
#define RATE_MCS_SGI_MSK (1 << RATE_MCS_SGI_POS) #define RATE_MCS_SGI_MSK (1 << RATE_MCS_SGI_POS)
#define RATE_MCS_HE_SU_4_LTF 3 #define RATE_MCS_HE_SU_4_LTF 3
#define RATE_MCS_HE_SU_4_LTF_08_GI 4
/* Bit 24-23: HE type. (0) SU, (1) SU_EXT, (2) MU, (3) trigger based */ /* Bit 24-23: HE type. (0) SU, (1) SU_EXT, (2) MU, (3) trigger based */
#define RATE_MCS_HE_TYPE_POS 23 #define RATE_MCS_HE_TYPE_POS 23
...@@ -700,5 +711,10 @@ struct iwl_lq_cmd { ...@@ -700,5 +711,10 @@ struct iwl_lq_cmd {
u8 iwl_fw_rate_idx_to_plcp(int idx); u8 iwl_fw_rate_idx_to_plcp(int idx);
u32 iwl_new_rate_from_v1(u32 rate_v1); u32 iwl_new_rate_from_v1(u32 rate_v1);
u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags); u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags);
const struct iwl_rate_mcs_info *iwl_rate_mcs(int idx);
const char *iwl_rs_pretty_ant(u8 ant);
const char *iwl_rs_pretty_bw(int bw);
int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate);
bool iwl_he_is_sgi(u32 rate_n_flags);
#endif /* __iwl_fw_api_rs_h__ */ #endif /* __iwl_fw_api_rs_h__ */
...@@ -6,12 +6,11 @@ ...@@ -6,12 +6,11 @@
#include <net/mac80211.h> #include <net/mac80211.h>
#include "fw/api/rs.h" #include "fw/api/rs.h"
#include "iwl-drv.h" #include "iwl-drv.h"
#include "iwl-config.h"
#define IWL_DECLARE_RATE_INFO(r) \ #define IWL_DECLARE_RATE_INFO(r) \
[IWL_RATE_##r##M_INDEX] = IWL_RATE_##r##M_PLCP [IWL_RATE_##r##M_INDEX] = IWL_RATE_##r##M_PLCP
u8 iwl_fw_rate_idx_to_plcp(int idx)
{
/* /*
* Translate from fw_rate_index (IWL_RATE_XXM_INDEX) to PLCP * Translate from fw_rate_index (IWL_RATE_XXM_INDEX) to PLCP
* */ * */
...@@ -30,10 +29,68 @@ static const u8 fw_rate_idx_to_plcp[IWL_RATE_COUNT] = { ...@@ -30,10 +29,68 @@ static const u8 fw_rate_idx_to_plcp[IWL_RATE_COUNT] = {
IWL_DECLARE_RATE_INFO(54), IWL_DECLARE_RATE_INFO(54),
}; };
/* mbps, mcs */
static const struct iwl_rate_mcs_info rate_mcs[IWL_RATE_COUNT] = {
{ "1", "BPSK DSSS"},
{ "2", "QPSK DSSS"},
{"5.5", "BPSK CCK"},
{ "11", "QPSK CCK"},
{ "6", "BPSK 1/2"},
{ "9", "BPSK 1/2"},
{ "12", "QPSK 1/2"},
{ "18", "QPSK 3/4"},
{ "24", "16QAM 1/2"},
{ "36", "16QAM 3/4"},
{ "48", "64QAM 2/3"},
{ "54", "64QAM 3/4"},
{ "60", "64QAM 5/6"},
};
static const char * const ant_name[] = {
[ANT_NONE] = "None",
[ANT_A] = "A",
[ANT_B] = "B",
[ANT_AB] = "AB",
};
static const char * const pretty_bw[] = {
"20Mhz",
"40Mhz",
"80Mhz",
"160 Mhz",
"320Mhz",
};
u8 iwl_fw_rate_idx_to_plcp(int idx)
{
return fw_rate_idx_to_plcp[idx]; return fw_rate_idx_to_plcp[idx];
} }
IWL_EXPORT_SYMBOL(iwl_fw_rate_idx_to_plcp); IWL_EXPORT_SYMBOL(iwl_fw_rate_idx_to_plcp);
const struct iwl_rate_mcs_info *iwl_rate_mcs(int idx)
{
return &rate_mcs[idx];
}
IWL_EXPORT_SYMBOL(iwl_rate_mcs);
const char *iwl_rs_pretty_ant(u8 ant)
{
if (ant >= ARRAY_SIZE(ant_name))
return "UNKNOWN";
return ant_name[ant];
}
IWL_EXPORT_SYMBOL(iwl_rs_pretty_ant);
const char *iwl_rs_pretty_bw(int bw)
{
if (bw >= ARRAY_SIZE(pretty_bw))
return "unknown bw";
return pretty_bw[bw];
}
IWL_EXPORT_SYMBOL(iwl_rs_pretty_bw);
u32 iwl_new_rate_from_v1(u32 rate_v1) u32 iwl_new_rate_from_v1(u32 rate_v1)
{ {
u32 rate_v2 = 0; u32 rate_v2 = 0;
...@@ -129,3 +186,67 @@ u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags) ...@@ -129,3 +186,67 @@ u32 iwl_legacy_rate_to_fw_idx(u32 rate_n_flags)
return -1; return -1;
} }
int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate)
{
char *type;
u8 mcs = 0, nss = 0;
u8 ant = (rate & RATE_MCS_ANT_AB_MSK) >> RATE_MCS_ANT_POS;
u32 bw = (rate & RATE_MCS_CHAN_WIDTH_MSK) >>
RATE_MCS_CHAN_WIDTH_POS;
u32 format = rate & RATE_MCS_MOD_TYPE_MSK;
bool sgi;
if (format == RATE_MCS_CCK_MSK ||
format == RATE_MCS_LEGACY_OFDM_MSK) {
int legacy_rate = rate & RATE_LEGACY_RATE_MSK;
int index = format == RATE_MCS_CCK_MSK ?
legacy_rate :
legacy_rate + IWL_FIRST_OFDM_RATE;
return scnprintf(buf, bufsz, "Legacy | ANT: %s Rate: %s Mbps",
iwl_rs_pretty_ant(ant),
index == IWL_RATE_INVALID ? "BAD" :
iwl_rate_mcs(index)->mbps);
}
if (format == RATE_MCS_VHT_MSK)
type = "VHT";
else if (format == RATE_MCS_HT_MSK)
type = "HT";
else if (format == RATE_MCS_HE_MSK)
type = "HE";
else
type = "Unknown"; /* shouldn't happen */
mcs = format == RATE_MCS_HT_MSK ?
RATE_HT_MCS_INDEX(rate) :
rate & RATE_MCS_CODE_MSK;
nss = ((rate & RATE_MCS_NSS_MSK)
>> RATE_MCS_NSS_POS) + 1;
sgi = format == RATE_MCS_HE_MSK ?
iwl_he_is_sgi(rate) :
rate & RATE_MCS_SGI_MSK;
return scnprintf(buf, bufsz,
"0x%x: %s | ANT: %s BW: %s MCS: %d NSS: %d %s%s%s%s%s",
rate, type, iwl_rs_pretty_ant(ant), iwl_rs_pretty_bw(bw), mcs, nss,
(sgi) ? "SGI " : "NGI ",
(rate & RATE_MCS_STBC_MSK) ? "STBC " : "",
(rate & RATE_MCS_LDPC_MSK) ? "LDPC " : "",
(rate & RATE_HE_DUAL_CARRIER_MODE_MSK) ? "DCM " : "",
(rate & RATE_MCS_BF_MSK) ? "BF " : "");
}
IWL_EXPORT_SYMBOL(rs_pretty_print_rate);
bool iwl_he_is_sgi(u32 rate_n_flags)
{
u32 type = rate_n_flags & RATE_MCS_HE_TYPE_MSK;
u32 ltf_gi = rate_n_flags & RATE_MCS_HE_GI_LTF_MSK;
if (type == RATE_MCS_HE_TYPE_SU ||
type == RATE_MCS_HE_TYPE_EXT_SU)
return ltf_gi == RATE_MCS_HE_SU_4_LTF_08_GI;
return false;
}
IWL_EXPORT_SYMBOL(iwl_he_is_sgi);
...@@ -985,8 +985,8 @@ static ssize_t iwl_dbgfs_frame_stats_read(struct iwl_mvm *mvm, ...@@ -985,8 +985,8 @@ static ssize_t iwl_dbgfs_frame_stats_read(struct iwl_mvm *mvm,
continue; continue;
pos += scnprintf(pos, endpos - pos, "Rate[%d]: ", pos += scnprintf(pos, endpos - pos, "Rate[%d]: ",
(int)(ARRAY_SIZE(stats->last_rates) - i)); (int)(ARRAY_SIZE(stats->last_rates) - i));
pos += rs_pretty_print_rate(pos, endpos - pos, pos += rs_pretty_print_rate_v1(pos, endpos - pos,
stats->last_rates[idx]); stats->last_rates[idx]);
if (pos < endpos - 1) if (pos < endpos - 1)
*pos++ = '\n'; *pos++ = '\n';
} }
......
...@@ -4878,7 +4878,9 @@ static int iwl_mvm_mac_get_survey(struct ieee80211_hw *hw, int idx, ...@@ -4878,7 +4878,9 @@ static int iwl_mvm_mac_get_survey(struct ieee80211_hw *hw, int idx,
static void iwl_mvm_set_sta_rate(u32 rate_n_flags, struct rate_info *rinfo) static void iwl_mvm_set_sta_rate(u32 rate_n_flags, struct rate_info *rinfo)
{ {
switch (rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK_V1) { u32 format = rate_n_flags & RATE_MCS_MOD_TYPE_MSK;
switch (rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK) {
case RATE_MCS_CHAN_WIDTH_20: case RATE_MCS_CHAN_WIDTH_20:
rinfo->bw = RATE_INFO_BW_20; rinfo->bw = RATE_INFO_BW_20;
break; break;
...@@ -4893,49 +4895,84 @@ static void iwl_mvm_set_sta_rate(u32 rate_n_flags, struct rate_info *rinfo) ...@@ -4893,49 +4895,84 @@ static void iwl_mvm_set_sta_rate(u32 rate_n_flags, struct rate_info *rinfo)
break; break;
} }
if (rate_n_flags & RATE_MCS_HT_MSK_V1) { if (format == RATE_MCS_CCK_MSK ||
rinfo->flags |= RATE_INFO_FLAGS_MCS; format == RATE_MCS_LEGACY_OFDM_MSK) {
rinfo->mcs = u32_get_bits(rate_n_flags, RATE_HT_MCS_INDEX_MSK_V1); int rate = u32_get_bits(rate_n_flags, RATE_LEGACY_RATE_MSK);
rinfo->nss = u32_get_bits(rate_n_flags,
RATE_HT_MCS_NSS_MSK_V1) + 1; /* add the offset needed to get to the legacy ofdm indices */
if (rate_n_flags & RATE_MCS_SGI_MSK_V1) if (format == RATE_MCS_LEGACY_OFDM_MSK)
rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; rate += IWL_FIRST_OFDM_RATE;
} else if (rate_n_flags & RATE_MCS_VHT_MSK_V1) {
rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS; switch (rate) {
rinfo->mcs = u32_get_bits(rate_n_flags, case IWL_RATE_1M_INDEX:
RATE_VHT_MCS_RATE_CODE_MSK); rinfo->legacy = 10;
rinfo->nss = u32_get_bits(rate_n_flags, break;
RATE_VHT_MCS_NSS_MSK) + 1; case IWL_RATE_2M_INDEX:
if (rate_n_flags & RATE_MCS_SGI_MSK_V1) rinfo->legacy = 20;
rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; break;
} else if (rate_n_flags & RATE_MCS_HE_MSK_V1) { case IWL_RATE_5M_INDEX:
rinfo->legacy = 55;
break;
case IWL_RATE_11M_INDEX:
rinfo->legacy = 110;
break;
case IWL_RATE_6M_INDEX:
rinfo->legacy = 60;
break;
case IWL_RATE_9M_INDEX:
rinfo->legacy = 90;
break;
case IWL_RATE_12M_INDEX:
rinfo->legacy = 120;
break;
case IWL_RATE_18M_INDEX:
rinfo->legacy = 180;
break;
case IWL_RATE_24M_INDEX:
rinfo->legacy = 240;
break;
case IWL_RATE_36M_INDEX:
rinfo->legacy = 360;
break;
case IWL_RATE_48M_INDEX:
rinfo->legacy = 480;
break;
case IWL_RATE_54M_INDEX:
rinfo->legacy = 540;
}
return;
}
rinfo->nss = u32_get_bits(rate_n_flags,
RATE_MCS_NSS_MSK) + 1;
rinfo->mcs = format == RATE_MCS_HT_MSK ?
RATE_HT_MCS_INDEX(rate_n_flags) :
u32_get_bits(rate_n_flags, RATE_MCS_CODE_MSK);
if (format == RATE_MCS_HE_MSK) {
u32 gi_ltf = u32_get_bits(rate_n_flags, u32 gi_ltf = u32_get_bits(rate_n_flags,
RATE_MCS_HE_GI_LTF_MSK_V1); RATE_MCS_HE_GI_LTF_MSK);
rinfo->flags |= RATE_INFO_FLAGS_HE_MCS; rinfo->flags |= RATE_INFO_FLAGS_HE_MCS;
rinfo->mcs = u32_get_bits(rate_n_flags,
RATE_VHT_MCS_RATE_CODE_MSK);
rinfo->nss = u32_get_bits(rate_n_flags,
RATE_VHT_MCS_NSS_MSK) + 1;
if (rate_n_flags & RATE_MCS_HE_106T_MSK_V1) { if (rate_n_flags & RATE_MCS_HE_106T_MSK) {
rinfo->bw = RATE_INFO_BW_HE_RU; rinfo->bw = RATE_INFO_BW_HE_RU;
rinfo->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_106; rinfo->he_ru_alloc = NL80211_RATE_INFO_HE_RU_ALLOC_106;
} }
switch (rate_n_flags & RATE_MCS_HE_TYPE_MSK_V1) { switch (rate_n_flags & RATE_MCS_HE_TYPE_MSK) {
case RATE_MCS_HE_TYPE_SU_V1: case RATE_MCS_HE_TYPE_SU:
case RATE_MCS_HE_TYPE_EXT_SU_V1: case RATE_MCS_HE_TYPE_EXT_SU:
if (gi_ltf == 0 || gi_ltf == 1) if (gi_ltf == 0 || gi_ltf == 1)
rinfo->he_gi = NL80211_RATE_INFO_HE_GI_0_8; rinfo->he_gi = NL80211_RATE_INFO_HE_GI_0_8;
else if (gi_ltf == 2) else if (gi_ltf == 2)
rinfo->he_gi = NL80211_RATE_INFO_HE_GI_1_6; rinfo->he_gi = NL80211_RATE_INFO_HE_GI_1_6;
else if (rate_n_flags & RATE_MCS_SGI_MSK_V1) else if (gi_ltf == 3)
rinfo->he_gi = NL80211_RATE_INFO_HE_GI_0_8;
else
rinfo->he_gi = NL80211_RATE_INFO_HE_GI_3_2; rinfo->he_gi = NL80211_RATE_INFO_HE_GI_3_2;
else
rinfo->he_gi = NL80211_RATE_INFO_HE_GI_0_8;
break; break;
case RATE_MCS_HE_TYPE_MU_V1: case RATE_MCS_HE_TYPE_MU:
if (gi_ltf == 0 || gi_ltf == 1) if (gi_ltf == 0 || gi_ltf == 1)
rinfo->he_gi = NL80211_RATE_INFO_HE_GI_0_8; rinfo->he_gi = NL80211_RATE_INFO_HE_GI_0_8;
else if (gi_ltf == 2) else if (gi_ltf == 2)
...@@ -4943,7 +4980,7 @@ static void iwl_mvm_set_sta_rate(u32 rate_n_flags, struct rate_info *rinfo) ...@@ -4943,7 +4980,7 @@ static void iwl_mvm_set_sta_rate(u32 rate_n_flags, struct rate_info *rinfo)
else else
rinfo->he_gi = NL80211_RATE_INFO_HE_GI_3_2; rinfo->he_gi = NL80211_RATE_INFO_HE_GI_3_2;
break; break;
case RATE_MCS_HE_TYPE_TRIG_V1: case RATE_MCS_HE_TYPE_TRIG:
if (gi_ltf == 0 || gi_ltf == 1) if (gi_ltf == 0 || gi_ltf == 1)
rinfo->he_gi = NL80211_RATE_INFO_HE_GI_1_6; rinfo->he_gi = NL80211_RATE_INFO_HE_GI_1_6;
else else
...@@ -4953,46 +4990,19 @@ static void iwl_mvm_set_sta_rate(u32 rate_n_flags, struct rate_info *rinfo) ...@@ -4953,46 +4990,19 @@ static void iwl_mvm_set_sta_rate(u32 rate_n_flags, struct rate_info *rinfo)
if (rate_n_flags & RATE_HE_DUAL_CARRIER_MODE_MSK) if (rate_n_flags & RATE_HE_DUAL_CARRIER_MODE_MSK)
rinfo->he_dcm = 1; rinfo->he_dcm = 1;
} else { return;
switch (u32_get_bits(rate_n_flags, RATE_LEGACY_RATE_MSK_V1)) { }
case IWL_RATE_1M_PLCP:
rinfo->legacy = 10; if (rate_n_flags & RATE_MCS_SGI_MSK)
break; rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
case IWL_RATE_2M_PLCP:
rinfo->legacy = 20; if (format == RATE_MCS_HT_MSK) {
break; rinfo->flags |= RATE_INFO_FLAGS_MCS;
case IWL_RATE_5M_PLCP:
rinfo->legacy = 55; } else if (format == RATE_MCS_VHT_MSK) {
break; rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS;
case IWL_RATE_11M_PLCP:
rinfo->legacy = 110;
break;
case IWL_RATE_6M_PLCP:
rinfo->legacy = 60;
break;
case IWL_RATE_9M_PLCP:
rinfo->legacy = 90;
break;
case IWL_RATE_12M_PLCP:
rinfo->legacy = 120;
break;
case IWL_RATE_18M_PLCP:
rinfo->legacy = 180;
break;
case IWL_RATE_24M_PLCP:
rinfo->legacy = 240;
break;
case IWL_RATE_36M_PLCP:
rinfo->legacy = 360;
break;
case IWL_RATE_48M_PLCP:
rinfo->legacy = 480;
break;
case IWL_RATE_54M_PLCP:
rinfo->legacy = 540;
break;
}
} }
} }
static void iwl_mvm_mac_sta_statistics(struct ieee80211_hw *hw, static void iwl_mvm_mac_sta_statistics(struct ieee80211_hw *hw,
......
...@@ -1732,7 +1732,7 @@ iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif) ...@@ -1732,7 +1732,7 @@ iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
/* rate scaling */ /* rate scaling */
int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq); int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq);
void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg); void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg);
int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate); int rs_pretty_print_rate_v1(char *buf, int bufsz, const u32 rate);
void rs_update_last_rssi(struct iwl_mvm *mvm, void rs_update_last_rssi(struct iwl_mvm *mvm,
struct iwl_mvm_sta *mvmsta, struct iwl_mvm_sta *mvmsta,
struct ieee80211_rx_status *rx_status); struct ieee80211_rx_status *rx_status);
......
...@@ -310,7 +310,19 @@ void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm, ...@@ -310,7 +310,19 @@ void iwl_mvm_tlc_update_notif(struct iwl_mvm *mvm,
if (flags & IWL_TLC_NOTIF_FLAG_RATE) { if (flags & IWL_TLC_NOTIF_FLAG_RATE) {
char pretty_rate[100]; char pretty_rate[100];
if (iwl_fw_lookup_notif_ver(mvm->fw, DATA_PATH_GROUP,
TLC_MNG_UPDATE_NOTIF, 0) < 3) {
rs_pretty_print_rate_v1(pretty_rate, sizeof(pretty_rate),
le32_to_cpu(notif->rate));
IWL_DEBUG_RATE(mvm,
"Got rate in old format. Rate: %s. Converting.\n",
pretty_rate);
lq_sta->last_rate_n_flags =
iwl_new_rate_from_v1(le32_to_cpu(notif->rate));
} else {
lq_sta->last_rate_n_flags = le32_to_cpu(notif->rate); lq_sta->last_rate_n_flags = le32_to_cpu(notif->rate);
}
rs_pretty_print_rate(pretty_rate, sizeof(pretty_rate), rs_pretty_print_rate(pretty_rate, sizeof(pretty_rate),
lq_sta->last_rate_n_flags); lq_sta->last_rate_n_flags);
IWL_DEBUG_RATE(mvm, "new rate: %s\n", pretty_rate); IWL_DEBUG_RATE(mvm, "new rate: %s\n", pretty_rate);
......
...@@ -454,40 +454,8 @@ static const u16 expected_tpt_mimo2_160MHz[4][IWL_RATE_COUNT] = { ...@@ -454,40 +454,8 @@ static const u16 expected_tpt_mimo2_160MHz[4][IWL_RATE_COUNT] = {
{0, 0, 0, 0, 971, 0, 1925, 2861, 3779, 5574, 7304, 8147, 8976, 10592, 11640}, {0, 0, 0, 0, 971, 0, 1925, 2861, 3779, 5574, 7304, 8147, 8976, 10592, 11640},
}; };
/* mbps, mcs */
static const struct iwl_rate_mcs_info iwl_rate_mcs[IWL_RATE_COUNT] = {
{ "1", "BPSK DSSS"},
{ "2", "QPSK DSSS"},
{"5.5", "BPSK CCK"},
{ "11", "QPSK CCK"},
{ "6", "BPSK 1/2"},
{ "9", "BPSK 1/2"},
{ "12", "QPSK 1/2"},
{ "18", "QPSK 3/4"},
{ "24", "16QAM 1/2"},
{ "36", "16QAM 3/4"},
{ "48", "64QAM 2/3"},
{ "54", "64QAM 3/4"},
{ "60", "64QAM 5/6"},
};
#define MCS_INDEX_PER_STREAM (8) #define MCS_INDEX_PER_STREAM (8)
static const char *rs_pretty_ant(u8 ant)
{
static const char * const ant_name[] = {
[ANT_NONE] = "None",
[ANT_A] = "A",
[ANT_B] = "B",
[ANT_AB] = "AB",
};
if (ant > ANT_AB)
return "UNKNOWN";
return ant_name[ant];
}
static const char *rs_pretty_lq_type(enum iwl_table_type type) static const char *rs_pretty_lq_type(enum iwl_table_type type)
{ {
static const char * const lq_types[] = { static const char * const lq_types[] = {
...@@ -549,7 +517,7 @@ static char *rs_pretty_rate(const struct rs_rate *rate) ...@@ -549,7 +517,7 @@ static char *rs_pretty_rate(const struct rs_rate *rate)
rate_str = "BAD_RATE"; rate_str = "BAD_RATE";
sprintf(buf, "(%s|%s|%s)", rs_pretty_lq_type(rate->type), sprintf(buf, "(%s|%s|%s)", rs_pretty_lq_type(rate->type),
rs_pretty_ant(rate->ant), rate_str); iwl_rs_pretty_ant(rate->ant), rate_str);
return buf; return buf;
} }
...@@ -2539,7 +2507,7 @@ static void rs_get_initial_rate(struct iwl_mvm *mvm, ...@@ -2539,7 +2507,7 @@ static void rs_get_initial_rate(struct iwl_mvm *mvm,
} }
IWL_DEBUG_RATE(mvm, "Best ANT: %s Best RSSI: %d\n", IWL_DEBUG_RATE(mvm, "Best ANT: %s Best RSSI: %d\n",
rs_pretty_ant(best_ant), best_rssi); iwl_rs_pretty_ant(best_ant), best_rssi);
if (best_ant != ANT_A && best_ant != ANT_B) if (best_ant != ANT_A && best_ant != ANT_B)
rate->ant = first_antenna(valid_tx_ant); rate->ant = first_antenna(valid_tx_ant);
...@@ -3674,12 +3642,14 @@ static void rs_free_sta(void *mvm_r, struct ieee80211_sta *sta, void *mvm_sta) ...@@ -3674,12 +3642,14 @@ static void rs_free_sta(void *mvm_r, struct ieee80211_sta *sta, void *mvm_sta)
IWL_DEBUG_RATE(mvm, "leave\n"); IWL_DEBUG_RATE(mvm, "leave\n");
} }
int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate) int rs_pretty_print_rate_v1(char *buf, int bufsz, const u32 rate)
{ {
char *type, *bw; char *type;
u8 mcs = 0, nss = 0; u8 mcs = 0, nss = 0;
u8 ant = (rate & RATE_MCS_ANT_AB_MSK) >> RATE_MCS_ANT_POS; u8 ant = (rate & RATE_MCS_ANT_AB_MSK) >> RATE_MCS_ANT_POS;
u32 bw = (rate & RATE_MCS_CHAN_WIDTH_MSK_V1) >>
RATE_MCS_CHAN_WIDTH_POS;
if (!(rate & RATE_MCS_HT_MSK_V1) && if (!(rate & RATE_MCS_HT_MSK_V1) &&
!(rate & RATE_MCS_VHT_MSK_V1) && !(rate & RATE_MCS_VHT_MSK_V1) &&
...@@ -3687,9 +3657,9 @@ int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate) ...@@ -3687,9 +3657,9 @@ int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate)
int index = iwl_hwrate_to_plcp_idx(rate); int index = iwl_hwrate_to_plcp_idx(rate);
return scnprintf(buf, bufsz, "Legacy | ANT: %s Rate: %s Mbps", return scnprintf(buf, bufsz, "Legacy | ANT: %s Rate: %s Mbps",
rs_pretty_ant(ant), iwl_rs_pretty_ant(ant),
index == IWL_RATE_INVALID ? "BAD" : index == IWL_RATE_INVALID ? "BAD" :
iwl_rate_mcs[index].mbps); iwl_rate_mcs(index)->mbps);
} }
if (rate & RATE_MCS_VHT_MSK_V1) { if (rate & RATE_MCS_VHT_MSK_V1) {
...@@ -3711,26 +3681,9 @@ int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate) ...@@ -3711,26 +3681,9 @@ int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate)
type = "Unknown"; /* shouldn't happen */ type = "Unknown"; /* shouldn't happen */
} }
switch (rate & RATE_MCS_CHAN_WIDTH_MSK_V1) {
case RATE_MCS_CHAN_WIDTH_20:
bw = "20Mhz";
break;
case RATE_MCS_CHAN_WIDTH_40:
bw = "40Mhz";
break;
case RATE_MCS_CHAN_WIDTH_80:
bw = "80Mhz";
break;
case RATE_MCS_CHAN_WIDTH_160:
bw = "160Mhz";
break;
default:
bw = "BAD BW";
}
return scnprintf(buf, bufsz, return scnprintf(buf, bufsz,
"0x%x: %s | ANT: %s BW: %s MCS: %d NSS: %d %s%s%s%s%s", "0x%x: %s | ANT: %s BW: %s MCS: %d NSS: %d %s%s%s%s%s",
rate, type, rs_pretty_ant(ant), bw, mcs, nss, rate, type, iwl_rs_pretty_ant(ant), iwl_rs_pretty_bw(bw), mcs, nss,
(rate & RATE_MCS_SGI_MSK_V1) ? "SGI " : "NGI ", (rate & RATE_MCS_SGI_MSK_V1) ? "SGI " : "NGI ",
(rate & RATE_MCS_STBC_MSK) ? "STBC " : "", (rate & RATE_MCS_STBC_MSK) ? "STBC " : "",
(rate & RATE_MCS_LDPC_MSK_V1) ? "LDPC " : "", (rate & RATE_MCS_LDPC_MSK_V1) ? "LDPC " : "",
...@@ -3876,7 +3829,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, ...@@ -3876,7 +3829,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
desc += scnprintf(buff + desc, bufsz - desc, desc += scnprintf(buff + desc, bufsz - desc,
" rate[%d] 0x%X ", i, r); " rate[%d] 0x%X ", i, r);
desc += rs_pretty_print_rate(buff + desc, bufsz - desc, r); desc += rs_pretty_print_rate_v1(buff + desc, bufsz - desc, r);
if (desc < bufsz - 1) if (desc < bufsz - 1)
buff[desc++] = '\n'; buff[desc++] = '\n';
} }
......
...@@ -31,11 +31,6 @@ struct iwl_rs_rate_info { ...@@ -31,11 +31,6 @@ struct iwl_rs_rate_info {
#define IWL_RATE_60M_PLCP 3 #define IWL_RATE_60M_PLCP 3
enum {
IWL_RATE_INVM_INDEX = IWL_RATE_COUNT,
IWL_RATE_INVALID = IWL_RATE_COUNT,
};
#define LINK_QUAL_MAX_RETRY_NUM 16 #define LINK_QUAL_MAX_RETRY_NUM 16
enum { enum {
...@@ -206,13 +201,6 @@ struct rs_rate { ...@@ -206,13 +201,6 @@ struct rs_rate {
#define is_ht80(rate) ((rate)->bw == RATE_MCS_CHAN_WIDTH_80) #define is_ht80(rate) ((rate)->bw == RATE_MCS_CHAN_WIDTH_80)
#define is_ht160(rate) ((rate)->bw == RATE_MCS_CHAN_WIDTH_160) #define is_ht160(rate) ((rate)->bw == RATE_MCS_CHAN_WIDTH_160)
#define IWL_MAX_MCS_DISPLAY_SIZE 12
struct iwl_rate_mcs_info {
char mbps[IWL_MAX_MCS_DISPLAY_SIZE];
char mcs[IWL_MAX_MCS_DISPLAY_SIZE];
};
/** /**
* struct iwl_lq_sta_rs_fw - rate and related statistics for RS in FW * struct iwl_lq_sta_rs_fw - rate and related statistics for RS in FW
* @last_rate_n_flags: last rate reported by FW * @last_rate_n_flags: last rate reported by FW
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment