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