Search Linux Wireless

Re: [PATCH v2] wireless: add check of field VHT Extended NSS BW Capable for 160/80+80 MHz setting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Wen,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on mac80211-next/master]
[also build test WARNING on mac80211/master v5.13-rc2 next-20210521]
[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/0day-ci/linux/commits/Wen-Gong/wireless-add-check-of-field-VHT-Extended-NSS-BW-Capable-for-160-80-80-MHz-setting/20210522-224810
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git master
config: i386-randconfig-s001-20210522 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.3-341-g8af24329-dirty
        # https://github.com/0day-ci/linux/commit/ed41c78effa1b66bb3d00e368b92940e5ffadb57
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Wen-Gong/wireless-add-check-of-field-VHT-Extended-NSS-BW-Capable-for-160-80-80-MHz-setting/20210522-224810
        git checkout ed41c78effa1b66bb3d00e368b92940e5ffadb57
        # save the attached .config to linux build tree
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' W=1 ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>


sparse warnings: (new ones prefixed by >>)
>> net/wireless/chan.c:953:39: sparse: sparse: restricted __le16 degrades to integer

vim +953 net/wireless/chan.c

   936	
   937	bool cfg80211_chandef_usable(struct wiphy *wiphy,
   938				     const struct cfg80211_chan_def *chandef,
   939				     u32 prohibited_flags)
   940	{
   941		struct ieee80211_sta_ht_cap *ht_cap;
   942		struct ieee80211_sta_vht_cap *vht_cap;
   943		struct ieee80211_edmg *edmg_cap;
   944		u32 width, control_freq, cap;
   945		bool ext_nss_cap, support_80_80 = false;
   946	
   947		if (WARN_ON(!cfg80211_chandef_valid(chandef)))
   948			return false;
   949	
   950		ht_cap = &wiphy->bands[chandef->chan->band]->ht_cap;
   951		vht_cap = &wiphy->bands[chandef->chan->band]->vht_cap;
   952		edmg_cap = &wiphy->bands[chandef->chan->band]->edmg_cap;
 > 953		ext_nss_cap = vht_cap->vht_mcs.tx_highest & IEEE80211_VHT_EXT_NSS_BW_CAPABLE;
   954	
   955		if (edmg_cap->channels &&
   956		    !cfg80211_edmg_usable(wiphy,
   957					  chandef->edmg.channels,
   958					  chandef->edmg.bw_config,
   959					  chandef->chan->hw_value,
   960					  edmg_cap))
   961			return false;
   962	
   963		control_freq = chandef->chan->center_freq;
   964	
   965		switch (chandef->width) {
   966		case NL80211_CHAN_WIDTH_1:
   967			width = 1;
   968			break;
   969		case NL80211_CHAN_WIDTH_2:
   970			width = 2;
   971			break;
   972		case NL80211_CHAN_WIDTH_4:
   973			width = 4;
   974			break;
   975		case NL80211_CHAN_WIDTH_8:
   976			width = 8;
   977			break;
   978		case NL80211_CHAN_WIDTH_16:
   979			width = 16;
   980			break;
   981		case NL80211_CHAN_WIDTH_5:
   982			width = 5;
   983			break;
   984		case NL80211_CHAN_WIDTH_10:
   985			prohibited_flags |= IEEE80211_CHAN_NO_10MHZ;
   986			width = 10;
   987			break;
   988		case NL80211_CHAN_WIDTH_20:
   989			if (!ht_cap->ht_supported &&
   990			    chandef->chan->band != NL80211_BAND_6GHZ)
   991				return false;
   992			fallthrough;
   993		case NL80211_CHAN_WIDTH_20_NOHT:
   994			prohibited_flags |= IEEE80211_CHAN_NO_20MHZ;
   995			width = 20;
   996			break;
   997		case NL80211_CHAN_WIDTH_40:
   998			width = 40;
   999			if (chandef->chan->band == NL80211_BAND_6GHZ)
  1000				break;
  1001			if (!ht_cap->ht_supported)
  1002				return false;
  1003			if (!(ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) ||
  1004			    ht_cap->cap & IEEE80211_HT_CAP_40MHZ_INTOLERANT)
  1005				return false;
  1006			if (chandef->center_freq1 < control_freq &&
  1007			    chandef->chan->flags & IEEE80211_CHAN_NO_HT40MINUS)
  1008				return false;
  1009			if (chandef->center_freq1 > control_freq &&
  1010			    chandef->chan->flags & IEEE80211_CHAN_NO_HT40PLUS)
  1011				return false;
  1012			break;
  1013		case NL80211_CHAN_WIDTH_80P80:
  1014			cap = vht_cap->cap;
  1015			support_80_80 =
  1016				(cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ) ||
  1017				(cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ &&
  1018				 cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) ||
  1019				(ext_nss_cap &&
  1020				 u32_get_bits(cap, IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) > 1);
  1021			if (chandef->chan->band != NL80211_BAND_6GHZ && !support_80_80)
  1022				return false;
  1023			fallthrough;
  1024		case NL80211_CHAN_WIDTH_80:
  1025			prohibited_flags |= IEEE80211_CHAN_NO_80MHZ;
  1026			width = 80;
  1027			if (chandef->chan->band == NL80211_BAND_6GHZ)
  1028				break;
  1029			if (!vht_cap->vht_supported)
  1030				return false;
  1031			break;
  1032		case NL80211_CHAN_WIDTH_160:
  1033			prohibited_flags |= IEEE80211_CHAN_NO_160MHZ;
  1034			width = 160;
  1035			if (chandef->chan->band == NL80211_BAND_6GHZ)
  1036				break;
  1037			if (!vht_cap->vht_supported)
  1038				return false;
  1039			cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
  1040			if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ &&
  1041			    cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ &&
  1042			    !(ext_nss_cap && (vht_cap->cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK)))
  1043				return false;
  1044			break;
  1045		default:
  1046			WARN_ON_ONCE(1);
  1047			return false;
  1048		}
  1049	
  1050		/*
  1051		 * TODO: What if there are only certain 80/160/80+80 MHz channels
  1052		 *	 allowed by the driver, or only certain combinations?
  1053		 *	 For 40 MHz the driver can set the NO_HT40 flags, but for
  1054		 *	 80/160 MHz and in particular 80+80 MHz this isn't really
  1055		 *	 feasible and we only have NO_80MHZ/NO_160MHZ so far but
  1056		 *	 no way to cover 80+80 MHz or more complex restrictions.
  1057		 *	 Note that such restrictions also need to be advertised to
  1058		 *	 userspace, for example for P2P channel selection.
  1059		 */
  1060	
  1061		if (width > 20)
  1062			prohibited_flags |= IEEE80211_CHAN_NO_OFDM;
  1063	
  1064		/* 5 and 10 MHz are only defined for the OFDM PHY */
  1065		if (width < 20)
  1066			prohibited_flags |= IEEE80211_CHAN_NO_OFDM;
  1067	
  1068	
  1069		if (!cfg80211_secondary_chans_ok(wiphy,
  1070						 ieee80211_chandef_to_khz(chandef),
  1071						 width, prohibited_flags))
  1072			return false;
  1073	
  1074		if (!chandef->center_freq2)
  1075			return true;
  1076		return cfg80211_secondary_chans_ok(wiphy,
  1077						   MHZ_TO_KHZ(chandef->center_freq2),
  1078						   width, prohibited_flags);
  1079	}
  1080	EXPORT_SYMBOL(cfg80211_chandef_usable);
  1081	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux