Subject: Re: Advice about network driver needed
To: Lennart Augustsson <lennart@augustsson.net>
From: Matt Thomas <matt@3am-software.com>
List: tech-kern
Date: 12/25/1999 23:32:51
At 04:20 PM 12/25/99 , Lennart Augustsson wrote:
>I'm looking at a driver for a USB Ethernet adapter (with the ADMtek Pegasus chip).
>In principle the chip looks quite straightforward to handle, but there is a big snag.
>
>It seems that in network drivers most of the processing happens in interrupt routines;
>a receiver interrupt to deliver a packet up, a transmitter interrupt to send the next one,
>the watchdog routine to reset the chip etc.
>All these routines need to access registers in the chip, and here comes the problem. You
>cannot easily access the registers. An access to a chip register requires a USB bus
>transaction, but these take a long time and need to use tsleep() (which is banned in
>interrupt context).
>So there are several ways to handle this:
> * Use delay() instead of tsleep(). This is totally unacceptable, since it would make the
> driver busy-wait for about 1 ms. (FYI, the FreeBSD driver does this.)
> * Use a state machine (which can be coded in many ways). This means that a register access
> will now be a two step operation: start the access and call a completion routine to
> do the rest of the job. This is quite tedious.. :(
> * Use a kernel thread for driver. The interrupt routine would then just wake up the
> kernel thread and have it complete the operation. The problem with this is that
> I think you need at least two threads for the driver to avoid deadlock. This seems
> excessive. :(
In this instance I'd use a kernel thread for the majority of the stuff but think about making
the frequently done stuff via a state machine to avoid context switches. Since USB Ethernet
can't be full duplex (right?), why would you need more than one thread per device?
Simply the logic would be a loop doing: (handle any ioctl, transmit a single packet,
receive a packet).
--
Matt Thomas Internet: matt@3am-software.com
3am Software Foundry WWW URL: http://www.3am-software.com/bio/matt/
Cupertino, CA Disclaimer: I avow all knowledge of this message