Index: sys/pccard/cardinfo.h =================================================================== RCS file: /home/ncvs/src/sys/pccard/cardinfo.h,v retrieving revision 1.16.2.1 diff -u -u -r1.16.2.1 cardinfo.h --- sys/pccard/cardinfo.h 2000/08/26 15:49:48 1.16.2.1 +++ sys/pccard/cardinfo.h 2000/10/02 05:25:34 @@ -49,6 +49,7 @@ #define PIOCSPOW _IOW('P', 9, struct power) /* Set power structure */ #define PIOCSVIR _IOW('P', 10, int) /* Virtual insert/remove */ #define PIOCSBEEP _IOW('P', 11, int) /* Select Beep */ +#define PIOCSRESOURCE _IOWR('P', 12, struct pccard_resource) /* get resource info */ /* * Debug codes. */ @@ -135,6 +136,18 @@ int vcc; int vpp; }; + +/* + * Th PC-Card resource IOC_GET_RESOURCE_RANGE + */ +struct pccard_resource { + int type; + u_long size; + u_long min; + u_long max; + u_long resource_addr; +}; + /* * Other system limits Index: sys/pccard/pccard.c =================================================================== RCS file: /home/ncvs/src/sys/pccard/pccard.c,v retrieving revision 1.106.2.2 diff -u -u -r1.106.2.2 pccard.c --- sys/pccard/pccard.c 2000/08/26 15:49:48 1.106.2.2 +++ sys/pccard/pccard.c 2000/10/02 05:25:34 @@ -460,7 +460,12 @@ struct slot *slt = pccard_slots[minor(dev)]; struct mem_desc *mp; struct io_desc *ip; + struct pccard_resource *pr; + struct resource *r; + device_t pcicdev; int s, err; + int rid = 1; + int i; int pwval; if (slt == 0 && cmd != PIOCRWMEM) @@ -608,6 +613,37 @@ case PIOCSBEEP: if (pccard_beep_select(*(int *)data)) { return EINVAL; + } + break; + case PIOCSRESOURCE: + pr = (struct pccard_resource *)data; + pr->resource_addr = ~0ul; + /* + * pccard_devclass does not have soft_c + * so we use pcic_devclass + */ + pcicdev = devclass_get_device(pcic_devclass, 0); + switch(pr->type) { + default: + return EINVAL; + case SYS_RES_IOPORT: + case SYS_RES_MEMORY: + 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); + if (r) { + pr->resource_addr = (u_long)rman_get_start(r); + bus_release_resource(pcicdev, pr->type, rid, r); + break; + } + } + } + break; } break; } Index: sys/pccard/pcic.h =================================================================== RCS file: /home/ncvs/src/sys/pccard/pcic.h,v retrieving revision 1.5.2.2 diff -u -u -r1.5.2.2 pcic.h --- sys/pccard/pcic.h 2000/08/03 01:08:04 1.5.2.2 +++ sys/pccard/pcic.h 2000/10/02 05:25:34 @@ -41,3 +41,4 @@ #define PCIC_RF_MDF_WS1 (0x08 << 16) #define PCIC_RF_MDF_ATTR (0x10 << 16) #define PCIC_RF_MDF_WP (0x20 << 16) +extern devclass_t pcic_devclass; Index: usr.sbin/pccard/pccardd/cardd.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/cardd.c,v retrieving revision 1.46.2.6 diff -u -u -r1.46.2.6 cardd.c --- usr.sbin/pccard/pccardd/cardd.c 2000/09/17 15:17:07 1.46.2.6 +++ usr.sbin/pccard/pccardd/cardd.c 2000/10/02 05:25:35 @@ -37,6 +37,7 @@ #include #include #include +#include #include #include "cardd.h" @@ -486,13 +487,29 @@ } /* 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 */ + 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,36 @@ { 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 */ + 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; + resource.min = cio->addr; + resource.max = resource.min + cio->size - 1; + if (ioctl(fd, PIOCSRESOURCE, &resource) < 0) { + perror("ioctl (PIOCSRESOURCE)"); + exit(1); + } + if (resource.resource_addr != cio->addr) + goto next; for (i = cio->addr; i < cio->addr + cio->size - 1; i++) if (!bit_test(io_avail, i)) goto next; } + close(fd); return cp; /* found */ next: } + close(fd); return cis->def_config; } @@ -649,12 +683,34 @@ sio->size = 1 << cp->io_addr; } if (sio->addr == 0) { - int i = bit_fns(io_avail, IOPORTS, - sio->size, sio->size); - if (i < 0) { + struct pccard_resource res; + char name[128]; + int i, j, fd; + + sprintf(name, CARD_DEVICE, 0); /* XXX */ + fd = open(name, O_RDWR); + + res.type = SYS_RES_IOPORT; + res.size = sio->size; + + for (i = 0; i < IOPORTS; i++) { + j = bit_fns(io_avail, IOPORTS, i, + sio->size, sio->size); + res.min = j; + res.max = j + sio->size - 1; + if (ioctl(fd, PIOCSRESOURCE, &res) < 0) { + perror("ioctl (PIOCSRESOURCE)"); + exit(1); + } + if (res.resource_addr == j) + break; + } + if (j < 0) { return (-1); + } else { + sio->addr = j; } - sio->addr = i; + close(fd); } bit_nclear(io_avail, sio->addr, sio->addr + sio->size - 1); Index: usr.sbin/pccard/pccardd/cardd.h =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/cardd.h,v retrieving revision 1.18.2.4 diff -u -u -r1.18.2.4 cardd.h --- usr.sbin/pccard/pccardd/cardd.h 2000/08/26 15:49:48 1.18.2.4 +++ usr.sbin/pccard/pccardd/cardd.h 2000/10/02 05:25:35 @@ -163,7 +163,7 @@ /* util.c functions */ unsigned long alloc_memory(int); -int bit_fns(bitstr_t *, int, int, int); +int bit_fns(bitstr_t *, int, int, int, int); void die(char *); void execute(struct cmd *, struct slot *); void logmsg(const char *, ...); Index: usr.sbin/pccard/pccardd/file.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/file.c,v retrieving revision 1.24.2.4 diff -u -u -r1.24.2.4 file.c --- usr.sbin/pccard/pccardd/file.c 2000/07/18 04:59:39 1.24.2.4 +++ usr.sbin/pccard/pccardd/file.c 2000/10/02 05:25:35 @@ -64,6 +64,7 @@ "include", /* 14 */ "function", /* 15 */ "logstr", /* 16 */ + "ignirq", /* 17 */ 0 }; @@ -83,6 +84,7 @@ #define KWD_INCLUDE 14 #define KWD_FUNCTION 15 #define KWD_LOGSTR 16 +#define KWD_IGNIRQ 17 /* for keyword compatibility with PAO/plain FreeBSD */ static struct { @@ -342,6 +344,12 @@ bzero(pool_irq, sizeof(pool_irq)); while ((i = irq_tok(0)) > 0) pool_irq[i] = 1; + pusht = 1; + break; + case KWD_IGNIRQ: + /* ignored irqs */ + while ((i = irq_tok(0)) > 0) + pool_irq[i] = 0; pusht = 1; break; case KWD_MEMORY: Index: usr.sbin/pccard/pccardd/pccard.conf.5 =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/pccard.conf.5,v retrieving revision 1.12.2.5 diff -u -u -r1.12.2.5 pccard.conf.5 --- usr.sbin/pccard/pccardd/pccard.conf.5 2000/09/15 19:19:28 1.12.2.5 +++ usr.sbin/pccard/pccardd/pccard.conf.5 2000/10/02 05:25:36 @@ -133,11 +133,17 @@ .Dl io Ar start - end ... .Dl memory Ar address size ... .Dl irq Ar irq-number ... +.Dl ignirq Ar irq-number ... .Pp Each of the statements define I/O, memory or IRQ blocks that can be used to allocate to drivers when they are initialized. .Pp +"ignirq" prohibits +.Xr pccardd 8 +to use +.Ar irq-number . +.Pp The syntax of the debuglevel parameter: .Pp .Dl debuglevel Ar level @@ -266,7 +272,8 @@ # Pool parameters. # io 0x280 - 0x2F0 0x300 - 0x360 -irq 5 6 8 9 10 15 +#irq 5 6 8 9 10 15 +ignirq 3 11 memory 0xd4000 96k memory 0xc4000 32k # Index: usr.sbin/pccard/pccardd/pccardd.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/pccardd.c,v retrieving revision 1.6.2.3 diff -u -u -r1.6.2.3 pccardd.c --- usr.sbin/pccard/pccardd/pccardd.c 2000/08/26 15:49:48 1.6.2.3 +++ usr.sbin/pccard/pccardd/pccardd.c 2000/10/02 05:25:36 @@ -212,6 +212,17 @@ /* Mem allocation done in MEMUNIT units. */ mem_avail = bit_alloc(MEMBLKS); mem_init = bit_alloc(MEMBLKS); + + /* + * initially all irqs are unused, + * and then set used irq by ignirq in readfile, + * or set free irqs by irq in readfile + * or set free irqs by -i option. + * And also check free irq by PIOCSRESOURCE ioctl. + */ + for (i = 1; i < 16; i++) + pool_irq[i] = 1; + readfile(config_file); if (irq_specified) { bcopy(irq_arg, pool_irq, sizeof(irq_arg)); Index: usr.sbin/pccard/pccardd/util.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/util.c,v retrieving revision 1.13.2.2 diff -u -u -r1.13.2.2 util.c --- usr.sbin/pccard/pccardd/util.c 2000/07/18 18:29:27 1.13.2.2 +++ usr.sbin/pccard/pccardd/util.c 2000/10/02 05:25:36 @@ -150,12 +150,12 @@ * least count number. */ int -bit_fns(bitstr_t *nm, int nbits, int count, int step) +bit_fns(bitstr_t *nm, int nbits, int min, int count, int step) { int i, j; int found = 0; - for (i = 0; i < nbits; i += step) + for (i = min; i < nbits; i += step) for (j = i, found = 0; j < nbits; j++) if (bit_test(nm, j)) { if (++found == count) @@ -173,7 +173,7 @@ { int i; - i = bit_fns(mem_avail, MEMBLKS, size / MEMUNIT + (size % MEMUNIT != 0), 1); + i = bit_fns(mem_avail, MEMBLKS, 0, size / MEMUNIT + (size % MEMUNIT != 0), 1); if (i < 0) return (0); bit_nclear(mem_avail, i, i + size / MEMUNIT + (size % MEMUNIT != 0) - 1);