upstream u-boot with additional patches for our devices/boards:
https://lists.denx.de/pipermail/u-boot/2017-March/282789.html (AXP crashes) ;
Gbit ethernet patch for some LIME2 revisions ;
with SPI flash support
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
434 lines
14 KiB
434 lines
14 KiB
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.
|
|
|