The Android Open Source Project | 5b1eb06 | 2009-03-03 19:29:32 -0800 | [diff] [blame] | 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> |
| 38 | static unsigned short pci_ioaddrs[16]; |
| 39 | |
| 40 | static 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 |
| 229 | struct 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 | |
| 237 | static 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 | |
| 346 | struct 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 | */ |
| 363 | static 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 | |
| 467 | static int |
| 468 | eth_dummy (struct nic *dummy) |
| 469 | { |
| 470 | return 0; |
| 471 | } |
| 472 | |
| 473 | static char packet[ETH_FRAME_LEN]; |
| 474 | |
| 475 | struct 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 | |
| 495 | void |
| 496 | eth_reset (void) |
| 497 | { |
| 498 | (*nic.reset) (&nic); |
| 499 | } |
| 500 | |
| 501 | int |
| 502 | eth_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 | |
| 580 | int |
| 581 | eth_poll (void) |
| 582 | { |
| 583 | return ((*nic.poll) (&nic)); |
| 584 | } |
| 585 | |
| 586 | void |
| 587 | eth_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 | |
| 594 | void |
| 595 | eth_disable (void) |
| 596 | { |
| 597 | (*nic.disable) (&nic); |
| 598 | } |