Linux wireless drivers development
 help / color / mirror / Atom feed
* [RFC rtw-next 1/2] wifi: rtw89: usb: add hw_info sysfs attribute
@ 2026-05-19  7:24 Ping-Ke Shih
  2026-05-19  7:24 ` [RFC rtw-next 2/2] wifi: rtw89: usb: add sysfs write example Ping-Ke Shih
  2026-05-19  7:37 ` [RFC rtw-next 1/2] wifi: rtw89: usb: add hw_info sysfs attribute Ping-Ke Shih
  0 siblings, 2 replies; 7+ messages in thread
From: Ping-Ke Shih @ 2026-05-19  7:24 UTC (permalink / raw)
  To: linux-wireless; +Cc: wenjie.tsai

From: Johnson Tsai <wenjie.tsai@realtek.com>

Expose the device's Serial Number (SN) and UUID from EFUSE through a
read-only `hw_info` sysfs attribute on the USB interface device.

This hardware identification information is essential for user-space
applications to uniquely identify, track, and manage specific Wi-Fi
adapters. For example, in automated factory provisioning or device
management systems, user-space tools rely on the EFUSE SN and UUID
to bind specific configurations to a physical adapter. Currently,
standard wireless APIs do not expose this low-level hardware
information, making this sysfs node the only viable and necessary
solution for user space to extract this data.

Relying on debugfs or setuid binaries is unviable for production
environments, as explicitly requested by Valve (Steam). Steam frequently
runs inside unprivileged containers (e.g., Flatpak) where debugfs and
setuid binaries are inaccessible. Furthermore, many end-user systems
disable debugfs in their kernel configs, and strict access controls
(SELinux, AppArmor) block it regardless of permissions. Since Steam
installs as an unprivileged user, setuid deployments are impossible.
Consequently, exposing this data via a world-readable (0444) sysfs
node is the only functional approach to ensure reliable, unprivileged
access across diverse customer systems.

Example usage from user-space:
  $ cat /sys/bus/usb/devices/2-3.1.2:1.0/hw_info
  SN: 36 42 00 01 23
  UUID: aa ec 2b 7c 0a 55 47 27 8d e0 b3 0f eb cc bb aa

User-space scripts can easily iterate over bound devices to extract
this information:
  for dev in /sys/bus/usb/drivers/rtw89_8852cu/[0-9]*:*; do
      dev_id=$(basename "$dev")
      echo "--- Device: /sys/bus/usb/devices/$dev_id ---"
      cat "$dev/hw_info"
  done

Signed-off-by: Johnson Tsai <wenjie.tsai@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
Hi maintainers,

We are submitting this RFC to discuss the most appropriate upstream path for
exposing hardware-specific IDs to unprivileged container environments.

1. Given the strict environment limitations (Flatpak, missing debugfs, LSMs),
   is a read-only sysfs attribute acceptable for this specific hardware data?
2. If exposing this globally via sysfs is not preferred, would it be acceptable
   to restrict the creation of this node to specific vendor VID/PIDs only?
3. If sysfs is strictly a no-go for this use case, what is the upstream-recommended
   method for an unprivileged, sandboxed application to retrieve eFuse data?
---
 drivers/net/wireless/realtek/rtw89/usb.c | 51 +++++++++++++++++++++++-
 1 file changed, 50 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtw89/usb.c b/drivers/net/wireless/realtek/rtw89/usb.c
index c6d55e669776..53dcb84af5c0 100644
--- a/drivers/net/wireless/realtek/rtw89/usb.c
+++ b/drivers/net/wireless/realtek/rtw89/usb.c
@@ -1059,6 +1059,41 @@ static void rtw89_usb_intf_deinit(struct rtw89_dev *rtwdev,
 	usb_set_intfdata(intf, NULL);
 }
 
+static ssize_t hw_info_show(struct device *dev,
+			    struct device_attribute *attr, char *buf)
+{
+	struct usb_interface *intf = to_usb_interface(dev);
+	struct ieee80211_hw *hw;
+	struct rtw89_dev *rtwdev;
+	struct rtw89_efuse *efuse;
+	ssize_t ret;
+
+	device_lock(dev);
+
+	hw = usb_get_intfdata(intf);
+	if (!hw) {
+		device_unlock(dev);
+		return -ENODEV;
+	}
+
+	rtwdev = hw->priv;
+	efuse = &rtwdev->efuse;
+
+	ret = sysfs_emit(buf, "SN: %*ph\nUUID: %*ph\n",
+			 (int)sizeof(efuse->sn), efuse->sn,
+			 (int)sizeof(efuse->uuid), efuse->uuid);
+
+	device_unlock(dev);
+	return ret;
+}
+static DEVICE_ATTR_RO(hw_info);
+
+static struct attribute *rtw89_usb_attrs[] = {
+	&dev_attr_hw_info.attr,
+	NULL,
+};
+ATTRIBUTE_GROUPS(rtw89_usb);
+
 int rtw89_usb_probe(struct usb_interface *intf,
 		    const struct usb_device_id *id)
 {
@@ -1118,10 +1153,16 @@ int rtw89_usb_probe(struct usb_interface *intf,
 		goto err_core_deinit;
 	}
 
+	ret = sysfs_create_groups(&intf->dev.kobj, rtw89_usb_groups);
+	if (ret) {
+		rtw89_err(rtwdev, "failed to create sysfs groups: %d\n", ret);
+		goto err_core_deinit;
+	}
+
 	ret = rtw89_core_register(rtwdev);
 	if (ret) {
 		rtw89_err(rtwdev, "failed to register core\n");
-		goto err_core_deinit;
+		goto err_remove_sysfs;
 	}
 
 	rtw89_usb_start_rx(rtwdev);
@@ -1130,6 +1171,8 @@ int rtw89_usb_probe(struct usb_interface *intf,
 
 	return 0;
 
+err_remove_sysfs:
+	sysfs_remove_groups(&intf->dev.kobj, rtw89_usb_groups);
 err_core_deinit:
 	rtw89_core_deinit(rtwdev);
 err_deinit_rx:
@@ -1154,12 +1197,18 @@ void rtw89_usb_disconnect(struct usb_interface *intf)
 	if (!hw)
 		return;
 
+	/* Clear intfdata immediately so any concurrent sysfs show waiting on
+	 * device_lock will see NULL and bail out safely.
+	 */
+	usb_set_intfdata(intf, NULL);
+
 	rtwdev = hw->priv;
 	rtwusb = rtw89_usb_priv(rtwdev);
 
 	rtw89_usb_cancel_rx_bufs(rtwusb);
 	rtw89_usb_cancel_tx_bufs(rtwusb);
 
+	sysfs_remove_groups(&intf->dev.kobj, rtw89_usb_groups);
 	rtw89_core_unregister(rtwdev);
 	rtw89_core_deinit(rtwdev);
 	rtw89_usb_deinit_rx(rtwdev);

base-commit: 7076af642955693935e60bc94546d105fb0395ca
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-05-20 11:36 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-19  7:24 [RFC rtw-next 1/2] wifi: rtw89: usb: add hw_info sysfs attribute Ping-Ke Shih
2026-05-19  7:24 ` [RFC rtw-next 2/2] wifi: rtw89: usb: add sysfs write example Ping-Ke Shih
2026-05-19  7:37 ` [RFC rtw-next 1/2] wifi: rtw89: usb: add hw_info sysfs attribute Ping-Ke Shih
2026-05-19 12:11   ` Johannes Berg
2026-05-19 12:22     ` Greg KH
2026-05-20  9:41       ` Johnson Tsai
2026-05-20 11:36         ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox