aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/pccard
diff options
context:
space:
mode:
authorTakeshi Shibagaki <shiba@FreeBSD.org>2002-02-20 14:48:23 +0000
committerTakeshi Shibagaki <shiba@FreeBSD.org>2002-02-20 14:48:23 +0000
commitd9dd0fde5f45c2d4f4645a98ff3de1b2ade3b2c9 (patch)
tree1c31ff4639b842cf094eb171231d8eabce15a5e2 /usr.sbin/pccard
parent9198b952b5ad9541b8ba3125ca5e5f2a2fcd54a6 (diff)
downloadsrc-d9dd0fde5f45c2d4f4645a98ff3de1b2ade3b2c9.tar.gz
src-d9dd0fde5f45c2d4f4645a98ff3de1b2ade3b2c9.zip
Add some code which read manufucturer id. This is for NEWCARD compatibility.
Reviewed by: imp
Notes
Notes: svn path=/head/; revision=90968
Diffstat (limited to 'usr.sbin/pccard')
-rw-r--r--usr.sbin/pccard/pccardd/cardd.c22
-rw-r--r--usr.sbin/pccard/pccardd/cardd.h3
-rw-r--r--usr.sbin/pccard/pccardd/readcis.c18
-rw-r--r--usr.sbin/pccard/pccardd/readcis.h3
4 files changed, 46 insertions, 0 deletions
diff --git a/usr.sbin/pccard/pccardd/cardd.c b/usr.sbin/pccard/pccardd/cardd.c
index b2ca965a889c..c2431bf3f64d 100644
--- a/usr.sbin/pccard/pccardd/cardd.c
+++ b/usr.sbin/pccard/pccardd/cardd.c
@@ -347,12 +347,27 @@ escape:
sp->cis->manuf, sp->cis->vers);
return;
}
+ /*
+ * Copy CIS_MANUF_ID and CIS_FUNC_EXT from "struct cis"
+ * to "struct slot"
+ */
if (sp->cis->lan_nid && sp->cis->lan_nid[0] == sizeof(sp->eaddr)) {
bcopy(sp->cis->lan_nid + 1, sp->eaddr, sizeof(sp->eaddr));
sp->flags |= EADDR_CONFIGED;
} else {
bzero(sp->eaddr, sizeof(sp->eaddr));
}
+ if (sp->cis->manufacturer && sp->cis->product) {
+ sp->manufacturer=sp->cis->manufacturer;
+ sp->product=sp->cis->product;
+ if(sp->cis->prodext) {
+ sp->prodext=sp->cis->prodext; /* For xe driver */
+ }
+ } else {
+ sp->manufacturer=0;
+ sp->product=0;
+ sp->prodext=0;
+ }
if (cp->ether) {
struct ether *e = 0;
@@ -969,6 +984,13 @@ setup_slot(struct slot *sp)
sp->irq, drv.flags);
}
/*
+ * Copy CIS_MANUF_ID from "struct slot" to "struct dev_desc"
+ * This means moving CIS_MANUF_ID to kernel driver area.
+ */
+ drv.manufacturer = sp->manufacturer;
+ drv.product = sp->product;
+ drv.prodext = sp->prodext;
+ /*
* If the driver fails to be connected to the device,
* then it may mean that the driver did not recognise it.
*/
diff --git a/usr.sbin/pccard/pccardd/cardd.h b/usr.sbin/pccard/pccardd/cardd.h
index 31be286869fb..afd87320acc5 100644
--- a/usr.sbin/pccard/pccardd/cardd.h
+++ b/usr.sbin/pccard/pccardd/cardd.h
@@ -121,6 +121,9 @@ struct slot {
struct card_config *config; /* Current configuration */
struct cis_config *card_config;
char devname[16];
+ u_int manufacturer;
+ u_int product;
+ u_int prodext;
unsigned char eaddr[6]; /* If any */
struct allocblk io; /* I/O block spec */
struct allocblk mem; /* Memory block spec */
diff --git a/usr.sbin/pccard/pccardd/readcis.c b/usr.sbin/pccard/pccardd/readcis.c
index 49b2abffb4b6..69533378f6b3 100644
--- a/usr.sbin/pccard/pccardd/readcis.c
+++ b/usr.sbin/pccard/pccardd/readcis.c
@@ -56,6 +56,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_manuf_id(struct cis *, unsigned char *, int);
static void cis_func_id(struct cis *, unsigned char *, int);
static void cis_network_ext(struct cis *, unsigned char *, int);
static struct tuple_list *read_one_tuplelist(int, int, off_t);
@@ -140,6 +141,9 @@ readcis(int fd)
case CIS_CONFIG: /* 0x1B */
cis_config(cp, tp->data, tp->length);
break;
+ case CIS_MANUF_ID: /* 0x20 */
+ cis_manuf_id(cp, tp->data, tp->length);
+ break;
case CIS_FUNC_ID: /* 0x21 */
cis_func_id(cp, tp->data, tp->length);
break;
@@ -238,6 +242,20 @@ cis_info(struct cis *cp, unsigned char *p, int len)
cp->add_info2 = strdup("[none]");
}
+static void
+cis_manuf_id(struct cis *cp, unsigned char *p, int len)
+{
+ if (len > 4) {
+ cp->manufacturer = tpl16(p);
+ cp->product = tpl16(p+2);
+ if (len == 5)
+ cp->prodext = *(p+4); /* For xe driver */
+ } else {
+ cp->manufacturer=0;
+ cp->product=0;
+ cp->prodext=0;
+ }
+}
/*
* Fills in CIS function ID.
*/
diff --git a/usr.sbin/pccard/pccardd/readcis.h b/usr.sbin/pccard/pccardd/readcis.h
index ba77a52360a9..8c718e21a366 100644
--- a/usr.sbin/pccard/pccardd/readcis.h
+++ b/usr.sbin/pccard/pccardd/readcis.h
@@ -118,6 +118,9 @@ struct cis {
unsigned char last_config;
unsigned char ccrs;
unsigned long reg_addr;
+ u_int manufacturer;
+ u_int product;
+ u_int prodext;
unsigned char func_id1, func_id2;
struct dev_mem attr_mem;
struct dev_mem common_mem;