~fcwu-tw/+junk/oem-wireless-bluetooth-dw1550-dkms

« back to all changes in this revision

Viewing changes to oem-wireless-bluetooth-dw1550/drivers/net/wireless/iwlwifi.bad/dvm/rs.h

  • Committer: Doro Wu
  • Date: 2013-08-14 01:41:53 UTC
  • Revision ID: doro.wu@canonical.com-20130814014153-5v7ergizf2ilf7ly
[Doro Wu]
* Merge bcmwl 6.30.223.30+bdcom-0ubuntu1

[Jesse Sung]
* Add patchram support and IDs for broadcom devices (LP: #1180300)
* cherry picked d9c78e9738ccd0017b10b8f44462aafb61904a4a from upstream

Show diffs side-by-side

added added

removed removed

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