Messages in this thread Patch in this message | | | Date | Tue, 16 Dec 2003 17:57:33 -0600 (CST) | From | mikem@beardog ... | Subject | cciss update for 2.4.24-pre1, 2 of 2 |
| |
Some older cciss controllers may take a long time to become ready after hot replacing the controller. This patch addresses that problem by adding a check of the scratchpad register. This patch is intended to supplement the monitor thread when cciss is used in an md environment. In the event of a controller failure the failed board can now be more reliably replaced. This is patch #2 of 2. Please consider this patch for inclusion in the 2.4.24 kernel.
Thanks, mikem mike.miller@hp.com ------------------------------------------------------------------------------ diff -burN lx2424pre1-p01/drivers/block/cciss.c lx2424pre1/drivers/block/cciss.c --- lx2424pre1-p01/drivers/block/cciss.c 2003-12-16 17:25:50.000000000 -0600 +++ lx2424pre1/drivers/block/cciss.c 2003-12-16 17:30:41.000000000 -0600 @@ -2537,8 +2537,8 @@ static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) { ushort subsystem_vendor_id, subsystem_device_id, command; - unchar irq = pdev->irq; - __u32 board_id; + unchar irq = pdev->irq, revision, ready = 0; + __u32 board_id, scratchpad; __u64 cfg_offset; __u32 cfg_base_addr; __u64 cfg_base_addr_index; @@ -2609,6 +2609,21 @@ printk("address 0 = %x\n", c->paddr); #endif /* CCISS_DEBUG */ c->vaddr = remap_pci_mem(c->paddr, 200); + /* Wait for the board to become ready. (PCI hotplug needs this.) + * We poll for up to 120 secs, once per 100ms. */ + for (i=0; i < 1200; i++) { + scratchpad = readl(c->vaddr + SA5_SCRATCHPAD_OFFSET); + if (scratchpad == 0xffff0000) { + ready = 1; + break; + } + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ / 10); /* wait 100ms */ + } + if (!ready) { + printk(KERN_WARNING "cciss: Board not ready. Timed out.\n"); + return -1; + }
/* get the address index number */ cfg_base_addr = readl(c->vaddr + SA5_CTCFG_OFFSET); diff -burN lx2424pre1-p01/drivers/block/cciss.h lx2424pre1/drivers/block/cciss.h --- lx2424pre1-p01/drivers/block/cciss.h 2003-11-28 12:26:19.000000000 -0600 +++ lx2424pre1/drivers/block/cciss.h 2003-12-16 17:30:41.000000000 -0600 @@ -137,6 +137,7 @@ #define SA5_REPLY_INTR_MASK_OFFSET 0x34 #define SA5_REPLY_PORT_OFFSET 0x44 #define SA5_INTR_STATUS 0x30 +#define SA5_SCRATCHPAD_OFFSET 0xB0
#define SA5_CTCFG_OFFSET 0xB4 #define SA5_CTMEM_OFFSET 0xB8 ------------------------------------------------------------------------------ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |