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

Reply via email to