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