summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/pccard/pccard.c19
-rw-r--r--usr.sbin/pccard/pccardd/cardd.c4
2 files changed, 7 insertions, 16 deletions
diff --git a/sys/pccard/pccard.c b/sys/pccard/pccard.c
index f3187a9..ca573de 100644
--- a/sys/pccard/pccard.c
+++ b/sys/pccard/pccard.c
@@ -626,7 +626,11 @@ crdioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct proc *p)
return EINVAL;
case SYS_RES_IOPORT:
case SYS_RES_MEMORY:
- for (i = pr->min; i + pr->size <= pr->max; i++) {
+ case SYS_RES_IRQ:
+ for (i = pr->min; i + pr->size - 1 <= pr->max; i++) {
+ /* already allocated to pcic? */
+ if (bus_get_resource_start(pcicdev, pr->type, 0) == i)
+ continue;
err = bus_set_resource(pcicdev, pr->type, rid, i, pr->size);
if (!err) {
r = bus_alloc_resource(pcicdev, pr->type, &rid, 0ul, ~0ul, pr->size, 0);
@@ -638,19 +642,6 @@ crdioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct proc *p)
}
}
break;
- case SYS_RES_IRQ:
- for (i = pr->min; i <= pr->max; i++) {
- err = bus_set_resource(pcicdev, SYS_RES_IRQ, rid, i, 1);
- if (!err) {
- r = bus_alloc_resource(pcicdev, SYS_RES_IRQ, &rid, 0ul, ~0ul, 1, 0);
- if (r) {
- pr->resource_addr = (u_long)rman_get_start(r);
- bus_release_resource(pcicdev, SYS_RES_IRQ, rid, r);
- break;
- }
- }
- }
- break;
}
break;
}
diff --git a/usr.sbin/pccard/pccardd/cardd.c b/usr.sbin/pccard/pccardd/cardd.c
index 5d4f4e3..881cfe1 100644
--- a/usr.sbin/pccard/pccardd/cardd.c
+++ b/usr.sbin/pccard/pccardd/cardd.c
@@ -544,7 +544,7 @@ assign_card_index(struct cis * cis)
for (cio = cp->io; cio; cio = cio->next) {
resource.size = cio->size;
resource.min = cio->addr;
- resource.max = resource.min + cio->size;
+ resource.max = resource.min + cio->size - 1;
if (ioctl(fd, PIOCSRESOURCE, &resource) < 0) {
perror("ioctl (PIOCSRESOURCE)");
exit(1);
@@ -697,7 +697,7 @@ assign_io(struct slot *sp)
j = bit_fns(io_avail, IOPORTS, i,
sio->size, sio->size);
res.min = j;
- res.max = j + sio->size ;
+ res.max = j + sio->size - 1;
if (ioctl(fd, PIOCSRESOURCE, &res) < 0) {
perror("ioctl (PIOCSRESOURCE)");
exit(1);
OpenPOWER on IntegriCloud