mirror of https://gitee.com/openkylin/linux.git
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: Christian Lamparter <chunkeey@googlemail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
c42d6cf25d
commit
aa32452dcf
|
@ -283,6 +283,7 @@ struct ar9170 {
|
|||
unsigned int mem_blocks;
|
||||
unsigned int mem_block_size;
|
||||
unsigned int rx_size;
|
||||
unsigned int tx_seq_table;
|
||||
} fw;
|
||||
|
||||
/* reset / stuck frames/queue detection */
|
||||
|
|
|
@ -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_chk_desc *chk_desc;
|
||||
const struct carl9170fw_last_desc *last_desc;
|
||||
const struct carl9170fw_txsq_desc *txsq_desc;
|
||||
|
||||
last_desc = carl9170_fw_find_desc(ar, LAST_MAGIC,
|
||||
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)
|
|||
}
|
||||
}
|
||||
|
||||
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
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -662,6 +662,13 @@ static int carl9170_op_add_interface(struct ieee80211_hw *hw,
|
|||
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:
|
||||
if (err && (vif_id >= 0)) {
|
||||
vif_priv->active = false;
|
||||
|
|
|
@ -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))
|
||||
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)))
|
||||
txc->s.misc |= CARL9170_TX_SUPER_MISC_FILL_IN_TSF;
|
||||
|
||||
|
|
Loading…
Reference in New Issue