Updated to new ISA API, but this driver probably has deeper problems.
authorMichael Brown <mcb30@etherboot.org>
Thu, 14 Apr 2005 21:18:36 +0000 (21:18 +0000)
committerMichael Brown <mcb30@etherboot.org>
Thu, 14 Apr 2005 21:18:36 +0000 (21:18 +0000)
src/drivers/net/depca.c

index 912bcac..45cc2d7 100644 (file)
@@ -1,3 +1,5 @@
+#warning "depca.c almost certainly won't work"
+
 /* Not fixed for relocation yet. Probably won't work relocated above 16MB */
 #ifdef ALLMULTI
 #error multicast support is not yet implemented
 #include "etherboot.h"
 #include "nic.h"
 #include "isa.h"
+#include "console.h"
 
 /*
 ** I/O addresses. Note that the 2k buffer option is not supported in
 ** this driver.
 */
-#define DEPCA_NICSR ioaddr+0x00   /* Network interface CSR */
-#define DEPCA_RBI   ioaddr+0x02   /* RAM buffer index (2k buffer mode) */
-#define DEPCA_DATA  ioaddr+0x04   /* LANCE registers' data port */
-#define DEPCA_ADDR  ioaddr+0x06   /* LANCE registers' address port */
-#define DEPCA_HBASE ioaddr+0x08   /* EISA high memory base address reg. */
-#define DEPCA_PROM  ioaddr+0x0c   /* Ethernet address ROM data port */
-#define DEPCA_CNFG  ioaddr+0x0c   /* EISA Configuration port */
-#define DEPCA_RBSA  ioaddr+0x0e   /* RAM buffer starting address (2k buff.) */
+#define DEPCA_NICSR 0x00   /* Network interface CSR */
+#define DEPCA_RBI   0x02   /* RAM buffer index (2k buffer mode) */
+#define DEPCA_DATA  0x04   /* LANCE registers' data port */
+#define DEPCA_ADDR  0x06   /* LANCE registers' address port */
+#define DEPCA_HBASE 0x08   /* EISA high memory base address reg. */
+#define DEPCA_PROM  0x0c   /* Ethernet address ROM data port */
+#define DEPCA_CNFG  0x0c   /* EISA Configuration port */
+#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 CSR1       1
 /*
 ** ISA Bus defines
 */
-#define DEPCA_IO_PORTS {0x300, 0x200, 0}
-
 #ifndef        DEPCA_MODEL
 #define        DEPCA_MODEL     DEPCA
 #endif
