diff options
Diffstat (limited to 'drivers/block/rsxx/core.c')
-rw-r--r-- | drivers/block/rsxx/core.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/block/rsxx/core.c b/drivers/block/rsxx/core.c index 774f810c6a9c..aca3f198e5cd 100644 --- a/drivers/block/rsxx/core.c +++ b/drivers/block/rsxx/core.c | |||
@@ -368,15 +368,26 @@ static void rsxx_eeh_failure(struct pci_dev *dev) | |||
368 | { | 368 | { |
369 | struct rsxx_cardinfo *card = pci_get_drvdata(dev); | 369 | struct rsxx_cardinfo *card = pci_get_drvdata(dev); |
370 | int i; | 370 | int i; |
371 | int cnt = 0; | ||
371 | 372 | ||
372 | dev_err(&dev->dev, "IBM FlashSystem PCI: disabling failed card.\n"); | 373 | dev_err(&dev->dev, "IBM FlashSystem PCI: disabling failed card.\n"); |
373 | 374 | ||
374 | card->eeh_state = 1; | 375 | card->eeh_state = 1; |
376 | card->halt = 1; | ||
377 | |||
378 | for (i = 0; i < card->n_targets; i++) { | ||
379 | spin_lock_bh(&card->ctrl[i].queue_lock); | ||
380 | cnt = rsxx_cleanup_dma_queue(&card->ctrl[i], | ||
381 | &card->ctrl[i].queue); | ||
382 | spin_unlock_bh(&card->ctrl[i].queue_lock); | ||
375 | 383 | ||
376 | for (i = 0; i < card->n_targets; i++) | 384 | cnt += rsxx_dma_cancel(&card->ctrl[i]); |
377 | del_timer_sync(&card->ctrl[i].activity_timer); | ||
378 | 385 | ||
379 | rsxx_eeh_cancel_dmas(card); | 386 | if (cnt) |
387 | dev_info(CARD_TO_DEV(card), | ||
388 | "Freed %d queued DMAs on channel %d\n", | ||
389 | cnt, card->ctrl[i].id); | ||
390 | } | ||
380 | } | 391 | } |
381 | 392 | ||
382 | static int rsxx_eeh_fifo_flush_poll(struct rsxx_cardinfo *card) | 393 | static int rsxx_eeh_fifo_flush_poll(struct rsxx_cardinfo *card) |