I recently read this article about how the Linux device driver project needs more work to do. I pondered this for awhile, and came to a realization. While Linux still does indeed lack drivers for some hardware, I believe that the lack of drivers is no longer the largest technological obstacle to Linux adoption. The thing Linux needs to focus mostly on now is completeness, not quantity, of hardware support. Read on, and allow me to explain.

If you take the newest version of Ubuntu Gutsy Gibbon, you can install it on just about any standard desktop PC, and it will work. The video card will most likely work just fine. It will work even better if you take the two clicks to install a binary driver, if necessary. The mouse, keyboard, and other peripherals will work. All of your drives will work. It is only incredibly rare hardware, such as some proprietary enterprise RAID controllers, that will be completely unsupported. Also, if you have an extremely new high-end motherboard, it may not work perfectly. However, problems with new motherboards seem to get fixed in the next kernel release. You can’t expect much more than that, especially considering the incredibly rapid kernel development cycle. I can not honestly say the situation is perfect. There are still a lot of drivers that need writing. However, it has been a very long time since I have encountered any completely unsupported desktop hardware, and more drivers being written every day.

If my experience is not uncommon, why is there still a common perception that Linux lacks hardware support? Perhaps people tried Linux back when hardware support was terrible, and they don’t realize how far it has come since then? Perhaps people who have this impression have never really tried Linux, and they just go by what they read in the tech news? These are possibilities, but whatever the cause, I can tell you that there is actually another, bigger, problem looming in the Linux world. The problem I see is that many existing Linux drivers are incomplete.

Don’t get me wrong. I don’t mean to say the drivers are low quality. In fact, Linux drivers are among the best in terms of stability, security, and performance. What I mean by incomplete is that the drivers do not support every feature of the hardware. Sure, they support the core functionality, but many pieces of supported hardware have non-essential features which are unsupported. If the Linux drivers were complete, as well as quality, we could honestly say that Linux actually supports hardware better than Windows does. Instead we continue to play catch-up. To fully demonstrate my meaning, let me give you some personal examples of incomplete Linux hardware support. Just as a note, I am aware that not all of these examples should be solved in the domain of kernel drivers, but how the solutions should be implemented is irrelevant to my fundamental thesis.

On my desktop at home I have a Logitech MX1000. It is a wireless USB laser mouse with thirteen different buttons. The core functionality works perfectly in Linux. I can point, I can click, I can scroll, and I can hotplug the USB. This is a big improvement from the Linux of just a few years ago. However, all is not well. Many of these 13 buttons do not work properly, or easily, under Linux. Also, this mouse is designed to run at 800cpi. In Linux I must install and use a command line application to set it to 800cpi instead of the default of 400cpi. I also have to use the same application to change the cruise control setting. This is a very powerful mouse, but under Linux it is no better than a normal wireless USB wheel mouse. The user can do a lot of tweaks to improve the situation, but at the present time you can not achieve anything close to the features offered by Logitech SetPoint under Windows. Linux may be free as in beer, but it effectively costs me $50 if it reduces my $80 mouse to the feature set of a $30 mouse.

Now let’s look at some high-end motherboards. As I said, brand new motherboards tend to have flaky Linux support until a new kernel version is released. That is to be expected. However, many enthusiast motherboards produced by companies like Abit and ASUS have extra features not found on the motherboard in your average Dell. Many of these motherboards allow flashing of the BIOS while the OS is running. Others allow live overclocking. I personally would never suggest using such features, but that is besides the point. The point is that the hardware has features which are not available to the Linux user. The advantages of software freedom appear quite diminished when you realize that to get them you will not get everything out of your hardware that you paid for.

I have a Fujitsu P7230 notebook running Ubuntu Gutsy. I am using it to write this very article. It works extremely well, but, as you would expect, not every feature of the laptop is functional under Linux. This laptop has a g-force sensor. In Windows it uses that sensor to determine when to park the drive heads. In Linux this feature is completely unsupported. The fingerprint reader, two custom buttons, and the internal microphones are all unsupported. The internal memory card reader works, but has IO errors with some SD cards. The basic functionality of my laptop computer is all there with Ubuntu, but none of the weird special features are. Those weird and special features might seem relatively unimportant, but people want to use them. When they pop in a Linux LiveCD and a feature they use is not available, to them it is no better than if it hadn’t worked at all.

Let me now bring back my longest lasting Linux gripe, sound. Audio has improved a lot in Linux since I last blogged about it, but it is still the one department where I feel Linux needs the most work. Let us look at the sound card in my desktop as an example. It’s an on-board Nvidia/Realtek sound card. It can produce and capture analog stereo sound, and it can output PCM audio through the optical output. The basic functionality of the sound card works perfectly, and with some tricky configuration of alsa it can do a bit more. However, if you want more than that, just give up. I’ve been waiting for years, and there has been no improvement whatsoever.

Pretty much zero of the advanced features of the sound card are supported under Linux. Under Windows the sound card will mix, in hardware, all outgoing audio into a single Dolby Digital signal and send that out of the optical output. It can also do lots of other things involving the routing of sound to different speakers, or routing the PC speaker to the optical output. It’s actually quite incredible that the on-board sound card has more features than most home theater receivers. Regardless, only the most basic features of playing and recording audio function under Linux. Support for surround sound in Linux in general is complete shit. People these days have these incredible DSPs in their computers capable of advanced hardware audio processing, but under Linux they might as well all be Sound Blaster 16s. This is a case where we have a driver for a piece of hardware, and it works, but it does not implement every available feature of that hardware properly.

For one more example, let’s look at my scanner. It’s a CanoScan LiDE-50. It used to be completely unsupported under Linux, but it works now. However, it works like shit. Under Windows it scans very quickly, under Linux it scans slowly. Also, there are four buttons on the face of the scanner. Under Windows these buttons allow launching of the scanner application, or even taking the current scan and directly attaching it to an e-mail. Under Linux these buttons are unavailable. Sure, it’s nice that the scanner works, but the fact that it works worse than it does in Windows is not going to give someone a reason to switch. What we need to strive for is making the scanner work better in Linux than it does anywhere else. Not only should it scan at the proper speed, but perhaps the functionality of the buttons could be customizable by the user. Perhaps some open source scanning application could find some new and intuitive uses for those buttons and make Linux superior to Windows in even more ways.

When people try out Linux, they don’t care just that their hardware works. Even if Linux hardware support were exactly the same as Windows hardware support, many people would not switch. They have no reason to switch, because there is no advantage. However, if Linux actually supported the hardware better than Windows did, that would be something. Imagine someone putting in a LiveCD to find that their scanner scans faster. Imagine someone finding out that with Linux they can use the g-force sensor in their laptop as a theft alarm. What attracts most average people to Linux in the first place is its superior performance, stability, and security. However, those advantages will be overshadowed if someone finds out that they can’t do everything they used to do with the exact same hardware.

I want to conclude by clarifying that I am well aware that not all of these unsupported hardware problems are a result of incomplete kernel drivers. Many of these problems should be solved in userspace in one way or another. That is all irrelevant. What is important is that when you have a piece of hardware primarily designed to do function X, but capable of Y and Z, you can’t support just feature X and consider that to be satisfactory. Unless every single feature of a given piece of hardware is pushed to the absolute limit by the software, then the user is not getting everything they have paid for in that hardware. The failure to implement features Y and Z is keeping Linux back these days much more so than the failure to implement X. If there are Linux developers out there looking for things to work on, go back and take another look at hardware which is currently considered to be supported, and make sure that every single feature is supported 100%. If not, you’ve got some work to do.