ath5k: Port debug.c over to the new band API and enable as build option
[safe/jmp/linux-2.6] / drivers / net / wireless / ath5k / regdom.c
1 /*
2  * Copyright (c) 2004, 2005 Reyk Floeter <reyk@vantronix.net>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 /*
18  * Basic regulation domain extensions for the IEEE 802.11 stack
19  */
20
21 #include <linux/kernel.h>
22 #include <linux/string.h>
23
24 #include "regdom.h"
25
26 static const struct ath5k_regdommap {
27         enum ath5k_regdom dmn;
28         enum ath5k_regdom dmn5;
29         enum ath5k_regdom dmn2;
30 } r_map[] = {
31         { DMN_DEFAULT,          DMN_DEBUG,      DMN_DEBUG },
32         { DMN_NULL_WORLD,       DMN_NULL,       DMN_WORLD },
33         { DMN_NULL_ETSIB,       DMN_NULL,       DMN_ETSIB },
34         { DMN_NULL_ETSIC,       DMN_NULL,       DMN_ETSIC },
35         { DMN_FCC1_FCCA,        DMN_FCC1,       DMN_FCCA },
36         { DMN_FCC1_WORLD,       DMN_FCC1,       DMN_WORLD },
37         { DMN_FCC2_FCCA,        DMN_FCC2,       DMN_FCCA },
38         { DMN_FCC2_WORLD,       DMN_FCC2,       DMN_WORLD },
39         { DMN_FCC2_ETSIC,       DMN_FCC2,       DMN_ETSIC },
40         { DMN_FRANCE_NULL,      DMN_ETSI3,      DMN_ETSI3 },
41         { DMN_FCC3_FCCA,        DMN_FCC3,       DMN_WORLD },
42         { DMN_ETSI1_WORLD,      DMN_ETSI1,      DMN_WORLD },
43         { DMN_ETSI3_ETSIA,      DMN_ETSI3,      DMN_WORLD },
44         { DMN_ETSI2_WORLD,      DMN_ETSI2,      DMN_WORLD },
45         { DMN_ETSI3_WORLD,      DMN_ETSI3,      DMN_WORLD },
46         { DMN_ETSI4_WORLD,      DMN_ETSI4,      DMN_WORLD },
47         { DMN_ETSI4_ETSIC,      DMN_ETSI4,      DMN_ETSIC },
48         { DMN_ETSI5_WORLD,      DMN_ETSI5,      DMN_WORLD },
49         { DMN_ETSI6_WORLD,      DMN_ETSI6,      DMN_WORLD },
50         { DMN_ETSI_NULL,        DMN_ETSI1,      DMN_ETSI1 },
51         { DMN_MKK1_MKKA,        DMN_MKK1,       DMN_MKKA },
52         { DMN_MKK1_MKKB,        DMN_MKK1,       DMN_MKKA },
53         { DMN_APL4_WORLD,       DMN_APL4,       DMN_WORLD },
54         { DMN_MKK2_MKKA,        DMN_MKK2,       DMN_MKKA },
55         { DMN_APL_NULL,         DMN_APL1,       DMN_NULL },
56         { DMN_APL2_WORLD,       DMN_APL2,       DMN_WORLD },
57         { DMN_APL2_APLC,        DMN_APL2,       DMN_WORLD },
58         { DMN_APL3_WORLD,       DMN_APL3,       DMN_WORLD },
59         { DMN_MKK1_FCCA,        DMN_MKK1,       DMN_FCCA },
60         { DMN_APL2_APLD,        DMN_APL2,       DMN_APLD },
61         { DMN_MKK1_MKKA1,       DMN_MKK1,       DMN_MKKA },
62         { DMN_MKK1_MKKA2,       DMN_MKK1,       DMN_MKKA },
63         { DMN_APL1_WORLD,       DMN_APL1,       DMN_WORLD },
64         { DMN_APL1_FCCA,        DMN_APL1,       DMN_FCCA },
65         { DMN_APL1_APLA,        DMN_APL1,       DMN_WORLD },
66         { DMN_APL1_ETSIC,       DMN_APL1,       DMN_ETSIC },
67         { DMN_APL2_ETSIC,       DMN_APL2,       DMN_ETSIC },
68         { DMN_APL5_WORLD,       DMN_APL5,       DMN_WORLD },
69         { DMN_WOR0_WORLD,       DMN_WORLD,      DMN_WORLD },
70         { DMN_WOR1_WORLD,       DMN_WORLD,      DMN_WORLD },
71         { DMN_WOR2_WORLD,       DMN_WORLD,      DMN_WORLD },
72         { DMN_WOR3_WORLD,       DMN_WORLD,      DMN_WORLD },
73         { DMN_WOR4_WORLD,       DMN_WORLD,      DMN_WORLD },
74         { DMN_WOR5_ETSIC,       DMN_WORLD,      DMN_WORLD },
75         { DMN_WOR01_WORLD,      DMN_WORLD,      DMN_WORLD },
76         { DMN_WOR02_WORLD,      DMN_WORLD,      DMN_WORLD },
77         { DMN_EU1_WORLD,        DMN_ETSI1,      DMN_WORLD },
78         { DMN_WOR9_WORLD,       DMN_WORLD,      DMN_WORLD },
79         { DMN_WORA_WORLD,       DMN_WORLD,      DMN_WORLD },
80 };
81
82 enum ath5k_regdom ath5k_regdom2flag(enum ath5k_regdom dmn, u16 mhz)
83 {
84         unsigned int i;
85
86         for (i = 0; i < ARRAY_SIZE(r_map); i++) {
87                 if (r_map[i].dmn == dmn) {
88                         if (mhz >= 2000 && mhz <= 3000)
89                                 return r_map[i].dmn2;
90                         if (mhz >= IEEE80211_CHANNELS_5GHZ_MIN &&
91                                         mhz <= IEEE80211_CHANNELS_5GHZ_MAX)
92                                 return r_map[i].dmn5;
93                 }
94         }
95
96         return DMN_DEBUG;
97 }
98
99 u16 ath5k_regdom_from_ieee(enum ath5k_regdom ieee)
100 {
101         u32 regdomain = (u32)ieee;
102
103         /*
104          * Use the default regulation domain if the value is empty
105          * or not supported by the net80211 regulation code.
106          */
107         if (ath5k_regdom2flag(regdomain, IEEE80211_CHANNELS_5GHZ_MIN) ==
108                         DMN_DEBUG)
109                 return (u16)AR5K_TUNE_REGDOMAIN;
110
111         /* It is supported, just return the value */
112         return regdomain;
113 }
114
115 enum ath5k_regdom ath5k_regdom_to_ieee(u16 regdomain)
116 {
117         enum ath5k_regdom ieee = (enum ath5k_regdom)regdomain;
118
119         return ieee;
120 }
121