From 806f4948cbc71c76a3cf808f459abc6233a59264 Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Wed, 22 Apr 2026 13:27:01 +0200 Subject: [PATCH] patches: add c1.1 (thread struct device * through factory request_firmware) --- ...truct-device-through-factory-request.patch | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 patches/factory-thread-dev/0001-bes2600-thread-struct-device-through-factory-request.patch diff --git a/patches/factory-thread-dev/0001-bes2600-thread-struct-device-through-factory-request.patch b/patches/factory-thread-dev/0001-bes2600-thread-struct-device-through-factory-request.patch new file mode 100644 index 000000000..4052ba90c --- /dev/null +++ b/patches/factory-thread-dev/0001-bes2600-thread-struct-device-through-factory-request.patch @@ -0,0 +1,116 @@ +From 8732881c5916106539b9071b51710489c57e8d73 Mon Sep 17 00:00:00 2001 +From: Markus Fritsche +Date: Wed, 22 Apr 2026 13:18:38 +0200 +Subject: [PATCH] bes2600: thread struct device * through factory + request_firmware() call + +Follow-up to \"bes2600: use request_firmware() for factory.txt read\". +That patch switched the factory calibration read path from filp_open() ++ kernel_read() to request_firmware(), but passed dev=NULL to +request_firmware() because factory_section_read_file() did not have a +struct device * in scope. The resulting logs carry the +'(NULL device *):' prefix and do not propagate a udev association. + +Add a module-local static struct device * used as the firmware-class +load context, plus a small exported setter: + + static struct device *bes2600_factory_dev; + void bes2600_factory_set_dev(struct device *dev); + +Wire bes2600_factory_set_dev(&func->dev) from bes2600_sdio_probe(), +right after bes2600_platform_data_init() so the platform layer has +already had a chance to use the same struct device for its own +initialization. + +factory_section_read_file() now passes bes2600_factory_dev (instead +of NULL) to request_firmware(). When the factory read happens before +probe (not currently the case on PineTab2) the pointer is still NULL +and request_firmware() accepts that; no regression. + +No API changes to bes2600_get_factory_cali_data() callers. The +char *path parameter remains (it is the firmware-class name fed +straight to request_firmware()). + +Tested-on: PineTab2 (BES2600WM + RK3566) running linux-pinetab2 +6.19.10-danctnix1-1. Driver probes, factory data is read, and any +post-c5 factory diagnostics now carry the SDIO device identity +instead of '(NULL device *)'. + +Signed-off-by: Markus Fritsche +--- + bes2600/bes2600_factory.c | 14 +++++++++++++- + bes2600/bes2600_factory.h | 3 +++ + bes2600/bes2600_sdio.c | 4 ++++ + 3 files changed, 20 insertions(+), 1 deletion(-) + +diff --git a/bes2600/bes2600_factory.c b/bes2600/bes2600_factory.c +index 8d60b7c..1cda447 100644 +--- a/bes2600/bes2600_factory.c ++++ b/bes2600/bes2600_factory.c +@@ -31,6 +31,18 @@ + + static DEFINE_MUTEX(factory_lock); + ++/* ++ * struct device * for request_firmware() context. Set once at SDIO ++ * probe via bes2600_factory_set_dev(). NULL is tolerated (falls back ++ * to the udev-less firmware-class path) but loses per-device logging. ++ */ ++static struct device *bes2600_factory_dev; ++ ++void bes2600_factory_set_dev(struct device *dev) ++{ ++ bes2600_factory_dev = dev; ++} ++ + /* + * It is only used for temporary storage. + * Every time get the factory, it will read from the +@@ -148,7 +160,7 @@ static int factory_section_read_file(char *path, void *buffer) + + bes_devel("requesting firmware-class %s\n", path); + +- ret = request_firmware(&fw, path, NULL); ++ ret = request_firmware(&fw, path, bes2600_factory_dev); + if (ret) { + bes_devel("BES2600: request_firmware(%s) failed: %d\n", path, ret); + return -1; +diff --git a/bes2600/bes2600_factory.h b/bes2600/bes2600_factory.h +index 3835b0d..7dbe9f8 100644 +--- a/bes2600/bes2600_factory.h ++++ b/bes2600/bes2600_factory.h +@@ -199,6 +199,9 @@ enum factory_cali_status { + /* just calibrate 11n, other protocols are automatically mapped */ + #define WIFI_RF_11N_MODE 0x15 + ++/* set the struct device * used for request_firmware() context */ ++void bes2600_factory_set_dev(struct device *dev); ++ + /* read wifi & bt factory cali value*/ + u8* bes2600_get_factory_cali_data(u8 *file_buffer, u32 *data_len, char *path); + void factory_little_endian_cvrt(u8 *data); +diff --git a/bes2600/bes2600_sdio.c b/bes2600/bes2600_sdio.c +index b595365..371ef4f 100644 +--- a/bes2600/bes2600_sdio.c ++++ b/bes2600/bes2600_sdio.c +@@ -30,6 +30,7 @@ + #include "bes2600.h" + #include "sbus.h" + #include "bes2600_plat.h" ++#include "bes2600_factory.h" + #include "hwio.h" + #include "bes_chardev.h" + #include "bes_log.h" +@@ -1834,6 +1835,9 @@ static int bes2600_sdio_probe(struct sdio_func *func, + if (ret) + goto err; + ++ /* wire struct device into factory.c for request_firmware() context */ ++ bes2600_factory_set_dev(dev); ++ + self->pdata = bes2600_get_platform_data(); + self->func = func; + self->dev = &func->dev; +-- +2.53.0 +