[SCSI] mpt2sas: Timeout occurred within the HANDSHAKE logic while waiting on firmware...
authorKashyap, Desai <kashyap.desai@lsi.com>
Mon, 14 Sep 2009 05:36:21 +0000 (11:06 +0530)
committerJames Bottomley <James.Bottomley@suse.de>
Fri, 2 Oct 2009 14:49:01 +0000 (09:49 -0500)
Following a diag_reset, a request to send an ioc_init is timing out.  The
timeout occurred within the HANDSHAKE logic while waiting on firmware to
acknowledge that the driver had wrote to the doorbell register.  This was
root caused to a logic timeout in the firmware code.  The proposed solution
is for the driver to call the udelay instead of msleep API in function where
its looping reading the interrupt status.  In addition to this change, there
were two additional cases where we deleted the clearing interrupt status
outside handshake context.

Signed-off-by: Kashyap Desai <kashyap.desai@lsi.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/mpt2sas/mpt2sas_base.c

index f679bff9fc331f6e49872db10033b75027c2deac..670241efa4b555041e5b4fcb88cfe27929709d50 100644 (file)
@@ -715,7 +715,6 @@ _base_unmask_interrupts(struct MPT2SAS_ADAPTER *ioc)
 {
        u32 him_register;
 
-       writel(0, &ioc->chip->HostInterruptStatus);
        him_register = readl(&ioc->chip->HostInterruptMask);
        him_register &= ~MPI2_HIM_RIM;
        writel(him_register, &ioc->chip->HostInterruptMask);
@@ -2463,7 +2462,7 @@ _base_handshake_req_reply_wait(struct MPT2SAS_ADAPTER *ioc, int request_bytes,
            ((request_bytes/4)<<MPI2_DOORBELL_ADD_DWORDS_SHIFT)),
            &ioc->chip->Doorbell);
 
-       if ((_base_wait_for_doorbell_int(ioc, 5, sleep_flag))) {
+       if ((_base_wait_for_doorbell_int(ioc, 5, NO_SLEEP))) {
                printk(MPT2SAS_ERR_FMT "doorbell handshake "
                   "int failed (line=%d)\n", ioc->name, __LINE__);
                return -EFAULT;
@@ -3169,7 +3168,6 @@ _base_diag_reset(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
 
        drsprintk(ioc, printk(MPT2SAS_DEBUG_FMT "clear interrupts\n",
            ioc->name));
-       writel(0, &ioc->chip->HostInterruptStatus);
 
        count = 0;
        do {
This page took 0.028688 seconds and 5 git commands to generate.