Index: chromeos/compat-wireless/net/mac80211/status.c |
diff --git a/chromeos/compat-wireless/net/mac80211/status.c b/chromeos/compat-wireless/net/mac80211/status.c |
index c5fc7551a568b871e0a76aa27f6f327dcc5c2b22..98145de43c82cb4f1f457a5bdd6920efbcc3a485 100644 |
--- a/chromeos/compat-wireless/net/mac80211/status.c |
+++ b/chromeos/compat-wireless/net/mac80211/status.c |
@@ -58,6 +58,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, |
info->control.vif = &sta->sdata->vif; |
info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING | |
IEEE80211_TX_INTFL_RETRANSMISSION; |
+ info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS; |
sta->tx_filtered_count++; |
@@ -123,18 +124,14 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, |
dev_kfree_skb(skb); |
} |
-static void ieee80211_sta_tx_status(struct sta_info *sta, struct sk_buff *skb) |
+static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb) |
{ |
struct ieee80211_mgmt *mgmt = (void *) skb->data; |
struct ieee80211_local *local = sta->local; |
struct ieee80211_sub_if_data *sdata = sta->sdata; |
- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
- |
- if (sdata->vif.type != NL80211_IFTYPE_STATION) |
- return; |
if (ieee80211_is_action(mgmt->frame_control) && |
- (info->flags & IEEE80211_TX_STAT_ACK) && |
+ sdata->vif.type == NL80211_IFTYPE_STATION && |
mgmt->u.action.category == WLAN_CATEGORY_HT && |
mgmt->u.action.u.ht_smps.action == WLAN_HT_ACTION_SMPS) { |
/* |
@@ -158,18 +155,10 @@ static void ieee80211_sta_tx_status(struct sta_info *sta, struct sk_buff *skb) |
} |
ieee80211_queue_work(&local->hw, &local->recalc_smps); |
- } else if (ieee80211_is_probe_req(mgmt->frame_control) || |
- ieee80211_is_nullfunc(mgmt->frame_control)) { |
- struct ieee80211_if_managed *ifmgd = &sta->sdata->u.mgd; |
- |
- ifmgd->probe_acked = |
- (info->flags & IEEE80211_TX_STAT_ACK) ? true : false; |
- |
- ieee80211_queue_work(&local->hw, &ifmgd->probe_status_work); |
} else if (ieee80211_is_data(mgmt->frame_control) && |
- sdata->vif.type == NL80211_IFTYPE_STATION && |
- (info->flags & IEEE80211_TX_STAT_ACK)) { |
- struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
+ sdata->vif.type == NL80211_IFTYPE_STATION) { |
+ struct ieee80211_if_managed *ifmgd; |
+ ifmgd = &sta->sdata->u.mgd; |
if (ifmgd->cqm_bitrate_thold != 0 && |
(ifmgd->last_cqm_tx_rate.idx != sta->last_tx_rate.idx || |
(ifmgd->last_cqm_tx_rate.flags & |
@@ -203,6 +192,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) |
int retry_count = -1, i; |
int rates_idx = -1; |
bool send_to_cooked; |
+ bool acked; |
for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { |
/* the HW cannot have attempted that rate */ |
@@ -228,8 +218,8 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) |
if (memcmp(hdr->addr2, sta->sdata->vif.addr, ETH_ALEN)) |
continue; |
- if (!(info->flags & IEEE80211_TX_STAT_ACK) && |
- test_sta_flags(sta, WLAN_STA_PS_STA)) { |
+ acked = !!(info->flags & IEEE80211_TX_STAT_ACK); |
+ if (!acked && test_sta_flags(sta, WLAN_STA_PS_STA)) { |
/* |
* The STA is in power save mode, so assume |
* that this TX packet failed because of that. |
@@ -261,7 +251,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) |
rcu_read_unlock(); |
return; |
} else { |
- if (!(info->flags & IEEE80211_TX_STAT_ACK)) |
+ if (!acked) |
sta->tx_retry_failed++; |
sta->tx_retry_count += retry_count; |
} |
@@ -270,8 +260,12 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) |
if (ieee80211_vif_is_mesh(&sta->sdata->vif)) |
ieee80211s_update_metric(local, sta, skb); |
- if (!(info->flags & IEEE80211_TX_CTL_INJECTED)) |
- ieee80211_sta_tx_status(sta, skb); |
+ if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked) |
+ ieee80211_frame_acked(sta, skb); |
+ |
+ if ((sta->sdata->vif.type == NL80211_IFTYPE_STATION) && |
+ (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) |
+ ieee80211_sta_tx_notify(sta->sdata, (void *) skb->data, acked); |
} |
rcu_read_unlock(); |
@@ -406,7 +400,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) |
skb2 = skb_clone(skb, GFP_ATOMIC); |
if (skb2) { |
skb2->dev = prev_dev; |
- netif_receive_skb(skb2); |
+ netif_rx(skb2); |
} |
} |
@@ -415,7 +409,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) |
} |
if (prev_dev) { |
skb->dev = prev_dev; |
- netif_receive_skb(skb); |
+ netif_rx(skb); |
skb = NULL; |
} |
rcu_read_unlock(); |