[SCSI] stex: change wait loop code
The original wait loop may be much longer than intended time. Use more accurate timer_after for it. Also adjust wait value to avoid unnecessary long waiting. Signed-off-by: Ed Lin <ed.lin@promise.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
94e9108b5a
commit
76fbf96f82
|
@ -76,9 +76,10 @@ enum {
|
||||||
MU_STATE_STARTED = 4,
|
MU_STATE_STARTED = 4,
|
||||||
MU_STATE_RESETTING = 5,
|
MU_STATE_RESETTING = 5,
|
||||||
|
|
||||||
MU_MAX_DELAY_TIME = 240000,
|
MU_MAX_DELAY = 120,
|
||||||
MU_HANDSHAKE_SIGNATURE = 0x55aaaa55,
|
MU_HANDSHAKE_SIGNATURE = 0x55aaaa55,
|
||||||
MU_HANDSHAKE_SIGNATURE_HALF = 0x5a5a0000,
|
MU_HANDSHAKE_SIGNATURE_HALF = 0x5a5a0000,
|
||||||
|
MU_HARD_RESET_WAIT = 30000,
|
||||||
HMU_PARTNER_TYPE = 2,
|
HMU_PARTNER_TYPE = 2,
|
||||||
|
|
||||||
/* firmware returned values */
|
/* firmware returned values */
|
||||||
|
@ -910,23 +911,22 @@ static int stex_handshake(struct st_hba *hba)
|
||||||
struct handshake_frame *h;
|
struct handshake_frame *h;
|
||||||
dma_addr_t status_phys;
|
dma_addr_t status_phys;
|
||||||
u32 data;
|
u32 data;
|
||||||
int i;
|
unsigned long before;
|
||||||
|
|
||||||
if (readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE) {
|
if (readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE) {
|
||||||
writel(MU_INBOUND_DOORBELL_HANDSHAKE, base + IDBL);
|
writel(MU_INBOUND_DOORBELL_HANDSHAKE, base + IDBL);
|
||||||
readl(base + IDBL);
|
readl(base + IDBL);
|
||||||
for (i = 0; readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE
|
before = jiffies;
|
||||||
&& i < MU_MAX_DELAY_TIME; i++) {
|
while (readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE) {
|
||||||
rmb();
|
if (time_after(jiffies, before + MU_MAX_DELAY * HZ)) {
|
||||||
msleep(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == MU_MAX_DELAY_TIME) {
|
|
||||||
printk(KERN_ERR DRV_NAME
|
printk(KERN_ERR DRV_NAME
|
||||||
"(%s): no handshake signature\n",
|
"(%s): no handshake signature\n",
|
||||||
pci_name(hba->pdev));
|
pci_name(hba->pdev));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
rmb();
|
||||||
|
msleep(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
udelay(10);
|
udelay(10);
|
||||||
|
@ -965,18 +965,17 @@ static int stex_handshake(struct st_hba *hba)
|
||||||
readl(base + IDBL); /* flush */
|
readl(base + IDBL); /* flush */
|
||||||
|
|
||||||
udelay(10);
|
udelay(10);
|
||||||
for (i = 0; readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE
|
before = jiffies;
|
||||||
&& i < MU_MAX_DELAY_TIME; i++) {
|
while (readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE) {
|
||||||
rmb();
|
if (time_after(jiffies, before + MU_MAX_DELAY * HZ)) {
|
||||||
msleep(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == MU_MAX_DELAY_TIME) {
|
|
||||||
printk(KERN_ERR DRV_NAME
|
printk(KERN_ERR DRV_NAME
|
||||||
"(%s): no signature after handshake frame\n",
|
"(%s): no signature after handshake frame\n",
|
||||||
pci_name(hba->pdev));
|
pci_name(hba->pdev));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
rmb();
|
||||||
|
msleep(1);
|
||||||
|
}
|
||||||
|
|
||||||
writel(0, base + IMR0);
|
writel(0, base + IMR0);
|
||||||
readl(base + IMR0);
|
readl(base + IMR0);
|
||||||
|
@ -1059,7 +1058,7 @@ static void stex_hard_reset(struct st_hba *hba)
|
||||||
pci_bctl &= ~PCI_BRIDGE_CTL_BUS_RESET;
|
pci_bctl &= ~PCI_BRIDGE_CTL_BUS_RESET;
|
||||||
pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl);
|
pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl);
|
||||||
|
|
||||||
for (i = 0; i < MU_MAX_DELAY_TIME; i++) {
|
for (i = 0; i < MU_HARD_RESET_WAIT; i++) {
|
||||||
pci_read_config_word(hba->pdev, PCI_COMMAND, &pci_cmd);
|
pci_read_config_word(hba->pdev, PCI_COMMAND, &pci_cmd);
|
||||||
if (pci_cmd != 0xffff && (pci_cmd & PCI_COMMAND_MASTER))
|
if (pci_cmd != 0xffff && (pci_cmd & PCI_COMMAND_MASTER))
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue