X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=carlfw%2Fsrc%2Fwlan.c;h=50c48f9d27d5f440bb5e6a9d5c14eb1719cb7448;hb=2bd700be49afc4c07cf45d0b537980e35322173b;hp=cb2dc75c0ef43805b86989ec3a9798cbaee764fe;hpb=bd3e83c8a4065c23c0f437b231e8d4c26f82e20a;p=carl9170fw.git diff --git a/carlfw/src/wlan.c b/carlfw/src/wlan.c index cb2dc75..50c48f9 100644 --- a/carlfw/src/wlan.c +++ b/carlfw/src/wlan.c @@ -305,7 +305,7 @@ static void wlan_assign_seq(struct ieee80211_hdr *hdr, unsigned int vif) hdr->seq_ctrl &= cpu_to_le16(~IEEE80211_SCTL_SEQ); hdr->seq_ctrl |= cpu_to_le16(fw.wlan.sequence[vif]); - if (!(hdr->seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG))) + if (ieee80211_is_first_frag(hdr->seq_ctrl)) fw.wlan.sequence[vif] += 0x10; } @@ -351,6 +351,12 @@ static bool wlan_tx_status(struct dma_queue *queue, /* reset retry indicator flags */ desc->ctrl &= ~(AR9170_CTRL_TXFAIL | AR9170_CTRL_BAFAIL); + /* + * Note: wlan_tx_consume_retry will override the old + * phy [CCK,OFDM, HT, BW20/40, MCS...] and mac vectors + * [AMPDU,RTS/CTS,...] therefore be careful when they + * are used. + */ if (wlan_tx_consume_retry(super)) { /* * retry for simple and aggregated 802.11 frames. @@ -520,7 +526,7 @@ static void wlan_send_buffered_ba(void) struct ieee80211_ba *ba = (struct ieee80211_ba *) &baf->f.ba; struct carl9170_bar_ctx *ctx; - if (likely(fw.wlan.ba_head_idx == fw.wlan.ba_tail_idx)) + if (likely(!fw.wlan.queued_ba)) return; /* there's no point to continue when the ba_desc is not available. */ @@ -530,6 +536,7 @@ static void wlan_send_buffered_ba(void) ctx = &fw.wlan.ba_cache[fw.wlan.ba_head_idx]; fw.wlan.ba_head_idx++; fw.wlan.ba_head_idx %= CONFIG_CARL9170FW_BACK_REQS_NUM; + fw.wlan.queued_ba--; baf->s.len = sizeof(struct carl9170_tx_superdesc) + sizeof(struct ar9170_tx_hwdesc) + @@ -539,13 +546,12 @@ static void wlan_send_buffered_ba(void) baf->s.queue = AR9170_TXQ_VO; baf->f.hdr.length = sizeof(struct ieee80211_ba) + FCS_LEN; - /* HW Duration / Backoff */ - baf->f.hdr.mac.backoff = 1; - baf->f.hdr.mac.hw_duration = 1; + baf->f.hdr.mac.no_ack = 1; - /* take the TX rate from the RX'd BAR */ - baf->f.hdr.phy.set = ctx->phy; - baf->f.hdr.phy.tx_power = 29; /* 14.5 dBm */ + baf->f.hdr.phy.modulation = 1; /* OFDM */ + baf->f.hdr.phy.tx_power = 34; /* 17 dBm */ + baf->f.hdr.phy.chains = 1; + baf->f.hdr.phy.mcs = AR9170_TXRX_PHY_RATE_OFDM_6M; /* format outgoing BA */ ba->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_NULLFUNC); @@ -576,11 +582,13 @@ static struct carl9170_bar_ctx *wlan_get_bar_cache_buffer(void) tmp = &fw.wlan.ba_cache[fw.wlan.ba_tail_idx]; fw.wlan.ba_tail_idx++; fw.wlan.ba_tail_idx %= CONFIG_CARL9170FW_BACK_REQS_NUM; + if (fw.wlan.queued_ba < CONFIG_CARL9170FW_BACK_REQS_NUM) + fw.wlan.queued_ba++; return tmp; } -static void handle_bar(struct dma_desc *desc, struct ieee80211_hdr *hdr, +static void handle_bar(struct dma_desc *desc __unused, struct ieee80211_hdr *hdr, unsigned int len, unsigned int mac_err) { struct ieee80211_bar *bar; @@ -625,11 +633,6 @@ static void handle_bar(struct dma_desc *desc, struct ieee80211_hdr *hdr, */ ctx->control = bar->control | cpu_to_le16(1); ctx->start_seq_num = bar->start_seq_num; - ctx->phy = ar9170_rx_to_phy(desc); - if (unlikely(!ctx->phy)) { - /* provide a backup, in case ar9170_rx_to_phy fails */ - ctx->phy = cpu_to_le32(0x2cc301); - } } static void wlan_check_rx_overrun(void)