mirror of
https://github.com/pentoo/pentoo-overlay
synced 2025-12-23 16:56:17 +01:00
586 lines
15 KiB
Diff
586 lines
15 KiB
Diff
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
|
|
index d313c9befa23..259378d6ed0d 100644
|
|
--- a/net/wireless/scan.c
|
|
+++ b/net/wireless/scan.c
|
|
@@ -2219,6 +2219,8 @@ int cfg80211_wext_siwscan(struct net_device *dev,
|
|
|
|
eth_broadcast_addr(creq->bssid);
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
+
|
|
rdev->scan_req = creq;
|
|
err = rdev_scan(rdev, creq);
|
|
if (err) {
|
|
@@ -2230,6 +2232,7 @@ int cfg80211_wext_siwscan(struct net_device *dev,
|
|
creq = NULL;
|
|
dev_hold(dev);
|
|
}
|
|
+ mutex_unlock(&rdev->mtx);
|
|
out:
|
|
kfree(creq);
|
|
return err;
|
|
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
|
|
index 7b6529d81c61..cb08139397dd 100644
|
|
--- a/net/wireless/wext-compat.c
|
|
+++ b/net/wireless/wext-compat.c
|
|
@@ -257,17 +257,23 @@ int cfg80211_wext_siwrts(struct net_device *dev,
|
|
u32 orts = wdev->wiphy->rts_threshold;
|
|
int err;
|
|
|
|
- if (rts->disabled || !rts->fixed)
|
|
+ mutex_lock(&rdev->mtx);
|
|
+ if (rts->disabled || !rts->fixed) {
|
|
wdev->wiphy->rts_threshold = (u32) -1;
|
|
- else if (rts->value < 0)
|
|
- return -EINVAL;
|
|
- else
|
|
+ } else if (rts->value < 0) {
|
|
+ err = -EINVAL;
|
|
+ goto out;
|
|
+ } else {
|
|
wdev->wiphy->rts_threshold = rts->value;
|
|
+ }
|
|
|
|
err = rdev_set_wiphy_params(rdev, WIPHY_PARAM_RTS_THRESHOLD);
|
|
+
|
|
if (err)
|
|
wdev->wiphy->rts_threshold = orts;
|
|
|
|
+out:
|
|
+ mutex_unlock(&rdev->mtx);
|
|
return err;
|
|
}
|
|
EXPORT_WEXT_HANDLER(cfg80211_wext_siwrts);
|
|
@@ -295,11 +301,13 @@ int cfg80211_wext_siwfrag(struct net_device *dev,
|
|
u32 ofrag = wdev->wiphy->frag_threshold;
|
|
int err;
|
|
|
|
- if (frag->disabled || !frag->fixed)
|
|
+ mutex_lock(&rdev->mtx);
|
|
+ if (frag->disabled || !frag->fixed) {
|
|
wdev->wiphy->frag_threshold = (u32) -1;
|
|
- else if (frag->value < 256)
|
|
- return -EINVAL;
|
|
- else {
|
|
+ } else if (frag->value < 256) {
|
|
+ err = -EINVAL;
|
|
+ goto out;
|
|
+ } else {
|
|
/* Fragment length must be even, so strip LSB. */
|
|
wdev->wiphy->frag_threshold = frag->value & ~0x1;
|
|
}
|
|
@@ -307,6 +315,8 @@ int cfg80211_wext_siwfrag(struct net_device *dev,
|
|
err = rdev_set_wiphy_params(rdev, WIPHY_PARAM_FRAG_THRESHOLD);
|
|
if (err)
|
|
wdev->wiphy->frag_threshold = ofrag;
|
|
+out:
|
|
+ mutex_unlock(&rdev->mtx);
|
|
|
|
return err;
|
|
}
|
|
@@ -341,6 +351,7 @@ static int cfg80211_wext_siwretry(struct net_device *dev,
|
|
(retry->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT)
|
|
return -EINVAL;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
if (retry->flags & IW_RETRY_LONG) {
|
|
wdev->wiphy->retry_long = retry->value;
|
|
changed |= WIPHY_PARAM_RETRY_LONG;
|
|
@@ -359,6 +370,7 @@ static int cfg80211_wext_siwretry(struct net_device *dev,
|
|
wdev->wiphy->retry_short = oshort;
|
|
wdev->wiphy->retry_long = olong;
|
|
}
|
|
+ mutex_unlock(&rdev->mtx);
|
|
|
|
return err;
|
|
}
|
|
@@ -581,15 +593,18 @@ static int cfg80211_wext_siwencode(struct net_device *dev,
|
|
!rdev->ops->set_default_key)
|
|
return -EOPNOTSUPP;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
idx = erq->flags & IW_ENCODE_INDEX;
|
|
if (idx == 0) {
|
|
idx = wdev->wext.default_key;
|
|
if (idx < 0)
|
|
idx = 0;
|
|
- } else if (idx < 1 || idx > 4)
|
|
- return -EINVAL;
|
|
- else
|
|
+ } else if (idx < 1 || idx > 4) {
|
|
+ err = -EINVAL;
|
|
+ goto out;
|
|
+ } else {
|
|
idx--;
|
|
+ }
|
|
|
|
if (erq->flags & IW_ENCODE_DISABLED)
|
|
remove = true;
|
|
@@ -603,22 +618,28 @@ static int cfg80211_wext_siwencode(struct net_device *dev,
|
|
if (!err)
|
|
wdev->wext.default_key = idx;
|
|
wdev_unlock(wdev);
|
|
- return err;
|
|
+ goto out;
|
|
}
|
|
|
|
memset(¶ms, 0, sizeof(params));
|
|
params.key = keybuf;
|
|
params.key_len = erq->length;
|
|
- if (erq->length == 5)
|
|
+ if (erq->length == 5) {
|
|
params.cipher = WLAN_CIPHER_SUITE_WEP40;
|
|
- else if (erq->length == 13)
|
|
+ } else if (erq->length == 13) {
|
|
params.cipher = WLAN_CIPHER_SUITE_WEP104;
|
|
- else if (!remove)
|
|
- return -EINVAL;
|
|
+ } else if (!remove) {
|
|
+ err = -EINVAL;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ err = cfg80211_set_encryption(rdev, dev, false, NULL, remove,
|
|
+ wdev->wext.default_key == -1,
|
|
+ idx, ¶ms);
|
|
+out:
|
|
+ mutex_unlock(&rdev->mtx);
|
|
|
|
- return cfg80211_set_encryption(rdev, dev, false, NULL, remove,
|
|
- wdev->wext.default_key == -1,
|
|
- idx, ¶ms);
|
|
+ return err;
|
|
}
|
|
|
|
static int cfg80211_wext_siwencodeext(struct net_device *dev,
|
|
@@ -758,38 +779,61 @@ static int cfg80211_wext_siwfreq(struct net_device *dev,
|
|
struct cfg80211_chan_def chandef = {
|
|
.width = NL80211_CHAN_WIDTH_20_NOHT,
|
|
};
|
|
- int freq;
|
|
+ int freq, ret;
|
|
+
|
|
+ mutex_lock(&rdev->mtx);
|
|
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_siwfreq(dev, info, wextfreq, extra);
|
|
+ ret = cfg80211_mgd_wext_siwfreq(dev, info, wextfreq, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_siwfreq(dev, info, wextfreq, extra);
|
|
+ ret = cfg80211_ibss_wext_siwfreq(dev, info, wextfreq, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_MONITOR:
|
|
freq = cfg80211_wext_freq(wextfreq);
|
|
- if (freq < 0)
|
|
- return freq;
|
|
- if (freq == 0)
|
|
- return -EINVAL;
|
|
+ if (freq < 0) {
|
|
+ ret = freq;
|
|
+ break;
|
|
+ }
|
|
+ if (freq == 0) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
chandef.center_freq1 = freq;
|
|
chandef.chan = ieee80211_get_channel(&rdev->wiphy, freq);
|
|
- if (!chandef.chan)
|
|
- return -EINVAL;
|
|
- return cfg80211_set_monitor_channel(rdev, &chandef);
|
|
+ if (!chandef.chan) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
+ ret = cfg80211_set_monitor_channel(rdev, &chandef);
|
|
+ break;
|
|
case NL80211_IFTYPE_MESH_POINT:
|
|
freq = cfg80211_wext_freq(wextfreq);
|
|
- if (freq < 0)
|
|
- return freq;
|
|
- if (freq == 0)
|
|
- return -EINVAL;
|
|
+ if (freq < 0) {
|
|
+ ret = freq;
|
|
+ break;
|
|
+ }
|
|
+ if (freq == 0) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
chandef.center_freq1 = freq;
|
|
chandef.chan = ieee80211_get_channel(&rdev->wiphy, freq);
|
|
- if (!chandef.chan)
|
|
- return -EINVAL;
|
|
- return cfg80211_set_mesh_channel(rdev, wdev, &chandef);
|
|
+ if (!chandef.chan) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
+ ret = cfg80211_set_mesh_channel(rdev, wdev, &chandef);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+
|
|
+ mutex_unlock(&rdev->mtx);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_giwfreq(struct net_device *dev,
|
|
@@ -801,24 +845,35 @@ static int cfg80211_wext_giwfreq(struct net_device *dev,
|
|
struct cfg80211_chan_def chandef;
|
|
int ret;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_giwfreq(dev, info, freq, extra);
|
|
+ ret = cfg80211_mgd_wext_giwfreq(dev, info, freq, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_giwfreq(dev, info, freq, extra);
|
|
+ ret = cfg80211_ibss_wext_giwfreq(dev, info, freq, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_MONITOR:
|
|
- if (!rdev->ops->get_channel)
|
|
- return -EINVAL;
|
|
+ if (!rdev->ops->get_channel) {
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
+ }
|
|
|
|
ret = rdev_get_channel(rdev, wdev, &chandef);
|
|
if (ret)
|
|
- return ret;
|
|
+ break;
|
|
freq->m = chandef.chan->center_freq;
|
|
freq->e = 6;
|
|
- return 0;
|
|
+ ret = 0;
|
|
+ break;
|
|
default:
|
|
- return -EINVAL;
|
|
+ ret = -EINVAL;
|
|
+ break;
|
|
}
|
|
+
|
|
+ mutex_unlock(&rdev->mtx);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_siwtxpower(struct net_device *dev,
|
|
@@ -829,6 +884,7 @@ static int cfg80211_wext_siwtxpower(struct net_device *dev,
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
enum nl80211_tx_power_setting type;
|
|
int dbm = 0;
|
|
+ int ret;
|
|
|
|
if ((data->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
|
|
return -EINVAL;
|
|
@@ -870,7 +926,11 @@ static int cfg80211_wext_siwtxpower(struct net_device *dev,
|
|
return 0;
|
|
}
|
|
|
|
- return rdev_set_tx_power(rdev, wdev, type, DBM_TO_MBM(dbm));
|
|
+ mutex_lock(&rdev->mtx);
|
|
+ ret = rdev_set_tx_power(rdev, wdev, type, DBM_TO_MBM(dbm));
|
|
+ mutex_unlock(&rdev->mtx);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_giwtxpower(struct net_device *dev,
|
|
@@ -889,7 +949,9 @@ static int cfg80211_wext_giwtxpower(struct net_device *dev,
|
|
if (!rdev->ops->get_tx_power)
|
|
return -EOPNOTSUPP;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
err = rdev_get_tx_power(rdev, wdev, &val);
|
|
+ mutex_unlock(&rdev->mtx);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -1129,7 +1191,9 @@ static int cfg80211_wext_siwpower(struct net_device *dev,
|
|
timeout = wrq->value / 1000;
|
|
}
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
err = rdev_set_power_mgmt(rdev, dev, ps, timeout);
|
|
+ mutex_unlock(&rdev->mtx);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -1171,7 +1235,9 @@ static int cfg80211_wds_wext_siwap(struct net_device *dev,
|
|
if (!rdev->ops->set_wds_peer)
|
|
return -EOPNOTSUPP;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
err = rdev_set_wds_peer(rdev, dev, (u8 *)&addr->sa_data);
|
|
+ mutex_unlock(&rdev->mtx);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -1204,7 +1270,7 @@ static int cfg80211_wext_siwrate(struct net_device *dev,
|
|
struct cfg80211_bitrate_mask mask;
|
|
u32 fixed, maxrate;
|
|
struct ieee80211_supported_band *sband;
|
|
- int band, ridx;
|
|
+ int band, ridx, ret;
|
|
bool match = false;
|
|
|
|
if (!rdev->ops->set_bitrate_mask)
|
|
@@ -1243,7 +1309,11 @@ static int cfg80211_wext_siwrate(struct net_device *dev,
|
|
if (!match)
|
|
return -EINVAL;
|
|
|
|
- return rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
|
|
+ mutex_lock(&rdev->mtx);
|
|
+ ret = rdev_set_bitrate_mask(rdev, dev, NULL, &mask);
|
|
+ mutex_unlock(&rdev->mtx);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_giwrate(struct net_device *dev,
|
|
@@ -1272,7 +1342,9 @@ static int cfg80211_wext_giwrate(struct net_device *dev,
|
|
if (err)
|
|
return err;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
err = rdev_get_station(rdev, dev, addr, &sinfo);
|
|
+ mutex_unlock(&rdev->mtx);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -1297,6 +1369,7 @@ static struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev)
|
|
static struct iw_statistics wstats;
|
|
static struct station_info sinfo = {};
|
|
u8 bssid[ETH_ALEN];
|
|
+ int ret;
|
|
|
|
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION)
|
|
return NULL;
|
|
@@ -1315,7 +1388,11 @@ static struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev)
|
|
|
|
memset(&sinfo, 0, sizeof(sinfo));
|
|
|
|
- if (rdev_get_station(rdev, dev, bssid, &sinfo))
|
|
+ mutex_lock(&rdev->mtx);
|
|
+ ret = rdev_get_station(rdev, dev, bssid, &sinfo);
|
|
+ mutex_unlock(&rdev->mtx);
|
|
+
|
|
+ if (ret)
|
|
return NULL;
|
|
|
|
memset(&wstats, 0, sizeof(wstats));
|
|
@@ -1366,17 +1443,27 @@ static int cfg80211_wext_siwap(struct net_device *dev,
|
|
struct sockaddr *ap_addr, char *extra)
|
|
{
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
+ int ret;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_siwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_ibss_wext_siwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_siwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_mgd_wext_siwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_WDS:
|
|
- return cfg80211_wds_wext_siwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_wds_wext_siwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+ mutex_unlock(&rdev->mtx);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_giwap(struct net_device *dev,
|
|
@@ -1384,17 +1471,27 @@ static int cfg80211_wext_giwap(struct net_device *dev,
|
|
struct sockaddr *ap_addr, char *extra)
|
|
{
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
+ int ret;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_giwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_ibss_wext_giwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_giwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_mgd_wext_giwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
case NL80211_IFTYPE_WDS:
|
|
- return cfg80211_wds_wext_giwap(dev, info, ap_addr, extra);
|
|
+ ret = cfg80211_wds_wext_giwap(dev, info, ap_addr, extra);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+ mutex_unlock(&rdev->mtx);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_siwessid(struct net_device *dev,
|
|
@@ -1402,15 +1499,24 @@ static int cfg80211_wext_siwessid(struct net_device *dev,
|
|
struct iw_point *data, char *ssid)
|
|
{
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
+ int ret;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_siwessid(dev, info, data, ssid);
|
|
+ ret = cfg80211_ibss_wext_siwessid(dev, info, data, ssid);
|
|
+ break;
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_siwessid(dev, info, data, ssid);
|
|
+ ret = cfg80211_mgd_wext_siwessid(dev, info, data, ssid);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+ mutex_unlock(&rdev->mtx);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_giwessid(struct net_device *dev,
|
|
@@ -1418,18 +1524,27 @@ static int cfg80211_wext_giwessid(struct net_device *dev,
|
|
struct iw_point *data, char *ssid)
|
|
{
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
+ struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
+ int ret;
|
|
|
|
data->flags = 0;
|
|
data->length = 0;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
switch (wdev->iftype) {
|
|
case NL80211_IFTYPE_ADHOC:
|
|
- return cfg80211_ibss_wext_giwessid(dev, info, data, ssid);
|
|
+ ret = cfg80211_ibss_wext_giwessid(dev, info, data, ssid);
|
|
+ break;
|
|
case NL80211_IFTYPE_STATION:
|
|
- return cfg80211_mgd_wext_giwessid(dev, info, data, ssid);
|
|
+ ret = cfg80211_mgd_wext_giwessid(dev, info, data, ssid);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+ mutex_unlock(&rdev->mtx);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static int cfg80211_wext_siwpmksa(struct net_device *dev,
|
|
@@ -1440,6 +1555,7 @@ static int cfg80211_wext_siwpmksa(struct net_device *dev,
|
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
|
struct cfg80211_pmksa cfg_pmksa;
|
|
struct iw_pmksa *pmksa = (struct iw_pmksa *)extra;
|
|
+ int ret;
|
|
|
|
memset(&cfg_pmksa, 0, sizeof(struct cfg80211_pmksa));
|
|
|
|
@@ -1449,28 +1565,39 @@ static int cfg80211_wext_siwpmksa(struct net_device *dev,
|
|
cfg_pmksa.bssid = pmksa->bssid.sa_data;
|
|
cfg_pmksa.pmkid = pmksa->pmkid;
|
|
|
|
+ mutex_unlock(&rdev->mtx);
|
|
switch (pmksa->cmd) {
|
|
case IW_PMKSA_ADD:
|
|
- if (!rdev->ops->set_pmksa)
|
|
- return -EOPNOTSUPP;
|
|
-
|
|
- return rdev_set_pmksa(rdev, dev, &cfg_pmksa);
|
|
+ if (!rdev->ops->set_pmksa) {
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
+ }
|
|
|
|
+ ret = rdev_set_pmksa(rdev, dev, &cfg_pmksa);
|
|
+ break;
|
|
case IW_PMKSA_REMOVE:
|
|
- if (!rdev->ops->del_pmksa)
|
|
- return -EOPNOTSUPP;
|
|
-
|
|
- return rdev_del_pmksa(rdev, dev, &cfg_pmksa);
|
|
+ if (!rdev->ops->del_pmksa) {
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
+ }
|
|
|
|
+ ret = rdev_del_pmksa(rdev, dev, &cfg_pmksa);
|
|
+ break;
|
|
case IW_PMKSA_FLUSH:
|
|
- if (!rdev->ops->flush_pmksa)
|
|
- return -EOPNOTSUPP;
|
|
-
|
|
- return rdev_flush_pmksa(rdev, dev);
|
|
+ if (!rdev->ops->flush_pmksa) {
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
+ }
|
|
|
|
+ ret = rdev_flush_pmksa(rdev, dev);
|
|
+ break;
|
|
default:
|
|
- return -EOPNOTSUPP;
|
|
+ ret = -EOPNOTSUPP;
|
|
+ break;
|
|
}
|
|
+ mutex_unlock(&rdev->mtx);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
static const iw_handler cfg80211_handlers[] = {
|
|
diff --git a/net/wireless/wext-sme.c b/net/wireless/wext-sme.c
|
|
index c67d7a82ab13..ab4de0a50ad4 100644
|
|
--- a/net/wireless/wext-sme.c
|
|
+++ b/net/wireless/wext-sme.c
|
|
@@ -375,6 +375,7 @@ int cfg80211_wext_siwmlme(struct net_device *dev,
|
|
if (mlme->addr.sa_family != ARPHRD_ETHER)
|
|
return -EINVAL;
|
|
|
|
+ mutex_lock(&rdev->mtx);
|
|
wdev_lock(wdev);
|
|
switch (mlme->cmd) {
|
|
case IW_MLME_DEAUTH:
|
|
@@ -386,6 +387,7 @@ int cfg80211_wext_siwmlme(struct net_device *dev,
|
|
break;
|
|
}
|
|
wdev_unlock(wdev);
|
|
+ mutex_unlock(&rdev->mtx);
|
|
|
|
return err;
|
|
}
|