Merge from PAO; Add new keywords for pccard.conf, auto and default.
This will help importing pccard entries (and users :) from PAO into -CURRENT.
This commit is contained in:
parent
36c90d4614
commit
6d698ef3f5
@ -60,9 +60,21 @@ dump_config_file(void)
|
|||||||
for (cp = cards; cp; cp = cp->next) {
|
for (cp = cards; cp; cp = cp->next) {
|
||||||
printf("Card manuf %s, vers %s\n", cp->manuf, cp->version);
|
printf("Card manuf %s, vers %s\n", cp->manuf, cp->version);
|
||||||
printf("Configuration entries:\n");
|
printf("Configuration entries:\n");
|
||||||
for (confp = cp->config; confp; confp = confp->next)
|
for (confp = cp->config; confp; confp = confp->next) {
|
||||||
printf("\tIndex code = 0x%x, driver name = %s\n",
|
printf("\tIndex code = ");
|
||||||
confp->index, confp->driver->name);
|
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) {
|
if (cp->insert) {
|
||||||
printf("Insert commands are:\n");
|
printf("Insert commands are:\n");
|
||||||
pr_cmd(cp->insert);
|
pr_cmd(cp->insert);
|
||||||
@ -391,6 +403,30 @@ assign_driver(struct card *cp)
|
|||||||
return (conf);
|
return (conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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
|
* assign_io - Allocate resources to slot matching the
|
||||||
* configuration index selected.
|
* configuration index selected.
|
||||||
@ -403,9 +439,21 @@ assign_io(struct slot *sp)
|
|||||||
|
|
||||||
cis = sp->cis;
|
cis = sp->cis;
|
||||||
defconf = cis->def_config;
|
defconf = cis->def_config;
|
||||||
for (cisconf = cis->conf; cisconf; cisconf = cisconf->next)
|
switch (sp->config->index_type) {
|
||||||
if (cisconf->id == sp->config->index)
|
case DEFAULT_INDEX: /* default */
|
||||||
break;
|
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) {
|
if (cisconf == 0) {
|
||||||
logmsg("Config id %d not present in this card",
|
logmsg("Config id %d not present in this card",
|
||||||
sp->config->index);
|
sp->config->index);
|
||||||
|
@ -46,6 +46,7 @@ struct cmd {
|
|||||||
|
|
||||||
struct card_config {
|
struct card_config {
|
||||||
struct card_config *next;
|
struct card_config *next;
|
||||||
|
unsigned char index_type;
|
||||||
unsigned char index;
|
unsigned char index;
|
||||||
struct driver *driver;
|
struct driver *driver;
|
||||||
int irq;
|
int irq;
|
||||||
@ -172,3 +173,11 @@ void readfile(char *);
|
|||||||
#define BIT2MEM(x) (((x)*MEMUNIT)+MEMSTART)
|
#define BIT2MEM(x) (((x)*MEMUNIT)+MEMSTART)
|
||||||
|
|
||||||
#define MAXINCLUDES 10
|
#define MAXINCLUDES 10
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Config index types
|
||||||
|
*/
|
||||||
|
#define NORMAL_INDEX 0
|
||||||
|
#define DEFAULT_INDEX 1
|
||||||
|
#define AUTO_INDEX 2
|
||||||
|
|
||||||
|
@ -87,6 +87,7 @@ static int num_tok(void);
|
|||||||
static void error(char *);
|
static void error(char *);
|
||||||
static int keyword(char *);
|
static int keyword(char *);
|
||||||
static int irq_tok(int);
|
static int irq_tok(int);
|
||||||
|
static int config_tok(unsigned char *);
|
||||||
static int debuglevel_tok(int);
|
static int debuglevel_tok(int);
|
||||||
static struct allocblk *ioblk_tok(int);
|
static struct allocblk *ioblk_tok(int);
|
||||||
static struct allocblk *memblk_tok(int);
|
static struct allocblk *memblk_tok(int);
|
||||||
@ -214,6 +215,7 @@ static void
|
|||||||
parse_card(void)
|
parse_card(void)
|
||||||
{
|
{
|
||||||
char *man, *vers, *tmp;
|
char *man, *vers, *tmp;
|
||||||
|
unsigned char index_type;
|
||||||
struct card *cp;
|
struct card *cp;
|
||||||
int i, iosize;
|
int i, iosize;
|
||||||
struct card_config *confp, *lastp;
|
struct card_config *confp, *lastp;
|
||||||
@ -232,7 +234,7 @@ parse_card(void)
|
|||||||
switch (keyword(next_tok())) {
|
switch (keyword(next_tok())) {
|
||||||
case KWD_CONFIG:
|
case KWD_CONFIG:
|
||||||
/* config */
|
/* config */
|
||||||
i = num_tok();
|
i = config_tok(&index_type);
|
||||||
if (i == -1) {
|
if (i == -1) {
|
||||||
error("illegal card config index");
|
error("illegal card config index");
|
||||||
break;
|
break;
|
||||||
@ -251,6 +253,7 @@ parse_card(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
confp->index = i & 0x3F;
|
confp->index = i & 0x3F;
|
||||||
|
confp->index_type = index_type;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If no valid driver for this config, then do not save
|
* If no valid driver for this config, then do not save
|
||||||
@ -439,6 +442,26 @@ irq_tok(int force)
|
|||||||
return (-1);
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* debuglevel token. Must be between 0 and 9.
|
* debuglevel token. Must be between 0 and 9.
|
||||||
*/
|
*/
|
||||||
|
@ -147,6 +147,11 @@ from the range available in the card's CIS, the driver that
|
|||||||
is to be associated with this configuration, and the interrupt
|
is to be associated with this configuration, and the interrupt
|
||||||
level (if any) to be assigned. An optional set of flags may
|
level (if any) to be assigned. An optional set of flags may
|
||||||
be assigned.
|
be assigned.
|
||||||
|
In
|
||||||
|
.Ar index ,
|
||||||
|
specify either ``auto'' or ``default'' or the range available in the card's CIS.
|
||||||
|
``auto'' allows to allocate resources automatically with information
|
||||||
|
from the CIS and status of using I/O resources.
|
||||||
.Pp
|
.Pp
|
||||||
The optional
|
The optional
|
||||||
.Em ether
|
.Em ether
|
||||||
|
Loading…
Reference in New Issue
Block a user