summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etc/defaults/pccard.conf20
-rw-r--r--usr.sbin/pccard/pccardd/cardd.c37
-rw-r--r--usr.sbin/pccard/pccardd/cardd.h4
-rw-r--r--usr.sbin/pccard/pccardd/file.c65
-rw-r--r--usr.sbin/pccard/pccardd/pccard.conf.523
-rw-r--r--usr.sbin/pccard/pccardd/readcis.c14
-rw-r--r--usr.sbin/pccard/pccardd/readcis.h1
7 files changed, 153 insertions, 11 deletions
diff --git a/etc/defaults/pccard.conf b/etc/defaults/pccard.conf
index 37db89b..d6fa64f 100644
--- a/etc/defaults/pccard.conf
+++ b/etc/defaults/pccard.conf
@@ -1059,3 +1059,23 @@ card "Xircom" "CreditCard Ethernet 10/100 + Modem 56"
insert /etc/pccard_ether $device
remove logger -t pccard:$device -s Xircom CreditCard Modem removed
remove /sbin/ifconfig $device delete
+
+# -------------------------------------------------------------------
+#
+# "Wildcard" entries
+#
+# -------------------------------------------------------------------
+
+# GENERIC PCMCIA modem
+generic serial
+ config auto "sio" ?
+ reset 10000 # for unstable cards
+ insert logger -t pccard:$device -s PCMCIA Modem inserted
+ remove logger -t pccard:$device -s PCMCIA Modem removed
+
+# GENERIC Flash ATA / ATA HDD
+generic fixed_disk
+ config auto "ata" ?
+ insert logger -t pccard:$device -s Flash ATA / ATA HDD inserted
+ remove logger -t pccard:$device -s Flash ATA / ATA HDD removed
+
diff --git a/usr.sbin/pccard/pccardd/cardd.c b/usr.sbin/pccard/pccardd/cardd.c
index b817e3c..febde49 100644
--- a/usr.sbin/pccard/pccardd/cardd.c
+++ b/usr.sbin/pccard/pccardd/cardd.c
@@ -185,14 +185,17 @@ void
card_removed(struct slot *sp)
{
struct card *cp;
+ int in_use = 0;
if (sp->cis)
freecis(sp->cis);
if (sp->config) {
+ if (sp->config->inuse && sp->config->driver->inuse)
+ in_use = 1;
sp->config->inuse = 0;
sp->config->driver->inuse = 0;
}
- if ((cp = sp->card) != 0)
+ if ((cp = sp->card) != 0 && in_use)
execute(cp->remove, sp);
sp->cis = 0;
sp->config = 0;
@@ -229,10 +232,36 @@ card_inserted(struct slot *sp)
#if 0
dumpcis(sp->cis);
#endif
- for (cp = cards; cp; cp = cp->next)
- if (strncmp(cp->manuf, sp->cis->manuf, CIS_MAXSTR) == 0 &&
- strncmp(cp->version, sp->cis->vers, CIS_MAXSTR) == 0)
+ for (cp = cards; cp; cp = cp->next) {
+ switch (cp->deftype) {
+ case DT_VERS:
+ if (strncmp(cp->manuf, sp->cis->manuf, CIS_MAXSTR) == 0 &&
+ strncmp(cp->version, sp->cis->vers, CIS_MAXSTR) == 0) {
+ logmsg("Card \"%s\"(\"%s\") "
+ "matched \"%s\" (\"%s\") ",
+ sp->cis->manuf, sp->cis->vers,
+ cp->manuf, cp->version
+ );
+ goto escape;
+ }
break;
+ case DT_FUNC:
+ if (cp->func_id == sp->cis->func_id1) {
+ logmsg("Card \"%s\"(\"%s\") "
+ "[%s] [%s] "
+ "has function ID %d\n",
+ sp->cis->manuf, sp->cis->vers,
+ sp->cis->add_info1, sp->cis->add_info2,
+ cp->func_id);
+ goto escape;
+ }
+ break;
+ default:
+ logmsg("Unknown deftype %d\n", cp->deftype);
+ die("cardd.c:card_inserted()");
+ }
+ }
+escape:
sp->card = cp;
#if 0
reset_slot(sp);
diff --git a/usr.sbin/pccard/pccardd/cardd.h b/usr.sbin/pccard/pccardd/cardd.h
index 41d6867..a180ca6 100644
--- a/usr.sbin/pccard/pccardd/cardd.h
+++ b/usr.sbin/pccard/pccardd/cardd.h
@@ -67,6 +67,8 @@ struct card {
struct card *next;
char *manuf;
char *version;
+ u_char func_id;
+ int deftype;
struct ether *ether; /* For net cards, ether at offset */
int reset_time; /* Reset time */
int iosize; /* I/O window size (ignore location) */
@@ -183,3 +185,5 @@ void readfile(char *);
#define DEFAULT_INDEX 1
#define AUTO_INDEX 2
+#define DT_VERS 0
+#define DT_FUNC 1
diff --git a/usr.sbin/pccard/pccardd/file.c b/usr.sbin/pccard/pccardd/file.c
index 5e29ddd..098d2c4 100644
--- a/usr.sbin/pccard/pccardd/file.c
+++ b/usr.sbin/pccard/pccardd/file.c
@@ -62,6 +62,7 @@ static char *keys[] = {
"iosize", /* 12 */
"debuglevel", /* 13 */
"include", /* 14 */
+ "function", /* 15 */
0
};
@@ -79,6 +80,16 @@ static char *keys[] = {
#define KWD_IOSIZE 12
#define KWD_DEBUGLEVEL 13
#define KWD_INCLUDE 14
+#define KWD_FUNCTION 15
+
+/* for keyword compatibility with PAO/plain FreeBSD */
+static struct {
+ char *alias;
+ u_int key;
+} key_aliases[] = {
+ {"generic", KWD_FUNCTION},
+ {0, 0}
+};
struct flags {
char *name;
@@ -93,6 +104,7 @@ static void error(char *);
static int keyword(char *);
static int irq_tok(int);
static int config_tok(unsigned char *);
+static int func_tok(void);
static int debuglevel_tok(int);
static struct allocblk *ioblk_tok(int);
static struct allocblk *memblk_tok(int);
@@ -101,7 +113,7 @@ static int iosize_tok(void);
static void file_include(char *);
static void addcmd(struct cmd **);
-static void parse_card(void);
+static void parse_card(int);
/*
* Read a file and parse the pcmcia configuration data.
@@ -202,7 +214,11 @@ parsefile(void)
break;
case KWD_CARD:
/* Card definition. */
- parse_card();
+ parse_card(DT_VERS);
+ break;
+ case KWD_FUNCTION:
+ /* Function definition. */
+ parse_card(DT_FUNC);
break;
case KWD_DEBUGLEVEL:
i = debuglevel_tok(0);
@@ -228,7 +244,7 @@ parsefile(void)
* Parse a card definition.
*/
static void
-parse_card(void)
+parse_card(int deftype)
{
char *man, *vers, *tmp;
unsigned char index_type;
@@ -238,11 +254,25 @@ parse_card(void)
struct ether *ether;
confp = 0;
- man = newstr(next_tok());
- vers = newstr(next_tok());
cp = xmalloc(sizeof(*cp));
- cp->manuf = man;
- cp->version = vers;
+ cp->deftype = deftype;
+ switch (deftype) {
+ case DT_VERS:
+ man = newstr(next_tok());
+ vers = newstr(next_tok());
+ cp->manuf = man;
+ cp->version = vers;
+ cp->func_id = 0;
+ break;
+ case DT_FUNC:
+ cp->manuf = "";
+ cp->version = "";
+ cp->func_id = (u_char) func_tok();
+ break;
+ default:
+ fprintf(stderr, "parse_card: unknown deftype %d\n", deftype);
+ exit(1);
+ }
cp->reset_time = 50;
cp->next = 0;
if (!last_card) {
@@ -497,6 +527,21 @@ config_tok(unsigned char *index_type)
*index_type = NORMAL_INDEX;
return num_tok();
}
+/*
+ * Function ID token
+ */
+static int
+func_tok(void)
+{
+ if (strcmp("serial", next_tok()) == 0)
+ return 2;
+ pusht = 1;
+ if (strcmp("fixed_disk", next_tok()) == 0)
+ return 4;
+ pusht = 1;
+ return num_tok();
+}
+
/*
* debuglevel token. Must be between 0 and 9.
@@ -548,6 +593,12 @@ keyword(char *str)
for (s = keys; *s; s++, i++)
if (strcmp(*s, str) == 0)
return (i);
+
+ /* search keyword aliases too */
+ for (i = 0; key_aliases[i].key ; i++)
+ if (strcmp(key_aliases[i].alias, str) == 0)
+ return (key_aliases[i].key);
+
return (0);
}
diff --git a/usr.sbin/pccard/pccardd/pccard.conf.5 b/usr.sbin/pccard/pccardd/pccard.conf.5
index 1aaf4c6..b1b26df 100644
--- a/usr.sbin/pccard/pccardd/pccard.conf.5
+++ b/usr.sbin/pccard/pccardd/pccard.conf.5
@@ -195,6 +195,29 @@ and
.Em remove
commands are allowed, and they are executed in the order they
are listed.
+.Ss "Wildcard entries"
+Following two wildcard entries of card identifiers are available
+for generic type of the cards:
+.Pp
+.Dl generic serial
+.Dl generic fixed_disk
+.Pp
+The keyword
+.Em serial
+matches ``Functional ID: Serial port/modem'' and
+.Em fixed_disk
+matches ``Fixed disk card''.
+The syntax is the same of
+.Em "card identifiers"
+but used ``generic'' instead of ``card'' in the first line.
+These are in the last of
+.Nm
+because unmatched cards with the other
+.Em card
+entries can match these entries secondly.
+The alias ``function'' can be used instead of ``generic'' because of
+the historical reason.
+.Pp
.Sh EXAMPLE
A typical configuration file may appear thus:
.Bd -literal
diff --git a/usr.sbin/pccard/pccardd/readcis.c b/usr.sbin/pccard/pccardd/readcis.c
index 6fd7c7b..490909f 100644
--- a/usr.sbin/pccard/pccardd/readcis.c
+++ b/usr.sbin/pccard/pccardd/readcis.c
@@ -47,6 +47,7 @@ static void cis_info(struct cis *, unsigned char *, int);
static void device_desc(unsigned char *, int, struct dev_mem *);
static void config_map(struct cis *, unsigned char *, int);
static void cis_config(struct cis *, unsigned char *, int);
+static void cis_func_id(struct cis *, unsigned char *, int);
static struct tuple_list *read_one_tuplelist(int, int, off_t);
static struct tuple_list *read_tuples(int);
static struct tuple *find_tuple_in_list(struct tuple_list *, unsigned char);
@@ -123,6 +124,10 @@ readcis(int fd)
case CIS_CONFIG: /* 0x1B */
cis_config(cp, tp->data, tp->length);
break;
+ case CIS_FUNC_ID: /* 0x21 */
+ cis_func_id(cp, tp->data, tp->length);
+ break;
+
}
}
return (cp);
@@ -181,6 +186,15 @@ cis_info(struct cis *cp, unsigned char *p, int len)
while (*p++);
strncpy(cp->add_info2, p, CIS_MAXSTR - 1);
}
+/*
+ * Fills in CIS function ID.
+ */
+static void
+cis_func_id(struct cis *cp, unsigned char *p, int len)
+{
+ cp->func_id1 = *p++;
+ cp->func_id2 = *p++;
+}
/*
* device_desc - decode device descriptor.
diff --git a/usr.sbin/pccard/pccardd/readcis.h b/usr.sbin/pccard/pccardd/readcis.h
index 58d83ef..79b703a 100644
--- a/usr.sbin/pccard/pccardd/readcis.h
+++ b/usr.sbin/pccard/pccardd/readcis.h
@@ -119,6 +119,7 @@ struct cis {
unsigned char last_config;
unsigned char ccrs;
unsigned long reg_addr;
+ unsigned char func_id1, func_id2;
struct dev_mem attr_mem;
struct dev_mem common_mem;
struct cis_config *def_config;
OpenPOWER on IntegriCloud