Thursday, October 22, 2009

Section 8.4.  Skeleton of NIC Registration and Unregistration










8.4. Skeleton of NIC Registration and Unregistration






















Figure 8-1(a) shows the generic scheme for an NIC's device driver to register with the networking code. Figure 8-1(b) shows the complementary action that takes place for unregistration. Although the example shows a PCI Ethernet NIC, the scheme is the same for other device types; only the name of the routine that takes care of it, or the way that routine is invoked, may change depending on how the bus code is implemented.



Figure 8-1. (a) Device registration model; (b) device unregistration model



The function starts by allocating
the net_device structure with alloc_etherdev. alloc_etherdev also initializes all the parameters that are common to all Ethernet devices. The driver then initializes another portion of the net_device structure, and concludes the device registration with a call to the register_netdev routine.


Note that:


  • The driver calls the appropriate wrapper around alloc_netdev (alloc_etherdev in the example), and provides only the size of its private data block. A few wrappers are listed in Table 8-1.

  • The wrapper calls alloc_netdev using the parameter provided by the driver, and adds the other two (the device name and the initialization routine).

  • The size of the memory block allocated by alloc_netdev includes the net_device structure, the driver's private block, and some padding to force an alignment. See Figure 8-2 later in the chapter.

  • Some drivers call neTDev_boot_setup_check to check whether the user provided any boot-time parameter when loading the kernel. See the section "Use of Boot Options to Configure Network Devices" in Chapter 7.

  • The new net_device instance is inserted into the device database with register_netdevice (see the later section "Device Registration"). Incidentally, I use the term database here, and in other parts of the book, to refer loosely to a combination of data structures that provides convenient access to information on the terms the kernel needs.


The unregistration of a device, shown in its simple form in Figure 8-1(b), always includes a call to unregister_netdevice and free_netdev. The call to free_netdev is sometimes made explicitly, and sometimes indirectly via the dev->destructor function,[*] as shown later in Figure 8-4. The device driver also needs to release any resources used by the device (IRQ, memory mappings, etc.), but we are not interested in those details in this chapter.

[*] The device drivers of only a few virtual devices use this approach (see, for example, net/8021q/vlan.c). The two calls in Figure 8-4 are mutually exclusive.












No comments:

Post a Comment