summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authorsanpei <sanpei@FreeBSD.org>2000-09-21 13:13:00 +0000
committersanpei <sanpei@FreeBSD.org>2000-09-21 13:13:00 +0000
commit8723cf3500d346f3236ca20ab704516857dc1f4b (patch)
tree1cbc2acd27419279db539cbc1ab46629a65f6995 /usr.sbin
parent01521915aad24a1f7a7a677f51b20a4fc3d5f64b (diff)
downloadFreeBSD-src-8723cf3500d346f3236ca20ab704516857dc1f4b.zip
FreeBSD-src-8723cf3500d346f3236ca20ab704516857dc1f4b.tar.gz
add ``check free resource rage code''
for PC-Card which has no address in cis.
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/pccard/pccardd/cardd.c34
-rw-r--r--usr.sbin/pccard/pccardd/cardd.h2
-rw-r--r--usr.sbin/pccard/pccardd/util.c6
3 files changed, 32 insertions, 10 deletions
diff --git a/usr.sbin/pccard/pccardd/cardd.c b/usr.sbin/pccard/pccardd/cardd.c
index 6514c8a..5d4f4e3 100644
--- a/usr.sbin/pccard/pccardd/cardd.c
+++ b/usr.sbin/pccard/pccardd/cardd.c
@@ -491,7 +491,7 @@ assign_driver(struct card *cp)
char name[128];
int i, fd;
- sprintf(name, CARD_DEVICE, 0); /* XXX sanpei */
+ sprintf(name, CARD_DEVICE, 0); /* XXX */
fd = open(name, O_RDWR);
resource.type = SYS_RES_IRQ;
@@ -534,7 +534,7 @@ assign_card_index(struct cis * cis)
char name[128];
int i, fd;
- sprintf(name, CARD_DEVICE, 0); /* XXX sanpei */
+ sprintf(name, CARD_DEVICE, 0); /* XXX */
fd = open(name, O_RDWR);
resource.type = SYS_RES_IOPORT;
@@ -683,12 +683,34 @@ assign_io(struct slot *sp)
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 ;
+ 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);
diff --git a/usr.sbin/pccard/pccardd/cardd.h b/usr.sbin/pccard/pccardd/cardd.h
index 726a82b..f225d4f 100644
--- a/usr.sbin/pccard/pccardd/cardd.h
+++ b/usr.sbin/pccard/pccardd/cardd.h
@@ -163,7 +163,7 @@ void slot_change(struct slot *);
/* 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 *, ...);
diff --git a/usr.sbin/pccard/pccardd/util.c b/usr.sbin/pccard/pccardd/util.c
index aa44364..951d66a 100644
--- a/usr.sbin/pccard/pccardd/util.c
+++ b/usr.sbin/pccard/pccardd/util.c
@@ -150,12 +150,12 @@ newstr(char *p)
* 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 @@ alloc_memory(int size)
{
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);
OpenPOWER on IntegriCloud