danielrosehill's picture
commit
279efce
# Troubleshoot Bluetooth
You are helping the user diagnose and fix Bluetooth connectivity issues.
## Task
1. **Check Bluetooth service status:**
```bash
# Service status
systemctl status bluetooth
# Is it running?
systemctl is-active bluetooth
# Is it enabled to start on boot?
systemctl is-enabled bluetooth
```
2. **Check Bluetooth hardware:**
```bash
# List Bluetooth adapters
hciconfig -a
# Or using rfkill
rfkill list bluetooth
# Check if Bluetooth is soft/hard blocked
rfkill list
# Detailed hardware info
lsusb | grep -i bluetooth
lspci | grep -i bluetooth
```
3. **Check Bluetooth controller status:**
```bash
# Controller info
bluetoothctl show
# List controllers
bluetoothctl list
# Check if powered on
bluetoothctl show | grep "Powered:"
```
4. **Check for firmware issues:**
```bash
# Look for firmware errors in journal
journalctl -u bluetooth | grep -i firmware
# Check dmesg for Bluetooth firmware loading
dmesg | grep -i "bluetooth\|firmware" | tail -20
# Check kernel modules
lsmod | grep bluetooth
```
5. **Common fixes - Restart Bluetooth:**
```bash
# Restart Bluetooth service
sudo systemctl restart bluetooth
# Reset Bluetooth controller
sudo hciconfig hci0 down
sudo hciconfig hci0 up
# Or use bluetoothctl
bluetoothctl power off
sleep 2
bluetoothctl power on
```
6. **Unblock Bluetooth if blocked:**
```bash
# Check if blocked
rfkill list bluetooth
# Unblock if soft-blocked
sudo rfkill unblock bluetooth
# Power on controller
bluetoothctl power on
```
7. **Scan for devices:**
```bash
# Start scanning
bluetoothctl scan on
# Wait 10 seconds
sleep 10
# List discovered devices
bluetoothctl devices
# Stop scanning
bluetoothctl scan off
```
8. **Check paired devices:**
```bash
# List paired devices
bluetoothctl paired-devices
# Show info about specific device
bluetoothctl info DEVICE_MAC_ADDRESS
```
9. **Remove and re-pair problematic device:**
```bash
# Ask user for device MAC address
# Remove device
bluetoothctl remove DEVICE_MAC_ADDRESS
# Scan again
bluetoothctl scan on
sleep 10
# Pair device
bluetoothctl pair DEVICE_MAC_ADDRESS
# Trust device
bluetoothctl trust DEVICE_MAC_ADDRESS
# Connect to device
bluetoothctl connect DEVICE_MAC_ADDRESS
```
10. **Check Bluetooth configuration:**
```bash
# Main config file
cat /etc/bluetooth/main.conf
# Check for problematic settings
grep -E "^(Name|Class|DiscoverableTimeout|AutoEnable)" /etc/bluetooth/main.conf
```
11. **Check for interference:**
```bash
# Check WiFi and Bluetooth coexistence
iw dev | grep -i channel
# Bluetooth operates on 2.4GHz
# WiFi on 2.4GHz can interfere
echo "Consider switching WiFi to 5GHz if available"
```
12. **Detailed diagnostics:**
```bash
# Bluetooth subsystem logs
journalctl -u bluetooth --since "1 hour ago" --no-pager
# Kernel Bluetooth messages
dmesg | grep -i bluetooth | tail -30
# Check for errors
journalctl -u bluetooth | grep -iE "error|fail|timeout"
```
13. **Audio-specific Bluetooth issues:**
```bash
# Check PulseAudio/PipeWire Bluetooth modules
pactl list | grep -i bluetooth
# PipeWire Bluetooth
pw-cli ls Device | grep -i bluetooth
# Load Bluetooth module (PulseAudio)
# pactl load-module module-bluetooth-discover
# Restart audio with Bluetooth
systemctl --user restart pipewire pipewire-pulse wireplumber
```
14. **Generate diagnostic report:**
```bash
cat > /tmp/bluetooth-diagnostic.txt << EOF
Bluetooth Diagnostic Report
===========================
Date: $(date)
=== Service Status ===
$(systemctl status bluetooth --no-pager)
=== Hardware Detection ===
$(rfkill list bluetooth)
$(hciconfig -a)
=== Controller Info ===
$(bluetoothctl show)
=== Paired Devices ===
$(bluetoothctl paired-devices)
=== Recent Bluetooth Logs ===
$(journalctl -u bluetooth --since "1 hour ago" --no-pager | tail -50)
=== Kernel Messages ===
$(dmesg | grep -i bluetooth | tail -30)
=== Loaded Modules ===
$(lsmod | grep bluetooth)
=== Configuration ===
$(grep -v "^#\|^$" /etc/bluetooth/main.conf)
EOF
cat /tmp/bluetooth-diagnostic.txt
```
## Common Issues & Solutions
**Bluetooth not starting:**
```bash
# Check if service masked
systemctl unmask bluetooth
sudo systemctl enable --now bluetooth
```
**Device pairs but won't connect:**
```bash
# Remove and re-pair
bluetoothctl remove DEVICE_MAC
bluetoothctl scan on
# Wait for device to appear
bluetoothctl pair DEVICE_MAC
bluetoothctl trust DEVICE_MAC
bluetoothctl connect DEVICE_MAC
```
**Audio stuttering or quality issues:**
```bash
# Check Bluetooth audio codec
pactl list | grep -i "bluetooth\|codec"
# Try different codec
# Edit /etc/bluetooth/main.conf
# [General]
# Enable=Source,Sink,Media,Socket
```
**Bluetooth adapter not found:**
```bash
# Reload Bluetooth module
sudo rmmod btusb
sudo modprobe btusb
# Or all Bluetooth modules
sudo rmmod bnep btusb bluetooth
sudo modprobe bluetooth
sudo modprobe btusb
sudo modprobe bnep
```
**Random disconnections:**
```bash
# Increase page timeout
sudo hciconfig hci0 pageto 8192
# Disable power management for USB Bluetooth
# Add to /etc/udev/rules.d/50-bluetooth.rules:
# ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="YOUR_VENDOR", ATTR{power/autosuspend}="-1"
```
**LE (Low Energy) devices not working:**
```bash
# Enable LE in bluetoothctl
bluetoothctl
[bluetooth]# menu scan
[bluetooth]# transport le
[bluetooth]# scan on
```
## Reset Bluetooth Completely
If nothing else works:
```bash
# Stop Bluetooth
sudo systemctl stop bluetooth
# Remove paired devices cache
sudo rm -rf /var/lib/bluetooth/*
# Restart Bluetooth
sudo systemctl start bluetooth
# Re-pair all devices
```
## Notes
- Most Bluetooth adapters work with btusb kernel module
- Firmware files typically in `/lib/firmware/`
- Check if kernel has Bluetooth support: `zgrep BLUETOOTH /proc/config.gz`
- Some devices require specific pairing codes
- Audio devices may need PulseAudio/PipeWire Bluetooth modules
- USB Bluetooth adapters: check with `usb-devices | grep -A 10 Bluetooth`
- Bluetooth 5.x adapters are backward compatible with older devices
- Distance and obstacles affect connection quality