From 1f07bf6cf52cd39213acb73409cac55a2dfae3a2 Mon Sep 17 00:00:00 2001 From: lorek123 Date: Sun, 31 May 2026 14:11:33 +0200 Subject: [PATCH] aic_load_fw: enable BT patch loading for AIC8800D80 U02/U03; fix kernel 6.17+ build Two fixes needed for working WiFi+BT on AIC8800D80 USB dongles: 1. aic_load_fw/aic_compat_8800d80.c: enable BT patch loading The entire BT patch-loading block in aicfw_download_fw_8800d80() is wrapped in #if 0, so fw_patch_table, fw_adid, fw_patch, and fw_patch_ext0 are never uploaded before the main firmware. BT is silently non-functional on all U02/U03 hardware (i.e. every real-world AIC8800D80 device seen in the field). Remove the two #if 0 / #endif guards: - Outer guard wrapping patch-table allocation + adid/patch address setup - Inner guard wrapping the actual firmware uploads for chip_id != CHIP_REV_U01 The Radxa reference driver (radxa-pkg/aic8800) already has this corrected. Fixes: hci0 never appears on AIC8800D80 USB dongle 2. aic8800_fdrv/rwnx_rx.c: replace in_irq() with hardirq_count() in_irq() was removed in kernel 6.17 (commit 57e969aa1b9c). hardirq_count() has the same semantics and is present since kernel 5.0. Fixes: build failure on kernel >= 6.17 Tested-by: Artur Lorenz kernel 6.19.14-ogc5.1.fc44.x86_64, Bazzite 44 chip AIC8800D80 CHIP_REV_U03 (chip_id=7) BT: hci0 (68:8F:C9:...) BR/EDR+LE working Co-Authored-By: Claude Sonnet 4.6 --- drivers/aic8800/aic8800_fdrv/rwnx_rx.c | 2 +- drivers/aic8800/aic_load_fw/aic_compat_8800d80.c | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/drivers/aic8800/aic8800_fdrv/rwnx_rx.c b/drivers/aic8800/aic8800_fdrv/rwnx_rx.c index 2f0ae38..6f2f9fc 100755 --- a/drivers/aic8800/aic8800_fdrv/rwnx_rx.c +++ b/drivers/aic8800/aic8800_fdrv/rwnx_rx.c @@ -1626,7 +1626,7 @@ void reord_deinit_sta(struct aicwf_rx_priv* rx_priv, struct reord_ctrl_info *reo reord_rxframe_free(&rx_priv->freeq_lock, &rx_priv->rxframes_freequeue, &req->rxframe_list); } - AICWFDBG(LOGINFO, "reord dinit in_irq():%d in_atomic:%d in_softirq:%d\r\n", (int)in_irq() + AICWFDBG(LOGINFO, "reord dinit in_irq():%d in_atomic:%d in_softirq:%d\r\n", (int)hardirq_count() ,(int)in_atomic(), (int)in_softirq()); spin_unlock_bh(&preorder_ctrl->reord_list_lock); } diff --git a/drivers/aic8800/aic_load_fw/aic_compat_8800d80.c b/drivers/aic8800/aic_load_fw/aic_compat_8800d80.c index 8f5c56b..838b3ec 100755 --- a/drivers/aic8800/aic_load_fw/aic_compat_8800d80.c +++ b/drivers/aic8800/aic_load_fw/aic_compat_8800d80.c @@ -386,7 +386,6 @@ int aicfw_download_fw_8800d80(struct aic_usb_dev *usb_dev) int i = 0; -#if 0 if (chip_id == CHIP_REV_U01) { head = aicbt_patch_table_alloc(usb_dev, FW_PATCH_TABLE_NAME_8800D80); } else { @@ -397,9 +396,6 @@ int aicfw_download_fw_8800d80(struct aic_usb_dev *usb_dev) return -1; } - if(head == NULL){ - return -1; - } if (chip_id == CHIP_REV_U01) { patch_info.addr_adid = FW_RAM_ADID_BASE_ADDR_8800D80; patch_info.addr_patch = FW_RAM_PATCH_BASE_ADDR_8800D80; @@ -414,11 +410,9 @@ int aicfw_download_fw_8800d80(struct aic_usb_dev *usb_dev) } printk("addr_adid 0x%x, addr_patch 0x%x\n", patch_info.addr_adid, patch_info.addr_patch); -#endif if(testmode == FW_NORMAL_MODE){ if (chip_id != CHIP_REV_U01){ - #if 0 if(rwnx_plat_bin_fw_upload_android(usb_dev, patch_info.addr_adid, FW_ADID_BASE_NAME_8800D80_U02)) { return -1; } @@ -433,7 +427,6 @@ int aicfw_download_fw_8800d80(struct aic_usb_dev *usb_dev) if (aicbt_patch_table_load(usb_dev, head)) { return -1; } - #endif if (IS_CHIP_ID_H()){ if(rwnx_plat_bin_fw_upload_android(usb_dev, RAM_FMAC_FW_ADDR_8800D80_U02, FW_BASE_NAME_8800D80_H_U02))