Re: cciss update for 2.4.24-pre1, 2 of 2

From: mikem
Date: Thu Dec 18 2003 - 10:04:59 EST


Here's a version of the patch with the flag changed to
TASK_UNINTERRUPTIBLE. Thanks for the input.

Thanks,
mikem
mike.miller@xxxxxx
-------------------------------------------------------------------------------
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@xxxxxxx> 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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/