123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 |
- The U-Boot Driver Model Project
- ===============================
- Net system analysis
- ===================
- Marek Vasut <marek.vasut@gmail.com>
- 2012-03-03
- I) Overview
- -----------
- The networking subsystem already supports multiple devices. Therefore the
- conversion shall not be very hard.
- The network subsystem is operated from net/eth.c, which tracks all registered
- ethernet interfaces and calls their particular functions registered via
- eth_register().
- The eth_register() is called from the network driver initialization function,
- which in turn is called most often either from "board_net_init()" or
- "cpu_net_init()". This function has one important argument, which is the
- "struct eth_device", defined at include/net.h:
- struct eth_device {
- /* DRIVER: Name of the device */
- char name[NAMESIZE];
- /* DRIVER: MAC address */
- unsigned char enetaddr[6];
- /* DRIVER: Register base address */
- int iobase;
- /* CORE: state of the device */
- int state;
- /* DRIVER: Device initialization function */
- int (*init) (struct eth_device*, bd_t*);
- /* DRIVER: Function for sending packets */
- int (*send) (struct eth_device*, volatile void* packet, int length);
- /* DRIVER: Function for receiving packets */
- int (*recv) (struct eth_device*);
- /* DRIVER: Function to cease operation of the device */
- void (*halt) (struct eth_device*);
- /* DRIVER: Function to send multicast packet (OPTIONAL) */
- int (*mcast) (struct eth_device*, u32 ip, u8 set);
- /* DRIVER: Function to change ethernet MAC address */
- int (*write_hwaddr) (struct eth_device*);
- /* CORE: Next device in the linked list of devices managed by net core */
- struct eth_device *next;
- /* CORE: Device index */
- int index;
- /* DRIVER: Driver's private data */
- void *priv;
- };
- This structure defines the particular driver, though also contains elements that
- should not be exposed to the driver, like core state.
- Small, but important part of the networking subsystem is the PHY management
- layer, whose drivers are contained in drivers/net/phy. These drivers register in
- a very similar manner to network drivers, by calling "phy_register()" with the
- argument of "struct phy_driver":
- struct phy_driver {
- /* DRIVER: Name of the PHY driver */
- char *name;
- /* DRIVER: UID of the PHY driver */
- unsigned int uid;
- /* DRIVER: Mask for UID of the PHY driver */
- unsigned int mask;
- /* DRIVER: MMDS of the PHY driver */
- unsigned int mmds;
- /* DRIVER: Features the PHY driver supports */
- u32 features;
- /* DRIVER: Initialize the PHY hardware */
- int (*probe)(struct phy_device *phydev);
- /* DRIVER: Reconfigure the PHY hardware */
- int (*config)(struct phy_device *phydev);
- /* DRIVER: Turn on the PHY hardware, allow it to send/receive */
- int (*startup)(struct phy_device *phydev);
- /* DRIVER: Turn off the PHY hardware */
- int (*shutdown)(struct phy_device *phydev);
- /* CORE: Allows this driver to be part of list of drivers */
- struct list_head list;
- };
- II) Approach
- ------------
- To convert the elements of network subsystem to proper driver model method, the
- "struct eth_device" will have to be split into multiple components. The first
- will be a structure defining the driver operations:
- struct eth_driver_ops {
- int (*init)(struct instance*, bd_t*);
- int (*send)(struct instance*, void *packet, int length);
- int (*recv)(struct instance*);
- void (*halt)(struct instance*);
- int (*mcast)(struct instance*, u32 ip, u8 set);
- int (*write_hwaddr)(struct instance*);
- };
- Next, there'll be platform data which will be per-driver and will replace the
- "priv" part of "struct eth_device". Last part will be the per-device core state.
- With regards to the PHY part of the API, the "struct phy_driver" is almost ready
- to be used with the new driver model approach. The only change will be the
- replacement of per-driver initialization functions and removal of
- "phy_register()" function in favor or driver model approach.
- III) Analysis of in-tree drivers
- --------------------------------
- 1) drivers/net/4xx_enet.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 2) drivers/net/altera_tse.c
- ---------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 3) drivers/net/armada100_fec.c
- ------------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 4) drivers/net/at91_emac.c
- --------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 5) drivers/net/ax88180.c
- ------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 6) drivers/net/ax88796.c
- ------------------------
- This file contains a components of the NE2000 driver, implementing only
- different parts on the NE2000 clone AX88796. This being no standalone driver,
- no conversion will be done here.
- 7) drivers/net/bfin_mac.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 8) drivers/net/calxedaxgmac.c
- -----------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 9) drivers/net/cs8900.c
- -----------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 10) drivers/net/davinci_emac.c
- ------------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 11) drivers/net/dc2114x.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 12) drivers/net/designware.c
- ----------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 13) drivers/net/dm9000x.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 14) drivers/net/dnet.c
- ----------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 15) drivers/net/e1000.c
- -----------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 16) drivers/net/e1000_spi.c
- ---------------------------
- Driver for the SPI bus integrated on the Intel E1000. This is not part of the
- network stack.
- 17) drivers/net/eepro100.c
- --------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 18) drivers/net/enc28j60.c
- --------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 19) drivers/net/ep93xx_eth.c
- ----------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 20) drivers/net/ethoc.c
- -----------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 21) drivers/net/fec_mxc.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 22) drivers/net/fsl_mcdmafec.c
- ------------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 23) drivers/net/fsl_mdio.c
- --------------------------
- This file contains driver for FSL MDIO interface, which is not part of the
- networking stack.
- 24) drivers/net/ftgmac100.c
- ---------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 25) drivers/net/ftmac100.c
- --------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 26) drivers/net/greth.c
- -----------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 27) drivers/net/inca-ip_sw.c
- ----------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 28) drivers/net/ks8695eth.c
- ---------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 29) drivers/net/lan91c96.c
- --------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 30) drivers/net/macb.c
- ----------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 31) drivers/net/mcffec.c
- ------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 32) drivers/net/mcfmii.c
- ------------------------
- This file contains MII interface driver for MCF FEC.
- 33) drivers/net/mpc512x_fec.c
- -----------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 34) drivers/net/mpc5xxx_fec.c
- -----------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 35) drivers/net/mvgbe.c
- -----------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 36) drivers/net/natsemi.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 37) drivers/net/ne2000_base.c
- -----------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process. This driver contains the core
- implementation of NE2000, which needs a few external functions, implemented by
- AX88796, NE2000 etc.
- 38) drivers/net/ne2000.c
- ------------------------
- This file implements external functions necessary for native NE2000 compatible
- networking card to work.
- 39) drivers/net/netarm_eth.c
- ----------------------------
- This driver uses the old, legacy, network API and will either have to be
- converted or removed.
- 40) drivers/net/netconsole.c
- ----------------------------
- This is actually an STDIO driver.
- 41) drivers/net/ns8382x.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 42) drivers/net/pcnet.c
- -----------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 43) drivers/net/plb2800_eth.c
- -----------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 44) drivers/net/rtl8139.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 45) drivers/net/rtl8169.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 46) drivers/net/sh_eth.c
- ------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 47) drivers/net/smc91111.c
- --------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 48) drivers/net/smc911x.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 49) drivers/net/tsec.c
- ----------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 50) drivers/net/tsi108_eth.c
- ----------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 51) drivers/net/uli526x.c
- -------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 52) drivers/net/vsc7385.c
- -------------------------
- This is a driver that only uploads firmware to a switch. This is not subject
- of conversion.
- 53) drivers/net/xilinx_axi_emac.c
- ---------------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
- 54) drivers/net/xilinx_emaclite.c
- ---------------------------------
- This driver uses the standard new networking API, therefore there should be no
- obstacles throughout the conversion process.
|