From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 91721CD4F58 for ; Thu, 5 Sep 2024 12:33:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: Content-Type:In-Reply-To:From:References:Cc:To:Subject:MIME-Version:Date: Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=ZAq/WJxRl2xBJIxFJpgtsT4PJFM/lj/rAoqJbf9U0sA=; b=K1QsimTWLy4JSR/h0JhpheOpv2 FzT5dIz2pXzcC5KrpdOKiRg3IkRdjpYN/FSpsAVNr5PI2//VQCq+q3vU09bzStp2N5QsEfT9ziCxH AEhezN55T27VbxHsrsG0nefHyPlgRi/HzNYdJ/9E+n9cQ5H3rE2Q/OV8RQ3et1dYdJBplSoOBbvJt 0WeolvZVQVbSYblM612/v/K8GqXBbBi82HLLgRvPmloc7S9joyEqLr6DxsF1BrjaAPZ6YYreemGcW NMBRriFvtnGerd7U0ku1LPRlTTn3ekQmo0x4HbkPA7fhMCIMlN6fCHEtI4pWszdwtAEf6rBhaYFKA iAM9QIIg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1smBfx-00000008Kii-0TpI; Thu, 05 Sep 2024 12:33:25 +0000 Received: from nbd.name ([46.4.11.11]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1smBey-00000008Kah-2S5C for linux-arm-kernel@lists.infradead.org; Thu, 05 Sep 2024 12:32:26 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=nbd.name; s=20160729; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:From: References:Cc:To:Subject:MIME-Version:Date:Message-ID:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=ZAq/WJxRl2xBJIxFJpgtsT4PJFM/lj/rAoqJbf9U0sA=; b=CD+/pCk5mtH51Q16lJ4sroXiZs I6R3hgwZZzlSWkq9EP5RDAEf+R2m6QBmuEaDqRZlhqW1iru/OffZH96DdDtO/RB06oLGuVQe4Ji76 46HWpIYojIOQdyuzhsWozqMGZ5mcH9vd/o37J3lNAwKT7O0jiA4i1Z3ygc7jelnSPPgQ=; Received: from p4ff1376f.dip0.t-ipconnect.de ([79.241.55.111] helo=nf.local) by ds12 with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1smBeZ-009Esk-2q; Thu, 05 Sep 2024 14:31:59 +0200 Message-ID: <49a385d0-9ffc-468f-b7de-83abfa1e18f0@nbd.name> Date: Thu, 5 Sep 2024 14:31:58 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v6] wifi: mt76: mt7915: add wds support when wed is enabled To: Shengyu Qu , lorenzo@kernel.org, ryder.lee@mediatek.com, shayne.chen@mediatek.com, sean.wang@mediatek.com, kvalo@kernel.org, matthias.bgg@gmail.com, angelogioacchino.delregno@collabora.com, daniel@makrotopia.org, miriam.rachel.korenblit@intel.com, money.wang@mediatek.com, StanleyYP.Wang@mediatek.com, meichia.chiu@mediatek.com, chui-hao.chiu@mediatek.com, johannes.berg@intel.com, quic_adisi@quicinc.com, sujuan.chen@mediatek.com, allen.ye@mediatek.com, linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Bo Jiao References: From: Felix Fietkau Content-Language: en-US Autocrypt: addr=nbd@nbd.name; keydata= xsDiBEah5CcRBADIY7pu4LIv3jBlyQ/2u87iIZGe6f0f8pyB4UjzfJNXhJb8JylYYRzIOSxh ExKsdLCnJqsG1PY1mqTtoG8sONpwsHr2oJ4itjcGHfn5NJSUGTbtbbxLro13tHkGFCoCr4Z5 Pv+XRgiANSpYlIigiMbOkide6wbggQK32tC20QxUIwCg4k6dtV/4kwEeiOUfErq00TVqIiEE AKcUi4taOuh/PQWx/Ujjl/P1LfJXqLKRPa8PwD4j2yjoc9l+7LptSxJThL9KSu6gtXQjcoR2 vCK0OeYJhgO4kYMI78h1TSaxmtImEAnjFPYJYVsxrhay92jisYc7z5R/76AaELfF6RCjjGeP wdalulG+erWju710Bif7E1yjYVWeA/9Wd1lsOmx6uwwYgNqoFtcAunDaMKi9xVQW18FsUusM TdRvTZLBpoUAy+MajAL+R73TwLq3LnKpIcCwftyQXK5pEDKq57OhxJVv1Q8XkA9Dn1SBOjNB l25vJDFAT9ntp9THeDD2fv15yk4EKpWhu4H00/YX8KkhFsrtUs69+vZQwc0cRmVsaXggRmll dGthdSA8bmJkQG5iZC5uYW1lPsJgBBMRAgAgBQJGoeQnAhsjBgsJCAcDAgQVAggDBBYCAwEC HgECF4AACgkQ130UHQKnbvXsvgCgjsAIIOsY7xZ8VcSm7NABpi91yTMAniMMmH7FRenEAYMa VrwYTIThkTlQzsFNBEah5FQQCACMIep/hTzgPZ9HbCTKm9xN4bZX0JjrqjFem1Nxf3MBM5vN CYGBn8F4sGIzPmLhl4xFeq3k5irVg/YvxSDbQN6NJv8o+tP6zsMeWX2JjtV0P4aDIN1pK2/w VxcicArw0VYdv2ZCarccFBgH2a6GjswqlCqVM3gNIMI8ikzenKcso8YErGGiKYeMEZLwHaxE Y7mTPuOTrWL8uWWRL5mVjhZEVvDez6em/OYvzBwbkhImrryF29e3Po2cfY2n7EKjjr3/141K DHBBdgXlPNfDwROnA5ugjjEBjwkwBQqPpDA7AYPvpHh5vLbZnVGu5CwG7NAsrb2isRmjYoqk wu++3117AAMFB/9S0Sj7qFFQcD4laADVsabTpNNpaV4wAgVTRHKV/kC9luItzwDnUcsZUPdQ f3MueRJ3jIHU0UmRBG3uQftqbZJj3ikhnfvyLmkCNe+/hXhPu9sGvXyi2D4vszICvc1KL4RD aLSrOsROx22eZ26KqcW4ny7+va2FnvjsZgI8h4sDmaLzKczVRIiLITiMpLFEU/VoSv0m1F4B FtRgoiyjFzigWG0MsTdAN6FJzGh4mWWGIlE7o5JraNhnTd+yTUIPtw3ym6l8P+gbvfoZida0 TspgwBWLnXQvP5EDvlZnNaKa/3oBes6z0QdaSOwZCRA3QSLHBwtgUsrT6RxRSweLrcabwkkE GBECAAkFAkah5FQCGwwACgkQ130UHQKnbvW2GgCeMncXpbbWNT2AtoAYICrKyX5R3iMAoMhw cL98efvrjdstUfTCP2pfetyN In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240905_053224_914564_3765506D X-CRM114-Status: GOOD ( 26.42 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 05.08.24 14:43, Shengyu Qu wrote: > The current WED only supports 256 wcid, whereas mt7986 can support up to > 512 entries, so firmware provides a rule to get sta_info by DA when wcid > is set to 0x3ff by txd. Also, WED provides a register to overwrite txd > wcid, that is, wcid[9:8] can be overwritten by 0x3 and wcid[7:0] is set > to 0xff by host driver. > > However, firmware is unable to get sta_info from DA as DA != RA for > 4addr cases, so firmware and wifi host driver both use wcid (256 - 271) > and (768 ~ 783) for sync up to get correct sta_info. > > Currently WDS+WED config is completely broken on MT7986/7981 devices if > without this patch. > > Tested-by: Sujuan Chen > Co-developed-by: Bo Jiao > Signed-off-by: Bo Jiao > Signed-off-by: Sujuan Chen > Signed-off-by: Shengyu Qu > --- > Changes since v1: > - Drop duplicate setting in mmio > - Reduce the patch size by redefining mt76_wcid_alloc > Changes since v2: > - Rework wds wcid getting flow > Changes since v3: > - Rebase to next-20240703 > - Sync with downstream patch > Changes since v4: > - Rebase to next-20240802 > Changes since v5: > - Fixed build test error reported by robot > - Rebase to next-20240805 > --- > drivers/net/wireless/mediatek/mt76/mt76.h | 9 +++++ > .../net/wireless/mediatek/mt76/mt7915/main.c | 32 ++++++++++++++-- > .../net/wireless/mediatek/mt76/mt7915/mcu.c | 18 +++++++-- > .../net/wireless/mediatek/mt76/mt7915/mcu.h | 1 + > drivers/net/wireless/mediatek/mt76/util.c | 37 +++++++++++++++++-- > drivers/net/wireless/mediatek/mt76/util.h | 7 +++- > 6 files changed, 93 insertions(+), 11 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h > index 4a58a78d5ed25..1186a4998faff 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76.h > +++ b/drivers/net/wireless/mediatek/mt76/mt76.h > @@ -28,6 +28,9 @@ > > #define MT76_TOKEN_FREE_THR 64 > > +#define MT76_WED_WDS_MIN 256 > +#define MT76_WED_WDS_MAX 272 > + > #define MT_QFLAG_WED_RING GENMASK(1, 0) > #define MT_QFLAG_WED_TYPE GENMASK(4, 2) > #define MT_QFLAG_WED BIT(5) > @@ -71,6 +74,12 @@ enum mt76_wed_type { > MT76_WED_RRO_Q_IND, > }; > > +enum mt76_wed_state { > + MT76_WED_DEFAULT, > + MT76_WED_ACTIVE, > + MT76_WED_WDS_ACTIVE, > +}; > + > struct mt76_bus_ops { > u32 (*rr)(struct mt76_dev *dev, u32 offset); > void (*wr)(struct mt76_dev *dev, u32 offset, u32 val); > diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/main.c b/drivers/net/wireless/mediatek/mt76/mt7915/main.c > index 049223df9beb1..dc4d87e004a0f 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7915/main.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7915/main.c > @@ -745,8 +745,15 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, > bool ext_phy = mvif->phy != &dev->phy; > int ret, idx; > u32 addr; > + u8 flags = MT76_WED_DEFAULT; > > - idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA); > + if (mtk_wed_device_active(&dev->mt76.mmio.wed) && > + !is_mt7915(&dev->mt76)) { > + flags = test_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags) ? > + MT76_WED_WDS_ACTIVE : MT76_WED_ACTIVE; > + } > + > + idx = __mt76_wcid_alloc(mdev->wcid_mask, MT7915_WTBL_STA, flags); > if (idx < 0) > return -ENOSPC; > I'd prefer to replace the mt76_wcid_alloc flags argument with an explicit start offset argument. > @@ -1201,12 +1208,27 @@ static void mt7915_sta_set_4addr(struct ieee80211_hw *hw, > { > struct mt7915_dev *dev = mt7915_hw_dev(hw); > struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; > + int min = MT76_WED_WDS_MIN, max = MT76_WED_WDS_MAX; > > if (enabled) > set_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags); > else > clear_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags); > > + if (mtk_wed_device_active(&dev->mt76.mmio.wed) && > + !is_mt7915(&dev->mt76) && > + (msta->wcid.idx < min || msta->wcid.idx > max - 1)) { > + struct ieee80211_sta *pre_sta; > + > + pre_sta = kzalloc(sizeof(*sta) + sizeof(*msta), GFP_KERNEL); > + mt76_sta_pre_rcu_remove(hw, vif, sta); > + memmove(pre_sta, sta, sizeof(*sta) + sizeof(*msta)); > + mt7915_sta_add(hw, vif, sta); > + synchronize_rcu(); > + mt7915_sta_remove(hw, vif, pre_sta); > + kfree(pre_sta); > + } > + > mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta); > } > In order to update the code based on my latest changes and to fix potential race conditions on tx/rx packets during the transition, please change to this order: 1. copy the sta 2. allocate a new wcid 3. change the wcid index in the copied sta to the newly allocated wcid 4. call mcu functions on the duplicate sta for creating the new sta entry. 5. use rcu_assign_pointer to point dev->wcid[new_idx] at &msta->wcid 6. swap wcid index between real sta and duplicated sta 7. rcu_assign_pointer(dev->wcid[orig_idx], NULL) 8. synchronize_rcu() 9. call mcu functions to delete the duplicate sta's entry (points to old wcid after the swap) 10. free the duplicated sta This should allow mgmt tx/rx to work while the sta is being migrated to the new wcid entry. - Felix