projects
/
carl9170fw.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
carl9170 firmware: fix BAR->BA delivery
[carl9170fw.git]
/
carlfw
/
src
/
wlan.c
diff --git
a/carlfw/src/wlan.c
b/carlfw/src/wlan.c
index cb2dc75c0ef43805b86989ec3a9798cbaee764fe..94ed62250d806ed262cdc86c316d2df4370fa35c 100644
(file)
--- 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]);
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;
}
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);
/* 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.
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;
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. */
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;
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) +
baf->s.len = sizeof(struct carl9170_tx_superdesc) +
sizeof(struct ar9170_tx_hwdesc) +
@@
-576,6
+583,8
@@
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;
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;
}
return tmp;
}