diff options
Diffstat (limited to 'net/mac80211/rc80211_pid_algo.c')
-rw-r--r-- | net/mac80211/rc80211_pid_algo.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/net/mac80211/rc80211_pid_algo.c b/net/mac80211/rc80211_pid_algo.c index 86eb374e3b87..b16801cde06f 100644 --- a/net/mac80211/rc80211_pid_algo.c +++ b/net/mac80211/rc80211_pid_algo.c | |||
@@ -241,7 +241,7 @@ static void rate_control_pid_tx_status(void *priv, struct ieee80211_supported_ba | |||
241 | 241 | ||
242 | /* Ignore all frames that were sent with a different rate than the rate | 242 | /* Ignore all frames that were sent with a different rate than the rate |
243 | * we currently advise mac80211 to use. */ | 243 | * we currently advise mac80211 to use. */ |
244 | if (info->tx_rate_idx != spinfo->txrate_idx) | 244 | if (info->status.rates[0].idx != spinfo->txrate_idx) |
245 | return; | 245 | return; |
246 | 246 | ||
247 | spinfo->tx_num_xmit++; | 247 | spinfo->tx_num_xmit++; |
@@ -253,10 +253,10 @@ static void rate_control_pid_tx_status(void *priv, struct ieee80211_supported_ba | |||
253 | /* We count frames that totally failed to be transmitted as two bad | 253 | /* We count frames that totally failed to be transmitted as two bad |
254 | * frames, those that made it out but had some retries as one good and | 254 | * frames, those that made it out but had some retries as one good and |
255 | * one bad frame. */ | 255 | * one bad frame. */ |
256 | if (info->status.excessive_retries) { | 256 | if (!(info->flags & IEEE80211_TX_STAT_ACK)) { |
257 | spinfo->tx_num_failed += 2; | 257 | spinfo->tx_num_failed += 2; |
258 | spinfo->tx_num_xmit++; | 258 | spinfo->tx_num_xmit++; |
259 | } else if (info->status.retry_count) { | 259 | } else if (info->status.rates[0].count > 1) { |
260 | spinfo->tx_num_failed++; | 260 | spinfo->tx_num_failed++; |
261 | spinfo->tx_num_xmit++; | 261 | spinfo->tx_num_xmit++; |
262 | } | 262 | } |
@@ -270,23 +270,32 @@ static void rate_control_pid_tx_status(void *priv, struct ieee80211_supported_ba | |||
270 | } | 270 | } |
271 | 271 | ||
272 | static void | 272 | static void |
273 | rate_control_pid_get_rate(void *priv, struct ieee80211_supported_band *sband, | 273 | rate_control_pid_get_rate(void *priv, struct ieee80211_sta *sta, |
274 | struct ieee80211_sta *sta, void *priv_sta, | 274 | void *priv_sta, |
275 | struct sk_buff *skb, | 275 | struct ieee80211_tx_rate_control *txrc) |
276 | struct rate_selection *sel) | ||
277 | { | 276 | { |
277 | struct sk_buff *skb = txrc->skb; | ||
278 | struct ieee80211_supported_band *sband = txrc->sband; | ||
278 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | 279 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; |
280 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
279 | struct rc_pid_sta_info *spinfo = priv_sta; | 281 | struct rc_pid_sta_info *spinfo = priv_sta; |
280 | int rateidx; | 282 | int rateidx; |
281 | u16 fc; | 283 | u16 fc; |
282 | 284 | ||
285 | if (txrc->rts) | ||
286 | info->control.rates[0].count = | ||
287 | txrc->hw->conf.long_frame_max_tx_count; | ||
288 | else | ||
289 | info->control.rates[0].count = | ||
290 | txrc->hw->conf.short_frame_max_tx_count; | ||
291 | |||
283 | /* Send management frames and broadcast/multicast data using lowest | 292 | /* Send management frames and broadcast/multicast data using lowest |
284 | * rate. */ | 293 | * rate. */ |
285 | fc = le16_to_cpu(hdr->frame_control); | 294 | fc = le16_to_cpu(hdr->frame_control); |
286 | if (!sta || !spinfo || | 295 | if (!sta || !spinfo || |
287 | (fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA || | 296 | (fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA || |
288 | is_multicast_ether_addr(hdr->addr1)) { | 297 | is_multicast_ether_addr(hdr->addr1)) { |
289 | sel->rate_idx = rate_lowest_index(sband, sta); | 298 | info->control.rates[0].idx = rate_lowest_index(sband, sta); |
290 | return; | 299 | return; |
291 | } | 300 | } |
292 | 301 | ||
@@ -295,7 +304,7 @@ rate_control_pid_get_rate(void *priv, struct ieee80211_supported_band *sband, | |||
295 | if (rateidx >= sband->n_bitrates) | 304 | if (rateidx >= sband->n_bitrates) |
296 | rateidx = sband->n_bitrates - 1; | 305 | rateidx = sband->n_bitrates - 1; |
297 | 306 | ||
298 | sel->rate_idx = rateidx; | 307 | info->control.rates[0].idx = rateidx; |
299 | 308 | ||
300 | #ifdef CONFIG_MAC80211_DEBUGFS | 309 | #ifdef CONFIG_MAC80211_DEBUGFS |
301 | rate_control_pid_event_tx_rate(&spinfo->events, | 310 | rate_control_pid_event_tx_rate(&spinfo->events, |
@@ -394,11 +403,11 @@ static void *rate_control_pid_alloc(struct ieee80211_hw *hw, | |||
394 | S_IRUSR | S_IWUSR, debugfsdir, | 403 | S_IRUSR | S_IWUSR, debugfsdir, |
395 | &pinfo->sampling_period); | 404 | &pinfo->sampling_period); |
396 | de->coeff_p = debugfs_create_u32("coeff_p", S_IRUSR | S_IWUSR, | 405 | de->coeff_p = debugfs_create_u32("coeff_p", S_IRUSR | S_IWUSR, |
397 | debugfsdir, &pinfo->coeff_p); | 406 | debugfsdir, (u32 *)&pinfo->coeff_p); |
398 | de->coeff_i = debugfs_create_u32("coeff_i", S_IRUSR | S_IWUSR, | 407 | de->coeff_i = debugfs_create_u32("coeff_i", S_IRUSR | S_IWUSR, |
399 | debugfsdir, &pinfo->coeff_i); | 408 | debugfsdir, (u32 *)&pinfo->coeff_i); |
400 | de->coeff_d = debugfs_create_u32("coeff_d", S_IRUSR | S_IWUSR, | 409 | de->coeff_d = debugfs_create_u32("coeff_d", S_IRUSR | S_IWUSR, |
401 | debugfsdir, &pinfo->coeff_d); | 410 | debugfsdir, (u32 *)&pinfo->coeff_d); |
402 | de->smoothing_shift = debugfs_create_u32("smoothing_shift", | 411 | de->smoothing_shift = debugfs_create_u32("smoothing_shift", |
403 | S_IRUSR | S_IWUSR, debugfsdir, | 412 | S_IRUSR | S_IWUSR, debugfsdir, |
404 | &pinfo->smoothing_shift); | 413 | &pinfo->smoothing_shift); |
@@ -437,10 +446,6 @@ static void rate_control_pid_free(void *priv) | |||
437 | kfree(pinfo); | 446 | kfree(pinfo); |
438 | } | 447 | } |
439 | 448 | ||
440 | static void rate_control_pid_clear(void *priv) | ||
441 | { | ||
442 | } | ||
443 | |||
444 | static void *rate_control_pid_alloc_sta(void *priv, struct ieee80211_sta *sta, | 449 | static void *rate_control_pid_alloc_sta(void *priv, struct ieee80211_sta *sta, |
445 | gfp_t gfp) | 450 | gfp_t gfp) |
446 | { | 451 | { |
@@ -471,7 +476,6 @@ static struct rate_control_ops mac80211_rcpid = { | |||
471 | .tx_status = rate_control_pid_tx_status, | 476 | .tx_status = rate_control_pid_tx_status, |
472 | .get_rate = rate_control_pid_get_rate, | 477 | .get_rate = rate_control_pid_get_rate, |
473 | .rate_init = rate_control_pid_rate_init, | 478 | .rate_init = rate_control_pid_rate_init, |
474 | .clear = rate_control_pid_clear, | ||
475 | .alloc = rate_control_pid_alloc, | 479 | .alloc = rate_control_pid_alloc, |
476 | .free = rate_control_pid_free, | 480 | .free = rate_control_pid_free, |
477 | .alloc_sta = rate_control_pid_alloc_sta, | 481 | .alloc_sta = rate_control_pid_alloc_sta, |