diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/wireless/iwmc3200wifi/eeprom.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/net/wireless/iwmc3200wifi/eeprom.c')
-rw-r--r-- | drivers/net/wireless/iwmc3200wifi/eeprom.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwmc3200wifi/eeprom.c b/drivers/net/wireless/iwmc3200wifi/eeprom.c index 365910fbe01e..e80e776b74f7 100644 --- a/drivers/net/wireless/iwmc3200wifi/eeprom.c +++ b/drivers/net/wireless/iwmc3200wifi/eeprom.c | |||
@@ -37,6 +37,7 @@ | |||
37 | */ | 37 | */ |
38 | 38 | ||
39 | #include <linux/kernel.h> | 39 | #include <linux/kernel.h> |
40 | #include <linux/slab.h> | ||
40 | 41 | ||
41 | #include "iwm.h" | 42 | #include "iwm.h" |
42 | #include "umac.h" | 43 | #include "umac.h" |
@@ -66,6 +67,10 @@ static struct iwm_eeprom_entry eeprom_map[] = { | |||
66 | [IWM_EEPROM_SKU_CAP] = | 67 | [IWM_EEPROM_SKU_CAP] = |
67 | {"SKU capabilities", IWM_EEPROM_SKU_CAP_OFF, IWM_EEPROM_SKU_CAP_LEN}, | 68 | {"SKU capabilities", IWM_EEPROM_SKU_CAP_OFF, IWM_EEPROM_SKU_CAP_LEN}, |
68 | 69 | ||
70 | [IWM_EEPROM_FAT_CHANNELS_CAP] = | ||
71 | {"HT channels capabilities", IWM_EEPROM_FAT_CHANNELS_CAP_OFF, | ||
72 | IWM_EEPROM_FAT_CHANNELS_CAP_LEN}, | ||
73 | |||
69 | [IWM_EEPROM_CALIB_RXIQ_OFFSET] = | 74 | [IWM_EEPROM_CALIB_RXIQ_OFFSET] = |
70 | {"RX IQ offset", IWM_EEPROM_CALIB_RXIQ_OFF, IWM_EEPROM_INDIRECT_LEN}, | 75 | {"RX IQ offset", IWM_EEPROM_CALIB_RXIQ_OFF, IWM_EEPROM_INDIRECT_LEN}, |
71 | 76 | ||
@@ -146,6 +151,52 @@ u8 *iwm_eeprom_access(struct iwm_priv *iwm, u8 eeprom_id) | |||
146 | return iwm->eeprom + eeprom_map[eeprom_id].offset; | 151 | return iwm->eeprom + eeprom_map[eeprom_id].offset; |
147 | } | 152 | } |
148 | 153 | ||
154 | int iwm_eeprom_fat_channels(struct iwm_priv *iwm) | ||
155 | { | ||
156 | struct wiphy *wiphy = iwm_to_wiphy(iwm); | ||
157 | struct ieee80211_supported_band *band; | ||
158 | u16 *channels, i; | ||
159 | |||
160 | channels = (u16 *)iwm_eeprom_access(iwm, IWM_EEPROM_FAT_CHANNELS_CAP); | ||
161 | if (IS_ERR(channels)) | ||
162 | return PTR_ERR(channels); | ||
163 | |||
164 | band = wiphy->bands[IEEE80211_BAND_2GHZ]; | ||
165 | band->ht_cap.ht_supported = true; | ||
166 | |||
167 | for (i = 0; i < IWM_EEPROM_FAT_CHANNELS_24; i++) | ||
168 | if (!(channels[i] & IWM_EEPROM_FAT_CHANNEL_ENABLED)) | ||
169 | band->ht_cap.ht_supported = false; | ||
170 | |||
171 | band = wiphy->bands[IEEE80211_BAND_5GHZ]; | ||
172 | band->ht_cap.ht_supported = true; | ||
173 | for (i = IWM_EEPROM_FAT_CHANNELS_24; i < IWM_EEPROM_FAT_CHANNELS; i++) | ||
174 | if (!(channels[i] & IWM_EEPROM_FAT_CHANNEL_ENABLED)) | ||
175 | band->ht_cap.ht_supported = false; | ||
176 | |||
177 | return 0; | ||
178 | } | ||
179 | |||
180 | u32 iwm_eeprom_wireless_mode(struct iwm_priv *iwm) | ||
181 | { | ||
182 | u16 sku_cap; | ||
183 | u32 wireless_mode = 0; | ||
184 | |||
185 | sku_cap = *((u16 *)iwm_eeprom_access(iwm, IWM_EEPROM_SKU_CAP)); | ||
186 | |||
187 | if (sku_cap & IWM_EEPROM_SKU_CAP_BAND_24GHZ) | ||
188 | wireless_mode |= WIRELESS_MODE_11G; | ||
189 | |||
190 | if (sku_cap & IWM_EEPROM_SKU_CAP_BAND_52GHZ) | ||
191 | wireless_mode |= WIRELESS_MODE_11A; | ||
192 | |||
193 | if (sku_cap & IWM_EEPROM_SKU_CAP_11N_ENABLE) | ||
194 | wireless_mode |= WIRELESS_MODE_11N; | ||
195 | |||
196 | return wireless_mode; | ||
197 | } | ||
198 | |||
199 | |||
149 | int iwm_eeprom_init(struct iwm_priv *iwm) | 200 | int iwm_eeprom_init(struct iwm_priv *iwm) |
150 | { | 201 | { |
151 | int i, ret = 0; | 202 | int i, ret = 0; |