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 ...

Get Linux Device Drivers now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.