167 lines
5 KiB
Text
167 lines
5 KiB
Text
DM9000 Network driver
|
|
=====================
|
|
|
|
Copyright 2008 Simtec Electronics,
|
|
Ben Dooks <ben@simtec.co.uk> <ben-linux@fluff.org>
|
|
|
|
|
|
Introduction
|
|
------------
|
|
|
|
This file describes how to use the DM9000 platform-device based network driver
|
|
that is contained in the files drivers/net/dm9000.c and drivers/net/dm9000.h.
|
|
|
|
The driver supports three DM9000 variants, the DM9000E which is the first chip
|
|
supported as well as the newer DM9000A and DM9000B devices. It is currently
|
|
maintained and tested by Ben Dooks, who should be CC: to any patches for this
|
|
driver.
|
|
|
|
|
|
Defining the platform device
|
|
----------------------------
|
|
|
|
The minimum set of resources attached to the platform device are as follows:
|
|
|
|
1) The physical address of the address register
|
|
2) The physical address of the data register
|
|
3) The IRQ line the device's interrupt pin is connected to.
|
|
|
|
These resources should be specified in that order, as the ordering of the
|
|
two address regions is important (the driver expects these to be address
|
|
and then data).
|
|
|
|
An example from arch/arm/mach-s3c2410/mach-bast.c is:
|
|
|
|
static struct resource bast_dm9k_resource[] = {
|
|
[0] = {
|
|
.start = S3C2410_CS5 + BAST_PA_DM9000,
|
|
.end = S3C2410_CS5 + BAST_PA_DM9000 + 3,
|
|
.flags = IORESOURCE_MEM,
|
|
},
|
|
[1] = {
|
|
.start = S3C2410_CS5 + BAST_PA_DM9000 + 0x40,
|
|
.end = S3C2410_CS5 + BAST_PA_DM9000 + 0x40 + 0x3f,
|
|
.flags = IORESOURCE_MEM,
|
|
},
|
|
[2] = {
|
|
.start = IRQ_DM9000,
|
|
.end = IRQ_DM9000,
|
|
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
|
|
}
|
|
};
|
|
|
|
static struct platform_device bast_device_dm9k = {
|
|
.name = "dm9000",
|
|
.id = 0,
|
|
.num_resources = ARRAY_SIZE(bast_dm9k_resource),
|
|
.resource = bast_dm9k_resource,
|
|
};
|
|
|
|
Note the setting of the IRQ trigger flag in bast_dm9k_resource[2].flags,
|
|
as this will generate a warning if it is not present. The trigger from
|
|
the flags field will be passed to request_irq() when registering the IRQ
|
|
handler to ensure that the IRQ is setup correctly.
|
|
|
|
This shows a typical platform device, without the optional configuration
|
|
platform data supplied. The next example uses the same resources, but adds
|
|
the optional platform data to pass extra configuration data:
|
|
|
|
static struct dm9000_plat_data bast_dm9k_platdata = {
|
|
.flags = DM9000_PLATF_16BITONLY,
|
|
};
|
|
|
|
static struct platform_device bast_device_dm9k = {
|
|
.name = "dm9000",
|
|
.id = 0,
|
|
.num_resources = ARRAY_SIZE(bast_dm9k_resource),
|
|
.resource = bast_dm9k_resource,
|
|
.dev = {
|
|
.platform_data = &bast_dm9k_platdata,
|
|
}
|
|
};
|
|
|
|
The platform data is defined in include/linux/dm9000.h and described below.
|
|
|
|
|
|
Platform data
|
|
-------------
|
|
|
|
Extra platform data for the DM9000 can describe the IO bus width to the
|
|
device, whether or not an external PHY is attached to the device and
|
|
the availability of an external configuration EEPROM.
|
|
|
|
The flags for the platform data .flags field are as follows:
|
|
|
|
DM9000_PLATF_8BITONLY
|
|
|
|
The IO should be done with 8bit operations.
|
|
|
|
DM9000_PLATF_16BITONLY
|
|
|
|
The IO should be done with 16bit operations.
|
|
|
|
DM9000_PLATF_32BITONLY
|
|
|
|
The IO should be done with 32bit operations.
|
|
|
|
DM9000_PLATF_EXT_PHY
|
|
|
|
The chip is connected to an external PHY.
|
|
|
|
DM9000_PLATF_NO_EEPROM
|
|
|
|
This can be used to signify that the board does not have an
|
|
EEPROM, or that the EEPROM should be hidden from the user.
|
|
|
|
DM9000_PLATF_SIMPLE_PHY
|
|
|
|
Switch to using the simpler PHY polling method which does not
|
|
try and read the MII PHY state regularly. This is only available
|
|
when using the internal PHY. See the section on link state polling
|
|
for more information.
|
|
|
|
The config symbol DM9000_FORCE_SIMPLE_PHY_POLL, Kconfig entry
|
|
"Force simple NSR based PHY polling" allows this flag to be
|
|
forced on at build time.
|
|
|
|
|
|
PHY Link state polling
|
|
----------------------
|
|
|
|
The driver keeps track of the link state and informs the network core
|
|
about link (carrier) availability. This is managed by several methods
|
|
depending on the version of the chip and on which PHY is being used.
|
|
|
|
For the internal PHY, the original (and currently default) method is
|
|
to read the MII state, either when the status changes if we have the
|
|
necessary interrupt support in the chip or every two seconds via a
|
|
periodic timer.
|
|
|
|
To reduce the overhead for the internal PHY, there is now the option
|
|
of using the DM9000_FORCE_SIMPLE_PHY_POLL config, or DM9000_PLATF_SIMPLE_PHY
|
|
platform data option to read the summary information without the
|
|
expensive MII accesses. This method is faster, but does not print
|
|
as much information.
|
|
|
|
When using an external PHY, the driver currently has to poll the MII
|
|
link status as there is no method for getting an interrupt on link change.
|
|
|
|
|
|
DM9000A / DM9000B
|
|
-----------------
|
|
|
|
These chips are functionally similar to the DM9000E and are supported easily
|
|
by the same driver. The features are:
|
|
|
|
1) Interrupt on internal PHY state change. This means that the periodic
|
|
polling of the PHY status may be disabled on these devices when using
|
|
the internal PHY.
|
|
|
|
2) TCP/UDP checksum offloading, which the driver does not currently support.
|
|
|
|
|
|
ethtool
|
|
-------
|
|
|
|
The driver supports the ethtool interface for access to the driver
|
|
state information, the PHY state and the EEPROM.
|