aboutsummaryrefslogtreecommitdiff
path: root/sys/net80211/ieee80211_ioctl.c
diff options
context:
space:
mode:
authorSam Leffler <sam@FreeBSD.org>2008-09-21 23:59:14 +0000
committerSam Leffler <sam@FreeBSD.org>2008-09-21 23:59:14 +0000
commit8c070d69c7c7db965c463c883f773bf663af2134 (patch)
tree7bd20b90da680e15e9b19b05542ecd4a6abe71ad /sys/net80211/ieee80211_ioctl.c
parentfdabd982e796b1878f4349ff34bc061c59dca5fd (diff)
downloadsrc-8c070d69c7c7db965c463c883f773bf663af2134.tar.gz
src-8c070d69c7c7db965c463c883f773bf663af2134.zip
MIMO power save support; still needs callbacks for notifying drivers
of dynamic state change in station mode.
Notes
Notes: svn path=/head/; revision=183255
Diffstat (limited to 'sys/net80211/ieee80211_ioctl.c')
-rw-r--r--sys/net80211/ieee80211_ioctl.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/sys/net80211/ieee80211_ioctl.c b/sys/net80211/ieee80211_ioctl.c
index 3d2697cdd401..8bfcdb835f76 100644
--- a/sys/net80211/ieee80211_ioctl.c
+++ b/sys/net80211/ieee80211_ioctl.c
@@ -1068,6 +1068,18 @@ ieee80211_ioctl_get80211(struct ieee80211vap *vap, u_long cmd,
case IEEE80211_IOC_STA_VLAN:
error = ieee80211_ioctl_getstavlan(vap, ireq);
break;
+ case IEEE80211_IOC_SMPS:
+ if (vap->iv_opmode == IEEE80211_M_STA &&
+ vap->iv_state == IEEE80211_S_RUN) {
+ if (vap->iv_bss->ni_flags & IEEE80211_NODE_MIMO_RTS)
+ ireq->i_val = IEEE80211_HTCAP_SMPS_DYNAMIC;
+ else if (vap->iv_bss->ni_flags & IEEE80211_NODE_MIMO_PS)
+ ireq->i_val = IEEE80211_HTCAP_SMPS_ENA;
+ else
+ ireq->i_val = IEEE80211_HTCAP_SMPS_OFF;
+ } else
+ ireq->i_val = vap->iv_htcaps & IEEE80211_HTCAP_SMPS;
+ break;
default:
error = EINVAL;
break;
@@ -3068,6 +3080,19 @@ ieee80211_ioctl_set80211(struct ieee80211vap *vap, u_long cmd, struct ieee80211r
case IEEE80211_IOC_STA_VLAN:
error = ieee80211_ioctl_setstavlan(vap, ireq);
break;
+ case IEEE80211_IOC_SMPS:
+ if ((ireq->i_val &~ IEEE80211_HTCAP_SMPS) != 0 ||
+ ireq->i_val == 0x0008) /* value of 2 is reserved */
+ return EINVAL;
+ if (ireq->i_val != IEEE80211_HTCAP_SMPS_OFF &&
+ (vap->iv_htcaps & IEEE80211_HTC_SMPS) == 0)
+ return EOPNOTSUPP;
+ vap->iv_htcaps = (vap->iv_htcaps &~ IEEE80211_HTCAP_SMPS) |
+ ireq->i_val;
+ /* NB: if not operating in 11n this can wait */
+ if (isvapht(vap))
+ error = ERESTART;
+ break;
default:
error = EINVAL;
break;