Messages in this thread Patch in this message | | | Date | Thu, 18 Dec 2003 09:05:06 -0600 (CST) | From | mikem@beardog ... | Subject | Re: cciss update for 2.4.24-pre1, 2 of 2 |
| |
Here's a version of the patch with the flag changed to TASK_UNINTERRUPTIBLE. Thanks for the input.
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, 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_UNINTERRUPTIBLE); + 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 ------------------------------------------------------------------------------- On Thu, 18 Dec 2003, Jens Axboe wrote: > On Wed, Dec 17 2003, Andrew Morton wrote: > > Jens Axboe <axboe@suse.de> wrote: > > > > > > > + 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; > > > > + } > > > > > > Fine as well, aren't you happy you changed this to schedule_timeout() > > > instead of busy looping? :) > > > > It will still be a busy loop if this task has a signal pending. > > TASK_UNINTERRUPTIBLE may be more appropriate... > > Agreed, that would be better. > > -- > Jens Axboe > - 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/
| |