[PATCH] pcmcia: check for invalid crc32 hashes in id_tables
authorDominik Brodowski <linux@dominikbrodowski.net>
Mon, 27 Jun 2005 23:28:07 +0000 (16:28 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Tue, 28 Jun 2005 01:03:06 +0000 (18:03 -0700)
Check for invalid crc32 hashes in drivers' id_tables if CONFIG_PCMCIA_DEBUG is
set.

Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/pcmcia/ds.c

index 5701b93b2ddb8dd7ba2b0ef3b8886be8d3e16236..3ac7a443f6680b174460a2d8bcb0707c3b295033 100644 (file)
@@ -260,6 +260,41 @@ void cs_error(client_handle_t handle, int func, int ret)
 }
 EXPORT_SYMBOL(cs_error);
 
+#ifdef CONFIG_PCMCIA_DEBUG
+
+
+static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
+{
+       struct pcmcia_device_id *did = p_drv->id_table;
+       unsigned int i;
+       u32 hash;
+
+       while (did && did->match_flags) {
+               for (i=0; i<4; i++) {
+                       if (!did->prod_id[i])
+                               continue;
+
+                       hash = crc32(0, did->prod_id[i], strlen(did->prod_id[i]));
+                       if (hash == did->prod_id_hash[i])
+                               continue;
+
+                       printk(KERN_DEBUG "pcmcia: %s: invalid hash for "
+                              "product string \"%s\": is 0x%x, should "
+                              "be 0x%x\n", p_drv->drv.name, did->prod_id[i],
+                              did->prod_id_hash[i], hash);
+               }
+               did++;
+       }
+
+       return;
+}
+
+#else
+static inline void pcmcia_check_driver(struct pcmcia_driver *p_drv) {
+       return;
+}
+#endif
+
 /*======================================================================*/
 
 static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info);
@@ -296,6 +331,8 @@ int pcmcia_register_driver(struct pcmcia_driver *driver)
        if (!driver)
                return -EINVAL;
 
+       pcmcia_check_driver(driver);
+
        /* initialize common fields */
        driver->drv.bus = &pcmcia_bus_type;
        driver->drv.owner = driver->owner;