Space.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:19k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * INET An implementation of the TCP/IP protocol suite for the LINUX
  3.  * operating system.  INET is implemented using the  BSD Socket
  4.  * interface as the means of communication with the user level.
  5.  *
  6.  * Holds initial configuration information for devices.
  7.  *
  8.  * Version: @(#)Space.c 1.0.7 08/12/93
  9.  *
  10.  * Authors: Ross Biro, <bir7@leland.Stanford.Edu>
  11.  * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  12.  * Donald J. Becker, <becker@scyld.com>
  13.  *
  14.  * Changelog:
  15.  * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 09/1999
  16.  * - fix sbni: s/device/net_device/
  17.  * Paul Gortmaker (06/98): 
  18.  *  - sort probes in a sane way, make sure all (safe) probes
  19.  *    get run once & failed autoprobes don't autoprobe again.
  20.  *
  21.  * FIXME:
  22.  * Phase out placeholder dev entries put in the linked list
  23.  * here in favour of drivers using init_etherdev(NULL, ...)
  24.  * combined with a single find_all_devs() function (for 2.3)
  25.  *
  26.  * This program is free software; you can redistribute it and/or
  27.  * modify it under the terms of the GNU General Public License
  28.  * as published by the Free Software Foundation; either version
  29.  * 2 of the License, or (at your option) any later version.
  30.  */
  31. #include <linux/config.h>
  32. #include <linux/netdevice.h>
  33. #include <linux/errno.h>
  34. #include <linux/init.h>
  35. #include <linux/netlink.h>
  36. #include <linux/divert.h>
  37. #define NEXT_DEV NULL
  38. /* A unified ethernet device probe.  This is the easiest way to have every
  39.    ethernet adaptor have the name "eth[0123...]".
  40.    */
  41. extern int ne2_probe(struct net_device *dev);
  42. extern int hp100_probe(struct net_device *dev);
  43. extern int ultra_probe(struct net_device *dev);
  44. extern int ultra32_probe(struct net_device *dev);
  45. extern int ultramca_probe(struct net_device *dev);
  46. extern int wd_probe(struct net_device *dev);
  47. extern int el2_probe(struct net_device *dev);
  48. extern int ne_probe(struct net_device *dev);
  49. extern int hp_probe(struct net_device *dev);
  50. extern int hp_plus_probe(struct net_device *dev);
  51. extern int znet_probe(struct net_device *);
  52. extern int express_probe(struct net_device *);
  53. extern int eepro_probe(struct net_device *);
  54. extern int el3_probe(struct net_device *);
  55. extern int at1500_probe(struct net_device *);
  56. extern int at1700_probe(struct net_device *);
  57. extern int fmv18x_probe(struct net_device *);
  58. extern int eth16i_probe(struct net_device *);
  59. extern int depca_probe(struct net_device *);
  60. extern int i82596_probe(struct net_device *);
  61. extern int ewrk3_probe(struct net_device *);
  62. extern int de4x5_probe(struct net_device *);
  63. extern int el1_probe(struct net_device *);
  64. extern int wavelan_probe(struct net_device *);
  65. extern int arlan_probe(struct net_device *);
  66. extern int el16_probe(struct net_device *);
  67. extern int elmc_probe(struct net_device *);
  68. extern int skmca_probe(struct net_device *);
  69. extern int elplus_probe(struct net_device *);
  70. extern int ac3200_probe(struct net_device *);
  71. extern int es_probe(struct net_device *);
  72. extern int lne390_probe(struct net_device *);
  73. extern int ne3210_probe(struct net_device *);
  74. extern int e2100_probe(struct net_device *);
  75. extern int ni5010_probe(struct net_device *);
  76. extern int ni52_probe(struct net_device *);
  77. extern int ni65_probe(struct net_device *);
  78. extern int sonic_probe(struct net_device *);
  79. extern int SK_init(struct net_device *);
  80. extern int seeq8005_probe(struct net_device *);
  81. extern int smc_init( struct net_device * );
  82. extern int sgiseeq_probe(struct net_device *);
  83. extern int atarilance_probe(struct net_device *);
  84. extern int sun3lance_probe(struct net_device *);
  85. extern int apne_probe(struct net_device *);
  86. extern int bionet_probe(struct net_device *);
  87. extern int pamsnet_probe(struct net_device *);
  88. extern int cs89x0_probe(struct net_device *dev);
  89. extern int ethertap_probe(struct net_device *dev);
  90. extern int hplance_probe(struct net_device *dev);
  91. extern int bagetlance_probe(struct net_device *);
  92. extern int mvme147lance_probe(struct net_device *dev);
  93. extern int tc515_probe(struct net_device *dev);
  94. extern int lance_probe(struct net_device *dev);
  95. extern int mace68k_probe(struct net_device *dev);
  96. extern int macsonic_probe(struct net_device *dev);
  97. extern int mac8390_probe(struct net_device *dev);
  98. extern int mac89x0_probe(struct net_device *dev);
  99. extern int mc32_probe(struct net_device *dev);
  100.   
  101. /* Detachable devices ("pocket adaptors") */
  102. extern int de600_probe(struct net_device *);
  103. extern int de620_probe(struct net_device *);
  104. /* FDDI adapters */
  105. extern int skfp_probe(struct net_device *dev);
  106. /* Fibre Channel adapters */
  107. extern int iph5526_probe(struct net_device *dev);
  108. /* SBNI adapters */
  109. extern int sbni_probe(struct net_device *);
  110. struct devprobe
  111. {
  112. int (*probe)(struct net_device *dev);
  113. int status; /* non-zero if autoprobe has failed */
  114. };
  115. /*
  116.  * probe_list walks a list of probe functions and calls each so long
  117.  * as a non-zero ioaddr is given, or as long as it hasn't already failed 
  118.  * to find a card in the past (as recorded by "status") when asked to
  119.  * autoprobe (i.e. a probe that fails to find a card when autoprobing
  120.  * will not be asked to autoprobe again).  It exits when a card is found.
  121.  */
  122. static int __init probe_list(struct net_device *dev, struct devprobe *plist)
  123. {
  124. struct devprobe *p = plist;
  125. unsigned long base_addr = dev->base_addr;
  126. #ifdef CONFIG_NET_DIVERT
  127. int ret;
  128. #endif /* CONFIG_NET_DIVERT */
  129. while (p->probe != NULL) {
  130. if (base_addr && p->probe(dev) == 0) { /* probe given addr */
  131. #ifdef CONFIG_NET_DIVERT
  132. ret = alloc_divert_blk(dev);
  133. if (ret)
  134. return ret;
  135. #endif /* CONFIG_NET_DIVERT */
  136. return 0;
  137. } else if (p->status == 0) { /* has autoprobe failed yet? */
  138. p->status = p->probe(dev); /* no, try autoprobe */
  139. if (p->status == 0) {
  140. #ifdef CONFIG_NET_DIVERT
  141. ret = alloc_divert_blk(dev);
  142. if (ret)
  143. return ret;
  144. #endif /* CONFIG_NET_DIVERT */
  145. return 0;
  146. }
  147. }
  148. p++;
  149. }
  150. return -ENODEV;
  151. }
  152. /*
  153.  * This is a bit of an artificial separation as there are PCI drivers
  154.  * that also probe for EISA cards (in the PCI group) and there are ISA
  155.  * drivers that probe for EISA cards (in the ISA group).  These are the
  156.  * EISA only driver probes, and also the legacy PCI probes
  157.  */
  158. static struct devprobe eisa_probes[] __initdata = {
  159. #ifdef CONFIG_DE4X5             /* DEC DE425, DE434, DE435 adapters */
  160. {de4x5_probe, 0},
  161. #endif
  162. #ifdef CONFIG_ULTRA32 
  163. {ultra32_probe, 0},
  164. #endif
  165. #ifdef CONFIG_AC3200
  166. {ac3200_probe, 0},
  167. #endif
  168. #ifdef CONFIG_ES3210
  169. {es_probe, 0},
  170. #endif
  171. #ifdef CONFIG_LNE390
  172. {lne390_probe, 0},
  173. #endif
  174. #ifdef CONFIG_NE3210
  175. {ne3210_probe, 0},
  176. #endif
  177. {NULL, 0},
  178. };
  179. static struct devprobe mca_probes[] __initdata = {
  180. #ifdef CONFIG_ULTRAMCA 
  181. {ultramca_probe, 0},
  182. #endif
  183. #ifdef CONFIG_NE2_MCA
  184. {ne2_probe, 0},
  185. #endif
  186. #ifdef CONFIG_ELMC /* 3c523 */
  187. {elmc_probe, 0},
  188. #endif
  189. #ifdef CONFIG_ELMC_II /* 3c527 */
  190. {mc32_probe, 0},
  191. #endif
  192. #ifdef CONFIG_SKMC              /* SKnet Microchannel */
  193.         {skmca_probe, 0},
  194. #endif
  195. {NULL, 0},
  196. };
  197. /*
  198.  * ISA probes that touch addresses < 0x400 (including those that also
  199.  * look for EISA/PCI/MCA cards in addition to ISA cards).
  200.  */
  201. static struct devprobe isa_probes[] __initdata = {
  202. #ifdef CONFIG_EL3 /* ISA, EISA, MCA 3c5x9 */
  203. {el3_probe, 0},
  204. #endif
  205. #ifdef CONFIG_HP100  /* ISA, EISA & PCI */
  206. {hp100_probe, 0},
  207. #endif
  208. #ifdef CONFIG_3C515
  209. {tc515_probe, 0},
  210. #endif
  211. #ifdef CONFIG_ULTRA 
  212. {ultra_probe, 0},
  213. #endif
  214. #ifdef CONFIG_WD80x3 
  215. {wd_probe, 0},
  216. #endif
  217. #ifdef CONFIG_EL2  /* 3c503 */
  218. {el2_probe, 0},
  219. #endif
  220. #ifdef CONFIG_HPLAN
  221. {hp_probe, 0},
  222. #endif
  223. #ifdef CONFIG_HPLAN_PLUS
  224. {hp_plus_probe, 0},
  225. #endif
  226. #ifdef CONFIG_E2100 /* Cabletron E21xx series. */
  227. {e2100_probe, 0},
  228. #endif
  229. #ifdef CONFIG_NE2000 /* ISA (use ne2k-pci for PCI cards) */
  230. {ne_probe, 0},
  231. #endif
  232. #ifdef CONFIG_LANCE /* ISA/VLB (use pcnet32 for PCI cards) */
  233. {lance_probe, 0},
  234. #endif
  235. #ifdef CONFIG_SMC9194
  236. {smc_init, 0},
  237. #endif
  238. #ifdef CONFIG_SEEQ8005 
  239. {seeq8005_probe, 0},
  240. #endif
  241. #ifdef CONFIG_AT1500
  242. {at1500_probe, 0},
  243. #endif
  244. #if defined(CONFIG_CS89x0) || defined(CONFIG_CERF_CS8900A)
  245.   {cs89x0_probe, 0},
  246. #endif
  247. #ifdef CONFIG_AT1700
  248. {at1700_probe, 0},
  249. #endif
  250. #ifdef CONFIG_FMV18X /* Fujitsu FMV-181/182 */
  251. {fmv18x_probe, 0},
  252. #endif
  253. #ifdef CONFIG_ETH16I
  254. {eth16i_probe, 0}, /* ICL EtherTeam 16i/32 */
  255. #endif
  256. #ifdef CONFIG_ZNET /* Zenith Z-Note and some IBM Thinkpads. */
  257. {znet_probe, 0},
  258. #endif
  259. #ifdef CONFIG_EEXPRESS /* Intel EtherExpress */
  260. {express_probe, 0},
  261. #endif
  262. #ifdef CONFIG_EEXPRESS_PRO /* Intel EtherExpress Pro/10 */
  263. {eepro_probe, 0},
  264. #endif
  265. #ifdef CONFIG_DEPCA /* DEC DEPCA */
  266. {depca_probe, 0},
  267. #endif
  268. #ifdef CONFIG_EWRK3             /* DEC EtherWORKS 3 */
  269.      {ewrk3_probe, 0},
  270. #endif
  271. #if defined(CONFIG_APRICOT) || defined(CONFIG_MVME16x_NET) || defined(CONFIG_BVME6000_NET) /* Intel I82596 */
  272. {i82596_probe, 0},
  273. #endif
  274. #ifdef CONFIG_EL1 /* 3c501 */
  275. {el1_probe, 0},
  276. #endif
  277. #ifdef CONFIG_WAVELAN /* WaveLAN */
  278. {wavelan_probe, 0},
  279. #endif
  280. #ifdef CONFIG_ARLAN /* Aironet */
  281. {arlan_probe, 0},
  282. #endif
  283. #ifdef CONFIG_EL16 /* 3c507 */
  284. {el16_probe, 0},
  285. #endif
  286. #ifdef CONFIG_ELPLUS /* 3c505 */
  287. {elplus_probe, 0},
  288. #endif
  289. #ifdef CONFIG_SK_G16
  290. {SK_init, 0},
  291. #endif
  292. #ifdef CONFIG_NI5010
  293. {ni5010_probe, 0},
  294. #endif
  295. #ifdef CONFIG_NI52
  296. {ni52_probe, 0},
  297. #endif
  298. #ifdef CONFIG_NI65
  299. {ni65_probe, 0},
  300. #endif
  301. {NULL, 0},
  302. };
  303. static struct devprobe parport_probes[] __initdata = {
  304. #ifdef CONFIG_DE600 /* D-Link DE-600 adapter */
  305. {de600_probe, 0},
  306. #endif
  307. #ifdef CONFIG_DE620 /* D-Link DE-620 adapter */
  308. {de620_probe, 0},
  309. #endif
  310. {NULL, 0},
  311. };
  312. static struct devprobe m68k_probes[] __initdata = {
  313. #ifdef CONFIG_ATARILANCE /* Lance-based Atari ethernet boards */
  314. {atarilance_probe, 0},
  315. #endif
  316. #ifdef CONFIG_SUN3LANCE         /* sun3 onboard Lance chip */
  317. {sun3lance_probe, 0},
  318. #endif
  319. #ifdef CONFIG_APNE /* A1200 PCMCIA NE2000 */
  320. {apne_probe, 0},
  321. #endif
  322. #ifdef CONFIG_ATARI_BIONET /* Atari Bionet Ethernet board */
  323. {bionet_probe, 0},
  324. #endif
  325. #ifdef CONFIG_ATARI_PAMSNET /* Atari PAMsNet Ethernet board */
  326. {pamsnet_probe, 0},
  327. #endif
  328. #ifdef CONFIG_HPLANCE /* HP300 internal Ethernet */
  329. {hplance_probe, 0},
  330. #endif
  331. #ifdef CONFIG_MVME147_NET /* MVME147 internal Ethernet */
  332. {mvme147lance_probe, 0},
  333. #endif
  334. #ifdef CONFIG_MACMACE /* Mac 68k Quadra AV builtin Ethernet */
  335. {mace68k_probe, 0},
  336. #endif
  337. #ifdef CONFIG_MACSONIC /* Mac SONIC-based Ethernet of all sorts */ 
  338. {macsonic_probe, 0},
  339. #endif
  340. #ifdef CONFIG_MAC8390           /* NuBus NS8390-based cards */
  341. {mac8390_probe, 0},
  342. #endif
  343. #ifdef CONFIG_MAC89x0
  344.   {mac89x0_probe, 0},
  345. #endif
  346. {NULL, 0},
  347. };
  348. static struct devprobe sgi_probes[] __initdata = {
  349. #ifdef CONFIG_SGISEEQ
  350. {sgiseeq_probe, 0},
  351. #endif
  352. {NULL, 0},
  353. };
  354. static struct devprobe mips_probes[] __initdata = {
  355. #ifdef CONFIG_MIPS_JAZZ_SONIC
  356. {sonic_probe, 0},
  357. #endif
  358. #ifdef CONFIG_BAGETLANCE        /* Lance-based Baget ethernet boards */
  359.         {bagetlance_probe, 0},
  360. #endif
  361. {NULL, 0},
  362. };
  363. /*
  364.  * Unified ethernet device probe, segmented per architecture and
  365.  * per bus interface. This drives the legacy devices only for now.
  366.  */
  367.  
  368. static int __init ethif_probe(struct net_device *dev)
  369. {
  370. unsigned long base_addr = dev->base_addr;
  371. /* 
  372.  * Backwards compatibility - historically an I/O base of 1 was 
  373.  * used to indicate not to probe for this ethN interface 
  374.  */
  375. if (base_addr == 1)
  376. return 1; /* ENXIO */
  377. /* 
  378.  * The arch specific probes are 1st so that any on-board ethernet
  379.  * will be probed before other ISA/EISA/MCA/PCI bus cards.
  380.  */
  381. if (probe_list(dev, m68k_probes) == 0)
  382. return 0;
  383. if (probe_list(dev, mips_probes) == 0)
  384. return 0;
  385. if (probe_list(dev, sgi_probes) == 0)
  386. return 0;
  387. if (probe_list(dev, eisa_probes) == 0)
  388. return 0;
  389. if (probe_list(dev, mca_probes) == 0)
  390. return 0;
  391.         /*
  392.          * Backwards compatibility - an I/O of 0xffe0 was used to indicate
  393.          * that we shouldn't do a bunch of potentially risky ISA probes
  394.          * for ethN (N>1).  Since the widespread use of modules, *nobody*
  395.          * compiles a kernel with all the ISA drivers built in anymore,
  396.          * and so we should delete this check in linux 2.3 - Paul G.
  397.          */
  398. if (base_addr != 0xffe0 && probe_list(dev, isa_probes) == 0) 
  399. return 0;
  400. if (probe_list(dev, parport_probes) == 0)
  401. return 0;
  402. return -ENODEV;
  403. }
  404. #ifdef CONFIG_FDDI
  405. static int __init fddiif_probe(struct net_device *dev)
  406. {
  407.     unsigned long base_addr = dev->base_addr;
  408.     if (base_addr == 1)
  409.     return 1; /* ENXIO */
  410.     if (1
  411. #ifdef CONFIG_APFDDI
  412. && apfddi_init(dev)
  413. #endif
  414. #ifdef CONFIG_SKFP
  415. && skfp_probe(dev)
  416. #endif
  417. && 1 ) {
  418.     return 1; /* -ENODEV or -EAGAIN would be more accurate. */
  419.     }
  420.     return 0;
  421. }
  422. #endif
  423. #ifdef CONFIG_NET_FC
  424. static int fcif_probe(struct net_device *dev)
  425. {
  426. if (dev->base_addr == -1)
  427. return 1;
  428. if (1
  429. #ifdef CONFIG_IPHASE5526
  430.     && iph5526_probe(dev)
  431. #endif
  432.     && 1 ) {
  433. return 1; /* -ENODEV or -EAGAIN would be more accurate. */
  434. }
  435. return 0;
  436. }
  437. #endif  /* CONFIG_NET_FC */
  438. #ifdef CONFIG_ETHERTAP
  439.     static struct net_device tap0_dev = { "tap0", 0, 0, 0, 0, NETLINK_TAPBASE, 0, 0, 0, 0, NEXT_DEV, ethertap_probe, };
  440. #   undef NEXT_DEV
  441. #   define NEXT_DEV (&tap0_dev)
  442. #endif
  443. #ifdef CONFIG_SDLA
  444.     extern int sdla_init(struct net_device *);
  445.     static struct net_device sdla0_dev = { "sdla0", 0, 0, 0, 0, 0, 0, 0, 0, 0, NEXT_DEV, sdla_init, };
  446. #   undef NEXT_DEV
  447. #   define NEXT_DEV (&sdla0_dev)
  448. #endif
  449. #if defined(CONFIG_LTPC)
  450.     extern int ltpc_probe(struct net_device *);
  451.     static struct net_device dev_ltpc = {
  452.         "lt0",
  453.                 0, 0, 0, 0,
  454.                 0x0, 0,
  455.                 0, 0, 0, NEXT_DEV, ltpc_probe };
  456. #   undef NEXT_DEV
  457. #   define NEXT_DEV (&dev_ltpc)
  458. #endif  /* LTPC */
  459. #if defined(CONFIG_COPS)
  460.     extern int cops_probe(struct net_device *);
  461.     static struct net_device cops2_dev = { "lt2", 0, 0, 0, 0, 0x0, 0, 0, 0, 0, NEXT_DEV, cops_probe };
  462.     static struct net_device cops1_dev = { "lt1", 0, 0, 0, 0, 0x0, 0, 0, 0, 0, &cops2_dev, cops_probe };
  463.     static struct net_device cops0_dev = { "lt0", 0, 0, 0, 0, 0x0, 0, 0, 0, 0, &cops1_dev, cops_probe };
  464. #   undef NEXT_DEV
  465. #   define NEXT_DEV     (&cops0_dev)
  466. #endif  /* COPS */
  467. /* The first device defaults to I/O base '0', which means autoprobe. */
  468. #ifndef ETH0_ADDR
  469. # define ETH0_ADDR 0
  470. #endif
  471. #ifndef ETH0_IRQ
  472. # define ETH0_IRQ 0
  473. #endif
  474. /* "eth0" defaults to autoprobe (== 0), other use a base of 0xffe0 (== -0x20),
  475.    which means "don't do ISA probes".  Distributions don't ship kernels with
  476.    all ISA drivers compiled in anymore, so its probably no longer an issue. */
  477. #define ETH_NOPROBE_ADDR 0xffe0
  478. static struct net_device eth7_dev = {
  479.     "eth%d", 0,0,0,0,ETH_NOPROBE_ADDR /* I/O base*/, 0,0,0,0, NEXT_DEV, ethif_probe };
  480. static struct net_device eth6_dev = {
  481.     "eth%d", 0,0,0,0,ETH_NOPROBE_ADDR /* I/O base*/, 0,0,0,0, &eth7_dev, ethif_probe };
  482. static struct net_device eth5_dev = {
  483.     "eth%d", 0,0,0,0,ETH_NOPROBE_ADDR /* I/O base*/, 0,0,0,0, &eth6_dev, ethif_probe };
  484. static struct net_device eth4_dev = {
  485.     "eth%d", 0,0,0,0,ETH_NOPROBE_ADDR /* I/O base*/, 0,0,0,0, &eth5_dev, ethif_probe };
  486. static struct net_device eth3_dev = {
  487.     "eth%d", 0,0,0,0,ETH_NOPROBE_ADDR /* I/O base*/, 0,0,0,0, &eth4_dev, ethif_probe };
  488. static struct net_device eth2_dev = {
  489.     "eth%d", 0,0,0,0,ETH_NOPROBE_ADDR /* I/O base*/, 0,0,0,0, &eth3_dev, ethif_probe };
  490. static struct net_device eth1_dev = {
  491.     "eth%d", 0,0,0,0,ETH_NOPROBE_ADDR /* I/O base*/, 0,0,0,0, &eth2_dev, ethif_probe };
  492. static struct net_device eth0_dev = {
  493.     "eth%d", 0, 0, 0, 0, ETH0_ADDR, ETH0_IRQ, 0, 0, 0, &eth1_dev, ethif_probe };
  494. #   undef NEXT_DEV
  495. #   define NEXT_DEV (&eth0_dev)
  496. #ifdef CONFIG_TR
  497. /* Token-ring device probe */
  498. extern int ibmtr_probe(struct net_device *);
  499. extern int smctr_probe(struct net_device *);
  500. static int
  501. trif_probe(struct net_device *dev)
  502. {
  503.     if (1
  504. #ifdef CONFIG_IBMTR
  505. && ibmtr_probe(dev)
  506. #endif
  507. #ifdef CONFIG_SMCTR
  508. && smctr_probe(dev)
  509. #endif
  510. && 1 ) {
  511. return 1; /* -ENODEV or -EAGAIN would be more accurate. */
  512.     }
  513.     return 0;
  514. }
  515. static struct net_device tr7_dev = {
  516.     "tr%d",0,0,0,0,0,0,0,0,0, NEXT_DEV, trif_probe };
  517. static struct net_device tr6_dev = {
  518.     "tr%d",0,0,0,0,0,0,0,0,0, &tr7_dev, trif_probe };
  519. static struct net_device tr5_dev = {
  520.     "tr%d",0,0,0,0,0,0,0,0,0, &tr6_dev, trif_probe };
  521. static struct net_device tr4_dev = {
  522.     "tr%d",0,0,0,0,0,0,0,0,0, &tr5_dev, trif_probe };
  523. static struct net_device tr3_dev = {
  524.     "tr%d",0,0,0,0,0,0,0,0,0, &tr4_dev, trif_probe };
  525. static struct net_device tr2_dev = {
  526.     "tr%d",0,0,0,0,0,0,0,0,0, &tr3_dev, trif_probe };
  527. static struct net_device tr1_dev = {
  528.     "tr%d",0,0,0,0,0,0,0,0,0, &tr2_dev, trif_probe };
  529. static struct net_device tr0_dev = {
  530.     "tr%d",0,0,0,0,0,0,0,0,0, &tr1_dev, trif_probe };
  531. #   undef       NEXT_DEV
  532. #   define      NEXT_DEV        (&tr0_dev)
  533. #endif 
  534. #ifdef CONFIG_FDDI
  535. static struct net_device fddi7_dev =
  536. {"fddi7", 0, 0, 0, 0, 0, 0, 0, 0, 0, NEXT_DEV, fddiif_probe};
  537. static struct net_device fddi6_dev =
  538. {"fddi6", 0, 0, 0, 0, 0, 0, 0, 0, 0, &fddi7_dev, fddiif_probe};
  539. static struct net_device fddi5_dev =
  540. {"fddi5", 0, 0, 0, 0, 0, 0, 0, 0, 0, &fddi6_dev, fddiif_probe};
  541. static struct net_device fddi4_dev =
  542. {"fddi4", 0, 0, 0, 0, 0, 0, 0, 0, 0, &fddi5_dev, fddiif_probe};
  543. static struct net_device fddi3_dev =
  544. {"fddi3", 0, 0, 0, 0, 0, 0, 0, 0, 0, &fddi4_dev, fddiif_probe};
  545. static struct net_device fddi2_dev =
  546. {"fddi2", 0, 0, 0, 0, 0, 0, 0, 0, 0, &fddi3_dev, fddiif_probe};
  547. static struct net_device fddi1_dev =
  548. {"fddi1", 0, 0, 0, 0, 0, 0, 0, 0, 0, &fddi2_dev, fddiif_probe};
  549. static struct net_device fddi0_dev =
  550. {"fddi0", 0, 0, 0, 0, 0, 0, 0, 0, 0, &fddi1_dev, fddiif_probe};
  551. #undef NEXT_DEV
  552. #define NEXT_DEV (&fddi0_dev)
  553. #endif 
  554. #ifdef CONFIG_NET_FC
  555.     static struct net_device fc1_dev = {
  556.         "fc1", 0, 0, 0, 0, 0, 0, 0, 0, 0, NEXT_DEV, fcif_probe};
  557. static struct net_device fc0_dev = {
  558. "fc0", 0, 0, 0, 0, 0, 0, 0, 0, 0, &fc1_dev, fcif_probe};
  559. #   undef       NEXT_DEV
  560. #   define      NEXT_DEV        (&fc0_dev)
  561. #endif
  562. #ifdef CONFIG_SBNI
  563. static struct net_device sbni7_dev =
  564. {"sbni7", 0, 0, 0, 0, 0, 0, 0, 0, 0, NEXT_DEV, sbni_probe};
  565. static struct net_device sbni6_dev =
  566. {"sbni6", 0, 0, 0, 0, 0, 0, 0, 0, 0, &sbni7_dev, sbni_probe};
  567. static struct net_device sbni5_dev =
  568. {"sbni5", 0, 0, 0, 0, 0, 0, 0, 0, 0, &sbni6_dev, sbni_probe};
  569. static struct net_device sbni4_dev =
  570. {"sbni4", 0, 0, 0, 0, 0, 0, 0, 0, 0, &sbni5_dev, sbni_probe};
  571. static struct net_device sbni3_dev =
  572. {"sbni3", 0, 0, 0, 0, 0, 0, 0, 0, 0, &sbni4_dev, sbni_probe};
  573. static struct net_device sbni2_dev =
  574. {"sbni2", 0, 0, 0, 0, 0, 0, 0, 0, 0, &sbni3_dev, sbni_probe};
  575. static struct net_device sbni1_dev =
  576. {"sbni1", 0, 0, 0, 0, 0, 0, 0, 0, 0, &sbni2_dev, sbni_probe};
  577. static struct net_device sbni0_dev =
  578. {"sbni0", 0, 0, 0, 0, 0, 0, 0, 0, 0, &sbni1_dev, sbni_probe};
  579. #undef NEXT_DEV
  580. #define NEXT_DEV (&sbni0_dev)
  581. #endif 
  582. /*
  583.  * The loopback device is global so it can be directly referenced
  584.  * by the network code. Also, it must be first on device list.
  585.  */
  586. extern int loopback_init(struct net_device *dev);
  587. struct net_device loopback_dev = 
  588. {"lo", 0, 0, 0, 0, 0, 0, 0, 0, 0, NEXT_DEV, loopback_init};
  589. /*
  590.  * The @dev_base list is protected by @dev_base_lock and the rtln
  591.  * semaphore.
  592.  *
  593.  * Pure readers hold dev_base_lock for reading.
  594.  *
  595.  * Writers must hold the rtnl semaphore while they loop through the
  596.  * dev_base list, and hold dev_base_lock for writing when they do the
  597.  * actual updates.  This allows pure readers to access the list even
  598.  * while a writer is preparing to update it.
  599.  *
  600.  * To put it another way, dev_base_lock is held for writing only to
  601.  * protect against pure readers; the rtnl semaphore provides the
  602.  * protection against other writers.
  603.  *
  604.  * See, for example usages, register_netdevice() and
  605.  * unregister_netdevice(), which must be called with the rtnl
  606.  * semaphore held.
  607.  */
  608. struct net_device *dev_base = &loopback_dev;
  609. rwlock_t dev_base_lock = RW_LOCK_UNLOCKED;