1/*
2 *  GRUB  --  GRand Unified Bootloader
3 *  Copyright (C) 2001,2002  Free Software Foundation, Inc.
4 *
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.
9 *
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.
14 *
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.
18 */
19
20/* Based on "src/config.c" in etherboot-5.0.5.  */
21
22/*
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.
27 */
28
29#define GRUB	1
30#include <etherboot.h>
31#include <nic.h>
32
33#undef	INCLUDE_PCI
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)
35	/* || others later */
36# define INCLUDE_PCI
37# include <pci.h>
38static unsigned short pci_ioaddrs[16];
39
40static struct pci_device pci_nic_list[] =
41{
42#ifdef	INCLUDE_NS8390
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},
55#endif
56#ifdef	INCLUDE_3C90X
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},
87#endif
88#ifdef	INCLUDE_3C595
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},
115#endif
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},
127#endif
128#ifdef	INCLUDE_EPIC100
129  { PCI_VENDOR_ID_SMC,		PCI_DEVICE_ID_SMC_EPIC100,
130    "SMC EtherPowerII", 0, 0, 0, 0},
131#endif
132#ifdef	INCLUDE_LANCE
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},
137#endif
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},
145#endif
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},
155#endif
156#ifdef	INCLUDE_TULIP
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},
179  { 0x125B,			0x1400,
180    "ASIX AX88140", 0, 0, 0, 0 },
181  { 0x11F6,			0x9881,
182    "Compex RL100-TX", 0, 0, 0, 0 },
183#endif
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},
189#endif
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},
197#endif
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},
203#endif
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},
209#endif
210
211#ifdef INCLUDE_NATSEMI
212  { PCI_VENDOR_ID_NS,	     	PCI_DEVICE_ID_DP83815,
213    "DP83815", 0, 0, 0, 0},
214#endif
215
216#ifdef INCLUDE_TLAN
217  { PCI_VENDOR_ID_OLICOM,	PCI_DEVICE_ID_OLICOM_OC2326,
218    "OC2326", 0, 0, 0, 0},
219#endif
220
221  /* other PCI NICs go here */
222  {0, 0, NULL, 0, 0, 0, 0}
223};
224#endif	/* INCLUDE_*PCI */
225
226#include <cards.h>
227
228#ifdef INCLUDE_PCI
229struct pci_dispatch_table
230{
231  unsigned short vendor;
232  unsigned short dev_id;
233  struct nic *(*eth_probe) (struct nic *, unsigned short *,
234			    struct pci_device *);
235};
236
237static struct pci_dispatch_table PCI_NIC[] =
238{
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 */
339# ifdef INCLUDE_TLAN
340  { PCI_VENDOR_ID_OLICOM,   PCI_DEVICE_ID_OLICOM_OC2326,   tlan_probe },
341# endif /* INCLUDE_TLAN */
342  { 0,                      0,                             0 }
343};
344#endif /* GRUB && INCLUDE_PCI */
345
346struct dispatch_table
347{
348  const char	*nic_name;
349#ifdef	INCLUDE_PCI
350  struct nic	*(*eth_probe) (struct nic *, unsigned short *,
351			       struct pci_device *);
352#else
353  struct nic	*(*eth_probe) (struct nic *, unsigned short *);
354#endif	/* INCLUDE_PCI */
355  unsigned short	*probe_ioaddrs;		/* for probe overrides */
356};
357
358/*
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)
362 */
363static struct dispatch_table	NIC[] =
364{
365#ifdef	INCLUDE_RTL8139
366  { "RTL8139", rtl8139_probe, pci_ioaddrs },
367#endif
368#ifdef INCLUDE_SIS900
369  { "SIS900", sis900_probe, pci_ioaddrs },
370#endif
371#ifdef INCLUDE_NATSEMI
372  { "NATSEMI", natsemi_probe, pci_ioaddrs },
373#endif
374#ifdef	INCLUDE_WD
375  { "WD", wd_probe, 0 },
376#endif
377#ifdef	INCLUDE_3C503
378  { "3C503", t503_probe, 0 },
379#endif
380#ifdef	INCLUDE_NE
381  { "NE*000", ne_probe, 0 },
382#endif
383#ifdef	INCLUDE_3C509
384  { "3C5x9", t509_probe, 0 },
385#endif
386#ifdef	INCLUDE_3C529
387  { "3C5x9", t529_probe, 0 },
388#endif
389#ifdef	INCLUDE_3C595
390  { "3C595", t595_probe, pci_ioaddrs },
391#endif
392#ifdef	INCLUDE_3C90X
393  { "3C90X", a3c90x_probe, pci_ioaddrs },
394#endif
395#ifdef	INCLUDE_EEPRO
396  { "EEPRO", eepro_probe, 0 },
397#endif
398#ifdef	INCLUDE_EEPRO100
399  { "EEPRO100", eepro100_probe, pci_ioaddrs },
400#endif
401#ifdef	INCLUDE_EPIC100
402  { "EPIC100", epic100_probe, pci_ioaddrs },
403#endif
404#ifdef	INCLUDE_OTULIP
405  { "OTulip", otulip_probe, pci_ioaddrs },
406#endif
407#ifdef	INCLUDE_TULIP
408  { "Tulip", tulip_probe, pci_ioaddrs },
409#endif
410#ifdef	INCLUDE_DAVICOM
411  { "DAVICOM", davicom_probe, pci_ioaddrs },
412#endif
413#ifdef	INCLUDE_CS89X0
414  { "CS89x0", cs89x0_probe, 0 },
415#endif
416#ifdef	INCLUDE_NE2100
417  { "NE2100", ne2100_probe, 0 },
418#endif
419#ifdef	INCLUDE_NI6510
420  { "NI6510", ni6510_probe, 0 },
421#endif
422#ifdef	INCLUDE_SK_G16
423  { "SK_G16", SK_probe, 0 },
424#endif
425#ifdef	INCLUDE_3C507
426  { "3C507", t507_probe, 0 },
427#endif
428#ifdef	INCLUDE_NI5010
429  { "NI5010", ni5010_probe, 0 },
430#endif
431#ifdef	INCLUDE_NI5210
432  { "NI5210", ni5210_probe, 0 },
433#endif
434#ifdef	INCLUDE_EXOS205
435  { "EXOS205", exos205_probe, 0 },
436#endif
437#ifdef	INCLUDE_SMC9000
438  { "SMC9000", smc9000_probe, 0 },
439#endif
440#ifdef	INCLUDE_TIARA
441  { "TIARA", tiara_probe, 0 },
442#endif
443#ifdef	INCLUDE_DEPCA
444  { "DEPCA", depca_probe, 0 },
445#endif
446#ifdef	INCLUDE_NS8390
447  { "NE2000/PCI", nepci_probe, pci_ioaddrs },
448#endif
449#ifdef	INCLUDE_LANCE
450  { "LANCE/PCI", lancepci_probe, pci_ioaddrs },
451#endif
452#ifdef	INCLUDE_VIA_RHINE
453  { "VIA 86C100", rhine_probe, pci_ioaddrs },
454#endif
455#ifdef	INCLUDE_W89C840
456  { "W89C840F", w89c840_probe, pci_ioaddrs },
457#endif
458#ifdef	INCLUDE_TLAN
459  { "Olicom 2326", tlan_probe, pci_ioaddrs },
460#endif
461  /* this entry must always be last to mark the end of list */
462  { 0, 0, 0 }
463};
464
465#define	NIC_TABLE_SIZE	(sizeof (NIC) / sizeof (NIC[0]))
466
467static int
468eth_dummy (struct nic *dummy)
469{
470  return 0;
471}
472
473static char	packet[ETH_FRAME_LEN];
474
475struct nic	nic =
476{
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 */
483#ifdef	T503_AUI
484  1,					/* aui */
485#else
486  0,					/* no aui */
487#endif
488  &rom,					/* rom_info */
489  arptable[ARP_CLIENT].node,		/* node_addr */
490  packet,				/* packet */
491  0,				/* packetlen */
492  0,				/* priv_data */
493};
494
495void
496eth_reset (void)
497{
498  (*nic.reset) (&nic);
499}
500
501int
502eth_probe (void)
503{
504  struct pci_device	*p;
505  const struct dispatch_table	*t;
506  static int probed = 0;
507
508  /* If already probed, don't try to probe it any longer.  */
509  if (probed)
510    return 1;
511
512  /* Clear the ready flag.  */
513  network_ready = 0;
514  /* Clear the ARP table.  */
515  grub_memset ((char *) arptable, 0,
516	       MAX_ARP * sizeof (struct arptable_t));
517
518  p = 0;
519
520#ifdef	INCLUDE_PCI
521  /* In GRUB, the ROM info is initialized here.  */
522  rom = *((struct rom_info *) ROM_INFO_LOCATION);
523
524  eth_pci_init(pci_nic_list);
525  pci_ioaddrs[0] = 0;
526  pci_ioaddrs[1] = 0;
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)
530    {
531      if (p->ioaddr != 0)
532	{
533	  pci_ioaddrs[0] = p->ioaddr;
534	  break;
535	}
536    }
537#endif
538
539  etherboot_printf("Probing...");
540
541#ifdef INCLUDE_PCI
542  if (p->vendor)
543    {
544      struct pci_dispatch_table *pt;
545
546      for (pt = PCI_NIC; pt->eth_probe != 0; pt++)
547	if (p->vendor == pt->vendor && p->dev_id == pt->dev_id)
548	  {
549	    etherboot_printf ("[%s]", p->name);
550	    if ((pt->eth_probe) (&nic, pci_ioaddrs, p))
551	      {
552		probed = 1;
553		return 1;
554	      }
555	  }
556    }
557#endif /* INCLUDE_PCI */
558
559  for (t = NIC; t->nic_name != 0; ++t)
560    {
561      etherboot_printf("[%s]", t->nic_name);
562#ifdef	INCLUDE_PCI
563      if ((*t->eth_probe) (&nic, t->probe_ioaddrs, p))
564	{
565	  probed = 1;
566	  return 1;
567	}
568#else
569      if ((*t->eth_probe) (&nic, t->probe_ioaddrs))
570	{
571	  probed = 1;
572	  return 1;
573	}
574#endif	/* INCLUDE_PCI */
575    }
576
577  return 0;
578}
579
580int
581eth_poll (void)
582{
583  return ((*nic.poll) (&nic));
584}
585
586void
587eth_transmit (const char *d, unsigned int t, unsigned int s, const void *p)
588{
589  (*nic.transmit) (&nic, d, t, s, p);
590  if (t == IP)
591    twiddle ();
592}
593
594void
595eth_disable (void)
596{
597  (*nic.disable) (&nic);
598}
599