mt76: mt7603: introduce SAR support
Add SAR spec support to mt7603 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>
This commit is contained in:
parent
92610d6df8
commit
4bbd6d83af
2 changed files with 27 additions and 8 deletions
|
|
@ -133,13 +133,15 @@ void mt7603_init_edcca(struct mt7603_dev *dev)
|
|||
}
|
||||
|
||||
static int
|
||||
mt7603_set_channel(struct mt7603_dev *dev, struct cfg80211_chan_def *def)
|
||||
mt7603_set_channel(struct ieee80211_hw *hw, struct cfg80211_chan_def *def)
|
||||
{
|
||||
struct mt7603_dev *dev = hw->priv;
|
||||
u8 *rssi_data = (u8 *)dev->mt76.eeprom.data;
|
||||
int idx, ret;
|
||||
u8 bw = MT_BW_20;
|
||||
bool failed = false;
|
||||
|
||||
ieee80211_stop_queues(hw);
|
||||
cancel_delayed_work_sync(&dev->mphy.mac_work);
|
||||
tasklet_disable(&dev->mt76.pre_tbtt_tasklet);
|
||||
|
||||
|
|
@ -205,9 +207,28 @@ out:
|
|||
if (failed)
|
||||
mt7603_mac_work(&dev->mphy.mac_work.work);
|
||||
|
||||
ieee80211_wake_queues(hw);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mt7603_set_sar_specs(struct ieee80211_hw *hw,
|
||||
const struct cfg80211_sar_specs *sar)
|
||||
{
|
||||
struct mt7603_dev *dev = hw->priv;
|
||||
struct mt76_phy *mphy = &dev->mphy;
|
||||
int err;
|
||||
|
||||
if (!cfg80211_chandef_valid(&mphy->chandef))
|
||||
return -EINVAL;
|
||||
|
||||
err = mt76_init_sar_power(hw, sar);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return mt7603_set_channel(hw, &mphy->chandef);
|
||||
}
|
||||
|
||||
static int
|
||||
mt7603_config(struct ieee80211_hw *hw, u32 changed)
|
||||
{
|
||||
|
|
@ -215,11 +236,8 @@ mt7603_config(struct ieee80211_hw *hw, u32 changed)
|
|||
int ret = 0;
|
||||
|
||||
if (changed & (IEEE80211_CONF_CHANGE_CHANNEL |
|
||||
IEEE80211_CONF_CHANGE_POWER)) {
|
||||
ieee80211_stop_queues(hw);
|
||||
ret = mt7603_set_channel(dev, &hw->conf.chandef);
|
||||
ieee80211_wake_queues(hw);
|
||||
}
|
||||
IEEE80211_CONF_CHANGE_POWER))
|
||||
ret = mt7603_set_channel(hw, &hw->conf.chandef);
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
|
||||
mutex_lock(&dev->mt76.mutex);
|
||||
|
|
@ -700,6 +718,7 @@ const struct ieee80211_ops mt7603_ops = {
|
|||
.set_tim = mt76_set_tim,
|
||||
.get_survey = mt76_get_survey,
|
||||
.get_antenna = mt76_get_antenna,
|
||||
.set_sar_specs = mt7603_set_sar_specs,
|
||||
};
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
|
|
|||
|
|
@ -403,7 +403,7 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev)
|
|||
.tx_streams = n_chains,
|
||||
.rx_streams = n_chains,
|
||||
};
|
||||
s8 tx_power;
|
||||
s8 tx_power = hw->conf.power_level * 2;
|
||||
int i, ret;
|
||||
|
||||
if (dev->mphy.chandef.width == NL80211_CHAN_WIDTH_40) {
|
||||
|
|
@ -414,7 +414,7 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev)
|
|||
req.center_chan -= 2;
|
||||
}
|
||||
|
||||
tx_power = hw->conf.power_level * 2;
|
||||
tx_power = mt76_get_sar_power(&dev->mphy, chandef->chan, tx_power);
|
||||
if (dev->mphy.antenna_mask == 3)
|
||||
tx_power -= 6;
|
||||
tx_power = min(tx_power, dev->tx_power_limit);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue