Merge git://git.infradead.org/iommu-2.6
[sfrench/cifs-2.6.git] / drivers / staging / rt3070 / chlist.h
1 /*
2  *************************************************************************
3  * Ralink Tech Inc.
4  * 5F., No.36, Taiyuan St., Jhubei City,
5  * Hsinchu County 302,
6  * Taiwan, R.O.C.
7  *
8  * (c) Copyright 2002-2007, Ralink Technology, Inc.
9  *
10  * This program is free software; you can redistribute it and/or modify  *
11  * it under the terms of the GNU General Public License as published by  *
12  * the Free Software Foundation; either version 2 of the License, or     *
13  * (at your option) any later version.                                   *
14  *                                                                       *
15  * This program is distributed in the hope that it will be useful,       *
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
18  * GNU General Public License for more details.                          *
19  *                                                                       *
20  * You should have received a copy of the GNU General Public License     *
21  * along with this program; if not, write to the                         *
22  * Free Software Foundation, Inc.,                                       *
23  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
24  *                                                                       *
25  *************************************************************************
26
27         Module Name:
28         chlist.c
29
30         Abstract:
31
32         Revision History:
33         Who         When          What
34         --------    ----------    ----------------------------------------------
35         Fonchi Wu   2007-12-19    created
36 */
37
38 #ifndef __CHLIST_H__
39 #define __CHLIST_H__
40
41 #include "rtmp_type.h"
42 #include "rtmp_def.h"
43
44
45 #define ODOR                    0
46 #define IDOR                    1
47 #define BOTH                    2
48
49 #define BAND_5G         0
50 #define BAND_24G        1
51 #define BAND_BOTH       2
52
53 typedef struct _CH_DESP {
54         UCHAR FirstChannel;
55         UCHAR NumOfCh;
56         CHAR MaxTxPwr;                  // dBm
57         UCHAR Geography;                        // 0:out door, 1:in door, 2:both
58         BOOLEAN DfsReq;                 // Dfs require, 0: No, 1: yes.
59 } CH_DESP, *PCH_DESP;
60
61 typedef struct _CH_REGION {
62         UCHAR CountReg[3];
63         UCHAR DfsType;                  // 0: CE, 1: FCC, 2: JAP, 3:JAP_W53, JAP_W56
64         CH_DESP ChDesp[10];
65 } CH_REGION, *PCH_REGION;
66
67 static CH_REGION ChRegion[] =
68 {
69                 {       // Antigua and Berbuda
70                         "AG",
71                         CE,
72                         {
73                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
74                                 { 36,  4,  23, BOTH, FALSE},    // 5G, ch 36~48
75                                 { 52,  4,  23, BOTH, FALSE},    // 5G, ch 52~64
76                                 { 100, 11, 30, BOTH, FALSE},    // 5G, ch 100~140
77                                 { 0},                                                   // end
78                         }
79                 },
80
81                 {       // Argentina
82                         "AR",
83                         CE,
84                         {
85                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
86                                 { 52,  4,  24, BOTH, FALSE},    // 5G, ch 52~64
87                                 { 149, 4,  30, BOTH, FALSE},    // 5G, ch 149~161
88                                 { 0},                                                   // end
89                         }
90                 },
91
92                 {       // Aruba
93                         "AW",
94                         CE,
95                         {
96                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
97                                 { 36,  4,  23, BOTH, FALSE},    // 5G, ch 36~48
98                                 { 52,  4,  23, BOTH, FALSE},    // 5G, ch 52~64
99                                 { 100, 11, 30, BOTH, FALSE},    // 5G, ch 100~140
100                                 { 0},                                                   // end
101                         }
102                 },
103
104                 {       // Australia
105                         "AU",
106                         CE,
107                         {
108                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
109                                 { 36,  4,  23, BOTH, FALSE},    // 5G, ch 36~48
110                                 { 52,  4,  24, BOTH, FALSE},    // 5G, ch 52~64
111                                 { 149, 5,  30, BOTH, FALSE},    // 5G, ch 149~165
112                                 { 0},                                                   // end
113                         }
114                 },
115
116                 {       // Austria
117                         "AT",
118                         CE,
119                         {
120                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
121                                 { 36,  4,  23, IDOR, TRUE},             // 5G, ch 36~48
122                                 { 52,  4,  23, IDOR, TRUE},             // 5G, ch 52~64
123                                 { 100, 11, 30, BOTH, TRUE},             // 5G, ch 100~140
124                                 { 0},                                                   // end
125                         }
126                 },
127
128                 {       // Bahamas
129                         "BS",
130                         CE,
131                         {
132                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
133                                 { 36,  4,  23, BOTH, FALSE},    // 5G, ch 36~48
134                                 { 52,  4,  24, BOTH, FALSE},    // 5G, ch 52~64
135                                 { 149, 5,  30, BOTH, FALSE},    // 5G, ch 149~165
136                                 { 0},                                                   // end
137                         }
138                 },
139
140                 {       // Barbados
141                         "BB",
142                         CE,
143                         {
144                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
145                                 { 36,  4,  23, BOTH, FALSE},    // 5G, ch 36~48
146                                 { 52,  4,  24, BOTH, FALSE},    // 5G, ch 52~64
147                                 { 100, 11, 30, BOTH, FALSE},    // 5G, ch 100~140
148                                 { 0},                                                   // end
149                         }
150                 },
151
152                 {       // Bermuda
153                         "BM",
154                         CE,
155                         {
156                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
157                                 { 36,  4,  23, BOTH, FALSE},    // 5G, ch 36~48
158                                 { 52,  4,  24, BOTH, FALSE},    // 5G, ch 52~64
159                                 { 100, 11, 30, BOTH, FALSE},    // 5G, ch 100~140
160                                 { 0},                                                   // end
161                         }
162                 },
163
164                 {       // Brazil
165                         "BR",
166                         CE,
167                         {
168                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
169                                 { 36,  4,  23, BOTH, FALSE},    // 5G, ch 36~48
170                                 { 52,  4,  24, BOTH, FALSE},    // 5G, ch 52~64
171                                 { 100, 11, 24, BOTH, FALSE},    // 5G, ch 100~140
172                                 { 149, 5,  30, BOTH, FALSE},    // 5G, ch 100~140
173                                 { 0},                                                   // end
174                         }
175                 },
176
177                 {       // Belgium
178                         "BE",
179                         CE,
180                         {
181                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
182                                 { 36,  4,  18, IDOR, FALSE},    // 5G, ch 36~48
183                                 { 52,  4,  18, IDOR, FALSE},    // 5G, ch 52~64
184                                 { 0},                                                   // end
185                         }
186                 },
187
188                 {       // Bulgaria
189                         "BG",
190                         CE,
191                         {
192                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
193                                 { 36,  4,  23, IDOR, FALSE},    // 5G, ch 36~48
194                                 { 52,  4,  23, IDOR, TRUE},     // 5G, ch 52~64
195                                 { 100, 11, 30, ODOR, TRUE},     // 5G, ch 100~140
196                                 { 0},                                                   // end
197                         }
198                 },
199
200                 {       // Canada
201                         "CA",
202                         CE,
203                         {
204                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
205                                 { 36,  4,  23, BOTH, FALSE},    // 5G, ch 36~48
206                                 { 52,  4,  23, BOTH, FALSE},    // 5G, ch 52~64
207                                 { 149, 5,  30, BOTH, FALSE},    // 5G, ch 149~165
208                                 { 0},                                                   // end
209                         }
210                 },
211
212                 {       // Cayman IsLands
213                         "KY",
214                         CE,
215                         {
216                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
217                                 { 36,  4,  23, BOTH, FALSE},    // 5G, ch 36~48
218                                 { 52,  4,  24, BOTH, FALSE},    // 5G, ch 52~64
219                                 { 100, 11, 30, BOTH, FALSE},    // 5G, ch 100~140
220                                 { 0},                                                   // end
221                         }
222                 },
223
224                 {       // Chile
225                         "CL",
226                         CE,
227                         {
228                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
229                                 { 36,  4,  20, BOTH, FALSE},    // 5G, ch 36~48
230                                 { 52,  4,  20, BOTH, FALSE},    // 5G, ch 52~64
231                                 { 149, 5,  20, BOTH, FALSE},    // 5G, ch 149~165
232                                 { 0},                                                   // end
233                         }
234                 },
235
236                 {       // China
237                         "CN",
238                         CE,
239                         {
240                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
241                                 { 149, 4,  27, BOTH, FALSE},    // 5G, ch 149~161
242                                 { 0},                                                   // end
243                         }
244                 },
245
246                 {       // Colombia
247                         "CO",
248                         CE,
249                         {
250                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
251                                 { 36,  4,  17, BOTH, FALSE},    // 5G, ch 36~48
252                                 { 52,  4,  24, BOTH, FALSE},    // 5G, ch 52~64
253                                 { 100, 11, 30, BOTH, FALSE},    // 5G, ch 100~140
254                                 { 149, 5,  30, BOTH, FALSE},    // 5G, ch 149~165
255                                 { 0},                                                   // end
256                         }
257                 },
258
259                 {       // Costa Rica
260                         "CR",
261                         CE,
262                         {
263                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
264                                 { 36,  4,  17, BOTH, FALSE},    // 5G, ch 36~48
265                                 { 52,  4,  24, BOTH, FALSE},    // 5G, ch 52~64
266                                 { 149, 4,  30, BOTH, FALSE},    // 5G, ch 149~161
267                                 { 0},                                                   // end
268                         }
269                 },
270
271                 {       // Cyprus
272                         "CY",
273                         CE,
274                         {
275                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
276                                 { 36,  4,  23, IDOR, FALSE},    // 5G, ch 36~48
277                                 { 52,  4,  24, IDOR, TRUE},             // 5G, ch 52~64
278                                 { 100, 11, 30, BOTH, TRUE},             // 5G, ch 100~140
279                                 { 0},                                                   // end
280                         }
281                 },
282
283                 {       // Czech_Republic
284                         "CZ",
285                         CE,
286                         {
287                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
288                                 { 36,  4,  23, IDOR, FALSE},    // 5G, ch 36~48
289                                 { 52,  4,  23, IDOR, TRUE},             // 5G, ch 52~64
290                                 { 0},                                                   // end
291                         }
292                 },
293
294                 {       // Denmark
295                         "DK",
296                         CE,
297                         {
298                                 { 1,   13, 20, BOTH, FALSE},    // 2.4 G, ch 1~13
299                                 { 36,  4,  23, IDOR, FALSE},    // 5G, ch 36~48
300                                 { 52,  4,  23, IDOR, TRUE},             // 5G, ch 52~64
301                                 { 100, 11, 30, BOTH, TRUE},             // 5G, ch 100~140
302                                 { 0},                                                   // end
303                         }
304                 },
305
306                 {       // Dominican Republic
307                         "DO",
308                         CE,
309                         {
310                                 { 1,   0,  20, BOTH, FALSE},    // 2.4 G, ch 0
311                                 { 149, 4,  20, BOTH, FALSE},    // 5G, ch 149~161
312                                 { 0},                                                   // end
313                         }
314                 },
315
316                 {       // Equador
317                         "EC",
318                         CE,
319                         {
320                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
321                                 { 100, 11,  27, BOTH, FALSE},   // 5G, ch 100~140
322                                 { 0},                                                   // end
323                         }
324                 },
325
326                 {       // El Salvador
327                         "SV",
328                         CE,
329                         {
330                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
331                                 { 36,  4,   23, IDOR, FALSE},   // 5G, ch 36~48
332                                 { 52,  4,   30, BOTH, TRUE},    // 5G, ch 52~64
333                                 { 149, 4,   36, BOTH, TRUE},    // 5G, ch 149~165
334                                 { 0},                                                   // end
335                         }
336                 },
337
338                 {       // Finland
339                         "FI",
340                         CE,
341                         {
342                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
343                                 { 36,  4,   23, IDOR, FALSE},   // 5G, ch 36~48
344                                 { 52,  4,   23, IDOR, TRUE},    // 5G, ch 52~64
345                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
346                                 { 0},                                                   // end
347                         }
348                 },
349
350                 {       // France
351                         "FR",
352                         CE,
353                         {
354                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
355                                 { 36,  4,   23, IDOR, FALSE},   // 5G, ch 36~48
356                                 { 52,  4,   23, IDOR, TRUE},    // 5G, ch 52~64
357                                 { 0},                                                   // end
358                         }
359                 },
360
361                 {       // Germany
362                         "DE",
363                         CE,
364                         {
365                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
366                                 { 36,  4,   23, IDOR, FALSE},   // 5G, ch 36~48
367                                 { 52,  4,   23, IDOR, TRUE},    // 5G, ch 52~64
368                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
369                                 { 0},                                                   // end
370                         }
371                 },
372
373                 {       // Greece
374                         "GR",
375                         CE,
376                         {
377                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
378                                 { 36,  4,   23, IDOR, FALSE},   // 5G, ch 36~48
379                                 { 52,  4,   23, IDOR, TRUE},    // 5G, ch 52~64
380                                 { 100, 11,  30, ODOR, TRUE},    // 5G, ch 100~140
381                                 { 0},                                                   // end
382                         }
383                 },
384
385                 {       // Guam
386                         "GU",
387                         CE,
388                         {
389                                 { 1,   11,  20, BOTH, FALSE},   // 2.4 G, ch 1~11
390                                 { 36,  4,   17, BOTH, FALSE},   // 5G, ch 36~48
391                                 { 52,  4,   24, BOTH, FALSE},   // 5G, ch 52~64
392                                 { 100, 11,  30, BOTH, FALSE},   // 5G, ch 100~140
393                                 { 149,  5,  30, BOTH, FALSE},   // 5G, ch 149~165
394                                 { 0},                                                   // end
395                         }
396                 },
397
398                 {       // Guatemala
399                         "GT",
400                         CE,
401                         {
402                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
403                                 { 36,  4,   17, BOTH, FALSE},   // 5G, ch 36~48
404                                 { 52,  4,   24, BOTH, FALSE},   // 5G, ch 52~64
405                                 { 149,  4,  30, BOTH, FALSE},   // 5G, ch 149~161
406                                 { 0},                                                   // end
407                         }
408                 },
409
410                 {       // Haiti
411                         "HT",
412                         CE,
413                         {
414                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
415                                 { 36,  4,   17, BOTH, FALSE},   // 5G, ch 36~48
416                                 { 52,  4,   24, BOTH, FALSE},   // 5G, ch 52~64
417                                 { 149,  4,  30, BOTH, FALSE},   // 5G, ch 149~161
418                                 { 0},                                                   // end
419                         }
420                 },
421
422                 {       // Honduras
423                         "HN",
424                         CE,
425                         {
426                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
427                                 { 149,  4,  27, BOTH, FALSE},   // 5G, ch 149~161
428                                 { 0},                                                   // end
429                         }
430                 },
431
432                 {       // Hong Kong
433                         "HK",
434                         CE,
435                         {
436                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
437                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
438                                 { 52,   4,  23, IDOR, FALSE},   // 5G, ch 52~64
439                                 { 149,  4,  30, BOTH, FALSE},   // 5G, ch 149~161
440                                 { 0},                                                   // end
441                         }
442                 },
443
444                 {       // Hungary
445                         "HU",
446                         CE,
447                         {
448                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
449                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
450                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
451                                 { 0},                                                   // end
452                         }
453                 },
454
455                 {       // Iceland
456                         "IS",
457                         CE,
458                         {
459                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
460                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
461                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
462                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
463                                 { 0},                                                   // end
464                         }
465                 },
466
467                 {       // India
468                         "IN",
469                         CE,
470                         {
471                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
472                                 { 149,  4,  24, IDOR, FALSE},   // 5G, ch 149~161
473                                 { 0},                                                   // end
474                         }
475                 },
476
477                 {       // Indonesia
478                         "ID",
479                         CE,
480                         {
481                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
482                                 { 149,  4,  27, BOTH, FALSE},   // 5G, ch 149~161
483                                 { 0},                                                   // end
484                         }
485                 },
486
487                 {       // Ireland
488                         "IE",
489                         CE,
490                         {
491                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
492                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
493                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
494                                 { 100, 11,  30, ODOR, TRUE},    // 5G, ch 100~140
495                                 { 0},                                                   // end
496                         }
497                 },
498
499                 {       // Israel
500                         "IL",
501                         CE,
502                         {
503                                 { 1,    3,  20, IDOR, FALSE},   // 2.4 G, ch 1~3
504                                 { 4,    6,  20, BOTH, FALSE},   // 2.4 G, ch 4~9
505                                 { 10,   4,  20, IDOR, FALSE},   // 2.4 G, ch 10~13
506                                 { 0},                                                   // end
507                         }
508                 },
509
510                 {       // Italy
511                         "IT",
512                         CE,
513                         {
514                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
515                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
516                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
517                                 { 100, 11,  30, ODOR, TRUE},    // 5G, ch 100~140
518                                 { 0},                                                   // end
519                         }
520                 },
521
522                 {       // Japan
523                         "JP",
524                         JAP,
525                         {
526                                 { 1,   14,  20, BOTH, FALSE},   // 2.4 G, ch 1~14
527                                 { 34,   4,  23, IDOR, FALSE},   // 5G, ch 34~46
528                                 { 0},                                                   // end
529                         }
530                 },
531
532                 {       // Jordan
533                         "JO",
534                         CE,
535                         {
536                                 { 1,   13,  20, IDOR, FALSE},   // 2.4 G, ch 1~13
537                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
538                                 { 149,  4,  23, IDOR, FALSE},   // 5G, ch 149~161
539                                 { 0},                                                   // end
540                         }
541                 },
542
543                 {       // Latvia
544                         "LV",
545                         CE,
546                         {
547                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
548                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
549                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
550                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
551                                 { 0},                                                   // end
552                         }
553                 },
554
555                 {       // Liechtenstein
556                         "LI",
557                         CE,
558                         {
559                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
560                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
561                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
562                                 { 0},                                                   // end
563                         }
564                 },
565
566                 {       // Lithuania
567                         "LT",
568                         CE,
569                         {
570                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
571                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
572                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
573                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
574                                 { 0},                                                   // end
575                         }
576                 },
577
578                 {       // Luxemburg
579                         "LU",
580                         CE,
581                         {
582                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
583                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
584                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
585                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
586                                 { 0},                                                   // end
587                         }
588                 },
589
590                 {       // Malaysia
591                         "MY",
592                         CE,
593                         {
594                                 { 36,   4,  23, BOTH, FALSE},   // 5G, ch 36~48
595                                 { 52,   4,  23, BOTH, FALSE},   // 5G, ch 52~64
596                                 { 149,  5,  20, BOTH, FALSE},   // 5G, ch 149~165
597                                 { 0},                                                   // end
598                         }
599                 },
600
601                 {       // Malta
602                         "MT",
603                         CE,
604                         {
605                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
606                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
607                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
608                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
609                                 { 0},                                                   // end
610                         }
611                 },
612
613                 {       // Marocco
614                         "MA",
615                         CE,
616                         {
617                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
618                                 { 36,   4,  24, IDOR, FALSE},   // 5G, ch 36~48
619                                 { 0},                                                   // end
620                         }
621                 },
622
623                 {       // Mexico
624                         "MX",
625                         CE,
626                         {
627                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
628                                 { 36,   4,  23, BOTH, FALSE},   // 5G, ch 36~48
629                                 { 52,   4,  24, BOTH, FALSE},   // 5G, ch 52~64
630                                 { 149,  5,  30, IDOR, FALSE},   // 5G, ch 149~165
631                                 { 0},                                                   // end
632                         }
633                 },
634
635                 {       // Netherlands
636                         "NL",
637                         CE,
638                         {
639                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
640                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
641                                 { 52,   4,  24, IDOR, TRUE},    // 5G, ch 52~64
642                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
643                                 { 0},                                                   // end
644                         }
645                 },
646
647                 {       // New Zealand
648                         "NZ",
649                         CE,
650                         {
651                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
652                                 { 36,   4,  24, BOTH, FALSE},   // 5G, ch 36~48
653                                 { 52,   4,  24, BOTH, FALSE},   // 5G, ch 52~64
654                                 { 149,  4,  30, BOTH, FALSE},   // 5G, ch 149~161
655                                 { 0},                                                   // end
656                         }
657                 },
658
659                 {       // Norway
660                         "NO",
661                         CE,
662                         {
663                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
664                                 { 36,   4,  24, IDOR, FALSE},   // 5G, ch 36~48
665                                 { 52,   4,  24, IDOR, TRUE},    // 5G, ch 52~64
666                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 149~161
667                                 { 0},                                                   // end
668                         }
669                 },
670
671                 {       // Peru
672                         "PE",
673                         CE,
674                         {
675                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
676                                 { 149,  4,  27, BOTH, FALSE},   // 5G, ch 149~161
677                                 { 0},                                                   // end
678                         }
679                 },
680
681                 {       // Portugal
682                         "PT",
683                         CE,
684                         {
685                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
686                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
687                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
688                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
689                                 { 0},                                                   // end
690                         }
691                 },
692
693                 {       // Poland
694                         "PL",
695                         CE,
696                         {
697                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
698                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
699                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
700                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
701                                 { 0},                                                   // end
702                         }
703                 },
704
705                 {       // Romania
706                         "RO",
707                         CE,
708                         {
709                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
710                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
711                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
712                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
713                                 { 0},                                                   // end
714                         }
715                 },
716
717                 {       // Russia
718                         "RU",
719                         CE,
720                         {
721                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
722                                 { 149,  4,  20, IDOR, FALSE},   // 5G, ch 149~161
723                                 { 0},                                                   // end
724                         }
725                 },
726
727                 {       // Saudi Arabia
728                         "SA",
729                         CE,
730                         {
731                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
732                                 { 36,   4,  23, BOTH, FALSE},   // 5G, ch 36~48
733                                 { 52,   4,  23, BOTH, FALSE},   // 5G, ch 52~64
734                                 { 149,  4,  23, BOTH, FALSE},   // 5G, ch 149~161
735                                 { 0},                                                   // end
736                         }
737                 },
738
739                 {       // Serbia_and_Montenegro
740                         "CS",
741                         CE,
742                         {
743                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
744                                 { 0},                                                   // end
745                         }
746                 },
747
748                 {       // Singapore
749                         "SG",
750                         CE,
751                         {
752                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
753                                 { 36,   4,  23, BOTH, FALSE},   // 5G, ch 36~48
754                                 { 52,   4,  23, BOTH, FALSE},   // 5G, ch 52~64
755                                 { 149,  4,  20, BOTH, FALSE},   // 5G, ch 149~161
756                                 { 0},                                                   // end
757                         }
758                 },
759
760                 {       // Slovakia
761                         "SK",
762                         CE,
763                         {
764                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
765                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
766                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
767                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
768                                 { 0},                                                   // end
769                         }
770                 },
771
772                 {       // Slovenia
773                         "SI",
774                         CE,
775                         {
776                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
777                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
778                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
779                                 { 0},                                                   // end
780                         }
781                 },
782
783                 {       // South Africa
784                         "ZA",
785                         CE,
786                         {
787                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
788                                 { 36,   4,  23, BOTH, FALSE},   // 5G, ch 36~48
789                                 { 52,   4,  23, IDOR, FALSE},   // 5G, ch 52~64
790                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
791                                 { 149,  4,  30, BOTH, FALSE},   // 5G, ch 149~161
792                                 { 0},                                                   // end
793                         }
794                 },
795
796                 {       // South Korea
797                         "KR",
798                         CE,
799                         {
800                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
801                                 { 36,   4,  20, BOTH, FALSE},   // 5G, ch 36~48
802                                 { 52,   4,  20, BOTH, FALSE},   // 5G, ch 52~64
803                                 { 100,  8,  20, BOTH, FALSE},   // 5G, ch 100~128
804                                 { 149,  4,  20, BOTH, FALSE},   // 5G, ch 149~161
805                                 { 0},                                                   // end
806                         }
807                 },
808
809                 {       // Spain
810                         "ES",
811                         CE,
812                         {
813                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
814                                 { 36,   4,  17, IDOR, FALSE},   // 5G, ch 36~48
815                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
816                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
817                                 { 0},                                                   // end
818                         }
819                 },
820
821                 {       // Sweden
822                         "SE",
823                         CE,
824                         {
825                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
826                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 36~48
827                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
828                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
829                                 { 0},                                                   // end
830                         }
831                 },
832
833                 {       // Switzerland
834                         "CH",
835                         CE,
836                         {
837                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~13
838                                 { 36,   4,  23, IDOR, TRUE},    // 5G, ch 36~48
839                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
840                                 { 0},                                                   // end
841                         }
842                 },
843
844                 {       // Taiwan
845                         "TW",
846                         CE,
847                         {
848                                 { 1,   11,  30, BOTH, FALSE},   // 2.4 G, ch 1~11
849                                 { 52,   4,  23, IDOR, FALSE},   // 5G, ch 52~64
850                                 { 0},                                                   // end
851                         }
852                 },
853
854                 {       // Turkey
855                         "TR",
856                         CE,
857                         {
858                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~11
859                                 { 36,   4,  23, BOTH, FALSE},   // 5G, ch 36~48
860                                 { 52,   4,  23, BOTH, FALSE},   // 5G, ch 52~64
861                                 { 0},                                                   // end
862                         }
863                 },
864
865                 {       // UK
866                         "GB",
867                         CE,
868                         {
869                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~11
870                                 { 36,   4,  23, IDOR, FALSE},   // 5G, ch 52~64
871                                 { 52,   4,  23, IDOR, TRUE},    // 5G, ch 52~64
872                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
873                                 { 0},                                                   // end
874                         }
875                 },
876
877                 {       // Ukraine
878                         "UA",
879                         CE,
880                         {
881                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~11
882                                 { 0},                                                   // end
883                         }
884                 },
885
886                 {       // United_Arab_Emirates
887                         "AE",
888                         CE,
889                         {
890                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~11
891                                 { 0},                                                   // end
892                         }
893                 },
894
895                 {       // United_States
896                         "US",
897                         CE,
898                         {
899                                 { 1,   11,  30, BOTH, FALSE},   // 2.4 G, ch 1~11
900                                 { 36,   4,  17, IDOR, FALSE},   // 5G, ch 52~64
901                                 { 52,   4,  24, BOTH, TRUE},    // 5G, ch 52~64
902                                 { 100, 11,  30, BOTH, TRUE},    // 5G, ch 100~140
903                                 { 149,  5,  30, BOTH, FALSE},   // 5G, ch 149~165
904                                 { 0},                                                   // end
905                         }
906                 },
907
908                 {       // Venezuela
909                         "VE",
910                         CE,
911                         {
912                                 { 1,   13,  20, BOTH, FALSE},   // 2.4 G, ch 1~11
913                                 { 149,  4,  27, BOTH, FALSE},   // 5G, ch 149~161
914                                 { 0},                                                   // end
915                         }
916                 },
917
918                 {       // Default
919                         "",
920                         CE,
921                         {
922                                 { 1,   11,  20, BOTH, FALSE},   // 2.4 G, ch 1~11
923                                 { 36,   4,  20, BOTH, FALSE},   // 5G, ch 52~64
924                                 { 52,   4,  20, BOTH, FALSE},   // 5G, ch 52~64
925                                 { 100, 11,  20, BOTH, FALSE},   // 5G, ch 100~140
926                                 { 149,  5,  20, BOTH, FALSE},   // 5G, ch 149~165
927                                 { 0},                                                   // end
928                         }
929                 },
930 };
931
932 static inline PCH_REGION GetChRegion(
933         IN PUCHAR CntryCode)
934 {
935         INT loop = 0;
936         PCH_REGION pChRegion = NULL;
937
938         while (strcmp(ChRegion[loop].CountReg, "") != 0)
939         {
940                 if (strncmp(ChRegion[loop].CountReg, CntryCode, 2) == 0)
941                 {
942                         pChRegion = &ChRegion[loop];
943                         break;
944                 }
945                 loop++;
946         }
947
948         if (pChRegion == NULL)
949                 pChRegion = &ChRegion[loop];
950         return pChRegion;
951 }
952
953 static inline VOID ChBandCheck(
954         IN UCHAR PhyMode,
955         OUT PUCHAR pChType)
956 {
957         switch(PhyMode)
958         {
959                 case PHY_11A:
960 #ifdef DOT11_N_SUPPORT
961                 case PHY_11AN_MIXED:
962 #endif // DOT11_N_SUPPORT //
963                         *pChType = BAND_5G;
964                         break;
965                 case PHY_11ABG_MIXED:
966 #ifdef DOT11_N_SUPPORT
967                 case PHY_11AGN_MIXED:
968                 case PHY_11ABGN_MIXED:
969 #endif // DOT11_N_SUPPORT //
970                         *pChType = BAND_BOTH;
971                         break;
972
973                 default:
974                         *pChType = BAND_24G;
975                         break;
976         }
977 }
978
979 static inline UCHAR FillChList(
980         IN PRTMP_ADAPTER pAd,
981         IN PCH_DESP pChDesp,
982         IN UCHAR Offset,
983         IN UCHAR increment)
984 {
985         INT i, j, l;
986         UCHAR channel;
987
988         j = Offset;
989         for (i = 0; i < pChDesp->NumOfCh; i++)
990         {
991                 channel = pChDesp->FirstChannel + i * increment;
992                 for (l=0; l<MAX_NUM_OF_CHANNELS; l++)
993                 {
994                         if (channel == pAd->TxPower[l].Channel)
995                         {
996                                 pAd->ChannelList[j].Power = pAd->TxPower[l].Power;
997                                 pAd->ChannelList[j].Power2 = pAd->TxPower[l].Power2;
998                                 break;
999                         }
1000                 }
1001                 if (l == MAX_NUM_OF_CHANNELS)
1002                         continue;
1003
1004                 pAd->ChannelList[j].Channel = pChDesp->FirstChannel + i * increment;
1005                 pAd->ChannelList[j].MaxTxPwr = pChDesp->MaxTxPwr;
1006                 pAd->ChannelList[j].DfsReq = pChDesp->DfsReq;
1007                 j++;
1008         }
1009         pAd->ChannelListNum = j;
1010
1011         return j;
1012 }
1013
1014 static inline VOID CreateChList(
1015         IN PRTMP_ADAPTER pAd,
1016         IN PCH_REGION pChRegion,
1017         IN UCHAR Geography)
1018 {
1019         INT i;
1020         UCHAR offset = 0;
1021         PCH_DESP pChDesp;
1022         UCHAR ChType;
1023         UCHAR increment;
1024
1025         if (pChRegion == NULL)
1026                 return;
1027
1028         ChBandCheck(pAd->CommonCfg.PhyMode, &ChType);
1029
1030         for (i=0; i<10; i++)
1031         {
1032                 pChDesp = &pChRegion->ChDesp[i];
1033                 if (pChDesp->FirstChannel == 0)
1034                         break;
1035
1036                 if (ChType == BAND_5G)
1037                 {
1038                         if (pChDesp->FirstChannel <= 14)
1039                                 continue;
1040                 }
1041                 else if (ChType == BAND_24G)
1042                 {
1043                         if (pChDesp->FirstChannel > 14)
1044                                 continue;
1045                 }
1046
1047                 if ((pChDesp->Geography == BOTH)
1048                         || (pChDesp->Geography == Geography))
1049         {
1050                         if (pChDesp->FirstChannel > 14)
1051                 increment = 4;
1052             else
1053                 increment = 1;
1054                         offset = FillChList(pAd, pChDesp, offset, increment);
1055         }
1056         }
1057 }
1058
1059 static inline VOID BuildChannelListEx(
1060         IN PRTMP_ADAPTER pAd)
1061 {
1062         PCH_REGION pChReg;
1063
1064         pChReg = GetChRegion(pAd->CommonCfg.CountryCode);
1065         CreateChList(pAd, pChReg, pAd->CommonCfg.Geography);
1066 }
1067
1068 static inline VOID BuildBeaconChList(
1069         IN PRTMP_ADAPTER pAd,
1070         OUT PUCHAR pBuf,
1071         OUT     PULONG pBufLen)
1072 {
1073         INT i;
1074         ULONG TmpLen;
1075         PCH_REGION pChRegion;
1076         PCH_DESP pChDesp;
1077         UCHAR ChType;
1078
1079         pChRegion = GetChRegion(pAd->CommonCfg.CountryCode);
1080
1081         if (pChRegion == NULL)
1082                 return;
1083
1084         ChBandCheck(pAd->CommonCfg.PhyMode, &ChType);
1085         *pBufLen = 0;
1086
1087         for (i=0; i<10; i++)
1088         {
1089                 pChDesp = &pChRegion->ChDesp[i];
1090                 if (pChDesp->FirstChannel == 0)
1091                         break;
1092
1093                 if (ChType == BAND_5G)
1094                 {
1095                         if (pChDesp->FirstChannel <= 14)
1096                                 continue;
1097                 }
1098                 else if (ChType == BAND_24G)
1099                 {
1100                         if (pChDesp->FirstChannel > 14)
1101                                 continue;
1102                 }
1103
1104                 if ((pChDesp->Geography == BOTH)
1105                         || (pChDesp->Geography == pAd->CommonCfg.Geography))
1106                 {
1107                         MakeOutgoingFrame(pBuf + *pBufLen,              &TmpLen,
1108                                                                 1,                      &pChDesp->FirstChannel,
1109                                                                 1,                      &pChDesp->NumOfCh,
1110                                                                 1,                      &pChDesp->MaxTxPwr,
1111                                                                 END_OF_ARGS);
1112                         *pBufLen += TmpLen;
1113                 }
1114         }
1115 }
1116
1117
1118 #ifdef DOT11_N_SUPPORT
1119 static inline BOOLEAN IsValidChannel(
1120         IN PRTMP_ADAPTER pAd,
1121         IN UCHAR channel)
1122
1123 {
1124         INT i;
1125
1126         for (i = 0; i < pAd->ChannelListNum; i++)
1127         {
1128                 if (pAd->ChannelList[i].Channel == channel)
1129                         break;
1130         }
1131
1132         if (i == pAd->ChannelListNum)
1133                 return FALSE;
1134         else
1135                 return TRUE;
1136 }
1137
1138
1139 static inline UCHAR GetExtCh(
1140         IN UCHAR Channel,
1141         IN UCHAR Direction)
1142 {
1143         CHAR ExtCh;
1144
1145         if (Direction == EXTCHA_ABOVE)
1146                 ExtCh = Channel + 4;
1147         else
1148                 ExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0;
1149
1150         return ExtCh;
1151 }
1152
1153
1154 static inline VOID N_ChannelCheck(
1155         IN PRTMP_ADAPTER pAd)
1156 {
1157         //UCHAR ChannelNum = pAd->ChannelListNum;
1158         UCHAR Channel = pAd->CommonCfg.Channel;
1159
1160         if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->CommonCfg.RegTransmitSetting.field.BW  == BW_40))
1161         {
1162                 if (Channel > 14)
1163                 {
1164                         if ((Channel == 36) || (Channel == 44) || (Channel == 52) || (Channel == 60) || (Channel == 100) || (Channel == 108) ||
1165                             (Channel == 116) || (Channel == 124) || (Channel == 132) || (Channel == 149) || (Channel == 157))
1166                         {
1167                                 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
1168                         }
1169                         else if ((Channel == 40) || (Channel == 48) || (Channel == 56) || (Channel == 64) || (Channel == 104) || (Channel == 112) ||
1170                                         (Channel == 120) || (Channel == 128) || (Channel == 136) || (Channel == 153) || (Channel == 161))
1171                         {
1172                                 pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
1173                         }
1174                         else
1175                         {
1176                                 pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;
1177                         }
1178                 }
1179                 else
1180                 {
1181                         do
1182                         {
1183                                 UCHAR ExtCh;
1184                                 UCHAR Dir = pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;
1185                                 ExtCh = GetExtCh(Channel, Dir);
1186                                 if (IsValidChannel(pAd, ExtCh))
1187                                         break;
1188
1189                                 Dir = (Dir == EXTCHA_ABOVE) ? EXTCHA_BELOW : EXTCHA_ABOVE;
1190                                 ExtCh = GetExtCh(Channel, Dir);
1191                                 if (IsValidChannel(pAd, ExtCh))
1192                                 {
1193                                         pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = Dir;
1194                                         break;
1195                                 }
1196                                 pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;
1197                         } while(FALSE);
1198
1199                         if (Channel == 14)
1200                         {
1201                                 pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;
1202                                 //pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_NONE; // We didn't set the ExtCh as NONE due to it'll set in RTMPSetHT()
1203                         }
1204                 }
1205         }
1206
1207
1208 }
1209
1210
1211 static inline VOID N_SetCenCh(
1212         IN PRTMP_ADAPTER pAd)
1213 {
1214         if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)
1215         {
1216                 if (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)
1217                 {
1218                         pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2;
1219                 }
1220                 else
1221                 {
1222                         if (pAd->CommonCfg.Channel == 14)
1223                                 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 1;
1224                         else
1225                                 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2;
1226                 }
1227         }
1228         else
1229         {
1230                 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
1231         }
1232 }
1233 #endif // DOT11_N_SUPPORT //
1234
1235
1236 static inline UINT8 GetCuntryMaxTxPwr(
1237         IN PRTMP_ADAPTER pAd,
1238         IN UINT8 channel)
1239 {
1240         int i;
1241         for (i = 0; i < pAd->ChannelListNum; i++)
1242         {
1243                 if (pAd->ChannelList[i].Channel == channel)
1244                         break;
1245         }
1246
1247         if (i == pAd->ChannelListNum)
1248                 return 0xff;
1249         else
1250                 return pAd->ChannelList[i].MaxTxPwr;
1251 }
1252 #endif // __CHLIST_H__
1253