2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2001,2002 Free Software Foundation, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 /* Based on "src/config.c" in etherboot-5.0.5. */
23 * This program is free software; you can redistribute it and/or
24 * modify it under the terms of the GNU General Public License as
25 * published by the Free Software Foundation; either version 2, or (at
26 * your option) any later version.
30 #include <etherboot.h>
34 #if defined(INCLUDE_NS8390) || defined(INCLUDE_EEPRO100) || defined(INCLUDE_LANCE) || defined(INCLUDE_EPIC100) || defined(INCLUDE_TULIP) || defined(INCLUDE_OTULIP) || defined(INCLUDE_3C90X) || defined(INCLUDE_3C595) || defined(INCLUDE_RTL8139) || defined(INCLUDE_VIA_RHINE) || defined(INCLUDE_W89C840) || defined(INCLUDE_DAVICOM) || defined(INCLUDE_SIS900) || defined(INCLUDE_NATSEMI) || defined(INCLUDE_TLAN)
38 static unsigned short pci_ioaddrs
[16];
40 static struct pci_device pci_nic_list
[] =
43 { PCI_VENDOR_ID_REALTEK
, PCI_DEVICE_ID_REALTEK_8029
,
44 "Realtek 8029", 0, 0, 0, 0},
45 { PCI_VENDOR_ID_WINBOND2
, PCI_DEVICE_ID_WINBOND2_89C940
,
46 "Winbond NE2000-PCI", 0, 0, 0, 0},
47 { PCI_VENDOR_ID_COMPEX
, PCI_DEVICE_ID_COMPEX_RL2000
,
48 "Compex ReadyLink 2000", 0, 0, 0, 0},
49 { PCI_VENDOR_ID_KTI
, PCI_DEVICE_ID_KTI_ET32P2
,
50 "KTI ET32P2", 0, 0, 0, 0},
51 { PCI_VENDOR_ID_NETVIN
, PCI_DEVICE_ID_NETVIN_NV5000SC
,
52 "NetVin NV5000SC", 0, 0, 0, 0},
53 { PCI_VENDOR_ID_HOLTEK
, PCI_DEVICE_ID_HOLTEK_HT80232
,
54 "Holtek HT80232", 0, 0, 0, 0},
57 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C900TPO
,
58 "3Com900-TPO", 0, 0, 0, 0},
59 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C900COMBO
,
60 "3Com900-Combo", 0, 0, 0, 0},
61 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C905TX
,
62 "3Com905-TX", 0, 0, 0, 0},
63 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C905T4
,
64 "3Com905-T4", 0, 0, 0, 0},
65 { PCI_VENDOR_ID_3COM
, 0x9004,
66 "3Com900B-TPO", 0, 0, 0, 0},
67 { PCI_VENDOR_ID_3COM
, 0x9005,
68 "3Com900B-Combo", 0, 0, 0, 0},
69 { PCI_VENDOR_ID_3COM
, 0x9006,
70 "3Com900B-2/T", 0, 0, 0, 0},
71 { PCI_VENDOR_ID_3COM
, 0x900A,
72 "3Com900B-FL", 0, 0, 0, 0},
73 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C905B_TX
,
74 "3Com905B-TX", 0, 0, 0, 0},
75 { PCI_VENDOR_ID_3COM
, 0x9056,
76 "3Com905B-T4", 0, 0, 0, 0},
77 { PCI_VENDOR_ID_3COM
, 0x905A,
78 "3Com905B-FL", 0, 0, 0, 0},
79 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C905C_TXM
,
80 "3Com905C-TXM", 0, 0, 0, 0},
81 { PCI_VENDOR_ID_3COM
, 0x9800,
82 "3Com980-Cyclone", 0, 0, 0, 0},
83 { PCI_VENDOR_ID_3COM
, 0x9805,
84 "3Com9805", 0, 0, 0, 0},
85 { PCI_VENDOR_ID_3COM
, 0x7646,
86 "3CSOHO100-TX", 0, 0, 0, 0},
89 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C590
,
90 "3Com590", 0, 0, 0, 0},
91 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C595
,
92 "3Com595", 0, 0, 0, 0},
93 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C595_1
,
94 "3Com595", 0, 0, 0, 0},
95 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C595_2
,
96 "3Com595", 0, 0, 0, 0},
97 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C900TPO
,
98 "3Com900-TPO", 0, 0, 0, 0},
99 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C900COMBO
,
100 "3Com900-Combo", 0, 0, 0, 0},
101 { PCI_VENDOR_ID_3COM
, 0x9004,
102 "3Com900B-TPO", 0, 0, 0, 0},
103 { PCI_VENDOR_ID_3COM
, 0x9005,
104 "3Com900B-Combo", 0, 0, 0, 0},
105 { PCI_VENDOR_ID_3COM
, 0x9006,
106 "3Com900B-2/T", 0, 0, 0, 0},
107 { PCI_VENDOR_ID_3COM
, 0x900A,
108 "3Com900B-FL", 0, 0, 0, 0},
109 { PCI_VENDOR_ID_3COM
, 0x9800,
110 "3Com980-Cyclone", 0, 0, 0, 0},
111 { PCI_VENDOR_ID_3COM
, 0x9805,
112 "3Com9805", 0, 0, 0, 0},
113 { PCI_VENDOR_ID_3COM
, 0x7646,
114 "3CSOHO100-TX", 0, 0, 0, 0},
116 #ifdef INCLUDE_EEPRO100
117 { PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82557
,
118 "Intel EtherExpressPro100", 0, 0, 0, 0},
119 { PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82559ER
,
120 "Intel EtherExpressPro100 82559ER", 0, 0, 0, 0},
121 { PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_ID1029
,
122 "Intel EtherExpressPro100 ID1029", 0, 0, 0, 0},
123 { PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_ID1030
,
124 "Intel Corporation 82559 InBusiness 10/100", 0, 0, 0, 0},
125 { PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82562
,
126 "Intel EtherExpressPro100 82562EM", 0, 0, 0, 0},
128 #ifdef INCLUDE_EPIC100
129 { PCI_VENDOR_ID_SMC
, PCI_DEVICE_ID_SMC_EPIC100
,
130 "SMC EtherPowerII", 0, 0, 0, 0},
133 { PCI_VENDOR_ID_AMD
, PCI_DEVICE_ID_AMD_LANCE
,
134 "AMD Lance/PCI", 0, 0, 0, 0},
135 { PCI_VENDOR_ID_AMD_HOMEPNA
, PCI_DEVICE_ID_AMD_HOMEPNA
,
136 "AMD Lance/HomePNA", 0, 0, 0, 0},
138 #ifdef INCLUDE_RTL8139
139 { PCI_VENDOR_ID_REALTEK
, PCI_DEVICE_ID_REALTEK_8139
,
140 "Realtek 8139", 0, 0, 0, 0},
141 { PCI_VENDOR_ID_DLINK
, PCI_DEVICE_ID_DFE530TXP
,
142 "DFE530TX+/DFE538TX", 0, 0, 0, 0},
143 { PCI_VENDOR_ID_SMC_1211
, PCI_DEVICE_ID_SMC_1211
,
144 "SMC EZ10/100", 0, 0, 0, 0},
146 #ifdef INCLUDE_OTULIP
147 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP
,
148 "Digital Tulip", 0, 0, 0, 0},
149 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP_FAST
,
150 "Digital Tulip Fast", 0, 0, 0, 0},
151 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP_PLUS
,
152 "Digital Tulip+", 0, 0, 0, 0},
153 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_21142
,
154 "Digital Tulip 21142", 0, 0, 0, 0},
157 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP
,
158 "Digital Tulip", 0, 0, 0, 0},
159 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP_FAST
,
160 "Digital Tulip Fast", 0, 0, 0, 0},
161 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP_PLUS
,
162 "Digital Tulip+", 0, 0, 0, 0},
163 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_21142
,
164 "Digital Tulip 21142", 0, 0, 0, 0},
165 { PCI_VENDOR_ID_MACRONIX
, PCI_DEVICE_ID_MX987x5
,
166 "Macronix MX987x5", 0, 0, 0, 0},
167 { PCI_VENDOR_ID_LINKSYS
, PCI_DEVICE_ID_LC82C115
,
168 "LinkSys LNE100TX", 0, 0, 0, 0},
169 { PCI_VENDOR_ID_LINKSYS
, PCI_DEVICE_ID_DEC_TULIP
,
170 "Netgear FA310TX", 0, 0, 0, 0},
171 { PCI_VENDOR_ID_DAVICOM
, PCI_DEVICE_ID_DM9102
,
172 "Davicom 9102", 0, 0, 0, 0},
173 { PCI_VENDOR_ID_DAVICOM
, PCI_DEVICE_ID_DM9009
,
174 "Davicom 9009", 0, 0, 0, 0},
175 { PCI_VENDOR_ID_ADMTEK
, PCI_DEVICE_ID_ADMTEK_0985
,
176 "ADMtek Centaur-P", 0, 0, 0, 0},
177 { PCI_VENDOR_ID_ADMTEK
, 0x0981,
178 "ADMtek AN981 Comet", 0, 0, 0, 0},
180 "ASIX AX88140", 0, 0, 0, 0 },
182 "Compex RL100-TX", 0, 0, 0, 0 },
184 #ifdef INCLUDE_DAVICOM
185 { PCI_VENDOR_ID_DAVICOM
, PCI_DEVICE_ID_DM9102
,
186 "Davicom 9102", 0, 0, 0, 0},
187 { PCI_VENDOR_ID_DAVICOM
, PCI_DEVICE_ID_DM9009
,
188 "Davicom 9009", 0, 0, 0, 0},
190 #ifdef INCLUDE_VIA_RHINE
191 { PCI_VENDOR_ID_VIATEC
, PCI_DEVICE_ID_VIA_VT6102
,
192 "VIA 6102", 0, 0, 0, 0},
193 { PCI_VENDOR_ID_VIATEC
, PCI_DEVICE_ID_VIA_RHINE_I
,
194 "VIA 3043", 0, 0, 0, 0},
195 { PCI_VENDOR_ID_VIATEC
, PCI_DEVICE_ID_VIA_86C100A
,
196 "VIA 86C100A", 0, 0, 0, 0},
198 #ifdef INCLUDE_W89C840
199 { PCI_VENDOR_ID_WINBOND2
, PCI_DEVICE_ID_WINBOND2_89C840
,
200 "Winbond W89C840F", 0, 0, 0, 0},
201 { PCI_VENDOR_ID_COMPEX
, PCI_DEVICE_ID_COMPEX_RL100ATX
,
202 "Compex RL100ATX", 0, 0, 0, 0},
204 #ifdef INCLUDE_SIS900
205 { PCI_VENDOR_ID_SIS
, PCI_DEVICE_ID_SIS900
,
206 "SIS900", 0, 0, 0, 0},
207 { PCI_VENDOR_ID_SIS
, PCI_DEVICE_ID_SIS7016
,
208 "SIS7016", 0, 0, 0, 0},
211 #ifdef INCLUDE_NATSEMI
212 { PCI_VENDOR_ID_NS
, PCI_DEVICE_ID_DP83815
,
213 "DP83815", 0, 0, 0, 0},
217 { PCI_VENDOR_ID_OLICOM
, PCI_DEVICE_ID_OLICOM_OC2326
,
218 "OC2326", 0, 0, 0, 0},
221 /* other PCI NICs go here */
222 {0, 0, NULL
, 0, 0, 0, 0}
224 #endif /* INCLUDE_*PCI */
229 struct pci_dispatch_table
231 unsigned short vendor
;
232 unsigned short dev_id
;
233 struct nic
*(*eth_probe
) (struct nic
*, unsigned short *,
234 struct pci_device
*);
237 static struct pci_dispatch_table PCI_NIC
[] =
239 # ifdef INCLUDE_NS8390
240 { PCI_VENDOR_ID_REALTEK
, PCI_DEVICE_ID_REALTEK_8029
, nepci_probe
},
241 { PCI_VENDOR_ID_WINBOND2
, PCI_DEVICE_ID_WINBOND2_89C940
, nepci_probe
},
242 { PCI_VENDOR_ID_COMPEX
, PCI_DEVICE_ID_COMPEX_RL2000
, nepci_probe
},
243 { PCI_VENDOR_ID_KTI
, PCI_DEVICE_ID_KTI_ET32P2
, nepci_probe
},
244 { PCI_VENDOR_ID_NETVIN
, PCI_DEVICE_ID_NETVIN_NV5000SC
, nepci_probe
},
245 { PCI_VENDOR_ID_HOLTEK
, PCI_DEVICE_ID_HOLTEK_HT80232
, nepci_probe
},
246 # endif /* INCLUDE_NS8390 */
247 # ifdef INCLUDE_3C90X
248 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C900TPO
, a3c90x_probe
},
249 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C900COMBO
, a3c90x_probe
},
250 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C905TX
, a3c90x_probe
},
251 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C905T4
, a3c90x_probe
},
252 { PCI_VENDOR_ID_3COM
, 0x9004, a3c90x_probe
},
253 { PCI_VENDOR_ID_3COM
, 0x9005, a3c90x_probe
},
254 { PCI_VENDOR_ID_3COM
, 0x9006, a3c90x_probe
},
255 { PCI_VENDOR_ID_3COM
, 0x900A, a3c90x_probe
},
256 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C905B_TX
, a3c90x_probe
},
257 { PCI_VENDOR_ID_3COM
, 0x9056, a3c90x_probe
},
258 { PCI_VENDOR_ID_3COM
, 0x905A, a3c90x_probe
},
259 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C905C_TXM
, a3c90x_probe
},
260 { PCI_VENDOR_ID_3COM
, 0x9800, a3c90x_probe
},
261 { PCI_VENDOR_ID_3COM
, 0x9805, a3c90x_probe
},
262 { PCI_VENDOR_ID_3COM
, 0x7646, a3c90x_probe
},
263 # endif /* INCLUDE_3C90X */
264 # ifdef INCLUDE_3C595
265 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C590
, t595_probe
},
266 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C595
, t595_probe
},
267 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C595_1
, t595_probe
},
268 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C595_2
, t595_probe
},
269 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C900TPO
, t595_probe
},
270 { PCI_VENDOR_ID_3COM
, PCI_DEVICE_ID_3COM_3C900COMBO
, t595_probe
},
271 { PCI_VENDOR_ID_3COM
, 0x9004, t595_probe
},
272 { PCI_VENDOR_ID_3COM
, 0x9005, t595_probe
},
273 { PCI_VENDOR_ID_3COM
, 0x9006, t595_probe
},
274 { PCI_VENDOR_ID_3COM
, 0x900A, t595_probe
},
275 { PCI_VENDOR_ID_3COM
, 0x9800, t595_probe
},
276 { PCI_VENDOR_ID_3COM
, 0x9805, t595_probe
},
277 { PCI_VENDOR_ID_3COM
, 0x7646, t595_probe
},
278 # endif /* INCLUDE_3C595 */
279 # ifdef INCLUDE_EEPRO100
280 { PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82557
, eepro100_probe
},
281 { PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82559ER
, eepro100_probe
},
282 { PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_ID1029
, eepro100_probe
},
283 { PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_ID1030
, eepro100_probe
},
284 { PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82562
, eepro100_probe
},
285 # endif /* INCLUDE_EEPRO100 */
286 # ifdef INCLUDE_EPIC100
287 { PCI_VENDOR_ID_SMC
, PCI_DEVICE_ID_SMC_EPIC100
, epic100_probe
},
288 # endif /* INCLUDE_EPIC100 */
289 # ifdef INCLUDE_LANCE
290 { PCI_VENDOR_ID_AMD
, PCI_DEVICE_ID_AMD_LANCE
, lancepci_probe
},
291 { PCI_VENDOR_ID_AMD_HOMEPNA
, PCI_DEVICE_ID_AMD_HOMEPNA
, lancepci_probe
},
292 # endif /* INCLUDE_LANCE */
293 # ifdef INCLUDE_RTL8139
294 { PCI_VENDOR_ID_REALTEK
, PCI_DEVICE_ID_REALTEK_8139
, rtl8139_probe
},
295 { PCI_VENDOR_ID_DLINK
, PCI_DEVICE_ID_DFE530TXP
, rtl8139_probe
},
296 { PCI_VENDOR_ID_SMC_1211
, PCI_DEVICE_ID_SMC_1211
, rtl8139_probe
},
297 # endif /* INCLUDE_RTL8139 */
298 # ifdef INCLUDE_OTULIP
299 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP
, otulip_probe
},
300 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP_FAST
, otulip_probe
},
301 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP_PLUS
, otulip_probe
},
302 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_21142
, otulip_probe
},
303 # endif /* INCLUDE_OTULIP */
304 # ifdef INCLUDE_TULIP
305 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP
, tulip_probe
},
306 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP_FAST
, tulip_probe
},
307 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_TULIP_PLUS
, tulip_probe
},
308 { PCI_VENDOR_ID_DEC
, PCI_DEVICE_ID_DEC_21142
, tulip_probe
},
309 { PCI_VENDOR_ID_MACRONIX
, PCI_DEVICE_ID_MX987x5
, tulip_probe
},
310 { PCI_VENDOR_ID_LINKSYS
, PCI_DEVICE_ID_LC82C115
, tulip_probe
},
311 { PCI_VENDOR_ID_LINKSYS
, PCI_DEVICE_ID_DEC_TULIP
, tulip_probe
},
312 { PCI_VENDOR_ID_DAVICOM
, PCI_DEVICE_ID_DM9102
, tulip_probe
},
313 { PCI_VENDOR_ID_DAVICOM
, PCI_DEVICE_ID_DM9009
, tulip_probe
},
314 { PCI_VENDOR_ID_ADMTEK
, PCI_DEVICE_ID_ADMTEK_0985
, tulip_probe
},
315 { PCI_VENDOR_ID_ADMTEK
, 0x0981, tulip_probe
},
316 { 0x125B, 0x1400, tulip_probe
},
317 { 0x11F6, 0x9881, tulip_probe
},
318 # endif /* INCLUDE_TULIP */
319 # ifdef INCLUDE_DAVICOM
320 { PCI_VENDOR_ID_DAVICOM
, PCI_DEVICE_ID_DM9102
, davicom_probe
},
321 { PCI_VENDOR_ID_DAVICOM
, PCI_DEVICE_ID_DM9009
, davicom_probe
},
322 # endif /* INCLUDE_DAVICOM */
323 # ifdef INCLUDE_VIA_RHINE
324 { PCI_VENDOR_ID_VIATEC
, PCI_DEVICE_ID_VIA_VT6102
, rhine_probe
},
325 { PCI_VENDOR_ID_VIATEC
, PCI_DEVICE_ID_VIA_RHINE_I
, rhine_probe
},
326 { PCI_VENDOR_ID_VIATEC
, PCI_DEVICE_ID_VIA_86C100A
, rhine_probe
},
327 # endif /* INCLUDE_VIA_RHINE */
328 # ifdef INCLUDE_W89C840
329 { PCI_VENDOR_ID_WINBOND2
, PCI_DEVICE_ID_WINBOND2_89C840
, w89c840_probe
},
330 { PCI_VENDOR_ID_COMPEX
, PCI_DEVICE_ID_COMPEX_RL100ATX
, w89c840_probe
},
331 # endif /* INCLUDE_W89C840 */
332 # ifdef INCLUDE_SIS900
333 { PCI_VENDOR_ID_SIS
, PCI_DEVICE_ID_SIS900
, sis900_probe
},
334 { PCI_VENDOR_ID_SIS
, PCI_DEVICE_ID_SIS7016
, sis900_probe
},
335 # endif /* INCLUDE_SIS900 */
336 # ifdef INCLUDE_NATSEMI
337 { PCI_VENDOR_ID_NS
, PCI_DEVICE_ID_DP83815
, natsemi_probe
},
338 # endif /* INCLUDE_NATSEMI */
340 { PCI_VENDOR_ID_OLICOM
, PCI_DEVICE_ID_OLICOM_OC2326
, tlan_probe
},
341 # endif /* INCLUDE_TLAN */
344 #endif /* GRUB && INCLUDE_PCI */
346 struct dispatch_table
348 const char *nic_name
;
350 struct nic
*(*eth_probe
) (struct nic
*, unsigned short *,
351 struct pci_device
*);
353 struct nic
*(*eth_probe
) (struct nic
*, unsigned short *);
354 #endif /* INCLUDE_PCI */
355 unsigned short *probe_ioaddrs
; /* for probe overrides */
359 * NIC probing is in order of appearance in this table.
360 * If for some reason you want to change the order,
361 * just rearrange the entries (bracketed by the #ifdef/#endif)
363 static struct dispatch_table NIC
[] =
365 #ifdef INCLUDE_RTL8139
366 { "RTL8139", rtl8139_probe
, pci_ioaddrs
},
368 #ifdef INCLUDE_SIS900
369 { "SIS900", sis900_probe
, pci_ioaddrs
},
371 #ifdef INCLUDE_NATSEMI
372 { "NATSEMI", natsemi_probe
, pci_ioaddrs
},
375 { "WD", wd_probe
, 0 },
378 { "3C503", t503_probe
, 0 },
381 { "NE*000", ne_probe
, 0 },
384 { "3C5x9", t509_probe
, 0 },
387 { "3C5x9", t529_probe
, 0 },
390 { "3C595", t595_probe
, pci_ioaddrs
},
393 { "3C90X", a3c90x_probe
, pci_ioaddrs
},
396 { "EEPRO", eepro_probe
, 0 },
398 #ifdef INCLUDE_EEPRO100
399 { "EEPRO100", eepro100_probe
, pci_ioaddrs
},
401 #ifdef INCLUDE_EPIC100
402 { "EPIC100", epic100_probe
, pci_ioaddrs
},
404 #ifdef INCLUDE_OTULIP
405 { "OTulip", otulip_probe
, pci_ioaddrs
},
408 { "Tulip", tulip_probe
, pci_ioaddrs
},
410 #ifdef INCLUDE_DAVICOM
411 { "DAVICOM", davicom_probe
, pci_ioaddrs
},
413 #ifdef INCLUDE_CS89X0
414 { "CS89x0", cs89x0_probe
, 0 },
416 #ifdef INCLUDE_NE2100
417 { "NE2100", ne2100_probe
, 0 },
419 #ifdef INCLUDE_NI6510
420 { "NI6510", ni6510_probe
, 0 },
422 #ifdef INCLUDE_SK_G16
423 { "SK_G16", SK_probe
, 0 },
426 { "3C507", t507_probe
, 0 },
428 #ifdef INCLUDE_NI5010
429 { "NI5010", ni5010_probe
, 0 },
431 #ifdef INCLUDE_NI5210
432 { "NI5210", ni5210_probe
, 0 },
434 #ifdef INCLUDE_EXOS205
435 { "EXOS205", exos205_probe
, 0 },
437 #ifdef INCLUDE_SMC9000
438 { "SMC9000", smc9000_probe
, 0 },
441 { "TIARA", tiara_probe
, 0 },
444 { "DEPCA", depca_probe
, 0 },
446 #ifdef INCLUDE_NS8390
447 { "NE2000/PCI", nepci_probe
, pci_ioaddrs
},
450 { "LANCE/PCI", lancepci_probe
, pci_ioaddrs
},
452 #ifdef INCLUDE_VIA_RHINE
453 { "VIA 86C100", rhine_probe
, pci_ioaddrs
},
455 #ifdef INCLUDE_W89C840
456 { "W89C840F", w89c840_probe
, pci_ioaddrs
},
459 { "Olicom 2326", tlan_probe
, pci_ioaddrs
},
461 /* this entry must always be last to mark the end of list */
465 #define NIC_TABLE_SIZE (sizeof (NIC) / sizeof (NIC[0]))
468 eth_dummy (struct nic
*dummy
)
473 static char packet
[ETH_FRAME_LEN
];
477 (void (*) (struct nic
*)) eth_dummy
, /* reset */
478 eth_dummy
, /* poll */
479 (void (*) (struct nic
*, const char *,
480 unsigned int, unsigned int,
481 const char *)) eth_dummy
, /* transmit */
482 (void (*) (struct nic
*)) eth_dummy
, /* disable */
489 arptable
[ARP_CLIENT
].node
, /* node_addr */
504 struct pci_device
*p
;
505 const struct dispatch_table
*t
;
506 static int probed
= 0;
508 /* If already probed, don't try to probe it any longer. */
512 /* Clear the ready flag. */
514 /* Clear the ARP table. */
515 grub_memset ((char *) arptable
, 0,
516 MAX_ARP
* sizeof (struct arptable_t
));
521 /* In GRUB, the ROM info is initialized here. */
522 rom
= *((struct rom_info
*) ROM_INFO_LOCATION
);
524 eth_pci_init(pci_nic_list
);
527 /* at this point we have a list of possible PCI candidates
528 we just pick the first one with a non-zero ioaddr */
529 for (p
= pci_nic_list
; p
->vendor
!= 0; ++p
)
533 pci_ioaddrs
[0] = p
->ioaddr
;
539 etherboot_printf("Probing...");
544 struct pci_dispatch_table
*pt
;
546 for (pt
= PCI_NIC
; pt
->eth_probe
!= 0; pt
++)
547 if (p
->vendor
== pt
->vendor
&& p
->dev_id
== pt
->dev_id
)
549 etherboot_printf ("[%s]", p
->name
);
550 if ((pt
->eth_probe
) (&nic
, pci_ioaddrs
, p
))
557 #endif /* INCLUDE_PCI */
559 for (t
= NIC
; t
->nic_name
!= 0; ++t
)
561 etherboot_printf("[%s]", t
->nic_name
);
563 if ((*t
->eth_probe
) (&nic
, t
->probe_ioaddrs
, p
))
569 if ((*t
->eth_probe
) (&nic
, t
->probe_ioaddrs
))
574 #endif /* INCLUDE_PCI */
583 return ((*nic
.poll
) (&nic
));
587 eth_transmit (const char *d
, unsigned int t
, unsigned int s
, const void *p
)
589 (*nic
.transmit
) (&nic
, d
, t
, s
, p
);
597 (*nic
.disable
) (&nic
);