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