I do NIC drivers for pretty much all popular *nix OSes. Linux is, by far, the biggest PITA to develop for. Developing for a particular version of Linux is fine, but keeping a driver compatible with all commonly used variants is murder.
Almost every other OS, even open source OSes like FreeBSD, maintain a stable binary device driver interface (DDI). That means that a module compiled for one kernel will work on any other in that major release series (and, depending on the OS, in future releases). For example, my company's NIC drivers compiled for S10 work just fine on both OpenSolaris and Solaris11.
Linux does not do this. Heck, they don't even maintain a stable DDI between the same kernel version compiled with different options. Worse, they change their APIs for no sane reason, adding and removing function arguments, struct elements, etc, just because somebody looking for name recognition wants to "clean up" something.
So if Linux had some kind of stable DDI like,. well, everybody else, a lot of these problems would just go away.
Before somebody whines "Well, just get your driver into the kernel" --- it is. But our customers tend to want the latest version *without* updating to the bleeding edge 3.x kernels. Which means that we have to maintain compile shims all the way back to 2.6.9 (RHEL4). The last I checked, the compile shims alone were ~2000 lines of code, which is nearly the size of the *ENTIRE* driver on some other OSes.