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 registration function */ int own_eth_register(unsigned int iobase, unsigned int irq) { if (!iobase) /* if iobase is 0, then probe for a device */ iobase = own_eth_probe_iobase(); if (!iobase) return 0; /* not found */ if (!irq) /* if irq is 0, probe for it */ irq = own_eth_probe_irq(iobase) return own_eth_init(iobase, irq); }
This code probes for one board by default and always
tries to autodetect the interrupt, but the user can change this behavior.
For example, io=0,0,0
probes for three boards.
In addition to using io
and irq
, the driver writer is free
to add other load-time configuration variables. There is no
established naming standard.
3.141.8.247