From ea541455b529a7e4e4bb76eb6a4d4a5dab220c91 Mon Sep 17 00:00:00 2001 From: kurogeek Date: Tue, 28 Jul 2026 17:47:32 +0700 Subject: [PATCH] mob next [ci-skip] [ci skip] [skip ci] lastFile:machines/anser/patches/aic8800-gpio-power.patch --- machines/anser/configuration.nix | 76 ++++++++++++++++++- .../anser/patches/aic8800-gpio-power.patch | 29 +++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 machines/anser/patches/aic8800-gpio-power.patch diff --git a/machines/anser/configuration.nix b/machines/anser/configuration.nix index fb28793..9954a3f 100644 --- a/machines/anser/configuration.nix +++ b/machines/anser/configuration.nix @@ -1,8 +1,70 @@ { - inputs, + config, pkgs, ... }: +let + aic8800-src = pkgs.fetchFromGitHub { + owner = "radxa-pkg"; + repo = "aic8800"; + rev = "c9176c164b3dd154d8fc7ae23c5f0cfd6b6553a3"; + hash = "sha256-ZamZ+nerZRFiHxaLx9x5vnRaATKvY7FkBsfkzsdL3wc="; + }; + + # Firmware - flat structure, uncompressed (driver uses filp_open, not request_firmware) + aic8800-firmware = pkgs.stdenvNoCC.mkDerivation { + pname = "aic8800-firmware"; + version = "2024.11.19"; + src = aic8800-src; + dontBuild = true; + installPhase = '' + mkdir -p $out/lib/firmware/aic8800_fw/SDIO + cp -r src/SDIO/driver_fw/fw/aic8800D80/* $out/lib/firmware/aic8800_fw/SDIO/ + ''; + }; + + aic8800-driver = config.boot.kernelPackages.callPackage ( + { stdenv, kernel }: + stdenv.mkDerivation { + pname = "aic8800-driver"; + version = "2024.11.19-${kernel.version}"; + src = aic8800-src; + nativeBuildInputs = kernel.moduleBuildDependencies; + hardeningDisable = [ "pic" ]; + + patchPhase = '' + runHook prePatch + for p in debian/patches/fix-linux-6.1-build.patch \ + debian/patches/fix-linux-6.5-build.patch \ + debian/patches/fix-linux-6.7-build.patch \ + debian/patches/fix-linux-6.9-build.patch \ + debian/patches/fix-linux-6.12-build.patch \ + debian/patches/fix-sdio-firmware-path.patch \ + debian/patches/fix-sdio-fall-through.patch; do + [ -f "$p" ] && patch -p1 < "$p" || true + done + patch -p1 < ${./patches/aic8800-gpio-power.patch} || true + runHook postPatch + ''; + + preBuild = "cd src/SDIO/driver_fw/driver/aic8800"; + + buildPhase = '' + runHook preBuild + make KDIR=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build \ + ARCH=arm64 CROSS_COMPILE= modules + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + mkdir -p $out/lib/modules/${kernel.modDirVersion}/kernel/drivers/net/wireless/aic8800 + find . -name '*.ko' -exec cp {} $out/lib/modules/${kernel.modDirVersion}/kernel/drivers/net/wireless/aic8800/ \; + runHook postInstall + ''; + } + ) { }; +in { nixpkgs.hostPlatform = { system = "aarch64-linux"; @@ -16,6 +78,18 @@ boot.loader.grub.enable = false; boot.loader.generic-extlinux-compatible.enable = true; + boot.extraModulePackages = [ aic8800-driver ]; + boot.kernelModules = [ + "aic8800_bsp" + "aic8800_fdrv" + ]; + + # Point directly to nix store path - available immediately, no compression + boot.extraModprobeConfig = '' + options aic8800_bsp aic_fw_path=${aic8800-firmware}/lib/firmware/aic8800_fw/SDIO skip_power_wait=1 + options aic8800_fdrv aicwf_dbg_level=0 + ''; + hardware.enableRedistributableFirmware = true; boot.kernelParams = [ diff --git a/machines/anser/patches/aic8800-gpio-power.patch b/machines/anser/patches/aic8800-gpio-power.patch new file mode 100644 index 0000000..9b4a315 --- /dev/null +++ b/machines/anser/patches/aic8800-gpio-power.patch @@ -0,0 +1,29 @@ +--- a/src/SDIO/driver_fw/driver/aic8800/aic8800_bsp/aicsdio.c ++++ b/src/SDIO/driver_fw/driver/aic8800/aic8800_bsp/aicsdio.c +@@ -28,6 +28,14 @@ + #include "aic_bsp_driver.h" + #include "aicsdio_txrxif.h" + ++#ifdef CONFIG_PLATFORM_UBUNTU ++#include ++#include ++static bool skip_power_wait = true; ++module_param(skip_power_wait, bool, 0644); ++MODULE_PARM_DESC(skip_power_wait, "Skip power sequence wait (card already enumerated by DT)"); ++#endif ++ + #ifdef CONFIG_PLATFORM_ALLWINNER + extern int sunxi_wlan_get_bus_index(void); + extern void sunxi_wlan_set_power(int on); +@@ -515,6 +523,11 @@ static int aicbsp_platform_power_on(void) + rockchip_wifi_set_carddetect(1); + #endif /*CONFIG_PLATFORM_ROCKCHIP2*/ + ++#ifdef CONFIG_PLATFORM_UBUNTU ++ if (skip_power_wait) ++ return 0; ++#endif ++ + sema_init(&aic_chipup_sem, 0); + ret = aicbsp_reg_sdio_notify(&aic_chipup_sem); + if (ret) {