mirror of https://github.com/ipxe/ipxe.git
Updated to new ISA API, but this driver probably has deeper problems.
parent
487574fc02
commit
d5e1561fb8
|
@ -1,3 +1,5 @@
|
||||||
|
#warning "depca.c almost certainly won't work"
|
||||||
|
|
||||||
/* Not fixed for relocation yet. Probably won't work relocated above 16MB */
|
/* Not fixed for relocation yet. Probably won't work relocated above 16MB */
|
||||||
#ifdef ALLMULTI
|
#ifdef ALLMULTI
|
||||||
#error multicast support is not yet implemented
|
#error multicast support is not yet implemented
|
||||||
|
@ -235,22 +237,23 @@
|
||||||
#include "etherboot.h"
|
#include "etherboot.h"
|
||||||
#include "nic.h"
|
#include "nic.h"
|
||||||
#include "isa.h"
|
#include "isa.h"
|
||||||
|
#include "console.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** I/O addresses. Note that the 2k buffer option is not supported in
|
** I/O addresses. Note that the 2k buffer option is not supported in
|
||||||
** this driver.
|
** this driver.
|
||||||
*/
|
*/
|
||||||
#define DEPCA_NICSR ioaddr+0x00 /* Network interface CSR */
|
#define DEPCA_NICSR 0x00 /* Network interface CSR */
|
||||||
#define DEPCA_RBI ioaddr+0x02 /* RAM buffer index (2k buffer mode) */
|
#define DEPCA_RBI 0x02 /* RAM buffer index (2k buffer mode) */
|
||||||
#define DEPCA_DATA ioaddr+0x04 /* LANCE registers' data port */
|
#define DEPCA_DATA 0x04 /* LANCE registers' data port */
|
||||||
#define DEPCA_ADDR ioaddr+0x06 /* LANCE registers' address port */
|
#define DEPCA_ADDR 0x06 /* LANCE registers' address port */
|
||||||
#define DEPCA_HBASE ioaddr+0x08 /* EISA high memory base address reg. */
|
#define DEPCA_HBASE 0x08 /* EISA high memory base address reg. */
|
||||||
#define DEPCA_PROM ioaddr+0x0c /* Ethernet address ROM data port */
|
#define DEPCA_PROM 0x0c /* Ethernet address ROM data port */
|
||||||
#define DEPCA_CNFG ioaddr+0x0c /* EISA Configuration port */
|
#define DEPCA_CNFG 0x0c /* EISA Configuration port */
|
||||||
#define DEPCA_RBSA ioaddr+0x0e /* RAM buffer starting address (2k buff.) */
|
#define DEPCA_RBSA 0x0e /* RAM buffer starting address (2k buff.) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** These are LANCE registers addressable through DEPCA_ADDR
|
** These are LANCE registers addressable through nic->ioaddr + DEPCA_ADDR
|
||||||
*/
|
*/
|
||||||
#define CSR0 0
|
#define CSR0 0
|
||||||
#define CSR1 1
|
#define CSR1 1
|
||||||
|
@ -375,8 +378,6 @@
|
||||||
/*
|
/*
|
||||||
** ISA Bus defines
|
** ISA Bus defines
|
||||||
*/
|
*/
|
||||||
#define DEPCA_IO_PORTS {0x300, 0x200, 0}
|
|
||||||
|
|
||||||
#ifndef DEPCA_MODEL
|
#ifndef DEPCA_MODEL
|
||||||
#define DEPCA_MODEL DEPCA
|
#define DEPCA_MODEL DEPCA
|
||||||
#endif
|
#endif
|
||||||
|
@ -465,15 +466,14 @@ struct depca_private {
|
||||||
|
|
||||||
static Address mem_start = DEPCA_RAM_BASE;
|
static Address mem_start = DEPCA_RAM_BASE;
|
||||||
static Address mem_len, offset;
|
static Address mem_len, offset;
|
||||||
static unsigned short ioaddr = 0;
|
|
||||||
static struct depca_private lp;
|
static struct depca_private lp;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Miscellaneous defines...
|
** Miscellaneous defines...
|
||||||
*/
|
*/
|
||||||
#define STOP_DEPCA \
|
#define STOP_DEPCA(ioaddr) \
|
||||||
outw(CSR0, DEPCA_ADDR);\
|
outw(CSR0, ioaddr + DEPCA_ADDR);\
|
||||||
outw(STOP, DEPCA_DATA)
|
outw(STOP, ioaddr + DEPCA_DATA)
|
||||||
|
|
||||||
/* Initialize the lance Rx and Tx descriptor rings. */
|
/* Initialize the lance Rx and Tx descriptor rings. */
|
||||||
static void depca_init_ring(struct nic *nic)
|
static void depca_init_ring(struct nic *nic)
|
||||||
|
@ -504,13 +504,13 @@ static void depca_init_ring(struct nic *nic)
|
||||||
|
|
||||||
static void LoadCSRs(void)
|
static void LoadCSRs(void)
|
||||||
{
|
{
|
||||||
outw(CSR1, DEPCA_ADDR); /* initialisation block address LSW */
|
outw(CSR1, nic->ioaddr + DEPCA_ADDR); /* initialisation block address LSW */
|
||||||
outw((u16) (lp.sh_mem & LA_MASK), DEPCA_DATA);
|
outw((u16) (lp.sh_mem & LA_MASK), nic->ioaddr + DEPCA_DATA);
|
||||||
outw(CSR2, DEPCA_ADDR); /* initialisation block address MSW */
|
outw(CSR2, nic->ioaddr + DEPCA_ADDR); /* initialisation block address MSW */
|
||||||
outw((u16) ((lp.sh_mem & LA_MASK) >> 16), DEPCA_DATA);
|
outw((u16) ((lp.sh_mem & LA_MASK) >> 16), nic->ioaddr + DEPCA_DATA);
|
||||||
outw(CSR3, DEPCA_ADDR); /* ALE control */
|
outw(CSR3, nic->ioaddr + DEPCA_ADDR); /* ALE control */
|
||||||
outw(ACON, DEPCA_DATA);
|
outw(ACON, nic->ioaddr + DEPCA_DATA);
|
||||||
outw(CSR0, DEPCA_ADDR); /* Point back to CSR0 */
|
outw(CSR0, nic->ioaddr + DEPCA_ADDR); /* Point back to CSR0 */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int InitRestartDepca(void)
|
static int InitRestartDepca(void)
|
||||||
|
@ -519,14 +519,14 @@ static int InitRestartDepca(void)
|
||||||
|
|
||||||
/* Copy the shadow init_block to shared memory */
|
/* Copy the shadow init_block to shared memory */
|
||||||
memcpy_toio((char *)lp.sh_mem, &lp.init_block, sizeof(struct depca_init));
|
memcpy_toio((char *)lp.sh_mem, &lp.init_block, sizeof(struct depca_init));
|
||||||
outw(CSR0, DEPCA_ADDR); /* point back to CSR0 */
|
outw(CSR0, nic->ioaddr + DEPCA_ADDR); /* point back to CSR0 */
|
||||||
outw(INIT, DEPCA_DATA); /* initialise DEPCA */
|
outw(INIT, nic->ioaddr + DEPCA_DATA); /* initialise DEPCA */
|
||||||
|
|
||||||
for (i = 0; i < 100 && !(inw(DEPCA_DATA) & IDON); i++)
|
for (i = 0; i < 100 && !(inw(nic->ioaddr + DEPCA_DATA) & IDON); i++)
|
||||||
;
|
;
|
||||||
if (i < 100) {
|
if (i < 100) {
|
||||||
/* clear IDON by writing a 1, and start LANCE */
|
/* clear IDON by writing a 1, and start LANCE */
|
||||||
outw(IDON | STRT, DEPCA_DATA);
|
outw(IDON | STRT, nic->ioaddr + DEPCA_DATA);
|
||||||
} else {
|
} else {
|
||||||
printf("DEPCA not initialised\n");
|
printf("DEPCA not initialised\n");
|
||||||
return (1);
|
return (1);
|
||||||
|
@ -542,11 +542,11 @@ static void depca_reset(struct nic *nic)
|
||||||
s16 nicsr;
|
s16 nicsr;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
STOP_DEPCA;
|
STOP_DEPCA(nic->ioaddr);
|
||||||
nicsr = inb(DEPCA_NICSR);
|
nicsr = inb(nic->ioaddr + DEPCA_NICSR);
|
||||||
nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
|
nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
|
||||||
outb(nicsr, DEPCA_NICSR);
|
outb(nicsr, nic->ioaddr + DEPCA_NICSR);
|
||||||
if (inw(DEPCA_DATA) != STOP)
|
if (inw(nic->ioaddr + DEPCA_DATA) != STOP)
|
||||||
{
|
{
|
||||||
printf("depca: Cannot stop NIC\n");
|
printf("depca: Cannot stop NIC\n");
|
||||||
return;
|
return;
|
||||||
|
@ -652,7 +652,7 @@ static void depca_disable ( struct nic *nic ) {
|
||||||
/* reset and disable merge */
|
/* reset and disable merge */
|
||||||
depca_reset(nic);
|
depca_reset(nic);
|
||||||
|
|
||||||
STOP_DEPCA;
|
STOP_DEPCA(nic->ioaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -685,24 +685,32 @@ static void depca_irq(struct nic *nic __unused, irq_action_t action __unused)
|
||||||
** PROM address counter is correctly positioned at the start of the
|
** PROM address counter is correctly positioned at the start of the
|
||||||
** ethernet address for later read out.
|
** ethernet address for later read out.
|
||||||
*/
|
*/
|
||||||
static int depca_probe1(struct nic *nic)
|
|
||||||
{
|
|
||||||
u8 data, nicsr;
|
/*
|
||||||
|
* Ugly, ugly, ugly. I can't quite make out where the split should be
|
||||||
|
* between probe1 and probe()...
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static u8 nicsr;
|
||||||
|
|
||||||
|
|
||||||
|
static int depca_probe1 ( uint16_t ioaddr ) {
|
||||||
|
u8 data;
|
||||||
/* This is only correct for little endian machines, but then
|
/* This is only correct for little endian machines, but then
|
||||||
Etherboot doesn't work on anything but a PC */
|
Etherboot doesn't work on anything but a PC */
|
||||||
u8 sig[] = { 0xFF, 0x00, 0x55, 0xAA, 0xFF, 0x00, 0x55, 0xAA };
|
u8 sig[] = { 0xFF, 0x00, 0x55, 0xAA, 0xFF, 0x00, 0x55, 0xAA };
|
||||||
int i, j;
|
int i, j;
|
||||||
long sum, chksum;
|
|
||||||
|
|
||||||
data = inb(DEPCA_PROM); /* clear counter on DEPCA */
|
data = inb(ioaddr + DEPCA_PROM); /* clear counter on DEPCA */
|
||||||
data = inb(DEPCA_PROM); /* read data */
|
data = inb(ioaddr + DEPCA_PROM); /* read data */
|
||||||
if (data == 0x8) {
|
if (data == 0x8) {
|
||||||
nicsr = inb(DEPCA_NICSR);
|
nicsr = inb(ioaddr + DEPCA_NICSR);
|
||||||
nicsr |= AAC;
|
nicsr |= AAC;
|
||||||
outb(nicsr, DEPCA_NICSR);
|
outb(nicsr, ioaddr + DEPCA_NICSR);
|
||||||
}
|
}
|
||||||
for (i = 0, j = 0; j < (int)sizeof(sig) && i < PROBE_LENGTH+((int)sizeof(sig))-1; ++i) {
|
for (i = 0, j = 0; j < (int)sizeof(sig) && i < PROBE_LENGTH+((int)sizeof(sig))-1; ++i) {
|
||||||
data = inb(DEPCA_PROM);
|
data = inb(ioaddr + DEPCA_PROM);
|
||||||
if (data == sig[j]) /* track signature */
|
if (data == sig[j]) /* track signature */
|
||||||
++j;
|
++j;
|
||||||
else
|
else
|
||||||
|
@ -711,27 +719,50 @@ static int depca_probe1(struct nic *nic)
|
||||||
if (j != sizeof(sig))
|
if (j != sizeof(sig))
|
||||||
return (0);
|
return (0);
|
||||||
/* put the card in its initial state */
|
/* put the card in its initial state */
|
||||||
STOP_DEPCA;
|
STOP_DEPCA(ioaddr);
|
||||||
nicsr = ((inb(DEPCA_NICSR) & ~SHE & ~RBE & ~IEN) | IM);
|
nicsr = ((inb(ioaddr + DEPCA_NICSR) & ~SHE & ~RBE & ~IEN) | IM);
|
||||||
outb(nicsr, DEPCA_NICSR);
|
outb(nicsr, ioaddr + DEPCA_NICSR);
|
||||||
if (inw(DEPCA_DATA) != STOP)
|
if (inw(ioaddr + DEPCA_DATA) != STOP)
|
||||||
return (0);
|
return (0);
|
||||||
memcpy((char *)mem_start, sig, sizeof(sig));
|
memcpy((char *)mem_start, sig, sizeof(sig));
|
||||||
if (memcmp((char *)mem_start, sig, sizeof(sig)) != 0)
|
if (memcmp((char *)mem_start, sig, sizeof(sig)) != 0)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct nic_operations depca_operations = {
|
||||||
|
.connect = dummy_connect,
|
||||||
|
.poll = depca_poll,
|
||||||
|
.transmit = depca_transmit,
|
||||||
|
.irq = depca_irq,
|
||||||
|
.disable = depca_disable,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
PROBE - Look for an adapter, this routine's visible to the outside
|
||||||
|
***************************************************************************/
|
||||||
|
static int depca_probe ( struct dev *dev, struct isa_device *isa ) {
|
||||||
|
struct nic *nic = nic_device ( dev );
|
||||||
|
int i, j;
|
||||||
|
long sum, chksum;
|
||||||
|
|
||||||
|
nic->irqno = 0;
|
||||||
|
nic->ioaddr = isa->ioaddr;
|
||||||
|
|
||||||
for (i = 0, j = 0, sum = 0; j < 3; j++) {
|
for (i = 0, j = 0, sum = 0; j < 3; j++) {
|
||||||
sum <<= 1;
|
sum <<= 1;
|
||||||
if (sum > 0xFFFF)
|
if (sum > 0xFFFF)
|
||||||
sum -= 0xFFFF;
|
sum -= 0xFFFF;
|
||||||
sum += (u8)(nic->node_addr[i++] = inb(DEPCA_PROM));
|
sum += (u8)(nic->node_addr[i++] = inb(nic->ioaddr + DEPCA_PROM));
|
||||||
sum += (u16)((nic->node_addr[i++] = inb(DEPCA_PROM)) << 8);
|
sum += (u16)((nic->node_addr[i++] = inb(nic->ioaddr + DEPCA_PROM)) << 8);
|
||||||
if (sum > 0xFFFF)
|
if (sum > 0xFFFF)
|
||||||
sum -= 0xFFFF;
|
sum -= 0xFFFF;
|
||||||
}
|
}
|
||||||
if (sum == 0xFFFF)
|
if (sum == 0xFFFF)
|
||||||
sum = 0;
|
sum = 0;
|
||||||
chksum = (u8)inb(DEPCA_PROM);
|
chksum = (u8)inb(nic->ioaddr + DEPCA_PROM);
|
||||||
chksum |= (u16)(inb(DEPCA_PROM) << 8);
|
chksum |= (u16)(inb(nic->ioaddr + DEPCA_PROM) << 8);
|
||||||
mem_len = (adapter == DEPCA) ? (48 << 10) : (64 << 10);
|
mem_len = (adapter == DEPCA) ? (48 << 10) : (64 << 10);
|
||||||
offset = 0;
|
offset = 0;
|
||||||
if (nicsr & BUF) {
|
if (nicsr & BUF) {
|
||||||
|
@ -740,58 +771,30 @@ static int depca_probe1(struct nic *nic)
|
||||||
mem_len -= (32 << 10);
|
mem_len -= (32 << 10);
|
||||||
}
|
}
|
||||||
if (adapter != DEPCA) /* enable shadow RAM */
|
if (adapter != DEPCA) /* enable shadow RAM */
|
||||||
outb(nicsr |= SHE, DEPCA_NICSR);
|
outb(nicsr |= SHE, nic->ioaddr + DEPCA_NICSR);
|
||||||
printf("%s base %#hX, memory [%#hX-%#hX], addr %!",
|
printf("%s base %#hX, memory [%#hX-%#hX], addr %!",
|
||||||
adapter_name[adapter], ioaddr, mem_start, mem_start + mem_len,
|
adapter_name[adapter], nic->ioaddr, mem_start,
|
||||||
|
mem_start + mem_len,
|
||||||
nic->node_addr);
|
nic->node_addr);
|
||||||
if (sum != chksum)
|
if (sum != chksum)
|
||||||
printf(" (bad checksum)");
|
printf(" (bad checksum)");
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
PROBE - Look for an adapter, this routine's visible to the outside
|
|
||||||
***************************************************************************/
|
|
||||||
static int depca_probe(struct dev *dev, unsigned short *probe_addrs)
|
|
||||||
{
|
|
||||||
struct nic *nic = (struct nic *)dev;
|
|
||||||
static unsigned short base[] = DEPCA_IO_PORTS;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (probe_addrs == 0 || probe_addrs[0] == 0)
|
|
||||||
probe_addrs = base; /* Use defaults */
|
|
||||||
for (i = 0; (ioaddr = base[i]) != 0; ++i) {
|
|
||||||
if (depca_probe1(nic))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ioaddr == 0)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
nic->irqno = 0;
|
|
||||||
nic->ioaddr = ioaddr & ~3;
|
|
||||||
|
|
||||||
depca_reset(nic);
|
depca_reset(nic);
|
||||||
/* point to NIC specific routines */
|
|
||||||
static struct nic_operations depca_operations;
|
|
||||||
static struct nic_operations depca_operations = {
|
|
||||||
.connect = dummy_connect,
|
|
||||||
.poll = depca_poll,
|
|
||||||
.transmit = depca_transmit,
|
|
||||||
.irq = depca_irq,
|
|
||||||
.disable = depca_disable,
|
|
||||||
}; nic->nic_op = &depca_operations;
|
|
||||||
|
|
||||||
/* Based on PnP ISA map */
|
/* point to NIC specific routines */
|
||||||
dev->devid.vendor_id = htons(GENERIC_ISAPNP_VENDOR);
|
nic->nic_op = &depca_operations;
|
||||||
dev->devid.device_id = htons(0x80f7);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct isa_driver depca_driver __isa_driver = {
|
static struct isa_probe_addr depca_probe_addrs[] = {
|
||||||
.type = NIC_DRIVER,
|
{ 0x300 }, { 0x200 },
|
||||||
.name = "DEPCA",
|
|
||||||
.probe = depca_probe,
|
|
||||||
.ioaddrs = 0,
|
|
||||||
};
|
};
|
||||||
ISA_ROM("depca","Digital DE100 and DE200");
|
|
||||||
|
static struct isa_driver depca_driver =
|
||||||
|
ISA_DRIVER ( "depca", depca_probe_addrs, depca_probe1,
|
||||||
|
GENERIC_ISAPNP_VENDOR, 0x80f7 );
|
||||||
|
|
||||||
|
BOOT_DRIVER ( "depce", find_isa_boot_device, depca_driver, depca_probe );
|
||||||
|
|
||||||
|
ISA_ROM ( "depca", "Digital DE100 and DE200" );
|
||||||
|
|
Loading…
Reference in New Issue