* @crypto: crypto settings
  * @privacy: the BSS uses privacy
  * @auth_type: Authentication type (algorithm)
+ * @smps_mode: SMPS mode
  * @inactivity_timeout: time in seconds to determine station's inactivity.
  * @p2p_ctwindow: P2P CT Window
  * @p2p_opp_ps: P2P opportunistic PS
        struct cfg80211_crypto_settings crypto;
        bool privacy;
        enum nl80211_auth_type auth_type;
+       enum nl80211_smps_mode smps_mode;
        int inactivity_timeout;
        u8 p2p_ctwindow;
        bool p2p_opp_ps;
 
  * @NL80211_ATTR_ADMITTED_TIME: admitted time in units of 32 microseconds
  *     (per second) (u16 attribute)
  *
+ * @NL80211_ATTR_SMPS_MODE: SMPS mode to use (ap mode). see
+ *     &enum nl80211_smps_mode.
+ *
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
  */
        NL80211_ATTR_USER_PRIO,
        NL80211_ATTR_ADMITTED_TIME,
 
+       NL80211_ATTR_SMPS_MODE,
+
        /* add attributes here, update the policy in nl80211.c */
 
        __NL80211_ATTR_AFTER_LAST,
  * @NL80211_FEATURE_ACKTO_ESTIMATION: This driver supports dynamic ACK timeout
  *     estimation (dynack). %NL80211_ATTR_WIPHY_DYN_ACK flag attribute is used
  *     to enable dynack.
+ * @NL80211_FEATURE_STATIC_SMPS: Device supports static spatial
+ *     multiplexing powersave, ie. can turn off all but one chain
+ *     even on HT connections that should be using more chains.
+ * @NL80211_FEATURE_DYNAMIC_SMPS: Device supports dynamic spatial
+ *     multiplexing powersave, ie. can turn off all but one chain
+ *     and then wake the rest up as required after, for example,
+ *     rts/cts handshake.
  */
 enum nl80211_feature_flags {
        NL80211_FEATURE_SK_TX_STATUS                    = 1 << 0,
        NL80211_FEATURE_QUIET                           = 1 << 21,
        NL80211_FEATURE_TX_POWER_INSERTION              = 1 << 22,
        NL80211_FEATURE_ACKTO_ESTIMATION                = 1 << 23,
+       NL80211_FEATURE_STATIC_SMPS                     = 1 << 24,
+       NL80211_FEATURE_DYNAMIC_SMPS                    = 1 << 25,
 };
 
 /**
        NL80211_ACL_POLICY_DENY_UNLESS_LISTED,
 };
 
+/**
+ * enum nl80211_smps_mode - SMPS mode
+ *
+ * Requested SMPS mode (for AP mode)
+ *
+ * @NL80211_SMPS_OFF: SMPS off (use all antennas).
+ * @NL80211_SMPS_STATIC: static SMPS (use a single antenna)
+ * @NL80211_SMPS_DYNAMIC: dynamic smps (start with a single antenna and
+ *     turn on other antennas after CTS/RTS).
+ */
+enum nl80211_smps_mode {
+       NL80211_SMPS_OFF,
+       NL80211_SMPS_STATIC,
+       NL80211_SMPS_DYNAMIC,
+
+       __NL80211_SMPS_AFTER_LAST,
+       NL80211_SMPS_MAX = __NL80211_SMPS_AFTER_LAST - 1
+};
+
 /**
  * enum nl80211_radar_event - type of radar event for DFS operation
  *
 
        [NL80211_ATTR_TSID] = { .type = NLA_U8 },
        [NL80211_ATTR_USER_PRIO] = { .type = NLA_U8 },
        [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 },
+       [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 },
 };
 
 /* policy for the key attributes */
                        return PTR_ERR(params.acl);
        }
 
+       if (info->attrs[NL80211_ATTR_SMPS_MODE]) {
+               params.smps_mode =
+                       nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]);
+               switch (params.smps_mode) {
+               case NL80211_SMPS_OFF:
+                       break;
+               case NL80211_SMPS_STATIC:
+                       if (!(rdev->wiphy.features &
+                             NL80211_FEATURE_STATIC_SMPS))
+                               return -EINVAL;
+                       break;
+               case NL80211_SMPS_DYNAMIC:
+                       if (!(rdev->wiphy.features &
+                             NL80211_FEATURE_DYNAMIC_SMPS))
+                               return -EINVAL;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       } else {
+               params.smps_mode = NL80211_SMPS_OFF;
+       }
+
        wdev_lock(wdev);
        err = rdev_start_ap(rdev, dev, ¶ms);
        if (!err) {