diff options
Diffstat (limited to 'net/mac80211/wext.c')
-rw-r--r-- | net/mac80211/wext.c | 65 |
1 files changed, 47 insertions, 18 deletions
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index 736c32e340f2..34fa8ed1e784 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
@@ -296,15 +296,7 @@ static int ieee80211_ioctl_siwmode(struct net_device *dev, | |||
296 | return -EINVAL; | 296 | return -EINVAL; |
297 | } | 297 | } |
298 | 298 | ||
299 | if (type == sdata->vif.type) | 299 | return ieee80211_if_change_type(sdata, type); |
300 | return 0; | ||
301 | if (netif_running(dev)) | ||
302 | return -EBUSY; | ||
303 | |||
304 | ieee80211_if_reinit(dev); | ||
305 | ieee80211_if_set_type(dev, type); | ||
306 | |||
307 | return 0; | ||
308 | } | 300 | } |
309 | 301 | ||
310 | 302 | ||
@@ -452,7 +444,7 @@ static int ieee80211_ioctl_siwessid(struct net_device *dev, | |||
452 | memset(sdata->u.ap.ssid + len, 0, | 444 | memset(sdata->u.ap.ssid + len, 0, |
453 | IEEE80211_MAX_SSID_LEN - len); | 445 | IEEE80211_MAX_SSID_LEN - len); |
454 | sdata->u.ap.ssid_len = len; | 446 | sdata->u.ap.ssid_len = len; |
455 | return ieee80211_if_config(dev); | 447 | return ieee80211_if_config(sdata, IEEE80211_IFCC_SSID); |
456 | } | 448 | } |
457 | return -EOPNOTSUPP; | 449 | return -EOPNOTSUPP; |
458 | } | 450 | } |
@@ -627,16 +619,14 @@ static int ieee80211_ioctl_siwrate(struct net_device *dev, | |||
627 | struct ieee80211_supported_band *sband; | 619 | struct ieee80211_supported_band *sband; |
628 | 620 | ||
629 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 621 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
630 | if (!sdata->bss) | ||
631 | return -ENODEV; | ||
632 | 622 | ||
633 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; | 623 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; |
634 | 624 | ||
635 | /* target_rate = -1, rate->fixed = 0 means auto only, so use all rates | 625 | /* target_rate = -1, rate->fixed = 0 means auto only, so use all rates |
636 | * target_rate = X, rate->fixed = 1 means only rate X | 626 | * target_rate = X, rate->fixed = 1 means only rate X |
637 | * target_rate = X, rate->fixed = 0 means all rates <= X */ | 627 | * target_rate = X, rate->fixed = 0 means all rates <= X */ |
638 | sdata->bss->max_ratectrl_rateidx = -1; | 628 | sdata->max_ratectrl_rateidx = -1; |
639 | sdata->bss->force_unicast_rateidx = -1; | 629 | sdata->force_unicast_rateidx = -1; |
640 | if (rate->value < 0) | 630 | if (rate->value < 0) |
641 | return 0; | 631 | return 0; |
642 | 632 | ||
@@ -645,9 +635,9 @@ static int ieee80211_ioctl_siwrate(struct net_device *dev, | |||
645 | int this_rate = brate->bitrate; | 635 | int this_rate = brate->bitrate; |
646 | 636 | ||
647 | if (target_rate == this_rate) { | 637 | if (target_rate == this_rate) { |
648 | sdata->bss->max_ratectrl_rateidx = i; | 638 | sdata->max_ratectrl_rateidx = i; |
649 | if (rate->fixed) | 639 | if (rate->fixed) |
650 | sdata->bss->force_unicast_rateidx = i; | 640 | sdata->force_unicast_rateidx = i; |
651 | err = 0; | 641 | err = 0; |
652 | break; | 642 | break; |
653 | } | 643 | } |
@@ -1009,6 +999,45 @@ static int ieee80211_ioctl_giwencode(struct net_device *dev, | |||
1009 | return 0; | 999 | return 0; |
1010 | } | 1000 | } |
1011 | 1001 | ||
1002 | static int ieee80211_ioctl_siwpower(struct net_device *dev, | ||
1003 | struct iw_request_info *info, | ||
1004 | struct iw_param *wrq, | ||
1005 | char *extra) | ||
1006 | { | ||
1007 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
1008 | struct ieee80211_conf *conf = &local->hw.conf; | ||
1009 | |||
1010 | if (wrq->disabled) { | ||
1011 | conf->flags &= ~IEEE80211_CONF_PS; | ||
1012 | return ieee80211_hw_config(local); | ||
1013 | } | ||
1014 | |||
1015 | switch (wrq->flags & IW_POWER_MODE) { | ||
1016 | case IW_POWER_ON: /* If not specified */ | ||
1017 | case IW_POWER_MODE: /* If set all mask */ | ||
1018 | case IW_POWER_ALL_R: /* If explicitely state all */ | ||
1019 | conf->flags |= IEEE80211_CONF_PS; | ||
1020 | break; | ||
1021 | default: /* Otherwise we don't support it */ | ||
1022 | return -EINVAL; | ||
1023 | } | ||
1024 | |||
1025 | return ieee80211_hw_config(local); | ||
1026 | } | ||
1027 | |||
1028 | static int ieee80211_ioctl_giwpower(struct net_device *dev, | ||
1029 | struct iw_request_info *info, | ||
1030 | union iwreq_data *wrqu, | ||
1031 | char *extra) | ||
1032 | { | ||
1033 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
1034 | struct ieee80211_conf *conf = &local->hw.conf; | ||
1035 | |||
1036 | wrqu->power.disabled = !(conf->flags & IEEE80211_CONF_PS); | ||
1037 | |||
1038 | return 0; | ||
1039 | } | ||
1040 | |||
1012 | static int ieee80211_ioctl_siwauth(struct net_device *dev, | 1041 | static int ieee80211_ioctl_siwauth(struct net_device *dev, |
1013 | struct iw_request_info *info, | 1042 | struct iw_request_info *info, |
1014 | struct iw_param *data, char *extra) | 1043 | struct iw_param *data, char *extra) |
@@ -1211,8 +1240,8 @@ static const iw_handler ieee80211_handler[] = | |||
1211 | (iw_handler) ieee80211_ioctl_giwretry, /* SIOCGIWRETRY */ | 1240 | (iw_handler) ieee80211_ioctl_giwretry, /* SIOCGIWRETRY */ |
1212 | (iw_handler) ieee80211_ioctl_siwencode, /* SIOCSIWENCODE */ | 1241 | (iw_handler) ieee80211_ioctl_siwencode, /* SIOCSIWENCODE */ |
1213 | (iw_handler) ieee80211_ioctl_giwencode, /* SIOCGIWENCODE */ | 1242 | (iw_handler) ieee80211_ioctl_giwencode, /* SIOCGIWENCODE */ |
1214 | (iw_handler) NULL, /* SIOCSIWPOWER */ | 1243 | (iw_handler) ieee80211_ioctl_siwpower, /* SIOCSIWPOWER */ |
1215 | (iw_handler) NULL, /* SIOCGIWPOWER */ | 1244 | (iw_handler) ieee80211_ioctl_giwpower, /* SIOCGIWPOWER */ |
1216 | (iw_handler) NULL, /* -- hole -- */ | 1245 | (iw_handler) NULL, /* -- hole -- */ |
1217 | (iw_handler) NULL, /* -- hole -- */ | 1246 | (iw_handler) NULL, /* -- hole -- */ |
1218 | (iw_handler) ieee80211_ioctl_siwgenie, /* SIOCSIWGENIE */ | 1247 | (iw_handler) ieee80211_ioctl_siwgenie, /* SIOCSIWGENIE */ |