linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mt76: mt7615: set mcu country code in mt7615_mcu_set_channel_domain()
@ 2021-01-08 17:34 Lorenzo Bianconi
  2021-01-14 10:08 ` Felix Fietkau
  0 siblings, 1 reply; 2+ messages in thread
From: Lorenzo Bianconi @ 2021-01-08 17:34 UTC (permalink / raw)
  To: nbd; +Cc: lorenzo.bianconi, linux-wireless, sean.wang

Update mcu country code running mt7615_mcu_set_channel_domain routine in
mt7615_regd_notifier().
Filter out disabled channels in mt7615_mcu_set_channel_domain().

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/net/wireless/mediatek/mt76/mt76.h     |  1 +
 .../net/wireless/mediatek/mt76/mt7615/init.c  | 10 +++--
 .../net/wireless/mediatek/mt76/mt7615/mcu.c   | 43 +++++++++++++------
 .../wireless/mediatek/mt76/mt7615/mt7615.h    |  3 ++
 4 files changed, 40 insertions(+), 17 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 10034c21f812..5c86ade0aa1e 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -647,6 +647,7 @@ struct mt76_dev {
 
 	struct mt76_rate_power rate_power;
 
+	char alpha2[3];
 	enum nl80211_dfs_regions region;
 
 	u32 debugfs_reg;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
index a73b76e57c7f..635b94de1021 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
@@ -296,13 +296,15 @@ mt7615_regd_notifier(struct wiphy *wiphy,
 	struct mt7615_phy *phy = mphy->priv;
 	struct cfg80211_chan_def *chandef = &mphy->chandef;
 
+	memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2));
 	dev->mt76.region = request->dfs_region;
 
-	if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR))
-		return;
-
 	mt7615_mutex_acquire(dev);
-	mt7615_dfs_init_radar_detector(phy);
+
+	if (chandef->chan->flags & IEEE80211_CHAN_RADAR)
+		mt7615_dfs_init_radar_detector(phy);
+	mt7615_mcu_set_channel_domain(phy);
+
 	mt7615_mutex_release(dev);
 }
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
index c49e9041006f..715423c325e1 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
@@ -2981,6 +2981,7 @@ int mt7615_mcu_set_channel_domain(struct mt7615_phy *phy)
 {
 	struct mt76_phy *mphy = phy->mt76;
 	struct mt7615_dev *dev = phy->dev;
+	u32 country_code = MT76_ALPHA2_TO_CC(dev->mt76.alpha2);
 	struct mt7615_mcu_channel_domain {
 		__le32 country_code; /* regulatory_request.alpha2 */
 		u8 bw_2g; /* BW_20_40M		0
@@ -2995,45 +2996,61 @@ int mt7615_mcu_set_channel_domain(struct mt7615_phy *phy)
 		u8 n_5ch;
 		__le16 pad2;
 	} __packed hdr = {
+		.country_code = cpu_to_le32(country_code),
 		.bw_2g = 0,
 		.bw_5g = 3,
-		.n_2ch = mphy->sband_2g.sband.n_channels,
-		.n_5ch = mphy->sband_5g.sband.n_channels,
 	};
 	struct mt7615_mcu_chan {
 		__le16 hw_value;
 		__le16 pad;
 		__le32 flags;
-	} __packed;
-	int i, n_channels = hdr.n_2ch + hdr.n_5ch;
-	int len = sizeof(hdr) + n_channels * sizeof(struct mt7615_mcu_chan);
+	} __packed channel;
+	int len, i, n_max_channels, n_2ch = 0, n_5ch = 0;
+	struct ieee80211_channel *chan;
 	struct sk_buff *skb;
 
 	if (!mt7615_firmware_offload(dev))
 		return 0;
 
+	n_max_channels = mphy->sband_2g.sband.n_channels +
+			 mphy->sband_5g.sband.n_channels;
+	len = sizeof(hdr) + n_max_channels * sizeof(channel);
+
 	skb = mt76_mcu_msg_alloc(&dev->mt76, NULL, len);
 	if (!skb)
 		return -ENOMEM;
 
-	skb_put_data(skb, &hdr, sizeof(hdr));
+	skb_reserve(skb, sizeof(hdr));
 
-	for (i = 0; i < n_channels; i++) {
-		struct ieee80211_channel *chan;
-		struct mt7615_mcu_chan channel;
+	for (i = 0; i < mphy->sband_2g.sband.n_channels; i++) {
+		chan = &mphy->sband_2g.sband.channels[i];
+		if (chan->flags & IEEE80211_CHAN_DISABLED)
+			continue;
 
-		if (i < hdr.n_2ch)
-			chan = &mphy->sband_2g.sband.channels[i];
-		else
-			chan = &mphy->sband_5g.sband.channels[i - hdr.n_2ch];
+		channel.hw_value = cpu_to_le16(chan->hw_value);
+		channel.flags = cpu_to_le32(chan->flags);
+		channel.pad = 0;
+
+		skb_put_data(skb, &channel, sizeof(channel));
+		n_2ch++;
+	}
+	for (i = 0; i < mphy->sband_5g.sband.n_channels; i++) {
+		chan = &mphy->sband_5g.sband.channels[i];
+		if (chan->flags & IEEE80211_CHAN_DISABLED)
+			continue;
 
 		channel.hw_value = cpu_to_le16(chan->hw_value);
 		channel.flags = cpu_to_le32(chan->flags);
 		channel.pad = 0;
 
 		skb_put_data(skb, &channel, sizeof(channel));
+		n_5ch++;
 	}
 
+	hdr.n_2ch = n_2ch;
+	hdr.n_5ch = n_5ch;
+	memcpy(__skb_push(skb, sizeof(hdr)), &hdr, sizeof(hdr));
+
 	return mt76_mcu_skb_send_msg(&dev->mt76, skb, MCU_CMD_SET_CHAN_DOMAIN,
 				     false);
 }
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
index 979c5c7fe93c..85e8b4cf23b8 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
@@ -70,6 +70,9 @@
 #define MT7615_MAX_SCHED_SCAN_SSID	10
 #define MT7615_MAX_SCAN_MATCH		16
 
+#define MT76_ALPHA2_TO_CC(alpha2)		\
+	(((u32)alpha2[2] << 16) | ((u32)alpha2[1] << 8) | (u32)alpha2[0])
+
 struct mt7615_vif;
 struct mt7615_sta;
 struct mt7615_dfs_pulse;
-- 
2.29.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] mt76: mt7615: set mcu country code in mt7615_mcu_set_channel_domain()
  2021-01-08 17:34 [PATCH] mt76: mt7615: set mcu country code in mt7615_mcu_set_channel_domain() Lorenzo Bianconi
@ 2021-01-14 10:08 ` Felix Fietkau
  0 siblings, 0 replies; 2+ messages in thread
