Jiri Slaby | fa1c114 | 2007-08-12 17:33:16 +0200 | [diff] [blame] | 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 | |