auto import from //depot/cupcake/@135843
diff --git a/netboot/config.c b/netboot/config.c
new file mode 100644
index 0000000..3949a67
--- /dev/null
+++ b/netboot/config.c
@@ -0,0 +1,598 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2001,2002  Free Software Foundation, Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/* Based on "src/config.c" in etherboot-5.0.5.  */
+
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2, or (at
+ * your option) any later version.
+ */
+
+#define GRUB	1
+#include <etherboot.h>
+#include <nic.h>
+
+#undef	INCLUDE_PCI
+#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)
+	/* || others later */
+# define INCLUDE_PCI
+# include <pci.h>
+static unsigned short pci_ioaddrs[16];
+
+static struct pci_device pci_nic_list[] =
+{
+#ifdef	INCLUDE_NS8390
+  { PCI_VENDOR_ID_REALTEK,	PCI_DEVICE_ID_REALTEK_8029,
+    "Realtek 8029", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_WINBOND2,	PCI_DEVICE_ID_WINBOND2_89C940,
+    "Winbond NE2000-PCI", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_COMPEX,	PCI_DEVICE_ID_COMPEX_RL2000,
+    "Compex ReadyLink 2000", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_KTI,		PCI_DEVICE_ID_KTI_ET32P2,
+    "KTI ET32P2", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_NETVIN,	PCI_DEVICE_ID_NETVIN_NV5000SC,
+    "NetVin NV5000SC", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_HOLTEK,	PCI_DEVICE_ID_HOLTEK_HT80232,
+    "Holtek HT80232", 0, 0, 0, 0},
+#endif
+#ifdef	INCLUDE_3C90X
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C900TPO,
+    "3Com900-TPO", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C900COMBO,
+    "3Com900-Combo", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C905TX,
+    "3Com905-TX", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C905T4,
+    "3Com905-T4", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9004,
+    "3Com900B-TPO", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9005,
+    "3Com900B-Combo", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9006,
+    "3Com900B-2/T", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x900A,
+    "3Com900B-FL", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C905B_TX,
+    "3Com905B-TX", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9056,
+    "3Com905B-T4", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x905A,
+    "3Com905B-FL", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C905C_TXM,
+    "3Com905C-TXM", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9800,
+    "3Com980-Cyclone", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9805,
+    "3Com9805", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x7646,
+    "3CSOHO100-TX", 0, 0, 0, 0},
+#endif
+#ifdef	INCLUDE_3C595
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C590,
+    "3Com590", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C595,
+    "3Com595", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C595_1,
+    "3Com595", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C595_2,
+    "3Com595", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C900TPO,
+    "3Com900-TPO", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		PCI_DEVICE_ID_3COM_3C900COMBO,
+    "3Com900-Combo", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9004,
+    "3Com900B-TPO", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9005,
+    "3Com900B-Combo", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9006,
+    "3Com900B-2/T", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x900A,
+    "3Com900B-FL", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9800,
+    "3Com980-Cyclone", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x9805,
+    "3Com9805", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_3COM,		0x7646,
+    "3CSOHO100-TX", 0, 0, 0, 0},
+#endif
+#ifdef	INCLUDE_EEPRO100
+  { PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82557,
+    "Intel EtherExpressPro100", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82559ER,
+    "Intel EtherExpressPro100 82559ER", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ID1029,
+    "Intel EtherExpressPro100 ID1029", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_ID1030,
+    "Intel Corporation 82559 InBusiness 10/100", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_82562,
+    "Intel EtherExpressPro100 82562EM", 0, 0, 0, 0},
+#endif
+#ifdef	INCLUDE_EPIC100
+  { PCI_VENDOR_ID_SMC,		PCI_DEVICE_ID_SMC_EPIC100,
+    "SMC EtherPowerII", 0, 0, 0, 0},
+#endif
+#ifdef	INCLUDE_LANCE
+  { PCI_VENDOR_ID_AMD,		PCI_DEVICE_ID_AMD_LANCE,
+    "AMD Lance/PCI", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_AMD_HOMEPNA,	PCI_DEVICE_ID_AMD_HOMEPNA,
+    "AMD Lance/HomePNA", 0, 0, 0, 0},
+#endif
+#ifdef	INCLUDE_RTL8139
+  { PCI_VENDOR_ID_REALTEK,	PCI_DEVICE_ID_REALTEK_8139,
+    "Realtek 8139", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_DLINK,	PCI_DEVICE_ID_DFE530TXP,
+    "DFE530TX+/DFE538TX", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_SMC_1211,	PCI_DEVICE_ID_SMC_1211,
+    "SMC EZ10/100", 0, 0, 0, 0},
+#endif
+#ifdef	INCLUDE_OTULIP
+  { PCI_VENDOR_ID_DEC,		PCI_DEVICE_ID_DEC_TULIP,
+    "Digital Tulip", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_DEC,		PCI_DEVICE_ID_DEC_TULIP_FAST,
+    "Digital Tulip Fast", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_DEC,		PCI_DEVICE_ID_DEC_TULIP_PLUS,
+    "Digital Tulip+", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_DEC,		PCI_DEVICE_ID_DEC_21142,
+    "Digital Tulip 21142", 0, 0, 0, 0},
+#endif
+#ifdef	INCLUDE_TULIP
+  { PCI_VENDOR_ID_DEC,		PCI_DEVICE_ID_DEC_TULIP,
+    "Digital Tulip", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_DEC,		PCI_DEVICE_ID_DEC_TULIP_FAST,
+    "Digital Tulip Fast", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_DEC,		PCI_DEVICE_ID_DEC_TULIP_PLUS,
+    "Digital Tulip+", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_DEC,		PCI_DEVICE_ID_DEC_21142,
+    "Digital Tulip 21142", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_MACRONIX,	PCI_DEVICE_ID_MX987x5,
+    "Macronix MX987x5", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_LINKSYS,	PCI_DEVICE_ID_LC82C115,
+    "LinkSys LNE100TX", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_LINKSYS,	PCI_DEVICE_ID_DEC_TULIP,
+    "Netgear FA310TX", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_DAVICOM,	PCI_DEVICE_ID_DM9102,
+    "Davicom 9102", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_DAVICOM,	PCI_DEVICE_ID_DM9009,
+    "Davicom 9009", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_ADMTEK,	PCI_DEVICE_ID_ADMTEK_0985,
+    "ADMtek Centaur-P", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_ADMTEK,	0x0981,
+    "ADMtek AN981 Comet", 0, 0, 0, 0},
+  { 0x125B,			0x1400,
+    "ASIX AX88140", 0, 0, 0, 0 },
+  { 0x11F6,			0x9881,
+    "Compex RL100-TX", 0, 0, 0, 0 },
+#endif
+#ifdef	INCLUDE_DAVICOM
+  { PCI_VENDOR_ID_DAVICOM,	PCI_DEVICE_ID_DM9102,
+    "Davicom 9102", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_DAVICOM,	PCI_DEVICE_ID_DM9009,
+    "Davicom 9009", 0, 0, 0, 0},
+#endif
+#ifdef	INCLUDE_VIA_RHINE
+  { PCI_VENDOR_ID_VIATEC,	PCI_DEVICE_ID_VIA_VT6102,
+    "VIA 6102", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_VIATEC,	PCI_DEVICE_ID_VIA_RHINE_I,
+    "VIA 3043", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_VIATEC,	PCI_DEVICE_ID_VIA_86C100A,
+    "VIA 86C100A", 0, 0, 0, 0},
+#endif
+#ifdef	INCLUDE_W89C840
+  { PCI_VENDOR_ID_WINBOND2,	PCI_DEVICE_ID_WINBOND2_89C840,
+    "Winbond W89C840F", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_COMPEX,	PCI_DEVICE_ID_COMPEX_RL100ATX,
+    "Compex RL100ATX", 0, 0, 0, 0},
+#endif
+#ifdef INCLUDE_SIS900
+  { PCI_VENDOR_ID_SIS,     	PCI_DEVICE_ID_SIS900,
+    "SIS900", 0, 0, 0, 0},
+  { PCI_VENDOR_ID_SIS,     	PCI_DEVICE_ID_SIS7016,
+    "SIS7016", 0, 0, 0, 0},
+#endif
+  
+#ifdef INCLUDE_NATSEMI
+  { PCI_VENDOR_ID_NS,	     	PCI_DEVICE_ID_DP83815,
+    "DP83815", 0, 0, 0, 0},
+#endif
+  
+#ifdef INCLUDE_TLAN
+  { PCI_VENDOR_ID_OLICOM,	PCI_DEVICE_ID_OLICOM_OC2326,
+    "OC2326", 0, 0, 0, 0},
+#endif
+
+  /* other PCI NICs go here */
+  {0, 0, NULL, 0, 0, 0, 0}
+};
+#endif	/* INCLUDE_*PCI */
+
+#include <cards.h>
+
+#ifdef INCLUDE_PCI
+struct pci_dispatch_table
+{
+  unsigned short vendor;
+  unsigned short dev_id;
+  struct nic *(*eth_probe) (struct nic *, unsigned short *,
+			    struct pci_device *);
+};
+
+static struct pci_dispatch_table PCI_NIC[] =
+{
+# ifdef INCLUDE_NS8390
+  { PCI_VENDOR_ID_REALTEK,  PCI_DEVICE_ID_REALTEK_8029,    nepci_probe },
+  { PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940, nepci_probe },
+  { PCI_VENDOR_ID_COMPEX,   PCI_DEVICE_ID_COMPEX_RL2000,   nepci_probe },
+  { PCI_VENDOR_ID_KTI,      PCI_DEVICE_ID_KTI_ET32P2,      nepci_probe },
+  { PCI_VENDOR_ID_NETVIN,   PCI_DEVICE_ID_NETVIN_NV5000SC, nepci_probe },
+  { PCI_VENDOR_ID_HOLTEK,   PCI_DEVICE_ID_HOLTEK_HT80232,  nepci_probe },
+# endif /* INCLUDE_NS8390 */
+# ifdef INCLUDE_3C90X
+  { PCI_VENDOR_ID_3COM,	    PCI_DEVICE_ID_3COM_3C900TPO,   a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C900COMBO, a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C905TX,    a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C905T4,    a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     0x9004,                        a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     0x9005,                        a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     0x9006,                        a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     0x900A,                        a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C905B_TX,  a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     0x9056,                        a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     0x905A,                        a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C905C_TXM, a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     0x9800,                        a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     0x9805,                        a3c90x_probe },
+  { PCI_VENDOR_ID_3COM,     0x7646,                        a3c90x_probe },
+# endif /* INCLUDE_3C90X */
+# ifdef	INCLUDE_3C595
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C590,      t595_probe },
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C595,      t595_probe },
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C595_1,    t595_probe },
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C595_2,    t595_probe },
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C900TPO,   t595_probe },
+  { PCI_VENDOR_ID_3COM,     PCI_DEVICE_ID_3COM_3C900COMBO, t595_probe },
+  { PCI_VENDOR_ID_3COM,     0x9004,                        t595_probe },
+  { PCI_VENDOR_ID_3COM,     0x9005,                        t595_probe },
+  { PCI_VENDOR_ID_3COM,     0x9006,                        t595_probe },
+  { PCI_VENDOR_ID_3COM,     0x900A,                        t595_probe },
+  { PCI_VENDOR_ID_3COM,     0x9800,                        t595_probe },
+  { PCI_VENDOR_ID_3COM,     0x9805,                        t595_probe },
+  { PCI_VENDOR_ID_3COM,     0x7646,                        t595_probe },
+# endif /* INCLUDE_3C595 */
+# ifdef	INCLUDE_EEPRO100
+  { PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82557,     eepro100_probe },
+  { PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82559ER,   eepro100_probe },
+  { PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_ID1029,    eepro100_probe },
+  { PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_ID1030,    eepro100_probe },
+  { PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82562,     eepro100_probe },
+# endif /* INCLUDE_EEPRO100 */
+# ifdef	INCLUDE_EPIC100
+  { PCI_VENDOR_ID_SMC,      PCI_DEVICE_ID_SMC_EPIC100,     epic100_probe },
+# endif /* INCLUDE_EPIC100 */
+# ifdef	INCLUDE_LANCE
+  { PCI_VENDOR_ID_AMD,      PCI_DEVICE_ID_AMD_LANCE,       lancepci_probe },
+  { PCI_VENDOR_ID_AMD_HOMEPNA, PCI_DEVICE_ID_AMD_HOMEPNA,  lancepci_probe },
+# endif /* INCLUDE_LANCE */
+# ifdef	INCLUDE_RTL8139
+  { PCI_VENDOR_ID_REALTEK,  PCI_DEVICE_ID_REALTEK_8139,    rtl8139_probe },
+  { PCI_VENDOR_ID_DLINK,    PCI_DEVICE_ID_DFE530TXP,       rtl8139_probe },
+  { PCI_VENDOR_ID_SMC_1211, PCI_DEVICE_ID_SMC_1211,        rtl8139_probe },
+# endif /* INCLUDE_RTL8139 */
+# ifdef	INCLUDE_OTULIP
+  { PCI_VENDOR_ID_DEC,      PCI_DEVICE_ID_DEC_TULIP,       otulip_probe },
+  { PCI_VENDOR_ID_DEC,      PCI_DEVICE_ID_DEC_TULIP_FAST,  otulip_probe },
+  { PCI_VENDOR_ID_DEC,      PCI_DEVICE_ID_DEC_TULIP_PLUS,  otulip_probe },
+  { PCI_VENDOR_ID_DEC,      PCI_DEVICE_ID_DEC_21142,       otulip_probe },
+# endif /* INCLUDE_OTULIP */
+# ifdef	INCLUDE_TULIP
+  { PCI_VENDOR_ID_DEC,      PCI_DEVICE_ID_DEC_TULIP,       tulip_probe },
+  { PCI_VENDOR_ID_DEC,      PCI_DEVICE_ID_DEC_TULIP_FAST,  tulip_probe },
+  { PCI_VENDOR_ID_DEC,      PCI_DEVICE_ID_DEC_TULIP_PLUS,  tulip_probe },
+  { PCI_VENDOR_ID_DEC,      PCI_DEVICE_ID_DEC_21142,       tulip_probe },
+  { PCI_VENDOR_ID_MACRONIX, PCI_DEVICE_ID_MX987x5,         tulip_probe },
+  { PCI_VENDOR_ID_LINKSYS,  PCI_DEVICE_ID_LC82C115,        tulip_probe },
+  { PCI_VENDOR_ID_LINKSYS,  PCI_DEVICE_ID_DEC_TULIP,       tulip_probe },
+  { PCI_VENDOR_ID_DAVICOM,  PCI_DEVICE_ID_DM9102,          tulip_probe },
+  { PCI_VENDOR_ID_DAVICOM,  PCI_DEVICE_ID_DM9009,          tulip_probe },
+  { PCI_VENDOR_ID_ADMTEK,   PCI_DEVICE_ID_ADMTEK_0985,     tulip_probe },
+  { PCI_VENDOR_ID_ADMTEK,   0x0981,                        tulip_probe },
+  { 0x125B,                 0x1400,                        tulip_probe },
+  { 0x11F6,                 0x9881,                        tulip_probe },
+# endif /* INCLUDE_TULIP */
+# ifdef INCLUDE_DAVICOM
+  { PCI_VENDOR_ID_DAVICOM,   PCI_DEVICE_ID_DM9102,           davicom_probe },
+  { PCI_VENDOR_ID_DAVICOM,   PCI_DEVICE_ID_DM9009,           davicom_probe },
+# endif /* INCLUDE_DAVICOM */
+# ifdef	INCLUDE_VIA_RHINE
+  { PCI_VENDOR_ID_VIATEC,   PCI_DEVICE_ID_VIA_VT6102,      rhine_probe },
+  { PCI_VENDOR_ID_VIATEC,   PCI_DEVICE_ID_VIA_RHINE_I,     rhine_probe },
+  { PCI_VENDOR_ID_VIATEC,   PCI_DEVICE_ID_VIA_86C100A,     rhine_probe },
+# endif /* INCLUDE_VIA_RHINE */
+# ifdef INCLUDE_W89C840
+  { PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C840, w89c840_probe },
+  { PCI_VENDOR_ID_COMPEX,   PCI_DEVICE_ID_COMPEX_RL100ATX, w89c840_probe },
+# endif /* INCLUDE_W89C840 */
+# ifdef INCLUDE_SIS900
+  { PCI_VENDOR_ID_SIS,      PCI_DEVICE_ID_SIS900,          sis900_probe },
+  { PCI_VENDOR_ID_SIS,      PCI_DEVICE_ID_SIS7016,         sis900_probe },
+# endif /* INCLUDE_SIS900 */
+# ifdef INCLUDE_NATSEMI
+  { PCI_VENDOR_ID_NS,       PCI_DEVICE_ID_DP83815,         natsemi_probe },
+# endif /* INCLUDE_NATSEMI */
+# ifdef INCLUDE_TLAN
+  { PCI_VENDOR_ID_OLICOM,   PCI_DEVICE_ID_OLICOM_OC2326,   tlan_probe },
+# endif /* INCLUDE_TLAN */
+  { 0,                      0,                             0 }
+};
+#endif /* GRUB && INCLUDE_PCI */
+
+struct dispatch_table
+{
+  const char	*nic_name;
+#ifdef	INCLUDE_PCI
+  struct nic	*(*eth_probe) (struct nic *, unsigned short *,
+			       struct pci_device *);
+#else
+  struct nic	*(*eth_probe) (struct nic *, unsigned short *);
+#endif	/* INCLUDE_PCI */
+  unsigned short	*probe_ioaddrs;		/* for probe overrides */
+};
+
+/*
+ *	NIC probing is in order of appearance in this table.
+ *	If for some reason you want to change the order,
+ *	just rearrange the entries (bracketed by the #ifdef/#endif)
+ */
+static struct dispatch_table	NIC[] =
+{
+#ifdef	INCLUDE_RTL8139
+  { "RTL8139", rtl8139_probe, pci_ioaddrs },
+#endif
+#ifdef INCLUDE_SIS900
+  { "SIS900", sis900_probe, pci_ioaddrs },	
+#endif
+#ifdef INCLUDE_NATSEMI
+  { "NATSEMI", natsemi_probe, pci_ioaddrs },	
+#endif
+#ifdef	INCLUDE_WD
+  { "WD", wd_probe, 0 },
+#endif
+#ifdef	INCLUDE_3C503
+  { "3C503", t503_probe, 0 },
+#endif
+#ifdef	INCLUDE_NE
+  { "NE*000", ne_probe, 0 },
+#endif
+#ifdef	INCLUDE_3C509
+  { "3C5x9", t509_probe, 0 },
+#endif
+#ifdef	INCLUDE_3C529
+  { "3C5x9", t529_probe, 0 },
+#endif
+#ifdef	INCLUDE_3C595
+  { "3C595", t595_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_3C90X
+  { "3C90X", a3c90x_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_EEPRO
+  { "EEPRO", eepro_probe, 0 },
+#endif
+#ifdef	INCLUDE_EEPRO100
+  { "EEPRO100", eepro100_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_EPIC100
+  { "EPIC100", epic100_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_OTULIP
+  { "OTulip", otulip_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_TULIP
+  { "Tulip", tulip_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_DAVICOM
+  { "DAVICOM", davicom_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_CS89X0
+  { "CS89x0", cs89x0_probe, 0 },
+#endif
+#ifdef	INCLUDE_NE2100
+  { "NE2100", ne2100_probe, 0 },
+#endif
+#ifdef	INCLUDE_NI6510
+  { "NI6510", ni6510_probe, 0 },
+#endif
+#ifdef	INCLUDE_SK_G16
+  { "SK_G16", SK_probe, 0 },
+#endif
+#ifdef	INCLUDE_3C507
+  { "3C507", t507_probe, 0 },
+#endif
+#ifdef	INCLUDE_NI5010
+  { "NI5010", ni5010_probe, 0 },
+#endif
+#ifdef	INCLUDE_NI5210
+  { "NI5210", ni5210_probe, 0 },
+#endif
+#ifdef	INCLUDE_EXOS205
+  { "EXOS205", exos205_probe, 0 },
+#endif
+#ifdef	INCLUDE_SMC9000
+  { "SMC9000", smc9000_probe, 0 },
+#endif
+#ifdef	INCLUDE_TIARA
+  { "TIARA", tiara_probe, 0 },
+#endif
+#ifdef	INCLUDE_DEPCA
+  { "DEPCA", depca_probe, 0 },
+#endif
+#ifdef	INCLUDE_NS8390
+  { "NE2000/PCI", nepci_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_LANCE
+  { "LANCE/PCI", lancepci_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_VIA_RHINE
+  { "VIA 86C100", rhine_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_W89C840
+  { "W89C840F", w89c840_probe, pci_ioaddrs },
+#endif
+#ifdef	INCLUDE_TLAN
+  { "Olicom 2326", tlan_probe, pci_ioaddrs },
+#endif
+  /* this entry must always be last to mark the end of list */
+  { 0, 0, 0 }
+};
+
+#define	NIC_TABLE_SIZE	(sizeof (NIC) / sizeof (NIC[0]))
+
+static int
+eth_dummy (struct nic *dummy)
+{
+  return 0;
+}
+
+static char	packet[ETH_FRAME_LEN];
+
+struct nic	nic =
+{
+  (void (*) (struct nic *)) eth_dummy,	/* reset */
+  eth_dummy,				/* poll */
+  (void (*) (struct nic *, const char *,
+	     unsigned int, unsigned int,
+	     const char *)) eth_dummy,	/* transmit */
+  (void (*) (struct nic *)) eth_dummy,	/* disable */
+#ifdef	T503_AUI
+  1,					/* aui */
+#else
+  0,					/* no aui */
+#endif
+  &rom,					/* rom_info */
+  arptable[ARP_CLIENT].node,		/* node_addr */
+  packet,				/* packet */
+  0,				/* packetlen */
+  0,				/* priv_data */
+};
+
+void
+eth_reset (void)
+{
+  (*nic.reset) (&nic);
+}
+
+int
+eth_probe (void)
+{
+  struct pci_device	*p;
+  const struct dispatch_table	*t;
+  static int probed = 0;
+
+  /* If already probed, don't try to probe it any longer.  */
+  if (probed)
+    return 1;
+  
+  /* Clear the ready flag.  */
+  network_ready = 0;
+  /* Clear the ARP table.  */
+  grub_memset ((char *) arptable, 0,
+	       MAX_ARP * sizeof (struct arptable_t));
+  
+  p = 0;
+  
+#ifdef	INCLUDE_PCI
+  /* In GRUB, the ROM info is initialized here.  */
+  rom = *((struct rom_info *) ROM_INFO_LOCATION);
+  
+  eth_pci_init(pci_nic_list);
+  pci_ioaddrs[0] = 0;
+  pci_ioaddrs[1] = 0;
+  /* at this point we have a list of possible PCI candidates
+     we just pick the first one with a non-zero ioaddr */
+  for (p = pci_nic_list; p->vendor != 0; ++p)
+    {
+      if (p->ioaddr != 0)
+	{
+	  pci_ioaddrs[0] = p->ioaddr;
+	  break;
+	}
+    }
+#endif
+  
+  etherboot_printf("Probing...");
+	
+#ifdef INCLUDE_PCI
+  if (p->vendor)
+    {
+      struct pci_dispatch_table *pt;
+      
+      for (pt = PCI_NIC; pt->eth_probe != 0; pt++)
+	if (p->vendor == pt->vendor && p->dev_id == pt->dev_id)
+	  {
+	    etherboot_printf ("[%s]", p->name);
+	    if ((pt->eth_probe) (&nic, pci_ioaddrs, p))
+	      {
+		probed = 1;
+		return 1;
+	      }
+	  }
+    }
+#endif /* INCLUDE_PCI */
+	
+  for (t = NIC; t->nic_name != 0; ++t)
+    {
+      etherboot_printf("[%s]", t->nic_name);
+#ifdef	INCLUDE_PCI
+      if ((*t->eth_probe) (&nic, t->probe_ioaddrs, p))
+	{
+	  probed = 1;
+	  return 1;
+	}
+#else
+      if ((*t->eth_probe) (&nic, t->probe_ioaddrs))
+	{
+	  probed = 1;
+	  return 1;
+	}
+#endif	/* INCLUDE_PCI */
+    }
+  
+  return 0;
+}
+
+int
+eth_poll (void)
+{
+  return ((*nic.poll) (&nic));
+}
+
+void
+eth_transmit (const char *d, unsigned int t, unsigned int s, const void *p)
+{
+  (*nic.transmit) (&nic, d, t, s, p);
+  if (t == IP)
+    twiddle ();
+}
+
+void
+eth_disable (void)
+{
+  (*nic.disable) (&nic);
+}