aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip J Kelleher <pjk1939@linux.vnet.ibm.com>2013-06-18 15:42:36 -0400
committerJens Axboe <axboe@kernel.dk>2013-06-19 07:52:09 -0400
commitfb065cd9e0058551b08d6d32ff0494848c9e213d (patch)
tree3bdb37a276ae4571ae7dc5ac466c77f21973bdf9
parent7b379cc3785bfa827249a265548a055e934eaaea (diff)
rsxx: Adding in sync_start module paramenter.
Before, the partition table would have to be reread because our card was attached before it transistioned out of it's 'starting' state. This change will cause the driver to wait to attach the device until the adapter is ready. Signed-off-by: Philip J Kelleher <pjk1939@linux.vnet.ibm.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--drivers/block/rsxx/core.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/block/rsxx/core.c b/drivers/block/rsxx/core.c
index aca3f198e5cd..0f1be41ccfa8 100644
--- a/drivers/block/rsxx/core.c
+++ b/drivers/block/rsxx/core.c
@@ -39,6 +39,7 @@
39#include "rsxx_cfg.h" 39#include "rsxx_cfg.h"
40 40
41#define NO_LEGACY 0 41#define NO_LEGACY 0
42#define SYNC_START_TIMEOUT (10 * 60) /* 10 minutes */
42 43
43MODULE_DESCRIPTION("IBM FlashSystem 70/80 PCIe SSD Device Driver"); 44MODULE_DESCRIPTION("IBM FlashSystem 70/80 PCIe SSD Device Driver");
44MODULE_AUTHOR("Joshua Morris/Philip Kelleher, IBM"); 45MODULE_AUTHOR("Joshua Morris/Philip Kelleher, IBM");
@@ -49,6 +50,11 @@ static unsigned int force_legacy = NO_LEGACY;
49module_param(force_legacy, uint, 0444); 50module_param(force_legacy, uint, 0444);
50MODULE_PARM_DESC(force_legacy, "Force the use of legacy type PCI interrupts"); 51MODULE_PARM_DESC(force_legacy, "Force the use of legacy type PCI interrupts");
51 52
53static unsigned int sync_start = 1;
54module_param(sync_start, uint, 0444);
55MODULE_PARM_DESC(sync_start, "On by Default: Driver load will not complete "
56 "until the card startup has completed.");
57
52static DEFINE_IDA(rsxx_disk_ida); 58static DEFINE_IDA(rsxx_disk_ida);
53static DEFINE_SPINLOCK(rsxx_ida_lock); 59static DEFINE_SPINLOCK(rsxx_ida_lock);
54 60
@@ -540,6 +546,7 @@ static int rsxx_pci_probe(struct pci_dev *dev,
540{ 546{
541 struct rsxx_cardinfo *card; 547 struct rsxx_cardinfo *card;
542 int st; 548 int st;
549 unsigned int sync_timeout;
543 550
544 dev_info(&dev->dev, "PCI-Flash SSD discovered\n"); 551 dev_info(&dev->dev, "PCI-Flash SSD discovered\n");
545 552
@@ -698,6 +705,33 @@ static int rsxx_pci_probe(struct pci_dev *dev,
698 if (st) 705 if (st)
699 dev_crit(CARD_TO_DEV(card), 706 dev_crit(CARD_TO_DEV(card),
700 "Failed issuing card startup\n"); 707 "Failed issuing card startup\n");
708 if (sync_start) {
709 sync_timeout = SYNC_START_TIMEOUT;
710
711 dev_info(CARD_TO_DEV(card),
712 "Waiting for card to startup\n");
713
714 do {
715 ssleep(1);
716 sync_timeout--;
717
718 rsxx_get_card_state(card, &card->state);
719 } while (sync_timeout &&
720 (card->state == CARD_STATE_STARTING));
721
722 if (card->state == CARD_STATE_STARTING) {
723 dev_warn(CARD_TO_DEV(card),
724 "Card startup timed out\n");
725 card->size8 = 0;
726 } else {
727 dev_info(CARD_TO_DEV(card),
728 "card state: %s\n",
729 rsxx_card_state_to_str(card->state));
730 st = rsxx_get_card_size8(card, &card->size8);
731 if (st)
732 card->size8 = 0;
733 }
734 }
701 } else if (card->state == CARD_STATE_GOOD || 735 } else if (card->state == CARD_STATE_GOOD ||
702 card->state == CARD_STATE_RD_ONLY_FAULT) { 736 card->state == CARD_STATE_RD_ONLY_FAULT) {
703 st = rsxx_get_card_size8(card, &card->size8); 737 st = rsxx_get_card_size8(card, &card->size8);