[patches 11/12] pcmcia: determine some useful information about
devices
Dominik Brodowski
linux at dominikbrodowski.net
Thu Feb 10 14:48:08 EST 2005
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 <linux at dominikbrodowski.net>
---
drivers/pcmcia/ds.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++
include/pcmcia/ds.h | 12 +++++++++
2 files changed, 77 insertions(+)
Index: 2.6.11-rc3+/drivers/pcmcia/ds.c
===================================================================
--- 2.6.11-rc3+.orig/drivers/pcmcia/ds.c 2005-02-10 20:32:37.000000000 +0100
+++ 2.6.11-rc3+/drivers/pcmcia/ds.c 2005-02-10 20:32:38.000000000 +0100
@@ -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.
*
@@ -772,6 +835,8 @@
rescan:
p_dev->cardmgr = p_drv;
+ pcmcia_device_query(p_dev);
+
/*
* Prevent this racing with a card insertion.
*/
Index: 2.6.11-rc3+/include/pcmcia/ds.h
===================================================================
--- 2.6.11-rc3+.orig/include/pcmcia/ds.h 2005-02-10 20:32:37.000000000 +0100
+++ 2.6.11-rc3+/include/pcmcia/ds.h 2005-02-10 20:32:38.000000000 +0100
@@ -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;
More information about the linux-pcmcia
mailing list