return data_len - sizeof(*desc) - desc->pad_len;
 }
 
+static void wl12xx_tx_delayed_compl(struct wl1271 *wl)
+{
+       if (wl->fw_status->tx_results_counter == (wl->tx_results_count & 0xff))
+               return;
+
+       wl1271_tx_complete(wl);
+}
+
 static bool wl12xx_mac_in_fuse(struct wl1271 *wl)
 {
        bool supported = false;
        .set_tx_desc_data_len   = wl12xx_set_tx_desc_data_len,
        .get_rx_buf_align       = wl12xx_get_rx_buf_align,
        .get_rx_packet_len      = wl12xx_get_rx_packet_len,
+       .tx_immediate_compl     = NULL,
+       .tx_delayed_compl       = wl12xx_tx_delayed_compl,
        .get_pg_ver             = wl12xx_get_pg_ver,
        .get_mac                = wl12xx_get_mac,
 };
 
        return wl->ops->get_rx_packet_len(wl, rx_data, data_len);
 }
 
+static inline void wlcore_hw_tx_delayed_compl(struct wl1271 *wl)
+{
+       if (wl->ops->tx_delayed_compl)
+               wl->ops->tx_delayed_compl(wl);
+}
+
+static inline void wlcore_hw_tx_immediate_compl(struct wl1271 *wl)
+{
+       if (wl->ops->tx_immediate_compl)
+               wl->ops->tx_immediate_compl(wl);
+}
+
 #endif
 
 #include "boot.h"
 #include "testmode.h"
 #include "scan.h"
+#include "hw_ops.h"
 
 #define WL1271_BOOT_RETRIES 3
 
                smp_mb__after_clear_bit();
 
                wl12xx_fw_status(wl, wl->fw_status);
+
+               wlcore_hw_tx_immediate_compl(wl);
+
                intr = le32_to_cpu(wl->fw_status->intr);
                intr &= WL1271_INTR_MASK;
                if (!intr) {
                        }
 
                        /* check for tx results */
-                       if (wl->fw_status->tx_results_counter !=
-                           (wl->tx_results_count & 0xff))
-                               wl1271_tx_complete(wl);
+                       wlcore_hw_tx_delayed_compl(wl);
 
                        /* Make sure the deferred queues don't get too long */
                        defer_count = skb_queue_len(&wl->deferred_tx_queue) +
 
                wl->tx_results_count++;
        }
 }
+EXPORT_SYMBOL(wl1271_tx_complete);
 
 void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
 {
 
        void (*prepare_read)(struct wl1271 *wl, u32 rx_desc, u32 len);
        u32 (*get_rx_packet_len)(struct wl1271 *wl, void *rx_data,
                                 u32 data_len);
+       void (*tx_delayed_compl)(struct wl1271 *wl);
+       void (*tx_immediate_compl)(struct wl1271 *wl);
        s8 (*get_pg_ver)(struct wl1271 *wl);
        void (*get_mac)(struct wl1271 *wl);
 };