|
@@ -290,14 +290,22 @@ static int ieee80211_ioctl_giwmode(struct net_device *dev,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-int ieee80211_set_freq(struct ieee80211_local *local, int freqMHz)
|
|
|
|
|
|
+int ieee80211_set_freq(struct net_device *dev, int freqMHz)
|
|
{
|
|
{
|
|
int ret = -EINVAL;
|
|
int ret = -EINVAL;
|
|
struct ieee80211_channel *chan;
|
|
struct ieee80211_channel *chan;
|
|
|
|
+ struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
|
|
|
|
+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
|
|
|
|
|
chan = ieee80211_get_channel(local->hw.wiphy, freqMHz);
|
|
chan = ieee80211_get_channel(local->hw.wiphy, freqMHz);
|
|
|
|
|
|
if (chan && !(chan->flags & IEEE80211_CHAN_DISABLED)) {
|
|
if (chan && !(chan->flags & IEEE80211_CHAN_DISABLED)) {
|
|
|
|
+ if (sdata->vif.type == IEEE80211_IF_TYPE_IBSS &&
|
|
|
|
+ chan->flags & IEEE80211_CHAN_NO_IBSS) {
|
|
|
|
+ printk(KERN_DEBUG "%s: IBSS not allowed on frequency "
|
|
|
|
+ "%d MHz\n", dev->name, chan->center_freq);
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
local->oper_channel = chan;
|
|
local->oper_channel = chan;
|
|
|
|
|
|
if (local->sta_sw_scanning || local->sta_hw_scanning)
|
|
if (local->sta_sw_scanning || local->sta_hw_scanning)
|
|
@@ -315,7 +323,6 @@ static int ieee80211_ioctl_siwfreq(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_request_info *info,
|
|
struct iw_freq *freq, char *extra)
|
|
struct iw_freq *freq, char *extra)
|
|
{
|
|
{
|
|
- struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
|
|
|
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
|
|
|
|
|
if (sdata->vif.type == IEEE80211_IF_TYPE_STA)
|
|
if (sdata->vif.type == IEEE80211_IF_TYPE_STA)
|
|
@@ -329,14 +336,14 @@ static int ieee80211_ioctl_siwfreq(struct net_device *dev,
|
|
IEEE80211_STA_AUTO_CHANNEL_SEL;
|
|
IEEE80211_STA_AUTO_CHANNEL_SEL;
|
|
return 0;
|
|
return 0;
|
|
} else
|
|
} else
|
|
- return ieee80211_set_freq(local,
|
|
|
|
|
|
+ return ieee80211_set_freq(dev,
|
|
ieee80211_channel_to_frequency(freq->m));
|
|
ieee80211_channel_to_frequency(freq->m));
|
|
} else {
|
|
} else {
|
|
int i, div = 1000000;
|
|
int i, div = 1000000;
|
|
for (i = 0; i < freq->e; i++)
|
|
for (i = 0; i < freq->e; i++)
|
|
div /= 10;
|
|
div /= 10;
|
|
if (div > 0)
|
|
if (div > 0)
|
|
- return ieee80211_set_freq(local, freq->m / div);
|
|
|
|
|
|
+ return ieee80211_set_freq(dev, freq->m / div);
|
|
else
|
|
else
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|