X-Git-Url: https://jxself.org/git/?p=carl9170fw.git;a=blobdiff_plain;f=carlfw%2Fsrc%2Fwlan.c;h=9ef0ad8b1991cad358071c2b0946c47d31563381;hp=aaff3eeaf9bb2555cd6aa86f035e149060c1ab64;hb=59c208a70905fc6376383aa1e7f4f7c6811c69b3;hpb=e72388a0aa23da8bc8e24a0cbe9d523c5a9ce294 diff --git a/carlfw/src/wlan.c b/carlfw/src/wlan.c index aaff3ee..9ef0ad8 100644 --- a/carlfw/src/wlan.c +++ b/carlfw/src/wlan.c @@ -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) { @@ -181,7 +155,7 @@ static void wlan_tx_complete(struct carl9170_tx_superframe *super, static bool wlan_tx_consume_retry(struct carl9170_tx_superframe *super) { /* check if this was the last possible retry with this rate */ - if (unlikely(super->s.cnt >= super->s.tries[super->s.rix])) { + if (unlikely(super->s.cnt >= super->s.ri[super->s.rix].tries)) { /* end of the road - indicate tx failure */ if (unlikely(super->s.rix == CARL9170_TX_MAX_RETRY_RATES)) return false; @@ -196,6 +170,10 @@ static bool wlan_tx_consume_retry(struct carl9170_tx_superframe *super) /* finally - mark the old rate as USED */ super->s.rix++; + /* 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; } else { @@ -287,7 +265,7 @@ static bool wlan_tx_status(struct dma_queue *queue, success = true; - if (!!(desc->ctrl & AR9170_CTRL_FAIL_MASK)) { + if (!!(desc->ctrl & AR9170_CTRL_FAIL)) { txfail = !!(desc->ctrl & AR9170_CTRL_TXFAIL); /* reset retry indicator flags */ @@ -467,7 +445,7 @@ static void wlan_send_buffered_ba(void) sizeof(struct ar9170_tx_hwdesc) + sizeof(struct ieee80211_ba); - baf->s.tries[0] = 3; + baf->s.ri[0].tries = 3; baf->s.queue = 0; baf->f.hdr.length = sizeof(struct ieee80211_ba) + FCS_LEN; @@ -594,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)) { @@ -854,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;