--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
-@@ -2056,6 +2056,9 @@ struct ieee80211_txq {
- * The stack will not do fragmentation.
- * The callback for @set_frag_threshold should be set as well.
+@@ -2059,6 +2059,9 @@ struct ieee80211_txq {
+ * @IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA: Hardware supports buffer STA on
+ * TDLS links.
*
+ * @IEEE80211_HW_NEEDS_ALIGNED4_SKBS: Driver need aligned skbs to four-byte.
+ * Padding will be added after ieee80211_hdr, before IV/LLC.
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
*/
enum ieee80211_hw_flags {
-@@ -2098,6 +2101,7 @@ enum ieee80211_hw_flags {
- IEEE80211_HW_TX_FRAG_LIST,
+@@ -2102,6 +2105,7 @@ enum ieee80211_hw_flags {
IEEE80211_HW_REPORTS_LOW_ACK,
IEEE80211_HW_SUPPORTS_TX_FRAG,
+ IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA,
+ IEEE80211_HW_NEEDS_ALIGNED4_SKBS,
/* keep last, obviously */
NUM_IEEE80211_HW_FLAGS
--- a/net/mac80211/debugfs.c
+++ b/net/mac80211/debugfs.c
-@@ -211,6 +211,7 @@ static const char *hw_flag_names[] = {
- FLAG(TX_FRAG_LIST),
+@@ -212,6 +212,7 @@ static const char *hw_flag_names[] = {
FLAG(REPORTS_LOW_ACK),
FLAG(SUPPORTS_TX_FRAG),
+ FLAG(SUPPORTS_TDLS_BUFFER_STA),
+ FLAG(NEEDS_ALIGNED4_SKBS),
#undef FLAG
};
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
-@@ -1547,6 +1547,29 @@ ieee80211_vif_get_num_mcast_if(struct ie
+@@ -1548,6 +1548,29 @@ ieee80211_vif_get_num_mcast_if(struct ie
return -1;
}
unsigned int mpdu_len,
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
-@@ -290,7 +290,7 @@ struct ieee80211_fast_tx {
+@@ -300,7 +300,7 @@ struct ieee80211_fast_tx {
u8 hdr_len;
u8 sa_offs, da_offs, pn_offs;
u8 band;
if (likely(sta)) {
if (!IS_ERR(sta))
-@@ -2150,7 +2149,7 @@ netdev_tx_t ieee80211_monitor_start_xmit
+@@ -2184,7 +2183,7 @@ netdev_tx_t ieee80211_monitor_start_xmit
goto fail;
hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr);
if (skb->len < len_rthdr + hdrlen)
goto fail;
-@@ -2368,7 +2367,7 @@ static struct sk_buff *ieee80211_build_h
+@@ -2402,7 +2401,7 @@ static struct sk_buff *ieee80211_build_h
struct ieee80211_chanctx_conf *chanctx_conf;
struct ieee80211_sub_if_data *ap_sdata;
enum nl80211_band band;
if (IS_ERR(sta))
sta = NULL;
-@@ -2588,6 +2587,9 @@ static struct sk_buff *ieee80211_build_h
+@@ -2622,6 +2621,9 @@ static struct sk_buff *ieee80211_build_h
hdrlen += 2;
}
/*
* Drop unicast frames to unauthorised stations unless they are
* EAPOL frames from the local station.
-@@ -2668,6 +2670,7 @@ static struct sk_buff *ieee80211_build_h
+@@ -2702,6 +2704,7 @@ static struct sk_buff *ieee80211_build_h
skb_pull(skb, skip_header_bytes);
head_need = hdrlen + encaps_len + meshhdrlen - skb_headroom(skb);
/*
* So we need to modify the skb header and hence need a copy of
-@@ -2700,6 +2703,9 @@ static struct sk_buff *ieee80211_build_h
+@@ -2734,6 +2737,9 @@ static struct sk_buff *ieee80211_build_h
memcpy(skb_push(skb, meshhdrlen), &mesh_hdr, meshhdrlen);
#endif
if (ieee80211_is_data_qos(fc)) {
__le16 *qos_control;
-@@ -2875,6 +2881,9 @@ void ieee80211_check_fast_xmit(struct st
+@@ -2909,6 +2915,9 @@ void ieee80211_check_fast_xmit(struct st
fc |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
}
/* We store the key here so there's no point in using rcu_dereference()
* but that's fine because the code that changes the pointers will call
* this function after doing so. For a single CPU that would be enough,
-@@ -3461,7 +3470,7 @@ begin:
+@@ -3495,7 +3504,7 @@ begin:
if (tx.key &&
(tx.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))