mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 15:32:33 +00:00
97f542238a
Backporting upstream patches to improve RTL8188F support. Signed-off-by: Shiji Yang <yangshiji66@qq.com>
138 lines
4.0 KiB
Diff
138 lines
4.0 KiB
Diff
From eef55f1545c92c7181d5083453dee1296298ad3e Mon Sep 17 00:00:00 2001
|
|
From: Martin Kaistra <martin.kaistra@linutronix.de>
|
|
Date: Fri, 22 Dec 2023 11:14:35 +0100
|
|
Subject: [PATCH 14/21] wifi: rtl8xxxu: support multiple interfaces in
|
|
{add,remove}_interface()
|
|
|
|
Add a custom struct to store in vif->drv_priv with a reference to
|
|
port_num and fill it when a new interface is added. Choose a free
|
|
port_num for the newly added interface.
|
|
|
|
As we only want to support AP mode/sending beacons on port 0, only change
|
|
the beacon settings if a new interface is actually assigned to port 0.
|
|
|
|
Call set_linktype() and set_mac() with the appropriate port_num.
|
|
|
|
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
|
|
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
|
|
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
|
Link: https://msgid.link/20231222101442.626837-15-martin.kaistra@linutronix.de
|
|
---
|
|
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 4 ++
|
|
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 52 +++++++++++--------
|
|
2 files changed, 34 insertions(+), 22 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
|
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
|
|
@@ -1921,6 +1921,10 @@ struct rtl8xxxu_sta_info {
|
|
u8 macid;
|
|
};
|
|
|
|
+struct rtl8xxxu_vif {
|
|
+ int port_num;
|
|
+};
|
|
+
|
|
struct rtl8xxxu_rx_urb {
|
|
struct urb urb;
|
|
struct ieee80211_hw *hw;
|
|
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
|
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
|
|
@@ -6610,28 +6610,33 @@ error:
|
|
static int rtl8xxxu_add_interface(struct ieee80211_hw *hw,
|
|
struct ieee80211_vif *vif)
|
|
{
|
|
+ struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
|
struct rtl8xxxu_priv *priv = hw->priv;
|
|
- int ret;
|
|
+ int port_num;
|
|
u8 val8;
|
|
|
|
- if (!priv->vif) {
|
|
- priv->vif = vif;
|
|
- priv->vifs[0] = vif;
|
|
- } else {
|
|
+ if (!priv->vifs[0])
|
|
+ port_num = 0;
|
|
+ else if (!priv->vifs[1])
|
|
+ port_num = 1;
|
|
+ else
|
|
return -EOPNOTSUPP;
|
|
- }
|
|
|
|
switch (vif->type) {
|
|
case NL80211_IFTYPE_STATION:
|
|
- rtl8xxxu_stop_tx_beacon(priv);
|
|
+ if (port_num == 0) {
|
|
+ rtl8xxxu_stop_tx_beacon(priv);
|
|
|
|
- val8 = rtl8xxxu_read8(priv, REG_BEACON_CTRL);
|
|
- val8 |= BEACON_ATIM | BEACON_FUNCTION_ENABLE |
|
|
- BEACON_DISABLE_TSF_UPDATE;
|
|
- rtl8xxxu_write8(priv, REG_BEACON_CTRL, val8);
|
|
- ret = 0;
|
|
+ val8 = rtl8xxxu_read8(priv, REG_BEACON_CTRL);
|
|
+ val8 |= BEACON_ATIM | BEACON_FUNCTION_ENABLE |
|
|
+ BEACON_DISABLE_TSF_UPDATE;
|
|
+ rtl8xxxu_write8(priv, REG_BEACON_CTRL, val8);
|
|
+ }
|
|
break;
|
|
case NL80211_IFTYPE_AP:
|
|
+ if (port_num == 1)
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
rtl8xxxu_write8(priv, REG_BEACON_CTRL,
|
|
BEACON_DISABLE_TSF_UPDATE | BEACON_CTRL_MBSSID);
|
|
rtl8xxxu_write8(priv, REG_ATIMWND, 0x0c); /* 12ms */
|
|
@@ -6648,31 +6653,32 @@ static int rtl8xxxu_add_interface(struct
|
|
val8 = rtl8xxxu_read8(priv, REG_CCK_CHECK);
|
|
val8 &= ~BIT_BCN_PORT_SEL;
|
|
rtl8xxxu_write8(priv, REG_CCK_CHECK, val8);
|
|
-
|
|
- ret = 0;
|
|
break;
|
|
default:
|
|
- ret = -EOPNOTSUPP;
|
|
+ return -EOPNOTSUPP;
|
|
}
|
|
|
|
- rtl8xxxu_set_linktype(priv, vif->type, 0);
|
|
+ priv->vifs[port_num] = vif;
|
|
+ priv->vif = vif;
|
|
+ rtlvif->port_num = port_num;
|
|
+
|
|
+ rtl8xxxu_set_linktype(priv, vif->type, port_num);
|
|
ether_addr_copy(priv->mac_addr, vif->addr);
|
|
- rtl8xxxu_set_mac(priv, 0);
|
|
+ rtl8xxxu_set_mac(priv, port_num);
|
|
|
|
- return ret;
|
|
+ return 0;
|
|
}
|
|
|
|
static void rtl8xxxu_remove_interface(struct ieee80211_hw *hw,
|
|
struct ieee80211_vif *vif)
|
|
{
|
|
+ struct rtl8xxxu_vif *rtlvif = (struct rtl8xxxu_vif *)vif->drv_priv;
|
|
struct rtl8xxxu_priv *priv = hw->priv;
|
|
|
|
dev_dbg(&priv->udev->dev, "%s\n", __func__);
|
|
|
|
- if (priv->vif) {
|
|
- priv->vif = NULL;
|
|
- priv->vifs[0] = NULL;
|
|
- }
|
|
+ priv->vif = NULL;
|
|
+ priv->vifs[rtlvif->port_num] = NULL;
|
|
}
|
|
|
|
static int rtl8xxxu_config(struct ieee80211_hw *hw, u32 changed)
|
|
@@ -7661,6 +7667,8 @@ static int rtl8xxxu_probe(struct usb_int
|
|
if (ret)
|
|
goto err_set_intfdata;
|
|
|
|
+ hw->vif_data_size = sizeof(struct rtl8xxxu_vif);
|
|
+
|
|
hw->wiphy->max_scan_ssids = 1;
|
|
hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
|
|
if (priv->fops->max_macid_num)
|