|
@@ -542,6 +542,23 @@ static void ieee80211_tx_latency_end_msrmnt(struct ieee80211_local *local,
|
|
|
*/
|
|
|
#define STA_LOST_PKT_THRESHOLD 50
|
|
|
|
|
|
+static void ieee80211_lost_packet(struct sta_info *sta, struct sk_buff *skb)
|
|
|
+{
|
|
|
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
|
+
|
|
|
+ /* This packet was aggregated but doesn't carry status info */
|
|
|
+ if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
|
|
|
+ !(info->flags & IEEE80211_TX_STAT_AMPDU))
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (++sta->lost_packets < STA_LOST_PKT_THRESHOLD)
|
|
|
+ return;
|
|
|
+
|
|
|
+ cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
|
|
|
+ sta->lost_packets, GFP_ATOMIC);
|
|
|
+ sta->lost_packets = 0;
|
|
|
+}
|
|
|
+
|
|
|
void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|
|
{
|
|
|
struct sk_buff *skb2;
|
|
@@ -680,12 +697,8 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|
|
if (info->flags & IEEE80211_TX_STAT_ACK) {
|
|
|
if (sta->lost_packets)
|
|
|
sta->lost_packets = 0;
|
|
|
- } else if (++sta->lost_packets >= STA_LOST_PKT_THRESHOLD) {
|
|
|
- cfg80211_cqm_pktloss_notify(sta->sdata->dev,
|
|
|
- sta->sta.addr,
|
|
|
- sta->lost_packets,
|
|
|
- GFP_ATOMIC);
|
|
|
- sta->lost_packets = 0;
|
|
|
+ } else {
|
|
|
+ ieee80211_lost_packet(sta, skb);
|
|
|
}
|
|
|
}
|
|
|
|