From nobody Tue Apr 7 17:14:31 2026 Received: from mailgate02.uberspace.is (mailgate02.uberspace.is [185.26.156.114]) (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 464D43D1CA5 for ; Thu, 26 Feb 2026 21:55:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.26.156.114 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772142909; cv=none; b=WlFUoy36O7wQXMCyHkChv0Geqb2JgvoxgQs2bq8RmD1xjushs9NwZPV2NGNyUOdiaK7lmTvGLV0kv/MyEnkAVCLNOt/WuOChewPwiO92VRNp7fB0eqpEXZ4mBFh5ypaw/xlzcFJYQ6tQ0vPXEaSLVdcy8lURSbUCQBlVIFFNY5Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772142909; c=relaxed/simple; bh=7k4vYrbJ6xrpxAjo9hJNkIdxQq6FFLUNTmda5XOMLE0=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=Nzwbimu7X+/MMzjheE3RwziPw5ZT6meGnI694TbYhchaVrL9hXX27LKbftvqlKey3vndAIykNOadue1zDIyDEp0lCbOKbDEeyIBGZWyR66mk+j52Ut48w40dJiexofmLvpyxbd/eqH6/LmoQ3H+uw3WjaJIZN75gUwdslP/m0BY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=david-bauer.net; spf=pass smtp.mailfrom=david-bauer.net; dkim=pass (4096-bit key) header.d=david-bauer.net header.i=@david-bauer.net header.b=v0EcSVJy; arc=none smtp.client-ip=185.26.156.114 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=david-bauer.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=david-bauer.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (4096-bit key) header.d=david-bauer.net header.i=@david-bauer.net header.b="v0EcSVJy" Received: from perseus.uberspace.de (perseus.uberspace.de [95.143.172.134]) by mailgate02.uberspace.is (Postfix) with ESMTPS id AD2EF180159 for ; Thu, 26 Feb 2026 22:45:09 +0100 (CET) Received: (qmail 6313 invoked by uid 988); 26 Feb 2026 21:45:08 -0000 Authentication-Results: perseus.uberspace.de; auth=pass (plain) Received: from unknown (HELO unkown) (::1) by perseus.uberspace.de (Haraka/3.1.1) with ESMTPSA; Thu, 26 Feb 2026 22:45:07 +0100 From: David Bauer To: Felix Fietkau , Lorenzo Bianconi , Ryder Lee , Shayne Chen , Sean Wang , Matthias Brugger , AngeloGioacchino Del Regno Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org Subject: [PATCH] wifi: mt76: mt7915: add debug query from WA firmware Date: Thu, 26 Feb 2026 22:45:00 +0100 Message-ID: <20260226214502.2561168-1-mail@david-bauer.net> X-Mailer: git-send-email 2.51.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Rspamd-Bar: / X-Rspamd-Report: SUSPICIOUS_RECIPS(1.5) BAYES_HAM(-2.999999) MID_CONTAINS_FROM(1) MIME_GOOD(-0.1) R_MISSING_CHARSET(0.5) X-Rspamd-Score: -0.099999 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=david-bauer.net; s=uberspace; h=from:to:cc:subject:date; bh=7k4vYrbJ6xrpxAjo9hJNkIdxQq6FFLUNTmda5XOMLE0=; b=v0EcSVJyA3j4V41/5QzOj4WBK9JMFD9bud0Fewr2BKZ1XkNJUPXyPZ7rl9x44lt0ouI5GhVCKx JPV9YEaiQggB72quWuW33gzsZ5ZQdturHuYScCFFVXJyDVRRBjeWzmXj9MSxqBzRJOVuBcvdNE5S 2dTgcMSnS/maZWYSHje+aVwSnynuyPazCqkzoaQctsoJd61gdO/ohKKLnNxKFNGOkoBcP/CgwPve GoIVhkzzv7nxBcNxhserfT9BuQJT5FwSR3T0/2GoNyjO7FuOJv+JxGmDKxNMTzayTuqzO8Ca3XWt speoY+nQoVPT4xHtZIsyOeS+aFNX2KYA9+STP5mWvYqvGIiZpJwz9rStNC7oyW4wLnX63/Z6ncAA cpYP5Q48OktQd+KTpXy8LWEamMaakSdG6+U6GpP4l/WqdePWxGhZCNu0svynKJtRQijkfxN7nOen Ox0abD9a5k6fgw9uhwuLCC7Z97IKzeHyGsXny/x06nDq+ol5+Kx5j4dVAaQG0lMdapDrp1LL2obO 3RdW+a1iVLRBnrdl8Ql+PhotOry6hJ1E4lBAioLWfGqS3SkFeOi6aNxQK7D88Ym8QpevC0nkwtW+ S3AfEFLE0NmdxZoQMkz8SstnuEmTEFKbPdR/uL2L5AFqBY9hrD67KVzOanY9VyM6fHe3sesfmDtq M= Content-Type: text/plain; charset="utf-8" Add a new file to the mt76 debugfs to allow querying internal state information from the WA firmware. This allows to extract more information from the internal queue structures and configured limits. Signed-off-by: David Bauer --- .../wireless/mediatek/mt76/mt7915/debugfs.c | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c b/drivers/= net/wireless/mediatek/mt76/mt7915/debugfs.c index 26ed3745af43e..018b1c70b524b 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +++ b/drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c @@ -603,6 +603,86 @@ mt7915_fw_debug_wa_get(void *data, u64 *val) DEFINE_DEBUGFS_ATTRIBUTE(fops_fw_debug_wa, mt7915_fw_debug_wa_get, mt7915_fw_debug_wa_set, "%lld\n"); =20 +struct { + u8 idx; + u8 query_cmd; + char *description; +} mt7915_fw_wa_debug_query[] =3D { + { 0, 0x16, "MSDU drop info" }, + { 1, 0x17, "AC queue tail drop" }, + { 2, 0x19, "TX Free info" }, + { 3, 0x20, "BSS Table" }, + { 4, 0x21, "STA records" }, +}; + +static ssize_t +mt7915_fw_query_wa_set(struct file *file, const char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct mt7915_phy *phy =3D file->private_data; + struct mt7915_dev *dev =3D phy->dev; + char buf[16]; + u16 val; + + if (count >=3D sizeof(buf)) + return -EINVAL; + + if (copy_from_user(buf, user_buf, count)) + return -EFAULT; + + if (count && buf[count - 1] =3D=3D '\n') + buf[count - 1] =3D '\0'; + else + buf[count] =3D '\0'; + + if (kstrtou16(buf, 0, &val)) + return -EINVAL; + + for (int i =3D 0; i < ARRAY_SIZE(mt7915_fw_wa_debug_query); i++) { + if (val !=3D mt7915_fw_wa_debug_query[i].idx) + continue; + + mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(QUERY), + mt7915_fw_wa_debug_query[i].query_cmd, + 0, 0); + return count; + } + + return -EINVAL; +} + +static ssize_t +mt7915_fw_query_wa_get(struct file *file, char __user *user_buf, + size_t count, loff_t *ppos) +{ + static const size_t bufsz =3D 1024; + ssize_t ret; + char *buff; + int desc =3D 0; + int i; + + buff =3D kmalloc(bufsz, GFP_KERNEL); + if (!buff) + return -ENOMEM; + + for (i =3D 0; i < ARRAY_SIZE(mt7915_fw_wa_debug_query); i++) { + desc +=3D scnprintf(buff + desc, bufsz - desc, + "%d: %s\n", mt7915_fw_wa_debug_query[i].idx, + mt7915_fw_wa_debug_query[i].description); + } + + ret =3D simple_read_from_buffer(user_buf, count, ppos, buff, desc); + kfree(buff); + return ret; +} + +static const struct file_operations fw_query_wa_fops =3D { + .write =3D mt7915_fw_query_wa_set, + .read =3D mt7915_fw_query_wa_get, + .open =3D simple_open, + .llseek =3D default_llseek, +}; + static struct dentry * create_buf_file_cb(const char *filename, struct dentry *parent, umode_t mo= de, struct rchan_buf *buf, int *is_global) @@ -1310,6 +1390,7 @@ int mt7915_init_debugfs(struct mt7915_phy *phy) &mt7915_sys_recovery_ops); debugfs_create_file("fw_debug_wm", 0600, dir, dev, &fops_fw_debug_wm); debugfs_create_file("fw_debug_wa", 0600, dir, dev, &fops_fw_debug_wa); + debugfs_create_file("fw_query_wa", 0600, dir, dev, &fw_query_wa_fops); debugfs_create_file("fw_debug_bin", 0600, dir, dev, &fops_fw_debug_bin); debugfs_create_file("fw_util_wm", 0400, dir, dev, &mt7915_fw_util_wm_fops); --=20 2.51.0