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:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user