Skip to contentSkip to conversation

add set_coverage support to mt7615 driver

PATCH Superseded Lorenzo Bianconi 2 participants 9 messages Nov 15, 2019 – Nov 20, 2019

Subsystems (2)

v1 of 4 Superseded Latest is v4 →

lore
Share & tools
lore

Lorenzo Bianconi

author maintainer
#0 lore raw

cover 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
author maintainer
#1 lore raw

PATCH 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)

Fixes 7bc04215a66b ("mt76: add driver code for MT76x2e")
---
 drivers/net/wireless/mediatek/mt76/mt76x02.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt76x02.h +1 -1
index 0ca0bbfe8769..cdc1cbd1d392 100644
@@ -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
maintainer
#2 lore raw

Re: [PATCH 1/3] mt76: mt76x02: fix coverage_class type

Quoted 6 lines · Lorenzo Bianconi

Fix coverage_class definition in mt76x02_dev data structure since coverage_class can be negative to enable dynack (just supported by ath9k)

Fixes 7bc04215a66b ("mt76: add driver code for MT76x2e")

I'd prefer a patch that sets the internal coverage_class field value to 0 for negative input values.

- Felix

author maintainer
#3 lore raw

Re: [PATCH 1/3] mt76: mt76x02: fix coverage_class type

Quoted 9 lines · Lorenzo Bianconi
Quoted 6 lines

Fix coverage_class definition in mt76x02_dev data structure since coverage_class can be negative to enable dynack (just supported by ath9k)

Fixes 7bc04215a66b ("mt76: add driver code for MT76x2e")

I'd prefer a patch that sets the internal coverage_class field value to 0 for negative input values.

ack, I will do in v2

Regards,
Lorenzo

Quoted 2 lines

- Felix

author maintainer
#4 lore raw

PATCH 2/3 mt76: move coverage_class and slottime in mt76_dev

In reply to Lorenzo Bianconi

Move 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
index 4116ad7928da..07a1b808a142 100644
@@ -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
index 0696dbf28c5b..26eaf03baa08 100644
@@ -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
index 812d081ad943..2c7c69106a20 100644
@@ -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
index 6a6bc37b898f..031526bb23a7 100644
@@ -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
index ab54b0612e98..930a1bcab0ef 100644
@@ -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
index cdc1cbd1d392..d24c44725b1c 100644
@@ -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
index c0500d8f9a67..74c6552a9874 100644
@@ -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
maintainer
#5 lore raw

Re: [PATCH 2/3] mt76: move coverage_class and slottime in mt76_dev

Quoted 4 lines · Lorenzo Bianconi

Move coverage_class and slottime fields from driver specific data structure to mt76_dev since they are used by all drivers

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

author maintainer
#6 lore raw

Re: [PATCH 2/3] mt76: move coverage_class and slottime in mt76_dev

Quoted 11 lines · Lorenzo Bianconi
Quoted 4 lines

Move coverage_class and slottime fields from driver specific data structure to mt76_dev since they are used by all drivers

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.

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

maintainer
#7 lore raw

Re: [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_class and slottime fields from driver specific data structure to mt76_dev since they are used by all drivers

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.

Quoted 6 lines
Quoted 2 lines

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.

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_phy for now, unless we have a good reason to

keep it in mt76 core.

- Felix

author maintainer
#8 lore raw

PATCH 3/3 mt76: mt7615: add set_coverage class support

In reply to Lorenzo Bianconi

Add 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
index 553bd4d988f7..54108fbaf1c4 100644
@@ -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
index 78bbed7a4645..61df5d1da6c6 100644
@@ -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
index d537f68c5531..3c4a4b3e45d5 100644
@@ -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
index 61a4aa9ac6e6..5ac52758d7b1 100644
@@ -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