CC: [email protected] CC: [email protected] CC: [email protected] TO: Miles Hu <[email protected]> CC: Kalle Valo <[email protected]> CC: Aloka Dixit <[email protected]> CC: Lavanya Suresh <[email protected]> CC: Pradeep Chitrapu <[email protected]> CC: Venkateswara Naralasetty <[email protected]> CC: Jouni Malinen <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: bbef3c7a63d2a4cb0f3f839db9e767f168c5e348 commit: 61fe43e7216df6e9a912d831aafc7142fa20f280 ath11k: add support for setting fixed HE rate/gi/ltf date: 10 weeks ago :::::: branch date: 8 hours ago :::::: commit date: 10 weeks ago config: i386-randconfig-c001-20211015 (https://download.01.org/0day-ci/archive/20211205/[email protected]/config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 6069a6a5049497a32a50a49661c2f4169078bdba) 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://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=61fe43e7216df6e9a912d831aafc7142fa20f280 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout 61fe43e7216df6e9a912d831aafc7142fa20f280 # save the config file to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=i386 clang-analyzer If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> clang-analyzer warnings: (new ones prefixed by >>) Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 5 warnings generated. Suppressed 5 warnings (5 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 5 warnings generated. Suppressed 5 warnings (5 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 7 warnings generated. 14 warnings generated. Suppressed 14 warnings (14 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 7 warnings generated. 14 warnings generated. Suppressed 14 warnings (14 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 7 warnings generated. 14 warnings generated. Suppressed 14 warnings (14 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 8 warnings generated. 16 warnings generated. drivers/video/fbdev/nvidia/nv_i2c.c:89:2: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy] strcpy(chan->adapter.name, name); ^~~~~~ drivers/video/fbdev/nvidia/nv_i2c.c:89:2: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 strcpy(chan->adapter.name, name); ^~~~~~ Suppressed 14 warnings (14 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 8 warnings generated. 16 warnings generated. drivers/video/fbdev/nvidia/nvidia.c:124:4: warning: Value stored to 'tmp' is never read [clang-analyzer-deadcode.DeadStores] tmp = 0; ^ ~ drivers/video/fbdev/nvidia/nvidia.c:124:4: note: Value stored to 'tmp' is never read tmp = 0; ^ ~ Suppressed 14 warnings (14 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 17 warnings generated. drivers/net/wireless/ath/ath11k/wmi.c:890:2: warning: Value stored to 'ptr' is never read [clang-analyzer-deadcode.DeadStores] ptr += sizeof(*tlv); ^ ~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/wmi.c:890:2: note: Value stored to 'ptr' is never read ptr += sizeof(*tlv); ^ ~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/wmi.c:7111:22: warning: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign] conn_req.service_id = svc_id[pdev_idx]; ^ drivers/net/wireless/ath/ath11k/wmi.c:7227:6: note: Assuming 'wmi_ep_count' is <= field 'max_radios' if (wmi_ep_count > ab->hw_params.max_radios) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/wmi.c:7227:2: note: Taking false branch if (wmi_ep_count > ab->hw_params.max_radios) ^ drivers/net/wireless/ath/ath11k/wmi.c:7230:14: note: Assuming 'i' is < 'wmi_ep_count' for (i = 0; i < wmi_ep_count; i++) ^~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/wmi.c:7230:2: note: Loop condition is true. Entering loop body for (i = 0; i < wmi_ep_count; i++) ^ drivers/net/wireless/ath/ath11k/wmi.c:7230:14: note: Assuming 'i' is < 'wmi_ep_count' for (i = 0; i < wmi_ep_count; i++) ^~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/wmi.c:7230:2: note: Loop condition is true. Entering loop body for (i = 0; i < wmi_ep_count; i++) ^ drivers/net/wireless/ath/ath11k/wmi.c:7230:14: note: Assuming 'i' is < 'wmi_ep_count' for (i = 0; i < wmi_ep_count; i++) ^~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/wmi.c:7230:2: note: Loop condition is true. Entering loop body for (i = 0; i < wmi_ep_count; i++) ^ drivers/net/wireless/ath/ath11k/wmi.c:7230:32: note: The value 3 is assigned to 'i' for (i = 0; i < wmi_ep_count; i++) ^~~ drivers/net/wireless/ath/ath11k/wmi.c:7230:14: note: Assuming 'i' is < 'wmi_ep_count' for (i = 0; i < wmi_ep_count; i++) ^~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/wmi.c:7230:2: note: Loop condition is true. Entering loop body for (i = 0; i < wmi_ep_count; i++) ^ drivers/net/wireless/ath/ath11k/wmi.c:7231:39: note: Passing the value 3 via 2nd parameter 'pdev_idx' ath11k_connect_pdev_htc_service(ab, i); ^ drivers/net/wireless/ath/ath11k/wmi.c:7231:3: note: Calling 'ath11k_connect_pdev_htc_service' ath11k_connect_pdev_htc_service(ab, i); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/wmi.c:7111:22: note: Assigned value is garbage or undefined conn_req.service_id = svc_id[pdev_idx]; ^ ~~~~~~~~~~~~~~~~ Suppressed 15 warnings (15 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 23 warnings generated. drivers/net/wireless/ath/ath11k/mac.c:1661:27: warning: Although the value stored to 'vht_mcs' is used in the enclosing expression, the value is never actually read from 'vht_mcs' [clang-analyzer-deadcode.DeadStores] for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) { ^ ~ drivers/net/wireless/ath/ath11k/mac.c:1661:27: note: Although the value stored to 'vht_mcs' is used in the enclosing expression, the value is never actually read from 'vht_mcs' for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) { ^ ~ >> drivers/net/wireless/ath/ath11k/mac.c:1927:27: warning: Although the value >> stored to 'he_mcs' is used in the enclosing expression, the value is never >> actually read from 'he_mcs' [clang-analyzer-deadcode.DeadStores] for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) { ^ ~ drivers/net/wireless/ath/ath11k/mac.c:1927:27: note: Although the value stored to 'he_mcs' is used in the enclosing expression, the value is never actually read from 'he_mcs' for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) { ^ ~ drivers/net/wireless/ath/ath11k/mac.c:3141:3: warning: 1st function call argument is an uninitialized value [clang-analyzer-core.CallAndMessage] kfree(arg.extraie.ptr); ^ ~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/mac.c:3078:2: note: Control jumps to 'case ATH11K_SCAN_ABORTING:' at line 3089 switch (ar->scan.state) { ^ drivers/net/wireless/ath/ath11k/mac.c:3091:3: note: Execution continues on line 3093 break; ^ drivers/net/wireless/ath/ath11k/mac.c:3095:6: note: 'ret' is -16 if (ret) ^~~ drivers/net/wireless/ath/ath11k/mac.c:3095:2: note: Taking true branch if (ret) ^ drivers/net/wireless/ath/ath11k/mac.c:3096:3: note: Control jumps to line 3140 goto exit; ^ drivers/net/wireless/ath/ath11k/mac.c:3140:6: note: Assuming field 'ie_len' is not equal to 0 if (req->ie_len) ^~~~~~~~~~~ drivers/net/wireless/ath/ath11k/mac.c:3140:2: note: Taking true branch if (req->ie_len) ^ drivers/net/wireless/ath/ath11k/mac.c:3141:3: note: 1st function call argument is an uninitialized value kfree(arg.extraie.ptr); ^ ~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/mac.c:4091:3: warning: Value stored to 'bw' is never read [clang-analyzer-deadcode.DeadStores] bw = WMI_PEER_CHWIDTH_20MHZ; ^ ~~~~~~~~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/mac.c:4091:3: note: Value stored to 'bw' is never read bw = WMI_PEER_CHWIDTH_20MHZ; ^ ~~~~~~~~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/mac.c:4120:3: warning: Value stored to 'smps' is never read [clang-analyzer-deadcode.DeadStores] smps = WMI_PEER_SMPS_PS_NONE; ^ ~~~~~~~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/mac.c:4120:3: note: Value stored to 'smps' is never read smps = WMI_PEER_SMPS_PS_NONE; ^ ~~~~~~~~~~~~~~~~~~~~~ drivers/net/wireless/ath/ath11k/mac.c:5684:2: warning: Value stored to 'changed_flags' is never read [clang-analyzer-deadcode.DeadStores] changed_flags &= SUPPORTED_FILTERS; ^ drivers/net/wireless/ath/ath11k/mac.c:5684:2: note: Value stored to 'changed_flags' is never read drivers/net/wireless/ath/ath11k/mac.c:7312:22: warning: Value stored to 'ab' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct ath11k_base *ab = ar->ab; ^~ ~~~~~~ drivers/net/wireless/ath/ath11k/mac.c:7312:22: note: Value stored to 'ab' during its initialization is never read struct ath11k_base *ab = ar->ab; ^~ ~~~~~~ Suppressed 16 warnings (15 in non-user code, 1 with check filters). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 5 warnings generated. Suppressed 5 warnings (5 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 5 warnings generated. Suppressed 5 warnings (5 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 6 warnings generated. include/linux/hid.h:1007:9: warning: Access to field 'name' results in a dereference of a null pointer (loaded from variable 'input') [clang-analyzer-core.NullDereference] input->name, c, type); ^ drivers/hid/hid-penmount.c:22:6: note: Assuming the condition is true if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/hid/hid-penmount.c:22:2: note: Taking true branch if ((usage->hid & HID_USAGE_PAGE) == HID_UP_BUTTON) { ^ drivers/hid/hid-penmount.c:23:7: note: Assuming the condition is true if (((usage->hid - 1) & HID_USAGE) == 0) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/hid/hid-penmount.c:23:3: note: Taking true branch if (((usage->hid - 1) & HID_USAGE) == 0) { ^ drivers/hid/hid-penmount.c:24:4: note: Calling 'hid_map_usage' hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/hid.h:982:2: note: 'input' initialized here struct input_dev *input = hidinput->input; ^~~~~~~~~~~~~~~~~~~~~~~ include/linux/hid.h:986:2: note: Control jumps to 'case 1:' at line 995 switch (type) { ^ include/linux/hid.h:998:3: note: Execution continues on line 1005 break; ^ include/linux/hid.h:1005:15: note: 'c' is <= 'limit' if (unlikely(c > limit || !bmap)) { ^ include/linux/compiler.h:78:42: note: expanded from macro 'unlikely' # define unlikely(x) __builtin_expect(!!(x), 0) ^ include/linux/hid.h:1005:15: note: Left side of '||' is false if (unlikely(c > limit || !bmap)) { ^ include/linux/hid.h:1005:28: note: Assuming 'bmap' is null vim +1927 drivers/net/wireless/ath/ath11k/mac.c 61fe43e7216df6 Miles Hu 2021-09-24 1761 d5c65159f28953 Kalle Valo 2019-11-23 1762 static void ath11k_peer_assoc_h_he(struct ath11k *ar, d5c65159f28953 Kalle Valo 2019-11-23 1763 struct ieee80211_vif *vif, d5c65159f28953 Kalle Valo 2019-11-23 1764 struct ieee80211_sta *sta, d5c65159f28953 Kalle Valo 2019-11-23 1765 struct peer_assoc_params *arg) d5c65159f28953 Kalle Valo 2019-11-23 1766 { 61fe43e7216df6 Miles Hu 2021-09-24 1767 struct ath11k_vif *arvif = (void *)vif->drv_priv; 61fe43e7216df6 Miles Hu 2021-09-24 1768 struct cfg80211_chan_def def; 9f056ed8ee01ad John Crispin 2019-11-25 1769 const struct ieee80211_sta_he_cap *he_cap = &sta->he_cap; af6d39db1b046a Tamizh Chelvam 2020-09-08 1770 u8 ampdu_factor; 61fe43e7216df6 Miles Hu 2021-09-24 1771 enum nl80211_band band; 61fe43e7216df6 Miles Hu 2021-09-24 1772 u16 *he_mcs_mask; 61fe43e7216df6 Miles Hu 2021-09-24 1773 u8 max_nss, he_mcs; 61fe43e7216df6 Miles Hu 2021-09-24 1774 u16 he_tx_mcs = 0, v = 0; 61fe43e7216df6 Miles Hu 2021-09-24 1775 int i, he_nss, nss_idx; 61fe43e7216df6 Miles Hu 2021-09-24 1776 bool user_rate_valid = true; 61fe43e7216df6 Miles Hu 2021-09-24 1777 61fe43e7216df6 Miles Hu 2021-09-24 1778 if (WARN_ON(ath11k_mac_vif_chan(vif, &def))) 61fe43e7216df6 Miles Hu 2021-09-24 1779 return; 9f056ed8ee01ad John Crispin 2019-11-25 1780 9f056ed8ee01ad John Crispin 2019-11-25 1781 if (!he_cap->has_he) 9f056ed8ee01ad John Crispin 2019-11-25 1782 return; 9f056ed8ee01ad John Crispin 2019-11-25 1783 61fe43e7216df6 Miles Hu 2021-09-24 1784 band = def.chan->band; 61fe43e7216df6 Miles Hu 2021-09-24 1785 he_mcs_mask = arvif->bitrate_mask.control[band].he_mcs; 61fe43e7216df6 Miles Hu 2021-09-24 1786 61fe43e7216df6 Miles Hu 2021-09-24 1787 if (ath11k_peer_assoc_h_he_masked(he_mcs_mask)) 61fe43e7216df6 Miles Hu 2021-09-24 1788 return; 61fe43e7216df6 Miles Hu 2021-09-24 1789 9f056ed8ee01ad John Crispin 2019-11-25 1790 arg->he_flag = true; 9f056ed8ee01ad John Crispin 2019-11-25 1791 c8bcd82a4efd05 Kees Cook 2021-06-16 1792 memcpy_and_pad(&arg->peer_he_cap_macinfo, c8bcd82a4efd05 Kees Cook 2021-06-16 1793 sizeof(arg->peer_he_cap_macinfo), c8bcd82a4efd05 Kees Cook 2021-06-16 1794 he_cap->he_cap_elem.mac_cap_info, c8bcd82a4efd05 Kees Cook 2021-06-16 1795 sizeof(he_cap->he_cap_elem.mac_cap_info), c8bcd82a4efd05 Kees Cook 2021-06-16 1796 0); c8bcd82a4efd05 Kees Cook 2021-06-16 1797 memcpy_and_pad(&arg->peer_he_cap_phyinfo, c8bcd82a4efd05 Kees Cook 2021-06-16 1798 sizeof(arg->peer_he_cap_phyinfo), c8bcd82a4efd05 Kees Cook 2021-06-16 1799 he_cap->he_cap_elem.phy_cap_info, c8bcd82a4efd05 Kees Cook 2021-06-16 1800 sizeof(he_cap->he_cap_elem.phy_cap_info), c8bcd82a4efd05 Kees Cook 2021-06-16 1801 0); 60689de46c7f6a Rajkumar Manoharan 2020-04-24 1802 arg->peer_he_ops = vif->bss_conf.he_oper.params; 9f056ed8ee01ad John Crispin 2019-11-25 1803 9f056ed8ee01ad John Crispin 2019-11-25 1804 /* the top most byte is used to indicate BSS color info */ 9f056ed8ee01ad John Crispin 2019-11-25 1805 arg->peer_he_ops &= 0xffffff; 9f056ed8ee01ad John Crispin 2019-11-25 1806 af6d39db1b046a Tamizh Chelvam 2020-09-08 1807 /* As per section 26.6.1 11ax Draft5.0, if the Max AMPDU Exponent Extension af6d39db1b046a Tamizh Chelvam 2020-09-08 1808 * in HE cap is zero, use the arg->peer_max_mpdu as calculated while parsing af6d39db1b046a Tamizh Chelvam 2020-09-08 1809 * VHT caps(if VHT caps is present) or HT caps (if VHT caps is not present). af6d39db1b046a Tamizh Chelvam 2020-09-08 1810 * af6d39db1b046a Tamizh Chelvam 2020-09-08 1811 * For non-zero value of Max AMPDU Extponent Extension in HE MAC caps, af6d39db1b046a Tamizh Chelvam 2020-09-08 1812 * if a HE STA sends VHT cap and HE cap IE in assoc request then, use af6d39db1b046a Tamizh Chelvam 2020-09-08 1813 * MAX_AMPDU_LEN_FACTOR as 20 to calculate max_ampdu length. af6d39db1b046a Tamizh Chelvam 2020-09-08 1814 * If a HE STA that does not send VHT cap, but HE and HT cap in assoc af6d39db1b046a Tamizh Chelvam 2020-09-08 1815 * request, then use MAX_AMPDU_LEN_FACTOR as 16 to calculate max_ampdu af6d39db1b046a Tamizh Chelvam 2020-09-08 1816 * length. af6d39db1b046a Tamizh Chelvam 2020-09-08 1817 */ 1f851b8dfd76a0 Johannes Berg 2021-04-09 1818 ampdu_factor = u8_get_bits(he_cap->he_cap_elem.mac_cap_info[3], 1f851b8dfd76a0 Johannes Berg 2021-04-09 1819 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK); af6d39db1b046a Tamizh Chelvam 2020-09-08 1820 af6d39db1b046a Tamizh Chelvam 2020-09-08 1821 if (ampdu_factor) { af6d39db1b046a Tamizh Chelvam 2020-09-08 1822 if (sta->vht_cap.vht_supported) af6d39db1b046a Tamizh Chelvam 2020-09-08 1823 arg->peer_max_mpdu = (1 << (IEEE80211_HE_VHT_MAX_AMPDU_FACTOR + af6d39db1b046a Tamizh Chelvam 2020-09-08 1824 ampdu_factor)) - 1; af6d39db1b046a Tamizh Chelvam 2020-09-08 1825 else if (sta->ht_cap.ht_supported) af6d39db1b046a Tamizh Chelvam 2020-09-08 1826 arg->peer_max_mpdu = (1 << (IEEE80211_HE_HT_MAX_AMPDU_FACTOR + af6d39db1b046a Tamizh Chelvam 2020-09-08 1827 ampdu_factor)) - 1; af6d39db1b046a Tamizh Chelvam 2020-09-08 1828 } af6d39db1b046a Tamizh Chelvam 2020-09-08 1829 9f056ed8ee01ad John Crispin 2019-11-25 1830 if (he_cap->he_cap_elem.phy_cap_info[6] & 9f056ed8ee01ad John Crispin 2019-11-25 1831 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) { 9f056ed8ee01ad John Crispin 2019-11-25 1832 int bit = 7; 9f056ed8ee01ad John Crispin 2019-11-25 1833 int nss, ru; 9f056ed8ee01ad John Crispin 2019-11-25 1834 9f056ed8ee01ad John Crispin 2019-11-25 1835 arg->peer_ppet.numss_m1 = he_cap->ppe_thres[0] & 9f056ed8ee01ad John Crispin 2019-11-25 1836 IEEE80211_PPE_THRES_NSS_MASK; 9f056ed8ee01ad John Crispin 2019-11-25 1837 arg->peer_ppet.ru_bit_mask = 9f056ed8ee01ad John Crispin 2019-11-25 1838 (he_cap->ppe_thres[0] & 9f056ed8ee01ad John Crispin 2019-11-25 1839 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK) >> 9f056ed8ee01ad John Crispin 2019-11-25 1840 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS; 9f056ed8ee01ad John Crispin 2019-11-25 1841 9f056ed8ee01ad John Crispin 2019-11-25 1842 for (nss = 0; nss <= arg->peer_ppet.numss_m1; nss++) { 9f056ed8ee01ad John Crispin 2019-11-25 1843 for (ru = 0; ru < 4; ru++) { 9f056ed8ee01ad John Crispin 2019-11-25 1844 u32 val = 0; 9f056ed8ee01ad John Crispin 2019-11-25 1845 int i; 9f056ed8ee01ad John Crispin 2019-11-25 1846 9f056ed8ee01ad John Crispin 2019-11-25 1847 if ((arg->peer_ppet.ru_bit_mask & BIT(ru)) == 0) 9f056ed8ee01ad John Crispin 2019-11-25 1848 continue; 9f056ed8ee01ad John Crispin 2019-11-25 1849 for (i = 0; i < 6; i++) { 9f056ed8ee01ad John Crispin 2019-11-25 1850 val >>= 1; 9f056ed8ee01ad John Crispin 2019-11-25 1851 val |= ((he_cap->ppe_thres[bit / 8] >> 9f056ed8ee01ad John Crispin 2019-11-25 1852 (bit % 8)) & 0x1) << 5; 9f056ed8ee01ad John Crispin 2019-11-25 1853 bit++; 9f056ed8ee01ad John Crispin 2019-11-25 1854 } 9f056ed8ee01ad John Crispin 2019-11-25 1855 arg->peer_ppet.ppet16_ppet8_ru3_ru0[nss] |= 9f056ed8ee01ad John Crispin 2019-11-25 1856 val << (ru * 6); 9f056ed8ee01ad John Crispin 2019-11-25 1857 } 9f056ed8ee01ad John Crispin 2019-11-25 1858 } 9f056ed8ee01ad John Crispin 2019-11-25 1859 } 9f056ed8ee01ad John Crispin 2019-11-25 1860 6d293d447670da John Crispin 2019-11-25 1861 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_RES) 6d293d447670da John Crispin 2019-11-25 1862 arg->twt_responder = true; 6d293d447670da John Crispin 2019-11-25 1863 if (he_cap->he_cap_elem.mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_TWT_REQ) 6d293d447670da John Crispin 2019-11-25 1864 arg->twt_requester = true; 6d293d447670da John Crispin 2019-11-25 1865 61fe43e7216df6 Miles Hu 2021-09-24 1866 he_nss = ath11k_mac_max_he_nss(he_mcs_mask); 61fe43e7216df6 Miles Hu 2021-09-24 1867 61fe43e7216df6 Miles Hu 2021-09-24 1868 if (he_nss > sta->rx_nss) { 61fe43e7216df6 Miles Hu 2021-09-24 1869 user_rate_valid = false; 61fe43e7216df6 Miles Hu 2021-09-24 1870 for (nss_idx = sta->rx_nss - 1; nss_idx >= 0; nss_idx--) { 61fe43e7216df6 Miles Hu 2021-09-24 1871 if (he_mcs_mask[nss_idx]) { 61fe43e7216df6 Miles Hu 2021-09-24 1872 user_rate_valid = true; 61fe43e7216df6 Miles Hu 2021-09-24 1873 break; 61fe43e7216df6 Miles Hu 2021-09-24 1874 } 61fe43e7216df6 Miles Hu 2021-09-24 1875 } 61fe43e7216df6 Miles Hu 2021-09-24 1876 } 61fe43e7216df6 Miles Hu 2021-09-24 1877 61fe43e7216df6 Miles Hu 2021-09-24 1878 if (!user_rate_valid) { 61fe43e7216df6 Miles Hu 2021-09-24 1879 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac setting he range mcs value to peer supported nss %d for peer %pM\n", 61fe43e7216df6 Miles Hu 2021-09-24 1880 sta->rx_nss, sta->addr); 61fe43e7216df6 Miles Hu 2021-09-24 1881 he_mcs_mask[sta->rx_nss - 1] = he_mcs_mask[he_nss - 1]; 61fe43e7216df6 Miles Hu 2021-09-24 1882 } 61fe43e7216df6 Miles Hu 2021-09-24 1883 9f056ed8ee01ad John Crispin 2019-11-25 1884 switch (sta->bandwidth) { 9f056ed8ee01ad John Crispin 2019-11-25 1885 case IEEE80211_STA_RX_BW_160: 9f056ed8ee01ad John Crispin 2019-11-25 1886 if (he_cap->he_cap_elem.phy_cap_info[0] & 9f056ed8ee01ad John Crispin 2019-11-25 1887 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G) { 9f056ed8ee01ad John Crispin 2019-11-25 1888 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80p80); 61fe43e7216df6 Miles Hu 2021-09-24 1889 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask); 9f056ed8ee01ad John Crispin 2019-11-25 1890 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v; 9f056ed8ee01ad John Crispin 2019-11-25 1891 9f056ed8ee01ad John Crispin 2019-11-25 1892 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80p80); 9f056ed8ee01ad John Crispin 2019-11-25 1893 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80_80] = v; 9f056ed8ee01ad John Crispin 2019-11-25 1894 9f056ed8ee01ad John Crispin 2019-11-25 1895 arg->peer_he_mcs_count++; 61fe43e7216df6 Miles Hu 2021-09-24 1896 he_tx_mcs = v; 9f056ed8ee01ad John Crispin 2019-11-25 1897 } 9f056ed8ee01ad John Crispin 2019-11-25 1898 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_160); 9f056ed8ee01ad John Crispin 2019-11-25 1899 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 9f056ed8ee01ad John Crispin 2019-11-25 1900 9f056ed8ee01ad John Crispin 2019-11-25 1901 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_160); 61fe43e7216df6 Miles Hu 2021-09-24 1902 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask); 9f056ed8ee01ad John Crispin 2019-11-25 1903 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_160] = v; 9f056ed8ee01ad John Crispin 2019-11-25 1904 9f056ed8ee01ad John Crispin 2019-11-25 1905 arg->peer_he_mcs_count++; 61fe43e7216df6 Miles Hu 2021-09-24 1906 if (!he_tx_mcs) 61fe43e7216df6 Miles Hu 2021-09-24 1907 he_tx_mcs = v; 0b294aebb6a00b Gustavo A. R. Silva 2020-07-27 1908 fallthrough; 9f056ed8ee01ad John Crispin 2019-11-25 1909 9f056ed8ee01ad John Crispin 2019-11-25 1910 default: 9f056ed8ee01ad John Crispin 2019-11-25 1911 v = le16_to_cpu(he_cap->he_mcs_nss_supp.rx_mcs_80); 9f056ed8ee01ad John Crispin 2019-11-25 1912 arg->peer_he_rx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 9f056ed8ee01ad John Crispin 2019-11-25 1913 9f056ed8ee01ad John Crispin 2019-11-25 1914 v = le16_to_cpu(he_cap->he_mcs_nss_supp.tx_mcs_80); 61fe43e7216df6 Miles Hu 2021-09-24 1915 v = ath11k_peer_assoc_h_he_limit(v, he_mcs_mask); 9f056ed8ee01ad John Crispin 2019-11-25 1916 arg->peer_he_tx_mcs_set[WMI_HECAP_TXRX_MCS_NSS_IDX_80] = v; 9f056ed8ee01ad John Crispin 2019-11-25 1917 9f056ed8ee01ad John Crispin 2019-11-25 1918 arg->peer_he_mcs_count++; 61fe43e7216df6 Miles Hu 2021-09-24 1919 if (!he_tx_mcs) 61fe43e7216df6 Miles Hu 2021-09-24 1920 he_tx_mcs = v; 9f056ed8ee01ad John Crispin 2019-11-25 1921 break; 9f056ed8ee01ad John Crispin 2019-11-25 1922 } 61fe43e7216df6 Miles Hu 2021-09-24 1923 61fe43e7216df6 Miles Hu 2021-09-24 1924 /* Calculate peer NSS capability from HE capabilities if STA 61fe43e7216df6 Miles Hu 2021-09-24 1925 * supports HE. 61fe43e7216df6 Miles Hu 2021-09-24 1926 */ 61fe43e7216df6 Miles Hu 2021-09-24 @1927 for (i = 0, max_nss = 0, he_mcs = 0; i < NL80211_HE_NSS_MAX; i++) { 61fe43e7216df6 Miles Hu 2021-09-24 1928 he_mcs = he_tx_mcs >> (2 * i) & 3; 61fe43e7216df6 Miles Hu 2021-09-24 1929 61fe43e7216df6 Miles Hu 2021-09-24 1930 /* In case of fixed rates, MCS Range in he_tx_mcs might have 61fe43e7216df6 Miles Hu 2021-09-24 1931 * unsupported range, with he_mcs_mask set, so check either of them 61fe43e7216df6 Miles Hu 2021-09-24 1932 * to find nss. 61fe43e7216df6 Miles Hu 2021-09-24 1933 */ 61fe43e7216df6 Miles Hu 2021-09-24 1934 if (he_mcs != IEEE80211_HE_MCS_NOT_SUPPORTED || 61fe43e7216df6 Miles Hu 2021-09-24 1935 he_mcs_mask[i]) 61fe43e7216df6 Miles Hu 2021-09-24 1936 max_nss = i + 1; 61fe43e7216df6 Miles Hu 2021-09-24 1937 } 61fe43e7216df6 Miles Hu 2021-09-24 1938 arg->peer_nss = min(sta->rx_nss, max_nss); 61fe43e7216df6 Miles Hu 2021-09-24 1939 61fe43e7216df6 Miles Hu 2021-09-24 1940 ath11k_dbg(ar->ab, ATH11K_DBG_MAC, 61fe43e7216df6 Miles Hu 2021-09-24 1941 "mac he peer %pM nss %d mcs cnt %d\n", 61fe43e7216df6 Miles Hu 2021-09-24 1942 sta->addr, arg->peer_nss, arg->peer_he_mcs_count); d5c65159f28953 Kalle Valo 2019-11-23 1943 } d5c65159f28953 Kalle Valo 2019-11-23 1944 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected] _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
