add set_coverage support to mt7615 driver
Subsystems (2)
Lorenzo Bianconi
maintainercover add set_coverage support to mt7615 driver
Add the capability to configure ack timeout and slottime to mt7615 driver. Move coverage_class and slottime fields to mt76_dev structure. Fix coverage_class definition in mt76x02 driver
Lorenzo Bianconi (3):
mt76: mt76x02: fix coverage_class type
mt76: move coverage_class and slottime in mt76_dev
mt76: mt7615: add set_coverage class support
drivers/net/wireless/mediatek/mt76/mt76.h | 3 ++ .../net/wireless/mediatek/mt76/mt7603/init.c | 2 +- .../net/wireless/mediatek/mt76/mt7603/mac.c | 6 +-- .../net/wireless/mediatek/mt76/mt7603/main.c | 6 +-- .../wireless/mediatek/mt76/mt7603/mt7603.h | 3 -- .../net/wireless/mediatek/mt76/mt7615/init.c | 1 + .../net/wireless/mediatek/mt76/mt7615/mac.c | 41 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/main.c | 20 +++++++++ .../wireless/mediatek/mt76/mt7615/mt7615.h | 4 ++ .../net/wireless/mediatek/mt76/mt7615/regs.h | 21 ++++++++++ drivers/net/wireless/mediatek/mt76/mt76x02.h | 3 -- .../net/wireless/mediatek/mt76/mt76x02_util.c | 10 ++--- 12 files changed, 102 insertions(+), 18 deletions(-)
Signature · 1 line
2.21.0
Lorenzo Bianconi
maintainerPATCH 1/3 mt76: mt76x02: fix coverage_class type
Fix coverage_class definition in mt76x02_dev data structure since coverage_class can be negative to enable dynack (just supported by ath9k)
--- drivers/net/wireless/mediatek/mt76/mt76x02.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt76x02.h +1 -1
@@ -110,7 +110,7 @@ struct mt76x02_dev {bool no_2ghz; -u8 coverage_class; +s16 coverage_class;u8 slottime;struct mt76x02_dfs_pattern_detector dfs_pd;
Signature · 1 line
2.21.0
Felix Fietkau
maintainerRe: [PATCH 1/3] mt76: mt76x02: fix coverage_class type
Quoted 6 lines · Lorenzo Bianconi
Fix
coverage_classdefinition inmt76x02_devdata structure sincecoverage_classcan be negative to enable dynack (just supported by ath9k)Fixes 7bc04215a66b ("mt76: add driver code for MT76x2e")Signed-off-by Lorenzo Bianconi <[email protected]>
I'd prefer a patch that sets the internal coverage_class field value to 0 for negative input values.
- Felix
Lorenzo Bianconi
maintainerRe: [PATCH 1/3] mt76: mt76x02: fix coverage_class type
Quoted 9 lines · Lorenzo Bianconi
Quoted 6 lines
Fix
coverage_classdefinition inmt76x02_devdata structure sincecoverage_classcan be negative to enable dynack (just supported by ath9k)Fixes 7bc04215a66b ("mt76: add driver code for MT76x2e")Signed-off-by Lorenzo Bianconi <[email protected]>I'd prefer a patch that sets the internal
coverage_classfield value to 0 for negative input values.
ack, I will do in v2
Regards,
Lorenzo
Quoted 2 lines
- Felix
Lorenzo Bianconi
maintainerPATCH 2/3 mt76: move coverage_class and slottime in mt76_dev
In reply to Lorenzo BianconiMove coverage_class and slottime fields from driver specific data structure to mt76_dev since they are used by all drivers
--- drivers/net/wireless/mediatek/mt76/mt76.h | 3 +++ drivers/net/wireless/mediatek/mt76/mt7603/init.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7603/mac.c | 6 +++--- drivers/net/wireless/mediatek/mt76/mt7603/main.c | 6 +++--- drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h | 3 --- drivers/net/wireless/mediatek/mt76/mt76x02.h | 3 --- drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 10 +++++----- 7 files changed, 15 insertions(+), 18 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +3 -0
@@ -507,6 +507,9 @@ struct mt76_dev {u8 antenna_mask;u16 chainmask; +s16 coverage_class; +u8 slottime; +struct tasklet_struct pre_tbtt_tasklet;int beacon_int;u8 beacon_mask;
drivers/net/wireless/mediatek/mt76/mt7603/init.c +1 -1
@@ -539,7 +539,7 @@ int mt7603_register_device(struct mt7603_dev *dev)if (mt76_rr (dev,MT_EFUSE_BASE +0x64 ) &BIT (4 )) dev->mt76.antenna_mask =1 ; - dev->slottime =9 ; + dev->mt76.slottime =9 ; ret =mt7603_init_hardware (dev);if (ret)
drivers/net/wireless/mediatek/mt76/mt7603/mac.c +3 -3
@@ -47,7 +47,7 @@ void mt7603_mac_set_timing(struct mt7603_dev *dev)FIELD_PREP (MT_TIMEOUT_VAL_CCA ,48 );u32 ofdm =FIELD_PREP (MT_TIMEOUT_VAL_PLCP ,60 ) |FIELD_PREP (MT_TIMEOUT_VAL_CCA ,24 ); -int offset =3 * dev->coverage_class; +int offset =3 * dev->mt76.coverage_class;u32 reg_offset =FIELD_PREP (MT_TIMEOUT_VAL_PLCP , offset) |FIELD_PREP (MT_TIMEOUT_VAL_CCA , offset);int sifs;
@@ -68,9 +68,9 @@ void mt7603_mac_set_timing(struct mt7603_dev *dev)FIELD_PREP (MT_IFS_EIFS ,360 ) |FIELD_PREP (MT_IFS_RIFS ,2 ) |FIELD_PREP (MT_IFS_SIFS , sifs) | - FIELD_PREP(MT_IFS_SLOT, dev->slottime)); + FIELD_PREP(MT_IFS_SLOT, dev->mt76.slottime)); -if (dev->slottime <20 ) +if (dev->mt76.slottime <20 ) val =MT7603_CFEND_RATE_DEFAULT ;else val =MT7603_CFEND_RATE_11B ;
drivers/net/wireless/mediatek/mt76/mt7603/main.c +3 -3
@@ -295,8 +295,8 @@ mt7603_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,if (changed &BSS_CHANGED_ERP_SLOT ) {int slottime = info->use_short_slot ?9 :20 ; -if (slottime != dev->slottime) { - dev->slottime = slottime; +if (slottime != dev->mt76.slottime) { + dev->mt76.slottime = slottime;mt7603_mac_set_timing (dev); } }
@@ -635,7 +635,7 @@ mt7603_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class) {struct mt7603_dev *dev = hw->priv; - dev->coverage_class = coverage_class; + dev->mt76.coverage_class = coverage_class;mt7603_mac_set_timing (dev); }
drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h +0 -3
@@ -118,9 +118,6 @@ struct mt7603_dev {__le32 rx_ampdu_ts;u8 rssi_offset[3 ]; -u8 slottime; -s16 coverage_class; -s8 tx_power_limit;ktime_t ed_time;
drivers/net/wireless/mediatek/mt76/mt76x02.h +0 -3
@@ -110,9 +110,6 @@ struct mt76x02_dev {bool no_2ghz; -s16 coverage_class; -u8 slottime; -struct mt76x02_dfs_pattern_detector dfs_pd;/* edcca monitor */
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +5 -5
@@ -185,7 +185,7 @@ void mt76x02_init_device(struct mt76x02_dev *dev) dev->mt76.global_wcid.idx =255 ; dev->mt76.global_wcid.hw_key_idx =-1 ; - dev->slottime =9 ; + dev->mt76.slottime =9 ;if (is_mt76x2 (dev)) { dev->mt76.sband_2g.sband.ht_cap.cap |=
@@ -522,10 +522,10 @@ EXPORT_SYMBOL_GPL(mt76x02_conf_tx);void mt76x02_set_tx_ackto (struct mt76x02_dev *dev) { -u8 ackto, sifs, slottime = dev->slottime; +u8 ackto, sifs, slottime = dev->mt76.slottime;/* As defined by IEEE 802.11-2007 17.3.8.6 */ - slottime +=3 * dev->coverage_class; + slottime +=3 * dev->mt76.coverage_class;mt76_rmw_field (dev,MT_BKOFF_SLOT_CFG ,MT_BKOFF_SLOT_CFG_SLOTTIME , slottime);
@@ -544,7 +544,7 @@ void mt76x02_set_coverage_class(struct ieee80211_hw *hw,struct mt76x02_dev *dev = hw->priv;mutex_lock (&dev->mt76.mutex); - dev->coverage_class = coverage_class; + dev->mt76.coverage_class = coverage_class;mt76x02_set_tx_ackto (dev);mutex_unlock (&dev->mt76.mutex); }
@@ -656,7 +656,7 @@ void mt76x02_bss_info_changed(struct ieee80211_hw *hw,if (changed &BSS_CHANGED_ERP_SLOT ) {int slottime = info->use_short_slot ?9 :20 ; - dev->slottime = slottime; + dev->mt76.slottime = slottime;mt76x02_set_tx_ackto (dev); }
Signature · 1 line
2.21.0
Felix Fietkau
maintainerRe: [PATCH 2/3] mt76: move coverage_class and slottime in mt76_dev
Quoted 4 lines · Lorenzo Bianconi
Move
coverage_classand slottime fields from driver specific data structure tomt76_devsince they are used by all driversSigned-off-by Lorenzo Bianconi <[email protected]>
Please drop this patch. I've moved a few other fields back from struct mt76_dev to driver specific structs, because they were in the way of DBDC related rework, and this one would fit the category too.
As a general policy, I think we should only move fields to struct mt76_dev if they are actually used by core code as well.
- Felix
Lorenzo Bianconi
maintainerRe: [PATCH 2/3] mt76: move coverage_class and slottime in mt76_dev
Quoted 11 lines · Lorenzo Bianconi
Quoted 4 lines
Move
coverage_classand slottime fields from driver specific data structure tomt76_devsince they are used by all driversSigned-off-by Lorenzo Bianconi <[email protected]>Please drop this patch. I've moved a few other fields back from struct
mt76_devto driver specific structs, because they were in the way of DBDC related rework, and this one would fit the category too.As a general policy, I think we should only move fields to struct
mt76_devif they are actually used by core code as well.
ack, let's drop this patch. In the future we will need to integrate the timeing code in DBDC one since mt7615 has related regs for band0 and band1. Maybe we need to move them in mt76_phy?
Regards,
Lorenzo
Quoted 2 lines
- Felix
Felix Fietkau
maintainerRe: [PATCH 2/3] mt76: move coverage_class and slottime in mt76_dev
Quoted 9 lines · Lorenzo Bianconi
Quoted 9 lines · Lorenzo Bianconi
Quoted 4 lines
Move
coverage_classand slottime fields from driver specific data structure tomt76_devsince they are used by all driversSigned-off-by Lorenzo Bianconi <[email protected]>Please drop this patch. I've moved a few other fields back from struct
mt76_devto driver specific structs, because they were in the way of DBDC related rework, and this one would fit the category too.
Quoted 6 lines
Quoted 2 lines
As a general policy, I think we should only move fields to struct
mt76_devif they are actually used by core code as well.ack, let's drop this patch. In the future we will need to integrate the timeing code in DBDC one since mt7615 has related regs for band0 and band1. Maybe we need to move them in mt76_phy?I'd prefer struct
mt7615_phyfor now, unless we have a good reason to
keep it in mt76 core.
- Felix
Lorenzo Bianconi
maintainerPATCH 3/3 mt76: mt7615: add set_coverage class support
In reply to Lorenzo BianconiAdd the capability to configure the acktimeout for mt7615 driver. Moreover configure slottime according to the value provided by mac80211
--- .../net/wireless/mediatek/mt76/mt7615/init.c | 1 + .../net/wireless/mediatek/mt76/mt7615/mac.c | 41 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/main.c | 20 +++++++++ .../wireless/mediatek/mt76/mt7615/mt7615.h | 4 ++ .../net/wireless/mediatek/mt76/mt7615/regs.h | 21 ++++++++++ 5 files changed, 87 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7615/init.c +1 -0
@@ -304,6 +304,7 @@ int mt7615_register_device(struct mt7615_dev *dev)IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK |IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ ; dev->dfs_state =-1 ; + dev->mt76.slottime =9 ; ret =mt76_register_device (&dev->mt76, true, mt7615_rates,ARRAY_SIZE (mt7615_rates));
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +41 -0
47 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/main.c +20 -0
@@ -155,6 +155,7 @@ static int mt7615_set_channel(struct mt7615_dev *dev)if (ret) goto out; +mt7615_mac_set_timing (dev); ret =mt7615_dfs_init_radar_detector (dev);mt7615_mac_cca_stats_reset (dev); dev->mt76.survey_time =ktime_get_boottime ();
@@ -327,6 +328,15 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw,if (changed &BSS_CHANGED_ASSOC )mt7615_mcu_set_bss_info (dev, vif, info->assoc); +if (changed &BSS_CHANGED_ERP_SLOT ) { +int slottime = info->use_short_slot ?9 :20 ; + +if (slottime != dev->mt76.slottime) { + dev->mt76.slottime = slottime; +mt7615_mac_set_timing (dev); + } + } +/* TODO: update beacon content * BSS_CHANGED_BEACON */
@@ -520,6 +530,15 @@ mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,return 0 ; } +static void +mt7615_set_coverage_class (struct ieee80211_hw *hw,s16 coverage_class) +{ +struct mt7615_dev *dev = hw->priv; + + dev->mt76.coverage_class = coverage_class; +mt7615_mac_set_timing (dev); +} +const struct ieee80211_ops mt7615_ops = { .tx = mt7615_tx, .start = mt7615_start,
@@ -543,4 +562,5 @@ const struct ieee80211_ops mt7615_ops = { .channel_switch_beacon = mt7615_channel_switch_beacon, .get_survey = mt76_get_survey, .get_antenna = mt76_get_antenna, + .set_coverage_class = mt7615_set_coverage_class, };
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +4 -0
@@ -36,6 +36,9 @@#define MT_FRAC_SCALE 12#define MT_FRAC (val, div) (((val) << MT_FRAC_SCALE) / (div)) +#define MT7615_CFEND_RATE_DEFAULT 0x69/* chip default (24M) */ +#define MT7615_CFEND_RATE_11B 0x03/* 11B LP, 11M */ +struct mt7615_vif ;struct mt7615_sta ;
@@ -246,6 +249,7 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi, struct sk_buff *skb, struct mt76_wcid *wcid, struct ieee80211_sta *sta, int pid, struct ieee80211_key_conf *key); +void mt7615_mac_set_timing (struct mt7615_dev *dev);int mt7615_mac_fill_rx (struct mt7615_dev *dev,struct sk_buff *skb);void mt7615_mac_add_txs (struct mt7615_dev *dev,void *data);void mt7615_mac_tx_free (struct mt7615_dev *dev,struct sk_buff *skb);
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +21 -0
@@ -153,14 +153,35 @@#define MT_AGG_SCR MT_WF_AGG(0x0fc)#define MT_AGG_SCR_NLNAV_MID_PTEC_DIS BIT(3) +#define MT_WF_ARB_BASE 0x20c00 +#define MT_WF_ARB (ofs) (MT_WF_ARB_BASE + (ofs)) + +#define MT_ARB_SCR MT_WF_ARB(0x080) +#define MT_ARB_SCR_TX0_DISABLE BIT(8) +#define MT_ARB_SCR_RX0_DISABLE BIT(9) +#define MT_ARB_SCR_TX1_DISABLE BIT(10) +#define MT_ARB_SCR_RX1_DISABLE BIT(11) +#define MT_WF_TMAC_BASE 0x21000#define MT_WF_TMAC (ofs) (MT_WF_TMAC_BASE + (ofs)) +#define MT_TMAC_CDTR MT_WF_TMAC(0x090) +#define MT_TMAC_ODTR MT_WF_TMAC(0x094) +#define MT_TIMEOUT_VAL_PLCP GENMASK(15, 0) +#define MT_TIMEOUT_VAL_CCA GENMASK(31, 16) +#define MT_TMAC_TRCR0 MT_WF_TMAC(0x09c)#define MT_TMAC_TRCR1 MT_WF_TMAC(0x070)#define MT_TMAC_TRCR_CCA_SEL GENMASK(31, 30)#define MT_TMAC_TRCR_SEC_CCA_SEL GENMASK(29, 28) +#define MT_TMAC_ICR0 MT_WF_TMAC(0x0a4) +#define MT_TMAC_ICR1 MT_WF_TMAC(0x074) +#define MT_IFS_EIFS GENMASK(8, 0) +#define MT_IFS_RIFS GENMASK(14, 10) +#define MT_IFS_SIFS GENMASK(22, 16) +#define MT_IFS_SLOT GENMASK(30, 24) +#define MT_TMAC_CTCR0 MT_WF_TMAC(0x0f4)#define MT_TMAC_CTCR0_INS_DDLMT_REFTIME GENMASK(5, 0)#define MT_TMAC_CTCR0_INS_DDLMT_DENSITY GENMASK(15, 12)
Signature · 1 line
2.21.0