Commit 4bbd6d83 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau

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: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 92610d6d
...@@ -133,13 +133,15 @@ void mt7603_init_edcca(struct mt7603_dev *dev) ...@@ -133,13 +133,15 @@ void mt7603_init_edcca(struct mt7603_dev *dev)
} }
static int 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; u8 *rssi_data = (u8 *)dev->mt76.eeprom.data;
int idx, ret; int idx, ret;
u8 bw = MT_BW_20; u8 bw = MT_BW_20;
bool failed = false; bool failed = false;
ieee80211_stop_queues(hw);
cancel_delayed_work_sync(&dev->mphy.mac_work); cancel_delayed_work_sync(&dev->mphy.mac_work);
tasklet_disable(&dev->mt76.pre_tbtt_tasklet); tasklet_disable(&dev->mt76.pre_tbtt_tasklet);
...@@ -205,9 +207,28 @@ mt7603_set_channel(struct mt7603_dev *dev, struct cfg80211_chan_def *def) ...@@ -205,9 +207,28 @@ mt7603_set_channel(struct mt7603_dev *dev, struct cfg80211_chan_def *def)
if (failed) if (failed)
mt7603_mac_work(&dev->mphy.mac_work.work); mt7603_mac_work(&dev->mphy.mac_work.work);
ieee80211_wake_queues(hw);
return ret; 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 static int
mt7603_config(struct ieee80211_hw *hw, u32 changed) mt7603_config(struct ieee80211_hw *hw, u32 changed)
{ {
...@@ -215,11 +236,8 @@ mt7603_config(struct ieee80211_hw *hw, u32 changed) ...@@ -215,11 +236,8 @@ mt7603_config(struct ieee80211_hw *hw, u32 changed)
int ret = 0; int ret = 0;
if (changed & (IEEE80211_CONF_CHANGE_CHANNEL | if (changed & (IEEE80211_CONF_CHANGE_CHANNEL |
IEEE80211_CONF_CHANGE_POWER)) { IEEE80211_CONF_CHANGE_POWER))
ieee80211_stop_queues(hw); ret = mt7603_set_channel(hw, &hw->conf.chandef);
ret = mt7603_set_channel(dev, &hw->conf.chandef);
ieee80211_wake_queues(hw);
}
if (changed & IEEE80211_CONF_CHANGE_MONITOR) { if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
mutex_lock(&dev->mt76.mutex); mutex_lock(&dev->mt76.mutex);
...@@ -700,6 +718,7 @@ const struct ieee80211_ops mt7603_ops = { ...@@ -700,6 +718,7 @@ const struct ieee80211_ops mt7603_ops = {
.set_tim = mt76_set_tim, .set_tim = mt76_set_tim,
.get_survey = mt76_get_survey, .get_survey = mt76_get_survey,
.get_antenna = mt76_get_antenna, .get_antenna = mt76_get_antenna,
.set_sar_specs = mt7603_set_sar_specs,
}; };
MODULE_LICENSE("Dual BSD/GPL"); MODULE_LICENSE("Dual BSD/GPL");
......
...@@ -403,7 +403,7 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev) ...@@ -403,7 +403,7 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev)
.tx_streams = n_chains, .tx_streams = n_chains,
.rx_streams = n_chains, .rx_streams = n_chains,
}; };
s8 tx_power; s8 tx_power = hw->conf.power_level * 2;
int i, ret; int i, ret;
if (dev->mphy.chandef.width == NL80211_CHAN_WIDTH_40) { if (dev->mphy.chandef.width == NL80211_CHAN_WIDTH_40) {
...@@ -414,7 +414,7 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev) ...@@ -414,7 +414,7 @@ int mt7603_mcu_set_channel(struct mt7603_dev *dev)
req.center_chan -= 2; 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) if (dev->mphy.antenna_mask == 3)
tx_power -= 6; tx_power -= 6;
tx_power = min(tx_power, dev->tx_power_limit); tx_power = min(tx_power, dev->tx_power_limit);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment