Finally, I get the bluetooth in my Dell Inspiron 3420 work.
However, still not recommended. Even I can make it work on my Dell Inspiron, the mouse is "jumpy", turn on and off from time to time. In the end I still bought a bluetooth dongle.
So the answer is: go and get a bluetooth dongle!
http://askubuntu.com/questions/533043/bluetooth-not-working-on-ubuntu-14-04-with-dell-inspiron-15-3521
1. Find the problem
dmesg |grep Bluetooth get the following messages
[ 1.672468] Bluetooth: Core ver 2.20
[ 1.672487] Bluetooth: HCI device and connection manager initialized
[ 1.672492] Bluetooth: HCI socket layer initialized
[ 1.672495] Bluetooth: L2CAP socket layer initialized
[ 1.672507] Bluetooth: SCO socket layer initialized
[ 1.685942] Bluetooth: hci0: BCM: patch brcm/BCM43142A0-0a5c-21d7.hcd not found
[ 3.984211] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[ 3.984215] Bluetooth: BNEP filters: protocol multicast
[ 3.984220] Bluetooth: BNEP socket layer initialized
[ 3.990964] Bluetooth: RFCOMM TTY layer initialized
[ 3.990972] Bluetooth: RFCOMM socket layer initialized
[ 3.990978] Bluetooth: RFCOMM ver 1.11
[ 31.413744] Bluetooth: HIDP (Human Interface Emulation) ver 1.2
[ 31.413753] Bluetooth: HIDP socket layer initialized
the firmware is not found.
2. Find the right firmware
Method 1, as mentioned by Florin C, check the ".inf" file and find the ID. His suggestion of using BCM43142A0_001.001.011.0122.0126.hex works (well, some time not work very well).
Method 2, as suggested, I installed the official driver from Dell website to a windows (it's a virtual machine and I linked the bluetooth USB device to it) and copied out the hex file under c:\windows\system32\drivers. The file that I ultimately used is BCM43142A0_001.001.011.0084.0086.hex
3. download hex2hcd, compile and convert hex to hcd, copy to /lib/firmware/brcm/BCM43142A0-0a5c-21d7.hcd
4. restart, it should work
5. sometimes it does not work well after restart. then need to execute
sudo modprobe -r btusb
sudo modprobe btusb
6. so I made a simple script
echo "Uptime: `uptime`">~/.bluetooth_reload.log
if dmesg|grep "hci0 command 0x1001 tx timeout" > /dev/null;
then
echo "reloading bluetooth" >>~/.bluetooth_reload.log;
sudo modprobe -r btusb
sudo modprobe btusb
else
echo "no need to reload bluetooth" >>~/.bluetooth_reload.log;
fi
and allow everyone run it
# allow everyone run certain commands
user host = (root) NOPASSWD: /sbin/modprobe -r btusb
user host = (root) NOPASSWD: /sbin/modprobe btusb