summaryrefslogtreecommitdiffstats
path: root/sys/pccard/pcic.c
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2000-08-10 17:35:11 +0000
committerimp <imp@FreeBSD.org>2000-08-10 17:35:11 +0000
commit8f29f4ff6f1f8a3f4bc94ab1c72c193e2a6df766 (patch)
tree024ae8608a7b7396791269327f1806dcaf510d9b /sys/pccard/pcic.c
parent26b98557922be64225e7edc7aa2a1e3cf519475c (diff)
downloadFreeBSD-src-8f29f4ff6f1f8a3f4bc94ab1c72c193e2a6df766.zip
FreeBSD-src-8f29f4ff6f1f8a3f4bc94ab1c72c193e2a6df766.tar.gz
Add some infrastructure support for dealing with large attribute
memory space needed by the raylink driver (in progress, nearing completion). This is a minorly cleaned up diff from Duncan to help him reduce the diffs from stock FreeBSD. Submitted by: Duncan Barclay <dmlb@ragnet.demon.co.uk>
Diffstat (limited to 'sys/pccard/pcic.c')
-rw-r--r--sys/pccard/pcic.c57
1 files changed, 52 insertions, 5 deletions
diff --git a/sys/pccard/pcic.c b/sys/pccard/pcic.c
index 4ba9b5c..8133883 100644
--- a/sys/pccard/pcic.c
+++ b/sys/pccard/pcic.c
@@ -923,10 +923,17 @@ pcic_set_res_flags(device_t bus, device_t child, int restype, int rid,
switch (restype) {
case SYS_RES_MEMORY: {
struct mem_desc *mp = &devi->slt->mem[rid];
- if (value)
- mp->flags |= MDF_ATTR;
- else
+ switch (value) {
+ case 0:
mp->flags &= ~MDF_ATTR;
+ break;
+ case 1:
+ mp->flags |= MDF_ATTR;
+ break;
+ case 2:
+ mp->flags &= ~MDF_16BITS;
+ break;
+ }
err = pcic_memory(devi->slt, rid);
break;
}
@@ -940,13 +947,52 @@ static int
pcic_get_res_flags(device_t bus, device_t child, int restype, int rid,
u_long *value)
{
- return (EOPNOTSUPP);
+ struct pccard_devinfo *devi = device_get_ivars(child);
+ int err = 0;
+
+ if (value == 0)
+ return (ENOMEM);
+
+ switch (restype) {
+ case SYS_RES_IOPORT: {
+ struct io_desc *ip = &devi->slt->io[rid];
+ *value = ip->flags;
+ break;
+ }
+ case SYS_RES_MEMORY: {
+ struct mem_desc *mp = &devi->slt->mem[rid];
+ *value = mp->flags;
+ break;
+ }
+ default:
+ err = EOPNOTSUPP;
+ }
+ return (0);
}
static int
pcic_set_memory_offset(device_t bus, device_t child, int rid, u_int32_t offset)
{
- return (EOPNOTSUPP);
+ struct pccard_devinfo *devi = device_get_ivars(child);
+ struct mem_desc *mp = &devi->slt->mem[rid];
+
+ mp->card = offset;
+
+ return (pcic_memory(devi->slt, rid));
+}
+
+static int
+pcic_get_memory_offset(device_t bus, device_t child, int rid, u_int32_t *offset)
+{
+ struct pccard_devinfo *devi = device_get_ivars(child);
+ struct mem_desc *mp = &devi->slt->mem[rid];
+
+ if (offset == 0)
+ return (ENOMEM);
+
+ *offset = mp->card;
+
+ return (0);
}
static device_method_t pcic_methods[] = {
@@ -971,6 +1017,7 @@ static device_method_t pcic_methods[] = {
DEVMETHOD(card_set_res_flags, pcic_set_res_flags),
DEVMETHOD(card_get_res_flags, pcic_get_res_flags),
DEVMETHOD(card_set_memory_offset, pcic_set_memory_offset),
+ DEVMETHOD(card_get_memory_offset, pcic_get_memory_offset),
{ 0, 0 }
};
OpenPOWER on IntegriCloud