@@ -54,7 +54,7 @@ static inline void ath10k_tx_h_seq_no(struct sk_buff *skb)
if (arvif->tx_seq_no == 0)
arvif->tx_seq_no = 0x1000;
- if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
+ if (info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT)
arvif->tx_seq_no += 0x10;
hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
hdr->seq_ctrl |= cpu_to_le16(arvif->tx_seq_no);
@@ -2122,7 +2122,7 @@ static int ath_tx_prepare(struct ieee80211_hw *hw, struct sk_buff *skb,
* BSSes.
*/
if (info->control.flags & IEEE80211_TX_CTRL_ASSIGN_SEQ) {
- if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
+ if (info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT)
sc->tx.seq_no += 0x10;
hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
@@ -406,7 +406,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,
/* use hardware sequence counter as the non-TID counter */
if (info->control.flags & IEEE80211_TX_CTRL_ASSIGN_SEQ)
mac_ctl |= B43_TXH_MAC_HWSEQ;
- if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
+ if (info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT)
mac_ctl |= B43_TXH_MAC_STMSDU;
if (phy->type == B43_PHYTYPE_A)
mac_ctl |= B43_TXH_MAC_5GHZ;
@@ -285,7 +285,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
mac_ctl |= B43legacy_TX4_MAC_ACK;
if (info->control.flags & IEEE80211_TX_CTRL_ASSIGN_SEQ)
mac_ctl |= B43legacy_TX4_MAC_HWSEQ;
- if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
+ if (info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT)
mac_ctl |= B43legacy_TX4_MAC_STMSDU;
if (rate_fb_ofdm)
mac_ctl |= B43legacy_TX4_MAC_FALLBACKOFDM;
@@ -6325,7 +6325,7 @@ brcms_c_d11hdrs_mac80211(struct brcms_c_info *wlc, struct ieee80211_hw *hw,
frameid = bcmc_fid_generate(wlc, NULL, txh);
} else {
/* Increment the counter for first fragment */
- if (tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
+ if (tx_info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT)
scb->seqnum[p->priority]++;
/* extract fragment number from frame first */
@@ -362,7 +362,7 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev,
}
if (test_bit(CONFIG_HT_DISABLED, &rt2x00dev->flags)) {
- if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT))
+ if (!(tx_info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT))
txdesc->u.ht.txop = TXOP_SIFS;
else
txdesc->u.ht.txop = TXOP_BACKOFF;
@@ -409,7 +409,7 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev,
if (ieee80211_is_mgmt(hdr->frame_control) &&
!ieee80211_is_beacon(hdr->frame_control))
txdesc->u.ht.txop = TXOP_BACKOFF;
- else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT))
+ else if (!(tx_info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT))
txdesc->u.ht.txop = TXOP_SIFS;
else
txdesc->u.ht.txop = TXOP_HTTXOP;
@@ -484,7 +484,7 @@ static void rt2x00queue_create_tx_descriptor(struct rt2x00_dev *rt2x00dev,
ieee80211_is_probe_resp(hdr->frame_control))
__set_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags);
- if ((tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) &&
+ if ((tx_info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT) &&
!test_bit(ENTRY_TXD_RTS_FRAME, &txdesc->flags))
__set_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags);
@@ -319,7 +319,7 @@ static void rtl8180_tx(struct ieee80211_hw *dev,
spin_lock_irqsave(&priv->lock, flags);
if (info->control.flags & IEEE80211_TX_CTRL_ASSIGN_SEQ) {
- if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
+ if (info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT)
priv->seqno += 0x10;
hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
hdr->seq_ctrl |= cpu_to_le16(priv->seqno);
@@ -264,7 +264,7 @@ static void rtl8187_tx(struct ieee80211_hw *dev,
}
if (info->control.flags & IEEE80211_TX_CTRL_ASSIGN_SEQ) {
- if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
+ if (info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT)
priv->seqno += 0x10;
tx_hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
tx_hdr->seq_ctrl |= cpu_to_le16(priv->seqno);
@@ -666,7 +666,7 @@ static void cs_set_control(struct zd_mac *mac, struct zd_ctrlset *cs,
cs->control = 0;
/* First fragment */
- if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
+ if (info->control.flags & IEEE80211_TX_CTRL_FIRST_FRAGMENT)
cs->control |= ZD_CS_NEED_RANDOM_BACKOFF;
/* No ACK expected (multicast, etc.) */
@@ -383,7 +383,6 @@ struct ieee80211_bss_conf {
* @IEEE80211_TX_CTL_NO_ACK: tell the low level not to wait for an ack
* @IEEE80211_TX_CTL_CLEAR_PS_FILT: clear powersave filter for destination
* station
- * @IEEE80211_TX_CTL_FIRST_FRAGMENT: this is a first fragment of the frame
* @IEEE80211_TX_CTL_SEND_AFTER_DTIM: send this frame after DTIM beacon
* @IEEE80211_TX_CTL_AMPDU: this frame should be sent as part of an A-MPDU
* @IEEE80211_TX_CTL_INJECTED: Frame was injected, internal to mac80211.
@@ -464,36 +463,35 @@ enum mac80211_tx_info_flags {
IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0),
IEEE80211_TX_CTL_NO_ACK = BIT(1),
IEEE80211_TX_CTL_CLEAR_PS_FILT = BIT(2),
- IEEE80211_TX_CTL_FIRST_FRAGMENT = BIT(3),
- IEEE80211_TX_CTL_SEND_AFTER_DTIM = BIT(4),
- IEEE80211_TX_CTL_AMPDU = BIT(5),
- IEEE80211_TX_CTL_INJECTED = BIT(6),
- IEEE80211_TX_STAT_TX_FILTERED = BIT(7),
- IEEE80211_TX_STAT_ACK = BIT(8),
- IEEE80211_TX_STAT_AMPDU = BIT(9),
- IEEE80211_TX_STAT_AMPDU_NO_BACK = BIT(10),
- IEEE80211_TX_CTL_RATE_CTRL_PROBE = BIT(11),
- IEEE80211_TX_INTFL_OFFCHAN_TX_OK = BIT(12),
- IEEE80211_TX_INTFL_NEED_TXPROCESSING = BIT(13),
- IEEE80211_TX_INTFL_RETRIED = BIT(14),
- IEEE80211_TX_INTFL_DONT_ENCRYPT = BIT(15),
- IEEE80211_TX_CTL_NO_PS_BUFFER = BIT(16),
- IEEE80211_TX_CTL_MORE_FRAMES = BIT(17),
- IEEE80211_TX_INTFL_RETRANSMISSION = BIT(18),
- IEEE80211_TX_INTFL_MLME_CONN_TX = BIT(19),
- IEEE80211_TX_INTFL_NL80211_FRAME_TX = BIT(20),
- IEEE80211_TX_CTL_LDPC = BIT(21),
- IEEE80211_TX_CTL_STBC = BIT(22) | BIT(23),
- IEEE80211_TX_CTL_TX_OFFCHAN = BIT(24),
- IEEE80211_TX_INTFL_TKIP_MIC_FAILURE = BIT(25),
- IEEE80211_TX_CTL_NO_CCK_RATE = BIT(26),
- IEEE80211_TX_STATUS_EOSP = BIT(27),
- IEEE80211_TX_CTL_USE_MINRATE = BIT(28),
- IEEE80211_TX_CTL_DONTFRAG = BIT(29),
- IEEE80211_TX_CTL_PS_RESPONSE = BIT(30),
+ IEEE80211_TX_CTL_SEND_AFTER_DTIM = BIT(3),
+ IEEE80211_TX_CTL_AMPDU = BIT(4),
+ IEEE80211_TX_CTL_INJECTED = BIT(5),
+ IEEE80211_TX_STAT_TX_FILTERED = BIT(6),
+ IEEE80211_TX_STAT_ACK = BIT(7),
+ IEEE80211_TX_STAT_AMPDU = BIT(8),
+ IEEE80211_TX_STAT_AMPDU_NO_BACK = BIT(9),
+ IEEE80211_TX_CTL_RATE_CTRL_PROBE = BIT(10),
+ IEEE80211_TX_INTFL_OFFCHAN_TX_OK = BIT(11),
+ IEEE80211_TX_INTFL_NEED_TXPROCESSING = BIT(12),
+ IEEE80211_TX_INTFL_RETRIED = BIT(13),
+ IEEE80211_TX_INTFL_DONT_ENCRYPT = BIT(14),
+ IEEE80211_TX_CTL_NO_PS_BUFFER = BIT(15),
+ IEEE80211_TX_CTL_MORE_FRAMES = BIT(16),
+ IEEE80211_TX_INTFL_RETRANSMISSION = BIT(17),
+ IEEE80211_TX_INTFL_MLME_CONN_TX = BIT(18),
+ IEEE80211_TX_INTFL_NL80211_FRAME_TX = BIT(19),
+ IEEE80211_TX_CTL_LDPC = BIT(20),
+ IEEE80211_TX_CTL_STBC = BIT(21) | BIT(22),
+ IEEE80211_TX_CTL_TX_OFFCHAN = BIT(23),
+ IEEE80211_TX_INTFL_TKIP_MIC_FAILURE = BIT(24),
+ IEEE80211_TX_CTL_NO_CCK_RATE = BIT(25),
+ IEEE80211_TX_STATUS_EOSP = BIT(26),
+ IEEE80211_TX_CTL_USE_MINRATE = BIT(27),
+ IEEE80211_TX_CTL_DONTFRAG = BIT(28),
+ IEEE80211_TX_CTL_PS_RESPONSE = BIT(29),
};
-#define IEEE80211_TX_CTL_STBC_SHIFT 22
+#define IEEE80211_TX_CTL_STBC_SHIFT 21
/**
* enum mac80211_tx_control_flags - flags to describe transmit control
@@ -504,7 +502,7 @@ enum mac80211_tx_info_flags {
* @IEEE80211_TX_CTRL_ASSIGN_SEQ: The driver has to assign a sequence
* number to this frame, taking care of not overwriting the fragment
* number and increasing the sequence number only when the
- * IEEE80211_TX_CTL_FIRST_FRAGMENT flag is set. mac80211 will properly
+ * IEEE80211_TX_CTRL_FIRST_FRAGMENT flag is set. 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.
@@ -518,6 +516,7 @@ enum mac80211_tx_info_flags {
enum mac80211_tx_control_flags {
IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0),
IEEE80211_TX_CTRL_ASSIGN_SEQ = BIT(1),
+ IEEE80211_TX_CTRL_FIRST_FRAGMENT = BIT(3),
};
/*
@@ -525,13 +524,21 @@ enum mac80211_tx_control_flags {
* set by the tx handlers for each transmission attempt by the mac80211 stack.
*/
#define IEEE80211_TX_TEMPORARY_FLAGS (IEEE80211_TX_CTL_NO_ACK | \
- IEEE80211_TX_CTL_CLEAR_PS_FILT | IEEE80211_TX_CTL_FIRST_FRAGMENT | \
+ IEEE80211_TX_CTL_CLEAR_PS_FILT | IEEE80211_TX_STATUS_EOSP | \
IEEE80211_TX_CTL_SEND_AFTER_DTIM | IEEE80211_TX_CTL_AMPDU | \
IEEE80211_TX_STAT_TX_FILTERED | IEEE80211_TX_STAT_ACK | \
IEEE80211_TX_STAT_AMPDU | IEEE80211_TX_STAT_AMPDU_NO_BACK | \
IEEE80211_TX_CTL_RATE_CTRL_PROBE | IEEE80211_TX_CTL_NO_PS_BUFFER | \
IEEE80211_TX_CTL_MORE_FRAMES | IEEE80211_TX_CTL_LDPC | \
- IEEE80211_TX_CTL_STBC | IEEE80211_TX_STATUS_EOSP)
+ IEEE80211_TX_CTL_STBC)
+
+/*
+ * This definition is used to clear all temporary flags, which are only used
+ * within the tx path as long as ieee80211_tx_info control is valid and
+ * info->control.flags is used.
+ */
+#define IEEE80211_TX_TEMPORARY_CTRL_FLAGS (IEEE80211_TX_CTL_FIRST_FRAGMENT)
+
/**
* enum mac80211_rate_control_flags - per-rate flags set by the
@@ -66,6 +66,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING |
IEEE80211_TX_INTFL_RETRANSMISSION;
info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
+ info->control.flags &= ~IEEE80211_TX_TEMPORARY_CTRL_FLAGS;
sta->tx_filtered_count++;
@@ -856,8 +856,8 @@ static int ieee80211_fragment(struct ieee80211_tx_data *tx,
memcpy(tmp->cb, skb->cb, sizeof(tmp->cb));
info = IEEE80211_SKB_CB(tmp);
- info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT |
- IEEE80211_TX_CTL_FIRST_FRAGMENT);
+ info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT);
+ info->control.flags &= ~(IEEE80211_TX_CTRL_FIRST_FRAGMENT);
if (rem)
info->flags |= IEEE80211_TX_CTL_MORE_FRAMES;
@@ -1171,7 +1171,7 @@ ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata,
else if (test_and_clear_sta_flag(tx->sta, WLAN_STA_CLEAR_PS_FILT))
info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT;
- info->flags |= IEEE80211_TX_CTL_FIRST_FRAGMENT;
+ info->control.flags |= IEEE80211_TX_CTRL_FIRST_FRAGMENT;
return TX_CONTINUE;
}
@@ -2642,9 +2642,9 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
info->control.vif = vif;
- info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT |
- IEEE80211_TX_CTL_FIRST_FRAGMENT;
- info->control.flags |= IEEE80211_TX_CTRL_ASSIGN_SEQ;
+ info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT;
+ info->control.flags |= IEEE80211_TX_CTRL_ASSIGN_SEQ |
+ IEEE80211_TX_CTL_FIRST_FRAGMENT;
out:
rcu_read_unlock();
return skb;