I have a
little job that runs on my web server and tells me what URIs people have
tried to fetch over the last 24 hours which were not successful. One of these
URIs was for a page that used to contain my first ever Linux device driver.

That device driver is now obsolete and so there was little point in tracking
down the code and putting it back in place, but I did think there was a story
to tell, so today I wrote down what happened with this driver at the URI.
Thanks to the magic of ikiwiki's "inline" directive, here it is in the log:

This is a story about my first real attempt to contribute to the Linux kernel.

The Davicom DM9601 is a cheap USB NIC that I picked up on ebay at some point
in late 2006. Suprisingly, at the time, there was no driver for it in the
Linux kernel. I'd had some experience hacking on the kernel whilst working for
IBM and I've always wanted to get more involved, so I thought this would be a
good opportunity.

I searched around and managed to find a vendor-written driver for the 2.4.x
kernel series, but nothing newer. I felt that the best approach would be to
start porting this driver to 2.6, improving it along the way.

I got to work, and after several hours I had something that would compile
against 2.6 series headers, at least, so I put my progress online and wrote a
short log post about it (dm9601).

Once I had the code up there, kernel hacker Arnd Bergmann got in touch with
me. He said, quite frankly, that my driver had a long way to go, but that he
would be willing to help mentor me and guide me in improving it so that it
would make it into mainline. This was fantastic news: this is exactly what
people need when trying to get up to speed with the customs of something as
complex as the kernel development community. Arnd sent me a long list of
things I needed to fix.

Whilst I had my code online I had several other people get in touch with me
and provide things like device IDs for their NICs that they needed to add in
order to get it to work for their hardware.

Several weeks later, after implementing a good chunk of Arnd's suggestions, I
had a driver that worked, at least a little bit, with 2.6, so I got back in
touch with Arnd. Bad news, for me at least: Peter Korsgaard, another kernel
hacker, had implemented a dm9601 driver from scratch over a weekend.
Apparently he was at a friend's house, his friend had this device, he noticed
there wasn't a driver in the kernel already and sat down to write it as a fun
project. From scratch. In one weekend.

This was a bit of a blow. I couldn't imagine having the skill and knowledge
required to be able to pump out a driver like that, but I knew the first step
on the road was what I was doing, and that road was now closed. I couldn't
really blame Peter, I could only really feel quite jealous at his prowess, so
that was the end of that.

His driver was much leaner, much tidier, fitted the kernel programming style
properly, and was thus accepted. However, for my hardware at least, it didn't
actually work, and he didn't have access to the device after that one weekend,
so he wasn't in a position to fix it.

This situation lasted about 4 months from 2007-02-23, when Peter's driver was
accepted, until about 2007-06-27 with this
patch.