PKG_NAME:=mac80211
-PKG_VERSION:=4.19.207-1
+PKG_VERSION:=4.19.221-1
PKG_RELEASE:=1
-PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v4.19.207/
-PKG_HASH:=e119fd57c868e22c0481171ff561902f8c1565f896d97a2163c0d138808cc5f7
+PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v4.19.221/
+PKG_HASH:=343f54b21ddda4bc79c0457a7fa88356d430b802f86194abc20fe09c12559b05
PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION)
REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -533,6 +533,11 @@ irqreturn_t ath_isr(int irq, void *dev)
- if (test_bit(ATH_OP_HW_RESET, &common->op_flags))
+@@ -535,6 +535,11 @@ irqreturn_t ath_isr(int irq, void *dev)
return IRQ_HANDLED;
+ }
+ if (test_bit(ATH_DIAG_TRIGGER_ERROR, &ah->diag)) {
+ status |= ATH9K_INT_FATAL;
u8 ath9k_parse_mpdudensity(u8 mpdudensity)
{
-@@ -654,6 +656,7 @@ void ath_reset_work(struct work_struct *
+@@ -656,6 +658,7 @@ void ath_reset_work(struct work_struct *
static int ath9k_start(struct ieee80211_hw *hw)
{
struct ath_softc *sc = hw->priv;
struct ath_hw *ah = sc->sc_ah;
struct ath_common *common = ath9k_hw_common(ah);
struct ieee80211_channel *curchan = sc->cur_chan->chandef.chan;
-@@ -732,6 +735,11 @@ static int ath9k_start(struct ieee80211_
+@@ -734,6 +737,11 @@ static int ath9k_start(struct ieee80211_
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
}
}
-@@ -546,13 +545,13 @@ ieee80211_crypto_ccmp_decrypt(struct iee
+@@ -549,13 +548,13 @@ ieee80211_crypto_ccmp_decrypt(struct iee
u8 aad[2 * AES_BLOCK_SIZE];
u8 b_0[AES_BLOCK_SIZE];
/* hardware didn't decrypt/verify MIC */
return RX_DROP_UNUSABLE;
}
-@@ -649,7 +648,7 @@ static int gcmp_encrypt_skb(struct ieee8
+@@ -652,7 +651,7 @@ static int gcmp_encrypt_skb(struct ieee8
u8 *pos;
u8 pn[6];
u64 pn64;
u8 j_0[AES_BLOCK_SIZE];
if (info->control.hw_key &&
-@@ -706,8 +705,10 @@ static int gcmp_encrypt_skb(struct ieee8
+@@ -709,8 +708,10 @@ static int gcmp_encrypt_skb(struct ieee8
pos += IEEE80211_GCMP_HDR_LEN;
gcmp_special_blocks(skb, pn, j_0, aad);
}
ieee80211_tx_result
-@@ -1132,9 +1133,9 @@ ieee80211_crypto_aes_gmac_encrypt(struct
+@@ -1138,9 +1139,9 @@ ieee80211_crypto_aes_gmac_encrypt(struct
struct ieee80211_key *key = tx->key;
struct ieee80211_mmie_16 *mmie;
struct ieee80211_hdr *hdr;
if (WARN_ON(skb_queue_len(&tx->skbs) != 1))
return TX_DROP;
-@@ -1180,7 +1181,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct
+@@ -1186,7 +1187,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
struct ieee80211_key *key = rx->key;
struct ieee80211_mmie_16 *mmie;
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
-@@ -3841,6 +3841,12 @@ out:
+@@ -3853,6 +3853,12 @@ out:
netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
struct net_device *dev)
{
(unsigned long) local);
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
-@@ -3506,13 +3506,19 @@ struct sk_buff *ieee80211_tx_dequeue(str
+@@ -3518,13 +3518,19 @@ struct sk_buff *ieee80211_tx_dequeue(str
struct ieee80211_tx_info *info;
struct ieee80211_tx_data tx;
ieee80211_tx_result r;
/* Make sure fragments stay together. */
skb = __skb_dequeue(&txqi->frags);
if (skb)
-@@ -3625,6 +3631,7 @@ begin:
+@@ -3637,6 +3643,7 @@ begin:
}
IEEE80211_SKB_CB(skb)->control.vif = vif;
return true;
}
-@@ -3639,6 +3643,60 @@ out:
+@@ -3651,6 +3655,60 @@ out:
}
EXPORT_SYMBOL(ieee80211_tx_dequeue);
spin_lock_bh(&local->active_txq_lock[txqi->txq.ac]);
list_del_init(&txqi->schedule_order);
spin_unlock_bh(&local->active_txq_lock[txqi->txq.ac]);
-@@ -3650,11 +3653,28 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -3662,11 +3665,28 @@ struct ieee80211_txq *ieee80211_next_txq
lockdep_assert_held(&local->active_txq_lock[ac]);
return NULL;
list_del_init(&txqi->schedule_order);
-@@ -3672,12 +3692,74 @@ void ieee80211_return_txq(struct ieee802
+@@ -3684,12 +3704,74 @@ void ieee80211_return_txq(struct ieee802
lockdep_assert_held(&local->active_txq_lock[txq->ac]);
if (list_empty(&txqi->schedule_order) &&
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
-@@ -3712,6 +3712,19 @@ void ieee80211_return_txq(struct ieee802
+@@ -3724,6 +3724,19 @@ void ieee80211_return_txq(struct ieee802
}
EXPORT_SYMBOL(ieee80211_return_txq);
if (likely(sta)) {
if (!IS_ERR(sta))
tx->sta = sta;
-@@ -3544,6 +3544,7 @@ begin:
+@@ -3556,6 +3556,7 @@ begin:
tx.local = local;
tx.skb = skb;
tx.sdata = vif_to_sdata(info->control.vif);
if (txq->sta) {
tx.sta = container_of(txq->sta, struct sta_info, sta);
-@@ -3588,7 +3589,7 @@ begin:
+@@ -3600,7 +3601,7 @@ begin:
if (tx.key &&
(tx.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))
ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs,
tx.key, skb);
-@@ -4047,6 +4048,7 @@ ieee80211_build_data_template(struct iee
+@@ -4059,6 +4060,7 @@ ieee80211_build_data_template(struct iee
hdr = (void *)skb->data;
tx.sta = sta_info_get(sdata, hdr->addr1);
tx.skb = skb;
len = skb->len - hdrlen;
if (info->control.hw_key)
-@@ -663,7 +662,7 @@ static int gcmp_encrypt_skb(struct ieee8
+@@ -666,7 +665,7 @@ static int gcmp_encrypt_skb(struct ieee8
return 0;
}
len = skb->len - hdrlen;
if (info->control.hw_key)
-@@ -805,7 +804,6 @@ static ieee80211_tx_result
+@@ -811,7 +810,6 @@ static ieee80211_tx_result
ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx,
struct sk_buff *skb)
{
struct ieee80211_key *key = tx->key;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
int hdrlen;
-@@ -821,8 +819,7 @@ ieee80211_crypto_cs_encrypt(struct ieee8
+@@ -827,8 +825,7 @@ ieee80211_crypto_cs_encrypt(struct ieee8
pskb_expand_head(skb, iv_len, 0, GFP_ATOMIC)))
return TX_DROP;
ret = dev_alloc_name(ndev, ndev->name);
--- a/net/mac80211/mesh_pathtbl.c
+++ b/net/mac80211/mesh_pathtbl.c
-@@ -106,13 +106,15 @@ void mesh_path_assign_nexthop(struct mes
+@@ -109,13 +109,15 @@ void mesh_path_assign_nexthop(struct mes
static void prepare_for_gate(struct sk_buff *skb, char *dst_addr,
struct mesh_path *gate_mpath)
{
if (likely(sta)) {
if (!IS_ERR(sta))
-@@ -2239,7 +2238,7 @@ netdev_tx_t ieee80211_monitor_start_xmit
+@@ -2243,7 +2242,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;
-@@ -2458,7 +2457,7 @@ static struct sk_buff *ieee80211_build_h
+@@ -2462,7 +2461,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;
-@@ -2757,7 +2756,9 @@ static struct sk_buff *ieee80211_build_h
+@@ -2761,7 +2760,9 @@ static struct sk_buff *ieee80211_build_h
}
skb_pull(skb, skip_header_bytes);
/*
* So we need to modify the skb header and hence need a copy of
-@@ -2790,6 +2791,9 @@ static struct sk_buff *ieee80211_build_h
+@@ -2794,6 +2795,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;
-@@ -2966,6 +2970,8 @@ void ieee80211_check_fast_xmit(struct st
+@@ -2970,6 +2974,8 @@ 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,
-@@ -3544,7 +3550,7 @@ begin:
+@@ -3556,7 +3562,7 @@ begin:
tx.local = local;
tx.skb = skb;
tx.sdata = vif_to_sdata(info->control.vif);
if (txq->sta) {
tx.sta = container_of(txq->sta, struct sta_info, sta);
-@@ -4048,7 +4054,7 @@ ieee80211_build_data_template(struct iee
+@@ -4060,7 +4066,7 @@ ieee80211_build_data_template(struct iee
hdr = (void *)skb->data;
tx.sta = sta_info_get(sdata, hdr->addr1);
tx.skb = skb;
* ieee80211_txq_may_transmit - check whether TXQ is allowed to transmit
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
-@@ -3656,16 +3656,17 @@ EXPORT_SYMBOL(ieee80211_tx_dequeue);
+@@ -3668,16 +3668,17 @@ EXPORT_SYMBOL(ieee80211_tx_dequeue);
struct ieee80211_txq *ieee80211_next_txq(struct ieee80211_hw *hw, u8 ac)
{
struct ieee80211_local *local = hw_to_local(hw);
if (txqi->txq.sta) {
struct sta_info *sta = container_of(txqi->txq.sta,
-@@ -3682,21 +3683,25 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -3694,21 +3695,25 @@ struct ieee80211_txq *ieee80211_next_txq
if (txqi->schedule_round == local->schedule_round[ac])
if (list_empty(&txqi->schedule_order) &&
(!skb_queue_empty(&txqi->frags) || txqi->tin.backlog_packets)) {
-@@ -3716,18 +3721,7 @@ void ieee80211_return_txq(struct ieee802
+@@ -3728,18 +3733,7 @@ void ieee80211_return_txq(struct ieee802
list_add_tail(&txqi->schedule_order,
&local->active_txqs[txq->ac]);
}
spin_unlock_bh(&local->active_txq_lock[txq->ac]);
}
EXPORT_SYMBOL(ieee80211_schedule_txq);
-@@ -3740,7 +3734,7 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -3752,7 +3746,7 @@ bool ieee80211_txq_may_transmit(struct i
struct sta_info *sta;
u8 ac = txq->ac;
if (!txqi->txq.sta)
goto out;
-@@ -3770,34 +3764,27 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -3782,34 +3776,27 @@ bool ieee80211_txq_may_transmit(struct i
sta->airtime[ac].deficit += sta->airtime_weight;
list_move_tail(&txqi->schedule_order, &local->active_txqs[ac]);
void mesh_path_timer(struct timer_list *t)
--- a/net/mac80211/mesh_pathtbl.c
+++ b/net/mac80211/mesh_pathtbl.c
-@@ -220,7 +220,7 @@ static struct mesh_path *mpath_lookup(st
+@@ -223,7 +223,7 @@ static struct mesh_path *mpath_lookup(st
{
struct mesh_path *mpath;
schedule_and_wake_txq(local, txqi);
-@@ -3219,6 +3220,7 @@ static bool ieee80211_amsdu_aggregate(st
+@@ -3223,6 +3224,7 @@ static bool ieee80211_amsdu_aggregate(st
u8 max_subframes = sta->sta.max_amsdu_subframes;
int max_frags = local->hw.max_tx_fragments;
int max_amsdu_len = sta->sta.max_amsdu_len;
int orig_truesize;
__be16 len;
void *data;
-@@ -3241,6 +3243,8 @@ static bool ieee80211_amsdu_aggregate(st
+@@ -3245,6 +3247,8 @@ static bool ieee80211_amsdu_aggregate(st
max_amsdu_len = min_t(int, max_amsdu_len,
sta->sta.max_rc_amsdu_len);
spin_lock_bh(&fq->lock);
/* TODO: Ideally aggregation should be done on dequeue to remain
-@@ -3248,7 +3252,8 @@ static bool ieee80211_amsdu_aggregate(st
+@@ -3252,7 +3256,8 @@ static bool ieee80211_amsdu_aggregate(st
*/
tin = &txqi->tin;
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
-@@ -3526,6 +3526,7 @@ struct sk_buff *ieee80211_tx_dequeue(str
+@@ -3538,6 +3538,7 @@ struct sk_buff *ieee80211_tx_dequeue(str
ieee80211_tx_result r;
struct ieee80211_vif *vif = txq->vif;
spin_lock_bh(&fq->lock);
if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags) ||
-@@ -3542,11 +3543,12 @@ struct sk_buff *ieee80211_tx_dequeue(str
+@@ -3554,11 +3555,12 @@ struct sk_buff *ieee80211_tx_dequeue(str
if (skb)
goto out;
hdr = (struct ieee80211_hdr *)skb->data;
info = IEEE80211_SKB_CB(skb);
-@@ -3610,8 +3612,11 @@ begin:
+@@ -3622,8 +3624,11 @@ begin:
skb = __skb_dequeue(&tx.skbs);
}
if (skb && skb_has_frag_list(skb) &&
-@@ -3650,6 +3655,7 @@ begin:
+@@ -3662,6 +3667,7 @@ begin:
}
IEEE80211_SKB_CB(skb)->control.vif = vif;
ieee80211_free_txskb(&local->hw, skb);
return;
}
-@@ -2758,30 +2754,14 @@ static struct sk_buff *ieee80211_build_h
+@@ -2762,30 +2758,14 @@ static struct sk_buff *ieee80211_build_h
skb_pull(skb, skip_header_bytes);
padsize = ieee80211_hdr_padsize(&local->hw, hdrlen);
}
if (encaps_data)
-@@ -3396,7 +3376,6 @@ static bool ieee80211_xmit_fast(struct i
+@@ -3408,7 +3388,6 @@ static bool ieee80211_xmit_fast(struct i
struct ieee80211_local *local = sdata->local;
u16 ethertype = (skb->data[12] << 8) | skb->data[13];
int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2);
struct ethhdr eth;
struct ieee80211_tx_info *info;
struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
-@@ -3448,10 +3427,7 @@ static bool ieee80211_xmit_fast(struct i
+@@ -3460,10 +3439,7 @@ static bool ieee80211_xmit_fast(struct i
* as the may-encrypt argument for the resize to not account for
* more room than we already have in 'extra_head'
*/
/**
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
-@@ -3682,8 +3682,9 @@ out:
+@@ -3694,8 +3694,9 @@ out:
}
EXPORT_SYMBOL(ieee80211_next_txq);
{
struct ieee80211_local *local = hw_to_local(hw);
struct txq_info *txqi = to_txq_info(txq);
-@@ -3691,7 +3692,8 @@ void ieee80211_schedule_txq(struct ieee8
+@@ -3703,7 +3704,8 @@ void ieee80211_schedule_txq(struct ieee8
spin_lock_bh(&local->active_txq_lock[txq->ac]);
if (list_empty(&txqi->schedule_order) &&
/* If airtime accounting is active, always enqueue STAs at the
* head of the list to ensure that they only get moved to the
* back by the airtime DRR scheduler once they have a negative
-@@ -3711,7 +3713,7 @@ void ieee80211_schedule_txq(struct ieee8
+@@ -3723,7 +3725,7 @@ void ieee80211_schedule_txq(struct ieee8
spin_unlock_bh(&local->active_txq_lock[txq->ac]);
}
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
-@@ -3781,6 +3781,7 @@ void __ieee80211_subif_start_xmit(struct
+@@ -3793,6 +3793,7 @@ void __ieee80211_subif_start_xmit(struct
u32 ctrl_flags)
{
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct sta_info *sta;
struct sk_buff *next;
-@@ -3794,7 +3795,15 @@ void __ieee80211_subif_start_xmit(struct
+@@ -3806,7 +3807,15 @@ void __ieee80211_subif_start_xmit(struct
if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
goto out_free;
/**
--- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c
-@@ -952,7 +952,8 @@ ieee80211_crypto_aes_cmac_encrypt(struct
+@@ -958,7 +958,8 @@ ieee80211_crypto_aes_cmac_encrypt(struct
info = IEEE80211_SKB_CB(skb);
return TX_CONTINUE;
if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
-@@ -968,6 +969,9 @@ ieee80211_crypto_aes_cmac_encrypt(struct
+@@ -974,6 +975,9 @@ ieee80211_crypto_aes_cmac_encrypt(struct
bip_ipn_set64(mmie->sequence_number, pn64);