* [PATCH 0/4] add tx power configuration support to mt7615 driver
@ 2019-05-26 14:05 Lorenzo Bianconi
2019-05-26 14:05 ` [PATCH 1/4] mt76: generalize mt76_get_txpower for 4x4:4 devices Lorenzo Bianconi
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Lorenzo Bianconi @ 2019-05-26 14:05 UTC (permalink / raw)
To: nbd; +Cc: lorenzo.bianconi, linux-wireless, ryder.lee, royluo
Cap tx power according to the value configured by the user.
Initialize get_txpower mac80211 callback in order to report the
configured tx power to mac80211
Lorenzo Bianconi (4):
mt76: generalize mt76_get_txpower for 4x4:4 devices
mt76: mt7615: add the capability to configure tx power
mt76: mt7615: init get_txpower mac80211 callback
mt76: mt7615: rearrange locking in mt7615_config
drivers/net/wireless/mediatek/mt76/mac80211.c | 15 ++++-
.../wireless/mediatek/mt76/mt7615/eeprom.c | 34 ++++++++++
.../wireless/mediatek/mt76/mt7615/eeprom.h | 35 ++++++++++
.../net/wireless/mediatek/mt76/mt7615/main.c | 17 ++---
.../net/wireless/mediatek/mt76/mt7615/mcu.c | 64 +++++++++++++++++++
.../net/wireless/mediatek/mt76/mt7615/mcu.h | 1 +
.../wireless/mediatek/mt76/mt7615/mt7615.h | 3 +
7 files changed, 159 insertions(+), 10 deletions(-)
--
2.21.0
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 1/4] mt76: generalize mt76_get_txpower for 4x4:4 devices 2019-05-26 14:05 [PATCH 0/4] add tx power configuration support to mt7615 driver Lorenzo Bianconi @ 2019-05-26 14:05 ` Lorenzo Bianconi 2019-05-26 14:05 ` [PATCH 2/4] mt76: mt7615: add the capability to configure tx power Lorenzo Bianconi ` (3 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: Lorenzo Bianconi @ 2019-05-26 14:05 UTC (permalink / raw) To: nbd; +Cc: lorenzo.bianconi, linux-wireless, ryder.lee, royluo Genralize mt76_get_txpower routine for 4x4:4 capable devices in order to be reused in mt7615 driver Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> --- drivers/net/wireless/mediatek/mt76/mac80211.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mac80211.c b/drivers/net/wireless/mediatek/mt76/mac80211.c index e70507a4b14d..f9e83971902e 100644 --- a/drivers/net/wireless/mediatek/mt76/mac80211.c +++ b/drivers/net/wireless/mediatek/mt76/mac80211.c @@ -766,10 +766,21 @@ int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, *dbm = DIV_ROUND_UP(dev->txpower_cur, 2); /* convert from per-chain power to combined - * output on 2x2 devices + * output power */ - if (n_chains > 1) + switch (n_chains) { + case 4: + *dbm += 6; + break; + case 3: + *dbm += 4; + break; + case 2: *dbm += 3; + break; + default: + break; + } return 0; } -- 2.21.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/4] mt76: mt7615: add the capability to configure tx power 2019-05-26 14:05 [PATCH 0/4] add tx power configuration support to mt7615 driver Lorenzo Bianconi 2019-05-26 14:05 ` [PATCH 1/4] mt76: generalize mt76_get_txpower for 4x4:4 devices Lorenzo Bianconi @ 2019-05-26 14:05 ` Lorenzo Bianconi 2019-05-26 14:05 ` [PATCH 3/4] mt76: mt7615: init get_txpower mac80211 callback Lorenzo Bianconi ` (2 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: Lorenzo Bianconi @ 2019-05-26 14:05 UTC (permalink / raw) To: nbd; +Cc: lorenzo.bianconi, linux-wireless, ryder.lee, royluo Introduce mt7615_mcu_set_tx_power routine in order to cap tx power according to the value configured by the user Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> --- .../wireless/mediatek/mt76/mt7615/eeprom.c | 34 ++++++++++ .../wireless/mediatek/mt76/mt7615/eeprom.h | 35 ++++++++++ .../net/wireless/mediatek/mt76/mt7615/main.c | 3 + .../net/wireless/mediatek/mt76/mt7615/mcu.c | 64 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.h | 1 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 3 + 6 files changed, 140 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c index 714590878d65..023c8bbc767d 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c @@ -110,6 +110,40 @@ static void mt7615_eeprom_parse_hw_cap(struct mt7615_dev *dev) } } +int mt7615_eeprom_get_power_index(struct ieee80211_channel *chan, + u8 chain_idx) +{ + int index; + + if (chain_idx > 3) + return -EINVAL; + + if (chan->band == NL80211_BAND_2GHZ) { + index = MT_EE_TX0_2G_TARGET_POWER + chain_idx * 6; + } else { + int group = mt7615_get_channel_group(chan->hw_value); + + switch (chain_idx) { + case 1: + index = MT_EE_TX1_5G_G0_TARGET_POWER; + break; + case 2: + index = MT_EE_TX2_5G_G0_TARGET_POWER; + break; + case 3: + index = MT_EE_TX3_5G_G0_TARGET_POWER; + break; + case 0: + default: + index = MT_EE_TX0_5G_G0_TARGET_POWER; + break; + } + index += 5 * group; + } + + return index; +} + int mt7615_eeprom_init(struct mt7615_dev *dev) { int ret; diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h b/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h index b422e395d6ee..3c9086b67f51 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h +++ b/drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h @@ -12,6 +12,11 @@ enum mt7615_eeprom_field { MT_EE_MAC_ADDR = 0x004, MT_EE_NIC_CONF_0 = 0x034, MT_EE_WIFI_CONF = 0x03e, + MT_EE_TX0_2G_TARGET_POWER = 0x058, + MT_EE_TX0_5G_G0_TARGET_POWER = 0x070, + MT_EE_TX1_5G_G0_TARGET_POWER = 0x098, + MT_EE_TX2_5G_G0_TARGET_POWER = 0x142, + MT_EE_TX3_5G_G0_TARGET_POWER = 0x16a, __MT_EE_MAX = 0x3bf }; @@ -24,4 +29,34 @@ enum mt7615_eeprom_band { MT_EE_DBDC, }; +enum mt7615_channel_group { + MT_CH_5G_JAPAN, + MT_CH_5G_UNII_1, + MT_CH_5G_UNII_2A, + MT_CH_5G_UNII_2B, + MT_CH_5G_UNII_2E_1, + MT_CH_5G_UNII_2E_2, + MT_CH_5G_UNII_2E_3, + MT_CH_5G_UNII_3, + __MT_CH_MAX +}; + +static inline enum mt7615_channel_group +mt7615_get_channel_group(int channel) +{ + if (channel >= 184 && channel <= 196) + return MT_CH_5G_JAPAN; + if (channel <= 48) + return MT_CH_5G_UNII_1; + if (channel <= 64) + return MT_CH_5G_UNII_2A; + if (channel <= 114) + return MT_CH_5G_UNII_2E_1; + if (channel <= 144) + return MT_CH_5G_UNII_2E_2; + if (channel <= 161) + return MT_CH_5G_UNII_2E_3; + return MT_CH_5G_UNII_3; +} + #endif diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c index b0bb7cc12385..72bdb871ca13 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c @@ -201,6 +201,9 @@ static int mt7615_config(struct ieee80211_hw *hw, u32 changed) mutex_unlock(&dev->mt76.mutex); } + if (changed & IEEE80211_CONF_CHANGE_POWER) + ret = mt7615_mcu_set_tx_power(dev); + if (changed & IEEE80211_CONF_CHANGE_MONITOR) { mutex_lock(&dev->mt76.mutex); diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c index 43f70195244c..0e12e9f05f95 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c @@ -1151,6 +1151,70 @@ int mt7615_mcu_set_bcn(struct mt7615_dev *dev, struct ieee80211_vif *vif, &req, sizeof(req), true); } +int mt7615_mcu_set_tx_power(struct mt7615_dev *dev) +{ + int i, ret, n_chains = hweight8(dev->mt76.antenna_mask); + struct cfg80211_chan_def *chandef = &dev->mt76.chandef; + u8 *req, *data, *eep = (u8 *)dev->mt76.eeprom.data; + struct ieee80211_hw *hw = mt76_hw(dev); + int freq = chandef->center_freq1, len; + struct { + u8 center_chan; + u8 dbdc_idx; + u8 band; + u8 rsv; + } __packed req_hdr = { + .center_chan = ieee80211_frequency_to_channel(freq), + .band = chandef->chan->band, + }; + s8 tx_power; + + len = sizeof(req_hdr) + __MT_EE_MAX - MT_EE_NIC_CONF_0; + req = kzalloc(len, GFP_KERNEL); + if (!req) + return -ENOMEM; + + memcpy(req, &req_hdr, sizeof(req_hdr)); + data = req + sizeof(req_hdr); + memcpy(data, eep + MT_EE_NIC_CONF_0, + __MT_EE_MAX - MT_EE_NIC_CONF_0); + + tx_power = hw->conf.power_level * 2; + switch (n_chains) { + case 4: + tx_power -= 12; + break; + case 3: + tx_power -= 8; + break; + case 2: + tx_power -= 6; + break; + default: + break; + } + tx_power = max_t(s8, tx_power, 0); + dev->mt76.txpower_cur = tx_power; + + for (i = 0; i < n_chains; i++) { + int index = -MT_EE_NIC_CONF_0; + + ret = mt7615_eeprom_get_power_index(chandef->chan, i); + if (ret < 0) + goto out; + + index += ret; + data[index] = min_t(u8, data[index], tx_power); + } + + ret = __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_TX_POWER_CTRL, + req, len, true); +out: + kfree(req); + + return ret; +} + int mt7615_mcu_set_channel(struct mt7615_dev *dev) { struct cfg80211_chan_def *chdef = &dev->mt76.chandef; diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h index e96efb13fa4d..cca11737693c 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h @@ -70,6 +70,7 @@ enum { enum { MCU_EXT_CMD_PM_STATE_CTRL = 0x07, MCU_EXT_CMD_CHANNEL_SWITCH = 0x08, + MCU_EXT_CMD_SET_TX_POWER_CTRL = 0x11, MCU_EXT_CMD_EFUSE_BUFFER_MODE = 0x21, MCU_EXT_CMD_STA_REC_UPDATE = 0x25, MCU_EXT_CMD_BSS_INFO_UPDATE = 0x26, diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h index 09c48dfbef3c..7c08d3b93a2a 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h @@ -105,6 +105,8 @@ u32 mt7615_reg_map(struct mt7615_dev *dev, u32 addr); int mt7615_register_device(struct mt7615_dev *dev); void mt7615_unregister_device(struct mt7615_dev *dev); int mt7615_eeprom_init(struct mt7615_dev *dev); +int mt7615_eeprom_get_power_index(struct ieee80211_channel *chan, + u8 chain_idx); int mt7615_dma_init(struct mt7615_dev *dev); void mt7615_dma_cleanup(struct mt7615_dev *dev); int mt7615_mcu_init(struct mt7615_dev *dev); @@ -167,6 +169,7 @@ int mt7615_mcu_set_eeprom(struct mt7615_dev *dev); int mt7615_mcu_init_mac(struct mt7615_dev *dev); int mt7615_mcu_set_rts_thresh(struct mt7615_dev *dev, u32 val); int mt7615_mcu_ctrl_pm_state(struct mt7615_dev *dev, int enter); +int mt7615_mcu_set_tx_power(struct mt7615_dev *dev); void mt7615_mcu_exit(struct mt7615_dev *dev); int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, -- 2.21.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/4] mt76: mt7615: init get_txpower mac80211 callback 2019-05-26 14:05 [PATCH 0/4] add tx power configuration support to mt7615 driver Lorenzo Bianconi 2019-05-26 14:05 ` [PATCH 1/4] mt76: generalize mt76_get_txpower for 4x4:4 devices Lorenzo Bianconi 2019-05-26 14:05 ` [PATCH 2/4] mt76: mt7615: add the capability to configure tx power Lorenzo Bianconi @ 2019-05-26 14:05 ` Lorenzo Bianconi 2019-05-26 14:05 ` [PATCH 4/4] mt76: mt7615: rearrange locking in mt7615_config Lorenzo Bianconi 2019-06-07 16:56 ` [PATCH 0/4] add tx power configuration support to mt7615 driver Felix Fietkau 4 siblings, 0 replies; 6+ messages in thread From: Lorenzo Bianconi @ 2019-05-26 14:05 UTC (permalink / raw) To: nbd; +Cc: lorenzo.bianconi, linux-wireless, ryder.lee, royluo Initialize get_txpower mac80211 callback to mt76_get_txpower in order to report the configured tx power to mac80211 Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> --- drivers/net/wireless/mediatek/mt76/mt7615/main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c index 72bdb871ca13..cedc4c25f34d 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c @@ -493,4 +493,5 @@ const struct ieee80211_ops mt7615_ops = { .sw_scan_start = mt7615_sw_scan, .sw_scan_complete = mt7615_sw_scan_complete, .release_buffered_frames = mt76_release_buffered_frames, + .get_txpower = mt76_get_txpower, }; -- 2.21.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 4/4] mt76: mt7615: rearrange locking in mt7615_config 2019-05-26 14:05 [PATCH 0/4] add tx power configuration support to mt7615 driver Lorenzo Bianconi ` (2 preceding siblings ...) 2019-05-26 14:05 ` [PATCH 3/4] mt76: mt7615: init get_txpower mac80211 callback Lorenzo Bianconi @ 2019-05-26 14:05 ` Lorenzo Bianconi 2019-06-07 16:56 ` [PATCH 0/4] add tx power configuration support to mt7615 driver Felix Fietkau 4 siblings, 0 replies; 6+ messages in thread From: Lorenzo Bianconi @ 2019-05-26 14:05 UTC (permalink / raw) To: nbd; +Cc: lorenzo.bianconi, linux-wireless, ryder.lee, royluo Since all the routines in mt7615_config grub mt76.mutex moves mutex_lock/mutex_unlock at the beginning/end of mt7615_config Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> --- drivers/net/wireless/mediatek/mt76/mt7615/main.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c index cedc4c25f34d..c8411750f62b 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c @@ -191,31 +191,28 @@ static int mt7615_config(struct ieee80211_hw *hw, u32 changed) struct mt7615_dev *dev = hw->priv; int ret = 0; - if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { - mutex_lock(&dev->mt76.mutex); + mutex_lock(&dev->mt76.mutex); + if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { ieee80211_stop_queues(hw); ret = mt7615_set_channel(dev, &hw->conf.chandef); ieee80211_wake_queues(hw); - - mutex_unlock(&dev->mt76.mutex); } if (changed & IEEE80211_CONF_CHANGE_POWER) ret = mt7615_mcu_set_tx_power(dev); if (changed & IEEE80211_CONF_CHANGE_MONITOR) { - mutex_lock(&dev->mt76.mutex); - if (!(hw->conf.flags & IEEE80211_CONF_MONITOR)) dev->mt76.rxfilter |= MT_WF_RFCR_DROP_OTHER_UC; else dev->mt76.rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC; mt76_wr(dev, MT_WF_RFCR, dev->mt76.rxfilter); - - mutex_unlock(&dev->mt76.mutex); } + + mutex_unlock(&dev->mt76.mutex); + return ret; } -- 2.21.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 0/4] add tx power configuration support to mt7615 driver 2019-05-26 14:05 [PATCH 0/4] add tx power configuration support to mt7615 driver Lorenzo Bianconi ` (3 preceding siblings ...) 2019-05-26 14:05 ` [PATCH 4/4] mt76: mt7615: rearrange locking in mt7615_config Lorenzo Bianconi @ 2019-06-07 16:56 ` Felix Fietkau 4 siblings, 0 replies; 6+ messages in thread From: Felix Fietkau @ 2019-06-07 16:56 UTC (permalink / raw) To: Lorenzo Bianconi; +Cc: lorenzo.bianconi, linux-wireless, ryder.lee, royluo On 2019-05-26 16:05, Lorenzo Bianconi wrote: > Cap tx power according to the value configured by the user. > Initialize get_txpower mac80211 callback in order to report the > configured tx power to mac80211 > > Lorenzo Bianconi (4): > mt76: generalize mt76_get_txpower for 4x4:4 devices > mt76: mt7615: add the capability to configure tx power > mt76: mt7615: init get_txpower mac80211 callback > mt76: mt7615: rearrange locking in mt7615_config Applied, thanks. - Felix ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-06-07 16:56 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-05-26 14:05 [PATCH 0/4] add tx power configuration support to mt7615 driver Lorenzo Bianconi 2019-05-26 14:05 ` [PATCH 1/4] mt76: generalize mt76_get_txpower for 4x4:4 devices Lorenzo Bianconi 2019-05-26 14:05 ` [PATCH 2/4] mt76: mt7615: add the capability to configure tx power Lorenzo Bianconi 2019-05-26 14:05 ` [PATCH 3/4] mt76: mt7615: init get_txpower mac80211 callback Lorenzo Bianconi 2019-05-26 14:05 ` [PATCH 4/4] mt76: mt7615: rearrange locking in mt7615_config Lorenzo Bianconi 2019-06-07 16:56 ` [PATCH 0/4] add tx power configuration support to mt7615 driver Felix Fietkau
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).