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: Samuel Ortiz <samuel.ortiz@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
191506ecbc
commit
3549716484
@ -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,
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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 @@
|
|||||||
#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,
|
|||||||
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)
|
|||||||
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user