diff options
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/cciss.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 6d4c4f227d55..2abe6df9445e 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -4495,6 +4495,7 @@ static __devinit int cciss_kdump_hard_reset_controller(struct pci_dev *pdev) | |||
4495 | int rc, i; | 4495 | int rc, i; |
4496 | CfgTable_struct __iomem *cfgtable; | 4496 | CfgTable_struct __iomem *cfgtable; |
4497 | bool use_doorbell; | 4497 | bool use_doorbell; |
4498 | u32 board_id; | ||
4498 | 4499 | ||
4499 | /* For controllers as old a the p600, this is very nearly | 4500 | /* For controllers as old a the p600, this is very nearly |
4500 | * the same thing as | 4501 | * the same thing as |
@@ -4517,6 +4518,19 @@ static __devinit int cciss_kdump_hard_reset_controller(struct pci_dev *pdev) | |||
4517 | * using the doorbell register. | 4518 | * using the doorbell register. |
4518 | */ | 4519 | */ |
4519 | 4520 | ||
4521 | /* Exclude 640x boards. These are two pci devices in one slot | ||
4522 | * which share a battery backed cache module. One controls the | ||
4523 | * cache, the other accesses the cache through the one that controls | ||
4524 | * it. If we reset the one controlling the cache, the other will | ||
4525 | * likely not be happy. Just forbid resetting this conjoined mess. | ||
4526 | */ | ||
4527 | cciss_lookup_board_id(pdev, &board_id); | ||
4528 | if (board_id == 0x409C0E11 || board_id == 0x409D0E11) { | ||
4529 | dev_warn(&pdev->dev, "Cannot reset Smart Array 640x " | ||
4530 | "due to shared cache module."); | ||
4531 | return -ENODEV; | ||
4532 | } | ||
4533 | |||
4520 | for (i = 0; i < 32; i++) | 4534 | for (i = 0; i < 32; i++) |
4521 | pci_read_config_word(pdev, 2*i, &saved_config_space[i]); | 4535 | pci_read_config_word(pdev, 2*i, &saved_config_space[i]); |
4522 | 4536 | ||
@@ -4600,7 +4614,8 @@ static __devinit int cciss_init_reset_devices(struct pci_dev *pdev) | |||
4600 | 4614 | ||
4601 | /* -ENOTSUPP here means we cannot reset the controller | 4615 | /* -ENOTSUPP here means we cannot reset the controller |
4602 | * but it's already (and still) up and running in | 4616 | * but it's already (and still) up and running in |
4603 | * "performant mode". | 4617 | * "performant mode". Or, it might be 640x, which can't reset |
4618 | * due to concerns about shared bbwc between 6402/6404 pair. | ||
4604 | */ | 4619 | */ |
4605 | if (rc == -ENOTSUPP) | 4620 | if (rc == -ENOTSUPP) |
4606 | return 0; /* just try to do the kdump anyhow. */ | 4621 | return 0; /* just try to do the kdump anyhow. */ |