diff options
| author | Ching Huang <ching2048@areca.com.tw> | 2018-03-15 02:37:40 -0400 |
|---|---|---|
| committer | Martin K. Petersen <martin.petersen@oracle.com> | 2018-03-21 18:46:30 -0400 |
| commit | c2c62ebca18bc48cb7312f519e132b79cf42ea0e (patch) | |
| tree | b94281852b9d5456d6853a025ed70ac5685d6c45 | |
| parent | c4c1adb3490ea4b8b13da2dae8d563350ded4988 (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.c | 10 |
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(®->outbound_msgaddr1); | 3812 | firmware_state = readl(®->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(®->outbound_msgaddr1); | 3832 | firmware_state = readl(®->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(®->outbound_msgaddr1); | 3851 | firmware_state = readl(®->outbound_msgaddr1); |
| 3842 | } while ((firmware_state & ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK) == 0); | 3852 | } while ((firmware_state & ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK) == 0); |
| 3843 | } | 3853 | } |
