Load-Time Configuration
There are a couple of standard keywords that users expect to have available for configuring the interface. Any new network module is expected to follow the standard:
-
io= Sets the I/O port’s base address for the interface. If more than one interface is installed in the system, a comma-separated list can be specified.
-
irq= Sets the interrupt number. More than one value can be specified, as above.
In other words, a Linux user who has two
own_eth interfaces installed will expect to load
the module with a command line like:
insmod own_eth.o io=0x300,0x320 irq=5,7
Both the io= and the irq= options
probe for the interface if 0 is specified as a value. A
user can thus force probing by specifying io=0. Most
drivers usually probe for one interface if the user doesn’t specify any
option, but sometimes probing is disallowed for modules (see the
comments in ne.c about probing for NE2000 devices).
The device driver should arrange for the behavior just described. The typical implementation for ISA devices looks like the following, assuming the driver supports up to four interfaces:
static unsigned int io[] = {0, ~0, ~0, ~0}; /* probe the first */ static unsigned int irq[] = {0, 0, 0, 0}; /* probe if unknown */ int init_module(void) { i, found = 0; /* too high I/O addresses are not valid ones */ for (i=0; io[i]<0x1000 /* 4KB */ && i<4; i++) { /* the device-specific function below is boolean */ found += own_eth_register(io[i], irq[i]); } return found ? 0 : -ENODEV; } /* device-specific ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access