mt76: mt7915: introduce SAR support
authorLorenzo Bianconi <lorenzo@kernel.org>
Tue, 23 Nov 2021 16:24:31 +0000 (17:24 +0100)
committerFelix Fietkau <nbd@nbd.name>
Sun, 19 Dec 2021 14:24:01 +0000 (15:24 +0100)
Add SAR spec support to mt7915 driver to allow configuring SAR power
limitations on the frequency ranges from the userland.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/main.c
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c

index 8c1fa08..31fceee 100644 (file)
@@ -423,6 +423,28 @@ out:
        return err;
 }
 
+static int mt7915_set_sar_specs(struct ieee80211_hw *hw,
+                               const struct cfg80211_sar_specs *sar)
+{
+       struct mt7915_phy *phy = mt7915_hw_phy(hw);
+       struct mt7915_dev *dev = mt7915_hw_dev(hw);
+       int err = -EINVAL;
+
+       mutex_lock(&dev->mt76.mutex);
+       if (!cfg80211_chandef_valid(&phy->mt76->chandef))
+               goto out;
+
+       err = mt76_init_sar_power(hw, sar);
+       if (err)
+               goto out;
+
+       err = mt7915_mcu_set_txpower_sku(phy);
+out:
+       mutex_unlock(&dev->mt76.mutex);
+
+       return err;
+}
+
 static int mt7915_config(struct ieee80211_hw *hw, u32 changed)
 {
        struct mt7915_dev *dev = mt7915_hw_dev(hw);
@@ -1329,6 +1351,7 @@ const struct ieee80211_ops mt7915_ops = {
        .sw_scan_complete = mt76_sw_scan_complete,
        .release_buffered_frames = mt76_release_buffered_frames,
        .get_txpower = mt76_get_txpower,
+       .set_sar_specs = mt7915_set_sar_specs,
        .channel_switch_beacon = mt7915_channel_switch_beacon,
        .get_stats = mt7915_get_stats,
        .get_et_sset_count = mt7915_get_et_sset_count,
index 58ed82a..2cb009a 100644 (file)
@@ -3856,11 +3856,11 @@ int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)
        struct mt76_power_limits limits_array;
        s8 *la = (s8 *)&limits_array;
        int i, idx, n_chains = hweight8(mphy->antenna_mask);
-       int tx_power;
-
-       tx_power = hw->conf.power_level * 2 -
-                  mt76_tx_power_nss_delta(n_chains);
+       int tx_power = hw->conf.power_level * 2;
 
+       tx_power = mt76_get_sar_power(mphy, mphy->chandef.chan,
+                                     tx_power);
+       tx_power -= 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;