summaryrefslogtreecommitdiff
path: root/sys/arch/amiga/isa
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/amiga/isa')
-rw-r--r--sys/arch/amiga/isa/if_isaed.c161
1 files changed, 100 insertions, 61 deletions
diff --git a/sys/arch/amiga/isa/if_isaed.c b/sys/arch/amiga/isa/if_isaed.c
index eca4d63d549..2071636a382 100644
--- a/sys/arch/amiga/isa/if_isaed.c
+++ b/sys/arch/amiga/isa/if_isaed.c
@@ -1,8 +1,8 @@
-/* $OpenBSD: if_isaed.c,v 1.6 1996/05/09 22:41:38 niklas Exp $ */
+/* $OpenBSD: if_isaed.c,v 1.7 1996/05/28 09:39:39 niklas Exp $ */
/*
- * Derived from sys/dev/isa/if.ed.c:
-* $NetBSD: if_ed.c,v 1.98 1996/05/07 01:55:13 thorpej Exp $
+ * Derived from sys/dev/isa/if_ed.c:
+ * $NetBSD: if_ed.c,v 1.98 1996/05/07 01:55:13 thorpej Exp $
*/
/*
@@ -23,6 +23,7 @@
*/
#include "bpfilter.h"
+#include "isaed.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -81,7 +82,7 @@ struct ed_softc {
bus_chipset_tag_t sc_bc; /* bus identifier */
bus_io_handle_t sc_ioh; /* io handle */
- bus_io_handle_t sc_delayioh; /* io handle for `delay port' XXX MI? */
+ bus_io_handle_t sc_delayioh; /* io handle for `delay port' */
bus_mem_handle_t sc_memh; /* bus memory handle */
bus_io_size_t asic_base; /* offset of ASIC I/O port */
@@ -155,9 +156,11 @@ void ed_pio_readmem __P((struct ed_softc *, u_short, caddr_t, u_short));
void ed_pio_writemem __P((struct ed_softc *, caddr_t, u_short, u_short));
u_short ed_pio_write_mbufs __P((struct ed_softc *, struct mbuf *, u_short));
-struct cfattach isaed_ca = {
+#if NISAED_ISA > 0
+struct cfattach isaed_isa_ca = {
sizeof(struct ed_softc), edprobe, edattach
};
+#endif
struct cfdriver isaed_cd = {
NULL, "isaed", DV_IFNET
@@ -167,17 +170,19 @@ struct cfdriver isaed_cd = {
#define ETHER_MAX_LEN 1518
#define ETHER_ADDR_LEN 6
-#define NIC_PUT(bc, ioh, nic, reg, val) \
- bus_io_write_1((bc), (ioh), ((nic) + (reg)), (val))
-#define NIC_GET(bc, ioh, nic, reg) \
- bus_io_read_1((bc), (ioh), ((nic) + (reg)))
+#if NISAED_PCMCIA > 0
+#include <dev/pcmcia/pcmciavar.h>
+
+int ed_pcmcia_match __P((struct device *, void *, void *));
+void ed_pcmcia_attach __P((struct device *, struct device *, void *));
+int ed_pcmcia_detach __P((struct device *));
-/*#include "pcmciabus.h"*/
-#if NPCMCIABUS > 0
+struct cfattach isaed_pcmcia_ca = {
+ sizeof(struct ed_softc), ed_pcmcia_match, edattach, ed_pcmcia_detach
+};
-#include <dev/pcmcia/pcmciabus.h>
-static int ed_probe_pcmcia_ne __P((struct device *, void *,
- void *, struct pcmcia_link *));
+static int ed_pcmcia_isa_attach __P((struct device *, void *,
+ void *, struct pcmcia_link *));
static int edmod __P((struct pcmcia_link *, struct device *,
struct pcmcia_conf *, struct cfdata *cf));
@@ -186,7 +191,7 @@ static int ed_remove __P((struct pcmcia_link *, struct device *));
/* additional setup needed for pcmcia devices */
static int
-ed_probe_pcmcia_ne(parent, match, aux, pc_link)
+ed_pcmcia_isa_attach(parent, match, aux, pc_link)
struct device *parent;
void *match;
void *aux;
@@ -200,17 +205,18 @@ ed_probe_pcmcia_ne(parent, match, aux, pc_link)
extern int ifqmaxlen;
u_char enaddr[ETHER_ADDR_LEN];
- if ((int)dev->param >= 0)
+ if ((int)dev->param != -1)
err = pcmcia_read_cis(pc_link, enaddr,
(int) dev->param, ETHER_ADDR_LEN);
else
err = 0;
if (err)
- printf("Cannot read cis info %d\n", err);
+ printf("%s: attaching ed: cannot read cis info %d\n",
+ parent->dv_xname, err);
- if (ed_probe_Novell(sc, cf, ia)) {
+ if (ed_find_Novell(sc, cf, ia)) {
delay(100);
- if ((int)dev->param >= 0) {
+ if ((int)dev->param != -1) {
err = pcmcia_read_cis(pc_link, sc->sc_arpcom.ac_enaddr,
(int) dev->param, ETHER_ADDR_LEN);
if (err) {
@@ -230,8 +236,8 @@ ed_probe_pcmcia_ne(parent, match, aux, pc_link)
sc->type_str = dev->model;
sc->sc_arpcom.ac_if.if_snd.ifq_maxlen=ifqmaxlen;
return 1;
- }
- return 0;
+ } else
+ return 0;
}
/* modify config entry */
@@ -243,16 +249,20 @@ edmod(pc_link, self, pc_cf, cf)
struct cfdata *cf;
{
int err;
- struct pcmciadevs *dev=pc_link->device;
- struct ed_softc *sc = (void *)self;
- int svec_card = strcmp(dev->manufacturer, "SVEC") == 0;
+/* struct pcmciadevs *dev=pc_link->device;*/
+/* struct ed_softc *sc = (void *)self;*/
+ int svec_card = pc_cf->memwin == 5;
int de650_0 = (pc_cf->memwin != 0) && !svec_card;
- err = pc_link->adapter->bus_link->bus_config(pc_link, self, pc_cf, cf);
+ err = PCMCIA_BUS_CONFIG(pc_link->adapter, pc_link, self, pc_cf, cf);
if (err)
return err;
if (svec_card) {
pc_cf->memwin = 0;
+#if 0
+ pc_cf->cfgid = 32; /* Try this if it still doesn't work */
+ pc_cf->cfgid |= 32; /* or Try this if it still doesn't work */
+#endif
}
if (de650_0) {
pc_cf->io[0].flags =
@@ -282,13 +292,15 @@ ed_remove(pc_link,self)
shutdownhook_disestablish(sc->sc_sh);
ifp->if_flags &= ~(IFF_RUNNING|IFF_UP);
sc->spec_flags |= ED_NOTPRESENT;
- return pc_link->adapter->bus_link->bus_unconfig(pc_link);
+ isa_intr_disestablish(sc->sc_bc, sc->sc_ih);
+ return PCMCIA_BUS_UNCONFIG(pc_link->adapter, pc_link);
}
static struct pcmcia_dlink {
struct pcmcia_device pcd;
-} pcmcia_dlink= {
- "PCMCIA Novell compatible", edmod, ed_probe_pcmcia_ne, NULL, ed_remove
+} pcmcia_dlink = {
+ {"PCMCIA Novell compatible", edmod, ed_pcmcia_isa_attach,
+ NULL, ed_remove}
};
struct pcmciadevs pcmcia_ed_devs[]={
@@ -304,16 +316,61 @@ struct pcmciadevs pcmcia_ed_devs[]={
"Socket EA PCMCIA LAN Adapter Revision D", "Ethernet ID 000000000000",
NULL, (void *) -1,
(void *)&pcmcia_dlink },
- /* probably not right for ethernet address--card does not seem to
- have it anywhere. */
+ /* something screwed up in ports requested */
{ "ed", 0, "SVEC", "FD605 PCMCIA EtherNet Card", "V1-1", NULL,
- (void *)0xb4, (void *)&pcmcia_dlink },
- { "ed", 0, "PMX ", "PE-200", "ETHERNET", "R01", (void *) 0x110,
- (void *)&pcmcia_dlink }, /* 0x110 is a guess */
+ (void *)-1, (void *)&pcmcia_dlink },
+#if 0
+ /* not quite right for ethernet adress */
+ { "ed", 0, "PMX ", "PE-200", "ETHERNET", "R01", (void *)-1,
+ (void *)&pcmcia_dlink },
+#endif
{ NULL }
};
+
+#define ned_pcmcia_devs sizeof(pcmcia_ed_devs)/sizeof(pcmcia_ed_devs[0])
+
+int
+ed_pcmcia_match(parent, match, aux)
+ struct device *parent;
+ void *match, *aux;
+{
+ return pcmcia_slave_match(parent, match, aux, pcmcia_ed_devs,
+ ned_pcmcia_devs);
+}
+
+void
+ed_pcmcia_attach(parent, self, aux)
+ struct device *parent, *self;
+ void *aux;
+{
+ struct pcmcia_attach_args *paa = aux;
+
+ printf("ed_pcmcia_attach %p %p %p\n", parent, self, aux);
+ delay(2000000);
+ if (!pcmcia_configure(parent, self, paa->paa_link)) {
+ struct ed_softc *sc = (void *)self;
+ sc->spec_flags |= ED_NOTPRESENT;
+ printf(": not attached\n");
+ }
+}
+
+/*
+ * No detach; network devices are too well linked into the rest of the
+ * kernel.
+ */
+int
+ed_pcmcia_detach(self)
+ struct device *self;
+{
+ return EBUSY;
+}
+
#endif
+#define NIC_PUT(bc, ioh, nic, reg, val) \
+ bus_io_write_1((bc), (ioh), ((nic) + (reg)), (val))
+#define NIC_GET(bc, ioh, nic, reg) \
+ bus_io_read_1((bc), (ioh), ((nic) + (reg)))
/*
* Determine if the device is present.
@@ -338,6 +395,13 @@ ed_find(sc, cf, ia)
struct cfdata *cf;
struct isa_attach_args *ia;
{
+
+ /*
+ * As many NE2000 clones provide extra functionality such as shared
+ * memory, they are susceptible to random thrashing by the other
+ * probes, so place it first. I don't know if this might hurt
+ * WD/SMC or 3Com cards. If so, please tell niklas@appli.se!
+ */
if (ed_find_Novell(sc, cf, ia))
return (1);
if (ed_find_WD80x3(sc, cf, ia))
@@ -399,7 +463,6 @@ ed_find_WD80x3(sc, cf, ia)
{
bus_chipset_tag_t bc;
bus_io_handle_t ioh;
- /* XXX Read for 1.25 usec delay. Is this MI? */
bus_io_handle_t delayioh = ia->ia_delayioh;
bus_mem_handle_t memh;
u_int memsize;
@@ -739,7 +802,6 @@ ed_find_WD80x3(sc, cf, ia)
bus_io_write_1(bc, ioh, asicbase + ED_WD_MSR,
sc->wd_msr_proto | ED_WD_MSR_MENB);
- /* XXX 2.5 usec delay. This code works on i386, but is it MI? */
(void) bus_io_read_1(bc, delayioh, 0);
(void) bus_io_read_1(bc, delayioh, 0);
@@ -759,10 +821,6 @@ ed_find_WD80x3(sc, cf, ia)
if (isa16bit)
bus_io_write_1(bc, ioh, asicbase + ED_WD_LAAR,
sc->wd_laar_proto);
- /*
- * XXX 2.5 usec delay. This code works on i386,
- * but is it MI?
- */
(void) bus_io_read_1(bc, delayioh, 0);
(void) bus_io_read_1(bc, delayioh, 0);
goto out;
@@ -780,7 +838,6 @@ ed_find_WD80x3(sc, cf, ia)
if (isa16bit)
bus_io_write_1(bc, ioh, asicbase + ED_WD_LAAR,
sc->wd_laar_proto);
- /* XXX 2.5 usec delay. This code works on i386, but is it MI? */
(void) bus_io_read_1(bc, delayioh, 0);
(void) bus_io_read_1(bc, delayioh, 0);
@@ -1356,7 +1413,6 @@ edattach(parent, self, aux)
ioh = sc->sc_ioh; /* XXX */
asicbase = sc->asic_base;
- /* XXX Read for 1.25 usec delay. Is this MI? */
sc->sc_delayioh = ia->ia_delayioh;
/* Set interface to stopped condition (reset). */
@@ -1755,10 +1811,6 @@ outloop:
sc->wd_laar_proto | ED_WD_LAAR_M16EN);
bus_io_write_1(bc, ioh, asicbase + ED_WD_MSR,
sc->wd_msr_proto | ED_WD_MSR_MENB);
- /*
- * XXX 2.5 usec delay. This code works on i386,
- * but is it MI?
- */
(void) bus_io_read_1(bc, sc->sc_delayioh, 0);
(void) bus_io_read_1(bc, sc->sc_delayioh, 0);
break;
@@ -1785,10 +1837,6 @@ outloop:
if (sc->isa16bit)
bus_io_write_1(bc, ioh, asicbase + ED_WD_LAAR,
sc->wd_laar_proto);
- /*
- * XXX 2.5 usec delay. This code works on i386,
- * but is it MI?
- */
(void) bus_io_read_1(bc, sc->sc_delayioh, 0);
(void) bus_io_read_1(bc, sc->sc_delayioh, 0);
break;
@@ -1885,10 +1933,9 @@ loop:
len = (len & ED_PAGE_MASK) | (nlen << ED_PAGE_SHIFT);
#ifdef DIAGNOSTIC
if (len != bus_to_host_2(bc, packet_hdr.count)) {
- printf("%s: length does not match next packet "
- "pointer\n", sc->sc_dev.dv_xname);
- printf("%s: len %04x nlen %04x start %02x first %02x "
- "curr %02x next %02x stop %02x\n",
+ printf("%s: length does not match next packet pointer\n",
+ sc->sc_dev.dv_xname);
+ printf("%s: len %04x nlen %04x start %02x first %02x curr %02x next %02x stop %02x\n",
sc->sc_dev.dv_xname,
bus_to_host_2(bc, packet_hdr.count), len,
sc->rec_page_start, sc->next_packet, current,
@@ -2087,10 +2134,6 @@ edintr(arg)
bus_io_write_1(bc, ioh,
asicbase + ED_WD_MSR,
sc->wd_msr_proto | ED_WD_MSR_MENB);
- /*
- * XXX 2.5 usec delay. This code
- * works on i386, but is it MI?
- */
(void) bus_io_read_1(bc,
sc->sc_delayioh, 0);
(void) bus_io_read_1(bc,
@@ -2108,10 +2151,6 @@ edintr(arg)
bus_io_write_1(bc, ioh,
asicbase + ED_WD_LAAR,
sc->wd_laar_proto);
- /*
- * XXX 2.5 usec delay. This code
- * works on i386, but is it MI?
- */
(void) bus_io_read_1(bc,
sc->sc_delayioh, 0);
(void) bus_io_read_1(bc,