Skip to content

Commit

Permalink
iwmc3200wifi: Update wireless_mode with eeprom values
Browse files Browse the repository at this point in the history
The iwmc3200wifi eeprom contains information about the available PHYs on
the chip. We should update our wireless_mode setting and profile according
to it.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Samuel Ortiz authored and John W. Linville committed Nov 28, 2009
1 parent fe19176 commit 0bed08d
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 1 deletion.
20 changes: 20 additions & 0 deletions drivers/net/wireless/iwmc3200wifi/eeprom.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,26 @@ int iwm_eeprom_fat_channels(struct iwm_priv *iwm)
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;
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/iwmc3200wifi/eeprom.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,5 +122,6 @@ int iwm_eeprom_init(struct iwm_priv *iwm);
void iwm_eeprom_exit(struct iwm_priv *iwm);
u8 *iwm_eeprom_access(struct iwm_priv *iwm, u8 eeprom_id);
int iwm_eeprom_fat_channels(struct iwm_priv *iwm);
u32 iwm_eeprom_wireless_mode(struct iwm_priv *iwm);

#endif
19 changes: 18 additions & 1 deletion drivers/net/wireless/iwmc3200wifi/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@ static struct iwm_conf def_iwm_conf = {

.assoc_timeout = 2,
.roam_timeout = 10,
.wireless_mode = WIRELESS_MODE_11A | WIRELESS_MODE_11G,
.wireless_mode = WIRELESS_MODE_11A | WIRELESS_MODE_11G |
WIRELESS_MODE_11N,
.coexist_mode = COEX_MODE_CM,

/* IBSS */
Expand Down Expand Up @@ -630,6 +631,7 @@ static int __iwm_up(struct iwm_priv *iwm)
int ret;
struct iwm_notif *notif_reboot, *notif_ack = NULL;
struct wiphy *wiphy = iwm_to_wiphy(iwm);
u32 wireless_mode;

ret = iwm_bus_enable(iwm);
if (ret) {
Expand Down Expand Up @@ -697,6 +699,21 @@ static int __iwm_up(struct iwm_priv *iwm)
goto err_fw;
}

/*
* Read our SKU capabilities.
* If it's valid, we overwrite the wireless mode conf entry and the
* current profile one.
*/
wireless_mode = iwm_eeprom_wireless_mode(iwm);
if (wireless_mode) {
iwm->conf.wireless_mode = wireless_mode;
if (iwm->umac_profile)
iwm->umac_profile->wireless_mode =
iwm->conf.wireless_mode;
} else
IWM_ERR(iwm, "Wrong SKU capabilities: 0x%x\n",
*((u16 *)iwm_eeprom_access(iwm, IWM_EEPROM_SKU_CAP)));

snprintf(wiphy->fw_version, sizeof(wiphy->fw_version), "L%s_U%s",
iwm->lmac_version, iwm->umac_version);

Expand Down

0 comments on commit 0bed08d

Please sign in to comment.