Issue #63: standard btusb ACL ZLP support
The aic_zlp_quirk companion module supplies the Bluetooth ACL bulk TX
zero-length-packet behavior confirmed in
issue #63. It is now part
of the normal aic8800 DKMS build rather than a replacement for the
distribution's Bluetooth driver.
The validated failure was specific and reproducible: AAC playback through USB
device 368b:8d81 stalled after about one minute, while SBC remained stable.
Adding URB_ZERO_PACKET to the ACL bulk OUT URBs kept AAC connected for more
than one hour. The standalone module was then verified with the system
btusb, no loaded aic_btusb, and 2,113 observed ZLP injections.
Architecture and scope
The module first tries to attach a kretprobe to the standard btusb function
that allocates ACL bulk OUT URBs. The target is module-qualified as
btusb:alloc_bulk_urb, avoiding similarly named symbols in unrelated USB
drivers.
Some distribution builds inline that private function. When the preferred hook
is unavailable, the module falls back to the stable usb_submit_urb entry
point. The fallback changes an URB only when all of these checks pass:
- USB device is exactly
368b:8d81; - the transfer is bulk OUT;
- the endpoint belongs to Bluetooth interface 0 (
e0/01/01).
Both paths add only URB_ZERO_PACKET. Wi-Fi interfaces and unrelated USB
devices are unchanged. If neither probe can be installed or kprobes are
disabled, the module refuses to load and system btusb remains unchanged.
The module carries a USB modalias for 368b:8d81, so it is inactive on other
hardware and normally autoloads only when the validated device appears.
Install from the unified branch
git fetch origin
git switch test/unified-wifi-bt-zlp
git pull --ff-only
sudo ./install.sh
sudo reboot
The installer removes the earlier btusb-aic-zlp/0.1 and
aic-zlp-quirk/0.1 diagnostic DKMS packages when present. To remove them
manually before installation, use:
sudo dkms remove btusb-aic-zlp/0.1 --all
sudo dkms remove aic-zlp-quirk/0.1 --all
sudo depmod -a
The unified installer also removes active configuration left by the obsolete
custom aic_btusb transport.
Verify
Confirm that system btusb owns Bluetooth interfaces 0/1 and that the quirk is
loaded:
lsusb -t
lsmod | grep -E '^(btusb|aic_zlp_quirk|aic_btusb)\b'
modinfo -n btusb
modinfo -n aic_zlp_quirk
cat /sys/module/aic_zlp_quirk/parameters/hook
cat /sys/module/aic_zlp_quirk/parameters/injections
sudo ./diagnose_bt.sh
Expected results include:
Bluetooth interfaces 0/1: btusb
aic_btusb: not loaded
aic_zlp_quirk: loaded
active hook: btusb:alloc_bulk_urb
active hook: usb_submit_urb is also valid when the compiler inlined the
preferred function. During Bluetooth traffic, the injections value must
increase.
For the promotion test, select AAC and play audio for at least one hour while also confirming that Wi-Fi scan, association, DHCP, and real traffic remain working.
Isolated retest helper
aic-zlp-quirk-test.sh remains available only for isolated issue #63 retests.
It builds the same canonical source from
drivers/aic8800/aic_zlp_quirk/aic_zlp_quirk.c as a separate DKMS package. A
normal installation should use the repository-level install.sh instead.
Kernel requirements
- matching kernel headers;
CONFIG_KPROBES=yand kretprobe support;- standard
btusbplus either itsalloc_bulk_urbsymbol or the USB coreusb_submit_urbsymbol; - a valid module signature when Secure Boot policy requires one.
The preferred function has the same signature in Linux 5.15, 6.1, 6.6, 6.12, 6.18, and 7.1.3, although compilers may inline it. DKMS builds one module for each installed kernel from the single canonical source file.