@@ -465,15 +466,14 @@ struct depca_private {
 
 static Address         mem_start = DEPCA_RAM_BASE;
 static Address         mem_len, offset;
-static unsigned short  ioaddr = 0;
 static struct depca_private    lp;
 
 /*
 ** Miscellaneous defines...
 */
-#define STOP_DEPCA \
-    outw(CSR0, DEPCA_ADDR);\
-    outw(STOP, DEPCA_DATA)
+#define STOP_DEPCA(ioaddr) \
+    outw(CSR0, ioaddr + DEPCA_ADDR);\
+    outw(STOP, ioaddr + DEPCA_DATA)
 
 /* Initialize the lance Rx and Tx descriptor rings. */
 static void depca_init_ring(struct nic *nic)
@@ -504,13 +504,13 @@ static void depca_init_ring(struct nic *nic)
 
 static void LoadCSRs(void)
 {
-       outw(CSR1, DEPCA_ADDR); /* initialisation block address LSW */
-       outw((u16) (lp.sh_mem & LA_MASK), DEPCA_DATA);
-       outw(CSR2, DEPCA_ADDR); /* initialisation block address MSW */
-       outw((u16) ((lp.sh_mem & LA_MASK) >> 16), DEPCA_DATA);
-       outw(CSR3, DEPCA_ADDR); /* ALE control */
-       outw(ACON, DEPCA_DATA);
-       outw(CSR0, DEPCA_ADDR); /* Point back to CSR0 */
+       outw(CSR1, nic->ioaddr + DEPCA_ADDR);   /* initialisation block address LSW */
+       outw((u16) (lp.sh_mem & LA_MASK), nic->ioaddr + DEPCA_DATA);
+       outw(CSR2, nic->ioaddr + DEPCA_ADDR);   /* initialisation block address MSW */
+       outw((u16) ((lp.sh_mem & LA_MASK) >> 16), nic->ioaddr + DEPCA_DATA);
+       outw(CSR3, nic->ioaddr + DEPCA_ADDR);   /* ALE control */
+       outw(ACON, nic->ioaddr + DEPCA_DATA);
+       outw(CSR0, nic->ioaddr + DEPCA_ADDR);   /* Point back to CSR0 */
 }
 
 static int InitRestartDepca(void)
@@ -519,14 +519,14 @@ static int InitRestartDepca(void)
 
        /* Copy the shadow init_block to shared memory */
        memcpy_toio((char *)lp.sh_mem, &lp.init_block, sizeof(struct depca_init));
-       outw(CSR0, DEPCA_ADDR);         /* point back to CSR0 */
-       outw(INIT, DEPCA_DATA);         /* initialise DEPCA */
+       outw(CSR0, nic->ioaddr + DEPCA_ADDR);           /* point back to CSR0 */
+       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) {
                /* clear IDON by writing a 1, and start LANCE */
-               outw(IDON | STRT, DEPCA_DATA);
+               outw(IDON | STRT, nic->ioaddr + DEPCA_DATA);
        } else {
                printf("DEPCA not initialised\n");
                return (1);
@@ -542,11 +542,11 @@ static void depca_reset(struct nic *nic)
        s16     nicsr;
        int     i, j;
 
-       STOP_DEPCA;
-       nicsr = inb(DEPCA_NICSR);
+       STOP_DEPCA(nic->ioaddr);
+       nicsr = inb(nic->ioaddr + DEPCA_NICSR);
        nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
-       outb(nicsr, DEPCA_NICSR);
-       if (inw(DEPCA_DATA) != STOP)
+       outb(nicsr, nic->ioaddr + DEPCA_NICSR);
+       if (inw(nic->ioaddr + DEPCA_DATA) != STOP)
        {
                printf("depca: Cannot stop NIC\n");
                return;
@@ -652,7 +652,7 @@ static void depca_disable ( struct nic *nic ) {
        /* reset and disable merge */
        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
 ** 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
           Etherboot doesn't work on anything but a PC */
        u8      sig[] = { 0xFF, 0x00, 0x55, 0xAA, 0xFF, 0x00, 0x55, 0xAA };
        int     i, j;
-       long    sum, chksum;
 
-       data = inb(DEPCA_PROM);         /* clear counter on DEPCA */
-       data = inb(DEPCA_PROM);         /* read data */
+       data = inb(ioaddr + DEPCA_PROM);                /* clear counter on DEPCA */
+       data = inb(ioaddr + DEPCA_PROM);                /* read data */
        if (data == 0x8) {
-               nicsr = inb(DEPCA_NICSR);
+               nicsr = inb(ioaddr + DEPCA_NICSR);
                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) {
-               data = inb(DEPCA_PROM);
+               data = inb(ioaddr + DEPCA_PROM);
                if (data == sig[j])             /* track signature */
                        ++j;
                else
@@ -711,27 +719,50 @@ static int depca_probe1(struct nic *nic)
        if (j != sizeof(sig))
                return (0);
        /* put the card in its initial state */
-       STOP_DEPCA;
-       nicsr = ((inb(DEPCA_NICSR) & ~SHE & ~RBE & ~IEN) | IM);
-       outb(nicsr, DEPCA_NICSR);
-       if (inw(DEPCA_DATA) != STOP)
+       STOP_DEPCA(ioaddr);
+       nicsr = ((inb(ioaddr + DEPCA_NICSR) & ~SHE & ~RBE & ~IEN) | IM);
+       outb(nicsr, ioaddr + DEPCA_NICSR);
+       if (inw(ioaddr + DEPCA_DATA) != STOP)
                return (0);
        memcpy((char *)mem_start, sig, sizeof(sig));
        if (memcmp((char *)mem_start, sig, sizeof(sig)) != 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++) {
                sum <<= 1;
                if (sum > 0xFFFF)
                        sum -= 0xFFFF;
-               sum += (u8)(nic->node_addr[i++] = inb(DEPCA_PROM));
-               sum += (u16)((nic->node_addr[i++] = inb(DEPCA_PROM)) << 8);
+               sum += (u8)(nic->node_addr[i++] = inb(nic->ioaddr + DEPCA_PROM));
+               sum += (u16)((nic->node_addr[i++] = inb(nic->ioaddr + DEPCA_PROM)) << 8);
                if (sum > 0xFFFF)
                        sum -= 0xFFFF;
        }
        if (sum == 0xFFFF)
                sum = 0;
-       chksum = (u8)inb(DEPCA_PROM);
-       chksum |= (u16)(inb(DEPCA_PROM) << 8);
+       chksum = (u8)inb(nic->ioaddr + DEPCA_PROM);
+       chksum |= (u16)(inb(nic->ioaddr + DEPCA_PROM) << 8);
        mem_len = (adapter == DEPCA) ? (48 << 10) : (64 << 10);
        offset = 0;
        if (nicsr & BUF) {
@@ -740,58 +771,30 @@ static int depca_probe1(struct nic *nic)
                mem_len -= (32 << 10);
        }
        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 %!",
-               adapter_name[adapter], ioaddr, mem_start, mem_start + mem_len,
-               nic->node_addr);
+              adapter_name[adapter], nic->ioaddr, mem_start,
+              mem_start + mem_len,
+              nic->node_addr);
        if (sum != chksum)
                printf(" (bad checksum)");
        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);
-       /* 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 */
-       dev->devid.vendor_id = htons(GENERIC_ISAPNP_VENDOR);
-       dev->devid.device_id = htons(0x80f7);
+       /* point to NIC specific routines */
+       nic->nic_op     = &depca_operations;
        return 1;
 }
 
-static struct isa_driver depca_driver __isa_driver = {
-       .type    = NIC_DRIVER,
-       .name    = "DEPCA",
-       .probe   = depca_probe,
-       .ioaddrs = 0,
+static struct isa_probe_addr depca_probe_addrs[] = {
+       { 0x300 }, { 0x200 },
 };
-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" );