arcmsr: clear outbound doorbell buffer
PATCH 10/16 arcmsr: clear outbound doorbell buffer
From: Ching<[email protected]>
Clearing outbound doorbell buffer completely for adapter type C.
Signed-off-by Ching<[email protected]>
---
drivers/scsi/arcmsr/arcmsr_hba.c +14 -4
@@ -2934,11 +2934,23 @@ static void arcmsr_clear_doorbell_queue_break ;case ACB_ADAPTER_TYPE_C : {struct MessageUnit_C *reg = (struct MessageUnit_C *)acb->pmuC; -uint32_t outbound_doorbell; +uint32_t outbound_doorbell, i;/* empty doorbell Qbuffer if door bell ringed */ outbound_doorbell =readl (®->outbound_doorbell);writel (outbound_doorbell, ®->outbound_doorbell_clear);writel (ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK , ®->inbound_doorbell); +for (i =0 ; i <200 ; i++) { +msleep (20 ); + outbound_doorbell =readl (®->outbound_doorbell); +if (outbound_doorbell & +ARCMSR_HBCMU_IOP2DRV_DATA_WRITE_OK ) { +writel (outbound_doorbell, + ®->outbound_doorbell_clear); +writel (ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK , + ®->inbound_doorbell); + }else +break ; + } } } }
@@ -3166,9 +3178,7 @@ sleep:arcmsr_get_firmware_spec (acb);arcmsr_start_adapter_bgrb (acb);/* clear Qbuffer if door bell ringed */ - outbound_doorbell =readl (®->outbound_doorbell); -writel (outbound_doorbell, ®->outbound_doorbell_clear);/*clear interrupt */ -writel (ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK , ®->inbound_doorbell); +arcmsr_clear_doorbell_queue_buffer (acb);/* enable outbound Post Queue,outbound doorbell Interrupt */ arcmsr_enable_outbound_ints (acb, intmask_org);atomic_set (&acb->rq_map_token,16 );
Quoted 4 lines · ching
From: Ching<[email protected]>
Clearing outbound doorbell buffer completely for adapter type C.
What are the user visible effects of this bug?
regards,
dan carpenter