Commit 007e7aa9 authored by Robert Elliott's avatar Robert Elliott Committed by James Bottomley

hpsa: shorten the wait for the CISS doorbell mode change ack

Shorten the wait for the CISS configuration table doorbell mode
change acknowledgment from 300-600 s to 20 s, which is the value
specified in the CISS specification that should be honored by
all controllers.

Wait using interruptible msleep() rather than uninterruptible
usleep_range(), which triggers rt_sched timeout errors if the
wait is long.
Reviewed-by: default avatarScott Teel <scott.teel@pmcs.com>
Signed-off-by: default avatarRobert Elliott <elliott@hp.com>
Signed-off-by: default avatarDon Brace <don.brace@pmcs.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 8ebc9248
...@@ -60,8 +60,11 @@ ...@@ -60,8 +60,11 @@
#define DRIVER_NAME "HP HPSA Driver (v " HPSA_DRIVER_VERSION ")" #define DRIVER_NAME "HP HPSA Driver (v " HPSA_DRIVER_VERSION ")"
#define HPSA "hpsa" #define HPSA "hpsa"
/* How long to wait (in milliseconds) for board to go into simple mode */ /* How long to wait for CISS doorbell communication */
#define MAX_CONFIG_WAIT 30000 #define CLEAR_EVENT_WAIT_INTERVAL 20 /* ms for each msleep() call */
#define MODE_CHANGE_WAIT_INTERVAL 10 /* ms for each msleep() call */
#define MAX_CLEAR_EVENT_WAIT 30000 /* times 20 ms = 600 s */
#define MAX_MODE_CHANGE_WAIT 2000 /* times 10 ms = 20 s */
#define MAX_IOCTL_CONFIG_WAIT 1000 #define MAX_IOCTL_CONFIG_WAIT 1000
/*define how many times we will try a command because of bus resets */ /*define how many times we will try a command because of bus resets */
...@@ -6194,14 +6197,14 @@ static void hpsa_wait_for_clear_event_notify_ack(struct ctlr_info *h) ...@@ -6194,14 +6197,14 @@ static void hpsa_wait_for_clear_event_notify_ack(struct ctlr_info *h)
u32 doorbell_value; u32 doorbell_value;
unsigned long flags; unsigned long flags;
/* wait until the clear_event_notify bit 6 is cleared by controller. */ /* wait until the clear_event_notify bit 6 is cleared by controller. */
for (i = 0; i < MAX_CONFIG_WAIT; i++) { for (i = 0; i < MAX_CLEAR_EVENT_WAIT; i++) {
spin_lock_irqsave(&h->lock, flags); spin_lock_irqsave(&h->lock, flags);
doorbell_value = readl(h->vaddr + SA5_DOORBELL); doorbell_value = readl(h->vaddr + SA5_DOORBELL);
spin_unlock_irqrestore(&h->lock, flags); spin_unlock_irqrestore(&h->lock, flags);
if (!(doorbell_value & DOORBELL_CLEAR_EVENTS)) if (!(doorbell_value & DOORBELL_CLEAR_EVENTS))
break; break;
/* delay and try again */ /* delay and try again */
msleep(20); msleep(CLEAR_EVENT_WAIT_INTERVAL);
} }
} }
...@@ -6215,14 +6218,14 @@ static void hpsa_wait_for_mode_change_ack(struct ctlr_info *h) ...@@ -6215,14 +6218,14 @@ static void hpsa_wait_for_mode_change_ack(struct ctlr_info *h)
* (e.g.: hot replace a failed 144GB drive in a RAID 5 set right * (e.g.: hot replace a failed 144GB drive in a RAID 5 set right
* as we enter this code.) * as we enter this code.)
*/ */
for (i = 0; i < MAX_CONFIG_WAIT; i++) { for (i = 0; i < MAX_MODE_CHANGE_WAIT; i++) {
spin_lock_irqsave(&h->lock, flags); spin_lock_irqsave(&h->lock, flags);
doorbell_value = readl(h->vaddr + SA5_DOORBELL); doorbell_value = readl(h->vaddr + SA5_DOORBELL);
spin_unlock_irqrestore(&h->lock, flags); spin_unlock_irqrestore(&h->lock, flags);
if (!(doorbell_value & CFGTBL_ChangeReq)) if (!(doorbell_value & CFGTBL_ChangeReq))
break; break;
/* delay and try again */ /* delay and try again */
usleep_range(10000, 20000); msleep(MODE_CHANGE_WAIT_INTERVAL);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment