Commit 35497164 authored by Samuel Ortiz's avatar Samuel Ortiz Committed by John W. Linville

iwmc3200wifi: cache keys when interface is down

When the interface is down and one sets a WEP key from userspace, we should
be able to simply cache it.
Since that implies setting part of the profile's security settings, we now
alloc/free the umac_profile at probe/remove time, and no longer at interface
bring up/down time. Simply resetting it during the latter is enough.
Signed-off-by: default avatarSamuel Ortiz <samuel.ortiz@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 191506ec
...@@ -271,6 +271,10 @@ static int iwm_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev, ...@@ -271,6 +271,10 @@ static int iwm_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
if (key_index == iwm->default_key) if (key_index == iwm->default_key)
iwm->default_key = -1; iwm->default_key = -1;
/* If the interface is down, we just cache this */
if (!test_bit(IWM_STATUS_READY, &iwm->status))
return 0;
return iwm_set_key(iwm, 1, key); return iwm_set_key(iwm, 1, key);
} }
...@@ -288,12 +292,16 @@ static int iwm_cfg80211_set_default_key(struct wiphy *wiphy, ...@@ -288,12 +292,16 @@ static int iwm_cfg80211_set_default_key(struct wiphy *wiphy,
return -EINVAL; return -EINVAL;
} }
iwm->default_key = key_index;
/* If the interface is down, we just cache this */
if (!test_bit(IWM_STATUS_READY, &iwm->status))
return 0;
ret = iwm_set_tx_key(iwm, key_index); ret = iwm_set_tx_key(iwm, key_index);
if (ret < 0) if (ret < 0)
return ret; return ret;
iwm->default_key = key_index;
return iwm_reset_profile(iwm); return iwm_reset_profile(iwm);
} }
......
...@@ -643,19 +643,10 @@ int __iwm_up(struct iwm_priv *iwm) ...@@ -643,19 +643,10 @@ int __iwm_up(struct iwm_priv *iwm)
} }
} }
iwm->umac_profile = kmalloc(sizeof(struct iwm_umac_profile),
GFP_KERNEL);
if (!iwm->umac_profile) {
IWM_ERR(iwm, "Couldn't alloc memory for profile\n");
goto err_fw;
}
iwm_init_default_profile(iwm, iwm->umac_profile);
ret = iwm_channels_init(iwm); ret = iwm_channels_init(iwm);
if (ret < 0) { if (ret < 0) {
IWM_ERR(iwm, "Couldn't init channels\n"); IWM_ERR(iwm, "Couldn't init channels\n");
goto err_profile; goto err_fw;
} }
/* Set the READY bit to indicate interface is brought up successfully */ /* Set the READY bit to indicate interface is brought up successfully */
...@@ -663,10 +654,6 @@ int __iwm_up(struct iwm_priv *iwm) ...@@ -663,10 +654,6 @@ int __iwm_up(struct iwm_priv *iwm)
return 0; return 0;
err_profile:
kfree(iwm->umac_profile);
iwm->umac_profile = NULL;
err_fw: err_fw:
iwm_eeprom_exit(iwm); iwm_eeprom_exit(iwm);
...@@ -705,10 +692,9 @@ int __iwm_down(struct iwm_priv *iwm) ...@@ -705,10 +692,9 @@ int __iwm_down(struct iwm_priv *iwm)
clear_bit(IWM_STATUS_READY, &iwm->status); clear_bit(IWM_STATUS_READY, &iwm->status);
iwm_eeprom_exit(iwm); iwm_eeprom_exit(iwm);
kfree(iwm->umac_profile);
iwm->umac_profile = NULL;
iwm_bss_list_clean(iwm); iwm_bss_list_clean(iwm);
iwm_init_default_profile(iwm, iwm->umac_profile);
iwm->umac_profile_active = false;
iwm->default_key = -1; iwm->default_key = -1;
iwm->core_enabled = 0; iwm->core_enabled = 0;
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include "iwm.h" #include "iwm.h"
#include "commands.h"
#include "cfg80211.h" #include "cfg80211.h"
#include "debug.h" #include "debug.h"
...@@ -135,8 +136,20 @@ void *iwm_if_alloc(int sizeof_bus, struct device *dev, ...@@ -135,8 +136,20 @@ void *iwm_if_alloc(int sizeof_bus, struct device *dev,
SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy)); SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy));
wdev->netdev = ndev; wdev->netdev = ndev;
iwm->umac_profile = kmalloc(sizeof(struct iwm_umac_profile),
GFP_KERNEL);
if (!iwm->umac_profile) {
dev_err(dev, "Couldn't alloc memory for profile\n");
goto out_profile;
}
iwm_init_default_profile(iwm, iwm->umac_profile);
return iwm; return iwm;
out_profile:
free_netdev(ndev);
out_priv: out_priv:
iwm_priv_deinit(iwm); iwm_priv_deinit(iwm);
...@@ -153,6 +166,8 @@ void iwm_if_free(struct iwm_priv *iwm) ...@@ -153,6 +166,8 @@ void iwm_if_free(struct iwm_priv *iwm)
free_netdev(iwm_to_ndev(iwm)); free_netdev(iwm_to_ndev(iwm));
iwm_wdev_free(iwm); iwm_wdev_free(iwm);
iwm_priv_deinit(iwm); iwm_priv_deinit(iwm);
kfree(iwm->umac_profile);
iwm->umac_profile = NULL;
} }
int iwm_if_add(struct iwm_priv *iwm) int iwm_if_add(struct iwm_priv *iwm)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment