The 49bluetooth hook disables /proc/acpi/ibm/bluetooth but this isn't synchronous, i. e. it doesn't wait until the module usage count actually drops to 0. Due to that, it's impossible to add btusb to SUSPEND_MODULES (on some models/older kernels you need to do that to fix suspend problems), as at that point the module is still in use. To demonstrate that, I added some logging to the hook:
==== before: =====
--- /proc/acpi/ibm/bluetooth ----
status: enabled
commands: enable, disable
--- rfkill list ---
0: tpacpi_bluetooth_sw: Bluetooth
Soft blocked: no
Hard blocked: no
1: tpacpi_wwan_sw: Wireless WAN
Soft blocked: no
Hard blocked: no
2: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
10: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
--- lsmod ---
btusb 18600 2
=== after writing /proc/acpi/ibm/bluetooth ====
--- /proc/acpi/ibm/bluetooth ----
status: disabled
commands: enable, disable
--- rfkill list ---
0: tpacpi_bluetooth_sw: Bluetooth
Soft blocked: yes
Hard blocked: no
1: tpacpi_wwan_sw: Wireless WAN
Soft blocked: no
Hard blocked: no
2: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
10: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
--- lsmod ---
btusb 18600 2
As we can see, /proc/acpi/ibm/bluetooth got updated, but both rfkill as well as the module usage count are still active.
=== after sleep 0.5 ====
--- /proc/acpi/ibm/bluetooth ----
status: disabled
commands: enable, disable
--- rfkill ---
0: tpacpi_bluetooth_sw: Bluetooth
Soft blocked: yes
Hard blocked: no
1: tpacpi_wwan_sw: Wireless WAN
Soft blocked: no
Hard blocked: no
2: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
--- lsmod ---
btusb 18600 0
Now it disappeared from rfkill and the module usage count dropped to 0.
I'll write a better hook which waits for the module to get unused.
(Original bug at https:/ /launchpad. net/bugs/ 698331)
The 49bluetooth hook disables /proc/acpi/ ibm/bluetooth but this isn't synchronous, i. e. it doesn't wait until the module usage count actually drops to 0. Due to that, it's impossible to add btusb to SUSPEND_MODULES (on some models/older kernels you need to do that to fix suspend problems), as at that point the module is still in use. To demonstrate that, I added some logging to the hook:
==== before: ===== ibm/bluetooth ---- bluetooth_ sw: Bluetooth
--- /proc/acpi/
status: enabled
commands: enable, disable
--- rfkill list ---
0: tpacpi_
Soft blocked: no
Hard blocked: no
1: tpacpi_wwan_sw: Wireless WAN
Soft blocked: no
Hard blocked: no
2: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
10: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
--- lsmod ---
btusb 18600 2
=== after writing /proc/acpi/ ibm/bluetooth ==== ibm/bluetooth ---- bluetooth_ sw: Bluetooth
--- /proc/acpi/
status: disabled
commands: enable, disable
--- rfkill list ---
0: tpacpi_
Soft blocked: yes
Hard blocked: no
1: tpacpi_wwan_sw: Wireless WAN
Soft blocked: no
Hard blocked: no
2: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
10: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
--- lsmod ---
btusb 18600 2
As we can see, /proc/acpi/ ibm/bluetooth got updated, but both rfkill as well as the module usage count are still active.
=== after sleep 0.5 ==== ibm/bluetooth ---- bluetooth_ sw: Bluetooth
--- /proc/acpi/
status: disabled
commands: enable, disable
--- rfkill ---
0: tpacpi_
Soft blocked: yes
Hard blocked: no
1: tpacpi_wwan_sw: Wireless WAN
Soft blocked: no
Hard blocked: no
2: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
--- lsmod ---
btusb 18600 0
Now it disappeared from rfkill and the module usage count dropped to 0.
I'll write a better hook which waits for the module to get unused.