public inbox for linux-wireless@vger.kernel.org
 help / color / mirror / Atom feed
From: Ping-Ke Shih <pkshih@realtek.com>
To: <linux-wireless@vger.kernel.org>
Cc: <kevin_yang@realtek.com>
Subject: [RFT rtw/rtw-next] wifi: rtw88: check if center channel is supported before setting
Date: Mon, 13 Apr 2026 13:36:01 +0800	[thread overview]
Message-ID: <20260413053601.13037-1-pkshih@realtek.com> (raw)

From: Zong-Zhe Yang <kevin_yang@realtek.com>

Some unusual center channels may be assigned to driver. However, RF
doesn't really expect them, and then warnings happen due to lack of
TX power limit configurations. For example, center channel 114/130
with 80MHz. So, add a check before setting the channel.

Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtw88/mac80211.c |  7 +++++--
 drivers/net/wireless/realtek/rtw88/main.c     | 13 +++++++++++--
 drivers/net/wireless/realtek/rtw88/main.h     |  2 +-
 drivers/net/wireless/realtek/rtw88/phy.c      | 18 ++++++++++++++++++
 drivers/net/wireless/realtek/rtw88/phy.h      |  2 ++
 5 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
index 766f22d31079..9d97e8dd0c1e 100644
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
@@ -92,8 +92,11 @@ static int rtw_ops_config(struct ieee80211_hw *hw, int radio_idx, u32 changed)
 		}
 	}
 
-	if (changed & IEEE80211_CONF_CHANGE_CHANNEL)
-		rtw_set_channel(rtwdev);
+	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
+		ret = rtw_set_channel(rtwdev);
+		if (ret)
+			goto out;
+	}
 
 	if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
 	    (hw->conf.flags & IEEE80211_CONF_IDLE) &&
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
index cd9254370fcc..08aebb3c5a78 100644
--- a/drivers/net/wireless/realtek/rtw88/main.c
+++ b/drivers/net/wireless/realtek/rtw88/main.c
@@ -868,23 +868,30 @@ void rtw_get_channel_params(struct cfg80211_chan_def *chandef,
 	chan_params->primary_chan = channel->hw_value;
 }
 
-void rtw_set_channel(struct rtw_dev *rtwdev)
+int rtw_set_channel(struct rtw_dev *rtwdev)
 {
 	const struct rtw_chip_info *chip = rtwdev->chip;
 	struct ieee80211_hw *hw = rtwdev->hw;
 	struct rtw_hal *hal = &rtwdev->hal;
 	struct rtw_channel_params ch_param;
 	u8 center_chan, primary_chan, bandwidth, band;
+	int ch_idx;
 
 	rtw_get_channel_params(&hw->conf.chandef, &ch_param);
 	if (WARN(ch_param.center_chan == 0, "Invalid channel\n"))
-		return;
+		return -EINVAL;
 
 	center_chan = ch_param.center_chan;
 	primary_chan = ch_param.primary_chan;
 	bandwidth = ch_param.bandwidth;
 	band = ch_param.center_chan > 14 ? RTW_BAND_5G : RTW_BAND_2G;
 
+	ch_idx = rtw_band_channel_to_idx(band, center_chan);
+	if (ch_idx < 0) {
+		rtw_warn(rtwdev, "not support band %d ch %d\n", band, center_chan);
+		return -EOPNOTSUPP;
+	}
+
 	rtw_update_channel(rtwdev, center_chan, primary_chan, band, bandwidth);
 
 	if (rtwdev->scan_info.op_chan)
@@ -910,6 +917,8 @@ void rtw_set_channel(struct rtw_dev *rtwdev)
 	 */
 	if (!test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
 		rtwdev->need_rfk = true;
+
+	return 0;
 }
 
 void rtw_chip_prepare_tx(struct rtw_dev *rtwdev)
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
index 9c0b746540b0..a368f1a4a003 100644
--- a/drivers/net/wireless/realtek/rtw88/main.h
+++ b/drivers/net/wireless/realtek/rtw88/main.h
@@ -2241,7 +2241,7 @@ bool ltecoex_reg_write(struct rtw_dev *rtwdev, u16 offset, u32 value);
 void rtw_restore_reg(struct rtw_dev *rtwdev,
 		     struct rtw_backup_info *bckp, u32 num);
 void rtw_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss);
-void rtw_set_channel(struct rtw_dev *rtwdev);
+int rtw_set_channel(struct rtw_dev *rtwdev);
 void rtw_chip_prepare_tx(struct rtw_dev *rtwdev);
 void rtw_vif_port_config(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif,
 			 u32 config);
diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
index e2ac5c6fd500..a543eaa57f2c 100644
--- a/drivers/net/wireless/realtek/rtw88/phy.c
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
@@ -1630,6 +1630,24 @@ static int rtw_channel_to_idx(u8 band, u8 channel)
 	return ch_idx;
 }
 
+int rtw_band_channel_to_idx(enum rtw_supported_band band, u8 channel)
+{
+	u8 phy_band;
+
+	switch (band) {
+	case RTW_BAND_2G:
+		phy_band = PHY_BAND_2G;
+		break;
+	case RTW_BAND_5G:
+		phy_band = PHY_BAND_5G;
+		break;
+	default:
+		return -1;
+	}
+
+	return rtw_channel_to_idx(phy_band, channel);
+}
+
 static void rtw_phy_set_tx_power_limit(struct rtw_dev *rtwdev, u8 regd, u8 band,
 				       u8 bw, u8 rs, u8 ch, s8 pwr_limit)
 {
diff --git a/drivers/net/wireless/realtek/rtw88/phy.h b/drivers/net/wireless/realtek/rtw88/phy.h
index 8449936497bb..98aeb576e24d 100644
--- a/drivers/net/wireless/realtek/rtw88/phy.h
+++ b/drivers/net/wireless/realtek/rtw88/phy.h
@@ -201,4 +201,6 @@ enum rtw_phy_cck_pd_lv {
 #define RRSR_RATE_ORDER_MAX	0xfffff
 #define RRSR_RATE_ORDER_CCK_LEN	4
 
+int rtw_band_channel_to_idx(enum rtw_supported_band band, u8 channel);
+
 #endif
-- 
2.25.1


                 reply	other threads:[~2026-04-13  5:36 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260413053601.13037-1-pkshih@realtek.com \
    --to=pkshih@realtek.com \
    --cc=kevin_yang@realtek.com \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox