From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC01B606A31A for ; Fri, 30 Oct 2026 03:18:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=xOLDJ2MT; dkim=pass (1024-bit key, unprotected) header.d=mediatek.com header.i=@mediatek.com header.a=rsa-sha256 header.s=dk header.b=dXsuaTEQ 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-Type: Content-Transfer-Encoding:MIME-Version:Message-ID:Date:Subject:CC:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Unsubscribe-Post:List-Owner; bh=6RRcv4Qw7VDJcKP4wbTzfqyN7JaE/6Jb2FDJuM1BHy0=; b=xOLDJ2MT5iUyWm6+1Kk1ZXu5rI maT3ynPIzd7dRt14yK8kSV9W/P9qOF6vXCkETvS94M8vtJdqX+dwHb2PMKeV/FajPeRRc+CY/4Asw KIlS3+HUNzc1Pm71nRpULGUw1rq9U39VddYfva2zxJwhCXVWCcJkocsmwr3HUphdyqGXDCO553u4z dNBKVoyD3e4M17KMKacmJBxMHWkeZMlL5FF8ukQ2KBuyV9DYzF1CNwXZi2v4AAKvNyXuvHmOB08uS Elij6ESgPUfyjIzp4p0e/DsboYM9Ep7nIqazgj0d7WAurecHpGnZf7TH46u5v2ew8RERL6iPKk6Fm ErWqgBww==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xMd8A-0000000Aiu6-0e7l; Fri, 30 Oct 2026 03:18:14 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xMd87-0000000Aitg-2nFw for linux-mediatek@lists.infradead.org; Fri, 30 Oct 2026 03:18:13 +0000 X-UUID: 83bde2fed41011f1afed4741b24580c9-20261029 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:Content-Transfer-Encoding:MIME-Version:Message-ID:Date:Subject:CC:To:From; bh=6RRcv4Qw7VDJcKP4wbTzfqyN7JaE/6Jb2FDJuM1BHy0=; b=dXsuaTEQzrs6b13PxS1wyBVBEfR/no/Mt1EGuWn+7l/jCDXzYz0EgLPISjsrl7UgLhl3p17E0OEOa/G8KmNpFiUXamFuny/3JSCmDbdwl+II2u0zhq1uNj31Ixrht6n1rGr1NroPXfboFSjfH8bGUwVnFzd0ALw/aCLsPFYktBE=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.3.21,REQID:c26b30e9-f0c2-43c5-9d7e-8bb183425e56,IP:0,U RL:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION: release,TS:0 X-CID-META: VersionHash:b0318ac,CLOUDID:5baeecd3-9268-4403-9d01-c3f84acdb38f,B ulkID:nil,BulkQuantity:0,SF:102|136|836|865|888|898,TC:-5,Content:0|15|50| 99,EDM:-3|-100,IP:nil,URL:0,File:130,RT:0,Bulk:nil,QS:nil,BEC:-1,COL:0,OSI :0,OSA:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0 X-CID-BVR: 2,SSN|SDN X-CID-BAS: 2,SSN|SDN,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-CID-RHF: D41D8CD98F00B204E9800998ECF8427E X-UUID: 83bde2fed41011f1afed4741b24580c9-20261029 Received: from mtkmbs14n2.mediatek.inc [(172.21.101.76)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 43116825; Thu, 29 Oct 2026 20:18:02 -0700 Received: from mtkmbs11n1.mediatek.inc (172.21.101.185) by MTKMBS14N2.mediatek.inc (172.21.101.76) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.29; Fri, 30 Oct 2026 11:17:59 +0800 Received: from mtksitap99.mediatek.inc (10.233.130.16) by mtkmbs11n1.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.2562.29 via Frontend Transport; Fri, 30 Oct 2026 11:17:59 +0800 From: Eason Lai To: , CC: , , , , , , , , , , , Subject: [PATCH v1] wifi: mt76: mt792x: Add MTK OUI support for wpa supplicant Date: Fri, 30 Oct 2026 11:17:58 +0800 Message-ID: <20261030031758.3397910-1-eason.lai@mediatek.com> X-Mailer: git-send-email 2.45.2 X-Archived-By: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20261029_201811_724718_ED898E8C X-CRM114-Status: GOOD ( 17.61 ) X-Spam-Score: -2.1 (--) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-mediatek" X-Spam-Status: No, score=-18.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_GIT autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 From: Michael Shih Implement MediaTek OUI vendor command in the mt76 driver by defining a wiphy_vendor_command table with a GET_CHIP_INFO sub-command handler. Signed-off-by: Michael Shih --- drivers/net/wireless/mediatek/mt76/Makefile | 2 +- drivers/net/wireless/mediatek/mt76/mt792x.h | 1 + .../net/wireless/mediatek/mt76/mt792x_core.c | 2 + .../wireless/mediatek/mt76/mt792x_vendor.c | 76 +++++++++++++++++++ .../wireless/mediatek/mt76/mt792x_vendor.h | 36 +++++++++ 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt792x_vendor.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt792x_vendor.h diff --git a/drivers/net/wireless/mediatek/mt76/Makefile b/drivers/net/wireless/mediatek/mt76/Makefile index cacdd2b13d05..90bf68f25cfd 100644 --- a/drivers/net/wireless/mediatek/mt76/Makefile +++ b/drivers/net/wireless/mediatek/mt76/Makefile @@ -38,7 +38,7 @@ mt76x02-usb-y := mt76x02_usb_mcu.o mt76x02_usb_core.o mt76-connac-lib-y := mt76_connac_mcu.o mt76_connac_mac.o mt76_connac3_mac.o mt792x-lib-y := mt792x_core.o mt792x_mac.o mt792x_trace.o \ - mt792x_debugfs.o mt792x_dma.o + mt792x_debugfs.o mt792x_dma.o mt792x_vendor.o mt792x-lib-$(CONFIG_ACPI) += mt792x_acpi_sar.o mt792x-usb-y := mt792x_usb.o diff --git a/drivers/net/wireless/mediatek/mt76/mt792x.h b/drivers/net/wireless/mediatek/mt76/mt792x.h index a7d71e007da0..926e2cadb023 100644 --- a/drivers/net/wireless/mediatek/mt76/mt792x.h +++ b/drivers/net/wireless/mediatek/mt76/mt792x.h @@ -538,6 +538,7 @@ int mt792x_pm_stats(struct seq_file *s, void *data); int mt792x_pm_idle_timeout_set(void *data, u64 val); int mt792x_pm_idle_timeout_get(void *data, u64 *val); int mt792x_init_wiphy(struct ieee80211_hw *hw); +void mt792x_vendor_register(struct ieee80211_hw *hw); struct ieee80211_ops * mt792x_get_mac80211_ops(struct device *dev, const struct ieee80211_ops *mac80211_ops, diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_core.c b/drivers/net/wireless/mediatek/mt76/mt792x_core.c index 3ce6c6ceac81..eb50548c4d51 100644 --- a/drivers/net/wireless/mediatek/mt76/mt792x_core.c +++ b/drivers/net/wireless/mediatek/mt76/mt792x_core.c @@ -854,6 +854,8 @@ int mt792x_init_wiphy(struct ieee80211_hw *hw) hw->max_tx_fragments = 4; + mt792x_vendor_register(hw); + return 0; } EXPORT_SYMBOL_GPL(mt792x_init_wiphy); diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_vendor.c b/drivers/net/wireless/mediatek/mt76/mt792x_vendor.c new file mode 100644 index 000000000000..d1f1560d8641 --- /dev/null +++ b/drivers/net/wireless/mediatek/mt76/mt792x_vendor.c @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: ISC +/* Copyright (C) 2026 MediaTek Inc. */ + +#include +#include +#include + +#include "mt792x.h" +#include "mt792x_vendor.h" + +static const struct nla_policy +mtk_vendor_chip_info_policy[MTK_VENDOR_ATTR_CHIP_INFO_MAX + 1] = { + [MTK_VENDOR_ATTR_CHIP_INFO_ID] = { .type = NLA_U32 }, + [MTK_VENDOR_ATTR_CHIP_INFO_OUI] = { .type = NLA_U32 }, +}; + +static int +mt792x_vendor_get_chip_info(struct wiphy *wiphy, struct wireless_dev *wdev, + const void *data, int data_len) +{ + struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy); + struct mt792x_phy *phy = mt792x_hw_phy(hw); + struct sk_buff *skb; + + /* reply payload: two u32 attributes */ + skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, + 2 * (nla_total_size(sizeof(u32)))); + if (!skb) + return -ENOMEM; + + if (nla_put_u32(skb, MTK_VENDOR_ATTR_CHIP_INFO_ID, + phy->dev->mt76.rev) || + nla_put_u32(skb, MTK_VENDOR_ATTR_CHIP_INFO_OUI, + MTK_NL80211_VENDOR_ID)) { + kfree_skb(skb); + return -ENOBUFS; + } + + return cfg80211_vendor_cmd_reply(skb); +} + +static const struct wiphy_vendor_command mt792x_vendor_commands[] = { + { + .info = { + .vendor_id = MTK_NL80211_VENDOR_ID, + .subcmd = MTK_NL80211_VENDOR_SUBCMD_GET_CHIP_INFO, + }, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV, + .doit = mt792x_vendor_get_chip_info, + .policy = mtk_vendor_chip_info_policy, + .maxattr = MTK_VENDOR_ATTR_CHIP_INFO_MAX, + }, +}; + +static const struct nl80211_vendor_cmd_info mt792x_vendor_events[] = { + [MTK_NL80211_VENDOR_EVENT_CHIP_INFO] = { + .vendor_id = MTK_NL80211_VENDOR_ID, + .subcmd = MTK_NL80211_VENDOR_SUBCMD_GET_CHIP_INFO, + }, +}; + +void mt792x_vendor_register(struct ieee80211_hw *hw) +{ + struct wiphy *wiphy = hw->wiphy; + + wiphy->vendor_commands = mt792x_vendor_commands; + wiphy->n_vendor_commands = ARRAY_SIZE(mt792x_vendor_commands); + wiphy->vendor_events = mt792x_vendor_events; + wiphy->n_vendor_events = ARRAY_SIZE(mt792x_vendor_events); + + dev_info(wiphy->dev.parent, + "mt792x: registered %u vendor cmd(s), OUI=0x%06x\n", + wiphy->n_vendor_commands, MTK_NL80211_VENDOR_ID); +} +EXPORT_SYMBOL_GPL(mt792x_vendor_register); diff --git a/drivers/net/wireless/mediatek/mt76/mt792x_vendor.h b/drivers/net/wireless/mediatek/mt76/mt792x_vendor.h new file mode 100644 index 000000000000..ab728cfd0912 --- /dev/null +++ b/drivers/net/wireless/mediatek/mt76/mt792x_vendor.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: ISC */ +/* Copyright (C) 2026 MediaTek Inc. */ + +#ifndef __MT792X_VENDOR_H +#define __MT792X_VENDOR_H + +/* MediaTek nl80211 vendor OUI (24-bit OUI placed in the low 24 bits). + * This is the value advertised to user space (e.g. wpa_supplicant's + * wiphy_info_handler) via NL80211_ATTR_VENDOR_DATA in the GET_WIPHY reply. + */ +#define MTK_NL80211_VENDOR_ID 0x000ce7 + +/* vendor sub-commands (defined by the vendor) */ +enum mtk_nl80211_vendor_subcmds { + MTK_NL80211_VENDOR_SUBCMD_UNSPEC = 0, + MTK_NL80211_VENDOR_SUBCMD_GET_CHIP_INFO = 1, +}; + +/* vendor event indexes (used by cfg80211_vendor_event*) */ +enum mtk_nl80211_vendor_events { + MTK_NL80211_VENDOR_EVENT_CHIP_INFO = 0, +}; + +/* attributes carried in the GET_CHIP_INFO vendor command reply */ +enum mtk_vendor_attr_chip_info { + MTK_VENDOR_ATTR_CHIP_INFO_INVALID = 0, + MTK_VENDOR_ATTR_CHIP_INFO_ID = 1, + MTK_VENDOR_ATTR_CHIP_INFO_OUI = 2, + + /* keep last */ + __MTK_VENDOR_ATTR_CHIP_INFO_MAX, + MTK_VENDOR_ATTR_CHIP_INFO_MAX = + __MTK_VENDOR_ATTR_CHIP_INFO_MAX - 1, +}; + +#endif /* __MT792X_VENDOR_H */ -- 2.45.2