wifi: mt76: mt7915: add spatial extension index support
authorShayne Chen <shayne.chen@mediatek.com>
Fri, 30 Sep 2022 15:13:14 +0000 (23:13 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 1 Dec 2022 16:29:12 +0000 (17:29 +0100)
In previous, we only allow user to configure tx antenna mask
contiguously (e.g. 0x3, 0xf).
This patch allows user to configure tx antenna mask interleavingly
(e.g. 0x5, 0x8). By setting proper antenna mask and nss, user can
prioritized the signal of different antennas, which helps to test
their performance in normal mode.

Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/main.c
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
drivers/net/wireless/mediatek/mt76/mt7915/testmode.c

index 0e852a7d3ecd8b7105cc04179213ecb91fbfbe8a..409f57382cc706b8d13b3d8c31a8d2a770d34ccb 100644 (file)
@@ -958,9 +958,6 @@ mt7915_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
        if (!tx_ant || tx_ant != rx_ant || ffs(tx_ant) > max_nss)
                return -EINVAL;
 
-       if ((BIT(hweight8(tx_ant)) - 1) != tx_ant)
-               tx_ant = BIT(ffs(tx_ant) - 1) - 1;
-
        mutex_lock(&dev->mt76.mutex);
 
        phy->mt76->antenna_mask = tx_ant;
index 4a2196f9df61463a22c8ddbbe66ea77fac16168a..0c90d3666255e8e4e9019e7212cd917d93810911 100644 (file)
@@ -1306,6 +1306,9 @@ int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
        case RATE_PARAM_MMPS_UPDATE:
                ra->mmps_mode = mt7915_mcu_get_mmps_mode(sta->deflink.smps_mode);
                break;
+       case RATE_PARAM_SPE_UPDATE:
+               ra->spe_idx = *(u8 *)data;
+               break;
        default:
                break;
        }
@@ -1348,6 +1351,18 @@ int mt7915_mcu_add_smps(struct mt7915_dev *dev, struct ieee80211_vif *vif,
                                              RATE_PARAM_MMPS_UPDATE);
 }
 
+static int
+mt7915_mcu_set_spe_idx(struct mt7915_dev *dev, struct ieee80211_vif *vif,
+                      struct ieee80211_sta *sta)
+{
+       struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
+       struct mt76_phy *mphy = mvif->phy->mt76;
+       u8 spe_idx = mt76_connac_spe_idx(mphy->antenna_mask);
+
+       return mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &spe_idx,
+                                             RATE_PARAM_SPE_UPDATE);
+}
+
 static int
 mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev *dev,
                               struct ieee80211_vif *vif,
@@ -1435,7 +1450,7 @@ mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev *dev,
                        return ret;
        }
 
-       return 0;
+       return mt7915_mcu_set_spe_idx(dev, vif, sta);
 }
 
 static void
@@ -2648,6 +2663,9 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd)
        }
 #endif
 
+       if (mt76_connac_spe_idx(phy->mt76->antenna_mask))
+               req.tx_path_num = fls(phy->mt76->antenna_mask);
+
        if (cmd == MCU_EXT_CMD(SET_RX_PATH) ||
            dev->mt76.hw->conf.flags & IEEE80211_CONF_MONITOR)
                req.switch_reason = CH_SWITCH_NORMAL;
index cd1edf553fc177e1ac660fdacd2ba64d293189d4..87cd1bfff3e620a395372c04b3445e6bd80abce3 100644 (file)
@@ -394,6 +394,7 @@ enum {
        RATE_PARAM_FIXED_MCS,
        RATE_PARAM_FIXED_GI = 11,
        RATE_PARAM_AUTO = 20,
+       RATE_PARAM_SPE_UPDATE = 22,
 };
 
 #define RATE_CFG_MCS                   GENMASK(3, 0)
index e1838f046568b5edf6d40a979a1588099d547a9a..a979460fad2d8bb33dc38bd02092b88d3901ec6f 100644 (file)
@@ -432,8 +432,6 @@ mt7915_tm_update_channel(struct mt7915_phy *phy)
 static void
 mt7915_tm_set_tx_frames(struct mt7915_phy *phy, bool en)
 {
-       static const u8 spe_idx_map[] = {0, 0, 1, 0, 3, 2, 4, 0,
-                                        9, 8, 6, 10, 16, 12, 18, 0};
        struct mt76_testmode_data *td = &phy->mt76->test;
        struct mt7915_dev *dev = phy->dev;
        struct ieee80211_tx_info *info;
@@ -450,7 +448,7 @@ mt7915_tm_set_tx_frames(struct mt7915_phy *phy, bool en)
                if (td->tx_spe_idx)
                        phy->test.spe_idx = td->tx_spe_idx;
                else
-                       phy->test.spe_idx = spe_idx_map[td->tx_antenna_mask];
+                       phy->test.spe_idx = mt76_connac_spe_idx(td->tx_antenna_mask);
        }
 
        mt7915_tm_set_tam_arb(phy, en,