blob: e2ea8f5a601bca9607859be55b7eb05fa070fd3d [file] [log] [blame]
Marek Vasut3d6885b2012-08-08 01:42:21 +00001The U-Boot Driver Model Project
2===============================
3Net system analysis
4===================
5Marek Vasut <marek.vasut@gmail.com>
62012-03-03
7
8I) Overview
9-----------
10
11The networking subsystem already supports multiple devices. Therefore the
12conversion shall not be very hard.
13
14The network subsystem is operated from net/eth.c, which tracks all registered
15ethernet interfaces and calls their particular functions registered via
16eth_register().
17
18The eth_register() is called from the network driver initialization function,
19which in turn is called most often either from "board_net_init()" or
20"cpu_net_init()". This function has one important argument, which is the
21"struct eth_device", defined at include/net.h:
22
23struct eth_device {
24 /* DRIVER: Name of the device */
25 char name[NAMESIZE];
26 /* DRIVER: MAC address */
27 unsigned char enetaddr[6];
28 /* DRIVER: Register base address */
29 int iobase;
30 /* CORE: state of the device */
31 int state;
32
33 /* DRIVER: Device initialization function */
34 int (*init) (struct eth_device*, bd_t*);
35 /* DRIVER: Function for sending packets */
36 int (*send) (struct eth_device*, volatile void* packet, int length);
37 /* DRIVER: Function for receiving packets */
38 int (*recv) (struct eth_device*);
39 /* DRIVER: Function to cease operation of the device */
40 void (*halt) (struct eth_device*);
41 /* DRIVER: Function to send multicast packet (OPTIONAL) */
42 int (*mcast) (struct eth_device*, u32 ip, u8 set);
43 /* DRIVER: Function to change ethernet MAC address */
44 int (*write_hwaddr) (struct eth_device*);
45 /* CORE: Next device in the linked list of devices managed by net core */
46 struct eth_device *next;
47 /* CORE: Device index */
48 int index;
49 /* DRIVER: Driver's private data */
50 void *priv;
51};
52
53This structure defines the particular driver, though also contains elements that
54should not be exposed to the driver, like core state.
55
56Small, but important part of the networking subsystem is the PHY management
57layer, whose drivers are contained in drivers/net/phy. These drivers register in
58a very similar manner to network drivers, by calling "phy_register()" with the
59argument of "struct phy_driver":
60
61struct phy_driver {
62 /* DRIVER: Name of the PHY driver */
63 char *name;
64 /* DRIVER: UID of the PHY driver */
65 unsigned int uid;
66 /* DRIVER: Mask for UID of the PHY driver */
67 unsigned int mask;
68 /* DRIVER: MMDS of the PHY driver */
69 unsigned int mmds;
70 /* DRIVER: Features the PHY driver supports */
71 u32 features;
72 /* DRIVER: Initialize the PHY hardware */
73 int (*probe)(struct phy_device *phydev);
74 /* DRIVER: Reconfigure the PHY hardware */
75 int (*config)(struct phy_device *phydev);
76 /* DRIVER: Turn on the PHY hardware, allow it to send/receive */
77 int (*startup)(struct phy_device *phydev);
78 /* DRIVER: Turn off the PHY hardware */
79 int (*shutdown)(struct phy_device *phydev);
80 /* CORE: Allows this driver to be part of list of drivers */
81 struct list_head list;
82};
83
84II) Approach
85------------
86
87To convert the elements of network subsystem to proper driver model method, the
88"struct eth_device" will have to be split into multiple components. The first
89will be a structure defining the driver operations:
90
91struct eth_driver_ops {
92 int (*init)(struct instance*, bd_t*);
93 int (*send)(struct instance*, void *packet, int length);
94 int (*recv)(struct instance*);
95 void (*halt)(struct instance*);
96 int (*mcast)(struct instance*, u32 ip, u8 set);
97 int (*write_hwaddr)(struct instance*);
98};
99
100Next, there'll be platform data which will be per-driver and will replace the
101"priv" part of "struct eth_device". Last part will be the per-device core state.
102
103With regards to the PHY part of the API, the "struct phy_driver" is almost ready
104to be used with the new driver model approach. The only change will be the
105replacement of per-driver initialization functions and removal of
106"phy_register()" function in favor or driver model approach.
107
108III) Analysis of in-tree drivers
109--------------------------------
110
111 1) drivers/net/4xx_enet.c
112 -------------------------
113
114 This driver uses the standard new networking API, therefore there should be no
115 obstacles throughout the conversion process.
116
117 2) drivers/net/altera_tse.c
118 ---------------------------
119
120 This driver uses the standard new networking API, therefore there should be no
121 obstacles throughout the conversion process.
122
123 3) drivers/net/armada100_fec.c
124 ------------------------------
125
126 This driver uses the standard new networking API, therefore there should be no
127 obstacles throughout the conversion process.
128
129 4) drivers/net/at91_emac.c
130 --------------------------
131
132 This driver uses the standard new networking API, therefore there should be no
133 obstacles throughout the conversion process.
134
135 5) drivers/net/ax88180.c
136 ------------------------
137
138 This driver uses the standard new networking API, therefore there should be no
139 obstacles throughout the conversion process.
140
141 6) drivers/net/ax88796.c
142 ------------------------
143
144 This file contains a components of the NE2000 driver, implementing only
145 different parts on the NE2000 clone AX88796. This being no standalone driver,
146 no conversion will be done here.
147
148 7) drivers/net/bfin_mac.c
149 -------------------------
150
151 This driver uses the standard new networking API, therefore there should be no
152 obstacles throughout the conversion process.
153
154 8) drivers/net/calxedaxgmac.c
155 -----------------------------
156
157 This driver uses the standard new networking API, therefore there should be no
158 obstacles throughout the conversion process.
159
160 9) drivers/net/cs8900.c
161 -----------------------
162
163 This driver uses the standard new networking API, therefore there should be no
164 obstacles throughout the conversion process.
165
166 10) drivers/net/davinci_emac.c
167 ------------------------------
168
169 This driver uses the standard new networking API, therefore there should be no
170 obstacles throughout the conversion process.
171
172 11) drivers/net/dc2114x.c
173 -------------------------
174
175 This driver uses the standard new networking API, therefore there should be no
176 obstacles throughout the conversion process.
177
178 12) drivers/net/designware.c
179 ----------------------------
180
181 This driver uses the standard new networking API, therefore there should be no
182 obstacles throughout the conversion process.
183
184 13) drivers/net/dm9000x.c
185 -------------------------
186
187 This driver uses the standard new networking API, therefore there should be no
188 obstacles throughout the conversion process.
189
190 14) drivers/net/dnet.c
191 ----------------------
192
193 This driver uses the standard new networking API, therefore there should be no
194 obstacles throughout the conversion process.
195
196 15) drivers/net/e1000.c
197 -----------------------
198
199 This driver uses the standard new networking API, therefore there should be no
200 obstacles throughout the conversion process.
201
202 16) drivers/net/e1000_spi.c
203 ---------------------------
204
205 Driver for the SPI bus integrated on the Intel E1000. This is not part of the
206 network stack.
207
208 17) drivers/net/eepro100.c
209 --------------------------
210
211 This driver uses the standard new networking API, therefore there should be no
212 obstacles throughout the conversion process.
213
214 18) drivers/net/enc28j60.c
215 --------------------------
216
217 This driver uses the standard new networking API, therefore there should be no
218 obstacles throughout the conversion process.
219
220 19) drivers/net/ep93xx_eth.c
221 ----------------------------
222
223 This driver uses the standard new networking API, therefore there should be no
224 obstacles throughout the conversion process.
225
226 20) drivers/net/ethoc.c
227 -----------------------
228
229 This driver uses the standard new networking API, therefore there should be no
230 obstacles throughout the conversion process.
231
232 21) drivers/net/fec_mxc.c
233 -------------------------
234
235 This driver uses the standard new networking API, therefore there should be no
236 obstacles throughout the conversion process.
237
238 22) drivers/net/fsl_mcdmafec.c
239 ------------------------------
240
241 This driver uses the standard new networking API, therefore there should be no
242 obstacles throughout the conversion process.
243
244 23) drivers/net/fsl_mdio.c
245 --------------------------
246
247 This file contains driver for FSL MDIO interface, which is not part of the
248 networking stack.
249
250 24) drivers/net/ftgmac100.c
251 ---------------------------
252
253 This driver uses the standard new networking API, therefore there should be no
254 obstacles throughout the conversion process.
255
256 25) drivers/net/ftmac100.c
257 --------------------------
258
259 This driver uses the standard new networking API, therefore there should be no
260 obstacles throughout the conversion process.
261
262 26) drivers/net/greth.c
263 -----------------------
264
265 This driver uses the standard new networking API, therefore there should be no
266 obstacles throughout the conversion process.
267
268 27) drivers/net/inca-ip_sw.c
269 ----------------------------
270
271 This driver uses the standard new networking API, therefore there should be no
272 obstacles throughout the conversion process.
273
274 28) drivers/net/ks8695eth.c
275 ---------------------------
276
277 This driver uses the standard new networking API, therefore there should be no
278 obstacles throughout the conversion process.
279
280 29) drivers/net/lan91c96.c
281 --------------------------
282
283 This driver uses the standard new networking API, therefore there should be no
284 obstacles throughout the conversion process.
285
286 30) drivers/net/macb.c
287 ----------------------
288
289 This driver uses the standard new networking API, therefore there should be no
290 obstacles throughout the conversion process.
291
292 31) drivers/net/mcffec.c
293 ------------------------
294
295 This driver uses the standard new networking API, therefore there should be no
296 obstacles throughout the conversion process.
297
298 32) drivers/net/mcfmii.c
299 ------------------------
300
301 This file contains MII interface driver for MCF FEC.
302
303 33) drivers/net/mpc512x_fec.c
304 -----------------------------
305
306 This driver uses the standard new networking API, therefore there should be no
307 obstacles throughout the conversion process.
308
309 34) drivers/net/mpc5xxx_fec.c
310 -----------------------------
311
312 This driver uses the standard new networking API, therefore there should be no
313 obstacles throughout the conversion process.
314
315 35) drivers/net/mvgbe.c
316 -----------------------
317
318 This driver uses the standard new networking API, therefore there should be no
319 obstacles throughout the conversion process.
320
321 36) drivers/net/natsemi.c
322 -------------------------
323
324 This driver uses the standard new networking API, therefore there should be no
325 obstacles throughout the conversion process.
326
327 37) drivers/net/ne2000_base.c
328 -----------------------------
329
330 This driver uses the standard new networking API, therefore there should be no
331 obstacles throughout the conversion process. This driver contains the core
332 implementation of NE2000, which needs a few external functions, implemented by
333 AX88796, NE2000 etc.
334
335 38) drivers/net/ne2000.c
336 ------------------------
337
338 This file implements external functions necessary for native NE2000 compatible
339 networking card to work.
340
341 39) drivers/net/netarm_eth.c
342 ----------------------------
343
344 This driver uses the old, legacy, network API and will either have to be
345 converted or removed.
346
347 40) drivers/net/netconsole.c
348 ----------------------------
349
350 This is actually an STDIO driver.
351
352 41) drivers/net/ns8382x.c
353 -------------------------
354
355 This driver uses the standard new networking API, therefore there should be no
356 obstacles throughout the conversion process.
357
358 42) drivers/net/pcnet.c
359 -----------------------
360
361 This driver uses the standard new networking API, therefore there should be no
362 obstacles throughout the conversion process.
363
364 43) drivers/net/plb2800_eth.c
365 -----------------------------
366
367 This driver uses the standard new networking API, therefore there should be no
368 obstacles throughout the conversion process.
369
370 44) drivers/net/rtl8139.c
371 -------------------------
372
373 This driver uses the standard new networking API, therefore there should be no
374 obstacles throughout the conversion process.
375
376 45) drivers/net/rtl8169.c
377 -------------------------
378
379 This driver uses the standard new networking API, therefore there should be no
380 obstacles throughout the conversion process.
381
382 46) drivers/net/sh_eth.c
383 ------------------------
384
385 This driver uses the standard new networking API, therefore there should be no
386 obstacles throughout the conversion process.
387
388 47) drivers/net/smc91111.c
389 --------------------------
390
391 This driver uses the standard new networking API, therefore there should be no
392 obstacles throughout the conversion process.
393
394 48) drivers/net/smc911x.c
395 -------------------------
396
397 This driver uses the standard new networking API, therefore there should be no
398 obstacles throughout the conversion process.
399
400 49) drivers/net/tsec.c
401 ----------------------
402
403 This driver uses the standard new networking API, therefore there should be no
404 obstacles throughout the conversion process.
405
406 50) drivers/net/tsi108_eth.c
407 ----------------------------
408
409 This driver uses the standard new networking API, therefore there should be no
410 obstacles throughout the conversion process.
411
412 51) drivers/net/uli526x.c
413 -------------------------
414
415 This driver uses the standard new networking API, therefore there should be no
416 obstacles throughout the conversion process.
417
418 52) drivers/net/vsc7385.c
419 -------------------------
420
421 This is a driver that only uploads firmware to a switch. This is not subject
422 of conversion.
423
424 53) drivers/net/xilinx_axi_emac.c
425 ---------------------------------
426
427 This driver uses the standard new networking API, therefore there should be no
428 obstacles throughout the conversion process.
429
430 54) drivers/net/xilinx_emaclite.c
431 ---------------------------------
432
433 This driver uses the standard new networking API, therefore there should be no
434 obstacles throughout the conversion process.