1 /******************************************************************************
3 * Copyright(c) 2005 - 2011 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/skbuff.h>
29 #include <linux/slab.h>
30 #include <net/mac80211.h>
32 #include <linux/netdevice.h>
33 #include <linux/etherdevice.h>
34 #include <linux/delay.h>
36 #include <linux/workqueue.h>
41 #define RS_NAME "iwl-3945-rs"
43 static s32 il3945_expected_tpt_g
[RATE_COUNT_3945
] = {
44 7, 13, 35, 58, 0, 0, 76, 104, 130, 168, 191, 202
47 static s32 il3945_expected_tpt_g_prot
[RATE_COUNT_3945
] = {
48 7, 13, 35, 58, 0, 0, 0, 80, 93, 113, 123, 125
51 static s32 il3945_expected_tpt_a
[RATE_COUNT_3945
] = {
52 0, 0, 0, 0, 40, 57, 72, 98, 121, 154, 177, 186
55 static s32 il3945_expected_tpt_b
[RATE_COUNT_3945
] = {
56 7, 13, 35, 58, 0, 0, 0, 0, 0, 0, 0, 0
59 struct il3945_tpt_entry
{
64 static struct il3945_tpt_entry il3945_tpt_table_a
[] = {
75 static struct il3945_tpt_entry il3945_tpt_table_g
[] = {
88 #define RATE_MAX_WINDOW 62
89 #define RATE_FLUSH (3*HZ)
90 #define RATE_WIN_FLUSH (HZ/2)
91 #define IL39_RATE_HIGH_TH 11520
92 #define IL_SUCCESS_UP_TH 8960
93 #define IL_SUCCESS_DOWN_TH 10880
94 #define RATE_MIN_FAILURE_TH 6
95 #define RATE_MIN_SUCCESS_TH 8
96 #define RATE_DECREASE_TH 1920
97 #define RATE_RETRY_TH 15
100 il3945_get_rate_idx_by_rssi(s32 rssi
, enum nl80211_band band
)
104 struct il3945_tpt_entry
*tpt_table
= NULL
;
106 if (rssi
< IL_MIN_RSSI_VAL
|| rssi
> IL_MAX_RSSI_VAL
)
107 rssi
= IL_MIN_RSSI_VAL
;
110 case NL80211_BAND_2GHZ
:
111 tpt_table
= il3945_tpt_table_g
;
112 table_size
= ARRAY_SIZE(il3945_tpt_table_g
);
114 case NL80211_BAND_5GHZ
:
115 tpt_table
= il3945_tpt_table_a
;
116 table_size
= ARRAY_SIZE(il3945_tpt_table_a
);
123 while (idx
< table_size
&& rssi
< tpt_table
[idx
].min_rssi
)
126 idx
= min(idx
, table_size
- 1);
128 return tpt_table
[idx
].idx
;
132 il3945_clear_win(struct il3945_rate_scale_data
*win
)
135 win
->success_counter
= 0;
136 win
->success_ratio
= -1;
138 win
->average_tpt
= IL_INVALID_VALUE
;
143 * il3945_rate_scale_flush_wins - flush out the rate scale wins
145 * Returns the number of wins that have gathered data but were
146 * not flushed. If there were any that were not flushed, then
147 * reschedule the rate flushing routine.
150 il3945_rate_scale_flush_wins(struct il3945_rs_sta
*rs_sta
)
155 struct il_priv
*il __maybe_unused
= rs_sta
->il
;
158 * For each rate, if we have collected data on that rate
159 * and it has been more than RATE_WIN_FLUSH
160 * since we flushed, clear out the gathered stats
162 for (i
= 0; i
< RATE_COUNT_3945
; i
++) {
163 if (!rs_sta
->win
[i
].counter
)
166 spin_lock_irqsave(&rs_sta
->lock
, flags
);
167 if (time_after(jiffies
, rs_sta
->win
[i
].stamp
+ RATE_WIN_FLUSH
)) {
168 D_RATE("flushing %d samples of rate " "idx %d\n",
169 rs_sta
->win
[i
].counter
, i
);
170 il3945_clear_win(&rs_sta
->win
[i
]);
173 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
179 #define RATE_FLUSH_MAX 5000 /* msec */
180 #define RATE_FLUSH_MIN 50 /* msec */
181 #define IL_AVERAGE_PACKETS 1500
184 il3945_bg_rate_scale_flush(struct timer_list
*t
)
186 struct il3945_rs_sta
*rs_sta
= from_timer(rs_sta
, t
, rate_scale_flush
);
187 struct il_priv
*il __maybe_unused
= rs_sta
->il
;
190 u32 packet_count
, duration
, pps
;
194 unflushed
= il3945_rate_scale_flush_wins(rs_sta
);
196 spin_lock_irqsave(&rs_sta
->lock
, flags
);
198 /* Number of packets Rx'd since last time this timer ran */
199 packet_count
= (rs_sta
->tx_packets
- rs_sta
->last_tx_packets
) + 1;
201 rs_sta
->last_tx_packets
= rs_sta
->tx_packets
+ 1;
205 jiffies_to_msecs(jiffies
- rs_sta
->last_partial_flush
);
207 D_RATE("Tx'd %d packets in %dms\n", packet_count
, duration
);
209 /* Determine packets per second */
211 pps
= (packet_count
* 1000) / duration
;
216 duration
= (IL_AVERAGE_PACKETS
* 1000) / pps
;
217 if (duration
< RATE_FLUSH_MIN
)
218 duration
= RATE_FLUSH_MIN
;
219 else if (duration
> RATE_FLUSH_MAX
)
220 duration
= RATE_FLUSH_MAX
;
222 duration
= RATE_FLUSH_MAX
;
224 rs_sta
->flush_time
= msecs_to_jiffies(duration
);
226 D_RATE("new flush period: %d msec ave %d\n", duration
,
229 mod_timer(&rs_sta
->rate_scale_flush
,
230 jiffies
+ rs_sta
->flush_time
);
232 rs_sta
->last_partial_flush
= jiffies
;
234 rs_sta
->flush_time
= RATE_FLUSH
;
235 rs_sta
->flush_pending
= 0;
237 /* If there weren't any unflushed entries, we don't schedule the timer
240 rs_sta
->last_flush
= jiffies
;
242 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
248 * il3945_collect_tx_data - Update the success/failure sliding win
250 * We keep a sliding win of the last 64 packets transmitted
251 * at this rate. win->data contains the bitmask of successful
255 il3945_collect_tx_data(struct il3945_rs_sta
*rs_sta
,
256 struct il3945_rate_scale_data
*win
, int success
,
257 int retries
, int idx
)
261 struct il_priv
*il __maybe_unused
= rs_sta
->il
;
264 D_RATE("leave: retries == 0 -- should be at least 1\n");
268 spin_lock_irqsave(&rs_sta
->lock
, flags
);
271 * Keep track of only the latest 62 tx frame attempts in this rate's
272 * history win; anything older isn't really relevant any more.
273 * If we have filled up the sliding win, drop the oldest attempt;
274 * if the oldest attempt (highest bit in bitmap) shows "success",
275 * subtract "1" from the success counter (this is the main reason
276 * we keep these bitmaps!).
278 while (retries
> 0) {
279 if (win
->counter
>= RATE_MAX_WINDOW
) {
281 /* remove earliest */
282 win
->counter
= RATE_MAX_WINDOW
- 1;
284 if (win
->data
& (1ULL << (RATE_MAX_WINDOW
- 1))) {
285 win
->data
&= ~(1ULL << (RATE_MAX_WINDOW
- 1));
286 win
->success_counter
--;
290 /* Increment frames-attempted counter */
293 /* Shift bitmap by one frame (throw away oldest history),
294 * OR in "1", and increment "success" if this
295 * frame was successful. */
298 win
->success_counter
++;
306 /* Calculate current success ratio, avoid divide-by-0! */
307 if (win
->counter
> 0)
309 128 * (100 * win
->success_counter
) / win
->counter
;
311 win
->success_ratio
= IL_INVALID_VALUE
;
313 fail_count
= win
->counter
- win
->success_counter
;
315 /* Calculate average throughput, if we have enough history. */
316 if (fail_count
>= RATE_MIN_FAILURE_TH
||
317 win
->success_counter
>= RATE_MIN_SUCCESS_TH
)
319 ((win
->success_ratio
* rs_sta
->expected_tpt
[idx
] +
322 win
->average_tpt
= IL_INVALID_VALUE
;
324 /* Tag this win as having been updated */
325 win
->stamp
= jiffies
;
327 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
331 * Called after adding a new station to initialize rate scaling
334 il3945_rs_rate_init(struct il_priv
*il
, struct ieee80211_sta
*sta
, u8 sta_id
)
336 struct ieee80211_hw
*hw
= il
->hw
;
337 struct ieee80211_conf
*conf
= &il
->hw
->conf
;
338 struct il3945_sta_priv
*psta
;
339 struct il3945_rs_sta
*rs_sta
;
340 struct ieee80211_supported_band
*sband
;
344 if (sta_id
== il
->hw_params
.bcast_id
)
347 psta
= (struct il3945_sta_priv
*)sta
->drv_priv
;
348 rs_sta
= &psta
->rs_sta
;
349 sband
= hw
->wiphy
->bands
[conf
->chandef
.chan
->band
];
353 rs_sta
->start_rate
= RATE_INVALID
;
355 /* default to just 802.11b */
356 rs_sta
->expected_tpt
= il3945_expected_tpt_b
;
358 rs_sta
->last_partial_flush
= jiffies
;
359 rs_sta
->last_flush
= jiffies
;
360 rs_sta
->flush_time
= RATE_FLUSH
;
361 rs_sta
->last_tx_packets
= 0;
363 for (i
= 0; i
< RATE_COUNT_3945
; i
++)
364 il3945_clear_win(&rs_sta
->win
[i
]);
366 /* TODO: what is a good starting rate for STA? About middle? Maybe not
367 * the lowest or the highest rate.. Could consider using RSSI from
368 * previous packets? Need to have IEEE 802.1X auth succeed immediately
371 for (i
= sband
->n_bitrates
- 1; i
>= 0; i
--) {
372 if (sta
->supp_rates
[sband
->band
] & (1 << i
)) {
373 rs_sta
->last_txrate_idx
= i
;
378 il
->_3945
.sta_supp_rates
= sta
->supp_rates
[sband
->band
];
379 /* For 5 GHz band it start at IL_FIRST_OFDM_RATE */
380 if (sband
->band
== NL80211_BAND_5GHZ
) {
381 rs_sta
->last_txrate_idx
+= IL_FIRST_OFDM_RATE
;
382 il
->_3945
.sta_supp_rates
<<= IL_FIRST_OFDM_RATE
;
386 il
->stations
[sta_id
].used
&= ~IL_STA_UCODE_INPROGRESS
;
392 il3945_rs_alloc(struct ieee80211_hw
*hw
, struct dentry
*debugfsdir
)
397 /* rate scale requires free function to be implemented */
399 il3945_rs_free(void *il
)
404 il3945_rs_alloc_sta(void *il_priv
, struct ieee80211_sta
*sta
, gfp_t gfp
)
406 struct il3945_rs_sta
*rs_sta
;
407 struct il3945_sta_priv
*psta
= (void *)sta
->drv_priv
;
408 struct il_priv
*il __maybe_unused
= il_priv
;
412 rs_sta
= &psta
->rs_sta
;
414 spin_lock_init(&rs_sta
->lock
);
415 timer_setup(&rs_sta
->rate_scale_flush
, il3945_bg_rate_scale_flush
, 0);
422 il3945_rs_free_sta(void *il_priv
, struct ieee80211_sta
*sta
, void *il_sta
)
424 struct il3945_rs_sta
*rs_sta
= il_sta
;
427 * Be careful not to use any members of il3945_rs_sta (like trying
428 * to use il_priv to print out debugging) since it may not be fully
429 * initialized at this point.
431 del_timer_sync(&rs_sta
->rate_scale_flush
);
435 * il3945_rs_tx_status - Update rate control values based on Tx results
437 * NOTE: Uses il_priv->retry_rate for the # of retries attempted by
438 * the hardware for each rate.
441 il3945_rs_tx_status(void *il_rate
, struct ieee80211_supported_band
*sband
,
442 struct ieee80211_sta
*sta
, void *il_sta
,
445 s8 retries
= 0, current_count
;
446 int scale_rate_idx
, first_idx
, last_idx
;
448 struct il_priv
*il
= (struct il_priv
*)il_rate
;
449 struct il3945_rs_sta
*rs_sta
= il_sta
;
450 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
454 retries
= info
->status
.rates
[0].count
;
455 /* Sanity Check for retries */
456 if (retries
> RATE_RETRY_TH
)
457 retries
= RATE_RETRY_TH
;
459 first_idx
= sband
->bitrates
[info
->status
.rates
[0].idx
].hw_value
;
460 if (first_idx
< 0 || first_idx
>= RATE_COUNT_3945
) {
461 D_RATE("leave: Rate out of bounds: %d\n", first_idx
);
466 D_RATE("leave: No STA il data to update!\n");
470 /* Treat uninitialized rate scaling data same as non-existing. */
472 D_RATE("leave: STA il data uninitialized!\n");
476 rs_sta
->tx_packets
++;
478 scale_rate_idx
= first_idx
;
479 last_idx
= first_idx
;
482 * Update the win for each rate. We determine which rates
483 * were Tx'd based on the total number of retries vs. the number
484 * of retries configured for each rate -- currently set to the
485 * il value 'retry_rate' vs. rate specific
487 * On exit from this while loop last_idx indicates the rate
488 * at which the frame was finally transmitted (or failed if no
491 while (retries
> 1) {
492 if ((retries
- 1) < il
->retry_rate
) {
493 current_count
= (retries
- 1);
494 last_idx
= scale_rate_idx
;
496 current_count
= il
->retry_rate
;
497 last_idx
= il3945_rs_next_rate(il
, scale_rate_idx
);
500 /* Update this rate accounting for as many retries
501 * as was used for it (per current_count) */
502 il3945_collect_tx_data(rs_sta
, &rs_sta
->win
[scale_rate_idx
], 0,
503 current_count
, scale_rate_idx
);
504 D_RATE("Update rate %d for %d retries.\n", scale_rate_idx
,
507 retries
-= current_count
;
509 scale_rate_idx
= last_idx
;
512 /* Update the last idx win with success/failure based on ACK */
513 D_RATE("Update rate %d with %s.\n", last_idx
,
514 (info
->flags
& IEEE80211_TX_STAT_ACK
) ? "success" : "failure");
515 il3945_collect_tx_data(rs_sta
, &rs_sta
->win
[last_idx
],
516 info
->flags
& IEEE80211_TX_STAT_ACK
, 1,
519 /* We updated the rate scale win -- if its been more than
520 * flush_time since the last run, schedule the flush
522 spin_lock_irqsave(&rs_sta
->lock
, flags
);
524 if (!rs_sta
->flush_pending
&&
525 time_after(jiffies
, rs_sta
->last_flush
+ rs_sta
->flush_time
)) {
527 rs_sta
->last_partial_flush
= jiffies
;
528 rs_sta
->flush_pending
= 1;
529 mod_timer(&rs_sta
->rate_scale_flush
,
530 jiffies
+ rs_sta
->flush_time
);
533 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
539 il3945_get_adjacent_rate(struct il3945_rs_sta
*rs_sta
, u8 idx
, u16 rate_mask
,
540 enum nl80211_band band
)
542 u8 high
= RATE_INVALID
;
543 u8 low
= RATE_INVALID
;
544 struct il_priv
*il __maybe_unused
= rs_sta
->il
;
546 /* 802.11A walks to the next literal adjacent rate in
548 if (unlikely(band
== NL80211_BAND_5GHZ
)) {
552 /* Find the previous rate that is in the rate mask */
554 for (mask
= (1 << i
); i
>= 0; i
--, mask
>>= 1) {
555 if (rate_mask
& mask
) {
561 /* Find the next rate that is in the rate mask */
563 for (mask
= (1 << i
); i
< RATE_COUNT_3945
; i
++, mask
<<= 1) {
564 if (rate_mask
& mask
) {
570 return (high
<< 8) | low
;
574 while (low
!= RATE_INVALID
) {
576 low
= il3945_rates
[low
].prev_rs_tgg
;
578 low
= il3945_rates
[low
].prev_rs
;
579 if (low
== RATE_INVALID
)
581 if (rate_mask
& (1 << low
))
583 D_RATE("Skipping masked lower rate: %d\n", low
);
587 while (high
!= RATE_INVALID
) {
589 high
= il3945_rates
[high
].next_rs_tgg
;
591 high
= il3945_rates
[high
].next_rs
;
592 if (high
== RATE_INVALID
)
594 if (rate_mask
& (1 << high
))
596 D_RATE("Skipping masked higher rate: %d\n", high
);
599 return (high
<< 8) | low
;
603 * il3945_rs_get_rate - find the rate for the requested packet
605 * Returns the ieee80211_rate structure allocated by the driver.
607 * The rate control algorithm has no internal mapping between hw_mode's
608 * rate ordering and the rate ordering used by the rate control algorithm.
610 * The rate control algorithm uses a single table of rates that goes across
611 * the entire A/B/G spectrum vs. being limited to just one particular
614 * As such, we can't convert the idx obtained below into the hw_mode's
615 * rate table and must reference the driver allocated rate table
619 il3945_rs_get_rate(void *il_r
, struct ieee80211_sta
*sta
, void *il_sta
,
620 struct ieee80211_tx_rate_control
*txrc
)
622 struct ieee80211_supported_band
*sband
= txrc
->sband
;
623 struct sk_buff
*skb
= txrc
->skb
;
624 u8 low
= RATE_INVALID
;
625 u8 high
= RATE_INVALID
;
628 struct il3945_rs_sta
*rs_sta
= il_sta
;
629 struct il3945_rate_scale_data
*win
= NULL
;
630 int current_tpt
= IL_INVALID_VALUE
;
631 int low_tpt
= IL_INVALID_VALUE
;
632 int high_tpt
= IL_INVALID_VALUE
;
637 s8 max_rate_idx
= -1;
638 struct il_priv
*il __maybe_unused
= (struct il_priv
*)il_r
;
639 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
643 /* Treat uninitialized rate scaling data same as non-existing. */
644 if (rs_sta
&& !rs_sta
->il
) {
645 D_RATE("Rate scaling information not initialized yet.\n");
649 if (rate_control_send_low(sta
, il_sta
, txrc
))
652 rate_mask
= sta
->supp_rates
[sband
->band
];
654 /* get user max rate if set */
655 max_rate_idx
= fls(txrc
->rate_idx_mask
) - 1;
656 if (sband
->band
== NL80211_BAND_5GHZ
&& max_rate_idx
!= -1)
657 max_rate_idx
+= IL_FIRST_OFDM_RATE
;
658 if (max_rate_idx
< 0 || max_rate_idx
>= RATE_COUNT
)
661 idx
= min(rs_sta
->last_txrate_idx
& 0xffff, RATE_COUNT_3945
- 1);
663 if (sband
->band
== NL80211_BAND_5GHZ
)
664 rate_mask
= rate_mask
<< IL_FIRST_OFDM_RATE
;
666 spin_lock_irqsave(&rs_sta
->lock
, flags
);
668 /* for recent assoc, choose best rate regarding
671 if (rs_sta
->start_rate
!= RATE_INVALID
) {
672 if (rs_sta
->start_rate
< idx
&&
673 (rate_mask
& (1 << rs_sta
->start_rate
)))
674 idx
= rs_sta
->start_rate
;
675 rs_sta
->start_rate
= RATE_INVALID
;
678 /* force user max rate if set by user */
679 if (max_rate_idx
!= -1 && max_rate_idx
< idx
) {
680 if (rate_mask
& (1 << max_rate_idx
))
684 win
= &(rs_sta
->win
[idx
]);
686 fail_count
= win
->counter
- win
->success_counter
;
688 if (fail_count
< RATE_MIN_FAILURE_TH
&&
689 win
->success_counter
< RATE_MIN_SUCCESS_TH
) {
690 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
692 D_RATE("Invalid average_tpt on rate %d: "
693 "counter: %d, success_counter: %d, "
694 "expected_tpt is %sNULL\n", idx
, win
->counter
,
695 win
->success_counter
,
696 rs_sta
->expected_tpt
? "not " : "");
698 /* Can't calculate this yet; not enough history */
699 win
->average_tpt
= IL_INVALID_VALUE
;
704 current_tpt
= win
->average_tpt
;
707 il3945_get_adjacent_rate(rs_sta
, idx
, rate_mask
, sband
->band
);
708 low
= high_low
& 0xff;
709 high
= (high_low
>> 8) & 0xff;
711 /* If user set max rate, dont allow higher than user constrain */
712 if (max_rate_idx
!= -1 && max_rate_idx
< high
)
715 /* Collect Measured throughputs of adjacent rates */
716 if (low
!= RATE_INVALID
)
717 low_tpt
= rs_sta
->win
[low
].average_tpt
;
719 if (high
!= RATE_INVALID
)
720 high_tpt
= rs_sta
->win
[high
].average_tpt
;
722 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
726 /* Low success ratio , need to drop the rate */
727 if (win
->success_ratio
< RATE_DECREASE_TH
|| !current_tpt
) {
728 D_RATE("decrease rate because of low success_ratio\n");
730 /* No throughput measured yet for adjacent rates,
732 } else if (low_tpt
== IL_INVALID_VALUE
&& high_tpt
== IL_INVALID_VALUE
) {
734 if (high
!= RATE_INVALID
&&
735 win
->success_ratio
>= RATE_INCREASE_TH
)
737 else if (low
!= RATE_INVALID
)
740 /* Both adjacent throughputs are measured, but neither one has
741 * better throughput; we're using the best rate, don't change
743 } else if (low_tpt
!= IL_INVALID_VALUE
&& high_tpt
!= IL_INVALID_VALUE
744 && low_tpt
< current_tpt
&& high_tpt
< current_tpt
) {
746 D_RATE("No action -- low [%d] & high [%d] < "
747 "current_tpt [%d]\n", low_tpt
, high_tpt
, current_tpt
);
750 /* At least one of the rates has better throughput */
752 if (high_tpt
!= IL_INVALID_VALUE
) {
754 /* High rate has better throughput, Increase
756 if (high_tpt
> current_tpt
&&
757 win
->success_ratio
>= RATE_INCREASE_TH
)
760 D_RATE("decrease rate because of high tpt\n");
763 } else if (low_tpt
!= IL_INVALID_VALUE
) {
764 if (low_tpt
> current_tpt
) {
765 D_RATE("decrease rate because of low tpt\n");
767 } else if (win
->success_ratio
>= RATE_INCREASE_TH
) {
768 /* Lower rate has better
769 * throughput,decrease rate */
775 /* Sanity check; asked for decrease, but success rate or throughput
776 * has been good at old rate. Don't change it. */
777 if (scale_action
== -1 && low
!= RATE_INVALID
&&
778 (win
->success_ratio
> RATE_HIGH_TH
||
779 current_tpt
> 100 * rs_sta
->expected_tpt
[low
]))
782 switch (scale_action
) {
785 if (low
!= RATE_INVALID
)
790 if (high
!= RATE_INVALID
)
800 D_RATE("Selected %d (action %d) - low %d high %d\n", idx
, scale_action
,
805 if (sband
->band
== NL80211_BAND_5GHZ
) {
806 if (WARN_ON_ONCE(idx
< IL_FIRST_OFDM_RATE
))
807 idx
= IL_FIRST_OFDM_RATE
;
808 rs_sta
->last_txrate_idx
= idx
;
809 info
->control
.rates
[0].idx
= idx
- IL_FIRST_OFDM_RATE
;
811 rs_sta
->last_txrate_idx
= idx
;
812 info
->control
.rates
[0].idx
= rs_sta
->last_txrate_idx
;
814 info
->control
.rates
[0].count
= 1;
816 D_RATE("leave: %d\n", idx
);
819 #ifdef CONFIG_MAC80211_DEBUGFS
822 il3945_sta_dbgfs_stats_table_read(struct file
*file
, char __user
*user_buf
,
823 size_t count
, loff_t
*ppos
)
829 struct il3945_rs_sta
*lq_sta
= file
->private_data
;
831 buff
= kmalloc(1024, GFP_KERNEL
);
837 "tx packets=%d last rate idx=%d\n"
838 "rate=0x%X flush time %d\n", lq_sta
->tx_packets
,
839 lq_sta
->last_txrate_idx
, lq_sta
->start_rate
,
840 jiffies_to_msecs(lq_sta
->flush_time
));
841 for (j
= 0; j
< RATE_COUNT_3945
; j
++) {
843 sprintf(buff
+ desc
, "counter=%d success=%d %%=%d\n",
844 lq_sta
->win
[j
].counter
,
845 lq_sta
->win
[j
].success_counter
,
846 lq_sta
->win
[j
].success_ratio
);
848 ret
= simple_read_from_buffer(user_buf
, count
, ppos
, buff
, desc
);
853 static const struct file_operations rs_sta_dbgfs_stats_table_ops
= {
854 .read
= il3945_sta_dbgfs_stats_table_read
,
856 .llseek
= default_llseek
,
860 il3945_add_debugfs(void *il
, void *il_sta
, struct dentry
*dir
)
862 struct il3945_rs_sta
*lq_sta
= il_sta
;
864 lq_sta
->rs_sta_dbgfs_stats_table_file
=
865 debugfs_create_file("rate_stats_table", 0600, dir
, lq_sta
,
866 &rs_sta_dbgfs_stats_table_ops
);
871 il3945_remove_debugfs(void *il
, void *il_sta
)
873 struct il3945_rs_sta
*lq_sta
= il_sta
;
874 debugfs_remove(lq_sta
->rs_sta_dbgfs_stats_table_file
);
879 * Initialization of rate scaling information is done by driver after
880 * the station is added. Since mac80211 calls this function before a
881 * station is added we ignore it.
884 il3945_rs_rate_init_stub(void *il_r
, struct ieee80211_supported_band
*sband
,
885 struct cfg80211_chan_def
*chandef
,
886 struct ieee80211_sta
*sta
, void *il_sta
)
890 static const struct rate_control_ops rs_ops
= {
892 .tx_status
= il3945_rs_tx_status
,
893 .get_rate
= il3945_rs_get_rate
,
894 .rate_init
= il3945_rs_rate_init_stub
,
895 .alloc
= il3945_rs_alloc
,
896 .free
= il3945_rs_free
,
897 .alloc_sta
= il3945_rs_alloc_sta
,
898 .free_sta
= il3945_rs_free_sta
,
899 #ifdef CONFIG_MAC80211_DEBUGFS
900 .add_sta_debugfs
= il3945_add_debugfs
,
901 .remove_sta_debugfs
= il3945_remove_debugfs
,
907 il3945_rate_scale_init(struct ieee80211_hw
*hw
, s32 sta_id
)
909 struct il_priv
*il
= hw
->priv
;
912 struct il3945_rs_sta
*rs_sta
;
913 struct ieee80211_sta
*sta
;
914 struct il3945_sta_priv
*psta
;
920 sta
= ieee80211_find_sta(il
->vif
, il
->stations
[sta_id
].sta
.sta
.addr
);
922 D_RATE("Unable to find station to initialize rate scaling.\n");
927 psta
= (void *)sta
->drv_priv
;
928 rs_sta
= &psta
->rs_sta
;
930 spin_lock_irqsave(&rs_sta
->lock
, flags
);
934 case NL80211_BAND_2GHZ
:
935 /* TODO: this always does G, not a regression */
936 if (il
->active
.flags
& RXON_FLG_TGG_PROTECT_MSK
) {
938 rs_sta
->expected_tpt
= il3945_expected_tpt_g_prot
;
940 rs_sta
->expected_tpt
= il3945_expected_tpt_g
;
942 case NL80211_BAND_5GHZ
:
943 rs_sta
->expected_tpt
= il3945_expected_tpt_a
;
950 spin_unlock_irqrestore(&rs_sta
->lock
, flags
);
952 rssi
= il
->_3945
.last_rx_rssi
;
954 rssi
= IL_MIN_RSSI_VAL
;
956 D_RATE("Network RSSI: %d\n", rssi
);
958 rs_sta
->start_rate
= il3945_get_rate_idx_by_rssi(rssi
, il
->band
);
960 D_RATE("leave: rssi %d assign rate idx: " "%d (plcp 0x%x)\n", rssi
,
961 rs_sta
->start_rate
, il3945_rates
[rs_sta
->start_rate
].plcp
);
966 il3945_rate_control_register(void)
968 return ieee80211_rate_control_register(&rs_ops
);
972 il3945_rate_control_unregister(void)
974 ieee80211_rate_control_unregister(&rs_ops
);