Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3410831pxf; Mon, 5 Apr 2021 11:17:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxdz7+TEEXE8ezanAprjG4j9niE1x6EVZsOTb8OtcL68gIEyB/aGV6ufeBJAmR1lEMzon4u X-Received: by 2002:aa7:c312:: with SMTP id l18mr19315795edq.190.1617646636284; Mon, 05 Apr 2021 11:17:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617646636; cv=none; d=google.com; s=arc-20160816; b=zWYqjbi1qWinr4CwBFFG2N1j1SnFZIqxbIlFsSNOh6sbPqgzFQb61GJNltjpjjKdTq X379oQMOqIcj0kbVSg5A1Vj1rWzjkiV8cFEgAHePEDcRqONmVYn5dgQdLbrMI1QWl+Ir cVtOYyFWuGRWe9fLXaISrUWJFGWgpYCFIhzV1UUuYCMT0coTsFmfXSb8k50vom2nrcxU cF9+0khGcnFMIV25LvgrAQBUGYl/XkKa8wKleAxe4ZYCsSCWhGokeQQaFgPfsDKv2hFA 4fMcNUy3RyVmfjCdXHCtOYJ8zYbwg8HcScLVNdmVsBz2HKEynuSZ4Jcy5h7E1/n9hoW0 /NOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=j4aKf3hX6DFCjlUigBtTXHdyVIsJS47o7rwcJFa/PNw=; b=N5EP2Zaqvb37WE3vDqdYZgSxNH1u9wWw6NPXDLP3xFFjeCTaeyjYvnntWmRS0ihCW6 yV5tqqfkV4oidoH/rKpnNwWfJ70ZPlttyMlKZOaBH7RFePH7XnVN4aRaaSm24Lox3lWs 459ShvohhBrzDi/EJuMIWc2B0yARilzxlR5TxmscAOKMndWqM0k30SMQztMhZfHMal7+ joIbG/P9RbewQmYrov/kdcvRIW1/1tQresh7wTBFbN1fCe8L/xO0rm4j7gdBBHxFZsUD ZIz+2tpgkpEtbr8ObZpUOKi/Tn4ZfgGejBG924vOgV/DvYNHiHlTbing9MmtdbxEk9Ca WVXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Gijkrm6T; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z15si15388868ejr.444.2021.04.05.11.16.51; Mon, 05 Apr 2021 11:17:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=Gijkrm6T; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235571AbhDEMlC (ORCPT + 99 others); Mon, 5 Apr 2021 08:41:02 -0400 Received: from mail.kernel.org ([198.145.29.99]:43846 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235591AbhDEMlB (ORCPT ); Mon, 5 Apr 2021 08:41:01 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 0D105613A3; Mon, 5 Apr 2021 12:40:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1617626455; bh=ELOFEaMfEAUn7FroifoxbdxJDwFpaQk13xCF3MVQb2A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Gijkrm6Tvzg3Rj961IfrvYE4HvBOxiTJPIZk5I63OeGYvzE37TbSCCMZ235v6Ex4B A2Di22tthz8NdydWd1JcSyXWrGc3ytlBbmwbRPskEtExgMETYpqMyz1GguxIzFHAEX Ftn7IRf2RZkayH7lhpmoKBY52iOariE/Pk8Z6M4t63nwC6YGt8dDdlFG/ozjJ1jhw1 3Ca1nhqJgBK8xwBzRpvcXbP0vY1moOuAWo0HvUIwOfK2k9I19p6+HHQQQXGFBAeNPp 7sxhDB9PHPqF21U3VluALw7ui9fjjhhHossIAvBxf3hXH4TYq8UKyN4rStef0mp3/R HFNyBrHQD3K3A== From: Lorenzo Bianconi To: nbd@nbd.name Cc: linux-wireless@vger.kernel.org, lorenzo.bianconi@redhat.com, sean.wang@mediatek.com, ryder.lee@mediatek.com, shayne.chen@mediatek.com, devicetree@vger.kernel.org, robh@kernel.org Subject: [PATCH 5/8] mt76: mt7615: implement support for using DT rate power limits Date: Mon, 5 Apr 2021 14:40:29 +0200 Message-Id: X-Mailer: git-send-email 2.30.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org From: Felix Fietkau Limits are used to update the channel max_power settings and also passed to the firmware on channel changes Signed-off-by: Felix Fietkau Signed-off-by: Lorenzo Bianconi --- .../net/wireless/mediatek/mt76/mt7615/init.c | 10 ++- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 61 ++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c index 857fb4918975..e23898365166 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c @@ -252,6 +252,7 @@ void mt7615_init_txpower(struct mt7615_dev *dev, int delta_idx, delta = mt76_tx_power_nss_delta(n_chains); u8 *eep = (u8 *)dev->mt76.eeprom.data; enum nl80211_band band = sband->band; + struct mt76_power_limits limits; u8 rate_val; delta_idx = mt7615_eeprom_get_power_delta_index(dev, band); @@ -280,7 +281,11 @@ void mt7615_init_txpower(struct mt7615_dev *dev, target_power = max(target_power, eep[index]); } - target_power = DIV_ROUND_UP(target_power + delta, 2); + target_power = mt76_get_rate_power_limits(&dev->mphy, chan, + &limits, + target_power); + target_power += delta; + target_power = DIV_ROUND_UP(target_power, 2); chan->max_power = min_t(int, chan->max_reg_power, target_power); chan->orig_mpwr = target_power; @@ -311,6 +316,9 @@ mt7615_regd_notifier(struct wiphy *wiphy, memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2)); dev->mt76.region = request->dfs_region; + mt7615_init_txpower(dev, &mphy->sband_2g.sband); + mt7615_init_txpower(dev, &mphy->sband_5g.sband); + mt7615_mutex_acquire(dev); if (chandef->chan->flags & IEEE80211_CHAN_RADAR) diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c index 600c5366c099..7ca7d239b53d 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c @@ -2127,16 +2127,75 @@ static void mt7615_mcu_set_txpower_sku(struct mt7615_phy *phy, u8 *sku) { struct mt76_phy *mphy = phy->mt76; struct ieee80211_hw *hw = mphy->hw; + struct mt76_power_limits limits; + s8 *limits_array = (s8 *)&limits; int n_chains = hweight8(mphy->antenna_mask); int tx_power; int i; + static const u8 sku_mapping[] = { +#define SKU_FIELD(_type, _field) \ + [MT_SKU_##_type] = offsetof(struct mt76_power_limits, _field) + SKU_FIELD(CCK_1_2, cck[0]), + SKU_FIELD(CCK_55_11, cck[2]), + SKU_FIELD(OFDM_6_9, ofdm[0]), + SKU_FIELD(OFDM_12_18, ofdm[2]), + SKU_FIELD(OFDM_24_36, ofdm[4]), + SKU_FIELD(OFDM_48, ofdm[6]), + SKU_FIELD(OFDM_54, ofdm[7]), + SKU_FIELD(HT20_0_8, mcs[0][0]), + SKU_FIELD(HT20_32, ofdm[0]), + SKU_FIELD(HT20_1_2_9_10, mcs[0][1]), + SKU_FIELD(HT20_3_4_11_12, mcs[0][3]), + SKU_FIELD(HT20_5_13, mcs[0][5]), + SKU_FIELD(HT20_6_14, mcs[0][6]), + SKU_FIELD(HT20_7_15, mcs[0][7]), + SKU_FIELD(HT40_0_8, mcs[1][0]), + SKU_FIELD(HT40_32, ofdm[0]), + SKU_FIELD(HT40_1_2_9_10, mcs[1][1]), + SKU_FIELD(HT40_3_4_11_12, mcs[1][3]), + SKU_FIELD(HT40_5_13, mcs[1][5]), + SKU_FIELD(HT40_6_14, mcs[1][6]), + SKU_FIELD(HT40_7_15, mcs[1][7]), + SKU_FIELD(VHT20_0, mcs[0][0]), + SKU_FIELD(VHT20_1_2, mcs[0][1]), + SKU_FIELD(VHT20_3_4, mcs[0][3]), + SKU_FIELD(VHT20_5_6, mcs[0][5]), + SKU_FIELD(VHT20_7, mcs[0][7]), + SKU_FIELD(VHT20_8, mcs[0][8]), + SKU_FIELD(VHT20_9, mcs[0][9]), + SKU_FIELD(VHT40_0, mcs[1][0]), + SKU_FIELD(VHT40_1_2, mcs[1][1]), + SKU_FIELD(VHT40_3_4, mcs[1][3]), + SKU_FIELD(VHT40_5_6, mcs[1][5]), + SKU_FIELD(VHT40_7, mcs[1][7]), + SKU_FIELD(VHT40_8, mcs[1][8]), + SKU_FIELD(VHT40_9, mcs[1][9]), + SKU_FIELD(VHT80_0, mcs[2][0]), + SKU_FIELD(VHT80_1_2, mcs[2][1]), + SKU_FIELD(VHT80_3_4, mcs[2][3]), + SKU_FIELD(VHT80_5_6, mcs[2][5]), + SKU_FIELD(VHT80_7, mcs[2][7]), + SKU_FIELD(VHT80_8, mcs[2][8]), + SKU_FIELD(VHT80_9, mcs[2][9]), + SKU_FIELD(VHT160_0, mcs[3][0]), + SKU_FIELD(VHT160_1_2, mcs[3][1]), + SKU_FIELD(VHT160_3_4, mcs[3][3]), + SKU_FIELD(VHT160_5_6, mcs[3][5]), + SKU_FIELD(VHT160_7, mcs[3][7]), + SKU_FIELD(VHT160_8, mcs[3][8]), + SKU_FIELD(VHT160_9, mcs[3][9]), +#undef SKU_FIELD + }; tx_power = hw->conf.power_level * 2 - mt76_tx_power_nss_delta(n_chains); + + tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan, + &limits, tx_power); mphy->txpower_cur = tx_power; for (i = 0; i < MT_SKU_1SS_DELTA; i++) - sku[i] = tx_power; + sku[i] = limits_array[sku_mapping[i]]; for (i = 0; i < 4; i++) { int delta = 0; -- 2.30.2