Correct driver for a device
Here’s a tip to check whether your piece of hardware is supported by the installed Linux kernel modules on your machine.
First, check lspci output for let’s say a wireless card:
$ lspci | grep -i wireless 01:00.0 Network controller: Atheros Communications Inc. AR928X Wireless Network Adapter (PCI-Express) (rev 01)
Note the number 01:00.0 in lspci output, in which 01 represents the bus number the device is attached to, 00 is the device number and final 0 is PCI device function. To get more information on that device we could list the entries in /sys/bus/pci/devices/0000:01:00.0 directory of sysfs (a RAM file system that exports kernel structures, attributes and their inner links. udev uses sysfs also to create dynamic device files). lspci actually reads sysfs.
Next, we print raw (-n option) PCI identification data that includes the previous numbers:
$ lspci -n | grep 01:00.0 01:00.0 0280: 168c:002a (rev 01)
These numbers are from /usr/share/misc/pci.ids file. Lets brake down the numbers:
- 01:00.0 – 01 is bus number, 00 device number, 0 device function
- 0280 – device class
- 168c – vendor ID
- 002a – device ID
We use the vendor ID and device ID numbers and compare them to a modinfo of kernel drivers:
$ find /lib/modules/$(uname -r)/kernel/drivers -type f -exec modinfo "{}" \; | grep -B 200 -i 168c | grep -B 50 -i 002a | grep filename
filename: /lib/modules/2.6.31-23-generic/kernel/drivers/net/wireless/ath/ath5k/ath5k.ko
filename: /lib/modules/2.6.31-23-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
So, my wireless card is supported by the ath9k driver. If I didn’t got the output from modinfo, it would probably mean that the hardware is not supported and that I need to get the driver from the device vendor. I could also search only for the vendor ID to get some results but that could yield some unexpected results I suppose.