diff mbox series

[v2,1/2] mac80211: Add VHT MU-MIMO related flags in ieee80211_bss_conf

Message ID 1657058586-4621-1-git-send-email-quic_msinada@quicinc.com
State New
Headers show
Series [v2,1/2] mac80211: Add VHT MU-MIMO related flags in ieee80211_bss_conf | expand

Commit Message

Muna Sinada July 5, 2022, 10:03 p.m. UTC
Adding flags for SU Beamformer, SU Beamformee, MU Beamformer and
MU Beamformee for VHT. This is utilized to pass MU-MIMO
configurations from user space to driver.

Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
---
 include/net/mac80211.h |  8 ++++++++
 net/mac80211/cfg.c     | 15 +++++++++++++++
 2 files changed, 23 insertions(+)

Comments

kernel test robot July 6, 2022, 3:27 a.m. UTC | #1
Hi Muna,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on wireless/main]
[also build test ERROR on linus/master v5.19-rc5]
[cannot apply to wireless-next/main next-20220705]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Muna-Sinada/mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee80211_bss_conf/20220706-060509
base:   https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless.git main
config: hexagon-randconfig-r045-20220703 (https://download.01.org/0day-ci/archive/20220706/202207061106.QWMt1tGm-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project f553287b588916de09c66e3e32bf75e5060f967f)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/d0909fa7d00b2857a0b258722221e1e94ba9c05e
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Muna-Sinada/mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee80211_bss_conf/20220706-060509
        git checkout d0909fa7d00b2857a0b258722221e1e94ba9c05e
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash net/mac80211/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> net/mac80211/cfg.c:1169:13: error: use of undeclared identifier 'ap_vht_cap'
                          !!(ap_vht_cap->vht_cap_info &
                             ^
   net/mac80211/cfg.c:1172:13: error: use of undeclared identifier 'ap_vht_cap'
                          !!(ap_vht_cap->vht_cap_info &
                             ^
   net/mac80211/cfg.c:1175:13: error: use of undeclared identifier 'ap_vht_cap'
                          !!(ap_vht_cap->vht_cap_info &
                             ^
   net/mac80211/cfg.c:1178:13: error: use of undeclared identifier 'ap_vht_cap'
                          !!(ap_vht_cap->vht_cap_info &
                             ^
   4 errors generated.


vim +/ap_vht_cap +1169 net/mac80211/cfg.c

  1135	
  1136	static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
  1137				      struct cfg80211_ap_settings *params)
  1138	{
  1139		struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  1140		struct ieee80211_local *local = sdata->local;
  1141		struct beacon_data *old;
  1142		struct ieee80211_sub_if_data *vlan;
  1143		u32 changed = BSS_CHANGED_BEACON_INT |
  1144			      BSS_CHANGED_BEACON_ENABLED |
  1145			      BSS_CHANGED_BEACON |
  1146			      BSS_CHANGED_SSID |
  1147			      BSS_CHANGED_P2P_PS |
  1148			      BSS_CHANGED_TXPOWER |
  1149			      BSS_CHANGED_TWT;
  1150		int i, err;
  1151		int prev_beacon_int;
  1152	
  1153		old = sdata_dereference(sdata->u.ap.beacon, sdata);
  1154		if (old)
  1155			return -EALREADY;
  1156	
  1157		if (params->smps_mode != NL80211_SMPS_OFF)
  1158			return -ENOTSUPP;
  1159	
  1160		sdata->smps_mode = IEEE80211_SMPS_OFF;
  1161	
  1162		sdata->needed_rx_chains = sdata->local->rx_chains;
  1163	
  1164		prev_beacon_int = sdata->vif.bss_conf.beacon_int;
  1165		sdata->vif.bss_conf.beacon_int = params->beacon_interval;
  1166	
  1167		if (params->vht_cap) {
  1168			sdata->vif.bss_conf.vht_su_beamformer =
> 1169			       !!(ap_vht_cap->vht_cap_info &
  1170				  cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
  1171			sdata->vif.bss_conf.vht_su_beamformee =
  1172			       !!(ap_vht_cap->vht_cap_info &
  1173				  cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
  1174			sdata->vif.bss_conf.vht_mu_beamformer =
  1175			       !!(ap_vht_cap->vht_cap_info &
  1176				  cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE));
  1177			sdata->vif.bss_conf.vht_mu_beamformee =
  1178			       !!(ap_vht_cap->vht_cap_info &
  1179				  cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE));
  1180		}
  1181	
  1182		if (params->he_cap && params->he_oper) {
  1183			sdata->vif.bss_conf.he_support = true;
  1184			sdata->vif.bss_conf.htc_trig_based_pkt_ext =
  1185				le32_get_bits(params->he_oper->he_oper_params,
  1186				      IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK);
  1187			sdata->vif.bss_conf.frame_time_rts_th =
  1188				le32_get_bits(params->he_oper->he_oper_params,
  1189				      IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK);
  1190			changed |= BSS_CHANGED_HE_OBSS_PD;
  1191	
  1192			if (params->beacon.he_bss_color.enabled)
  1193				changed |= BSS_CHANGED_HE_BSS_COLOR;
  1194		}
  1195	
  1196		if (sdata->vif.type == NL80211_IFTYPE_AP &&
  1197		    params->mbssid_config.tx_wdev) {
  1198			err = ieee80211_set_ap_mbssid_options(sdata,
  1199							      params->mbssid_config);
  1200			if (err)
  1201				return err;
  1202		}
  1203	
  1204		mutex_lock(&local->mtx);
  1205		err = ieee80211_vif_use_channel(sdata, &params->chandef,
  1206						IEEE80211_CHANCTX_SHARED);
  1207		if (!err)
  1208			ieee80211_vif_copy_chanctx_to_vlans(sdata, false);
  1209		mutex_unlock(&local->mtx);
  1210		if (err) {
  1211			sdata->vif.bss_conf.beacon_int = prev_beacon_int;
  1212			return err;
  1213		}
  1214	
  1215		/*
  1216		 * Apply control port protocol, this allows us to
  1217		 * not encrypt dynamic WEP control frames.
  1218		 */
  1219		sdata->control_port_protocol = params->crypto.control_port_ethertype;
  1220		sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt;
  1221		sdata->control_port_over_nl80211 =
  1222					params->crypto.control_port_over_nl80211;
  1223		sdata->control_port_no_preauth =
  1224					params->crypto.control_port_no_preauth;
  1225		sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local,
  1226								&params->crypto,
  1227								sdata->vif.type);
  1228	
  1229		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) {
  1230			vlan->control_port_protocol =
  1231				params->crypto.control_port_ethertype;
  1232			vlan->control_port_no_encrypt =
  1233				params->crypto.control_port_no_encrypt;
  1234			vlan->control_port_over_nl80211 =
  1235				params->crypto.control_port_over_nl80211;
  1236			vlan->control_port_no_preauth =
  1237				params->crypto.control_port_no_preauth;
  1238			vlan->encrypt_headroom =
  1239				ieee80211_cs_headroom(sdata->local,
  1240						      &params->crypto,
  1241						      vlan->vif.type);
  1242		}
  1243	
  1244		sdata->vif.bss_conf.dtim_period = params->dtim_period;
  1245		sdata->vif.bss_conf.enable_beacon = true;
  1246		sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
  1247		sdata->vif.bss_conf.twt_responder = params->twt_responder;
  1248		sdata->vif.bss_conf.he_obss_pd = params->he_obss_pd;
  1249		sdata->vif.bss_conf.he_bss_color = params->beacon.he_bss_color;
  1250		sdata->vif.bss_conf.s1g = params->chandef.chan->band ==
  1251					  NL80211_BAND_S1GHZ;
  1252	
  1253		sdata->vif.bss_conf.ssid_len = params->ssid_len;
  1254		if (params->ssid_len)
  1255			memcpy(sdata->vif.bss_conf.ssid, params->ssid,
  1256			       params->ssid_len);
  1257		sdata->vif.bss_conf.hidden_ssid =
  1258			(params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE);
  1259	
  1260		memset(&sdata->vif.bss_conf.p2p_noa_attr, 0,
  1261		       sizeof(sdata->vif.bss_conf.p2p_noa_attr));
  1262		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow =
  1263			params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
  1264		if (params->p2p_opp_ps)
  1265			sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
  1266						IEEE80211_P2P_OPPPS_ENABLE_BIT;
  1267	
  1268		sdata->beacon_rate_set = false;
  1269		if (wiphy_ext_feature_isset(local->hw.wiphy,
  1270					    NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) {
  1271			for (i = 0; i < NUM_NL80211_BANDS; i++) {
  1272				sdata->beacon_rateidx_mask[i] =
  1273					params->beacon_rate.control[i].legacy;
  1274				if (sdata->beacon_rateidx_mask[i])
  1275					sdata->beacon_rate_set = true;
  1276			}
  1277		}
  1278	
  1279		if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
  1280			sdata->vif.bss_conf.beacon_tx_rate = params->beacon_rate;
  1281	
  1282		err = ieee80211_assign_beacon(sdata, &params->beacon, NULL, NULL);
  1283		if (err < 0)
  1284			goto error;
  1285		changed |= err;
  1286	
  1287		if (params->fils_discovery.max_interval) {
  1288			err = ieee80211_set_fils_discovery(sdata,
  1289							   &params->fils_discovery);
  1290			if (err < 0)
  1291				goto error;
  1292			changed |= BSS_CHANGED_FILS_DISCOVERY;
  1293		}
  1294	
  1295		if (params->unsol_bcast_probe_resp.interval) {
  1296			err = ieee80211_set_unsol_bcast_probe_resp(sdata,
  1297								   &params->unsol_bcast_probe_resp);
  1298			if (err < 0)
  1299				goto error;
  1300			changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
  1301		}
  1302	
  1303		err = drv_start_ap(sdata->local, sdata);
  1304		if (err) {
  1305			old = sdata_dereference(sdata->u.ap.beacon, sdata);
  1306	
  1307			if (old)
  1308				kfree_rcu(old, rcu_head);
  1309			RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
  1310			goto error;
  1311		}
  1312	
  1313		ieee80211_recalc_dtim(local, sdata);
  1314		ieee80211_bss_info_change_notify(sdata, changed);
  1315	
  1316		netif_carrier_on(dev);
  1317		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
  1318			netif_carrier_on(vlan->dev);
  1319	
  1320		return 0;
  1321	
  1322	error:
  1323		mutex_lock(&local->mtx);
  1324		ieee80211_vif_release_channel(sdata);
  1325		mutex_unlock(&local->mtx);
  1326	
  1327		return err;
  1328	}
  1329
kernel test robot July 6, 2022, 5:38 a.m. UTC | #2
Hi Muna,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on wireless/main]
[also build test ERROR on linus/master v5.19-rc5]
[cannot apply to wireless-next/main next-20220705]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Muna-Sinada/mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee80211_bss_conf/20220706-060509
base:   https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless.git main
config: i386-randconfig-a005
compiler: gcc-11 (Debian 11.3.0-3) 11.3.0
reproduce (this is a W=1 build):
        # https://github.com/intel-lab-lkp/linux/commit/d0909fa7d00b2857a0b258722221e1e94ba9c05e
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Muna-Sinada/mac80211-Add-VHT-MU-MIMO-related-flags-in-ieee80211_bss_conf/20220706-060509
        git checkout d0909fa7d00b2857a0b258722221e1e94ba9c05e
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash net/mac80211/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   net/mac80211/cfg.c: In function 'ieee80211_start_ap':
>> net/mac80211/cfg.c:1169:27: error: 'ap_vht_cap' undeclared (first use in this function)
    1169 |                        !!(ap_vht_cap->vht_cap_info &
         |                           ^~~~~~~~~~
   net/mac80211/cfg.c:1169:27: note: each undeclared identifier is reported only once for each function it appears in


vim +/ap_vht_cap +1169 net/mac80211/cfg.c

  1135	
  1136	static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
  1137				      struct cfg80211_ap_settings *params)
  1138	{
  1139		struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  1140		struct ieee80211_local *local = sdata->local;
  1141		struct beacon_data *old;
  1142		struct ieee80211_sub_if_data *vlan;
  1143		u32 changed = BSS_CHANGED_BEACON_INT |
  1144			      BSS_CHANGED_BEACON_ENABLED |
  1145			      BSS_CHANGED_BEACON |
  1146			      BSS_CHANGED_SSID |
  1147			      BSS_CHANGED_P2P_PS |
  1148			      BSS_CHANGED_TXPOWER |
  1149			      BSS_CHANGED_TWT;
  1150		int i, err;
  1151		int prev_beacon_int;
  1152	
  1153		old = sdata_dereference(sdata->u.ap.beacon, sdata);
  1154		if (old)
  1155			return -EALREADY;
  1156	
  1157		if (params->smps_mode != NL80211_SMPS_OFF)
  1158			return -ENOTSUPP;
  1159	
  1160		sdata->smps_mode = IEEE80211_SMPS_OFF;
  1161	
  1162		sdata->needed_rx_chains = sdata->local->rx_chains;
  1163	
  1164		prev_beacon_int = sdata->vif.bss_conf.beacon_int;
  1165		sdata->vif.bss_conf.beacon_int = params->beacon_interval;
  1166	
  1167		if (params->vht_cap) {
  1168			sdata->vif.bss_conf.vht_su_beamformer =
> 1169			       !!(ap_vht_cap->vht_cap_info &
  1170				  cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
  1171			sdata->vif.bss_conf.vht_su_beamformee =
  1172			       !!(ap_vht_cap->vht_cap_info &
  1173				  cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
  1174			sdata->vif.bss_conf.vht_mu_beamformer =
  1175			       !!(ap_vht_cap->vht_cap_info &
  1176				  cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE));
  1177			sdata->vif.bss_conf.vht_mu_beamformee =
  1178			       !!(ap_vht_cap->vht_cap_info &
  1179				  cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE));
  1180		}
  1181	
  1182		if (params->he_cap && params->he_oper) {
  1183			sdata->vif.bss_conf.he_support = true;
  1184			sdata->vif.bss_conf.htc_trig_based_pkt_ext =
  1185				le32_get_bits(params->he_oper->he_oper_params,
  1186				      IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK);
  1187			sdata->vif.bss_conf.frame_time_rts_th =
  1188				le32_get_bits(params->he_oper->he_oper_params,
  1189				      IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK);
  1190			changed |= BSS_CHANGED_HE_OBSS_PD;
  1191	
  1192			if (params->beacon.he_bss_color.enabled)
  1193				changed |= BSS_CHANGED_HE_BSS_COLOR;
  1194		}
  1195	
  1196		if (sdata->vif.type == NL80211_IFTYPE_AP &&
  1197		    params->mbssid_config.tx_wdev) {
  1198			err = ieee80211_set_ap_mbssid_options(sdata,
  1199							      params->mbssid_config);
  1200			if (err)
  1201				return err;
  1202		}
  1203	
  1204		mutex_lock(&local->mtx);
  1205		err = ieee80211_vif_use_channel(sdata, &params->chandef,
  1206						IEEE80211_CHANCTX_SHARED);
  1207		if (!err)
  1208			ieee80211_vif_copy_chanctx_to_vlans(sdata, false);
  1209		mutex_unlock(&local->mtx);
  1210		if (err) {
  1211			sdata->vif.bss_conf.beacon_int = prev_beacon_int;
  1212			return err;
  1213		}
  1214	
  1215		/*
  1216		 * Apply control port protocol, this allows us to
  1217		 * not encrypt dynamic WEP control frames.
  1218		 */
  1219		sdata->control_port_protocol = params->crypto.control_port_ethertype;
  1220		sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt;
  1221		sdata->control_port_over_nl80211 =
  1222					params->crypto.control_port_over_nl80211;
  1223		sdata->control_port_no_preauth =
  1224					params->crypto.control_port_no_preauth;
  1225		sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local,
  1226								&params->crypto,
  1227								sdata->vif.type);
  1228	
  1229		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) {
  1230			vlan->control_port_protocol =
  1231				params->crypto.control_port_ethertype;
  1232			vlan->control_port_no_encrypt =
  1233				params->crypto.control_port_no_encrypt;
  1234			vlan->control_port_over_nl80211 =
  1235				params->crypto.control_port_over_nl80211;
  1236			vlan->control_port_no_preauth =
  1237				params->crypto.control_port_no_preauth;
  1238			vlan->encrypt_headroom =
  1239				ieee80211_cs_headroom(sdata->local,
  1240						      &params->crypto,
  1241						      vlan->vif.type);
  1242		}
  1243	
  1244		sdata->vif.bss_conf.dtim_period = params->dtim_period;
  1245		sdata->vif.bss_conf.enable_beacon = true;
  1246		sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
  1247		sdata->vif.bss_conf.twt_responder = params->twt_responder;
  1248		sdata->vif.bss_conf.he_obss_pd = params->he_obss_pd;
  1249		sdata->vif.bss_conf.he_bss_color = params->beacon.he_bss_color;
  1250		sdata->vif.bss_conf.s1g = params->chandef.chan->band ==
  1251					  NL80211_BAND_S1GHZ;
  1252	
  1253		sdata->vif.bss_conf.ssid_len = params->ssid_len;
  1254		if (params->ssid_len)
  1255			memcpy(sdata->vif.bss_conf.ssid, params->ssid,
  1256			       params->ssid_len);
  1257		sdata->vif.bss_conf.hidden_ssid =
  1258			(params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE);
  1259	
  1260		memset(&sdata->vif.bss_conf.p2p_noa_attr, 0,
  1261		       sizeof(sdata->vif.bss_conf.p2p_noa_attr));
  1262		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow =
  1263			params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
  1264		if (params->p2p_opp_ps)
  1265			sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
  1266						IEEE80211_P2P_OPPPS_ENABLE_BIT;
  1267	
  1268		sdata->beacon_rate_set = false;
  1269		if (wiphy_ext_feature_isset(local->hw.wiphy,
  1270					    NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) {
  1271			for (i = 0; i < NUM_NL80211_BANDS; i++) {
  1272				sdata->beacon_rateidx_mask[i] =
  1273					params->beacon_rate.control[i].legacy;
  1274				if (sdata->beacon_rateidx_mask[i])
  1275					sdata->beacon_rate_set = true;
  1276			}
  1277		}
  1278	
  1279		if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
  1280			sdata->vif.bss_conf.beacon_tx_rate = params->beacon_rate;
  1281	
  1282		err = ieee80211_assign_beacon(sdata, &params->beacon, NULL, NULL);
  1283		if (err < 0)
  1284			goto error;
  1285		changed |= err;
  1286	
  1287		if (params->fils_discovery.max_interval) {
  1288			err = ieee80211_set_fils_discovery(sdata,
  1289							   &params->fils_discovery);
  1290			if (err < 0)
  1291				goto error;
  1292			changed |= BSS_CHANGED_FILS_DISCOVERY;
  1293		}
  1294	
  1295		if (params->unsol_bcast_probe_resp.interval) {
  1296			err = ieee80211_set_unsol_bcast_probe_resp(sdata,
  1297								   &params->unsol_bcast_probe_resp);
  1298			if (err < 0)
  1299				goto error;
  1300			changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
  1301		}
  1302	
  1303		err = drv_start_ap(sdata->local, sdata);
  1304		if (err) {
  1305			old = sdata_dereference(sdata->u.ap.beacon, sdata);
  1306	
  1307			if (old)
  1308				kfree_rcu(old, rcu_head);
  1309			RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
  1310			goto error;
  1311		}
  1312	
  1313		ieee80211_recalc_dtim(local, sdata);
  1314		ieee80211_bss_info_change_notify(sdata, changed);
  1315	
  1316		netif_carrier_on(dev);
  1317		list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
  1318			netif_carrier_on(vlan->dev);
  1319	
  1320		return 0;
  1321	
  1322	error:
  1323		mutex_lock(&local->mtx);
  1324		ieee80211_vif_release_channel(sdata);
  1325		mutex_unlock(&local->mtx);
  1326	
  1327		return err;
  1328	}
  1329
diff mbox series

Patch

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index ebadb2103968..ef4133091d41 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -636,6 +636,10 @@  struct ieee80211_fils_discovery {
  * @tx_pwr_env_num: number of @tx_pwr_env.
  * @pwr_reduction: power constraint of BSS.
  * @eht_support: does this BSS support EHT
+ * @vht_su_beamformer: does this BSS support operation as an VHT SU beamformer
+ * @vht_su_beamformee: does this BSS support operation as an VHT SU beamformee
+ * @vht_mu_beamformer: does this BSS support operation as an VHT MU beamformer
+ * @vht_mu_beamformee: does this BSS support operation as an VHT MU beamformee
  */
 struct ieee80211_bss_conf {
 	const u8 *bssid;
@@ -711,6 +715,10 @@  struct ieee80211_bss_conf {
 	u8 tx_pwr_env_num;
 	u8 pwr_reduction;
 	bool eht_support;
+	bool vht_su_beamformer;
+	bool vht_su_beamformee;
+	bool vht_mu_beamformer;
+	bool vht_mu_beamformee;
 };
 
 /**
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index f7896f257e1b..76418bb360fa 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1164,6 +1164,21 @@  static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
 	prev_beacon_int = sdata->vif.bss_conf.beacon_int;
 	sdata->vif.bss_conf.beacon_int = params->beacon_interval;
 
+	if (params->vht_cap) {
+		sdata->vif.bss_conf.vht_su_beamformer =
+		       !!(ap_vht_cap->vht_cap_info &
+			  cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
+		sdata->vif.bss_conf.vht_su_beamformee =
+		       !!(ap_vht_cap->vht_cap_info &
+			  cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
+		sdata->vif.bss_conf.vht_mu_beamformer =
+		       !!(ap_vht_cap->vht_cap_info &
+			  cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE));
+		sdata->vif.bss_conf.vht_mu_beamformee =
+		       !!(ap_vht_cap->vht_cap_info &
+			  cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE));
+	}
+
 	if (params->he_cap && params->he_oper) {
 		sdata->vif.bss_conf.he_support = true;
 		sdata->vif.bss_conf.htc_trig_based_pkt_ext =