From patchwork Thu Feb 16 01:16:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Greear X-Patchwork-Id: 9576175 X-Patchwork-Delegate: johannes@sipsolutions.net Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 2ABB8600C5 for ; Thu, 16 Feb 2017 01:16:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1B3352856B for ; Thu, 16 Feb 2017 01:16:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0FB312857B; Thu, 16 Feb 2017 01:16:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 325832856B for ; Thu, 16 Feb 2017 01:16:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752416AbdBPBQi (ORCPT ); Wed, 15 Feb 2017 20:16:38 -0500 Received: from mail2.candelatech.com ([208.74.158.173]:37638 "EHLO mail2.candelatech.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751525AbdBPBQh (ORCPT ); Wed, 15 Feb 2017 20:16:37 -0500 Received: from ben-dt3.candelatech.com (firewall.candelatech.com [50.251.239.81]) by mail2.candelatech.com (Postfix) with ESMTP id 6085340A339; Wed, 15 Feb 2017 17:16:36 -0800 (PST) From: greearb@candelatech.com To: linux-wireless@vger.kernel.org Cc: Ben Greear Subject: [PATCH v2] mac80211: allow overriding station bandwidth. Date: Wed, 15 Feb 2017 17:16:34 -0800 Message-Id: <1487207794-19663-1-git-send-email-greearb@candelatech.com> X-Mailer: git-send-email 2.4.11 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Ben Greear This allows one to disable VHT160 (or 80+80) on hardware that might otherwise try to use it. Signed-off-by: Ben Greear --- v2: Change description include/linux/ieee80211.h | 1 + net/mac80211/main.c | 1 + net/mac80211/vht.c | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index a80516f..e5dc3a8 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h @@ -1542,6 +1542,7 @@ struct ieee80211_vht_operation { #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ 0x00000004 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ 0x00000008 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK 0x0000000C +#define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT 2 #define IEEE80211_VHT_CAP_RXLDPC 0x00000010 #define IEEE80211_VHT_CAP_SHORT_GI_80 0x00000020 #define IEEE80211_VHT_CAP_SHORT_GI_160 0x00000040 diff --git a/net/mac80211/main.c b/net/mac80211/main.c index ec5587d..1447b47 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c @@ -464,6 +464,7 @@ static const struct ieee80211_ht_cap mac80211_ht_capa_mod_mask = { static const struct ieee80211_vht_cap mac80211_vht_capa_mod_mask = { .vht_cap_info = cpu_to_le32(IEEE80211_VHT_CAP_RXLDPC | + IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK | IEEE80211_VHT_CAP_SHORT_GI_80 | IEEE80211_VHT_CAP_SHORT_GI_160 | IEEE80211_VHT_CAP_RXSTBC_1 | diff --git a/net/mac80211/vht.c b/net/mac80211/vht.c index 720c64c..5684e13 100644 --- a/net/mac80211/vht.c +++ b/net/mac80211/vht.c @@ -56,6 +56,29 @@ void ieee80211_apply_vhtcap_overrides(struct ieee80211_sub_if_data *sdata, __check_vhtcap_disable(sdata, vht_cap, IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN); + /* Allow disabling 160Mhz or 80+80 */ + if (sdata->u.mgd.vht_capa_mask.vht_cap_info & + cpu_to_le32(IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK)) { + u32 cap, n; + + n = le32_to_cpu(sdata->u.mgd.vht_capa.vht_cap_info) & + IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK; + n >>= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT; + cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK; + cap >>= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT; + + if (n < cap) { + vht_cap->cap &= + ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK; + vht_cap->cap |= + n << IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT; + + /* Cannot do short GI 160 if we cannot do 160 or 80+80 */ + if (n == 0) + vht_cap->cap &= ~IEEE80211_VHT_CAP_SHORT_GI_160; + } + } + /* Allow user to decrease AMPDU length exponent */ if (sdata->u.mgd.vht_capa_mask.vht_cap_info & cpu_to_le32(IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK)) {