patches/driver/bes2600: mirror besser series (closes #2)
Mirrors all 30 BES2600 patch series from marfrit/besser/patches/ into the kernel-agent scope-tagged tree under patches/driver/bes2600/. 15 base series + 15 -danctnix siblings = 45 .patch files including cover letters. Per-series promotion eligibility tracked in the README (default unset → ka-promote asks before including in a build). Markus to update as series mature. DKMS-to-in-tree transition path documented (drop bes2600-dkms once series lands in mainline / DanctNIX base). Cumulative-patch ordering caveat captured: existing order is NOT alphabetical (A,B,C v3,F,G,D,E,C2,c5.x,c6.x,c7,H). ka-promote needs an explicit apply_order field, not a series-name sort. Surface when fleet/ohm.yaml lands in #5. Acceptance criteria from #2: [x] All series present under driver/bes2600/ [x] Promotion eligibility per series (table in README, defaults unset for Markus to fill) [ ] Manifest for ohm references driver:bes2600 scope (deferred to #5) [x] DKMS-to-in-tree transition path documented Generated-by: Claude Opus 4.7 <claude@reauktion.de>
This commit is contained in:
+144
@@ -0,0 +1,144 @@
|
||||
From 1a5d54a3213041262caf1605bb19c66ddded41f7 Mon Sep 17 00:00:00 2001
|
||||
From: Markus Fritsche <fritsche.markus@gmail.com>
|
||||
Date: Wed, 22 Apr 2026 10:09:44 +0200
|
||||
Subject: [PATCH 1/2] bes2600: use request_firmware() for factory.txt read
|
||||
|
||||
The BES2600 factory calibration file (bes2600_factory.txt) was being read
|
||||
via filp_open() + kernel_read() from a hard-coded absolute path baked in
|
||||
at compile time via the FACTORY_PATH Makefile macro
|
||||
(default: /lib/firmware/bes2600_factory.txt).
|
||||
|
||||
This had several problems:
|
||||
|
||||
1. Path mismatch - linux-firmware-style packaging (and danctnix 0.2-5
|
||||
device-pine64-pinetab2) ships the file at
|
||||
/lib/firmware/bes2600/bes2600_factory.txt, not /lib/firmware/. The
|
||||
driver logged '(NULL device *): read and check
|
||||
/lib/firmware/bes2600_factory.txt error' on every boot on PineTab2
|
||||
running linux-pinetab2 6.19.10-danctnix1-1.
|
||||
|
||||
2. Direct filesystem access via filp_open() / kernel_read() from a driver
|
||||
is an anti-pattern that upstream rejects: drivers should use
|
||||
request_firmware() to get binary data from userspace-managed firmware
|
||||
directories. request_firmware() natively searches the firmware_class
|
||||
path list (typically /lib/firmware + derivatives), associates the load
|
||||
with a uevent, and respects the firmware-loading infrastructure.
|
||||
|
||||
3. The (NULL device *) prefix in error messages indicated the absence of
|
||||
proper device-context logging. While this patch does not yet thread
|
||||
struct device through, the upstream path uses request_firmware() which
|
||||
works with dev=NULL and is the building block for a follow-up patch
|
||||
that adds per-chip device context.
|
||||
|
||||
Repoint the FACTORY_PATH default to the firmware-class name
|
||||
(bes2600/bes2600_factory.txt) - request_firmware() prepends
|
||||
/lib/firmware/ from the configured search paths. The macro remains
|
||||
overridable at build time for non-standard deployments.
|
||||
|
||||
Rewrite factory_section_read_file() to:
|
||||
* Call request_firmware(&fw, path, NULL).
|
||||
* Size-check fw->size against FACTORY_MAX_SIZE.
|
||||
* memcpy the data into the caller's buffer.
|
||||
* Always call release_firmware() on exit.
|
||||
|
||||
The file write path (factory_section_write_file + kernel_write) is left
|
||||
unchanged in this patch; it is the subject of a follow-up patch that
|
||||
removes kernel_write and moves any remaining userspace-visible factory
|
||||
configuration to a standard kernel-userspace boundary (debugfs or
|
||||
nl80211 testmode).
|
||||
|
||||
No caller signature changes. No Makefile flag drops. Bisectable.
|
||||
|
||||
Tested-on: PineTab2 (BES2600WM + RK3566) running linux-pinetab2
|
||||
6.19.10-danctnix1-1, deployed via /lib/modules/<ver>/extra/. Verified
|
||||
post-reboot: original 'read and check /lib/firmware/bes2600_factory.txt
|
||||
error' is gone; request_firmware reads the file successfully (a separate
|
||||
factory_parse() bug, previously masked by the read failure, is now
|
||||
exposed and tracked separately).
|
||||
|
||||
Signed-off-by: Markus Fritsche <fritsche.markus@gmail.com>
|
||||
---
|
||||
bes2600/Makefile | 2 +-
|
||||
bes2600/bes2600_factory.c | 33 ++++++++++++++-------------------
|
||||
2 files changed, 15 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/bes2600/Makefile b/bes2600/Makefile
|
||||
index 300912b..788aee2 100644
|
||||
--- a/bes2600/Makefile
|
||||
+++ b/bes2600/Makefile
|
||||
@@ -66,7 +66,7 @@ BES2600_DRV_VERSION := bes2600_0.3.5_2024.0116
|
||||
ifeq ($(CONFIG_BES2600_CALIB_FROM_LINUX),y)
|
||||
FACTORY_CRC_CHECK ?= n
|
||||
STANDARD_FACTORY_EFUSE_FLAG ?= y
|
||||
-FACTORY_PATH ?= /lib/firmware/bes2600_factory.txt
|
||||
+FACTORY_PATH ?= bes2600/bes2600_factory.txt
|
||||
endif
|
||||
|
||||
# basic function
|
||||
diff --git a/bes2600/bes2600_factory.c b/bes2600/bes2600_factory.c
|
||||
index dc5d3da..8d60b7c 100644
|
||||
--- a/bes2600/bes2600_factory.c
|
||||
+++ b/bes2600/bes2600_factory.c
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/fs.h>
|
||||
+#include <linux/firmware.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/crc32.h>
|
||||
@@ -137,38 +138,32 @@ static int bes2600_factory_crc_check(struct factory_t *factory_data)
|
||||
*/
|
||||
static int factory_section_read_file(char *path, void *buffer)
|
||||
{
|
||||
- int ret = 0;
|
||||
- struct file *fp;
|
||||
+ const struct firmware *fw;
|
||||
+ int ret;
|
||||
|
||||
if (!path || !buffer) {
|
||||
bes_err("%s NULL pointer err\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
- bes_devel("reading %s \n", path);
|
||||
+ bes_devel("requesting firmware-class %s\n", path);
|
||||
|
||||
- fp = filp_open(path, O_RDONLY, 0); //S_IRUSR
|
||||
- if (IS_ERR(fp)) {
|
||||
- bes_devel("BES2600 : can't open %s\n",path);
|
||||
+ ret = request_firmware(&fw, path, NULL);
|
||||
+ if (ret) {
|
||||
+ bes_devel("BES2600: request_firmware(%s) failed: %d\n", path, ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
- if (fp->f_inode->i_size <= 0 || fp->f_inode->i_size > FACTORY_MAX_SIZE) {
|
||||
- bes_err( "bes2600_factory.txt size check failed, read_size: %lld max_size: %d\n",
|
||||
- fp->f_inode->i_size, FACTORY_MAX_SIZE);
|
||||
- filp_close(fp, NULL);
|
||||
+ if (fw->size == 0 || fw->size > FACTORY_MAX_SIZE) {
|
||||
+ bes_err("bes2600_factory.txt size check failed, read_size: %zu max_size: %d\n",
|
||||
+ fw->size, FACTORY_MAX_SIZE);
|
||||
+ release_firmware(fw);
|
||||
return -1;
|
||||
}
|
||||
|
||||
- ret = kernel_read(fp, buffer, fp->f_inode->i_size, &fp->f_pos);
|
||||
-
|
||||
- filp_close(fp, NULL);
|
||||
-
|
||||
- if (ret != fp->f_inode->i_size) {
|
||||
- bes_err("bes2600_factory.txt read fail\n");
|
||||
- ret = -1;
|
||||
- }
|
||||
-
|
||||
+ memcpy(buffer, fw->data, fw->size);
|
||||
+ ret = (int)fw->size;
|
||||
+ release_firmware(fw);
|
||||
return ret;
|
||||
}
|
||||
|
||||
--
|
||||
2.53.0
|
||||
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
From 82ba594a444a855310fbbe2a5c8ff02f211d8e83 Mon Sep 17 00:00:00 2001
|
||||
From: Markus Fritsche <fritsche.markus@gmail.com>
|
||||
Date: Wed, 22 Apr 2026 12:17:56 +0200
|
||||
Subject: [PATCH 2/2] bes2600: default STANDARD_FACTORY_EFUSE_FLAG off for
|
||||
PineTab2 factory.txt format
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The shipped factory calibration file bes2600_factory.txt on PineTab2
|
||||
(danctnix linux-firmware 0.3.5_2023.0209) contains 30 calibration
|
||||
fields: head (3), iq/xtal (3), 2.4G power 11n (5), 5G power 11n (15),
|
||||
bt (4). The file terminates with '%%\n' directly after edr_power.
|
||||
|
||||
When STANDARD_FACTORY_EFUSE_FLAG is defined at compile time the driver
|
||||
assembles STANDARD_FACTORY with an extra select_efuse_flag section
|
||||
appended and expects 31 sscanf matches (FACTORY_MEMBER_NUM=31):
|
||||
|
||||
__STANDARD_FACTORY + \"##select_efuse_flag\\nselect_efuse:%hx\\n\"
|
||||
+ \"%%%%\\n\"
|
||||
|
||||
The PineTab2 factory.txt has no select_efuse_flag section, so sscanf
|
||||
stops after field 30 and factory_parse() returns -1 with:
|
||||
|
||||
bes2600_factory.txt parse fail
|
||||
read and check bes2600/bes2600_factory.txt error
|
||||
factory cali data get failed.
|
||||
|
||||
This was latent until the preceding patch (use request_firmware() for
|
||||
factory.txt read) fixed the path bug that masked the parse failure.
|
||||
|
||||
Default STANDARD_FACTORY_EFUSE_FLAG to n. The flag remains overridable
|
||||
at build time (make STANDARD_FACTORY_EFUSE_FLAG=y ...) for chips /
|
||||
firmware packages that do ship the select_efuse_flag section.
|
||||
|
||||
Also: the wsm_save_factory_txt_to_mcu() prototype in wsm.h was
|
||||
inconsistently wrapped in a conditional that keyed on
|
||||
STANDARD_FACTORY_EFUSE_FLAG, but the function definition in wsm.c and
|
||||
the call site in sta.c are ungated. With the flag now defaulting to
|
||||
n, the gcc -Werror=missing-prototypes flag breaks the build. Drop the
|
||||
conditional wrapper around the prototype — the function exists and is
|
||||
used regardless of the factory-parse flag.
|
||||
|
||||
Tested-on: PineTab2 (BES2600WM + RK3566) running linux-pinetab2
|
||||
6.19.10-danctnix1-1. With the flag defaulted off, factory_parse()
|
||||
succeeds on the shipped factory.txt, factory_cali_data is populated,
|
||||
and dmesg no longer shows the parse-fail / read-and-check-error /
|
||||
factory-cali-data-get-failed sequence.
|
||||
|
||||
Signed-off-by: Markus Fritsche <fritsche.markus@gmail.com>
|
||||
---
|
||||
bes2600/Makefile | 2 +-
|
||||
bes2600/wsm.h | 2 --
|
||||
2 files changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/bes2600/Makefile b/bes2600/Makefile
|
||||
index 788aee2..2dcba09 100644
|
||||
--- a/bes2600/Makefile
|
||||
+++ b/bes2600/Makefile
|
||||
@@ -65,7 +65,7 @@ BES2600_DRV_VERSION := bes2600_0.3.5_2024.0116
|
||||
|
||||
ifeq ($(CONFIG_BES2600_CALIB_FROM_LINUX),y)
|
||||
FACTORY_CRC_CHECK ?= n
|
||||
-STANDARD_FACTORY_EFUSE_FLAG ?= y
|
||||
+STANDARD_FACTORY_EFUSE_FLAG ?= n
|
||||
FACTORY_PATH ?= bes2600/bes2600_factory.txt
|
||||
endif
|
||||
|
||||
diff --git a/bes2600/wsm.h b/bes2600/wsm.h
|
||||
index 0673131..22845ac 100644
|
||||
--- a/bes2600/wsm.h
|
||||
+++ b/bes2600/wsm.h
|
||||
@@ -2236,7 +2236,5 @@ int wsm_cpu_usage_cmd(struct bes2600_common *hw_priv);
|
||||
|
||||
int wsm_wifi_status_cmd(struct bes2600_common *hw_priv, uint32_t status);
|
||||
|
||||
-#if defined(STANDARD_FACTORY_EFUSE_FLAG)
|
||||
int wsm_save_factory_txt_to_mcu(struct bes2600_common *hw_priv, const u8 *data, int if_id, enum bes2600_rf_cmd_type cmd_type);
|
||||
-#endif
|
||||
#endif /* BES2600_HWIO_H_INCLUDED */
|
||||
--
|
||||
2.53.0
|
||||
|
||||
Reference in New Issue
Block a user