| #include "netboot.h" |
| #include "nic.h" |
| |
| #include "netboot_config.h" |
| |
| #undef INCLUDE_PCI |
| #if defined(INCLUDE_NEPCI) || defined(INCLUDE_EEPRO100) || defined (INCLUDE_3C59X) |
| /* || others later */ |
| #if defined(NETBOOT32) /* only for 32 bit machines */ |
| #define INCLUDE_PCI |
| /* #include <linux/pci.h> */ |
| #include "pci.h" |
| static unsigned short pci_addrs[16]; |
| |
| struct pci_device pci_nic_list[] = { |
| #ifdef INCLUDE_NEPCI |
| { PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8029, |
| "Realtek 8029"}, |
| { PCI_VENDOR_ID_WINBOND2, PCI_DEVICE_ID_WINBOND2_89C940, |
| "Winbond NE2000-PCI"}, /* "Winbond 89C940" */ |
| { PCI_VENDOR_ID_COMPEX, PCI_DEVICE_ID_COMPEX_RL2000, |
| "Compex ReadyLink 2000"}, |
| { PCI_VENDOR_ID_KTI, PCI_DEVICE_ID_KTI_ET32P2, |
| "KTI ET32P2"}, |
| {PCI_VENDOR_ID_NETVIN, PCI_DEVICE_ID_NETVIN_NV5000SC, |
| "NetVin NV5000"}, |
| {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C926, |
| "VIA 82C926 Amazon"}, |
| {PCI_VENDOR_ID_SURECOM, PCI_DEVICE_ID_SURECOM_NE34, |
| "SureCom NE34"}, |
| #endif |
| #ifdef INCLUDE_EEPRO100 |
| { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82557, |
| "Intel EtherExpressPro100"}, |
| #endif |
| #ifdef INCLUDE_3C59X |
| {PCI_VENDOR_ID_VORTEX, PCI_DEVICE_ID_VORTEX_3c595, "3c595"}, |
| |
| #endif |
| |
| /* other PCI NICs go here */ |
| {0,} |
| }; |
| #endif /* NETBOOT32 */ |
| #endif /* INCLUDE_*PCI */ |
| |
| struct dispatch_table |
| { |
| char *nic_name; |
| struct nic *(*eth_probe)(struct nic *, unsigned short *); |
| unsigned short *probe_addrs; /* for probe overrides */ |
| }; |
| |
| #ifdef INCLUDE_WD |
| extern struct nic *wd_probe(struct nic *, unsigned short *); |
| #endif |
| |
| #ifdef INCLUDE_T503 |
| extern struct nic *t503_probe(struct nic *, unsigned short *); |
| #endif |
| |
| #if defined(INCLUDE_NE) |
| extern struct nic *ne_probe(struct nic *, unsigned short *); |
| #endif |
| |
| #if defined(INCLUDE_NEPCI) |
| extern struct nic *nepci_probe(struct nic *, unsigned short *); |
| #endif |
| |
| #ifdef INCLUDE_T509 |
| extern struct nic *t509_probe(struct nic *, unsigned short *); |
| #endif |
| |
| #ifdef INCLUDE_EEPRO100 |
| extern struct nic *eepro100_probe(struct nic *, unsigned short *); |
| #endif |
| |
| #ifdef INCLUDE_CS |
| extern struct nic *cs89x0_probe(struct nic *, unsigned short *); |
| #endif |
| |
| #ifdef INCLUDE_NE2100 |
| extern struct nic *ne2100_probe(struct nic *, unsigned short *); |
| #endif |
| |
| #ifdef INCLUDE_3C59X |
| extern struct nic *VX_probe(struct nic *, unsigned short *); |
| #endif |
| |
| |
| /* |
| * 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_WD |
| { "WD", wd_probe, 0 }, |
| #endif |
| #ifdef INCLUDE_T503 |
| { "3C503", t503_probe, 0 }, |
| #endif |
| #ifdef INCLUDE_NE |
| { "NE*000", ne_probe, 0 }, |
| #endif |
| #ifdef INCLUDE_T509 |
| { "3C5x9", t509_probe, 0 }, |
| #endif |
| #ifdef INCLUDE_EEPRO100 |
| { "EEPRO100", eepro100_probe, 0 }, |
| #endif |
| #ifdef INCLUDE_CS |
| { "CS89x0", cs89x0_probe, 0 }, |
| #endif |
| #ifdef INCLUDE_NE2100 |
| { "NE2100", ne2100_probe, 0 }, |
| #endif |
| #ifdef INCLUDE_NEPCI |
| { "NE*000/PCI", nepci_probe, pci_addrs }, |
| #endif |
| |
| #ifdef INCLUDE_3C59X |
| {"VorTex/PCI", VX_probe, pci_addrs}, |
| #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 *nic) |
| { |
| return (0); |
| } |
| |
| char packet[ETH_MAX_PACKET]; |
| |
| struct nic nic = |
| { |
| #ifdef NETBOOT32 |
| (void (*)(struct nic *))eth_dummy, /* reset */ |
| eth_dummy, /* poll */ |
| (void (*)(struct nic *, char *, |
| unsigned int, unsigned int, |
| char *))eth_dummy, /* transmit */ |
| (void (*)(struct nic *))eth_dummy, /* disable */ |
| #endif |
| /* bcc has problems with complicated casts */ |
| #ifdef NETBOOT16 |
| eth_dummy, |
| eth_dummy, |
| eth_dummy, |
| eth_dummy, |
| #endif |
| 1, /* aui */ |
| arptable[ARP_CLIENT].node, /* node_addr */ |
| packet, /* packet */ |
| 0, /* packetlen */ |
| 0 /* priv_data */ |
| }; |
| |
| #if 0 |
| void print_config(void) |
| { |
| struct dispatch_table *t; |
| |
| #ifdef NETBOOT32 |
| printf("Etherboot/32 version " VERSION |
| #ifdef NFS_BOOT |
| " ESC for menu" |
| #endif |
| " for "); |
| #endif |
| #ifdef NETBOOT16 |
| /* you need to edit the version manually because bcc doesn't |
| do string literal concatenation yet */ |
| printf("Etherboot/16 version 3.2 for "); |
| #endif |
| for (t = NIC; t->nic_name != 0; ++t) |
| printf("[%s]", t->nic_name); |
| printf("\r\n"); |
| } |
| #endif |
| |
| void eth_reset(void) |
| { |
| (*nic.reset)(&nic); |
| } |
| |
| int eth_probe(void) |
| { |
| struct dispatch_table *t; |
| |
| #ifdef INCLUDE_PCI |
| pci_addrs[0] = 0; |
| eth_pci_init(pci_nic_list, pci_addrs); |
| pci_addrs[1] = 0; |
| #endif |
| printf("Probing..."); |
| for (t = NIC; t->nic_name != 0; ++t) |
| { |
| printf("[%s]", t->nic_name); |
| if ((*t->eth_probe)(&nic, t->probe_addrs)) |
| return (1); |
| } |
| return (0); |
| } |
| |
| int eth_poll(void) |
| { |
| return ((*nic.poll)(&nic)); |
| } |
| |
| void eth_transmit(char *d, unsigned int t, unsigned int s, char *p) |
| { |
| (*nic.transmit)(&nic, d, t, s, p); |
| twiddle(); |
| } |
| |
| void eth_disable(void) |
| { |
| (*nic.disable)(&nic); |
| } |