1
0
Fork 0
android_device_rockchip_tart/wifi/wireless_reprobe.sh

46 lines
2 KiB
Bash

#!/vendor/bin/sh
#
# wireless_reprobe.sh - re-probe wireless drivers once /vendor is mounted.
#
# Built-in wireless drivers probe during early kernel init, before /vendor
# (which holds all firmware; see the kernel's patched fw_path[]) is mounted.
# Their firmware requests fail fast with ENOENT and the kernel never retries,
# leaving the hardware driverless or degraded. Run from init at post-fs
# (i.e. after /vendor is mounted) via init.tart.wifi.rc, this script:
#
# 1. Re-probes every driverless USB interface, so a USB WiFi adapter that
# was plugged in at power-on (and whose driver probe failed on the
# missing firmware) gets a second probe that can now load firmware.
# 2. Rebinds the Broadcom Bluetooth serdev device, so hci_bcm reloads its
# .hcd patch firmware (e.g. brcm/SYN43711A0.hcd). Without the patch the
# controller runs with unpatched defaults, which cripples TX power/range.
#
# Both operations are idempotent and safe: already-bound USB interfaces are
# skipped, and the BT rebind simply re-registers hci0 before the Bluetooth
# stack starts.
# 1. USB: ask the kernel to re-run driver matching for unbound interfaces
# (directories like 1-1:1.0 without a "driver" symlink). Two passes with a
# delay: a probe that was already in flight (started just before /vendor
# finished mounting) can still fail after the first pass runs; the second
# pass catches the interface it leaves behind.
reprobe_usb() {
for intf in /sys/bus/usb/devices/*:*; do
[ -e "$intf/driver" ] && continue
echo "${intf##*/}" > /sys/bus/usb/drivers_probe 2>/dev/null
done
}
reprobe_usb
sleep 3
reprobe_usb
# 2. Bluetooth: unbind + re-probe serdev devices so the hci_bcm driver's
# firmware patch request runs again with /vendor/firmware available.
for dev in /sys/bus/serial/devices/*; do
[ -e "$dev/driver" ] || continue
name="${dev##*/}"
echo "$name" > "$dev/driver/unbind" 2>/dev/null
echo "$name" > /sys/bus/serial/drivers_probe 2>/dev/null
done
exit 0