8b356aa11f
Replaces the 13 broken DKMS-path -danctnix mirrors from PR #17 + adds 9 new series-dirs for the c-stack patches that were never split (Patches A/B/C-v3/F/D/E/C2/G/H) + retires the cumulative-c5x-danctnix single-file interim from fleet/ohm.yaml. Mechanism: cd marfrit/bes2600-dkms-mobian git format-patch fe73571..cleanups --no-merges -o /tmp/cleanups/ git format-patch cleanups..bes2600/bh-c-fossil-cleanup --no-merges -o /tmp/h/ for each commit: route to series-dir, sed-rewrite a/bes2600/foo.c -> a/drivers/staging/bes2600/foo.c The 29 cleanups commits + 1 Patch H commit map to 25 series-dirs (a few series-dirs get multiple commits: lmac-recover gets c5.2 + c5.2.1 as 0001+0002; cw1200-fix-backports gets F3+F2+F1 as 0001-0003; factory-series gets request_firmware + STANDARD_FACTORY_EFUSE_FLAG as 0001+0002). fleet/ohm.yaml apply order matches cleanups commit chronology, which is what produced the working c5x interim. cumulative.patch from ka-promote ohm now has 32 resolved patches (29 cleanups + 1 Patch H + scan-filter-5ghz + xor-neon SCS + besser#18-fix), 276 079 bytes, b2sum 7418db5ddf8fe938b130bc9d0e9f7dc9060f3a13703cd50757835ac43140a13... Apply order in cleanups + bh-c-fossil-cleanup: 1 factory-series (c1 + factory-no-efuse-flag) 3 factory-thread-dev 4 pm-gate-on-handshake 5 remove-chardev-user-interface 6 enable-testmode 7 tx-sdio-dma-oob-danctnix (was 'staging-prep-series') 8 factory-drop-kernel-write-danctnix 9 drop-dpd-file-paths-danctnix 10 drop-orphan-file-io-danctnix 11 pm-timeout-silence-danctnix 12 scan-defer-on-reject-danctnix (c5.1) 13 scan-defer-backoff-tune-danctnix (c5.1.1) 14 lmac-recover-via-mmc-hw-reset-danctnix (c5.2 + c5.2.1) 16 pm-state-resync-danctnix (c6.1) 17 pm-wake-consume-state-danctnix (c6.2) 18 pm-detect-firmware-unsupported-danctnix (c7) 19 decrypt-storm-fast-recover-danctnix (Patch A) 20 connection-loss-fast-recover-danctnix (Patch B) 21 cw1200-fix-backports-danctnix (Patches F3 + F2 + F1) 24 sdio-rx-no-relay-danctnix (Patch C v3) 25 license-spdx-restore-attribution-danctnix (Patch G) 26 ba-lock-atomic-danctnix (Patch D) 27 ps-state-lock-skip-pm-disabled-danctnix (Patch E) 28 rx-list-batch-delivery-danctnix (Patch C2) 29 bh-c-fossil-cleanup-danctnix (Patch H) 30 scan-filter-5ghz-danctnix (besser#1) 31 arch/arm64/xor-neon-... (GCC 15 SCS) 32 queue-pending-record-lock-bh-danctnix (besser#18) Verification: pkgrel=6 build from this manifest in progress; if srcversion == 26B0003FE9F2B05DCE838C4 (pkgrel=5's), source-tree is byte-equivalent to the c5x interim + scan-filter + besser#18 stack that's currently running on ohm. Refs: #17 (the broken mirror), #28 (the interim PR that landed cumulative-c5x), #31 (ka-promote trailer normalisation followup).
145 lines
5.3 KiB
Diff
145 lines
5.3 KiB
Diff
From b76c9904f88e3147644960925d8c9835341e99d7 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 01/29] 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/drivers/staging/bes2600/Makefile b/drivers/staging/bes2600/Makefile
|
|
index 300912b..788aee2 100644
|
|
--- a/drivers/staging/bes2600/Makefile
|
|
+++ b/drivers/staging/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/drivers/staging/bes2600/bes2600_factory.c b/drivers/staging/bes2600/bes2600_factory.c
|
|
index dc5d3da..8d60b7c 100644
|
|
--- a/drivers/staging/bes2600/bes2600_factory.c
|
|
+++ b/drivers/staging/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.54.0
|
|
|