Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp1625848pxb; Wed, 2 Feb 2022 08:57:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJw2NUubZnIEyhnvMe3dJhEc4vXgKAKClfQKWR6JDQoSS4Nt5vimvQOWPvsVuwI04cHi9arS X-Received: by 2002:a17:90b:4a09:: with SMTP id kk9mr9136025pjb.107.1643821043494; Wed, 02 Feb 2022 08:57:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643821043; cv=none; d=google.com; s=arc-20160816; b=XMF1+XbAbdRfN8Qg/fytWk+Cq96SJpmybPGTrYrtTkDARaAwcrrmDh+gse2uYPLbTI /0N7ryVEJkFe1ZtX5d4ZaNNWi2lLB1OupVcc9u36LMzB87ADMtvWtwVUFgdr6oKEvI9B bk2IzakX6FXTJ0fCycZGLEzxLd4jijaj/DGM3qIDl2HfnH8pWafTqb34IKFuxtyZSMkb aWQuWpJHErQq0U6Fk/I/BDzx0QsgP12FJsnc+pcagZgq5ypKZ54K/SlVu3p+b+CFlnXP Xn+AlrwOEWXmL/IU2WeKsAVRoj2reIIYj/1XYLtDDI+gf4iJQY/+q8vTXcXr30LtVVKr 7Ibw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:subject:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:cc:to:from; bh=1PAOATq+IzOFPpW80t1OeXl25k78M5O5fDrK10KFYro=; b=Ce05n4ZKjEl2YtxxylaIVcJvA1Z9yax5CC1p7aV9FMRirKMToG/pTjzFtq1Zbxq4/Y 49BCWQiLrZYshfIuGlQKPlutcZ6QhricJlIqoP9phlD2MMn0d50XsKcM6V2c91LEkSZ+ XkWTgJXqa6p0sLbvUaAkbt2CesHZxKnt/tzUAaTDxTy2xo0GmoH9NIR2IyxQKSZK1xAN bc0d1yTAMtrPVIz1qXHO+WRxuh2SLbhoi3Jk6IDBxnx7XrdGoQV47xfzc6/MiPg4brxm qZBXICos7HscH8xd4/6p2w1OqNpPJTYaEagVM53/YVa5C4WWzQjW00zz087PfixmGxsp 8ydw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ms1si5188366pjb.186.2022.02.02.08.57.10; Wed, 02 Feb 2022 08:57:23 -0800 (PST) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243066AbiBBIuA (ORCPT + 65 others); Wed, 2 Feb 2022 03:50:00 -0500 Received: from paleale.coelho.fi ([176.9.41.70]:37926 "EHLO farmhouse.coelho.fi" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S245223AbiBBIuA (ORCPT ); Wed, 2 Feb 2022 03:50:00 -0500 Received: from 91-156-4-210.elisa-laajakaista.fi ([91.156.4.210] helo=kveik.lan) by farmhouse.coelho.fi with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1nFBKv-0004v8-5T; Wed, 02 Feb 2022 10:49:58 +0200 From: Luca Coelho To: johannes@sipsolutions.net Cc: luca@coelho.fi, linux-wireless@vger.kernel.org Date: Wed, 2 Feb 2022 10:49:35 +0200 Message-Id: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220202084947.370289-1-luca@coelho.fi> References: <20220202084947.370289-1-luca@coelho.fi> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on farmhouse.coelho.fi X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, TVD_RCVD_IP autolearn=ham autolearn_force=no version=3.4.6 Subject: [PATCH 02/14] mac80211: consider RX NSS in UHB connection Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Mordechay Goodstein In UHB connection we don't have any HT/VHT elemens so in order to calculate the max RX-NSS we need also to look at HE capa element, this causes to limit us to max rx nss in UHB to 1. Also anyway we need to look at HE max rx NSS and not only at HT/VHT capa to determine the max rx nss over the connection. Signed-off-by: Mordechay Goodstein Signed-off-by: Luca Coelho --- net/mac80211/mlme.c | 61 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 55e21557a3d2..291226a1599d 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -4907,13 +4907,20 @@ void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local) rcu_read_unlock(); } -static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata, - struct cfg80211_bss *cbss) +static u8 ieee80211_max_rx_chains(struct ieee80211_sub_if_data *sdata, + struct cfg80211_bss *cbss) { + struct ieee80211_he_mcs_nss_supp *he_mcs_nss_supp; struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; const struct element *ht_cap_elem, *vht_cap_elem; + const struct cfg80211_bss_ies *ies; const struct ieee80211_ht_cap *ht_cap; const struct ieee80211_vht_cap *vht_cap; + const struct ieee80211_he_cap_elem *he_cap; + const struct element *he_cap_elem; + u16 mcs_80_map, mcs_160_map; + int i, mcs_nss_size; + bool support_160; u8 chains = 1; if (ifmgd->flags & IEEE80211_STA_DISABLE_HT) @@ -4948,6 +4955,54 @@ static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata, chains = max(chains, nss); } + if (ifmgd->flags & IEEE80211_STA_DISABLE_HE) + return chains; + + ies = rcu_dereference(cbss->ies); + he_cap_elem = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_CAPABILITY, + ies->data, ies->len); + + if (!he_cap_elem || he_cap_elem->datalen < sizeof(*he_cap)) + return chains; + + /* skip one byte ext_tag_id */ + he_cap = (void *)(he_cap_elem->data + 1); + mcs_nss_size = ieee80211_he_mcs_nss_size(he_cap); + + /* invalid HE IE */ + if (he_cap_elem->datalen < 1 + mcs_nss_size + sizeof(*he_cap)) + return chains; + + /* mcs_nss is right after he_cap info */ + he_mcs_nss_supp = (void *)(he_cap + 1); + + mcs_80_map = le16_to_cpu(he_mcs_nss_supp->tx_mcs_80); + + for (i = 7; i >= 0; i--) { + u8 mcs_80 = mcs_80_map >> (2 * i) & 3; + + if (mcs_80 != IEEE80211_VHT_MCS_NOT_SUPPORTED) { + chains = max_t(u8, chains, i + 1); + break; + } + } + + support_160 = he_cap->phy_cap_info[0] & + IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G; + + if (!support_160) + return chains; + + mcs_160_map = le16_to_cpu(he_mcs_nss_supp->tx_mcs_160); + for (i = 7; i >= 0; i--) { + u8 mcs_160 = mcs_160_map >> (2 * i) & 3; + + if (mcs_160 != IEEE80211_VHT_MCS_NOT_SUPPORTED) { + chains = max_t(u8, chains, i + 1); + break; + } + } + return chains; } @@ -5162,7 +5217,7 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, s1g_oper, &chandef, false); - sdata->needed_rx_chains = min(ieee80211_ht_vht_rx_chains(sdata, cbss), + sdata->needed_rx_chains = min(ieee80211_max_rx_chains(sdata, cbss), local->rx_chains); rcu_read_unlock(); -- 2.34.1