Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Ed Lin and committed by
James Bottomley
76fbf96f 94e9108b

+20 -21
+20 -21
drivers/scsi/stex.c
··· 76 76 MU_STATE_STARTED = 4, 77 77 MU_STATE_RESETTING = 5, 78 78 79 - MU_MAX_DELAY_TIME = 240000, 79 + MU_MAX_DELAY = 120, 80 80 MU_HANDSHAKE_SIGNATURE = 0x55aaaa55, 81 81 MU_HANDSHAKE_SIGNATURE_HALF = 0x5a5a0000, 82 + MU_HARD_RESET_WAIT = 30000, 82 83 HMU_PARTNER_TYPE = 2, 83 84 84 85 /* firmware returned values */ ··· 911 910 struct handshake_frame *h; 912 911 dma_addr_t status_phys; 913 912 u32 data; 914 - int i; 913 + unsigned long before; 915 914 916 915 if (readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE) { 917 916 writel(MU_INBOUND_DOORBELL_HANDSHAKE, base + IDBL); 918 917 readl(base + IDBL); 919 - for (i = 0; readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE 920 - && i < MU_MAX_DELAY_TIME; i++) { 918 + before = jiffies; 919 + while (readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE) { 920 + if (time_after(jiffies, before + MU_MAX_DELAY * HZ)) { 921 + printk(KERN_ERR DRV_NAME 922 + "(%s): no handshake signature\n", 923 + pci_name(hba->pdev)); 924 + return -1; 925 + } 921 926 rmb(); 922 927 msleep(1); 923 - } 924 - 925 - if (i == MU_MAX_DELAY_TIME) { 926 - printk(KERN_ERR DRV_NAME 927 - "(%s): no handshake signature\n", 928 - pci_name(hba->pdev)); 929 - return -1; 930 928 } 931 929 } 932 930 ··· 965 965 readl(base + IDBL); /* flush */ 966 966 967 967 udelay(10); 968 - for (i = 0; readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE 969 - && i < MU_MAX_DELAY_TIME; i++) { 968 + before = jiffies; 969 + while (readl(base + OMR0) != MU_HANDSHAKE_SIGNATURE) { 970 + if (time_after(jiffies, before + MU_MAX_DELAY * HZ)) { 971 + printk(KERN_ERR DRV_NAME 972 + "(%s): no signature after handshake frame\n", 973 + pci_name(hba->pdev)); 974 + return -1; 975 + } 970 976 rmb(); 971 977 msleep(1); 972 - } 973 - 974 - if (i == MU_MAX_DELAY_TIME) { 975 - printk(KERN_ERR DRV_NAME 976 - "(%s): no signature after handshake frame\n", 977 - pci_name(hba->pdev)); 978 - return -1; 979 978 } 980 979 981 980 writel(0, base + IMR0); ··· 1058 1059 pci_bctl &= ~PCI_BRIDGE_CTL_BUS_RESET; 1059 1060 pci_write_config_byte(bus->self, PCI_BRIDGE_CONTROL, pci_bctl); 1060 1061 1061 - for (i = 0; i < MU_MAX_DELAY_TIME; i++) { 1062 + for (i = 0; i < MU_HARD_RESET_WAIT; i++) { 1062 1063 pci_read_config_word(hba->pdev, PCI_COMMAND, &pci_cmd); 1063 1064 if (pci_cmd != 0xffff && (pci_cmd & PCI_COMMAND_MASTER)) 1064 1065 break;