mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 02:15:45 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			435 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			435 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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.
 |