diff options
author | sanpei <sanpei@FreeBSD.org> | 2000-09-17 15:37:53 +0000 |
---|---|---|
committer | sanpei <sanpei@FreeBSD.org> | 2000-09-17 15:37:53 +0000 |
commit | 62e0e10410c07cfb086acfffd093bbecd52cff35 (patch) | |
tree | 62261bcb4571e37f2fe5ce92ad2b845b3f212b9f /usr.sbin | |
parent | cb16f04f5df020842df077b1d1cbfe2b7352cf09 (diff) | |
download | FreeBSD-src-62e0e10410c07cfb086acfffd093bbecd52cff35.zip FreeBSD-src-62e0e10410c07cfb086acfffd093bbecd52cff35.tar.gz |
add PIOCSRESOURCE(IOC_GET_RESOURCE_RANGE)
Now /usr/sbin/pccardd read free resource(io,irq) range with
this ioctl.
Original Idea from: PAO3
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/pccard/pccardd/cardd.c | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/usr.sbin/pccard/pccardd/cardd.c b/usr.sbin/pccard/pccardd/cardd.c index e68182a..3a7153d 100644 --- a/usr.sbin/pccard/pccardd/cardd.c +++ b/usr.sbin/pccard/pccardd/cardd.c @@ -37,6 +37,7 @@ static const char rcsid[] = #include <fcntl.h> #include <ctype.h> #include <regex.h> +#include <machine/resource.h> #include <sys/ioctl.h> #include "cardd.h" @@ -486,13 +487,29 @@ assign_driver(struct card *cp) } /* Allocate a free IRQ if none has been specified */ if (conf->irq == 0) { - int i; - for (i = 1; i < 16; i++) - if (pool_irq[i]) { + struct pccard_resource resource; + char name[128]; + int i, fd; + + sprintf(name, CARD_DEVICE, 0); /* XXX sanpei */ + fd = open(name, O_RDWR); + + resource.type = SYS_RES_IRQ; + resource.size = 1; + for (i = 1; i < 16; i++) { + resource.min = i; + resource.max = i; + if (ioctl(fd, PIOCSRESOURCE, &resource) < 0) { + perror("ioctl (PIOCSRESOURCE)"); + exit(1); + } + if (pool_irq[i] && resource.resource_addr == i) { conf->irq = i; pool_irq[i] = 0; break; } + } + close(fd); if (conf->irq == 0) { logmsg("Failed to allocate IRQ for %s\n", cp->manuf); return (NULL); @@ -513,19 +530,33 @@ assign_card_index(struct cis * cis) { struct cis_config *cp; struct cis_ioblk *cio; - int i; + struct pccard_resource resource; + char name[128]; + int i, fd; + + sprintf(name, CARD_DEVICE, 0); /* XXX sanpei */ + fd = open(name, O_RDWR); + resource.type = SYS_RES_IOPORT; for (cp = cis->conf; cp; cp = cp->next) { if (!cp->iospace || !cp->io) continue; for (cio = cp->io; cio; cio = cio->next) { + resource.size = cio->size; for (i = cio->addr; i < cio->addr + cio->size - 1; i++) - if (!bit_test(io_avail, i)) + resource.min = i; + resource.max = resource.min + cio->size - 1; + if (ioctl(fd, PIOCSRESOURCE, &resource) < 0) { + perror("ioctl (PIOCSRESOURCE)"); + exit(1); + } + if (!bit_test(io_avail, i) || resource.resource_addr != i) goto next; } return cp; /* found */ next: } + close(fd); return cis->def_config; } |