From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2C1343EFFC3 for ; Fri, 24 Jul 2026 22:10:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.41 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784931044; cv=none; b=mmb7AVJrMptB+irkLL45ELuag+aPvMoIbm+Nd14qYUn9yeZeXS82DdfofL2b505tKF1C8NPlBRvzflMlDu8nzOZehlsDikhJINnWyxPi4RoJSZLyPSAP6iVxmLvjM9vsyAhOGQMFrF7fghy1gXx9cf05+ITlC726VcjvDy3WCtU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784931044; c=relaxed/simple; bh=ohOFeJY9h8tDcp37kno3adSeq/OhevTE33FpGFOFAyY=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=KTbPNiDPyjYdGo+EBb1mhaoVjk615utsll0bOXEAiHijHcL5fPqOmA9UIab9DIcE/uruqGJy4t5azcpQBIbkRkL24olVLoyMD1Zp5MoO31TlgJOH+PlCjNl7YLsLkWEpUWOb5jaCDtO2e42az7S7p9eMHCAo+KoeU+j0IKxzpWw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=C+n1X9HC; arc=none smtp.client-ip=209.85.221.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="C+n1X9HC" Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-47f71156e1aso430814f8f.3 for ; Fri, 24 Jul 2026 15:10:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784931036; x=1785535836; darn=vger.kernel.org; h=content-transfer-encoding:content-type:in-reply-to:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Yqs4jWXpQot2YwX9w73crNB1xIUPmIM/U3nv5DCazug=; b=C+n1X9HColJEuDWeuhjjmkMtj5DqBilLJ17qP40+5Ug5Mpnw/CAqfuXJLJq1v/Ef2k KFVe2Az5SM2lzCoxXq+fmxvpAx57ny6d9FAt2A1kHHn23h5ZOA78s6GFTiOzXnMR+r79 OaRu49TZ2CjBnZZXXEYAPM8ZwZKFEbQAq163WLWTA0pFEHJpgPwRaIX5nh5mMFNOrjZt Env5XLBKnE8FDCuwwbhCvIxFhFTSCGay2NLb/5l2foKu6n1/JazPyDFjA6YaZqHaugtH MwDfQcl87g1Y7us3ZcIFF7lMM5SRj0JXkJT/dMGoFGuIu2Yxr/0NQb+6/6hMMdB8Lt2C 4OoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784931036; x=1785535836; h=content-transfer-encoding:content-type:in-reply-to:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Yqs4jWXpQot2YwX9w73crNB1xIUPmIM/U3nv5DCazug=; b=jvabfZ2tYdd4WVTyfAkUeLtXHjkFeBa+wd+ZK5CPQ4nLz8NBEB+0qsoOAB+eEa7wx+ BVNyr1mwl643idq/ZNDnRSoPJoHANg4W3N9JejevIIF18QE2R4hO/sa9m0nDlpCldJWJ gD/uG77uYGllf47RZ/brrVfXDh3Xcu6ZgHSNzMNlxkqtWqCqpZhIzM7W9jcKe10t3DhI Pj1kCzS2VmvCGK35noBBC0BWd8ePxK18vLXkNfQfjdoOWzVIbJzrs9u0SjrQenrWK8/p OR0ewHLITxvHux3Mb+LTMVDygS4cpijnVD88E2TWufkBcj4l28W8TjgSQUXFPGSHbMKB CHJg== X-Forwarded-Encrypted: i=1; AHgh+Rr2QOBypDkT+ohGypkBNm7dxZIdB2XCofIYjTmTfHZwUGLIDRkcdOESrKiyPBMNcgIZ9Uy6iOhT3tWlIJk=@vger.kernel.org X-Gm-Message-State: AOJu0Yxom8r5eq7lDCcmjVkbgfRZQjQJZ32A0yG7wm31iB6RbFMvRwg+ mBGtS09N8eONYhGPS3bhdUKFLw1IkR9vEPLURfGp2D3PkvgJ0oFeB0RP X-Gm-Gg: AR+sD13z7ALG/vKJwXhReGa7w4zFTCixSzdUrOF5G18TuwvgH7UniLETVxmqlfoBto8 PQUcEBbIsmzTgN2a2zkC6KICTGQDJzIUs6/TMbBkYadzPYrqN2Q1HjgukEAtSeCE+WyGgNt34oh nsvvzL7Q1oC11PslZyXJegzBk7C1gFibuOh0v1iV9Tv4rcRd6iCiAOj1UKcQuyT2+gGUopq4bVx oNc/fTdPU+0DyeH2l5zHRj6N24CF11lUNq+VJZU/qKdkUu+GVrGjwHdm4M9pn5Hzph1XqQeYZ3j ssVDBzJv9uHWvCE8NiStJ4HQ+EVJRRsmytWrrr15xbGYpcmMOwljiE8tp8FnXWHn6SvCI8m2Uq0 HrTA6TamnQn6W62SQA042it/N7um1WOppI74OgxQQRETTYt+WivxS8UXA7Ypi5KTI5M1bdweM0s w42di4/z/q X-Received: by 2002:a05:600c:c177:b0:495:4056:9473 with SMTP id 5b1f17b1804b1-496b5754455mr1076615e9.28.1784931036095; Fri, 24 Jul 2026 15:10:36 -0700 (PDT) Received: from [192.168.1.50] ([79.118.68.61]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-496b4d8d6efsm18832335e9.0.2026.07.24.15.10.34 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 24 Jul 2026 15:10:35 -0700 (PDT) Message-ID: Date: Sat, 25 Jul 2026 01:10:32 +0300 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 18/19] wifi: rtw88: match the RTL8723BS firmware connect and power save behaviour To: luka.gejak@linux.dev, Ping-Ke Shih Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Straube , Peter Robinson References: <20260724181858.192903-1-luka.gejak@linux.dev> <20260724183314.197195-1-luka.gejak@linux.dev> Content-Language: en-US From: Bitterblue Smith In-Reply-To: <20260724183314.197195-1-luka.gejak@linux.dev> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 24/07/2026 21:33, luka.gejak@linux.dev wrote: > From: Luka Gejak > > The vendor firmware expects the connect media status report at > association completion rather than when the station is added, so defer > it until the station is actually associated and track whether it was > sent, so the disconnect report is only sent to undo one that was. Does the firmware really care? What happens if you don't do all that? > > Leaving LPS also costs enough per-packet latency on this chip to > throttle bursty traffic badly, and the stock check enters LPS after a > single quiet two second window that an ordinary session hits > constantly. Gate LPS on the smoothed throughput for this chip so it > only sleeps after sustained idle. Other chips keep the existing > behaviour. > > Signed-off-by: Luka Gejak > --- > drivers/net/wireless/realtek/rtw88/main.c | 47 ++++++++++++++++++++++- > 1 file changed, 45 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c > index a2ef4479f408..63d1fb4bc87e 100644 > --- a/drivers/net/wireless/realtek/rtw88/main.c > +++ b/drivers/net/wireless/realtek/rtw88/main.c > @@ -304,6 +304,25 @@ static void rtw_sw_beacon_loss_check(struct rtw_dev *rtwdev, > /* process TX/RX statistics periodically for hardware, > * the information helps hardware to enhance performance > */ > +static bool rtw8723bs_station_media_status(struct rtw_dev *rtwdev, > + struct ieee80211_sta *sta, > + struct ieee80211_vif *vif) > +{ > + return rtw_is_8723bs(rtwdev) && > + vif->type == NL80211_IFTYPE_STATION && !sta->tdls; > +} > + > +/* 8723BS SDIO: defer the connect MEDIA_STATUS_RPT until the STA is actually > + * associated (the vendor firmware sends it at assoc completion, not sta-add). > + */ > +static bool rtw8723bs_defer_sta_media_status(struct rtw_dev *rtwdev, > + struct ieee80211_sta *sta, > + struct ieee80211_vif *vif) > +{ > + return rtw8723bs_station_media_status(rtwdev, sta, vif) && > + !vif->cfg.assoc; > +} > + > static void rtw_watch_dog_work(struct work_struct *work) > { > struct rtw_dev *rtwdev = container_of(work, struct rtw_dev, > @@ -382,6 +401,17 @@ static void rtw_watch_dog_work(struct work_struct *work) > * get that vif and check if device is having traffic more than the > * threshold. > */ > + /* On 8723BS SDIO the firmware's per-packet wake latency out of LPS > + * throttles bursty traffic hard. The stock check enters LPS after a > + * single quiet 2s window, which a normal bursty session hits > + * constantly. Gate LPS on the smoothed throughput instead so the chip > + * only sleeps after sustained idle and stays awake through an active > + * session. Other chips keep the normal behaviour. > + */ > + if (rtw_is_8723bs(rtwdev) && > + (stats->tx_throughput || stats->rx_throughput)) > + ps_active = true; > + > if (rtwdev->ps_enabled && data.rtwvif && !ps_active && > !rtwdev->beacon_loss && !rtwdev->ap_active) > rtw_enter_lps(rtwdev, data.rtwvif->port); > @@ -450,7 +480,13 @@ int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta, > INIT_WORK(&si->rc_work, rtw_sta_rc_work); > > rtw_update_sta_info(rtwdev, si, true); > - rtw_fw_media_status_report(rtwdev, si->mac_id, true); > + if (rtw8723bs_defer_sta_media_status(rtwdev, sta, vif)) { > + rtwvif->fw_media_connected = false; > + } else { > + rtw_fw_media_status_report(rtwdev, si->mac_id, true); > + if (rtw8723bs_station_media_status(rtwdev, sta, vif)) > + rtwvif->fw_media_connected = true; > + } > > rtwdev->sta_cnt++; > rtwdev->beacon_loss = false; > @@ -465,14 +501,21 @@ void rtw_sta_remove(struct rtw_dev *rtwdev, struct ieee80211_sta *sta, > { > struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv; > struct ieee80211_vif *vif = si->vif; > + struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; > int i; > > cancel_work_sync(&si->rc_work); > > if (vif->type != NL80211_IFTYPE_STATION || sta->tdls) > rtw_release_macid(rtwdev, si->mac_id); > - if (fw_exist) > + if (fw_exist && rtw8723bs_station_media_status(rtwdev, sta, vif) && > + !rtwvif->fw_media_connected) { > + /* connect status was deferred and never sent; nothing to undo */ > + } else if (fw_exist) { > rtw_fw_media_status_report(rtwdev, si->mac_id, false); > + if (rtw8723bs_station_media_status(rtwdev, sta, vif)) > + rtwvif->fw_media_connected = false; > + } > > for (i = 0; i < ARRAY_SIZE(sta->txq); i++) > rtw_txq_cleanup(rtwdev, sta->txq[i]);