diff options
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/cciss.c | 30 |
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 */ |