mt76x0: init: introduce mt76x0_init_txpower routine
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Mon, 28 Jan 2019 09:31:13 +0000 (10:31 +0100)
committerFelix Fietkau <nbd@nbd.name>
Mon, 18 Feb 2019 18:54:34 +0000 (19:54 +0100)
Add mt76x0_init_txpower in order to initialize max_power per channel
at device bootstrap. Modify mt76x0_get_tx_power_per_rate and
mt76x0_get_power_info signature in order to compute tx power for
non-operating channels

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c
drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.h
drivers/net/wireless/mediatek/mt76/mt76x0/init.c
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c

index 64f96567bae989d7be6be96d3b0abecb90dd50fe..ab6dfc026acba2356a6b359053d5b2aebd1a16ec 100644 (file)
@@ -152,11 +152,11 @@ static s8 mt76x0_get_delta(struct mt76x02_dev *dev)
        return mt76x02_rate_power_val(val);
 }
 
-void mt76x0_get_tx_power_per_rate(struct mt76x02_dev *dev)
+void mt76x0_get_tx_power_per_rate(struct mt76x02_dev *dev,
+                                 struct ieee80211_channel *chan,
+                                 struct mt76_rate_power *t)
 {
-       struct ieee80211_channel *chan = dev->mt76.chandef.chan;
        bool is_2ghz = chan->band == NL80211_BAND_2GHZ;
-       struct mt76_rate_power *t = &dev->mt76.rate_power;
        u16 val, addr;
        s8 delta;
 
@@ -212,7 +212,8 @@ void mt76x0_get_tx_power_per_rate(struct mt76x02_dev *dev)
        mt76x02_add_rate_power_offset(t, delta);
 }
 
-void mt76x0_get_power_info(struct mt76x02_dev *dev, s8 *tp)
+void mt76x0_get_power_info(struct mt76x02_dev *dev,
+                          struct ieee80211_channel *chan, s8 *tp)
 {
        struct mt76x0_chan_map {
                u8 chan;
@@ -226,7 +227,6 @@ void mt76x0_get_power_info(struct mt76x02_dev *dev, s8 *tp)
                { 140, 26 }, { 151, 28 }, { 157, 30 }, { 161, 32 },
                { 167, 34 }, { 171, 36 }, { 175, 38 },
        };
-       struct ieee80211_channel *chan = dev->mt76.chandef.chan;
        u8 offset, addr;
        int i, idx = 0;
        u16 data;
index 42b259f90b6d3f6f8ce8ef76bd97f061f7c584bf..7f73034a23b148860d93773c10e908f1a2d382ef 100644 (file)
@@ -25,8 +25,11 @@ struct mt76x02_dev;
 
 int mt76x0_eeprom_init(struct mt76x02_dev *dev);
 void mt76x0_read_rx_gain(struct mt76x02_dev *dev);
-void mt76x0_get_tx_power_per_rate(struct mt76x02_dev *dev);
-void mt76x0_get_power_info(struct mt76x02_dev *dev, s8 *tp);
+void mt76x0_get_tx_power_per_rate(struct mt76x02_dev *dev,
+                                 struct ieee80211_channel *chan,
+                                 struct mt76_rate_power *t);
+void mt76x0_get_power_info(struct mt76x02_dev *dev,
+                          struct ieee80211_channel *chan, s8 *tp);
 
 static inline s8 s6_to_s8(u32 val)
 {
index 820632e40c1b841e344dfc549155c248b6e5d63f..a529ce111c2035c597753423cd8fd2c9402c51ab 100644 (file)
@@ -18,6 +18,7 @@
 #include "eeprom.h"
 #include "mcu.h"
 #include "initvals.h"
+#include "../mt76x02_phy.h"
 
 static void mt76x0_vht_cap_mask(struct ieee80211_supported_band *sband)
 {
@@ -262,6 +263,25 @@ int mt76x0_init_hardware(struct mt76x02_dev *dev)
 }
 EXPORT_SYMBOL_GPL(mt76x0_init_hardware);
 
+static void
+mt76x0_init_txpower(struct mt76x02_dev *dev,
+                   struct ieee80211_supported_band *sband)
+{
+       struct ieee80211_channel *chan;
+       struct mt76_rate_power t;
+       s8 tp;
+       int i;
+
+       for (i = 0; i < sband->n_channels; i++) {
+               chan = &sband->channels[i];
+
+               mt76x0_get_tx_power_per_rate(dev, chan, &t);
+               mt76x0_get_power_info(dev, chan, &tp);
+
+               chan->max_power = (mt76x02_get_max_rate_power(&t) + tp) / 2;
+       }
+}
+
 int mt76x0_register_device(struct mt76x02_dev *dev)
 {
        int ret;
@@ -274,9 +294,14 @@ int mt76x0_register_device(struct mt76x02_dev *dev)
        if (ret)
                return ret;
 
-       /* overwrite unsupported features */
-       if (dev->mt76.cap.has_5ghz)
+       if (dev->mt76.cap.has_5ghz) {
+               /* overwrite unsupported features */
                mt76x0_vht_cap_mask(&dev->mt76.sband_5g.sband);
+               mt76x0_init_txpower(dev, &dev->mt76.sband_5g.sband);
+       }
+
+       if (dev->mt76.cap.has_2ghz)
+               mt76x0_init_txpower(dev, &dev->mt76.sband_2g.sband);
 
        mt76x02_init_debugfs(dev);
 
index 3dfcad552be06c8038b7b1b1e0e67bfaafd337fa..3467a32f5fdaeb7a1c170724b55e3217280befd9 100644 (file)
@@ -847,8 +847,8 @@ void mt76x0_phy_set_txpower(struct mt76x02_dev *dev)
        struct mt76_rate_power *t = &dev->mt76.rate_power;
        s8 info;
 
-       mt76x0_get_tx_power_per_rate(dev);
-       mt76x0_get_power_info(dev, &info);
+       mt76x0_get_tx_power_per_rate(dev, dev->mt76.chandef.chan, t);
+       mt76x0_get_power_info(dev, dev->mt76.chandef.chan, &info);
 
        mt76x02_add_rate_power_offset(t, info);
        mt76x02_limit_rate_power(t, dev->mt76.txpower_conf);