From: Zhao Li <enderaoelyther@gmail.com>
To: Johannes Berg <johannes@sipsolutions.net>
Cc: "Sebastian Krzyszkowiak" <sebastian.krzyszkowiak@puri.sm>,
"Arend van Spriel" <arend.vanspriel@broadcom.com>,
"Ville Nummela" <ville.nummela@kempower.com>,
"Jiangshan Yi" <yijiangshan@kylinos.cn>,
"Marek Vasut" <marex@nabladev.com>,
"Toke Høiland-Jørgensen" <toke@toke.dk>,
"Stefan Hansson" <newbyte@postmarketos.org>,
"Ping-Ke Shih" <pkshih@realtek.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Ethan Nelson-Moore" <enelsonmoore@gmail.com>,
"Pengpeng Hou" <pengpeng@iscas.ac.cn>,
"Prameela Rani Garnepudi" <prameela.j04cs@gmail.com>,
"Siva Rebbagondla" <siva.rebbagondla@redpinesignals.com>,
"Kalle Valo" <kvalo@kernel.org>,
linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org
Subject: [PATCH 2/3] wifi: rsi: report background scan start failures
Date: Wed, 28 Oct 2026 22:19:26 +0800 [thread overview]
Message-ID: <20261028141927.9306-3-enderaoelyther@gmail.com> (raw)
In-Reply-To: <20261028141927.9306-1-enderaoelyther@gmail.com>
rsi_mac80211_hw_scan_start() returns success when a background-scan
command cannot be prepared. The driver never marks the scan active in
that case, so neither cancellation nor the firmware-event path reports
completion and mac80211 keeps the request pending.
Build the probe request before queueing the start parameters, propagate
preparation errors, and clear the saved request before mac80211 frees it.
Successful scans keep the existing firmware command order.
LLM assistance was used to find the bug and review.
Fixes: 7fdcb8e12660 ("rsi: add support for hardware scan offload")
Cc: stable@vger.kernel.org
Signed-off-by: Zhao Li <enderaoelyther@gmail.com>
---
Validation: W=1 module builds with MODPOST passed with CONFIG_RSI_COEX
enabled and disabled. Not reproduced; RS9113/RS9116 hardware was
unavailable.
Sparse C=2 passed. Targeted Smatch introduced no new diagnostics.
drivers/net/wireless/rsi/rsi_91x_mac80211.c | 14 ++++++++------
drivers/net/wireless/rsi/rsi_91x_mgmt.c | 13 ++++++++-----
drivers/net/wireless/rsi/rsi_mgmt.h | 3 +--
3 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
index 27bfdb6affaf..a2e981e261d6 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
@@ -237,6 +237,7 @@ static int rsi_mac80211_hw_scan_start(struct ieee80211_hw *hw,
struct cfg80211_scan_request *scan_req = &hw_req->req;
struct rsi_hw *adapter = hw->priv;
struct rsi_common *common = adapter->priv;
+ int ret;
rsi_dbg(INFO_ZONE, "***** Hardware scan start *****\n");
common->mac_ops_resumed = false;
@@ -260,15 +261,16 @@ static int rsi_mac80211_hw_scan_start(struct ieee80211_hw *hw,
mutex_lock(&common->mutex);
common->hwscan = scan_req;
- if (!rsi_send_bgscan_params(common, RSI_START_BGSCAN)) {
- if (!rsi_send_bgscan_probe_req(common, vif)) {
- rsi_dbg(INFO_ZONE, "Background scan started...\n");
- common->bgscan_en = true;
- }
+ ret = rsi_start_bgscan(common, vif);
+ if (ret) {
+ common->hwscan = NULL;
+ } else {
+ rsi_dbg(INFO_ZONE, "Background scan started...\n");
+ common->bgscan_en = true;
}
mutex_unlock(&common->mutex);
- return 0;
+ return ret;
}
static void rsi_mac80211_cancel_hw_scan(struct ieee80211_hw *hw,
diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
index 9ceb6cba3546..165423313c5f 100644
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
@@ -1862,11 +1862,8 @@ int rsi_send_bgscan_params(struct rsi_common *common, int enable)
return rsi_send_internal_mgmt_frame(common, skb);
}
-/* This function sends the probe request to be used by firmware in
- * background scan
- */
-int rsi_send_bgscan_probe_req(struct rsi_common *common,
- struct ieee80211_vif *vif)
+/* Send the firmware commands that start a background scan. */
+int rsi_start_bgscan(struct rsi_common *common, struct ieee80211_vif *vif)
{
struct cfg80211_scan_request *scan_req = common->hwscan;
struct rsi_bgscan_probe *bgscan;
@@ -1875,6 +1872,7 @@ int rsi_send_bgscan_probe_req(struct rsi_common *common,
u16 frame_len = sizeof(*bgscan);
size_t ssid_len = 0;
u8 *ssid = NULL;
+ int ret;
rsi_dbg(MGMT_TX_ZONE,
"%s: Sending bgscan probe req frame\n", __func__);
@@ -1928,6 +1926,11 @@ int rsi_send_bgscan_probe_req(struct rsi_common *common,
skb_put(skb, frame_len + probereq_skb->len);
dev_kfree_skb(probereq_skb);
+ ret = rsi_send_bgscan_params(common, RSI_START_BGSCAN);
+ if (ret) {
+ dev_kfree_skb(skb);
+ return ret;
+ }
return rsi_send_internal_mgmt_frame(common, skb);
}
diff --git a/drivers/net/wireless/rsi/rsi_mgmt.h b/drivers/net/wireless/rsi/rsi_mgmt.h
index 236b21482f38..6a4907e6bca9 100644
--- a/drivers/net/wireless/rsi/rsi_mgmt.h
+++ b/drivers/net/wireless/rsi/rsi_mgmt.h
@@ -753,6 +753,5 @@ int rsi_send_ps_request(struct rsi_hw *adapter, bool enable,
struct ieee80211_vif *vif);
void init_bgscan_params(struct rsi_common *common);
int rsi_send_bgscan_params(struct rsi_common *common, int enable);
-int rsi_send_bgscan_probe_req(struct rsi_common *common,
- struct ieee80211_vif *vif);
+int rsi_start_bgscan(struct rsi_common *common, struct ieee80211_vif *vif);
#endif
--
2.56.0
next prev parent reply other threads:[~2026-10-28 14:20 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-28 14:19 [PATCH 0/3] wifi: rsi: fix background scan result and state lifetime Zhao Li
2026-10-28 14:19 ` [PATCH 1/3] wifi: rsi: initialize background scan completion data Zhao Li
2026-10-28 14:19 ` Zhao Li [this message]
2026-10-28 14:19 ` [PATCH 3/3] wifi: rsi: serialize background scan state Zhao Li
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=20261028141927.9306-3-enderaoelyther@gmail.com \
--to=enderaoelyther@gmail.com \
--cc=arend.vanspriel@broadcom.com \
--cc=enelsonmoore@gmail.com \
--cc=johannes@sipsolutions.net \
--cc=kuba@kernel.org \
--cc=kvalo@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=marex@nabladev.com \
--cc=newbyte@postmarketos.org \
--cc=pengpeng@iscas.ac.cn \
--cc=pkshih@realtek.com \
--cc=prameela.j04cs@gmail.com \
--cc=sebastian.krzyszkowiak@puri.sm \
--cc=siva.rebbagondla@redpinesignals.com \
--cc=stable@vger.kernel.org \
--cc=toke@toke.dk \
--cc=ville.nummela@kempower.com \
--cc=yijiangshan@kylinos.cn \
/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