fd0f5a8b71
Replace the single squashed 0001-bes2600-besser-cumulative-series.patch with 20 individual per-commit patches matching the bes2600/besser-danctnix-v3 branch in marfrit/bes2600-dkms. Also remove the duplicate 0003-arm64 entry that was a bug in pkgrel=3. Patch list: 0001 c5.1 defer scan and soften WARN on firmware reject 0002 c5.1.1 widen scan-defer backoff to 30s and decay reject_count 0003 c5.2 recover wedged firmware via mmc_hw_reset on link break 0004 c6.1 gate PM indication completion on pending request 0005 c6.2 short-circuit wake handshake when chip confirmed ACTIVE 0006 c7 self-detect when firmware does not honor PSM and skip 0007 c5.2.1 handle multi-function SDIO cards in mmc_hw_reset 0008 Patch A pre-empt AP-deauth-6 with reassoc on decrypt-fail storm 0009 Patch B bus_reset on connection-loss storm 0010 Patch F3 atomicize atomic_add() calls 0011 Patch F2 fix missing destroy_workqueue() on error in init_common 0012 Patch F1 fix concurrency UAF in bes2600_hw_scan / sched_scan 0013 Patch C v3 drop sdio_rx_work relay, IRQ→bh-direct 0014 Patch G restore SPDX identifiers + ST-Ericsson attribution 0015 Patch D atomicize ba_lock counters, drop the spinlock 0016 Patch E skip ps_state_lock when PSM-known-disabled 0017 Patch C2 replace ieee80211_rx_irqsafe with ieee80211_rx_ni 0018 Patch H bh.c hygiene cleanup (drop fossil blocks, dead stubs) 0019 besser#18 pending_record_lock SOFTIRQ-safe fix 0020 danctnix-flavor: export bus_reset helpers for bes2600_btuart Build pending (pkgrel=4 makepkg in progress on boltzmann). Signed-off-by: Claude (noether) <claude@reauktion.de>
84 lines
3.2 KiB
Diff
84 lines
3.2 KiB
Diff
From d48f2ae73ca17761d7a64aa645b4629641c8be5d Mon Sep 17 00:00:00 2001
|
|
From: Markus Fritsche <fritsche.markus@gmail.com>
|
|
Date: Tue, 28 Apr 2026 21:37:37 +0200
|
|
Subject: [PATCH 07/20] bes2600: handle multi-function SDIO cards in
|
|
mmc_hw_reset bus_reset
|
|
|
|
c5.2 (recover-wedged-firmware-via-mmc-hw-reset) wraps mmc_hw_reset()
|
|
and treats any non-zero return as a recovery failure. On
|
|
single-function SDIO cards mmc_hw_reset returns 0 after doing the
|
|
remove + rescan inline. On multi-function cards (BES2600 has WLAN
|
|
func 1 + BT companion func 2) the kernel's mmc_sdio_hw_reset() does
|
|
NOT do the rescan: it tears the card down and returns 1 to signal
|
|
"caller must trigger rescan".
|
|
|
|
Field observation on PineTab2 (linux-pinetab2 6.19.10-danctnix1):
|
|
when a real LMAC wedge fired bes2600_chrdev_wifi_force_close ->
|
|
bes2600_chrdev_do_bus_reset, mmc_hw_reset returned 1, c5.2's wrapper
|
|
treated that as "bus_reset failed: 1", logged the error, and gave
|
|
up. The card was already removed (mmc2: card 0001 removed) but
|
|
nothing scheduled a rescan; wifi (and the BT companion which shares
|
|
the same SDIO host) stayed silent until the user rebooted four
|
|
minutes later.
|
|
|
|
Fix:
|
|
|
|
- Capture the mmc_host pointer before calling mmc_hw_reset (the
|
|
card pointer is invalid after the remove).
|
|
- On positive return (multi-function path), log informationally
|
|
and call mmc_detect_change(host, 0) to schedule a rescan.
|
|
Return 0 so callers see the recovery as successful.
|
|
- Negative return is still treated as failure as before.
|
|
|
|
The mmc_detect_change side effect is asynchronous; the chrdev's
|
|
wait_event_timeout(probe_done_wq, !sbus_priv) still observes the
|
|
remove half synchronously, and the rescan + re-probe runs out of
|
|
the host detect work afterwards.
|
|
|
|
Signed-off-by: Markus Fritsche <fritsche.markus@gmail.com>
|
|
---
|
|
bes2600/bes2600_sdio.c | 24 +++++++++++++++++++++++-
|
|
1 file changed, 23 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/staging/bes2600/bes2600_sdio.c b/drivers/staging/bes2600/bes2600_sdio.c
|
|
index deefba9..c0b67b0 100644
|
|
--- a/drivers/staging/bes2600/bes2600_sdio.c
|
|
+++ b/drivers/staging/bes2600/bes2600_sdio.c
|
|
@@ -1789,10 +1789,32 @@ static void bes2600_sdio_halt_device(struct sbus_priv *self)
|
|
*/
|
|
static int bes2600_sdio_bus_reset(struct sbus_priv *self)
|
|
{
|
|
+ struct mmc_host *host;
|
|
+ int ret;
|
|
+
|
|
if (!self || !self->func || !self->func->card)
|
|
return -EINVAL;
|
|
|
|
- return mmc_hw_reset(self->func->card);
|
|
+ host = self->func->card->host;
|
|
+ ret = mmc_hw_reset(self->func->card);
|
|
+
|
|
+ /*
|
|
+ * On multi-function SDIO cards (BES2600 has WLAN func 1 + BT
|
|
+ * companion func 2), mmc_sdio_hw_reset() removes the card and
|
|
+ * returns 1 to signal "remove happened, caller must trigger
|
|
+ * rescan". The kernel does NOT auto-rescan in this case;
|
|
+ * single-function cards take the rescan path inline and return 0.
|
|
+ * Treat any non-negative return as success and force a rescan if
|
|
+ * mmc_hw_reset signalled the multi-function path - otherwise the
|
|
+ * card stays removed indefinitely after a wedge recovery,
|
|
+ * leaving wifi (and the BT companion) silent until reboot.
|
|
+ */
|
|
+ if (ret > 0) {
|
|
+ bes_info("multi-func mmc_hw_reset removed card; scheduling rescan\n");
|
|
+ mmc_detect_change(host, 0);
|
|
+ ret = 0;
|
|
+ }
|
|
+ return ret;
|
|
}
|
|
|
|
static bool bes2600_sdio_wakeup_source(struct sbus_priv *self)
|
|
--
|
|
2.54.0
|
|
|