1 /******************************************************************************
3 * Copyright(c) 2005 - 2009 Intel Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
21 * Contact Information:
22 * Intel Linux Wireless <ilw@linux.intel.com>
23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
25 *****************************************************************************/
27 #include <linux/kernel.h>
28 #include <linux/init.h>
29 #include <linux/skbuff.h>
30 #include <linux/wireless.h>
31 #include <net/mac80211.h>
33 #include <linux/netdevice.h>
34 #include <linux/etherdevice.h>
35 #include <linux/delay.h>
37 #include <linux/workqueue.h>
39 #include "iwl-commands.h"
43 #define RS_NAME "iwl-3945-rs"
45 struct iwl3945_rate_scale_data
{
54 struct iwl3945_rs_sta
{
56 struct iwl_priv
*priv
;
58 unsigned long last_partial_flush
;
59 unsigned long last_flush
;
67 struct timer_list rate_scale_flush
;
68 struct iwl3945_rate_scale_data win
[IWL_RATE_COUNT_3945
];
69 #ifdef CONFIG_MAC80211_DEBUGFS
70 struct dentry
*rs_sta_dbgfs_stats_table_file
;
73 /* used to be in sta_info */
77 static s32 iwl3945_expected_tpt_g
[IWL_RATE_COUNT_3945
] = {
78 7, 13, 35, 58, 0, 0, 76, 104, 130, 168, 191, 202
81 static s32 iwl3945_expected_tpt_g_prot
[IWL_RATE_COUNT_3945
] = {
82 7, 13, 35, 58, 0, 0, 0, 80, 93, 113, 123, 125
85 static s32 iwl3945_expected_tpt_a
[IWL_RATE_COUNT_3945
] = {
86 0, 0, 0, 0, 40, 57, 72, 98, 121, 154, 177, 186
89 static s32 iwl3945_expected_tpt_b
[IWL_RATE_COUNT_3945
] = {
90 7, 13, 35, 58, 0, 0, 0, 0, 0, 0, 0, 0
93 struct iwl3945_tpt_entry
{
98 static struct iwl3945_tpt_entry iwl3945_tpt_table_a
[] = {
99 {-60, IWL_RATE_54M_INDEX
},
100 {-64, IWL_RATE_48M_INDEX
},
101 {-72, IWL_RATE_36M_INDEX
},
102 {-80, IWL_RATE_24M_INDEX
},
103 {-84, IWL_RATE_18M_INDEX
},
104 {-85, IWL_RATE_12M_INDEX
},
105 {-87, IWL_RATE_9M_INDEX
},
106 {-89, IWL_RATE_6M_INDEX
}
109 static struct iwl3945_tpt_entry iwl3945_tpt_table_g
[] = {
110 {-60, IWL_RATE_54M_INDEX
},
111 {-64, IWL_RATE_48M_INDEX
},
112 {-68, IWL_RATE_36M_INDEX
},
113 {-80, IWL_RATE_24M_INDEX
},
114 {-84, IWL_RATE_18M_INDEX
},
115 {-85, IWL_RATE_12M_INDEX
},
116 {-86, IWL_RATE_11M_INDEX
},
117 {-88, IWL_RATE_5M_INDEX
},
118 {-90, IWL_RATE_2M_INDEX
},
119 {-92, IWL_RATE_1M_INDEX
}
122 #define IWL_RATE_MAX_WINDOW 62
123 #define IWL_RATE_FLUSH (3*HZ)
124 #define IWL_RATE_WIN_FLUSH (HZ/2)
125 #define IWL39_RATE_HIGH_TH 11520
126 #define IWL_SUCCESS_UP_TH 8960
127 #define IWL_SUCCESS_DOWN_TH 10880
128 #define IWL_RATE_MIN_FAILURE_TH 6
129 #define IWL_RATE_MIN_SUCCESS_TH 8
130 #define IWL_RATE_DECREASE_TH 1920
131 #define IWL_RATE_RETRY_TH 15
133 static u8
iwl3945_get_rate_index_by_rssi(s32 rssi
, enum ieee80211_band band
)
137 struct iwl3945_tpt_entry
*tpt_table
= NULL
;
139 if ((rssi
< IWL_MIN_RSSI_VAL
) || (rssi
> IWL_MAX_RSSI_VAL
))
140 rssi
= IWL_MIN_RSSI_VAL
;
143 case IEEE80211_BAND_2GHZ
:
144 tpt_table
= iwl3945_tpt_table_g
;
145 table_size
= ARRAY_SIZE(iwl3945_tpt_table_g
);
148 case IEEE80211_BAND_5GHZ
:
149 tpt_table
= iwl3945_tpt_table_a
;
150 table_size
= ARRAY_SIZE(iwl3945_tpt_table_a
);
158 while ((index
< table_size
) && (rssi
< tpt_table
[index
].min_rssi
))
161 index
= min(index
, (table_size
- 1));
163 return tpt_table
[index
].index
;
166 static void iwl3945_clear_window(struct iwl3945_rate_scale_data
*window
)
169 window
->success_counter
= 0;
170 window
->success_ratio
= -1;
172 window
->average_tpt
= IWL_INVALID_VALUE
;
177 * iwl3945_rate_scale_flush_windows - flush out the rate scale windows
179 * Returns the number of windows that have gathered data but were
180 * not flushed. If there were any that were not flushed, then
181 * reschedule the rate flushing routine.
183 static int iwl3945_rate_scale_flush_windows(struct iwl3945_rs_sta
*rs_sta
)
188 struct iwl_priv
*priv __maybe_unused
= rs_sta
->priv
;
191 * For each rate, if we have collected data on that rate
192 * and it has been more than IWL_RATE_WIN_FLUSH
193 * since we flushed, clear out the gathered statistics
195 for (i
= 0; i
< IWL_RATE_COUNT_3945
; i
++) {
196 if (!rs_sta
->win
[i
].counter
)
199 spin_lock_irqsave(&rs_sta
->lock
, flags
);
200 if (time_after(jiffies
, rs_sta
->win
[i
].stamp
+
201 IWL_RATE_WIN_FLUSH
)) {
202 IWL_DEBUG_RATE(priv
, "flushing %d samples of rate "
204 rs_sta
->win
[i
].counter
, i
);
205 iwl3945_clear_window(&rs_sta
->win
[i
]);
208 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
214 #define IWL_RATE_FLUSH_MAX 5000 /* msec */
215 #define IWL_RATE_FLUSH_MIN 50 /* msec */
216 #define IWL_AVERAGE_PACKETS 1500
218 static void iwl3945_bg_rate_scale_flush(unsigned long data
)
220 struct iwl3945_rs_sta
*rs_sta
= (void *)data
;
221 struct iwl_priv
*priv __maybe_unused
= rs_sta
->priv
;
224 u32 packet_count
, duration
, pps
;
226 IWL_DEBUG_RATE(priv
, "enter\n");
228 unflushed
= iwl3945_rate_scale_flush_windows(rs_sta
);
230 spin_lock_irqsave(&rs_sta
->lock
, flags
);
232 /* Number of packets Rx'd since last time this timer ran */
233 packet_count
= (rs_sta
->tx_packets
- rs_sta
->last_tx_packets
) + 1;
235 rs_sta
->last_tx_packets
= rs_sta
->tx_packets
+ 1;
239 jiffies_to_msecs(jiffies
- rs_sta
->last_partial_flush
);
241 IWL_DEBUG_RATE(priv
, "Tx'd %d packets in %dms\n",
242 packet_count
, duration
);
244 /* Determine packets per second */
246 pps
= (packet_count
* 1000) / duration
;
251 duration
= (IWL_AVERAGE_PACKETS
* 1000) / pps
;
252 if (duration
< IWL_RATE_FLUSH_MIN
)
253 duration
= IWL_RATE_FLUSH_MIN
;
254 else if (duration
> IWL_RATE_FLUSH_MAX
)
255 duration
= IWL_RATE_FLUSH_MAX
;
257 duration
= IWL_RATE_FLUSH_MAX
;
259 rs_sta
->flush_time
= msecs_to_jiffies(duration
);
261 IWL_DEBUG_RATE(priv
, "new flush period: %d msec ave %d\n",
262 duration
, packet_count
);
264 mod_timer(&rs_sta
->rate_scale_flush
, jiffies
+
267 rs_sta
->last_partial_flush
= jiffies
;
269 rs_sta
->flush_time
= IWL_RATE_FLUSH
;
270 rs_sta
->flush_pending
= 0;
272 /* If there weren't any unflushed entries, we don't schedule the timer
275 rs_sta
->last_flush
= jiffies
;
277 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
279 IWL_DEBUG_RATE(priv
, "leave\n");
283 * iwl3945_collect_tx_data - Update the success/failure sliding window
285 * We keep a sliding window of the last 64 packets transmitted
286 * at this rate. window->data contains the bitmask of successful
289 static void iwl3945_collect_tx_data(struct iwl3945_rs_sta
*rs_sta
,
290 struct iwl3945_rate_scale_data
*window
,
291 int success
, int retries
, int index
)
295 struct iwl_priv
*priv __maybe_unused
= rs_sta
->priv
;
298 IWL_DEBUG_RATE(priv
, "leave: retries == 0 -- should be at least 1\n");
302 spin_lock_irqsave(&rs_sta
->lock
, flags
);
305 * Keep track of only the latest 62 tx frame attempts in this rate's
306 * history window; anything older isn't really relevant any more.
307 * If we have filled up the sliding window, drop the oldest attempt;
308 * if the oldest attempt (highest bit in bitmap) shows "success",
309 * subtract "1" from the success counter (this is the main reason
310 * we keep these bitmaps!).
312 while (retries
> 0) {
313 if (window
->counter
>= IWL_RATE_MAX_WINDOW
) {
315 /* remove earliest */
316 window
->counter
= IWL_RATE_MAX_WINDOW
- 1;
318 if (window
->data
& (1ULL << (IWL_RATE_MAX_WINDOW
- 1))) {
319 window
->data
&= ~(1ULL << (IWL_RATE_MAX_WINDOW
- 1));
320 window
->success_counter
--;
324 /* Increment frames-attempted counter */
327 /* Shift bitmap by one frame (throw away oldest history),
328 * OR in "1", and increment "success" if this
329 * frame was successful. */
332 window
->success_counter
++;
340 /* Calculate current success ratio, avoid divide-by-0! */
341 if (window
->counter
> 0)
342 window
->success_ratio
= 128 * (100 * window
->success_counter
)
345 window
->success_ratio
= IWL_INVALID_VALUE
;
347 fail_count
= window
->counter
- window
->success_counter
;
349 /* Calculate average throughput, if we have enough history. */
350 if ((fail_count
>= IWL_RATE_MIN_FAILURE_TH
) ||
351 (window
->success_counter
>= IWL_RATE_MIN_SUCCESS_TH
))
352 window
->average_tpt
= ((window
->success_ratio
*
353 rs_sta
->expected_tpt
[index
] + 64) / 128);
355 window
->average_tpt
= IWL_INVALID_VALUE
;
357 /* Tag this window as having been updated */
358 window
->stamp
= jiffies
;
360 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
364 static void rs_rate_init(void *priv_r
, struct ieee80211_supported_band
*sband
,
365 struct ieee80211_sta
*sta
, void *priv_sta
)
367 struct iwl3945_rs_sta
*rs_sta
= priv_sta
;
368 struct iwl_priv
*priv
= (struct iwl_priv
*)priv_r
;
371 IWL_DEBUG_RATE(priv
, "enter\n");
373 /* TODO: what is a good starting rate for STA? About middle? Maybe not
374 * the lowest or the highest rate.. Could consider using RSSI from
375 * previous packets? Need to have IEEE 802.1X auth succeed immediately
378 for (i
= sband
->n_bitrates
- 1; i
>= 0; i
--) {
379 if (sta
->supp_rates
[sband
->band
] & (1 << i
)) {
380 rs_sta
->last_txrate_idx
= i
;
385 priv
->sta_supp_rates
= sta
->supp_rates
[sband
->band
];
386 /* For 5 GHz band it start at IWL_FIRST_OFDM_RATE */
387 if (sband
->band
== IEEE80211_BAND_5GHZ
) {
388 rs_sta
->last_txrate_idx
+= IWL_FIRST_OFDM_RATE
;
389 priv
->sta_supp_rates
= priv
->sta_supp_rates
<<
394 IWL_DEBUG_RATE(priv
, "leave\n");
397 static void *rs_alloc(struct ieee80211_hw
*hw
, struct dentry
*debugfsdir
)
402 /* rate scale requires free function to be implemented */
403 static void rs_free(void *priv
)
408 static void *rs_alloc_sta(void *iwl_priv
, struct ieee80211_sta
*sta
, gfp_t gfp
)
410 struct iwl3945_rs_sta
*rs_sta
;
411 struct iwl3945_sta_priv
*psta
= (void *) sta
->drv_priv
;
412 struct iwl_priv
*priv
= iwl_priv
;
416 * XXX: If it's using sta->drv_priv anyway, it might
417 * as well just put all the information there.
420 IWL_DEBUG_RATE(priv
, "enter\n");
422 rs_sta
= kzalloc(sizeof(struct iwl3945_rs_sta
), gfp
);
424 IWL_DEBUG_RATE(priv
, "leave: ENOMEM\n");
428 psta
->rs_sta
= rs_sta
;
430 spin_lock_init(&rs_sta
->lock
);
434 rs_sta
->start_rate
= IWL_RATE_INVALID
;
436 /* default to just 802.11b */
437 rs_sta
->expected_tpt
= iwl3945_expected_tpt_b
;
439 rs_sta
->last_partial_flush
= jiffies
;
440 rs_sta
->last_flush
= jiffies
;
441 rs_sta
->flush_time
= IWL_RATE_FLUSH
;
442 rs_sta
->last_tx_packets
= 0;
443 rs_sta
->ibss_sta_added
= 0;
445 init_timer(&rs_sta
->rate_scale_flush
);
446 rs_sta
->rate_scale_flush
.data
= (unsigned long)rs_sta
;
447 rs_sta
->rate_scale_flush
.function
= &iwl3945_bg_rate_scale_flush
;
449 for (i
= 0; i
< IWL_RATE_COUNT_3945
; i
++)
450 iwl3945_clear_window(&rs_sta
->win
[i
]);
452 IWL_DEBUG_RATE(priv
, "leave\n");
457 static void rs_free_sta(void *iwl_priv
, struct ieee80211_sta
*sta
,
460 struct iwl3945_sta_priv
*psta
= (void *) sta
->drv_priv
;
461 struct iwl3945_rs_sta
*rs_sta
= priv_sta
;
462 struct iwl_priv
*priv __maybe_unused
= rs_sta
->priv
;
466 IWL_DEBUG_RATE(priv
, "enter\n");
467 del_timer_sync(&rs_sta
->rate_scale_flush
);
469 IWL_DEBUG_RATE(priv
, "leave\n");
474 * rs_tx_status - Update rate control values based on Tx results
476 * NOTE: Uses iwl_priv->retry_rate for the # of retries attempted by
477 * the hardware for each rate.
479 static void rs_tx_status(void *priv_rate
, struct ieee80211_supported_band
*sband
,
480 struct ieee80211_sta
*sta
, void *priv_sta
,
483 s8 retries
= 0, current_count
;
484 int scale_rate_index
, first_index
, last_index
;
486 struct iwl_priv
*priv
= (struct iwl_priv
*)priv_rate
;
487 struct iwl3945_rs_sta
*rs_sta
= priv_sta
;
488 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
490 IWL_DEBUG_RATE(priv
, "enter\n");
492 retries
= info
->status
.rates
[0].count
;
493 /* Sanity Check for retries */
494 if (retries
> IWL_RATE_RETRY_TH
)
495 retries
= IWL_RATE_RETRY_TH
;
497 first_index
= sband
->bitrates
[info
->status
.rates
[0].idx
].hw_value
;
498 if ((first_index
< 0) || (first_index
>= IWL_RATE_COUNT_3945
)) {
499 IWL_DEBUG_RATE(priv
, "leave: Rate out of bounds: %d\n", first_index
);
504 IWL_DEBUG_RATE(priv
, "leave: No STA priv data to update!\n");
508 rs_sta
->tx_packets
++;
510 scale_rate_index
= first_index
;
511 last_index
= first_index
;
514 * Update the window for each rate. We determine which rates
515 * were Tx'd based on the total number of retries vs. the number
516 * of retries configured for each rate -- currently set to the
517 * priv value 'retry_rate' vs. rate specific
519 * On exit from this while loop last_index indicates the rate
520 * at which the frame was finally transmitted (or failed if no
523 while (retries
> 1) {
524 if ((retries
- 1) < priv
->retry_rate
) {
525 current_count
= (retries
- 1);
526 last_index
= scale_rate_index
;
528 current_count
= priv
->retry_rate
;
529 last_index
= iwl3945_rs_next_rate(priv
,
533 /* Update this rate accounting for as many retries
534 * as was used for it (per current_count) */
535 iwl3945_collect_tx_data(rs_sta
,
536 &rs_sta
->win
[scale_rate_index
],
537 0, current_count
, scale_rate_index
);
538 IWL_DEBUG_RATE(priv
, "Update rate %d for %d retries.\n",
539 scale_rate_index
, current_count
);
541 retries
-= current_count
;
543 scale_rate_index
= last_index
;
547 /* Update the last index window with success/failure based on ACK */
548 IWL_DEBUG_RATE(priv
, "Update rate %d with %s.\n",
550 (info
->flags
& IEEE80211_TX_STAT_ACK
) ?
551 "success" : "failure");
552 iwl3945_collect_tx_data(rs_sta
,
553 &rs_sta
->win
[last_index
],
554 info
->flags
& IEEE80211_TX_STAT_ACK
, 1, last_index
);
556 /* We updated the rate scale window -- if its been more than
557 * flush_time since the last run, schedule the flush
559 spin_lock_irqsave(&rs_sta
->lock
, flags
);
561 if (!rs_sta
->flush_pending
&&
562 time_after(jiffies
, rs_sta
->last_flush
+
563 rs_sta
->flush_time
)) {
565 rs_sta
->last_partial_flush
= jiffies
;
566 rs_sta
->flush_pending
= 1;
567 mod_timer(&rs_sta
->rate_scale_flush
,
568 jiffies
+ rs_sta
->flush_time
);
571 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
573 IWL_DEBUG_RATE(priv
, "leave\n");
578 static u16
iwl3945_get_adjacent_rate(struct iwl3945_rs_sta
*rs_sta
,
579 u8 index
, u16 rate_mask
, enum ieee80211_band band
)
581 u8 high
= IWL_RATE_INVALID
;
582 u8 low
= IWL_RATE_INVALID
;
583 struct iwl_priv
*priv __maybe_unused
= rs_sta
->priv
;
585 /* 802.11A walks to the next literal adjacent rate in
587 if (unlikely(band
== IEEE80211_BAND_5GHZ
)) {
591 /* Find the previous rate that is in the rate mask */
593 for (mask
= (1 << i
); i
>= 0; i
--, mask
>>= 1) {
594 if (rate_mask
& mask
) {
600 /* Find the next rate that is in the rate mask */
602 for (mask
= (1 << i
); i
< IWL_RATE_COUNT_3945
;
604 if (rate_mask
& mask
) {
610 return (high
<< 8) | low
;
614 while (low
!= IWL_RATE_INVALID
) {
616 low
= iwl3945_rates
[low
].prev_rs_tgg
;
618 low
= iwl3945_rates
[low
].prev_rs
;
619 if (low
== IWL_RATE_INVALID
)
621 if (rate_mask
& (1 << low
))
623 IWL_DEBUG_RATE(priv
, "Skipping masked lower rate: %d\n", low
);
627 while (high
!= IWL_RATE_INVALID
) {
629 high
= iwl3945_rates
[high
].next_rs_tgg
;
631 high
= iwl3945_rates
[high
].next_rs
;
632 if (high
== IWL_RATE_INVALID
)
634 if (rate_mask
& (1 << high
))
636 IWL_DEBUG_RATE(priv
, "Skipping masked higher rate: %d\n", high
);
639 return (high
<< 8) | low
;
643 * rs_get_rate - find the rate for the requested packet
645 * Returns the ieee80211_rate structure allocated by the driver.
647 * The rate control algorithm has no internal mapping between hw_mode's
648 * rate ordering and the rate ordering used by the rate control algorithm.
650 * The rate control algorithm uses a single table of rates that goes across
651 * the entire A/B/G spectrum vs. being limited to just one particular
654 * As such, we can't convert the index obtained below into the hw_mode's
655 * rate table and must reference the driver allocated rate table
658 static void rs_get_rate(void *priv_r
, struct ieee80211_sta
*sta
,
659 void *priv_sta
, struct ieee80211_tx_rate_control
*txrc
)
661 struct ieee80211_supported_band
*sband
= txrc
->sband
;
662 struct sk_buff
*skb
= txrc
->skb
;
663 u8 low
= IWL_RATE_INVALID
;
664 u8 high
= IWL_RATE_INVALID
;
667 struct iwl3945_rs_sta
*rs_sta
= priv_sta
;
668 struct iwl3945_rate_scale_data
*window
= NULL
;
669 int current_tpt
= IWL_INVALID_VALUE
;
670 int low_tpt
= IWL_INVALID_VALUE
;
671 int high_tpt
= IWL_INVALID_VALUE
;
675 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)skb
->data
;
676 u16 rate_mask
= sta
? sta
->supp_rates
[sband
->band
] : 0;
677 s8 max_rate_idx
= -1;
678 struct iwl_priv
*priv
= (struct iwl_priv
*)priv_r
;
679 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
681 IWL_DEBUG_RATE(priv
, "enter\n");
683 if (rate_control_send_low(sta
, priv_sta
, txrc
))
686 rate_mask
= sta
->supp_rates
[sband
->band
];
688 /* get user max rate if set */
689 max_rate_idx
= txrc
->max_rate_idx
;
690 if ((sband
->band
== IEEE80211_BAND_5GHZ
) && (max_rate_idx
!= -1))
691 max_rate_idx
+= IWL_FIRST_OFDM_RATE
;
692 if ((max_rate_idx
< 0) || (max_rate_idx
>= IWL_RATE_COUNT
))
695 index
= min(rs_sta
->last_txrate_idx
& 0xffff, IWL_RATE_COUNT_3945
- 1);
697 if (sband
->band
== IEEE80211_BAND_5GHZ
)
698 rate_mask
= rate_mask
<< IWL_FIRST_OFDM_RATE
;
700 if ((priv
->iw_mode
== NL80211_IFTYPE_ADHOC
) &&
701 !rs_sta
->ibss_sta_added
) {
702 u8 sta_id
= iwl_find_station(priv
, hdr
->addr1
);
704 if (sta_id
== IWL_INVALID_STATION
) {
705 IWL_DEBUG_RATE(priv
, "LQ: ADD station %pM\n",
707 sta_id
= iwl_add_station(priv
, hdr
->addr1
, false,
710 if (sta_id
!= IWL_INVALID_STATION
)
711 rs_sta
->ibss_sta_added
= 1;
714 spin_lock_irqsave(&rs_sta
->lock
, flags
);
716 /* for recent assoc, choose best rate regarding
719 if (rs_sta
->start_rate
!= IWL_RATE_INVALID
) {
720 if (rs_sta
->start_rate
< index
&&
721 (rate_mask
& (1 << rs_sta
->start_rate
)))
722 index
= rs_sta
->start_rate
;
723 rs_sta
->start_rate
= IWL_RATE_INVALID
;
726 /* force user max rate if set by user */
727 if ((max_rate_idx
!= -1) && (max_rate_idx
< index
)) {
728 if (rate_mask
& (1 << max_rate_idx
))
729 index
= max_rate_idx
;
732 window
= &(rs_sta
->win
[index
]);
734 fail_count
= window
->counter
- window
->success_counter
;
736 if (((fail_count
< IWL_RATE_MIN_FAILURE_TH
) &&
737 (window
->success_counter
< IWL_RATE_MIN_SUCCESS_TH
))) {
738 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
740 IWL_DEBUG_RATE(priv
, "Invalid average_tpt on rate %d: "
741 "counter: %d, success_counter: %d, "
742 "expected_tpt is %sNULL\n",
745 window
->success_counter
,
746 rs_sta
->expected_tpt
? "not " : "");
748 /* Can't calculate this yet; not enough history */
749 window
->average_tpt
= IWL_INVALID_VALUE
;
754 current_tpt
= window
->average_tpt
;
756 high_low
= iwl3945_get_adjacent_rate(rs_sta
, index
, rate_mask
,
758 low
= high_low
& 0xff;
759 high
= (high_low
>> 8) & 0xff;
761 /* If user set max rate, dont allow higher than user constrain */
762 if ((max_rate_idx
!= -1) && (max_rate_idx
< high
))
763 high
= IWL_RATE_INVALID
;
765 /* Collect Measured throughputs of adjacent rates */
766 if (low
!= IWL_RATE_INVALID
)
767 low_tpt
= rs_sta
->win
[low
].average_tpt
;
769 if (high
!= IWL_RATE_INVALID
)
770 high_tpt
= rs_sta
->win
[high
].average_tpt
;
772 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
776 /* Low success ratio , need to drop the rate */
777 if ((window
->success_ratio
< IWL_RATE_DECREASE_TH
) || !current_tpt
) {
778 IWL_DEBUG_RATE(priv
, "decrease rate because of low success_ratio\n");
780 /* No throughput measured yet for adjacent rates,
782 } else if ((low_tpt
== IWL_INVALID_VALUE
) &&
783 (high_tpt
== IWL_INVALID_VALUE
)) {
785 if (high
!= IWL_RATE_INVALID
&& window
->success_ratio
>= IWL_RATE_INCREASE_TH
)
787 else if (low
!= IWL_RATE_INVALID
)
790 /* Both adjacent throughputs are measured, but neither one has
791 * better throughput; we're using the best rate, don't change
793 } else if ((low_tpt
!= IWL_INVALID_VALUE
) &&
794 (high_tpt
!= IWL_INVALID_VALUE
) &&
795 (low_tpt
< current_tpt
) && (high_tpt
< current_tpt
)) {
797 IWL_DEBUG_RATE(priv
, "No action -- low [%d] & high [%d] < "
798 "current_tpt [%d]\n",
799 low_tpt
, high_tpt
, current_tpt
);
802 /* At least one of the rates has better throughput */
804 if (high_tpt
!= IWL_INVALID_VALUE
) {
806 /* High rate has better throughput, Increase
808 if (high_tpt
> current_tpt
&&
809 window
->success_ratio
>= IWL_RATE_INCREASE_TH
)
813 "decrease rate because of high tpt\n");
816 } else if (low_tpt
!= IWL_INVALID_VALUE
) {
817 if (low_tpt
> current_tpt
) {
819 "decrease rate because of low tpt\n");
821 } else if (window
->success_ratio
>= IWL_RATE_INCREASE_TH
) {
822 /* Lower rate has better
823 * throughput,decrease rate */
829 /* Sanity check; asked for decrease, but success rate or throughput
830 * has been good at old rate. Don't change it. */
831 if ((scale_action
== -1) && (low
!= IWL_RATE_INVALID
) &&
832 ((window
->success_ratio
> IWL_RATE_HIGH_TH
) ||
833 (current_tpt
> (100 * rs_sta
->expected_tpt
[low
]))))
836 switch (scale_action
) {
840 if (low
!= IWL_RATE_INVALID
)
846 if (high
!= IWL_RATE_INVALID
)
857 IWL_DEBUG_RATE(priv
, "Selected %d (action %d) - low %d high %d\n",
858 index
, scale_action
, low
, high
);
862 rs_sta
->last_txrate_idx
= index
;
863 if (sband
->band
== IEEE80211_BAND_5GHZ
)
864 info
->control
.rates
[0].idx
= rs_sta
->last_txrate_idx
-
867 info
->control
.rates
[0].idx
= rs_sta
->last_txrate_idx
;
869 IWL_DEBUG_RATE(priv
, "leave: %d\n", index
);
872 #ifdef CONFIG_MAC80211_DEBUGFS
873 static int iwl3945_open_file_generic(struct inode
*inode
, struct file
*file
)
875 file
->private_data
= inode
->i_private
;
879 static ssize_t
iwl3945_sta_dbgfs_stats_table_read(struct file
*file
,
880 char __user
*user_buf
,
881 size_t count
, loff_t
*ppos
)
887 struct iwl3945_rs_sta
*lq_sta
= file
->private_data
;
889 buff
= kmalloc(1024, GFP_KERNEL
);
893 desc
+= sprintf(buff
+ desc
, "tx packets=%d last rate index=%d\n"
894 "rate=0x%X flush time %d\n",
896 lq_sta
->last_txrate_idx
,
897 lq_sta
->start_rate
, jiffies_to_msecs(lq_sta
->flush_time
));
898 for (j
= 0; j
< IWL_RATE_COUNT_3945
; j
++) {
899 desc
+= sprintf(buff
+desc
,
900 "counter=%d success=%d %%=%d\n",
901 lq_sta
->win
[j
].counter
,
902 lq_sta
->win
[j
].success_counter
,
903 lq_sta
->win
[j
].success_ratio
);
905 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buff
, desc
);
910 static const struct file_operations rs_sta_dbgfs_stats_table_ops
= {
911 .read
= iwl3945_sta_dbgfs_stats_table_read
,
912 .open
= iwl3945_open_file_generic
,
915 static void iwl3945_add_debugfs(void *priv
, void *priv_sta
,
918 struct iwl3945_rs_sta
*lq_sta
= priv_sta
;
920 lq_sta
->rs_sta_dbgfs_stats_table_file
=
921 debugfs_create_file("rate_stats_table", 0600, dir
,
922 lq_sta
, &rs_sta_dbgfs_stats_table_ops
);
926 static void iwl3945_remove_debugfs(void *priv
, void *priv_sta
)
928 struct iwl3945_rs_sta
*lq_sta
= priv_sta
;
929 debugfs_remove(lq_sta
->rs_sta_dbgfs_stats_table_file
);
933 static struct rate_control_ops rs_ops
= {
936 .tx_status
= rs_tx_status
,
937 .get_rate
= rs_get_rate
,
938 .rate_init
= rs_rate_init
,
941 .alloc_sta
= rs_alloc_sta
,
942 .free_sta
= rs_free_sta
,
943 #ifdef CONFIG_MAC80211_DEBUGFS
944 .add_sta_debugfs
= iwl3945_add_debugfs
,
945 .remove_sta_debugfs
= iwl3945_remove_debugfs
,
950 void iwl3945_rate_scale_init(struct ieee80211_hw
*hw
, s32 sta_id
)
952 struct iwl_priv
*priv
= hw
->priv
;
955 struct iwl3945_rs_sta
*rs_sta
;
956 struct ieee80211_sta
*sta
;
957 struct iwl3945_sta_priv
*psta
;
959 IWL_DEBUG_RATE(priv
, "enter\n");
963 sta
= ieee80211_find_sta(hw
, priv
->stations
[sta_id
].sta
.sta
.addr
);
969 psta
= (void *) sta
->drv_priv
;
970 rs_sta
= psta
->rs_sta
;
972 spin_lock_irqsave(&rs_sta
->lock
, flags
);
975 switch (priv
->band
) {
976 case IEEE80211_BAND_2GHZ
:
977 /* TODO: this always does G, not a regression */
978 if (priv
->active_rxon
.flags
& RXON_FLG_TGG_PROTECT_MSK
) {
980 rs_sta
->expected_tpt
= iwl3945_expected_tpt_g_prot
;
982 rs_sta
->expected_tpt
= iwl3945_expected_tpt_g
;
985 case IEEE80211_BAND_5GHZ
:
986 rs_sta
->expected_tpt
= iwl3945_expected_tpt_a
;
988 case IEEE80211_NUM_BANDS
:
993 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
995 rssi
= priv
->last_rx_rssi
;
997 rssi
= IWL_MIN_RSSI_VAL
;
999 IWL_DEBUG_RATE(priv
, "Network RSSI: %d\n", rssi
);
1001 rs_sta
->start_rate
= iwl3945_get_rate_index_by_rssi(rssi
, priv
->band
);
1003 IWL_DEBUG_RATE(priv
, "leave: rssi %d assign rate index: "
1004 "%d (plcp 0x%x)\n", rssi
, rs_sta
->start_rate
,
1005 iwl3945_rates
[rs_sta
->start_rate
].plcp
);
1009 int iwl3945_rate_control_register(void)
1011 return ieee80211_rate_control_register(&rs_ops
);
1014 void iwl3945_rate_control_unregister(void)
1016 ieee80211_rate_control_unregister(&rs_ops
);