Linux Device Drivers (3rd Edition) [Electronic resources] نسخه متنی

اینجــــا یک کتابخانه دیجیتالی است

با بیش از 100000 منبع الکترونیکی رایگان به زبان فارسی ، عربی و انگلیسی

Linux Device Drivers (3rd Edition) [Electronic resources] - نسخه متنی

Jonathan Corbet, Greg Kroah-Hartman, Alessandro Rubini

| نمايش فراداده ، افزودن یک نقد و بررسی
افزودن به کتابخانه شخصی
ارسال به دوستان
جستجو در متن کتاب
بیشتر
تنظیمات قلم

فونت

اندازه قلم

+ - پیش فرض

حالت نمایش

روز نیمروز شب
جستجو در لغت نامه
بیشتر
لیست موضوعات
توضیحات
افزودن یادداشت جدید








17.15. A Few Other Details


This section covers a few other topics that may be of interest to
network driver authors. In each case, we simply try to point you in
the right direction. Obtaining a complete picture of the subject
probably requires spending some time digging through the kernel
source as well.


17.15.1. Media Independent Interface Support




Media
Independent Interface (or MII) is an IEEE 802.3 standard describing
how Ethernet transceivers can interface with network controllers;
many products on the market conform with this interface. If you are
writing a driver for an MII-compliant controller, the kernel exports
a generic MII support layer that may make your life easier.

To use the generic MII layer, you should include
<linux/mii.h>. You need to fill out an
mii_if_info structure with information on the
physical ID of the transceiver, whether full duplex is in effect,
etc. Also required are two methods for the
mii_if_info structure:

int (*mdio_read) (struct net_device *dev, int phy_id, int location);
void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val);

As you might expect, these methods should implement communications
with your specific MII interface.

The generic MII code provides a set of functions for querying and
changing the operating mode of the transceiver; many of these are
designed to work with the ethtool utility
(described in the next section). Look in
<linux/mii.h> and
drivers/net/mii.c for the details.


17.15.2. Ethtool Support


Ethtool


is a utility designed to give system administrators a great deal of
control over the operation of network interfaces. With
ethtool, it is possible to control various
interface parameters including speed, media type, duplex operation,
DMA ring setup, hardware checksumming, wake-on-LAN operation, etc.,
but only if ethtool is supported by the driver.
Ethtool may be downloaded from http://sf.net/projects/gkernel/.

The relevant declarations for ethtool support
may be found in <linux/ethtool.h>. At the
core of it is a structure of type ethtool_ops,
which contains a full 24 different methods for
ethtool support. Most of these methods are
relatively straightforward; see
<linux/ethtool.h> for the details. If your
driver is using the MII layer, you can use
mii_ethtool_gset and
mii_ethtool_sset to implement the
get_settings and
set_settings methods, respectively.

For ethtool to work with your device, you must
place a pointer to your ethtool_ops structure in
the net_device structure. The macro
SET_ETHTOOL_OPS (defined in
<linux/netdevice.h>) should be used for
this purpose. Do note that your ethtool methods
can be called even when the interface is down.


17.15.3. Netpoll


"Netpoll"
is a relatively late (2.6.5) addition to the network stack; its
purpose is to enable the kernel to send and receive packets in
situations where the full network and I/O subsystems may not be
available. It is used for features like remote network consoles and
remote kernel debugging. Supporting netpoll in your driver is not, by
any means, necessary, but it may make your device more useful in some
situations. Supporting netpoll is also relatively easy in most cases.

Drivers implementing netpoll should implement the
poll_controller method. Its job is to keep up
with anything that may be happening on the controller in the absence
of device interrupts. Almost all poll_controller
methods take the following form:

void my_poll_controller(struct net_device *dev)
{
disable_device_interrupts(dev);
call_interrupt_handler(dev->irq, dev, NULL);
reenable_device_interrupts(dev);
}

The
poll_controller

method, in essence, is simply simulating interrupts from the given
device.


    / 202