diff options
author | MIHIRA Sanpei Yoshiro <sanpei@FreeBSD.org> | 2000-10-01 12:36:14 +0000 |
---|---|---|
committer | MIHIRA Sanpei Yoshiro <sanpei@FreeBSD.org> | 2000-10-01 12:36:14 +0000 |
commit | 975ce2575a31e2f49cbc11fb45974682fa784606 (patch) | |
tree | 886bdcc8203c756a973cd4e7effbe318a4400041 /sys | |
parent | de9c893eeb0a824bba19865109c70fcf277410dc (diff) | |
download | src-975ce2575a31e2f49cbc11fb45974682fa784606.tar.gz src-975ce2575a31e2f49cbc11fb45974682fa784606.zip |
fix some minor problem in PIOCSRESOURCE ioctl.
- If resource which was allocated for pcic was
requested via this ioctl, bus_alloc_resource
would be succeeded and that resource was
returned as free resource. So check whether
requested resource was used for pcic or not
before bus_alloc_resource test.
- merge SYS_RES_IRQ routine into other SYS_RES_*
routine and clean up.
problem reported by: Yohei Terada <terada@jiro.c.u-tokyo.ac.jp>
Notes
Notes:
svn path=/head/; revision=66505
Diffstat (limited to 'sys')
-rw-r--r-- | sys/pccard/pccard.c | 19 |
1 files changed, 5 insertions, 14 deletions
diff --git a/sys/pccard/pccard.c b/sys/pccard/pccard.c index f3187a9b4b94..ca573defb63a 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; } |