X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;ds=sidebyside;f=carlfw%2Fsrc%2Fwlan.c;h=c23831bd358ffad0f2a4d5453e4f838dbb85004f;hb=4b209fe6b104793582c9286c0367a1a9ff83e8e8;hp=50c48f9d27d5f440bb5e6a9d5c14eb1719cb7448;hpb=2bd700be49afc4c07cf45d0b537980e35322173b;p=carl9170fw.git diff --git a/carlfw/src/wlan.c b/carlfw/src/wlan.c index 50c48f9..c23831b 100644 --- a/carlfw/src/wlan.c +++ b/carlfw/src/wlan.c @@ -345,6 +345,16 @@ static bool wlan_tx_status(struct dma_queue *queue, /* update hangcheck */ fw.wlan.last_super_num[qidx] = 0; + /* + * Note: + * There could be a corner case when the TXFAIL is set + * even though the frame was properly ACKed by the peer: + * a BlockAckReq with the immediate policy will cause + * the receiving peer to produce a BlockACK unfortunately + * the MAC in this chip seems to be expecting a legacy + * ACK and marks the BAR as failed! + */ + if (!!(desc->ctrl & AR9170_CTRL_FAIL)) { txfail = !!(desc->ctrl & AR9170_CTRL_TXFAIL); @@ -554,10 +564,12 @@ static void wlan_send_buffered_ba(void) 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); + ba->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK); ba->duration = cpu_to_le16(0); - memcpy(ba->ta, ctx->ta, 6); - memcpy(ba->ra, ctx->ra, 6); + + /* the BAR contains all necessary MACs. All we need is to swap them */ + memcpy(ba->ra, ctx->ta, 6); + memcpy(ba->ta, ctx->ra, 6); /* * Unfortunately, we cannot look into the hardware's scoreboard. @@ -567,8 +579,8 @@ static void wlan_send_buffered_ba(void) memset(ba->bitmap, 0x0, sizeof(ba->bitmap)); /* - * NB: - * not entirely sure if this is 100% correct?! + * Both, the original firmare and ath9k set the NO ACK flag in + * the BA Ack Policy subfield. */ ba->control = ctx->control | cpu_to_le16(1); ba->start_seq_num = ctx->start_seq_num; @@ -622,16 +634,9 @@ static void handle_bar(struct dma_desc *desc __unused, struct ieee80211_hdr *hdr ctx = wlan_get_bar_cache_buffer(); - /* Brilliant! The BAR provides all necessary MACs! */ - memcpy(ctx->ra, bar->ta, 6); - memcpy(ctx->ta, bar->ra, 6); - - /* - * NB: - * not entirely sure if this is 100% correct to force the - * imm ack bit or not... - */ - ctx->control = bar->control | cpu_to_le16(1); + memcpy(ctx->ra, bar->ra, 6); + memcpy(ctx->ta, bar->ta, 6); + ctx->control = bar->control; ctx->start_seq_num = bar->start_seq_num; }