aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChing Huang <ching2048@areca.com.tw>2018-03-15 02:37:40 -0400
committerMartin K. Petersen <martin.petersen@oracle.com>2018-03-21 18:46:30 -0400
commitc2c62ebca18bc48cb7312f519e132b79cf42ea0e (patch)
treeb94281852b9d5456d6853a025ed70ac5685d6c45
parentc4c1adb3490ea4b8b13da2dae8d563350ded4988 (diff)
scsi: arcmsr: Sleep to avoid CPU stuck too long for waiting adapter ready
Sleep to avoid CPU stuck too long for waiting adapter ready. Signed-off-by: Ching Huang <ching2048@areca.com.tw> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/arcmsr/arcmsr_hba.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c
index 2f52c53e4faa..732b5d9242f1 100644
--- a/drivers/scsi/arcmsr/arcmsr_hba.c
+++ b/drivers/scsi/arcmsr/arcmsr_hba.c
@@ -3807,6 +3807,8 @@ static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb)
3807 case ACB_ADAPTER_TYPE_A: { 3807 case ACB_ADAPTER_TYPE_A: {
3808 struct MessageUnit_A __iomem *reg = acb->pmuA; 3808 struct MessageUnit_A __iomem *reg = acb->pmuA;
3809 do { 3809 do {
3810 if (!(acb->acb_flags & ACB_F_IOP_INITED))
3811 msleep(20);
3810 firmware_state = readl(&reg->outbound_msgaddr1); 3812 firmware_state = readl(&reg->outbound_msgaddr1);
3811 } while ((firmware_state & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0); 3813 } while ((firmware_state & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0);
3812 } 3814 }
@@ -3815,6 +3817,8 @@ static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb)
3815 case ACB_ADAPTER_TYPE_B: { 3817 case ACB_ADAPTER_TYPE_B: {
3816 struct MessageUnit_B *reg = acb->pmuB; 3818 struct MessageUnit_B *reg = acb->pmuB;
3817 do { 3819 do {
3820 if (!(acb->acb_flags & ACB_F_IOP_INITED))
3821 msleep(20);
3818 firmware_state = readl(reg->iop2drv_doorbell); 3822 firmware_state = readl(reg->iop2drv_doorbell);
3819 } while ((firmware_state & ARCMSR_MESSAGE_FIRMWARE_OK) == 0); 3823 } while ((firmware_state & ARCMSR_MESSAGE_FIRMWARE_OK) == 0);
3820 writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT, reg->drv2iop_doorbell); 3824 writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT, reg->drv2iop_doorbell);
@@ -3823,6 +3827,8 @@ static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb)
3823 case ACB_ADAPTER_TYPE_C: { 3827 case ACB_ADAPTER_TYPE_C: {
3824 struct MessageUnit_C __iomem *reg = acb->pmuC; 3828 struct MessageUnit_C __iomem *reg = acb->pmuC;
3825 do { 3829 do {
3830 if (!(acb->acb_flags & ACB_F_IOP_INITED))
3831 msleep(20);
3826 firmware_state = readl(&reg->outbound_msgaddr1); 3832 firmware_state = readl(&reg->outbound_msgaddr1);
3827 } while ((firmware_state & ARCMSR_HBCMU_MESSAGE_FIRMWARE_OK) == 0); 3833 } while ((firmware_state & ARCMSR_HBCMU_MESSAGE_FIRMWARE_OK) == 0);
3828 } 3834 }
@@ -3830,6 +3836,8 @@ static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb)
3830 case ACB_ADAPTER_TYPE_D: { 3836 case ACB_ADAPTER_TYPE_D: {
3831 struct MessageUnit_D *reg = acb->pmuD; 3837 struct MessageUnit_D *reg = acb->pmuD;
3832 do { 3838 do {
3839 if (!(acb->acb_flags & ACB_F_IOP_INITED))
3840 msleep(20);
3833 firmware_state = readl(reg->outbound_msgaddr1); 3841 firmware_state = readl(reg->outbound_msgaddr1);
3834 } while ((firmware_state & 3842 } while ((firmware_state &
3835 ARCMSR_ARC1214_MESSAGE_FIRMWARE_OK) == 0); 3843 ARCMSR_ARC1214_MESSAGE_FIRMWARE_OK) == 0);
@@ -3838,6 +3846,8 @@ static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb)
3838 case ACB_ADAPTER_TYPE_E: { 3846 case ACB_ADAPTER_TYPE_E: {
3839 struct MessageUnit_E __iomem *reg = acb->pmuE; 3847 struct MessageUnit_E __iomem *reg = acb->pmuE;
3840 do { 3848 do {
3849 if (!(acb->acb_flags & ACB_F_IOP_INITED))
3850 msleep(20);
3841 firmware_state = readl(&reg->outbound_msgaddr1); 3851 firmware_state = readl(&reg->outbound_msgaddr1);
3842 } while ((firmware_state & ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK) == 0); 3852 } while ((firmware_state & ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK) == 0);
3843 } 3853 }