aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorJavier Cardona <javier@cozybit.com>2009-08-10 15:15:49 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-08-14 09:14:00 -0400
commitd403a1c66ea1fb47ae61921eac278d4154f7ca8a (patch)
tree4389e65e85eb50524fdd3ae80fa2e172d9903bfe /net/mac80211
parent3c5772a5279de9eadfff7adb5ddea08106495fff (diff)
mac80211: Update the station failed frames average when minstrel is used.
The fail_avg value is used to compute the mesh metric, and was only being set by the pid rate control module. This fixes the mesh path selection mechanism for cards that use mistrel for rate control. Signed-off-by: Javier Cardona <javier@cozybit.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/rc80211_minstrel.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c
index 7c5142988bbb..3ea9740736a5 100644
--- a/net/mac80211/rc80211_minstrel.c
+++ b/net/mac80211/rc80211_minstrel.c
@@ -155,12 +155,16 @@ minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband,
155 struct sk_buff *skb) 155 struct sk_buff *skb)
156{ 156{
157 struct minstrel_sta_info *mi = priv_sta; 157 struct minstrel_sta_info *mi = priv_sta;
158 struct minstrel_priv *mp = (struct minstrel_priv *)priv;
158 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 159 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
159 struct ieee80211_tx_rate *ar = info->status.rates; 160 struct ieee80211_tx_rate *ar = info->status.rates;
161 struct ieee80211_local *local = hw_to_local(mp->hw);
162 struct sta_info *si;
160 int i, ndx; 163 int i, ndx;
161 int success; 164 int success;
162 165
163 success = !!(info->flags & IEEE80211_TX_STAT_ACK); 166 success = !!(info->flags & IEEE80211_TX_STAT_ACK);
167 si = sta_info_get(local, sta->addr);
164 168
165 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { 169 for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
166 if (ar[i].idx < 0) 170 if (ar[i].idx < 0)
@@ -172,8 +176,12 @@ minstrel_tx_status(void *priv, struct ieee80211_supported_band *sband,
172 176
173 mi->r[ndx].attempts += ar[i].count; 177 mi->r[ndx].attempts += ar[i].count;
174 178
175 if ((i != IEEE80211_TX_MAX_RATES - 1) && (ar[i + 1].idx < 0)) 179 if ((i != IEEE80211_TX_MAX_RATES - 1) && (ar[i + 1].idx < 0)) {
176 mi->r[ndx].success += success; 180 mi->r[ndx].success += success;
181 if (si)
182 si->fail_avg = (18050 - mi->r[ndx].probability)
183 / 180;
184 }
177 } 185 }
178 186
179 if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) && (i >= 0)) 187 if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) && (i >= 0))