lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250625142541.44795-1-yakoyoku@gmail.com>
Date: Wed, 25 Jun 2025 11:25:39 -0300
From: Martin Rodriguez Reboredo <yakoyoku@...il.com>
To: linux-wireless@...r.kernel.org
Cc: Jes Sorensen <Jes.Sorensen@...il.com>,
	Ping-Ke Shih <pkshih@...ltek.com>,
	linux-kernel@...r.kernel.org
Subject: [PATCH] wifi: rtl8xxxu: toggle P2P for supported devices

This is a MR to see if rtl8xxxu can be made to support P2P.

Theoretically this should be handled by mac80211 but it seems that
drivers may have to take some extra steps depending on which device we
are talking about. I know that this patch is so basic that it might be
missing some H2C commands or similar for this to work on Realtek chips
but I don't have the required knowledge for me to implement it, so if
you know a place to read about I'll be glad to hear.

As of now only rtl8192ex devices have their P2P_CLIENT and P2P_GO wiphy
interface modes ensured because those are the only ones I can test on
my rtl8192eu card. The rest of chips have them set from what I've seen
in a cursory Internet search, they might or might not work.

Signed-off-by: Martin Rodriguez Reboredo <yakoyoku@...il.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/8188e.c |  1 +
 drivers/net/wireless/realtek/rtl8xxxu/8188f.c |  1 +
 drivers/net/wireless/realtek/rtl8xxxu/8192c.c |  1 +
 drivers/net/wireless/realtek/rtl8xxxu/8192e.c |  1 +
 drivers/net/wireless/realtek/rtl8xxxu/8192f.c |  1 +
 drivers/net/wireless/realtek/rtl8xxxu/8710b.c |  1 +
 drivers/net/wireless/realtek/rtl8xxxu/8723a.c |  1 +
 drivers/net/wireless/realtek/rtl8xxxu/8723b.c |  1 +
 drivers/net/wireless/realtek/rtl8xxxu/core.c  | 29 ++++++++++++++++++-
 .../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h  |  1 +
 10 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/8188e.c b/drivers/net/wireless/realtek/rtl8xxxu/8188e.c
