| From 074ca69eba297963caa63b79a20d2cdf962045d2 Mon Sep 17 00:00:00 2001 |
| From: StanleyYP Wang <StanleyYP.Wang@mediatek.com> |
| Date: Mon, 12 Sep 2022 18:16:54 +0800 |
| Subject: [PATCH 1114/1116] mt76: testmode: add iBF command mode support |
| |
| Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com> |
| Change-Id: I7eea1d6412563f889e5774e787e58ce9eba001bd |
| --- |
| mt7915/testmode.c | 21 ++++++++++++++------- |
| testmode.c | 41 +++++++++++++++++++++++++++++++++++++++++ |
| testmode.h | 2 ++ |
| tools/fields.c | 28 ++++++++++++++++++++++++++++ |
| 4 files changed, 85 insertions(+), 7 deletions(-) |
| |
| diff --git a/mt7915/testmode.c b/mt7915/testmode.c |
| index a7c185f..668f483 100644 |
| --- a/mt7915/testmode.c |
| +++ b/mt7915/testmode.c |
| @@ -701,6 +701,7 @@ mt7915_tm_txbf_profile_update(struct mt7915_phy *phy, u16 *val, bool ebf) |
| struct ieee80211_vif *vif = phy->monitor_vif; |
| struct mt7915_tm_pfmu_tag *tag = phy->dev->test.txbf_pfmu_tag; |
| u8 pfmu_idx = val[0], nc = val[2], nr; |
| + bool is_atenl = val[6]; |
| int ret; |
| |
| if (td->tx_antenna_mask == 3) |
| @@ -748,7 +749,7 @@ mt7915_tm_txbf_profile_update(struct mt7915_phy *phy, u16 *val, bool ebf) |
| if (ret) |
| return ret; |
| |
| - if (!ebf) |
| + if (!ebf && is_atenl) |
| return mt7915_tm_txbf_apply_tx(phy, 1, false, true, true); |
| |
| return 0; |
| @@ -775,7 +776,7 @@ mt7915_tm_txbf_phase_cal(struct mt7915_phy *phy, u16 *val) |
| .group_l_m_n = val[1], |
| .sx2 = val[2], |
| .cal_type = val[3], |
| - .lna_gain_level = 0, /* for test purpose */ |
| + .lna_gain_level = val[4], |
| }; |
| struct mt7915_tm_txbf_phase *phase = |
| (struct mt7915_tm_txbf_phase *)dev->test.txbf_phase_cal; |
| @@ -814,6 +815,8 @@ int mt7915_tm_txbf_status_read(struct mt7915_dev *dev, struct sk_buff *skb) |
| phase = &phase[cal->group]; |
| memcpy(&phase->phase, cal->buf + 16, sizeof(phase->phase)); |
| phase->status = cal->status; |
| + /* for passing iTest script */ |
| + dev_info(dev->mt76.dev, "Calibrated result = %d\n", phase->status); |
| break; |
| case IBF_PHASE_CAL_VERIFY: |
| case IBF_PHASE_CAL_VERIFY_INSTRUMENT: |
| @@ -865,7 +868,6 @@ mt7915_tm_txbf_profile_update_all(struct mt7915_phy *phy, u16 *val) |
| pfmu_data->phi11 = cpu_to_le16(phi11); |
| pfmu_data->phi21 = cpu_to_le16(phi21); |
| pfmu_data->phi31 = cpu_to_le16(phi31); |
| - |
| if (subc_id == 63) { |
| struct mt7915_dev *dev = phy->dev; |
| struct { |
| @@ -923,8 +925,8 @@ mt7915_tm_set_txbf(struct mt7915_phy *phy) |
| struct mt76_testmode_data *td = &phy->mt76->test; |
| u16 *val = td->txbf_param; |
| |
| - pr_info("ibf cal process: act = %u, val = %u, %u, %u, %u, %u\n", |
| - td->txbf_act, val[0], val[1], val[2], val[3], val[4]); |
| + pr_info("ibf cal process: act = %u, val = %u, %u, %u, %u, %u, %u\n", |
| + td->txbf_act, val[0], val[1], val[2], val[3], val[4], val[5]); |
| |
| switch (td->txbf_act) { |
| case MT76_TM_TXBF_ACT_INIT: |
| @@ -942,10 +944,17 @@ mt7915_tm_set_txbf(struct mt7915_phy *phy) |
| return mt7915_tm_txbf_profile_update(phy, val, true); |
| case MT76_TM_TXBF_ACT_PHASE_CAL: |
| return mt7915_tm_txbf_phase_cal(phy, val); |
| + case MT76_TM_TXBF_ACT_PROF_UPDATE_ALL_CMD: |
| case MT76_TM_TXBF_ACT_PROF_UPDATE_ALL: |
| return mt7915_tm_txbf_profile_update_all(phy, val); |
| case MT76_TM_TXBF_ACT_E2P_UPDATE: |
| return mt7915_tm_txbf_e2p_update(phy); |
| + case MT76_TM_TXBF_ACT_APPLY_TX: { |
| + u16 wlan_idx = val[0]; |
| + bool ebf = !!val[1], ibf = !!val[2], phase_cal = !!val[4]; |
| + |
| + return mt7915_tm_txbf_apply_tx(phy, wlan_idx, ebf, ibf, phase_cal); |
| + } |
| default: |
| break; |
| }; |
| @@ -1072,7 +1081,6 @@ mt7915_tm_set_tx_len(struct mt7915_phy *phy, u32 tx_time) |
| rate.legacy = sband->bitrates[rate.mcs].bitrate; |
| break; |
| case MT76_TM_TX_MODE_HT: |
| - rate.mcs += rate.nss * 8; |
| flags |= RATE_INFO_FLAGS_MCS; |
| |
| if (td->tx_rate_sgi) |
| @@ -1437,7 +1445,6 @@ mt7915_tm_set_tx_frames(struct mt7915_phy *phy, bool en) |
| if (duty_cycle < 100) |
| tx_time = duty_cycle * ipg / (100 - duty_cycle); |
| } |
| - |
| mt7915_tm_set_ipg_params(phy, ipg, td->tx_rate_mode); |
| mt7915_tm_set_tx_len(phy, tx_time); |
| |
| diff --git a/testmode.c b/testmode.c |
| index 42da6f0..b605a4b 100644 |
| --- a/testmode.c |
| +++ b/testmode.c |
| @@ -530,6 +530,42 @@ out: |
| return err; |
| } |
| |
| +static int |
| +mt76_testmode_txbf_profile_update_all_cmd(struct mt76_phy *phy, struct nlattr **tb, u32 state) |
| +{ |
| +#define PARAM_UNIT 5 |
| + static u8 pfmu_idx; |
| + struct mt76_testmode_data *td = &phy->test; |
| + struct mt76_dev *dev = phy->dev; |
| + struct nlattr *cur; |
| + u16 tmp_val[PARAM_UNIT], *val = td->txbf_param; |
| + int idx, rem, ret, i = 0; |
| + |
| + memset(td->txbf_param, 0, sizeof(td->txbf_param)); |
| + nla_for_each_nested(cur, tb[MT76_TM_ATTR_TXBF_PARAM], rem) { |
| + if (nla_len(cur) != 2) |
| + return -EINVAL; |
| + idx = i % PARAM_UNIT; |
| + tmp_val[idx] = nla_get_u16(cur); |
| + if (idx == 1 && (tmp_val[idx] == 0xf0 || tmp_val[idx] == 0xff)) { |
| + pfmu_idx = tmp_val[0]; |
| + return 0; |
| + } |
| + if (idx == PARAM_UNIT - 1) { |
| + val[0] = pfmu_idx; |
| + memcpy(val + 1, tmp_val, sizeof(tmp_val)); |
| + if (dev->test_ops->set_params) { |
| + ret = dev->test_ops->set_params(phy, tb, state); |
| + if (ret) |
| + return ret; |
| + } |
| + } |
| + i++; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
| void *data, int len) |
| { |
| @@ -668,6 +704,11 @@ int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
| 0, MT76_TM_TXBF_ACT_MAX)) |
| goto out; |
| |
| + if (td->txbf_act == MT76_TM_TXBF_ACT_PROF_UPDATE_ALL_CMD) { |
| + err = mt76_testmode_txbf_profile_update_all_cmd(phy, tb, state); |
| + goto out; |
| + } |
| + |
| memset(td->txbf_param, 0, sizeof(td->txbf_param)); |
| nla_for_each_nested(cur, tb[MT76_TM_ATTR_TXBF_PARAM], rem) { |
| if (nla_len(cur) != 2 || |
| diff --git a/testmode.h b/testmode.h |
| index 34936e5..bbfb313 100644 |
| --- a/testmode.h |
| +++ b/testmode.h |
| @@ -281,8 +281,10 @@ enum mt76_testmode_txbf_act { |
| MT76_TM_TXBF_ACT_TX_PREP, |
| MT76_TM_TXBF_ACT_IBF_PROF_UPDATE, |
| MT76_TM_TXBF_ACT_EBF_PROF_UPDATE, |
| + MT76_TM_TXBF_ACT_APPLY_TX, |
| MT76_TM_TXBF_ACT_PHASE_CAL, |
| MT76_TM_TXBF_ACT_PROF_UPDATE_ALL, |
| + MT76_TM_TXBF_ACT_PROF_UPDATE_ALL_CMD, |
| MT76_TM_TXBF_ACT_E2P_UPDATE, |
| |
| /* keep last */ |
| diff --git a/tools/fields.c b/tools/fields.c |
| index 1be1ffd..47fc69f 100644 |
| --- a/tools/fields.c |
| +++ b/tools/fields.c |
| @@ -32,6 +32,20 @@ static const char * const testmode_tx_mode[] = { |
| [MT76_TM_TX_MODE_HE_MU] = "he_mu", |
| }; |
| |
| +static const char * const testmode_txbf_act[] = { |
| + [MT76_TM_TXBF_ACT_INIT] = "init", |
| + [MT76_TM_TXBF_ACT_UPDATE_CH] = "update_ch", |
| + [MT76_TM_TXBF_ACT_PHASE_COMP] = "phase_comp", |
| + [MT76_TM_TXBF_ACT_TX_PREP] = "tx_prep", |
| + [MT76_TM_TXBF_ACT_IBF_PROF_UPDATE] = "ibf_prof_update", |
| + [MT76_TM_TXBF_ACT_EBF_PROF_UPDATE] = "ebf_prof_update", |
| + [MT76_TM_TXBF_ACT_APPLY_TX] = "apply_tx", |
| + [MT76_TM_TXBF_ACT_PHASE_CAL] = "phase_cal", |
| + [MT76_TM_TXBF_ACT_PROF_UPDATE_ALL] = "prof_update", |
| + [MT76_TM_TXBF_ACT_PROF_UPDATE_ALL_CMD] = "prof_update_all", |
| + [MT76_TM_TXBF_ACT_E2P_UPDATE] = "e2p_update", |
| +}; |
| + |
| static void print_enum(const struct tm_field *field, struct nlattr *attr) |
| { |
| unsigned int i = nla_get_u8(attr); |
| @@ -82,6 +96,17 @@ static void print_s8(const struct tm_field *field, struct nlattr *attr) |
| printf("%d", (int8_t)nla_get_u8(attr)); |
| } |
| |
| +static bool parse_u16_hex(const struct tm_field *field, int idx, |
| + struct nl_msg *msg, const char *val) |
| +{ |
| + return !nla_put_u16(msg, idx, strtoul(val, NULL, 16)); |
| +} |
| + |
| +static void print_u16_hex(const struct tm_field *field, struct nlattr *attr) |
| +{ |
| + printf("%d", nla_get_u16(attr)); |
| +} |
| + |
| static bool parse_u32(const struct tm_field *field, int idx, |
| struct nl_msg *msg, const char *val) |
| { |
| @@ -384,6 +409,8 @@ static const struct tm_field testdata_fields[NUM_MT76_TM_ATTRS] = { |
| FIELD(u8, AID, "aid"), |
| FIELD(u8, RU_ALLOC, "ru_alloc"), |
| FIELD(u8, RU_IDX, "ru_idx"), |
| + FIELD_ENUM(TXBF_ACT, "txbf_act", testmode_txbf_act), |
| + FIELD_ARRAY(u16_hex, TXBF_PARAM, "txbf_param"), |
| FIELD_MAC(MAC_ADDRS, "mac_addrs"), |
| FIELD_NESTED_RO(STATS, stats, "", |
| .print_extra = print_extra_stats), |
| @@ -414,6 +441,7 @@ static struct nla_policy testdata_policy[NUM_MT76_TM_ATTRS] = { |
| [MT76_TM_ATTR_RU_ALLOC] = { .type = NLA_U8 }, |
| [MT76_TM_ATTR_RU_IDX] = { .type = NLA_U8 }, |
| [MT76_TM_ATTR_STATS] = { .type = NLA_NESTED }, |
| + [MT76_TM_ATTR_TXBF_ACT] = { .type = NLA_U8 }, |
| }; |
| |
| const struct tm_field msg_field = { |
| -- |
| 2.18.0 |
| |