diff options
author | imp <imp@FreeBSD.org> | 2000-08-10 17:35:11 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2000-08-10 17:35:11 +0000 |
commit | 8f29f4ff6f1f8a3f4bc94ab1c72c193e2a6df766 (patch) | |
tree | 024ae8608a7b7396791269327f1806dcaf510d9b /sys/pccard/pcic.c | |
parent | 26b98557922be64225e7edc7aa2a1e3cf519475c (diff) | |
download | FreeBSD-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.c | 57 |
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 } }; |