From patchwork Tue Jun 16 19:25:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Felix Fietkau X-Patchwork-Id: 215318 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.7 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9CDB5C433E3 for ; Tue, 16 Jun 2020 19:25:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8297620776 for ; Tue, 16 Jun 2020 19:25:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730855AbgFPTZq (ORCPT ); Tue, 16 Jun 2020 15:25:46 -0400 Received: from p54ae948c.dip0.t-ipconnect.de ([84.174.148.140]:51980 "EHLO maeck.local" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729989AbgFPTZq (ORCPT ); Tue, 16 Jun 2020 15:25:46 -0400 Received: by maeck.local (Postfix, from userid 501) id A2D428E50DD0; Tue, 16 Jun 2020 21:25:44 +0200 (CEST) From: Felix Fietkau To: linux-wireless@vger.kernel.org Cc: shayne.chen@mediatek.com, evelyn.tsai@mediatek.com, devicetree@vger.kernel.org Subject: [PATCH v2 1/4] dt-bindings: net: wireless: mt76: add power-limits node Date: Tue, 16 Jun 2020 21:25:41 +0200 Message-Id: <20200616192544.97938-1-nbd@nbd.name> X-Mailer: git-send-email 2.24.0 MIME-Version: 1.0 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org This subnode can be used to set per-rate tx power limits either per country code / regdomain or globally. These limits are typically provided by the device manufacturers and are used to limit sideband emissions and stay within regulatory limits Co-developed-by: Shayne Chen Signed-off-by: Felix Fietkau Signed-off-by: Shayne Chen --- v2: - merge 802.11ax rate changes from Shayne's patch - document txs-delta property .../bindings/net/wireless/mediatek,mt76.txt | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt index ab7e7a00e534..e4859c974ef4 100644 --- a/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt +++ b/Documentation/devicetree/bindings/net/wireless/mediatek,mt76.txt @@ -36,6 +36,7 @@ Optional nodes: - led: Properties for a connected LED Optional properties: - led-sources: See Documentation/devicetree/bindings/leds/common.txt +- power-limits: contains per-regdomain/channel rate power limit subnodes &pcie { pcie0 { @@ -76,3 +77,61 @@ wmac: wmac@18000000 { power-domains = <&scpsys MT7622_POWER_DOMAIN_WB>; }; + + +Subnodes of power-limits: + +Properties: +- country: One or more country codes, as used by the cfg80211 regdomain code +- regdomain: "FCC", "ETSI" or "JP" + +If neither country, nor regdomain is specified, the power limits node is used +as a fallback when no other subnode matches. + +Subnodes txpower-2g, txpower-5g: + +Properties: +- channels: pairs of first and last channel number +- cck: 4 half-dBm per-rate power limit values +- ofdm: 8 half-dBm per-rate power limit values +- mcs: + sets of per-rate power limit values for 802.11n/802.11ac rates for + multiple channel bandwidth settings. + Each set starts with the number of channel bandwidth settings for + which the rate set applies, followed by either 8 (MT7603/MT7628) or + 10 (all other chips) power limit values. + The order of the channel bandwidth settings is: 20, 40, 80, 160 MHz. +- ru: + sets of per-rate power limit values for 802.11ax rates for multiple + channel bandwidth or resource unit settings. + Each set starts with the number of channel bandwidth or resource unit + settings for which the rate set applies, followed by 12 power limit + values. The order of the channel resource unit settings is: + RU26, RU52, RU106, RU242/SU20, RU484/SU40, RU996/SU80, RU2x996/SU160. +- txs-delta: half-dBm power delta for different numbers of antennas (1, 2, ...) + + +power-limit example: + +power-limits { + r0 { + regdomain = "FCC"; + txpower-5g { + r1 { + channels = <36 48>; + ofdm = <23 23 23 23 23 23 23 23>; + mcs = <1 23 23 23 23 23 23 23 23 23 23>, + <3 22 22 22 22 22 22 22 22 22 22>; + ru = <3 22 22 22 22 22 22 22 22 22 22 22 22>, + <4 20 20 20 20 20 20 20 20 20 20 20 20>; + }; + r2 { + channels = <100 181>; + ofdm = <14 14 14 14 14 14 14 14>; + mcs = <4 14 14 14 14 14 14 14 14 14 14>; + txs-delta = <12 9 6>; + ru = <7 14 14 14 14 14 14 14 14 14 14 14 14>; + }; + }; + }; +}; From patchwork Tue Jun 16 19:25:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Felix Fietkau X-Patchwork-Id: 215319 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.7 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B37F8C433E1 for ; Tue, 16 Jun 2020 19:25:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 938CF20776 for ; Tue, 16 Jun 2020 19:25:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730823AbgFPTZq (ORCPT ); Tue, 16 Jun 2020 15:25:46 -0400 Received: from p54ae948c.dip0.t-ipconnect.de ([84.174.148.140]:51982 "EHLO maeck.local" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1730691AbgFPTZp (ORCPT ); Tue, 16 Jun 2020 15:25:45 -0400 Received: by maeck.local (Postfix, from userid 501) id B1F518E50DD4; Tue, 16 Jun 2020 21:25:44 +0200 (CEST) From: Felix Fietkau To: linux-wireless@vger.kernel.org Cc: shayne.chen@mediatek.com, evelyn.tsai@mediatek.com Subject: [PATCH v2 3/4] mt76: extend DT rate power limits to support 11ax devices Date: Tue, 16 Jun 2020 21:25:43 +0200 Message-Id: <20200616192544.97938-3-nbd@nbd.name> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20200616192544.97938-1-nbd@nbd.name> References: <20200616192544.97938-1-nbd@nbd.name> MIME-Version: 1.0 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Shayne Chen Enable parsing per-rate txpower limits from DT for 11ax chipsets. Co-developed-by: Felix Fietkau Tested-by: Evelyn Tsai Signed-off-by: Shayne Chen Signed-off-by: Felix Fietkau --- v2: clean up rate array handling, simplify drivers/net/wireless/mediatek/mt76/eeprom.c | 62 +++++++++++++-------- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/eeprom.c b/drivers/net/wireless/mediatek/mt76/eeprom.c index 7deb3c90c113..17a1a3ccc9dd 100644 --- a/drivers/net/wireless/mediatek/mt76/eeprom.c +++ b/drivers/net/wireless/mediatek/mt76/eeprom.c @@ -221,6 +221,36 @@ mt76_apply_array_limit(s8 *pwr, size_t pwr_len, const __be32 *data, } } +static void +mt76_apply_multi_array_limit(s8 *pwr, size_t pwr_len, s8 pwr_num, + const __be32 *data, size_t len, s8 target_power, + s8 nss_delta, s8 *max_power) +{ + int i, cur; + + if (!data) + return; + + len /= 4; + cur = be32_to_cpu(data[0]); + for (i = 0; i < pwr_num; i++) { + if (len < pwr_len + 1) + break; + + mt76_apply_array_limit(pwr + pwr_len * i, pwr_len, data + 1, + target_power, nss_delta, max_power); + if (--cur > 0) + continue; + + data += pwr_len + 1; + len -= pwr_len + 1; + if (!len) + break; + + cur = be32_to_cpu(data[0]); + } +} + s8 mt76_get_rate_power_limits(struct mt76_phy *phy, struct ieee80211_channel *chan, struct mt76_power_limits *dest, @@ -231,9 +261,9 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy, const __be32 *val; char name[16]; u32 mcs_rates = dev->drv->mcs_rates; + u32 ru_rates = ARRAY_SIZE(dest->ru[0]); char band; size_t len; - int i, cur; s8 max_power = 0; s8 txs_delta; @@ -280,28 +310,14 @@ s8 mt76_get_rate_power_limits(struct mt76_phy *phy, target_power, txs_delta, &max_power); val = mt76_get_of_array(np, "mcs", &len, mcs_rates + 1); - if (!val) - return max_power; - - len /= 4; - cur = be32_to_cpu(val[0]); - for (i = 0; i < ARRAY_SIZE(dest->mcs); i++) { - if (len < mcs_rates + 1) - break; - - mt76_apply_array_limit(dest->mcs[i], ARRAY_SIZE(dest->mcs[i]), - val + 1, target_power, txs_delta, - &max_power); - if (--cur > 0) - continue; - - val += mcs_rates + 1; - len -= mcs_rates + 1; - if (!len) - break; - - cur = be32_to_cpu(val[0]); - } + mt76_apply_multi_array_limit(dest->mcs[0], ARRAY_SIZE(dest->mcs[0]), + ARRAY_SIZE(dest->mcs), val, len, + target_power, txs_delta, &max_power); + + val = mt76_get_of_array(np, "ru", &len, ru_rates + 1); + mt76_apply_multi_array_limit(dest->ru[0], ARRAY_SIZE(dest->ru[0]), + ARRAY_SIZE(dest->ru), val, len, + target_power, txs_delta, &max_power); return max_power; } diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h index 9c5488ffbe5e..d50871653de1 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76.h +++ b/drivers/net/wireless/mediatek/mt76/mt76.h @@ -584,6 +584,7 @@ struct mt76_power_limits { s8 cck[4]; s8 ofdm[8]; s8 mcs[4][10]; + s8 ru[7][12]; }; enum mt76_phy_type {