[libata] blacklist Maxtor*BANC* using new wildcard blacklist matching
authorJeff Garzik <jeff@garzik.org>
Thu, 20 Sep 2007 20:31:47 +0000 (16:31 -0400)
committerJeff Garzik <jeff@garzik.org>
Fri, 12 Oct 2007 18:55:38 +0000 (14:55 -0400)
Support the use of '*' in model_num and model_rev entries
in ata_device_blacklist[].

Based largely on David Milburn's "libata-core: support wildcard matching
in ata_blacklist_entry" patch.

Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/ata/libata-core.c

index 84d81b26e384121ae0e9be5efb6ffb3a82457311..2b222700d9bbaac4e26b7abb5e4e75139036dcee 100644 (file)
@@ -3814,16 +3814,11 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
        /* http://thread.gmane.org/gmane.linux.ide/14907 */
        { "FUJITSU MHT2060BH",  NULL,           ATA_HORKAGE_NONCQ },
        /* NCQ is broken */
-       { "Maxtor 6L250S0",     "BANC1G10",     ATA_HORKAGE_NONCQ },
-       { "Maxtor 6B200M0",     "BANC1BM0",     ATA_HORKAGE_NONCQ },
-       { "Maxtor 6B200M0",     "BANC1B10",     ATA_HORKAGE_NONCQ },
-       { "Maxtor 7B250S0",     "BANC1B70",     ATA_HORKAGE_NONCQ, },
-       { "Maxtor 7B300S0",     "BANC1B70",     ATA_HORKAGE_NONCQ },
+       { "Maxtor *",           "BANC*",        ATA_HORKAGE_NONCQ },
        { "Maxtor 7V300F0",     "VA111630",     ATA_HORKAGE_NONCQ },
        { "HITACHI HDS7250SASUN500G 0621KTAWSD", "K2AOAJ0AHITACHI",
-        ATA_HORKAGE_NONCQ },
-       /* NCQ hard hangs device under heavier load, needs hard power cycle */
-       { "Maxtor 6B250S0",     "BANC1B70",     ATA_HORKAGE_NONCQ },
+         ATA_HORKAGE_NONCQ },
+
        /* Blacklist entries taken from Silicon Image 3124/3132
           Windows driver .inf file - also several Linux problem reports */
        { "HTS541060G9SA00",    "MB3OC60D",     ATA_HORKAGE_NONCQ, },
@@ -3849,6 +3844,23 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
        { }
 };
 
+int strn_pattern_cmp(const char *patt, const char *name, int wildchar)
+{
+       const char *p;
+       int len;
+
+       /*
+        * check for trailing wildcard: *\0
+        */
+       p = strchr(patt, wildchar);
+       if (p && ((*(p + 1)) == 0))
+               len = p - patt;
+       else
+               len = strlen(name);
+
+       return strncmp(patt, name, len);
+}
+
 static unsigned long ata_dev_blacklisted(const struct ata_device *dev)
 {
        unsigned char model_num[ATA_ID_PROD_LEN + 1];
@@ -3859,10 +3871,10 @@ static unsigned long ata_dev_blacklisted(const struct ata_device *dev)
        ata_id_c_string(dev->id, model_rev, ATA_ID_FW_REV, sizeof(model_rev));
 
        while (ad->model_num) {
-               if (!strcmp(ad->model_num, model_num)) {
+               if (!strn_pattern_cmp(ad->model_num, model_num, '*')) {
                        if (ad->model_rev == NULL)
                                return ad->horkage;
-                       if (!strcmp(ad->model_rev, model_rev))
+                       if (!strn_pattern_cmp(ad->model_rev, model_rev, '*'))
                                return ad->horkage;
                }
                ad++;