carl9170 firmware: speedup handle_rx
[carl9170fw.git] / carlfw / src / wlan.c
index 1f4afa3b618d147a7a7b9b493f85a86b5ae60a4c..9ef0ad8b1991cad358071c2b0946c47d31563381 100644 (file)
@@ -44,32 +44,6 @@ static void wlan_txupdate(unsigned int queue)
        wlan_trigger(BIT(queue));
 }
 
-static void wlan_dma_bump(unsigned int qidx)
-{
-       unsigned int offset = qidx;
-       uint32_t status, trigger;
-
-       status = get(AR9170_MAC_REG_DMA_STATUS) >> 12;
-       trigger = get(AR9170_MAC_REG_DMA_TRIGGER) >> 12;
-
-       while (offset != 0) {
-               status >>= 4;
-               trigger >>= 4;
-               offset--;
-       }
-
-       status &= 0xf;
-       trigger &= 0xf;
-
-       if ((trigger == 0xa) && (status == 0x8)) {
-               DBG("UNSTUCK");
-               wlan_txunstuck(qidx);
-       } else {
-               DBG("UPDATE");
-               wlan_txupdate(qidx);
-       }
-}
-
 #ifdef CONFIG_CARL9170FW_DEBUG
 static void wlan_dump_queue(unsigned int qidx)
 {
@@ -198,6 +172,7 @@ static bool wlan_tx_consume_retry(struct carl9170_tx_superframe *super)
 
                /* update MAC flags */
                super->f.hdr.mac.erp_prot = super->s.ri[super->s.rix].erp_prot;
+               super->f.hdr.mac.ampdu = super->s.ri[super->s.rix].ampdu;
 
                /* reinitialize try counter */
                super->s.cnt = 1;
@@ -597,8 +572,6 @@ static void handle_rx(void)
 {
        struct dma_desc *desc;
 
-       wlan_check_rx_overrun();
-
        for_each_desc_not_bits(desc, &fw.wlan.rx_queue, AR9170_OWN_BITS_HW) {
                if (unlikely(desc->totalLen < 26 ||
                    desc->totalLen > CONFIG_CARL9170FW_RX_FRAME_LEN)) {
@@ -857,6 +830,32 @@ void handle_wlan(void)
 #undef HANDLER
 }
 
+static void wlan_dma_bump(unsigned int qidx)
+{
+       unsigned int offset = qidx;
+       uint32_t status, trigger;
+
+       status = get(AR9170_MAC_REG_DMA_STATUS) >> 12;
+       trigger = get(AR9170_MAC_REG_DMA_TRIGGER) >> 12;
+
+       while (offset != 0) {
+               status >>= 4;
+               trigger >>= 4;
+               offset--;
+       }
+
+       status &= 0xf;
+       trigger &= 0xf;
+
+       if ((trigger == 0xa) && (status == 0x8)) {
+               DBG("UNSTUCK");
+               wlan_txunstuck(qidx);
+       } else {
+               DBG("UPDATE");
+               wlan_txupdate(qidx);
+       }
+}
+
 static void wlan_check_hang(void)
 {
        struct dma_desc *desc;