mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-24 16:19:22 +00:00
226 lines
4.7 KiB
C
226 lines
4.7 KiB
C
#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);
|
|
}
|