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;
+               }
                }
        }
 }
                                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);