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