feat: fast Intel BT firmware download (bulk-pipelined payload, no timeout burns)

Two fixes, verified on the AX211 (8087:0033), ibt-1040-0041.sfi, 720 KB:

1. TryHeader waited 1500+2000 ms for secure-send results after the CSS and
   key/signature sends, but on success this controller stays SILENT until
   the end of the whole download (traced) -- both timeouts always burned in
   full.  A rejection arrives within milliseconds, so 250 ms windows lose
   nothing and save ~3 s per cold boot.

2. The payload now goes over the bulk OUT endpoint with up to 7 fragments
   in flight (the btusb bootloader path for 0xFC09), replacing ~2900
   synchronous 3-stage EP0 control transfers.  Headers stay on EP0; the
   ACL TX DMA ring is reused (no ACL header, no NOCP credit accounting).
   DrainBulkTx() ensures all bytes reach the controller before waiting for
   the download-complete result.

Also in this branch since main: IRQ-safe BT-TRACE ring (KernelLogStream in
TransferCallback deadlocked on the terminal Mutex from MSI context), xHCI
interrupt-IN ZLP length fix, always-re-arm of the BT event pipe,
InPollContext same-core owner check, TLV version read retry.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
2026-07-07 11:52:21 +02:00
co-authored by Claude Fable 5
parent dc89495011
commit 72f6c4449c
4 changed files with 95 additions and 5 deletions
+7
View File
@@ -244,6 +244,13 @@ namespace Drivers::USB::Bluetooth::Hci {
// 0xFF/0x06 secure-send result event (see WaitSecureSendResult).
bool IntelSecureSend(uint8_t fragmentType, const uint8_t* data, uint32_t len);
// Pipelined bulk-OUT variant for the firmware payload (btusb bootloader
// path: 0xFC09 packets on the bulk endpoint, several in flight). Call
// DrainBulkTx() after the last fragment to ensure everything reached the
// controller before waiting for the download-complete result.
bool IntelSecureSendBulk(uint8_t fragmentType, const uint8_t* data, uint32_t len);
bool DrainBulkTx(uint32_t timeoutMs);
// Reset / await the Intel "secure send result" vendor event (0xFF/0x06).
// Call ClearSecureSendResult() before a download phase, then
// WaitSecureSendResult() to read the outcome (result/status, 0 = success).