index 766a7a7c7d28..f4f5ad7d88e5 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/8188e.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/8188e.c
@@ -1866,6 +1866,7 @@ struct rtl8xxxu_fileops rtl8188eu_fops = {
 	.has_tx_report = 1,
 	.init_reg_pkt_life_time = 1,
 	.gen2_thermal_meter = 1,
+	.supports_p2p = 0,
 	.max_sec_cam_num = 32,
 	.adda_1t_init = 0x0b1b25a0,
 	.adda_1t_path_on = 0x0bdb25a0,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/8188f.c b/drivers/net/wireless/realtek/rtl8xxxu/8188f.c
index 3abf14d7044f..3102384b35eb 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/8188f.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/8188f.c
@@ -1749,6 +1749,7 @@ struct rtl8xxxu_fileops rtl8188fu_fops = {
 	.ustime_tsf_edca = 0x28,
 	.max_aggr_num = 0x0c14,
 	.supports_ap = 1,
+	.supports_p2p = 1,
 	.max_macid_num = 16,
 	.max_sec_cam_num = 16,
 	.supports_concurrent = 1,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/8192c.c b/drivers/net/wireless/realtek/rtl8xxxu/8192c.c
index 73034e7e41d1..df9cb7e0e331 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/8192c.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/8192c.c
@@ -645,6 +645,7 @@ struct rtl8xxxu_fileops rtl8192cu_fops = {
 	.tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
 	.rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
 	.supports_ap = 1,
+	.supports_p2p = 1,
 	.max_macid_num = 32,
 	.max_sec_cam_num = 32,
 	.adda_1t_init = 0x0b1b25a0,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/8192e.c b/drivers/net/wireless/realtek/rtl8xxxu/8192e.c
index 8e123bbfc665..f6cdd0eb5b44 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/8192e.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/8192e.c
@@ -1752,6 +1752,7 @@ struct rtl8xxxu_fileops rtl8192eu_fops = {
 	.gen2_thermal_meter = 1,
 	.needs_full_init = 1,
 	.supports_ap = 1,
+	.supports_p2p = 1,
 	.max_macid_num = 128,
 	.max_sec_cam_num = 64,
 	.adda_1t_init = 0x0fc01616,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/8192f.c b/drivers/net/wireless/realtek/rtl8xxxu/8192f.c
index cd2156b7a57a..2a505350e6e8 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/8192f.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/8192f.c
@@ -2078,6 +2078,7 @@ struct rtl8xxxu_fileops rtl8192fu_fops = {
 	.ustime_tsf_edca = 0x50,
 	.max_aggr_num = 0x1f1f,
 	.supports_ap = 1,
+	.supports_p2p = 1,
 	.max_macid_num = 128,
 	.max_sec_cam_num = 64,
 	.trxff_boundary = 0x3f3f,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/8710b.c b/drivers/net/wireless/realtek/rtl8xxxu/8710b.c
index 11c63c320eae..242296a57c92 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/8710b.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/8710b.c
@@ -1860,6 +1860,7 @@ struct rtl8xxxu_fileops rtl8710bu_fops = {
 	.ustime_tsf_edca = 0x28,
 	.max_aggr_num = 0x0c14,
 	.supports_ap = 1,
+	.supports_p2p = 0,
 	.max_macid_num = 16,
 	.max_sec_cam_num = 32,
 	.adda_1t_init = 0x03c00016,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/8723a.c b/drivers/net/wireless/realtek/rtl8xxxu/8723a.c
index ecbc324e4609..381fde571858 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/8723a.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/8723a.c
@@ -519,6 +519,7 @@ struct rtl8xxxu_fileops rtl8723au_fops = {
 	.rx_agg_buf_size = 16000,
 	.tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
 	.rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
+	.supports_p2p = 0,
 	.max_sec_cam_num = 32,
 	.adda_1t_init = 0x0b1b25a0,
 	.adda_1t_path_on = 0x0bdb25a0,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/8723b.c b/drivers/net/wireless/realtek/rtl8xxxu/8723b.c
index cc2e60b06f64..9837580e316e 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/8723b.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/8723b.c
@@ -1750,6 +1750,7 @@ struct rtl8xxxu_fileops rtl8723bu_fops = {
 	.ustime_tsf_edca = 0x50,
 	.max_aggr_num = 0x0c14,
 	.supports_ap = 1,
+	.supports_p2p = 1,
 	.max_macid_num = 128,
 	.max_sec_cam_num = 64,
 	.adda_1t_init = 0x01c00014,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/core.c b/drivers/net/wireless/realtek/rtl8xxxu/core.c
index 569856ca677f..ac2691d6f991 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/core.c
@@ -1600,9 +1600,11 @@ static void rtl8xxxu_set_linktype(struct rtl8xxxu_priv *priv,
 	case NL80211_IFTYPE_ADHOC:
 		type = MSR_LINKTYPE_ADHOC;
 		break;
+	case NL80211_IFTYPE_P2P_CLIENT:
 	case NL80211_IFTYPE_STATION:
 		type = MSR_LINKTYPE_STATION;
 		break;
+	case NL80211_IFTYPE_P2P_GO:
 	case NL80211_IFTYPE_AP:
 		type = MSR_LINKTYPE_AP;
 		break;
@@ -6780,6 +6782,7 @@ static int rtl8xxxu_add_interface(struct ieee80211_hw *hw,
 		return -EOPNOTSUPP;
 
 	switch (vif->type) {
+	case NL80211_IFTYPE_P2P_CLIENT:
 	case NL80211_IFTYPE_STATION:
 		if (port_num == 0) {
 			rtl8xxxu_stop_tx_beacon(priv);
@@ -6790,6 +6793,7 @@ static int rtl8xxxu_add_interface(struct ieee80211_hw *hw,
 			rtl8xxxu_write8(priv, REG_BEACON_CTRL, val8);
 		}
 		break;
+	case NL80211_IFTYPE_P2P_GO:
 	case NL80211_IFTYPE_AP:
 		if (port_num == 1) {
 			rtl8xxxu_switch_ports(priv);
@@ -6839,6 +6843,23 @@ static void rtl8xxxu_remove_interface(struct ieee80211_hw *hw,
 	priv->vifs[rtlvif->port_num] = NULL;
 }
 
+static int rtl8xxxu_change_interface(struct ieee80211_hw *hw,
+				     struct ieee80211_vif *vif,
+				     enum nl80211_iftype new_type, bool p2p)
+{
+	struct rtl8xxxu_priv *priv = hw->priv;
+	int ret;
+
+	dev_dbg(&priv->udev->dev, "%s: p2p %x\n", __func__, p2p);
+
+	rtl8xxxu_remove_interface(hw, vif);
+	vif->type = new_type;
+	vif->p2p = p2p;
+	ret = rtl8xxxu_add_interface(hw, vif);
+
+	return ret;
+}
+
 static int rtl8xxxu_config(struct ieee80211_hw *hw, u32 changed)
 {
 	struct rtl8xxxu_priv *priv = hw->priv;
@@ -7623,6 +7644,7 @@ static const struct ieee80211_ops rtl8xxxu_ops = {
 	.tx = rtl8xxxu_tx,
 	.wake_tx_queue = ieee80211_handle_wake_tx_queue,
 	.add_interface = rtl8xxxu_add_interface,
+	.change_interface = rtl8xxxu_change_interface,
 	.remove_interface = rtl8xxxu_remove_interface,
 	.config = rtl8xxxu_config,
 	.conf_tx = rtl8xxxu_conf_tx,
@@ -7755,7 +7777,9 @@ static void rtl8xxxu_deinit_led(struct rtl8xxxu_priv *priv)
 
 static const struct ieee80211_iface_limit rtl8xxxu_limits[] = {
 	{ .max = 2, .types = BIT(NL80211_IFTYPE_STATION), },
-	{ .max = 1, .types = BIT(NL80211_IFTYPE_AP), },
+	{ .max = 1, .types = BIT(NL80211_IFTYPE_AP) |
+			     BIT(NL80211_IFTYPE_P2P_CLIENT) |
+			     BIT(NL80211_IFTYPE_P2P_GO), },
 };
 
 static const struct ieee80211_iface_combination rtl8xxxu_combinations[] = {
@@ -7912,6 +7936,9 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
 	hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
 	if (priv->fops->supports_ap)
 		hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP);
+	if (priv->fops->supports_p2p)
+		hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
+					      BIT(NL80211_IFTYPE_P2P_GO);
 	hw->queues = 4;
 
 	hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index f42463e595cc..7a0a9fd20cdf 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -2013,6 +2013,7 @@ struct rtl8xxxu_fileops {
 	u8 ustime_tsf_edca;
 	u16 max_aggr_num;
 	u8 supports_ap:1;
+	u8 supports_p2p:1;
 	u16 max_macid_num;
 	u16 max_sec_cam_num;
 	u32 adda_1t_init;
-- 
2.50.0


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