From owner-freebsd-mobile Mon Jan 24 12:42:47 2000 Delivered-To: freebsd-mobile@freebsd.org Received: from tasogare.imasy.or.jp (tasogare.imasy.or.jp [202.227.24.5]) by hub.freebsd.org (Postfix) with ESMTP id DA1E3158E8 for ; Mon, 24 Jan 2000 12:42:41 -0800 (PST) (envelope-from iwasaki@jp.FreeBSD.org) Received: from localhost (isdnb35.imasy.or.jp [202.227.24.163]) by tasogare.imasy.or.jp (8.9.3+3.2W/3.7W-tasogare/smtpfeed 1.01) with ESMTP id FAA02072 for ; Tue, 25 Jan 2000 05:42:30 +0900 (JST) (envelope-from iwasaki@jp.FreeBSD.org) Message-Id: <200001242042.FAA02072@tasogare.imasy.or.jp> To: mobile@freebsd.org Subject: pccardd patch [Auto select config index] X-Mailer: Mew version 1.93 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Date: Tue, 25 Jan 2000 05:42:29 +0900 From: Mitsuru IWASAKI X-Dispatcher: imput version 980905(IM100) Lines: 204 Sender: owner-freebsd-mobile@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org Hi, Attached patch allow you to specify config index something like config auto "sio3" ? or config default "ed0" ? in your pccard.conf like PAO configuration. There are a lot of sio (sio1, 2, 3, 4 are mixed) entries in pccard.conf.sample, but it seems we don't have guidelines for new entry registration. Once we get guideline, we just rewrite pccard.conf.sample. But it is not easy to survey again to get suitable config index for many cards... Then I made following patch, we don't need to survey again, just put `auto' as config index and "sio3" (or sio4) as driver name in usual cases. Specifying `auto', pccardd try to find cis_config entry which have available i/o port dynamically. Would this be one of the 4.0-RELEASE candidates? Index: cardd.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/cardd.c,v retrieving revision 1.45 diff -u -r1.45 cardd.c --- cardd.c 2000/01/24 13:15:05 1.45 +++ cardd.c 2000/01/24 20:00:19 @@ -60,9 +60,21 @@ for (cp = cards; cp; cp = cp->next) { printf("Card manuf %s, vers %s\n", cp->manuf, cp->version); printf("Configuration entries:\n"); - for (confp = cp->config; confp; confp = confp->next) - printf("\tIndex code = 0x%x, driver name = %s\n", - confp->index, confp->driver->name); + for (confp = cp->config; confp; confp = confp->next) { + printf("\tIndex code = "); + switch (confp->index_type) { + case DEFAULT_INDEX: + printf("default"); + break; + case AUTO_INDEX: + printf("auto"); + break; + default: + printf("0x%x", confp->index); + break; + } + printf(", driver name = %s\n", confp->driver->name); + } if (cp->insert) { printf("Insert commands are:\n"); pr_cmd(cp->insert); @@ -392,6 +404,30 @@ } /* + * Auto select config index + */ +static struct cis_config * +assign_card_index(struct cis * cis) +{ + struct cis_config *cp; + struct cis_ioblk *cio; + int i; + + for (cp = cis->conf; cp; cp = cp->next) { + if (!cp->iospace || !cp->io) + continue; + for (cio = cp->io; cio; cio = cio->next) { + for (i = cio->addr; i < cio->addr + cio->size - 1; i++) + if (!bit_test(io_avail, i)) + goto next; + } + return cp; /* found */ + next: + } + return cis->def_config; +} + +/* * assign_io - Allocate resources to slot matching the * configuration index selected. */ @@ -403,9 +439,21 @@ cis = sp->cis; defconf = cis->def_config; - for (cisconf = cis->conf; cisconf; cisconf = cisconf->next) - if (cisconf->id == sp->config->index) - break; + switch (sp->config->index_type) { + case DEFAULT_INDEX: /* default */ + cisconf = defconf; + sp->config->index = cisconf->id; + break; + case AUTO_INDEX: /* auto */ + cisconf = assign_card_index(cis); + sp->config->index = cisconf->id; + break; + default: /* normal, use index value */ + for (cisconf = cis->conf; cisconf; cisconf = cisconf->next) + if (cisconf->id == sp->config->index) + break; + } + if (cisconf == 0) { logmsg("Config id %d not present in this card", sp->config->index); Index: cardd.h =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/cardd.h,v retrieving revision 1.17 diff -u -r1.17 cardd.h --- cardd.h 2000/01/21 09:12:00 1.17 +++ cardd.h 2000/01/24 19:52:50 @@ -46,6 +46,7 @@ struct card_config { struct card_config *next; + unsigned char index_type; unsigned char index; struct driver *driver; int irq; @@ -172,3 +173,11 @@ #define BIT2MEM(x) (((x)*MEMUNIT)+MEMSTART) #define MAXINCLUDES 10 + +/* + * Config index types + */ +#define NORMAL_INDEX 0 +#define DEFAULT_INDEX 1 +#define AUTO_INDEX 2 + Index: file.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pccard/pccardd/file.c,v retrieving revision 1.23 diff -u -r1.23 file.c --- file.c 2000/01/21 09:12:00 1.23 +++ file.c 2000/01/24 20:05:35 @@ -87,6 +87,7 @@ static void error(char *); static int keyword(char *); static int irq_tok(int); +static int config_tok(unsigned char *); static int debuglevel_tok(int); static struct allocblk *ioblk_tok(int); static struct allocblk *memblk_tok(int); @@ -214,6 +215,7 @@ parse_card(void) { char *man, *vers, *tmp; + unsigned char index_type; struct card *cp; int i, iosize; struct card_config *confp, *lastp; @@ -232,7 +234,7 @@ switch (keyword(next_tok())) { case KWD_CONFIG: /* config */ - i = num_tok(); + i = config_tok(&index_type); if (i == -1) { error("illegal card config index"); break; @@ -251,6 +253,7 @@ break; } confp->index = i & 0x3F; + confp->index_type = index_type; /* * If no valid driver for this config, then do not save @@ -437,6 +440,26 @@ if (force) error("illegal IRQ value"); return (-1); +} + +/* + * Config index token + */ +static int +config_tok(unsigned char *index_type) +{ + if (strcmp("default", next_tok()) == 0) { + *index_type = DEFAULT_INDEX; + return 0; + } + pusht = 1; + if (strcmp("auto", next_tok()) == 0) { + *index_type = AUTO_INDEX; + return 0; + } + pusht = 1; + *index_type = NORMAL_INDEX; + return num_tok(); } /* To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-mobile" in the body of the message