diff options
Diffstat (limited to 'drivers/block/cciss.c')
-rw-r--r-- | drivers/block/cciss.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 9c9c79c0aa98..286c81d70818 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -4026,9 +4026,23 @@ static int __devinit cciss_pci_find_memory_BAR(struct pci_dev *pdev, | |||
4026 | return -ENODEV; | 4026 | return -ENODEV; |
4027 | } | 4027 | } |
4028 | 4028 | ||
4029 | static int __devinit cciss_wait_for_board_ready(ctlr_info_t *h) | ||
4030 | { | ||
4031 | int i; | ||
4032 | u32 scratchpad; | ||
4033 | |||
4034 | for (i = 0; i < CCISS_BOARD_READY_ITERATIONS; i++) { | ||
4035 | scratchpad = readl(h->vaddr + SA5_SCRATCHPAD_OFFSET); | ||
4036 | if (scratchpad == CCISS_FIRMWARE_READY) | ||
4037 | return 0; | ||
4038 | msleep(CCISS_BOARD_READY_POLL_INTERVAL_MSECS); | ||
4039 | } | ||
4040 | dev_warn(&h->pdev->dev, "board not ready, timed out.\n"); | ||
4041 | return -ENODEV; | ||
4042 | } | ||
4043 | |||
4029 | static int __devinit cciss_pci_init(ctlr_info_t *c) | 4044 | static int __devinit cciss_pci_init(ctlr_info_t *c) |
4030 | { | 4045 | { |
4031 | __u32 scratchpad = 0; | ||
4032 | __u64 cfg_offset; | 4046 | __u64 cfg_offset; |
4033 | __u32 cfg_base_addr; | 4047 | __u32 cfg_base_addr; |
4034 | __u64 cfg_base_addr_index; | 4048 | __u64 cfg_base_addr_index; |
@@ -4073,21 +4087,9 @@ static int __devinit cciss_pci_init(ctlr_info_t *c) | |||
4073 | if (err) | 4087 | if (err) |
4074 | goto err_out_free_res; | 4088 | goto err_out_free_res; |
4075 | c->vaddr = remap_pci_mem(c->paddr, 0x250); | 4089 | c->vaddr = remap_pci_mem(c->paddr, 0x250); |
4076 | 4090 | err = cciss_wait_for_board_ready(c); | |
4077 | /* Wait for the board to become ready. (PCI hotplug needs this.) | 4091 | if (err) |
4078 | * We poll for up to 120 secs, once per 100ms. */ | ||
4079 | for (i = 0; i < 1200; i++) { | ||
4080 | scratchpad = readl(c->vaddr + SA5_SCRATCHPAD_OFFSET); | ||
4081 | if (scratchpad == CCISS_FIRMWARE_READY) | ||
4082 | break; | ||
4083 | set_current_state(TASK_INTERRUPTIBLE); | ||
4084 | schedule_timeout(msecs_to_jiffies(100)); /* wait 100ms */ | ||
4085 | } | ||
4086 | if (scratchpad != CCISS_FIRMWARE_READY) { | ||
4087 | printk(KERN_WARNING "cciss: Board not ready. Timed out.\n"); | ||
4088 | err = -ENODEV; | ||
4089 | goto err_out_free_res; | 4092 | goto err_out_free_res; |
4090 | } | ||
4091 | 4093 | ||
4092 | /* get the address index number */ | 4094 | /* get the address index number */ |
4093 | cfg_base_addr = readl(c->vaddr + SA5_CTCFG_OFFSET); | 4095 | cfg_base_addr = readl(c->vaddr + SA5_CTCFG_OFFSET); |