Commit aa32452d authored by Christian Lamparter's avatar Christian Lamparter Committed by John W. Linville

carl9170: utilize fw seq counter for mgmt/non-QoS data frames

"mac80211 will properly assign sequence numbers to QoS-data
frames but cannot do so correctly for non-QoS-data and
management frames because beacons need them from that counter
as well and mac80211 cannot guarantee proper sequencing."
Signed-off-by: default avatarChristian Lamparter <chunkeey@googlemail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c42d6cf2
...@@ -283,6 +283,7 @@ struct ar9170 { ...@@ -283,6 +283,7 @@ struct ar9170 {
unsigned int mem_blocks; unsigned int mem_blocks;
unsigned int mem_block_size; unsigned int mem_block_size;
unsigned int rx_size; unsigned int rx_size;
unsigned int tx_seq_table;
} fw; } fw;
/* reset / stuck frames/queue detection */ /* reset / stuck frames/queue detection */
......
...@@ -150,6 +150,7 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len) ...@@ -150,6 +150,7 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len)
const struct carl9170fw_otus_desc *otus_desc; const struct carl9170fw_otus_desc *otus_desc;
const struct carl9170fw_chk_desc *chk_desc; const struct carl9170fw_chk_desc *chk_desc;
const struct carl9170fw_last_desc *last_desc; const struct carl9170fw_last_desc *last_desc;
const struct carl9170fw_txsq_desc *txsq_desc;
last_desc = carl9170_fw_find_desc(ar, LAST_MAGIC, last_desc = carl9170_fw_find_desc(ar, LAST_MAGIC,
sizeof(*last_desc), CARL9170FW_LAST_DESC_CUR_VER); sizeof(*last_desc), CARL9170FW_LAST_DESC_CUR_VER);
...@@ -299,6 +300,17 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len) ...@@ -299,6 +300,17 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len)
} }
} }
txsq_desc = carl9170_fw_find_desc(ar, TXSQ_MAGIC,
sizeof(*txsq_desc), CARL9170FW_TXSQ_DESC_CUR_VER);
if (txsq_desc) {
ar->fw.tx_seq_table = le32_to_cpu(txsq_desc->seq_table_addr);
if (!valid_cpu_addr(ar->fw.tx_seq_table))
return -EINVAL;
} else {
ar->fw.tx_seq_table = 0;
}
#undef SUPPORTED #undef SUPPORTED
return 0; return 0;
} }
......
...@@ -662,6 +662,13 @@ static int carl9170_op_add_interface(struct ieee80211_hw *hw, ...@@ -662,6 +662,13 @@ static int carl9170_op_add_interface(struct ieee80211_hw *hw,
goto unlock; goto unlock;
} }
if (ar->fw.tx_seq_table) {
err = carl9170_write_reg(ar, ar->fw.tx_seq_table + vif_id * 4,
0);
if (err)
goto unlock;
}
unlock: unlock:
if (err && (vif_id >= 0)) { if (err && (vif_id >= 0)) {
vif_priv->active = false; vif_priv->active = false;
......
...@@ -862,6 +862,9 @@ static int carl9170_tx_prepare(struct ar9170 *ar, struct sk_buff *skb) ...@@ -862,6 +862,9 @@ static int carl9170_tx_prepare(struct ar9170 *ar, struct sk_buff *skb)
if (unlikely(info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM)) if (unlikely(info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM))
txc->s.misc |= CARL9170_TX_SUPER_MISC_CAB; txc->s.misc |= CARL9170_TX_SUPER_MISC_CAB;
if (unlikely(info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ))
txc->s.misc |= CARL9170_TX_SUPER_MISC_ASSIGN_SEQ;
if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) if (unlikely(ieee80211_is_probe_resp(hdr->frame_control)))
txc->s.misc |= CARL9170_TX_SUPER_MISC_FILL_IN_TSF; txc->s.misc |= CARL9170_TX_SUPER_MISC_FILL_IN_TSF;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment