~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to drivers/net/wireless/iwlegacy/iwl-legacy-rs.h

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************************************
 
2
 *
 
3
 * Copyright(c) 2003 - 2011 Intel Corporation. All rights reserved.
 
4
 *
 
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.
 
8
 *
 
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
 
12
 * more details.
 
13
 *
 
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
 
17
 *
 
18
 * The full GNU General Public License is included in this distribution in the
 
19
 * file called LICENSE.
 
20
 *
 
21
 * Contact Information:
 
22
 *  Intel Linux Wireless <ilw@linux.intel.com>
 
23
 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 
24
 *
 
25
 *****************************************************************************/
 
26
 
 
27
#ifndef __iwl_legacy_rs_h__
 
28
#define __iwl_legacy_rs_h__
 
29
 
 
30
struct iwl_rate_info {
 
31
        u8 plcp;        /* uCode API:  IWL_RATE_6M_PLCP, etc. */
 
32
        u8 plcp_siso;   /* uCode API:  IWL_RATE_SISO_6M_PLCP, etc. */
 
33
        u8 plcp_mimo2;  /* uCode API:  IWL_RATE_MIMO2_6M_PLCP, etc. */
 
34
        u8 ieee;        /* MAC header:  IWL_RATE_6M_IEEE, etc. */
 
35
        u8 prev_ieee;    /* previous rate in IEEE speeds */
 
36
        u8 next_ieee;    /* next rate in IEEE speeds */
 
37
        u8 prev_rs;      /* previous rate used in rs algo */
 
38
        u8 next_rs;      /* next rate used in rs algo */
 
39
        u8 prev_rs_tgg;  /* previous rate used in TGG rs algo */
 
40
        u8 next_rs_tgg;  /* next rate used in TGG rs algo */
 
41
};
 
42
 
 
43
struct iwl3945_rate_info {
 
44
        u8 plcp;                /* uCode API:  IWL_RATE_6M_PLCP, etc. */
 
45
        u8 ieee;                /* MAC header:  IWL_RATE_6M_IEEE, etc. */
 
46
        u8 prev_ieee;           /* previous rate in IEEE speeds */
 
47
        u8 next_ieee;           /* next rate in IEEE speeds */
 
48
        u8 prev_rs;             /* previous rate used in rs algo */
 
49
        u8 next_rs;             /* next rate used in rs algo */
 
50
        u8 prev_rs_tgg;         /* previous rate used in TGG rs algo */
 
51
        u8 next_rs_tgg;         /* next rate used in TGG rs algo */
 
52
        u8 table_rs_index;      /* index in rate scale table cmd */
 
53
        u8 prev_table_rs;       /* prev in rate table cmd */
 
54
};
 
55
 
 
56
 
 
57
/*
 
58
 * These serve as indexes into
 
59
 * struct iwl_rate_info iwlegacy_rates[IWL_RATE_COUNT];
 
60
 */
 
61
enum {
 
62
        IWL_RATE_1M_INDEX = 0,
 
63
        IWL_RATE_2M_INDEX,
 
64
        IWL_RATE_5M_INDEX,
 
65
        IWL_RATE_11M_INDEX,
 
66
        IWL_RATE_6M_INDEX,
 
67
        IWL_RATE_9M_INDEX,
 
68
        IWL_RATE_12M_INDEX,
 
69
        IWL_RATE_18M_INDEX,
 
70
        IWL_RATE_24M_INDEX,
 
71
        IWL_RATE_36M_INDEX,
 
72
        IWL_RATE_48M_INDEX,
 
73
        IWL_RATE_54M_INDEX,
 
74
        IWL_RATE_60M_INDEX,
 
75
        IWL_RATE_COUNT,
 
76
        IWL_RATE_COUNT_LEGACY = IWL_RATE_COUNT - 1,     /* Excluding 60M */
 
77
        IWL_RATE_COUNT_3945 = IWL_RATE_COUNT - 1,
 
78
        IWL_RATE_INVM_INDEX = IWL_RATE_COUNT,
 
79
        IWL_RATE_INVALID = IWL_RATE_COUNT,
 
80
};
 
81
 
 
82
enum {
 
83
        IWL_RATE_6M_INDEX_TABLE = 0,
 
84
        IWL_RATE_9M_INDEX_TABLE,
 
85
        IWL_RATE_12M_INDEX_TABLE,
 
86
        IWL_RATE_18M_INDEX_TABLE,
 
87
        IWL_RATE_24M_INDEX_TABLE,
 
88
        IWL_RATE_36M_INDEX_TABLE,
 
89
        IWL_RATE_48M_INDEX_TABLE,
 
90
        IWL_RATE_54M_INDEX_TABLE,
 
91
        IWL_RATE_1M_INDEX_TABLE,
 
92
        IWL_RATE_2M_INDEX_TABLE,
 
93
        IWL_RATE_5M_INDEX_TABLE,
 
94
        IWL_RATE_11M_INDEX_TABLE,
 
95
        IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX - 1,
 
96
};
 
97
 
 
98
enum {
 
99
        IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
 
100
        IWL39_LAST_OFDM_RATE = IWL_RATE_54M_INDEX,
 
101
        IWL_LAST_OFDM_RATE = IWL_RATE_60M_INDEX,
 
102
        IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX,
 
103
        IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX,
 
104
};
 
105
 
 
106
/* #define vs. enum to keep from defaulting to 'large integer' */
 
107
#define IWL_RATE_6M_MASK   (1 << IWL_RATE_6M_INDEX)
 
108
#define IWL_RATE_9M_MASK   (1 << IWL_RATE_9M_INDEX)
 
109
#define IWL_RATE_12M_MASK  (1 << IWL_RATE_12M_INDEX)
 
110
#define IWL_RATE_18M_MASK  (1 << IWL_RATE_18M_INDEX)
 
111
#define IWL_RATE_24M_MASK  (1 << IWL_RATE_24M_INDEX)
 
112
#define IWL_RATE_36M_MASK  (1 << IWL_RATE_36M_INDEX)
 
113
#define IWL_RATE_48M_MASK  (1 << IWL_RATE_48M_INDEX)
 
114
#define IWL_RATE_54M_MASK  (1 << IWL_RATE_54M_INDEX)
 
115
#define IWL_RATE_60M_MASK  (1 << IWL_RATE_60M_INDEX)
 
116
#define IWL_RATE_1M_MASK   (1 << IWL_RATE_1M_INDEX)
 
117
#define IWL_RATE_2M_MASK   (1 << IWL_RATE_2M_INDEX)
 
118
#define IWL_RATE_5M_MASK   (1 << IWL_RATE_5M_INDEX)
 
119
#define IWL_RATE_11M_MASK  (1 << IWL_RATE_11M_INDEX)
 
120
 
 
121
/* uCode API values for legacy bit rates, both OFDM and CCK */
 
122
enum {
 
123
        IWL_RATE_6M_PLCP  = 13,
 
124
        IWL_RATE_9M_PLCP  = 15,
 
125
        IWL_RATE_12M_PLCP = 5,
 
126
        IWL_RATE_18M_PLCP = 7,
 
127
        IWL_RATE_24M_PLCP = 9,
 
128
        IWL_RATE_36M_PLCP = 11,
 
129
        IWL_RATE_48M_PLCP = 1,
 
130
        IWL_RATE_54M_PLCP = 3,
 
131
        IWL_RATE_60M_PLCP = 3,/*FIXME:RS:should be removed*/
 
132
        IWL_RATE_1M_PLCP  = 10,
 
133
        IWL_RATE_2M_PLCP  = 20,
 
134
        IWL_RATE_5M_PLCP  = 55,
 
135
        IWL_RATE_11M_PLCP = 110,
 
136
        /*FIXME:RS:add IWL_RATE_LEGACY_INVM_PLCP = 0,*/
 
137
};
 
138
 
 
139
/* uCode API values for OFDM high-throughput (HT) bit rates */
 
140
enum {
 
141
        IWL_RATE_SISO_6M_PLCP = 0,
 
142
        IWL_RATE_SISO_12M_PLCP = 1,
 
143
        IWL_RATE_SISO_18M_PLCP = 2,
 
144
        IWL_RATE_SISO_24M_PLCP = 3,
 
145
        IWL_RATE_SISO_36M_PLCP = 4,
 
146
        IWL_RATE_SISO_48M_PLCP = 5,
 
147
        IWL_RATE_SISO_54M_PLCP = 6,
 
148
        IWL_RATE_SISO_60M_PLCP = 7,
 
149
        IWL_RATE_MIMO2_6M_PLCP  = 0x8,
 
150
        IWL_RATE_MIMO2_12M_PLCP = 0x9,
 
151
        IWL_RATE_MIMO2_18M_PLCP = 0xa,
 
152
        IWL_RATE_MIMO2_24M_PLCP = 0xb,
 
153
        IWL_RATE_MIMO2_36M_PLCP = 0xc,
 
154
        IWL_RATE_MIMO2_48M_PLCP = 0xd,
 
155
        IWL_RATE_MIMO2_54M_PLCP = 0xe,
 
156
        IWL_RATE_MIMO2_60M_PLCP = 0xf,
 
157
        IWL_RATE_SISO_INVM_PLCP,
 
158
        IWL_RATE_MIMO2_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
 
159
};
 
160
 
 
161
/* MAC header values for bit rates */
 
162
enum {
 
163
        IWL_RATE_6M_IEEE  = 12,
 
164
        IWL_RATE_9M_IEEE  = 18,
 
165
        IWL_RATE_12M_IEEE = 24,
 
166
        IWL_RATE_18M_IEEE = 36,
 
167
        IWL_RATE_24M_IEEE = 48,
 
168
        IWL_RATE_36M_IEEE = 72,
 
169
        IWL_RATE_48M_IEEE = 96,
 
170
        IWL_RATE_54M_IEEE = 108,
 
171
        IWL_RATE_60M_IEEE = 120,
 
172
        IWL_RATE_1M_IEEE  = 2,
 
173
        IWL_RATE_2M_IEEE  = 4,
 
174
        IWL_RATE_5M_IEEE  = 11,
 
175
        IWL_RATE_11M_IEEE = 22,
 
176
};
 
177
 
 
178
#define IWL_CCK_BASIC_RATES_MASK    \
 
179
        (IWL_RATE_1M_MASK          | \
 
180
        IWL_RATE_2M_MASK)
 
181
 
 
182
#define IWL_CCK_RATES_MASK          \
 
183
        (IWL_CCK_BASIC_RATES_MASK  | \
 
184
        IWL_RATE_5M_MASK          | \
 
185
        IWL_RATE_11M_MASK)
 
186
 
 
187
#define IWL_OFDM_BASIC_RATES_MASK   \
 
188
        (IWL_RATE_6M_MASK         | \
 
189
        IWL_RATE_12M_MASK         | \
 
190
        IWL_RATE_24M_MASK)
 
191
 
 
192
#define IWL_OFDM_RATES_MASK         \
 
193
        (IWL_OFDM_BASIC_RATES_MASK | \
 
194
        IWL_RATE_9M_MASK          | \
 
195
        IWL_RATE_18M_MASK         | \
 
196
        IWL_RATE_36M_MASK         | \
 
197
        IWL_RATE_48M_MASK         | \
 
198
        IWL_RATE_54M_MASK)
 
199
 
 
200
#define IWL_BASIC_RATES_MASK         \
 
201
        (IWL_OFDM_BASIC_RATES_MASK | \
 
202
         IWL_CCK_BASIC_RATES_MASK)
 
203
 
 
204
#define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1)
 
205
#define IWL_RATES_MASK_3945 ((1 << IWL_RATE_COUNT_3945) - 1)
 
206
 
 
207
#define IWL_INVALID_VALUE    -1
 
208
 
 
209
#define IWL_MIN_RSSI_VAL                 -100
 
210
#define IWL_MAX_RSSI_VAL                    0
 
211
 
 
212
/* These values specify how many Tx frame attempts before
 
213
 * searching for a new modulation mode */
 
214
#define IWL_LEGACY_FAILURE_LIMIT        160
 
215
#define IWL_LEGACY_SUCCESS_LIMIT        480
 
216
#define IWL_LEGACY_TABLE_COUNT          160
 
217
 
 
218
#define IWL_NONE_LEGACY_FAILURE_LIMIT   400
 
219
#define IWL_NONE_LEGACY_SUCCESS_LIMIT   4500
 
220
#define IWL_NONE_LEGACY_TABLE_COUNT     1500
 
221
 
 
222
/* Success ratio (ACKed / attempted tx frames) values (perfect is 128 * 100) */
 
223
#define IWL_RS_GOOD_RATIO               12800   /* 100% */
 
224
#define IWL_RATE_SCALE_SWITCH           10880   /*  85% */
 
225
#define IWL_RATE_HIGH_TH                10880   /*  85% */
 
226
#define IWL_RATE_INCREASE_TH            6400    /*  50% */
 
227
#define IWL_RATE_DECREASE_TH            1920    /*  15% */
 
228
 
 
229
/* possible actions when in legacy mode */
 
230
#define IWL_LEGACY_SWITCH_ANTENNA1      0
 
231
#define IWL_LEGACY_SWITCH_ANTENNA2      1
 
232
#define IWL_LEGACY_SWITCH_SISO          2
 
233
#define IWL_LEGACY_SWITCH_MIMO2_AB      3
 
234
#define IWL_LEGACY_SWITCH_MIMO2_AC      4
 
235
#define IWL_LEGACY_SWITCH_MIMO2_BC      5
 
236
 
 
237
/* possible actions when in siso mode */
 
238
#define IWL_SISO_SWITCH_ANTENNA1        0
 
239
#define IWL_SISO_SWITCH_ANTENNA2        1
 
240
#define IWL_SISO_SWITCH_MIMO2_AB        2
 
241
#define IWL_SISO_SWITCH_MIMO2_AC        3
 
242
#define IWL_SISO_SWITCH_MIMO2_BC        4
 
243
#define IWL_SISO_SWITCH_GI              5
 
244
 
 
245
/* possible actions when in mimo mode */
 
246
#define IWL_MIMO2_SWITCH_ANTENNA1       0
 
247
#define IWL_MIMO2_SWITCH_ANTENNA2       1
 
248
#define IWL_MIMO2_SWITCH_SISO_A         2
 
249
#define IWL_MIMO2_SWITCH_SISO_B         3
 
250
#define IWL_MIMO2_SWITCH_SISO_C         4
 
251
#define IWL_MIMO2_SWITCH_GI             5
 
252
 
 
253
#define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_GI
 
254
 
 
255
#define IWL_ACTION_LIMIT                3       /* # possible actions */
 
256
 
 
257
#define LQ_SIZE         2       /* 2 mode tables:  "Active" and "Search" */
 
258
 
 
259
/* load per tid defines for A-MPDU activation */
 
260
#define IWL_AGG_TPT_THREHOLD    0
 
261
#define IWL_AGG_LOAD_THRESHOLD  10
 
262
#define IWL_AGG_ALL_TID         0xff
 
263
#define TID_QUEUE_CELL_SPACING  50      /*mS */
 
264
#define TID_QUEUE_MAX_SIZE      20
 
265
#define TID_ROUND_VALUE         5       /* mS */
 
266
#define TID_MAX_LOAD_COUNT      8
 
267
 
 
268
#define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING)
 
269
#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y))
 
270
 
 
271
extern const struct iwl_rate_info iwlegacy_rates[IWL_RATE_COUNT];
 
272
 
 
273
enum iwl_table_type {
 
274
        LQ_NONE,
 
275
        LQ_G,           /* legacy types */
 
276
        LQ_A,
 
277
        LQ_SISO,        /* high-throughput types */
 
278
        LQ_MIMO2,
 
279
        LQ_MAX,
 
280
};
 
281
 
 
282
#define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A))
 
283
#define is_siso(tbl) ((tbl) == LQ_SISO)
 
284
#define is_mimo2(tbl) ((tbl) == LQ_MIMO2)
 
285
#define is_mimo(tbl) (is_mimo2(tbl))
 
286
#define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl))
 
287
#define is_a_band(tbl) ((tbl) == LQ_A)
 
288
#define is_g_and(tbl) ((tbl) == LQ_G)
 
289
 
 
290
#define ANT_NONE        0x0
 
291
#define ANT_A           BIT(0)
 
292
#define ANT_B           BIT(1)
 
293
#define ANT_AB          (ANT_A | ANT_B)
 
294
#define ANT_C           BIT(2)
 
295
#define ANT_AC          (ANT_A | ANT_C)
 
296
#define ANT_BC          (ANT_B | ANT_C)
 
297
#define ANT_ABC         (ANT_AB | ANT_C)
 
298
 
 
299
#define IWL_MAX_MCS_DISPLAY_SIZE        12
 
300
 
 
301
struct iwl_rate_mcs_info {
 
302
        char    mbps[IWL_MAX_MCS_DISPLAY_SIZE];
 
303
        char    mcs[IWL_MAX_MCS_DISPLAY_SIZE];
 
304
};
 
305
 
 
306
/**
 
307
 * struct iwl_rate_scale_data -- tx success history for one rate
 
308
 */
 
309
struct iwl_rate_scale_data {
 
310
        u64 data;               /* bitmap of successful frames */
 
311
        s32 success_counter;    /* number of frames successful */
 
312
        s32 success_ratio;      /* per-cent * 128  */
 
313
        s32 counter;            /* number of frames attempted */
 
314
        s32 average_tpt;        /* success ratio * expected throughput */
 
315
        unsigned long stamp;
 
316
};
 
317
 
 
318
/**
 
319
 * struct iwl_scale_tbl_info -- tx params and success history for all rates
 
320
 *
 
321
 * There are two of these in struct iwl_lq_sta,
 
322
 * one for "active", and one for "search".
 
323
 */
 
324
struct iwl_scale_tbl_info {
 
325
        enum iwl_table_type lq_type;
 
326
        u8 ant_type;
 
327
        u8 is_SGI;      /* 1 = short guard interval */
 
328
        u8 is_ht40;     /* 1 = 40 MHz channel width */
 
329
        u8 is_dup;      /* 1 = duplicated data streams */
 
330
        u8 action;      /* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */
 
331
        u8 max_search;  /* maximun number of tables we can search */
 
332
        s32 *expected_tpt;      /* throughput metrics; expected_tpt_G, etc. */
 
333
        u32 current_rate;  /* rate_n_flags, uCode API format */
 
334
        struct iwl_rate_scale_data win[IWL_RATE_COUNT]; /* rate histories */
 
335
};
 
336
 
 
337
struct iwl_traffic_load {
 
338
        unsigned long time_stamp;       /* age of the oldest statistics */
 
339
        u32 packet_count[TID_QUEUE_MAX_SIZE];   /* packet count in this time
 
340
                                                 * slice */
 
341
        u32 total;                      /* total num of packets during the
 
342
                                         * last TID_MAX_TIME_DIFF */
 
343
        u8 queue_count;                 /* number of queues that has
 
344
                                         * been used since the last cleanup */
 
345
        u8 head;                        /* start of the circular buffer */
 
346
};
 
347
 
 
348
/**
 
349
 * struct iwl_lq_sta -- driver's rate scaling private structure
 
350
 *
 
351
 * Pointer to this gets passed back and forth between driver and mac80211.
 
352
 */
 
353
struct iwl_lq_sta {
 
354
        u8 active_tbl;          /* index of active table, range 0-1 */
 
355
        u8 enable_counter;      /* indicates HT mode */
 
356
        u8 stay_in_tbl;         /* 1: disallow, 0: allow search for new mode */
 
357
        u8 search_better_tbl;   /* 1: currently trying alternate mode */
 
358
        s32 last_tpt;
 
359
 
 
360
        /* The following determine when to search for a new mode */
 
361
        u32 table_count_limit;
 
362
        u32 max_failure_limit;  /* # failed frames before new search */
 
363
        u32 max_success_limit;  /* # successful frames before new search */
 
364
        u32 table_count;
 
365
        u32 total_failed;       /* total failed frames, any/all rates */
 
366
        u32 total_success;      /* total successful frames, any/all rates */
 
367
        u64 flush_timer;        /* time staying in mode before new search */
 
368
 
 
369
        u8 action_counter;      /* # mode-switch actions tried */
 
370
        u8 is_green;
 
371
        u8 is_dup;
 
372
        enum ieee80211_band band;
 
373
 
 
374
        /* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */
 
375
        u32 supp_rates;
 
376
        u16 active_legacy_rate;
 
377
        u16 active_siso_rate;
 
378
        u16 active_mimo2_rate;
 
379
        s8 max_rate_idx;     /* Max rate set by user */
 
380
        u8 missed_rate_counter;
 
381
 
 
382
        struct iwl_link_quality_cmd lq;
 
383
        struct iwl_scale_tbl_info lq_info[LQ_SIZE]; /* "active", "search" */
 
384
        struct iwl_traffic_load load[TID_MAX_LOAD_COUNT];
 
385
        u8 tx_agg_tid_en;
 
386
#ifdef CONFIG_MAC80211_DEBUGFS
 
387
        struct dentry *rs_sta_dbgfs_scale_table_file;
 
388
        struct dentry *rs_sta_dbgfs_stats_table_file;
 
389
        struct dentry *rs_sta_dbgfs_rate_scale_data_file;
 
390
        struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file;
 
391
        u32 dbg_fixed_rate;
 
392
#endif
 
393
        struct iwl_priv *drv;
 
394
 
 
395
        /* used to be in sta_info */
 
396
        int last_txrate_idx;
 
397
        /* last tx rate_n_flags */
 
398
        u32 last_rate_n_flags;
 
399
        /* packets destined for this STA are aggregated */
 
400
        u8 is_agg;
 
401
};
 
402
 
 
403
static inline u8 iwl4965_num_of_ant(u8 mask)
 
404
{
 
405
        return  !!((mask) & ANT_A) +
 
406
                !!((mask) & ANT_B) +
 
407
                !!((mask) & ANT_C);
 
408
}
 
409
 
 
410
static inline u8 iwl4965_first_antenna(u8 mask)
 
411
{
 
412
        if (mask & ANT_A)
 
413
                return ANT_A;
 
414
        if (mask & ANT_B)
 
415
                return ANT_B;
 
416
        return ANT_C;
 
417
}
 
418
 
 
419
 
 
420
/**
 
421
 * iwl3945_rate_scale_init - Initialize the rate scale table based on assoc info
 
422
 *
 
423
 * The specific throughput table used is based on the type of network
 
424
 * the associated with, including A, B, G, and G w/ TGG protection
 
425
 */
 
426
extern void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
 
427
 
 
428
/* Initialize station's rate scaling information after adding station */
 
429
extern void iwl4965_rs_rate_init(struct iwl_priv *priv,
 
430
                             struct ieee80211_sta *sta, u8 sta_id);
 
431
extern void iwl3945_rs_rate_init(struct iwl_priv *priv,
 
432
                                 struct ieee80211_sta *sta, u8 sta_id);
 
433
 
 
434
/**
 
435
 * iwl_rate_control_register - Register the rate control algorithm callbacks
 
436
 *
 
437
 * Since the rate control algorithm is hardware specific, there is no need
 
438
 * or reason to place it as a stand alone module.  The driver can call
 
439
 * iwl_rate_control_register in order to register the rate control callbacks
 
440
 * with the mac80211 subsystem.  This should be performed prior to calling
 
441
 * ieee80211_register_hw
 
442
 *
 
443
 */
 
444
extern int iwl4965_rate_control_register(void);
 
445
extern int iwl3945_rate_control_register(void);
 
446
 
 
447
/**
 
448
 * iwl_rate_control_unregister - Unregister the rate control callbacks
 
449
 *
 
450
 * This should be called after calling ieee80211_unregister_hw, but before
 
451
 * the driver is unloaded.
 
452
 */
 
453
extern void iwl4965_rate_control_unregister(void);
 
454
extern void iwl3945_rate_control_unregister(void);
 
455
 
 
456
#endif /* __iwl_legacy_rs__ */