goto done;
        }
 
+       /* The address supplied by the caller is in the
+        * Target CPU virtual address space.
+        *
+        * In order to use this address with the diagnostic CE,
+        * convert it from Target CPU virtual address space
+        * to CE address space
+        */
+       address = ath10k_pci_targ_cpu_to_ce_addr(ar, address);
+
        remaining_bytes = nbytes;
        ce_data = ce_data_base;
        while (remaining_bytes) {
                        goto done;
 
                /* Request CE to send from Target(!) address to Host buffer */
-               /*
-                * The address supplied by the caller is in the
-                * Target CPU virtual address space.
-                *
-                * In order to use this address with the diagnostic CE,
-                * convert it from Target CPU virtual address space
-                * to CE address space
-                */
-               address = ath10k_pci_targ_cpu_to_ce_addr(ar, address);
-
                ret = ath10k_ce_send_nolock(ce_diag, NULL, (u32)address, nbytes, 0,
                                            0);
                if (ret)
                i = 0;
                while (ath10k_ce_completed_send_next_nolock(ce_diag,
                                                            NULL) != 0) {
-                       mdelay(1);
-                       if (i++ > DIAG_ACCESS_CE_TIMEOUT_MS) {
+                       udelay(DIAG_ACCESS_CE_WAIT_US);
+                       i += DIAG_ACCESS_CE_WAIT_US;
+
+                       if (i > DIAG_ACCESS_CE_TIMEOUT_US) {
                                ret = -EBUSY;
                                goto done;
                        }
                                                            (void **)&buf,
                                                            &completed_nbytes)
                                                                != 0) {
-                       mdelay(1);
+                       udelay(DIAG_ACCESS_CE_WAIT_US);
+                       i += DIAG_ACCESS_CE_WAIT_US;
 
-                       if (i++ > DIAG_ACCESS_CE_TIMEOUT_MS) {
+                       if (i > DIAG_ACCESS_CE_TIMEOUT_US) {
                                ret = -EBUSY;
                                goto done;
                        }
                i = 0;
                while (ath10k_ce_completed_send_next_nolock(ce_diag,
                                                            NULL) != 0) {
-                       mdelay(1);
+                       udelay(DIAG_ACCESS_CE_WAIT_US);
+                       i += DIAG_ACCESS_CE_WAIT_US;
 
-                       if (i++ > DIAG_ACCESS_CE_TIMEOUT_MS) {
+                       if (i > DIAG_ACCESS_CE_TIMEOUT_US) {
                                ret = -EBUSY;
                                goto done;
                        }
                                                            (void **)&buf,
                                                            &completed_nbytes)
                                                                != 0) {
-                       mdelay(1);
+                       udelay(DIAG_ACCESS_CE_WAIT_US);
+                       i += DIAG_ACCESS_CE_WAIT_US;
 
-                       if (i++ > DIAG_ACCESS_CE_TIMEOUT_MS) {
+                       if (i > DIAG_ACCESS_CE_TIMEOUT_US) {
                                ret = -EBUSY;
                                goto done;
                        }
 
 #define CDC_WAR_DATA_CE     4
 
 /* Wait up to this many Ms for a Diagnostic Access CE operation to complete */
-#define DIAG_ACCESS_CE_TIMEOUT_MS 10
+#define DIAG_ACCESS_CE_TIMEOUT_US 10000 /* 10 ms */
+#define DIAG_ACCESS_CE_WAIT_US 50
 
 void ath10k_pci_write32(struct ath10k *ar, u32 offset, u32 value);
 void ath10k_pci_soc_write32(struct ath10k *ar, u32 addr, u32 val);