diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn-hcmd-check.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-hcmd-check.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd-check.c b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd-check.c new file mode 100644 index 000000000000..c50494a74f67 --- /dev/null +++ b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd-check.c | |||
@@ -0,0 +1,108 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * GPL LICENSE SUMMARY | ||
4 | * | ||
5 | * Copyright(c) 2008 Intel Corporation. All rights reserved. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of version 2 of the GNU General Public License as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but | ||
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
14 | * General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, | ||
19 | * USA | ||
20 | * | ||
21 | * The full GNU General Public License is included in this distribution | ||
22 | * in the file called LICENSE.GPL. | ||
23 | * | ||
24 | * Contact Information: | ||
25 | * Tomas Winkler <tomas.winkler@intel.com> | ||
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
27 | *****************************************************************************/ | ||
28 | |||
29 | #include <linux/kernel.h> | ||
30 | #include <net/mac80211.h> | ||
31 | #include "iwl-dev.h" | ||
32 | #include "iwl-debug.h" | ||
33 | #include "iwl-commands.h" | ||
34 | |||
35 | |||
36 | /** | ||
37 | * iwl_check_rxon_cmd - validate RXON structure is valid | ||
38 | * | ||
39 | * NOTE: This is really only useful during development and can eventually | ||
40 | * be #ifdef'd out once the driver is stable and folks aren't actively | ||
41 | * making changes | ||
42 | */ | ||
43 | int iwl_agn_check_rxon_cmd(struct iwl_rxon_cmd *rxon) | ||
44 | { | ||
45 | int error = 0; | ||
46 | int counter = 1; | ||
47 | |||
48 | if (rxon->flags & RXON_FLG_BAND_24G_MSK) { | ||
49 | error |= le32_to_cpu(rxon->flags & | ||
50 | (RXON_FLG_TGJ_NARROW_BAND_MSK | | ||
51 | RXON_FLG_RADAR_DETECT_MSK)); | ||
52 | if (error) | ||
53 | IWL_WARNING("check 24G fields %d | %d\n", | ||
54 | counter++, error); | ||
55 | } else { | ||
56 | error |= (rxon->flags & RXON_FLG_SHORT_SLOT_MSK) ? | ||
57 | 0 : le32_to_cpu(RXON_FLG_SHORT_SLOT_MSK); | ||
58 | if (error) | ||
59 | IWL_WARNING("check 52 fields %d | %d\n", | ||
60 | counter++, error); | ||
61 | error |= le32_to_cpu(rxon->flags & RXON_FLG_CCK_MSK); | ||
62 | if (error) | ||
63 | IWL_WARNING("check 52 CCK %d | %d\n", | ||
64 | counter++, error); | ||
65 | } | ||
66 | error |= (rxon->node_addr[0] | rxon->bssid_addr[0]) & 0x1; | ||
67 | if (error) | ||
68 | IWL_WARNING("check mac addr %d | %d\n", counter++, error); | ||
69 | |||
70 | /* make sure basic rates 6Mbps and 1Mbps are supported */ | ||
71 | error |= (((rxon->ofdm_basic_rates & IWL_RATE_6M_MASK) == 0) && | ||
72 | ((rxon->cck_basic_rates & IWL_RATE_1M_MASK) == 0)); | ||
73 | if (error) | ||
74 | IWL_WARNING("check basic rate %d | %d\n", counter++, error); | ||
75 | |||
76 | error |= (le16_to_cpu(rxon->assoc_id) > 2007); | ||
77 | if (error) | ||
78 | IWL_WARNING("check assoc id %d | %d\n", counter++, error); | ||
79 | |||
80 | error |= ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK)) | ||
81 | == (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK)); | ||
82 | if (error) | ||
83 | IWL_WARNING("check CCK and short slot %d | %d\n", | ||
84 | counter++, error); | ||
85 | |||
86 | error |= ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK)) | ||
87 | == (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK)); | ||
88 | if (error) | ||
89 | IWL_WARNING("check CCK & auto detect %d | %d\n", | ||
90 | counter++, error); | ||
91 | |||
92 | error |= ((rxon->flags & (RXON_FLG_AUTO_DETECT_MSK | | ||
93 | RXON_FLG_TGG_PROTECT_MSK)) == RXON_FLG_TGG_PROTECT_MSK); | ||
94 | if (error) | ||
95 | IWL_WARNING("check TGG and auto detect %d | %d\n", | ||
96 | counter++, error); | ||
97 | |||
98 | if (error) | ||
99 | IWL_WARNING("Tuning to channel %d\n", | ||
100 | le16_to_cpu(rxon->channel)); | ||
101 | |||
102 | if (error) { | ||
103 | IWL_ERROR("Not a valid iwl4965_rxon_assoc_cmd field values\n"); | ||
104 | return -1; | ||
105 | } | ||
106 | return 0; | ||
107 | } | ||
108 | |||