mac80211.c (0a57d636012edd147e553d22bfcd3f589b03e676) mac80211.c (b3cb885e56d5f64880109da9516ef2df1e9db7b9)
1// SPDX-License-Identifier: ISC
2/*
3 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
4 */
5#include <linux/sched.h>
6#include <linux/of.h>
7#include "mt76.h"
8

--- 1334 unchanged lines hidden (view full) ---

1343 int delta = mt76_tx_power_nss_delta(n_chains);
1344
1345 *dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2);
1346
1347 return 0;
1348}
1349EXPORT_SYMBOL_GPL(mt76_get_txpower);
1350
1// SPDX-License-Identifier: ISC
2/*
3 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
4 */
5#include <linux/sched.h>
6#include <linux/of.h>
7#include "mt76.h"
8

--- 1334 unchanged lines hidden (view full) ---

1343 int delta = mt76_tx_power_nss_delta(n_chains);
1344
1345 *dbm = DIV_ROUND_UP(phy->txpower_cur + delta, 2);
1346
1347 return 0;
1348}
1349EXPORT_SYMBOL_GPL(mt76_get_txpower);
1350
1351int mt76_init_sar_power(struct ieee80211_hw *hw,
1352 const struct cfg80211_sar_specs *sar)
1353{
1354 struct mt76_phy *phy = hw->priv;
1355 const struct cfg80211_sar_capa *capa = hw->wiphy->sar_capa;
1356 int i;
1357
1358 if (sar->type != NL80211_SAR_TYPE_POWER || !sar->num_sub_specs)
1359 return -EINVAL;
1360
1361 for (i = 0; i < sar->num_sub_specs; i++) {
1362 u32 index = sar->sub_specs[i].freq_range_index;
1363 /* SAR specifies power limitaton in 0.25dbm */
1364 s32 power = sar->sub_specs[i].power >> 1;
1365
1366 if (power > 127 || power < -127)
1367 power = 127;
1368
1369 phy->frp[index].range = &capa->freq_ranges[index];
1370 phy->frp[index].power = power;
1371 }
1372
1373 return 0;
1374}
1375EXPORT_SYMBOL_GPL(mt76_init_sar_power);
1376
1377int mt76_get_sar_power(struct mt76_phy *phy,
1378 struct ieee80211_channel *chan,
1379 int power)
1380{
1381 const struct cfg80211_sar_capa *capa = phy->hw->wiphy->sar_capa;
1382 int freq, i;
1383
1384 if (!capa || !phy->frp)
1385 return power;
1386
1387 if (power > 127 || power < -127)
1388 power = 127;
1389
1390 freq = ieee80211_channel_to_frequency(chan->hw_value, chan->band);
1391 for (i = 0 ; i < capa->num_freq_ranges; i++) {
1392 if (phy->frp[i].range &&
1393 freq >= phy->frp[i].range->start_freq &&
1394 freq < phy->frp[i].range->end_freq) {
1395 power = min_t(int, phy->frp[i].power, power);
1396 break;
1397 }
1398 }
1399
1400 return power;
1401}
1402EXPORT_SYMBOL_GPL(mt76_get_sar_power);
1403
1351static void
1352__mt76_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
1353{
1354 if (vif->csa_active && ieee80211_beacon_cntdwn_is_complete(vif))
1355 ieee80211_csa_finish(vif);
1356}
1357
1358void mt76_csa_finish(struct mt76_dev *dev)

--- 181 unchanged lines hidden ---
1404static void
1405__mt76_csa_finish(void *priv, u8 *mac, struct ieee80211_vif *vif)
1406{
1407 if (vif->csa_active && ieee80211_beacon_cntdwn_is_complete(vif))
1408 ieee80211_csa_finish(vif);
1409}
1410
1411void mt76_csa_finish(struct mt76_dev *dev)

--- 181 unchanged lines hidden ---