summaryrefslogtreecommitdiff
path: root/sys/dev/pccard
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>1999-11-29 06:42:55 +0000
committerWarner Losh <imp@FreeBSD.org>1999-11-29 06:42:55 +0000
commit12bba6c259f1d26f0c245d3f26b89df26f280d0c (patch)
tree2b3bb182175a59355a48c5fe2d73b3ee42e49379 /sys/dev/pccard
parent00ecacd3c4dda87acb118d84abc278c6f8f737ca (diff)
Notes
Diffstat (limited to 'sys/dev/pccard')
-rw-r--r--sys/dev/pccard/pccard.c128
-rw-r--r--sys/dev/pccard/pccard_cis.c4
-rw-r--r--sys/dev/pccard/pccardchip.h2
-rw-r--r--sys/dev/pccard/pccardvar.h11
4 files changed, 126 insertions, 19 deletions
diff --git a/sys/dev/pccard/pccard.c b/sys/dev/pccard/pccard.c
index ccaeb3b5193e..ca1748dc130a 100644
--- a/sys/dev/pccard/pccard.c
+++ b/sys/dev/pccard/pccard.c
@@ -831,6 +831,11 @@ pccard_card_intrdebug(arg)
}
#endif
+#define PCCARD_NPORT 2
+#define PCCARD_NMEM 5
+#define PCCARD_NIRQ 1
+#define PCCARD_NDRQ 0
+
static int
pccard_add_children(device_t dev, int busno)
{
@@ -845,6 +850,116 @@ pccard_probe(device_t dev)
return pccard_add_children(dev, device_get_unit(dev));
}
+static void
+pccard_print_resources(struct resource_list *rl, const char *name, int type,
+ int count, const char *format)
+{
+ struct resource_list_entry *rle;
+ int printed;
+ int i;
+
+ printed = 0;
+ for (i = 0; i < count; i++) {
+ rle = resource_list_find(rl, type, i);
+ if (rle) {
+ if (printed == 0)
+ printf(" %s ", name);
+ else if (printed > 0)
+ printf(",");
+ printed++;
+ printf(format, rle->start);
+ if (rle->count > 1) {
+ printf("-");
+ printf(format, rle->start + rle->count - 1);
+ }
+ } else if (i > 3) {
+ /* check the first few regardless */
+ break;
+ }
+ }
+}
+
+static int
+pccard_print_child(device_t dev, device_t child)
+{
+ struct pccard_ivar *devi = (struct pccard_ivar *) device_get_ivars(child);
+ struct resource_list *rl = &devi->resources;
+ int retval = 0;
+
+ retval += bus_print_child_header(dev, child);
+ retval += printf(" at");
+
+ if (devi) {
+ pccard_print_resources(rl, "port", SYS_RES_IOPORT,
+ PCCARD_NPORT, "%#lx");
+ pccard_print_resources(rl, "iomem", SYS_RES_MEMORY,
+ PCCARD_NMEM, "%#lx");
+ pccard_print_resources(rl, "irq", SYS_RES_IRQ, PCCARD_NIRQ,
+ "%ld");
+ pccard_print_resources(rl, "drq", SYS_RES_DRQ, PCCARD_NDRQ,
+ "%ld");
+ retval += printf(" slot %d", devi->slotnum);
+ }
+
+ retval += bus_print_child_footer(dev, child);
+
+ return (retval);
+}
+
+static int
+pccard_set_resource(device_t dev, device_t child, int type, int rid,
+ u_long start, u_long count)
+{
+ struct pccard_ivar *devi = (struct pccard_ivar *) device_get_ivars(child);
+ struct resource_list *rl = &devi->resources;
+
+ if (type != SYS_RES_IOPORT && type != SYS_RES_MEMORY
+ && type != SYS_RES_IRQ && type != SYS_RES_DRQ)
+ return EINVAL;
+ if (rid < 0)
+ return EINVAL;
+ if (type == SYS_RES_IOPORT && rid >= PCCARD_NPORT)
+ return EINVAL;
+ if (type == SYS_RES_MEMORY && rid >= PCCARD_NMEM)
+ return EINVAL;
+ if (type == SYS_RES_IRQ && rid >= PCCARD_NIRQ)
+ return EINVAL;
+ if (type == SYS_RES_DRQ && rid >= PCCARD_NDRQ)
+ return EINVAL;
+
+ resource_list_add(rl, type, rid, start, start + count - 1, count);
+
+ return 0;
+}
+
+static int
+pccard_get_resource(device_t dev, device_t child, int type, int rid,
+ u_long *startp, u_long *countp)
+{
+ struct pccard_ivar *devi = (struct pccard_ivar *) device_get_ivars(child);
+ struct resource_list *rl = &devi->resources;
+ struct resource_list_entry *rle;
+
+ rle = resource_list_find(rl, type, rid);
+ if (!rle)
+ return ENOENT;
+
+ if (startp)
+ *startp = rle->start;
+ if (countp)
+ *countp = rle->count;
+
+ return 0;
+}
+
+static void
+pccard_delete_resource(device_t dev, device_t child, int type, int rid)
+{
+ struct pccard_ivar *devi = (struct pccard_ivar *) device_get_ivars(child);
+ struct resource_list *rl = &devi->resources;
+ resource_list_delete(rl, type, rid);
+}
+
static device_method_t pccard_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, pccard_probe),
@@ -854,23 +969,17 @@ static device_method_t pccard_methods[] = {
DEVMETHOD(device_resume, bus_generic_resume),
/* Bus interface */
-#if 0
DEVMETHOD(bus_print_child, pccard_print_child),
-#endif
DEVMETHOD(bus_driver_added, bus_generic_driver_added),
-#if 0
- DEVMETHOD(bus_alloc_resource, pccard_alloc_resource),
- DEVMETHOD(bus_release_resource, pccard_release_resource),
-#endif
+ DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource),
+ DEVMETHOD(bus_release_resource, bus_generic_release_resource),
DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
DEVMETHOD(bus_setup_intr, bus_generic_setup_intr),
DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr),
-#if 0
DEVMETHOD(bus_set_resource, pccard_set_resource),
DEVMETHOD(bus_get_resource, pccard_get_resource),
DEVMETHOD(bus_delete_resource, pccard_delete_resource),
-#endif
{ 0, 0 }
};
@@ -883,6 +992,7 @@ static driver_t pccard_driver = {
devclass_t pccard_devclass;
-DRIVER_MODULE(pccard, pcicx, pccard_driver, pccard_devclass, 0, 0);
+DRIVER_MODULE(pccard, pcic, pccard_driver, pccard_devclass, 0, 0);
DRIVER_MODULE(pccard, pc98pcic, pccard_driver, pccard_devclass, 0, 0);
DRIVER_MODULE(pccard, pccbb, pccard_driver, pccard_devclass, 0, 0);
+DRIVER_MODULE(pccard, tcic, pccard_driver, pccard_devclass, 0, 0);
diff --git a/sys/dev/pccard/pccard_cis.c b/sys/dev/pccard/pccard_cis.c
index 1924969f1acb..e09c52ac366f 100644
--- a/sys/dev/pccard/pccard_cis.c
+++ b/sys/dev/pccard/pccard_cis.c
@@ -1136,8 +1136,8 @@ pccard_parse_cis_tuple(tuple, arg)
reg = pccard_tuple_read_1(tuple, idx);
idx++;
- cfe->num_memspace = reg &
- PCCARD_TPCE_MS_COUNT + 1;
+ cfe->num_memspace = (reg &
+ PCCARD_TPCE_MS_COUNT) + 1;
if (cfe->num_memspace >
(sizeof(cfe->memspace) /
diff --git a/sys/dev/pccard/pccardchip.h b/sys/dev/pccard/pccardchip.h
index f67464371aba..b2a66354de35 100644
--- a/sys/dev/pccard/pccardchip.h
+++ b/sys/dev/pccard/pccardchip.h
@@ -86,7 +86,7 @@ struct pccard_chip_functions {
void (*socket_disable) __P((pccard_chipset_handle_t));
/* card detection */
- int (*card_detect) __P((pcmcia_chipset_handle_t));
+ int (*card_detect) __P((pccard_chipset_handle_t));
};
/* Memory space functions. */
diff --git a/sys/dev/pccard/pccardvar.h b/sys/dev/pccard/pccardvar.h
index 365fc792a593..8544247fe308 100644
--- a/sys/dev/pccard/pccardvar.h
+++ b/sys/dev/pccard/pccardvar.h
@@ -157,11 +157,10 @@ struct pccard_card {
STAILQ_HEAD(, pccard_function) pf_head;
};
-struct pccardbus_if {
- int (*if_card_attach) __P((struct device*));
- void (*if_card_detach) __P((struct device*, int));
- void (*if_card_deactivate) __P((struct device*));
- int (*if_card_gettype) __P((struct device*));
+/* More later? */
+struct pccard_ivar {
+ struct resource_list resources;
+ int slotnum;
};
struct pccard_softc {
@@ -183,8 +182,6 @@ struct pccard_softc {
*/
bus_addr_t iobase; /* start i/o space allocation here */
bus_size_t iosize; /* size of the i/o space range */
- /* pccardbus (upper) interface functions */
- struct pccardbus_if sc_if;
};
void