Revert "Merge pull request 'patches/driver/bes2600/*-danctnix: reconstruct from cleanups (closes #29)' (#33) from claude-noether/kernel-agent:noether/kernel-agent-29-per-series-reconstruct into main"
This reverts commit38fd672940, reversing changes made to443f5e992e.
This commit is contained in:
+15
-15
@@ -1,8 +1,8 @@
|
||||
From 0dde479994a84f9e968b327d5409c3a926acb69c Mon Sep 17 00:00:00 2001
|
||||
From 9ea8a8e810ee5eb220de700a5c0a6d1153b15130 Mon Sep 17 00:00:00 2001
|
||||
From: Markus Fritsche <fritsche.markus@gmail.com>
|
||||
Date: Sun, 26 Apr 2026 22:31:58 +0200
|
||||
Subject: [PATCH 15/29] bes2600: recover wedged firmware via mmc_hw_reset on
|
||||
link break
|
||||
Date: Mon, 27 Apr 2026 06:32:41 +0200
|
||||
Subject: [PATCH] bes2600: recover wedged firmware via mmc_hw_reset on link
|
||||
break
|
||||
|
||||
When the LMAC active monitor detects 'link break between lmac and host'
|
||||
(the hw_buf_used==pending watchdog in bes2600_bh_lmac_active_monitor),
|
||||
@@ -78,14 +78,14 @@ v2.0 boards) are both already configured as MMC pwrseq resets.
|
||||
|
||||
Signed-off-by: Markus Fritsche <fritsche.markus@gmail.com>
|
||||
---
|
||||
bes2600/bes2600_sdio.c | 29 +++++++++++++++++++++
|
||||
bes2600/bes_chardev.c | 59 ++++++++++++++++++++++++++++++++++++++++--
|
||||
bes2600/bes_chardev.h | 1 +
|
||||
bes2600/sbus.h | 8 ++++++
|
||||
drivers/staging/bes2600/bes2600_sdio.c | 29 +++++++++++++
|
||||
drivers/staging/bes2600/bes_chardev.c | 59 +++++++++++++++++++++++++-
|
||||
drivers/staging/bes2600/bes_chardev.h | 1 +
|
||||
drivers/staging/bes2600/sbus.h | 8 ++++
|
||||
4 files changed, 95 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/staging/bes2600/bes2600_sdio.c b/drivers/staging/bes2600/bes2600_sdio.c
|
||||
index 3e04e8c..e5840c8 100644
|
||||
index b9d836fab7af..f7f86d765bba 100644
|
||||
--- a/drivers/staging/bes2600/bes2600_sdio.c
|
||||
+++ b/drivers/staging/bes2600/bes2600_sdio.c
|
||||
@@ -16,6 +16,7 @@
|
||||
@@ -139,10 +139,10 @@ index 3e04e8c..e5840c8 100644
|
||||
|
||||
static void bes2600_sdio_en_lp_cb(struct bes2600_common *hw_priv)
|
||||
diff --git a/drivers/staging/bes2600/bes_chardev.c b/drivers/staging/bes2600/bes_chardev.c
|
||||
index a02d6d9..d1375bc 100644
|
||||
index 455108a2dd66..b776aab5e062 100644
|
||||
--- a/drivers/staging/bes2600/bes_chardev.c
|
||||
+++ b/drivers/staging/bes2600/bes_chardev.c
|
||||
@@ -442,6 +442,48 @@ int bes2600_chrdev_do_system_close(const struct sbus_ops *sbus_ops, struct sbus_
|
||||
@@ -626,6 +626,48 @@ int bes2600_chrdev_do_system_close(const struct sbus_ops *sbus_ops, struct sbus_
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -191,7 +191,7 @@ index a02d6d9..d1375bc 100644
|
||||
bool bes2600_chrdev_is_wifi_opened(void)
|
||||
{
|
||||
bool wifi_opened = false;
|
||||
@@ -540,8 +582,21 @@ static void bes2600_chrdev_wifi_force_close_work(struct work_struct *work)
|
||||
@@ -726,8 +768,21 @@ static void bes2600_chrdev_wifi_force_close_work(struct work_struct *work)
|
||||
/* unregister wifi */
|
||||
bes2600_switch_wifi(0);
|
||||
|
||||
@@ -216,7 +216,7 @@ index a02d6d9..d1375bc 100644
|
||||
bes2600_cdev.sbus_priv);
|
||||
}
|
||||
diff --git a/drivers/staging/bes2600/bes_chardev.h b/drivers/staging/bes2600/bes_chardev.h
|
||||
index 15602ba..3f0c59b 100644
|
||||
index c627bb7c3d65..ca8419eead8f 100644
|
||||
--- a/drivers/staging/bes2600/bes_chardev.h
|
||||
+++ b/drivers/staging/bes2600/bes_chardev.h
|
||||
@@ -60,6 +60,7 @@ struct sbus_priv *bes2600_chrdev_get_sbus_priv_data(void);
|
||||
@@ -228,7 +228,7 @@ index 15602ba..3f0c59b 100644
|
||||
void bes2600_chrdev_wifi_force_close(struct bes2600_common *hw_priv, bool halt_dev);
|
||||
void bes2600_chrdev_usb_remove(struct bes2600_common *hw_priv);
|
||||
diff --git a/drivers/staging/bes2600/sbus.h b/drivers/staging/bes2600/sbus.h
|
||||
index 1f2c0cd..cb90890 100644
|
||||
index 1f2c0cda73de..cb9089004041 100644
|
||||
--- a/drivers/staging/bes2600/sbus.h
|
||||
+++ b/drivers/staging/bes2600/sbus.h
|
||||
@@ -75,6 +75,14 @@ struct sbus_ops {
|
||||
@@ -247,5 +247,5 @@ index 1f2c0cd..cb90890 100644
|
||||
|
||||
void bes2600_irq_handler(struct bes2600_common *priv);
|
||||
--
|
||||
2.54.0
|
||||
2.53.0
|
||||
|
||||
-83
@@ -1,83 +0,0 @@
|
||||
From 80e5e68c223b676698288fde62e527b96e1ac8e2 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 19/29] 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 c9cb073..b998381 100644
|
||||
--- a/drivers/staging/bes2600/bes2600_sdio.c
|
||||
+++ b/drivers/staging/bes2600/bes2600_sdio.c
|
||||
@@ -1810,10 +1810,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
|
||||
|
||||
Reference in New Issue
Block a user