|
@@ -1063,6 +1063,7 @@ static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
|
|
|
bool is_agg = false;
|
|
|
__le16 fc = hdr->frame_control;
|
|
|
u8 hdr_len = ieee80211_hdrlen(fc);
|
|
|
+ u16 __maybe_unused wifi_seq;
|
|
|
|
|
|
/*
|
|
|
* Send this frame after DTIM -- there's a special queue
|
|
@@ -1093,6 +1094,18 @@ static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
|
|
|
txq = &trans_pcie->txq[txq_id];
|
|
|
q = &txq->q;
|
|
|
|
|
|
+ /* In AGG mode, the index in the ring must correspond to the WiFi
|
|
|
+ * sequence number. This is a HW requirements to help the SCD to parse
|
|
|
+ * the BA.
|
|
|
+ * Check here that the packets are in the right place on the ring.
|
|
|
+ */
|
|
|
+#ifdef CONFIG_IWLWIFI_DEBUG
|
|
|
+ wifi_seq = SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
|
|
|
+ WARN_ONCE(is_agg && ((wifi_seq & 0xff) != q->write_ptr),
|
|
|
+ "Q: %d WiFi Seq %d tfdNum %d",
|
|
|
+ txq_id, wifi_seq, q->write_ptr);
|
|
|
+#endif
|
|
|
+
|
|
|
/* Set up driver data for this TFD */
|
|
|
txq->skbs[q->write_ptr] = skb;
|
|
|
txq->cmd[q->write_ptr] = dev_cmd;
|