aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/cciss.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index 0af6f356fba5..d1f65def8ebb 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -83,6 +83,8 @@ static const struct pci_device_id cciss_pci_device_id[] = {
83 {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3214}, 83 {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3214},
84 {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3215}, 84 {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3215},
85 {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC, 0x103C, 0x3233}, 85 {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC, 0x103C, 0x3233},
86 {PCI_VENDOR_ID_HP, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
87 PCI_CLASS_STORAGE_RAID << 8, 0xffff << 8, 0},
86 {0,} 88 {0,}
87}; 89};
88 90
@@ -112,6 +114,7 @@ static struct board_type products[] = {
112 {0x3214103C, "Smart Array E200i", &SA5_access}, 114 {0x3214103C, "Smart Array E200i", &SA5_access},
113 {0x3215103C, "Smart Array E200i", &SA5_access}, 115 {0x3215103C, "Smart Array E200i", &SA5_access},
114 {0x3233103C, "Smart Array E500", &SA5_access}, 116 {0x3233103C, "Smart Array E500", &SA5_access},
117 {0xFFFF103C, "Unknown Smart Array", &SA5_access},
115}; 118};
116 119
117/* How long to wait (in milliseconds) for board to go into simple mode */ 120/* How long to wait (in milliseconds) for board to go into simple mode */
@@ -2960,13 +2963,6 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
2960 break; 2963 break;
2961 } 2964 }
2962 } 2965 }
2963 if (i == ARRAY_SIZE(products)) {
2964 printk(KERN_WARNING "cciss: Sorry, I don't know how"
2965 " to access the Smart Array controller %08lx\n",
2966 (unsigned long)board_id);
2967 err = -ENODEV;
2968 goto err_out_free_res;
2969 }
2970 if ((readb(&c->cfgtable->Signature[0]) != 'C') || 2966 if ((readb(&c->cfgtable->Signature[0]) != 'C') ||
2971 (readb(&c->cfgtable->Signature[1]) != 'I') || 2967 (readb(&c->cfgtable->Signature[1]) != 'I') ||
2972 (readb(&c->cfgtable->Signature[2]) != 'S') || 2968 (readb(&c->cfgtable->Signature[2]) != 'S') ||
@@ -2975,6 +2971,26 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
2975 err = -ENODEV; 2971 err = -ENODEV;
2976 goto err_out_free_res; 2972 goto err_out_free_res;
2977 } 2973 }
2974 /* We didn't find the controller in our list. We know the
2975 * signature is valid. If it's an HP device let's try to
2976 * bind to the device and fire it up. Otherwise we bail.
2977 */
2978 if (i == ARRAY_SIZE(products)) {
2979 if (subsystem_vendor_id == PCI_VENDOR_ID_HP) {
2980 c->product_name = products[i-1].product_name;
2981 c->access = *(products[i-1].access);
2982 printk(KERN_WARNING "cciss: This is an unknown "
2983 "Smart Array controller.\n"
2984 "cciss: Please update to the latest driver "
2985 "available from www.hp.com.\n");
2986 } else {
2987 printk(KERN_WARNING "cciss: Sorry, I don't know how"
2988 " to access the Smart Array controller %08lx\n"
2989 , (unsigned long)board_id);
2990 err = -ENODEV;
2991 goto err_out_free_res;
2992 }
2993 }
2978#ifdef CONFIG_X86 2994#ifdef CONFIG_X86
2979 { 2995 {
2980 /* Need to enable prefetch in the SCSI core for 6400 in x86 */ 2996 /* Need to enable prefetch in the SCSI core for 6400 in x86 */