blob: ea4022be470a3d2ec2af52cfce970bf047ea3ed4 [file] [log] [blame] [raw]
#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);
}