mt76: mt7915: add support for DT rate power limits
authorShayne Chen <shayne.chen@mediatek.com>
Fri, 16 Apr 2021 22:16:17 +0000 (06:16 +0800)
committerFelix Fietkau <nbd@nbd.name>
Wed, 21 Apr 2021 10:20:54 +0000 (12:20 +0200)
Enable to limit per-rate max txpower from DT.

Tested-by: Evelyn Tsai <evelyn.tsai@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c

index 1a7c36c..74c3759 100644 (file)
@@ -3517,15 +3517,47 @@ int mt7915_mcu_set_sku(struct mt7915_phy *phy)
                .format_id = 4,
                .dbdc_idx = phy != &dev->phy,
        };
-       int i;
-       s8 *delta;
+       struct mt76_power_limits limits_array;
+       s8 *delta, *la = (s8 *)&limits_array;
+       int i, idx, n_chains = hweight8(mphy->antenna_mask);
+       int tx_power;
 
        delta = dev->rate_power[mphy->chandef.chan->band];
-       mphy->txpower_cur = hw->conf.power_level * 2 +
-                           delta[MT7915_SKU_MAX_DELTA_IDX];
+       tx_power = hw->conf.power_level * 2 -
+                  mt76_tx_power_nss_delta(n_chains);
+
+       tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,
+                                             &limits_array, tx_power);
+       mphy->txpower_cur = tx_power;
+
+       for (i = 0, idx = 0; i < MAX_SKU_RATE_GROUP_NUM; i++) {
+               const struct sku_group *sku = &mt7915_sku_groups[i];
+               u32 offset = sku->offset[mphy->chandef.chan->band];
+               u8 mcs_num = sku->len;
+               int j;
+
+               if (i >= SKU_HT_BW20 && i <= SKU_VHT_BW160) {
+                       mcs_num = 10;
+
+                       if (i == SKU_HT_BW20 || i == SKU_VHT_BW20)
+                               la = (s8 *)&limits_array + 12;
+               }
 
-       for (i = 0; i < MT7915_SKU_RATE_NUM; i++)
-               req.val[i] = hw->conf.power_level * 2 + delta[i];
+               if (!offset) {
+                       idx += sku->len;
+                       la += mcs_num;
+                       continue;
+               }
+
+               for (j = 0; j < min_t(u8, mcs_num, sku->len); j++) {
+                       s8 rate_power;
+
+                       rate_power = hw->conf.power_level * 2 + delta[idx + j];
+                       req.val[idx + j] = min_t(s8, la[j], rate_power);
+               }
+               la += mcs_num;
+               idx += sku->len;
+       }
 
        return mt76_mcu_send_msg(&dev->mt76,
                                 MCU_EXT_CMD(TX_POWER_FEATURE_CTRL), &req,