include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / drivers / net / wireless / iwmc3200wifi / eeprom.c
index 0f34b84..e80e776 100644 (file)
@@ -37,6 +37,7 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/slab.h>
 
 #include "iwm.h"
 #include "umac.h"
@@ -66,6 +67,10 @@ static struct iwm_eeprom_entry eeprom_map[] = {
        [IWM_EEPROM_SKU_CAP] =
        {"SKU capabilities", IWM_EEPROM_SKU_CAP_OFF, IWM_EEPROM_SKU_CAP_LEN},
 
+       [IWM_EEPROM_FAT_CHANNELS_CAP] =
+       {"HT channels capabilities", IWM_EEPROM_FAT_CHANNELS_CAP_OFF,
+        IWM_EEPROM_FAT_CHANNELS_CAP_LEN},
+
        [IWM_EEPROM_CALIB_RXIQ_OFFSET] =
        {"RX IQ offset", IWM_EEPROM_CALIB_RXIQ_OFF, IWM_EEPROM_INDIRECT_LEN},
 
@@ -146,6 +151,52 @@ u8 *iwm_eeprom_access(struct iwm_priv *iwm, u8 eeprom_id)
        return iwm->eeprom + eeprom_map[eeprom_id].offset;
 }
 
+int iwm_eeprom_fat_channels(struct iwm_priv *iwm)
+{
+       struct wiphy *wiphy = iwm_to_wiphy(iwm);
+       struct ieee80211_supported_band *band;
+       u16 *channels, i;
+
+       channels = (u16 *)iwm_eeprom_access(iwm, IWM_EEPROM_FAT_CHANNELS_CAP);
+       if (IS_ERR(channels))
+               return PTR_ERR(channels);
+
+       band = wiphy->bands[IEEE80211_BAND_2GHZ];
+       band->ht_cap.ht_supported = true;
+
+       for (i = 0; i < IWM_EEPROM_FAT_CHANNELS_24; i++)
+               if (!(channels[i] & IWM_EEPROM_FAT_CHANNEL_ENABLED))
+                       band->ht_cap.ht_supported = false;
+
+       band = wiphy->bands[IEEE80211_BAND_5GHZ];
+       band->ht_cap.ht_supported = true;
+       for (i = IWM_EEPROM_FAT_CHANNELS_24; i < IWM_EEPROM_FAT_CHANNELS; i++)
+               if (!(channels[i] & IWM_EEPROM_FAT_CHANNEL_ENABLED))
+                       band->ht_cap.ht_supported = false;
+
+       return 0;
+}
+
+u32 iwm_eeprom_wireless_mode(struct iwm_priv *iwm)
+{
+       u16 sku_cap;
+       u32 wireless_mode = 0;
+
+       sku_cap = *((u16 *)iwm_eeprom_access(iwm, IWM_EEPROM_SKU_CAP));
+
+       if (sku_cap & IWM_EEPROM_SKU_CAP_BAND_24GHZ)
+               wireless_mode |= WIRELESS_MODE_11G;
+
+       if (sku_cap & IWM_EEPROM_SKU_CAP_BAND_52GHZ)
+               wireless_mode |= WIRELESS_MODE_11A;
+
+       if (sku_cap & IWM_EEPROM_SKU_CAP_11N_ENABLE)
+               wireless_mode |= WIRELESS_MODE_11N;
+
+       return wireless_mode;
+}
+
+
 int iwm_eeprom_init(struct iwm_priv *iwm)
 {
        int i, ret = 0;
@@ -156,10 +207,6 @@ int iwm_eeprom_init(struct iwm_priv *iwm)
                return -ENOMEM;
 
        for (i = IWM_EEPROM_FIRST; i < IWM_EEPROM_LAST; i++) {
-#ifdef CONFIG_IWM_B0_HW_SUPPORT
-               if (iwm->conf.hw_b0 && (i >= IWM_EEPROM_INDIRECT_OFFSET))
-                       break;
-#endif
                ret = iwm_eeprom_read(iwm, i);
                if (ret < 0) {
                        IWM_ERR(iwm, "Couldn't read eeprom entry #%d: %s\n",