ChangeSet 1.2065.3.20, 2005/03/12 08:26:02-08:00, [EMAIL PROTECTED]
[PATCH] pcmcia: determine some useful information about devices
Determine some useful information about the device, namely
a) manufactor ID
b) card ID
c) function ID
d) product information strings
Signed-off-by: Dominik Brodowski <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
drivers/pcmcia/ds.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++
include/pcmcia/ds.h | 12 +++++++++
2 files changed, 77 insertions(+)
diff -Nru a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
--- a/drivers/pcmcia/ds.c 2005-03-12 21:28:50 -08:00
+++ b/drivers/pcmcia/ds.c 2005-03-12 21:28:50 -08:00
@@ -429,6 +429,69 @@
}
+
+/*
+ * pcmcia_device_query -- determine information about a pcmcia device
+ */
+static int pcmcia_device_query(struct pcmcia_device *p_dev)
+{
+ cistpl_manfid_t manf_id;
+ cistpl_funcid_t func_id;
+ cistpl_vers_1_t vers1;
+ unsigned int i;
+
+ if (!pccard_read_tuple(p_dev->socket, p_dev->func,
+ CISTPL_MANFID, &manf_id)) {
+ p_dev->manf_id = manf_id.manf;
+ p_dev->card_id = manf_id.card;
+ p_dev->has_manf_id = 1;
+ p_dev->has_card_id = 1;
+ }
+
+ if (!pccard_read_tuple(p_dev->socket, p_dev->func,
+ CISTPL_FUNCID, &func_id)) {
+ p_dev->func_id = func_id.func;
+ p_dev->has_func_id = 1;
+ } else {
+ /* rule of thumb: cards with no FUNCID, but with
+ * common memory device geometry information, are
+ * probably memory cards (from pcmcia-cs) */
+ cistpl_device_geo_t devgeo;
+ if (!pccard_read_tuple(p_dev->socket, p_dev->func,
+ CISTPL_DEVICE_GEO, &devgeo)) {
+ ds_dbg(0, "mem device geometry probably means "
+ "FUNCID_MEMORY\n");
+ p_dev->func_id = CISTPL_FUNCID_MEMORY;
+ p_dev->has_func_id = 1;
+ }
+ }
+
+ if (!pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_VERS_1,
+ &vers1)) {
+ for (i=0; i < vers1.ns; i++) {
+ char *tmp;
+ unsigned int length;
+
+ tmp = vers1.str + vers1.ofs[i];
+
+ length = strlen(tmp) + 1;
+ if ((length < 3) || (length > 255))
+ continue;
+
+ p_dev->prod_id[i] = kmalloc(sizeof(char) * length,
+ GFP_KERNEL);
+ if (!p_dev->prod_id[i])
+ continue;
+
+ p_dev->prod_id[i] = strncpy(p_dev->prod_id[i],
+ tmp, length);
+ }
+ }
+
+ return 0;
+}
+
+
/* device_add_lock is needed to avoid double registration by cardmgr and
kernel.
* Serializes pcmcia_device_add; will most likely be removed in future.
*
@@ -771,6 +834,8 @@
rescan:
p_dev->cardmgr = p_drv;
+
+ pcmcia_device_query(p_dev);
/*
* Prevent this racing with a card insertion.
diff -Nru a/include/pcmcia/ds.h b/include/pcmcia/ds.h
--- a/include/pcmcia/ds.h 2005-03-12 21:28:50 -08:00
+++ b/include/pcmcia/ds.h 2005-03-12 21:28:50 -08:00
@@ -169,6 +169,18 @@
event_callback_args_t event_callback_args;
} client;
+ /* information about this device */
+ u8 has_manf_id:1;
+ u8 has_card_id:1;
+ u8 has_func_id:1;
+ u8 reserved:5;
+
+ u8 func_id;
+ u16 manf_id;
+ u16 card_id;
+
+ char * prod_id[4];
+
/* device driver wanted by cardmgr */
struct pcmcia_driver * cardmgr;
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html