mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-25 08:39:28 +00:00
add netboot support.
This commit is contained in:
1 parent
694616c180
commit
be514997d2
51 files changed
+9152
-92
No files matched your search
@@ -0,0 +1,225 @@
|
||||
#include "netboot.h"
|
||||
#include "nic.h"
|
||||
|
||||
#include "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);
|
||||
}
|
||||
Reference in new issue
Block a user