summaryrefslogtreecommitdiffstats
path: root/sys/dev/pcic
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2000-06-18 05:25:30 +0000
committerimp <imp@FreeBSD.org>2000-06-18 05:25:30 +0000
commit6e1779c22cb708d678c03c8108494dd747ad4c10 (patch)
tree70425afc1046f2ac4d1c8db2a05f6ed690774b4b /sys/dev/pcic
parentaa110f18116476f57981f5d29a8e11925281ba4d (diff)
downloadFreeBSD-src-6e1779c22cb708d678c03c8108494dd747ad4c10.zip
FreeBSD-src-6e1779c22cb708d678c03c8108494dd747ad4c10.tar.gz
Almost make loading work. This is a checkpoint. With these change we
can almost kldload this. More work is ncessary, but I wanted to checkpoint this now.
Diffstat (limited to 'sys/dev/pcic')
-rw-r--r--sys/dev/pcic/i82365.c55
-rw-r--r--sys/dev/pcic/i82365_isa.c72
-rw-r--r--sys/dev/pcic/i82365var.h1
3 files changed, 85 insertions, 43 deletions
diff --git a/sys/dev/pcic/i82365.c b/sys/dev/pcic/i82365.c
index f99e9f3..39438a0 100644
--- a/sys/dev/pcic/i82365.c
+++ b/sys/dev/pcic/i82365.c
@@ -64,13 +64,15 @@
#ifdef PCICDEBUG
int pcic_debug = 1;
-#define DPRINTF(arg) if (pcic_debug) printf arg;
-#define DEVPRINTF(arg) if (pcic_debug) device_printf arg;
+#define DPRINTF(arg) if (pcic_debug) printf arg; else ;
+#define DEVPRINTF(arg) if (pcic_debug) device_printf arg; else ;
#else
#define DPRINTF(arg)
#define DEVPRINTF(arg)
#endif
+#define VERBOSE(arg) if (bootverbose) printf arg; else ;
+
#define DETACH_FORCE 0x1
#define PCIC_VENDOR_UNKNOWN 0
@@ -90,7 +92,6 @@ static void pcic_init_socket(struct pcic_handle *);
static void pcic_intr_socket(struct pcic_handle *);
-static void pcic_deactivate(device_t dev);
static int pcic_activate(device_t dev);
static void pcic_intr(void *arg);
@@ -206,27 +207,23 @@ pcic_activate(device_t dev)
sc->port_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port_rid,
0, ~0, PCIC_IOSIZE, RF_ACTIVE);
if (!sc->port_res) {
-#ifdef PCIC_DEBUG
device_printf(dev, "Cannot allocate ioport\n");
-#endif
return ENOMEM;
}
sc->irq_rid = 0;
sc->irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->irq_rid,
0, ~0, 1, RF_ACTIVE);
- if (!sc->irq_res) {
-#ifdef PCIC_DEBUG
- device_printf(dev, "Cannot allocate irq\n");
-#endif
- pcic_deactivate(dev);
- return ENOMEM;
- }
- sc->irq = rman_get_start(sc->irq_res);
- if ((err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET, pcic_intr,
- sc, &sc->intrhand)) != 0) {
- pcic_deactivate(dev);
- return err;
+ if (sc->irq_res) {
+ sc->irq = rman_get_start(sc->irq_res);
+ if ((err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET,
+ pcic_intr, sc, &sc->intrhand)) != 0) {
+ pcic_deactivate(dev);
+ return err;
+ }
+ } else {
+ /* XXX Do polling */
+ return (ENXIO);
}
/* XXX This might not be needed in future, get it directly from
@@ -234,10 +231,8 @@ pcic_activate(device_t dev)
sc->mem_rid = 0;
sc->mem_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->mem_rid,
0, ~0, 1 << 13, RF_ACTIVE);
- if (!sc->mem_res) {
-#ifdef PCIC_DEBUG
+ if (sc->mem_res == NULL) {
device_printf(dev, "Cannot allocate mem\n");
-#endif
pcic_deactivate(dev);
return ENOMEM;
}
@@ -250,7 +245,7 @@ pcic_activate(device_t dev)
return (0);
}
-static void
+void
pcic_deactivate(device_t dev)
{
struct pcic_softc *sc = device_get_softc(dev);
@@ -291,12 +286,13 @@ pcic_attach(device_t dev)
/*
* this could be done with a loop, but it would violate the
- * abstraction... so? --imp
+ * abstraction... --- unknown
+ * so? I don't see the abstraction... --imp
*/
count = 0;
- DPRINTF(("pcic ident regs:"));
+ VERBOSE(("pcic ident regs:"));
sc->handle[0].sc = sc;
sc->handle[0].sock = C0SA;
@@ -313,7 +309,7 @@ pcic_attach(device_t dev)
}
sc->handle[0].laststate = PCIC_LASTSTATE_EMPTY;
- DPRINTF((" 0x%02x", reg));
+ VERBOSE((" 0x%02x", reg));
sc->handle[1].sc = sc;
sc->handle[1].sock = C0SB;
@@ -330,7 +326,7 @@ pcic_attach(device_t dev)
}
sc->handle[1].laststate = PCIC_LASTSTATE_EMPTY;
- DPRINTF((" 0x%02x", reg));
+ VERBOSE((" 0x%02x", reg));
/*
* The CL-PD6729 has only one controller and always returns 0
@@ -355,7 +351,7 @@ pcic_attach(device_t dev)
}
sc->handle[2].laststate = PCIC_LASTSTATE_EMPTY;
- DPRINTF((" 0x%02x", reg));
+ VERBOSE((" 0x%02x", reg));
sc->handle[3].sc = sc;
sc->handle[3].sock = C1SB;
@@ -373,7 +369,7 @@ pcic_attach(device_t dev)
}
sc->handle[3].laststate = PCIC_LASTSTATE_EMPTY;
- DPRINTF((" 0x%02x\n", reg));
+ VERBOSE((" 0x%02x\n", reg));
} else {
sc->handle[2].flags = 0;
sc->handle[3].flags = 0;
@@ -674,9 +670,7 @@ pcic_intr_socket(struct pcic_handle *h)
/* Deactivate the card now. */
DEVPRINTF((h->dev, "detaching card\n"));
pcic_detach_card(h, DETACH_FORCE);
-
- DEVPRINTF((h->dev,
- "enqueing REMOVAL event\n"));
+ DEVPRINTF((h->dev,"enqueing REMOVAL event\n"));
pcic_queue_event(h, PCIC_EVENT_REMOVAL);
}
h->laststate = ((statreg & PCIC_IF_STATUS_CARDDETECT_MASK) == 0)
@@ -720,7 +714,6 @@ pcic_attach_card(struct pcic_handle *h)
if (!(h->flags & PCIC_FLAG_CARDP)) {
/* call the MI attach function */
CARD_ATTACH_CARD(h->dev);
-
h->flags |= PCIC_FLAG_CARDP;
} else {
DPRINTF(("pcic_attach_card: already attached"));
diff --git a/sys/dev/pcic/i82365_isa.c b/sys/dev/pcic/i82365_isa.c
index f399521..e7ddfb3 100644
--- a/sys/dev/pcic/i82365_isa.c
+++ b/sys/dev/pcic/i82365_isa.c
@@ -60,12 +60,6 @@
* Configurable parameters.
*****************************************************************************/
-#if 0
-#include "opt_pcic_isa_alloc_iobase.h"
-#include "opt_pcic_isa_alloc_iosize.h"
-#include "opt_pcic_isa_intr_alloc_mask.h"
-#endif
-
/*
* Default I/O allocation range. If both are set to non-zero, these
* values will be used instead. Otherwise, the code attempts to probe
@@ -227,6 +221,7 @@ pcic_isa_bus_width_probe (device_t dev)
}
}
+#if 0
static int
pcic_isa_check(device_t dev, u_int16_t addr)
{
@@ -273,10 +268,12 @@ pcic_isa_check(device_t dev, u_int16_t addr)
return (found);
}
+#endif
static void
pcic_isa_identify(driver_t *driver, device_t parent)
{
+#if 0
device_t child;
u_int16_t ioaddrs[] = { 0x3e0, 0x3e2, 0x3e4, 0x3e6, 0 };
u_int16_t ioaddr;
@@ -295,12 +292,17 @@ pcic_isa_identify(driver_t *driver, device_t parent)
PCIC_IOSIZE);
}
}
+#endif
}
static int
pcic_isa_probe(device_t dev)
{
int error;
+ struct resource *res;
+ int rid;
+ int i;
+ u_long mem;
/* Check isapnp ids */
error = ISA_PNP_PROBE(device_get_parent(dev), dev, pcic_ids);
@@ -308,17 +310,62 @@ pcic_isa_probe(device_t dev)
return (ENXIO);
/* If we had some other problem. */
- if (!(error == 0 || error == ENOENT)) {
+ if (!(error == 0 || error == ENOENT))
return (error);
- }
/* If we have the resources we need then we're good to go. */
- if ((bus_get_resource_start(dev, SYS_RES_IOPORT, 0) != 0) &&
- (bus_get_resource_start(dev, SYS_RES_IRQ, 0) != 0)) {
- return (0);
+ if (bus_get_resource_start(dev, SYS_RES_IOPORT, 0) == 0)
+ return (ENXIO);
+
+ rid = 0;
+ res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1, RF_ACTIVE);
+ if (res == NULL) {
+ /*
+ * No IRQ specified, find one. This can be due to the PnP
+ * data not specifying any IRQ
+ */
+ for (i = 0; res == NULL && i < 16; i++) {
+ if (((1 << i) & PCIC_INTR_IRQ_VALIDMASK) == 0)
+ continue;
+ res = bus_alloc_resource(dev, SYS_RES_IRQ,
+ &rid, i, i, 1, RF_ACTIVE);
+ }
+ if (res == NULL)
+ return (ENXIO);
+ mem = rman_get_start(res);
+ bus_release_resource(dev, SYS_RES_IRQ, rid, res);
+ bus_set_resource(dev, SYS_RES_IRQ, 0, mem, 1);
+ } else {
+ bus_release_resource(dev, SYS_RES_IRQ, rid, res);
+ }
+
+ /* XXX This might not be needed in future, get it directly from
+ * XXX parent */
+ rid = 0;
+ res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 0, ~0,
+ 1 << 13, RF_ACTIVE);
+ if (res == NULL) {
+ /*
+ * We failed to get memory. Since this XXX comment above
+ * indicates that this is transient, we try to get a hunk
+ * of memory in the isa hole. Sure would be nice if there
+ * were some MI constants for this.
+ */
+ res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
+ 0xa0000, 0xdffff, 1 << 13, RF_ACTIVE);
+ if (res != NULL) {
+ mem = rman_get_start(res);
+ bus_release_resource(dev, SYS_RES_MEMORY, res, rid);
+ bus_set_resource(dev, SYS_RES_MEMORY, 0, mem, 1 << 13);
+ }
+ }
+ if (res == NULL) {
+ device_printf(dev, "Cannot allocate mem\n");
+ return ENOMEM;
}
+ bus_release_resource(dev, SYS_RES_MEMORY, rid, res);
- return (ENXIO);
+ return (0);
}
static int
@@ -335,6 +382,7 @@ pcic_isa_attach(device_t dev)
static int
pcic_isa_detach(device_t dev)
{
+ pcic_deactivate(dev);
return 0;
}
diff --git a/sys/dev/pcic/i82365var.h b/sys/dev/pcic/i82365var.h
index 5a0c723..f14f3ed 100644
--- a/sys/dev/pcic/i82365var.h
+++ b/sys/dev/pcic/i82365var.h
@@ -176,6 +176,7 @@ int pcic_activate_resource(device_t dev, device_t child, int type, int rid,
struct resource *r);
struct resource *pcic_alloc_resource(device_t dev, device_t child, int type,
int *rid, u_long start, u_long end, u_long count, u_int flags);
+void pcic_deactivate(device_t dev);
int pcic_deactivate_resource(device_t dev, device_t child, int type, int rid,
struct resource *r);
int pcic_release_resource(device_t dev, device_t child, int type, int rid,
OpenPOWER on IntegriCloud