From: Felix Fietkau @ 2021-01-14 10:08 UTC (permalink / raw)
  To: Lorenzo Bianconi; +Cc: lorenzo.bianconi, linux-wireless, sean.wang


On 2021-01-08 18:34, Lorenzo Bianconi wrote:
> Update mcu country code running mt7615_mcu_set_channel_domain routine in
> mt7615_regd_notifier().
> Filter out disabled channels in mt7615_mcu_set_channel_domain().
> 
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> ---
>  drivers/net/wireless/mediatek/mt76/mt76.h     |  1 +
>  .../net/wireless/mediatek/mt76/mt7615/init.c  | 10 +++--
>  .../net/wireless/mediatek/mt76/mt7615/mcu.c   | 43 +++++++++++++------
>  .../wireless/mediatek/mt76/mt7615/mt7615.h    |  3 ++
>  4 files changed, 40 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
> index 10034c21f812..5c86ade0aa1e 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt76.h
> @@ -647,6 +647,7 @@ struct mt76_dev {
>  
>  	struct mt76_rate_power rate_power;
>  
> +	char alpha2[3];
>  	enum nl80211_dfs_regions region;
>  
>  	u32 debugfs_reg;
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
> index a73b76e57c7f..635b94de1021 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
> @@ -296,13 +296,15 @@ mt7615_regd_notifier(struct wiphy *wiphy,
>  	struct mt7615_phy *phy = mphy->priv;
>  	struct cfg80211_chan_def *chandef = &mphy->chandef;
>  
> +	memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2));
>  	dev->mt76.region = request->dfs_region;
>  
> -	if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR))
> -		return;
> -
>  	mt7615_mutex_acquire(dev);
> -	mt7615_dfs_init_radar_detector(phy);
> +
> +	if (chandef->chan->flags & IEEE80211_CHAN_RADAR)
> +		mt7615_dfs_init_radar_detector(phy);
> +	mt7615_mcu_set_channel_domain(phy);
> +
>  	mt7615_mutex_release(dev);
>  }
>  
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
> index c49e9041006f..715423c325e1 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
> @@ -2981,6 +2981,7 @@ int mt7615_mcu_set_channel_domain(struct mt7615_phy *phy)
>  {
>  	struct mt76_phy *mphy = phy->mt76;
>  	struct mt7615_dev *dev = phy->dev;
> +	u32 country_code = MT76_ALPHA2_TO_CC(dev->mt76.alpha2);
>  	struct mt7615_mcu_channel_domain {
>  		__le32 country_code; /* regulatory_request.alpha2 */
>  		u8 bw_2g; /* BW_20_40M		0
> @@ -2995,45 +2996,61 @@ int mt7615_mcu_set_channel_domain(struct mt7615_phy *phy)
>  		u8 n_5ch;
>  		__le16 pad2;
>  	} __packed hdr = {
> +		.country_code = cpu_to_le32(country_code),
Instead of converting alpha2 to a cpu-endian u32 and then turning it
back into LE, you should be able to simply add u8 country_code[4] and
memcpy the request alpha2 to it without any order swapping.

- Felix

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-01-14 10:09 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-08 17:34 [PATCH] mt76: mt7615: set mcu country code in mt7615_mcu_set_channel_domain() Lorenzo Bianconi
2021-01-14 10:08 ` 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).