* [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f
@ 2023-04-28 15:08 Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 01/18] wifi: rtl8xxxu: Add start_ap() callback Martin Kaistra
` (19 more replies)
0 siblings, 20 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
This series intends to bring AP mode support to the rtl8xxxu driver,
more specifically for the 8188f, because this is the HW I have.
The work is based on the vendor driver as I do not have access to
datasheets.
The iperf3 measurements for TCP in AP mode still look slower in the
AP->STA direction compared to the vendor driver, UDP looks fine. I still
hope, this can be fixed by future patches.
Thanks,
Martin
v4 changelog:
- restructured beacon enable code in bss_info_changed
v3 changelog:
- add some R-bs
- remove priv->beacon_enabled
- rename max_sta_num to max_macid_num
v2 changelog:
- dropped RFC prefix
- rebase patches to newest wireless-next
- add some R-bs
- new patch: "Add parameter force to rtl8xxxu_refresh_rate_mask"
- new patch: "Remove usage of ieee80211_get_tx_rate()"
- new patch: "Remove usage of tx_info->control.rates[0].flags"
- new patch: "Set maximum number of supported stations"
- add macro for broadcast/multicast frames macid
- add more explanation about beacon queue in commit message of patch 2
- add macros for bit definitions for beacon functions
- implement enable_beacon = false case
- fix beacon valid loop so that error condition is actually reached
- add more explanation about setting mac address register in add_interface
in commit message of patch 6
- rename role macros for connect report h2c
- use bitmap for assigning macids
- add helper function for looking up assigned macids
- move patch 7 so we can use rtl8xxxu_get_macid helper
- add sta_remove callback
- do things in sta_add only in AP mode
- use IEEE80211_TX_CTL_ASSIGN_SEQ flag to determine when to use HW sequence
numbers
- add priv->vif null pointer check in configure_filter, rework setting
BSSID_BEACON/BSSID_MATCH in RCR
v1: https://lore.kernel.org/linux-wireless/20230322171905.492855-1-martin.kaistra@linutronix.de/
v2: https://lore.kernel.org/linux-wireless/20230419100145.159191-1-martin.kaistra@linutronix.de/
v3: https://lore.kernel.org/linux-wireless/20230427090922.165088-1-martin.kaistra@linutronix.de/
Martin Kaistra (18):
wifi: rtl8xxxu: Add start_ap() callback
wifi: rtl8xxxu: Select correct queue for beacon frames
wifi: rtl8xxxu: Add beacon functions
wifi: rtl8xxxu: Add set_tim() callback
wifi: rtl8xxxu: Allow setting rts threshold to -1
wifi: rtl8xxxu: Allow creating interface in AP mode
wifi: rtl8xxxu: Actually use macid in rtl8xxxu_gen2_report_connect
wifi: rtl8xxxu: Add parameter role to report_connect
wifi: rtl8xxxu: Add parameter force to rtl8xxxu_refresh_rate_mask
wifi: rtl8xxxu: Add sta_add() and sta_remove() callbacks
wifi: rtl8xxxu: Put the macid in txdesc
wifi: rtl8xxxu: Add parameter macid to update_rate_mask
wifi: rtl8xxxu: Enable hw seq for mgmt/non-QoS data frames
wifi: rtl8xxxu: Clean up filter configuration
wifi: rtl8xxxu: Remove usage of ieee80211_get_tx_rate()
wifi: rtl8xxxu: Remove usage of tx_info->control.rates[0].flags
wifi: rtl8xxxu: Declare AP mode support for 8188f
wifi: rtl8xxxu: Set maximum number of supported stations
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 37 +-
.../realtek/rtl8xxxu/rtl8xxxu_8188e.c | 3 +-
.../realtek/rtl8xxxu/rtl8xxxu_8188f.c | 2 +
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 337 ++++++++++++++----
.../wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h | 5 +
5 files changed, 300 insertions(+), 84 deletions(-)
--
2.30.2
^ permalink raw reply [flat|nested] 25+ messages in thread
* [PATCH v4 01/18] wifi: rtl8xxxu: Add start_ap() callback
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-05-05 7:32 ` Kalle Valo
2023-04-28 15:08 ` [PATCH v4 02/18] wifi: rtl8xxxu: Select correct queue for beacon frames Martin Kaistra
` (18 subsequent siblings)
19 siblings, 1 reply; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
This gets called at the start of AP mode operation. Set bssid, beacon
interval and send a connect report to the HW.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 15 +++++++++++++++
2 files changed, 16 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 8eafbf1cee718..9cd6d171e9933 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -1727,6 +1727,7 @@ struct rtl8xxxu_cfo_tracking {
};
#define RTL8XXXU_HW_LED_CONTROL 2
+#define RTL8XXXU_BC_MC_MACID 0
struct rtl8xxxu_priv {
struct ieee80211_hw *hw;
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index fd8c8c6d53d60..b8fcf911c072e 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -4968,6 +4968,20 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
return;
}
+static int rtl8xxxu_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+ struct ieee80211_bss_conf *link_conf)
+{
+ struct rtl8xxxu_priv *priv = hw->priv;
+ struct device *dev = &priv->udev->dev;
+
+ dev_dbg(dev, "Start AP mode\n");
+ rtl8xxxu_set_bssid(priv, vif->bss_conf.bssid);
+ rtl8xxxu_write16(priv, REG_BCN_INTERVAL, vif->bss_conf.beacon_int);
+ priv->fops->report_connect(priv, RTL8XXXU_BC_MC_MACID, true);
+
+ return 0;
+}
+
static u32 rtl8xxxu_80211_to_rtl_queue(u32 queue)
{
u32 rtlqueue;
@@ -7093,6 +7107,7 @@ static const struct ieee80211_ops rtl8xxxu_ops = {
.config = rtl8xxxu_config,
.conf_tx = rtl8xxxu_conf_tx,
.bss_info_changed = rtl8xxxu_bss_info_changed,
+ .start_ap = rtl8xxxu_start_ap,
.configure_filter = rtl8xxxu_configure_filter,
.set_rts_threshold = rtl8xxxu_set_rts_threshold,
.start = rtl8xxxu_start,
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 02/18] wifi: rtl8xxxu: Select correct queue for beacon frames
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 01/18] wifi: rtl8xxxu: Add start_ap() callback Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 03/18] wifi: rtl8xxxu: Add beacon functions Martin Kaistra
` (17 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Use the special beacon queue for beacon frames instead of the management
frame queue. They will be put in a special area called reserved page and
send out periodically when in AP mode.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index b8fcf911c072e..9dc6f3ec7a305 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -5010,7 +5010,9 @@ static u32 rtl8xxxu_queue_select(struct ieee80211_hdr *hdr, struct sk_buff *skb)
{
u32 queue;
- if (ieee80211_is_mgmt(hdr->frame_control))
+ if (unlikely(ieee80211_is_beacon(hdr->frame_control)))
+ queue = TXDESC_QUEUE_BEACON;
+ else if (ieee80211_is_mgmt(hdr->frame_control))
queue = TXDESC_QUEUE_MGNT;
else
queue = rtl8xxxu_80211_to_rtl_queue(skb_get_queue_mapping(skb));
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 03/18] wifi: rtl8xxxu: Add beacon functions
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 01/18] wifi: rtl8xxxu: Add start_ap() callback Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 02/18] wifi: rtl8xxxu: Select correct queue for beacon frames Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-05-02 1:24 ` Ping-Ke Shih
2023-04-28 15:08 ` [PATCH v4 04/18] wifi: rtl8xxxu: Add set_tim() callback Martin Kaistra
` (16 subsequent siblings)
19 siblings, 1 reply; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Add a workqueue to update the beacon contents asynchronously and
implement downloading the beacon to the HW and starting beacon tx like
the vendor driver.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
---
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 75 +++++++++++++++++++
.../wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h | 3 +
3 files changed, 79 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 9cd6d171e9933..971f1cc38d323 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -1851,6 +1851,7 @@ struct rtl8xxxu_priv {
struct delayed_work ra_watchdog;
struct work_struct c2hcmd_work;
struct sk_buff_head c2hcmd_queue;
+ struct work_struct update_beacon_work;
struct rtl8xxxu_btcoex bt_coex;
struct rtl8xxxu_ra_report ra_report;
struct rtl8xxxu_cfo_tracking cfo_tracking;
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index 9dc6f3ec7a305..a152e5c9ea691 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -1185,6 +1185,20 @@ static void rtl8xxxu_stop_tx_beacon(struct rtl8xxxu_priv *priv)
rtl8xxxu_write8(priv, REG_TBTT_PROHIBIT + 2, val8);
}
+static void rtl8xxxu_start_tx_beacon(struct rtl8xxxu_priv *priv)
+{
+ u8 val8;
+
+ val8 = rtl8xxxu_read8(priv, REG_FWHW_TXQ_CTRL + 2);
+ val8 |= EN_BCNQ_DL >> 16;
+ rtl8xxxu_write8(priv, REG_FWHW_TXQ_CTRL + 2, val8);
+
+ rtl8xxxu_write8(priv, REG_TBTT_PROHIBIT + 1, 0x80);
+ val8 = rtl8xxxu_read8(priv, REG_TBTT_PROHIBIT + 2);
+ val8 &= 0xF0;
+ rtl8xxxu_write8(priv, REG_TBTT_PROHIBIT + 2, val8);
+}
+
/*
* The rtl8723a has 3 channel groups for it's efuse settings. It only
@@ -4964,6 +4978,17 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
dev_dbg(dev, "Changed BASIC_RATES!\n");
rtl8xxxu_set_basic_rates(priv, bss_conf->basic_rates);
}
+
+ if (changed & BSS_CHANGED_BEACON_ENABLED) {
+ if (bss_conf->enable_beacon)
+ rtl8xxxu_start_tx_beacon(priv);
+ else
+ rtl8xxxu_stop_tx_beacon(priv);
+ }
+
+ if (changed & BSS_CHANGED_BEACON)
+ schedule_work(&priv->update_beacon_work);
+
error:
return;
}
@@ -5545,6 +5570,55 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
dev_kfree_skb(skb);
}
+static void rtl8xxxu_send_beacon_frame(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif)
+{
+ struct rtl8xxxu_priv *priv = hw->priv;
+ struct sk_buff *skb = ieee80211_beacon_get(hw, vif, 0);
+ struct device *dev = &priv->udev->dev;
+ int retry;
+ u8 val8;
+
+ /* BCN_VALID, write 1 to clear, cleared by SW */
+ val8 = rtl8xxxu_read8(priv, REG_TDECTRL + 2);
+ val8 |= BIT_BCN_VALID >> 16;
+ rtl8xxxu_write8(priv, REG_TDECTRL + 2, val8);
+
+ /* SW_BCN_SEL - Port0 */
+ val8 = rtl8xxxu_read8(priv, REG_DWBCN1_CTRL_8723B + 2);
+ val8 &= ~(BIT_SW_BCN_SEL >> 16);
+ rtl8xxxu_write8(priv, REG_DWBCN1_CTRL_8723B + 2, val8);
+
+ if (skb)
+ rtl8xxxu_tx(hw, NULL, skb);
+
+ retry = 100;
+ do {
+ val8 = rtl8xxxu_read8(priv, REG_TDECTRL + 2);
+ if (val8 & (BIT_BCN_VALID >> 16))
+ break;
+ usleep_range(10, 20);
+ } while (--retry);
+
+ if (!retry)
+ dev_err(dev, "%s: Failed to read beacon valid bit\n", __func__);
+}
+
+static void rtl8xxxu_update_beacon_work_callback(struct work_struct *work)
+{
+ struct rtl8xxxu_priv *priv =
+ container_of(work, struct rtl8xxxu_priv, update_beacon_work);
+ struct ieee80211_hw *hw = priv->hw;
+ struct ieee80211_vif *vif = priv->vif;
+
+ if (!vif) {
+ WARN_ONCE(true, "no vif to update beacon\n");
+ return;
+ }
+
+ rtl8xxxu_send_beacon_frame(hw, vif);
+}
+
void rtl8723au_rx_parse_phystats(struct rtl8xxxu_priv *priv,
struct ieee80211_rx_status *rx_status,
struct rtl8723au_phy_stats *phy_stats,
@@ -7311,6 +7385,7 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
spin_lock_init(&priv->rx_urb_lock);
INIT_WORK(&priv->rx_urb_wq, rtl8xxxu_rx_urb_work);
INIT_DELAYED_WORK(&priv->ra_watchdog, rtl8xxxu_watchdog_callback);
+ INIT_WORK(&priv->update_beacon_work, rtl8xxxu_update_beacon_work_callback);
skb_queue_head_init(&priv->c2hcmd_queue);
usb_set_intfdata(interface, hw);
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
index 4dffbab494c3b..ad285e4ac0ec4 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
@@ -456,6 +456,7 @@
#define REG_FIFOPAGE 0x0204
#define REG_TDECTRL 0x0208
+#define BIT_BCN_VALID BIT(16)
#define REG_DWBCN0_CTRL_8188F REG_TDECTRL
@@ -470,6 +471,7 @@
#define AUTO_LLT_INIT_LLT BIT(16)
#define REG_DWBCN1_CTRL_8723B 0x0228
+#define BIT_SW_BCN_SEL BIT(20)
/* 0x0280 ~ 0x02FF RXDMA Configuration */
#define REG_RXDMA_AGG_PG_TH 0x0280 /* 0-7 : USB DMA size bits
@@ -516,6 +518,7 @@
#define REG_FWHW_TXQ_CTRL 0x0420
#define FWHW_TXQ_CTRL_AMPDU_RETRY BIT(7)
#define FWHW_TXQ_CTRL_XMIT_MGMT_ACK BIT(12)
+#define EN_BCNQ_DL BIT(22)
#define REG_HWSEQ_CTRL 0x0423
#define REG_TXPKTBUF_BCNQ_BDNY 0x0424
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 04/18] wifi: rtl8xxxu: Add set_tim() callback
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (2 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 03/18] wifi: rtl8xxxu: Add beacon functions Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 05/18] wifi: rtl8xxxu: Allow setting rts threshold to -1 Martin Kaistra
` (15 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Update beacon content if TIM bitmap maintained by mac80211 is changed.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index a152e5c9ea691..37794739c71c8 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -4503,6 +4503,16 @@ int rtl8xxxu_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
return 0;
}
+static int rtl8xxxu_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
+ bool set)
+{
+ struct rtl8xxxu_priv *priv = hw->priv;
+
+ schedule_work(&priv->update_beacon_work);
+
+ return 0;
+}
+
static void rtl8xxxu_sw_scan_start(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, const u8 *mac)
{
@@ -7194,6 +7204,7 @@ static const struct ieee80211_ops rtl8xxxu_ops = {
.ampdu_action = rtl8xxxu_ampdu_action,
.sta_statistics = rtl8xxxu_sta_statistics,
.get_antenna = rtl8xxxu_get_antenna,
+ .set_tim = rtl8xxxu_set_tim,
};
static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv,
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 05/18] wifi: rtl8xxxu: Allow setting rts threshold to -1
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (3 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 04/18] wifi: rtl8xxxu: Add set_tim() callback Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 06/18] wifi: rtl8xxxu: Allow creating interface in AP mode Martin Kaistra
` (14 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
The default setting in hostapd.conf for rts threshold is -1, which means
disabled. Allow to set it.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index 37794739c71c8..9d08a1c8c3b34 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -6655,7 +6655,7 @@ static void rtl8xxxu_configure_filter(struct ieee80211_hw *hw,
static int rtl8xxxu_set_rts_threshold(struct ieee80211_hw *hw, u32 rts)
{
- if (rts > 2347)
+ if (rts > 2347 && rts != (u32)-1)
return -EINVAL;
return 0;
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 06/18] wifi: rtl8xxxu: Allow creating interface in AP mode
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (4 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 05/18] wifi: rtl8xxxu: Allow setting rts threshold to -1 Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 07/18] wifi: rtl8xxxu: Actually use macid in rtl8xxxu_gen2_report_connect Martin Kaistra
` (13 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Use the sequence from the vendor driver for setting up the beacon
related registers.
Also set the MAC address register here, in case the MAC address for the
new interface should be different from what was set in
rtl8xxxu_init_device(). This happens for example with the hostapd config
option "bssid".
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 31 ++++++++++++++++---
.../wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h | 2 ++
2 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index 9d08a1c8c3b34..ab4a1f83c760c 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -6471,18 +6471,39 @@ static int rtl8xxxu_add_interface(struct ieee80211_hw *hw,
int ret;
u8 val8;
+ if (!priv->vif)
+ priv->vif = vif;
+ else
+ return -EOPNOTSUPP;
+
switch (vif->type) {
case NL80211_IFTYPE_STATION:
- if (!priv->vif)
- priv->vif = vif;
- else
- return -EOPNOTSUPP;
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;
+ break;
+ case NL80211_IFTYPE_AP:
+ rtl8xxxu_write8(priv, REG_BEACON_CTRL,
+ BEACON_DISABLE_TSF_UPDATE | BEACON_CTRL_MBSSID);
+ rtl8xxxu_write8(priv, REG_ATIMWND, 0x0c); /* 12ms */
+ rtl8xxxu_write16(priv, REG_TSFTR_SYN_OFFSET, 0x7fff); /* ~32ms */
+ rtl8xxxu_write8(priv, REG_DUAL_TSF_RST, DUAL_TSF_RESET_TSF0);
+
+ /* enable BCN0 function */
+ rtl8xxxu_write8(priv, REG_BEACON_CTRL,
+ BEACON_DISABLE_TSF_UPDATE |
+ BEACON_FUNCTION_ENABLE | BEACON_CTRL_MBSSID |
+ BEACON_CTRL_TX_BEACON_RPT);
+
+ /* select BCN on port 0 */
+ val8 = rtl8xxxu_read8(priv, REG_CCK_CHECK);
+ val8 &= ~BIT_BCN_PORT_SEL;
+ rtl8xxxu_write8(priv, REG_CCK_CHECK, val8);
+
ret = 0;
break;
default:
@@ -6490,6 +6511,8 @@ static int rtl8xxxu_add_interface(struct ieee80211_hw *hw,
}
rtl8xxxu_set_linktype(priv, vif->type);
+ ether_addr_copy(priv->mac_addr, vif->addr);
+ rtl8xxxu_set_mac(priv);
return ret;
}
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
index ad285e4ac0ec4..8571d5129f327 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
@@ -575,6 +575,8 @@
#define REG_ARFR1 0x0448
#define REG_ARFR2 0x044c
#define REG_ARFR3 0x0450
+#define REG_CCK_CHECK 0x0454
+#define BIT_BCN_PORT_SEL BIT(5)
#define REG_AMPDU_MAX_TIME_8723B 0x0456
#define REG_AGGLEN_LMT 0x0458
#define REG_AMPDU_MIN_SPACE 0x045c
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 07/18] wifi: rtl8xxxu: Actually use macid in rtl8xxxu_gen2_report_connect
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (5 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 06/18] wifi: rtl8xxxu: Allow creating interface in AP mode Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 08/18] wifi: rtl8xxxu: Add parameter role to report_connect Martin Kaistra
` (12 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
The report_connect function has had a macid parameter from the
beginning, but it has not been used, because in STA mode, the value was
always zero.
As it can now have different values in AP mode, actually wire it up to
the H2C command.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index ab4a1f83c760c..66e196f7416ec 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -4619,6 +4619,8 @@ void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
else
h2c.media_status_rpt.parm &= ~BIT(0);
+ h2c.media_status_rpt.macid = macid;
+
rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.media_status_rpt));
}
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 08/18] wifi: rtl8xxxu: Add parameter role to report_connect
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (6 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 07/18] wifi: rtl8xxxu: Actually use macid in rtl8xxxu_gen2_report_connect Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 09/18] wifi: rtl8xxxu: Add parameter force to rtl8xxxu_refresh_rate_mask Martin Kaistra
` (11 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
This allows to tell the HW if a connection is made to a STA or an AP.
Add the implementation for the gen2 version.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 9 ++++++---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 11 ++++++-----
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 971f1cc38d323..2dc9b205f08c0 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -1280,6 +1280,9 @@ struct rtl8xxxu_rfregs {
#define H2C_JOIN_BSS_DISCONNECT 0
#define H2C_JOIN_BSS_CONNECT 1
+#define H2C_MACID_ROLE_STA 1
+#define H2C_MACID_ROLE_AP 2
+
/*
* H2C (firmware) commands differ between the older generation chips
* 8188[cr]u, 819[12]cu, and 8723au, and the more recent chips 8723bu,
@@ -1906,7 +1909,7 @@ struct rtl8xxxu_fileops {
void (*update_rate_mask) (struct rtl8xxxu_priv *priv,
u32 ramask, u8 rateid, int sgi, int txbw_40mhz);
void (*report_connect) (struct rtl8xxxu_priv *priv,
- u8 macid, bool connect);
+ u8 macid, u8 role, bool connect);
void (*report_rssi) (struct rtl8xxxu_priv *priv, u8 macid, u8 rssi);
void (*fill_txdesc) (struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
struct ieee80211_tx_info *tx_info,
@@ -2027,9 +2030,9 @@ void rtl8xxxu_update_rate_mask(struct rtl8xxxu_priv *priv,
void rtl8xxxu_gen2_update_rate_mask(struct rtl8xxxu_priv *priv,
u32 ramask, u8 rateid, int sgi, int txbw_40mhz);
void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
- u8 macid, bool connect);
+ u8 macid, u8 role, bool connect);
void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
- u8 macid, bool connect);
+ u8 macid, u8 role, bool connect);
void rtl8xxxu_gen1_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi);
void rtl8xxxu_gen2_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi);
void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv);
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index 66e196f7416ec..0e951dee127ec 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -4586,7 +4586,7 @@ void rtl8xxxu_gen2_update_rate_mask(struct rtl8xxxu_priv *priv,
}
void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
- u8 macid, bool connect)
+ u8 macid, u8 role, bool connect)
{
struct h2c_cmd h2c;
@@ -4603,7 +4603,7 @@ void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
}
void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
- u8 macid, bool connect)
+ u8 macid, u8 role, bool connect)
{
/*
* The firmware turns on the rate control when it knows it's
@@ -4619,6 +4619,7 @@ void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
else
h2c.media_status_rpt.parm &= ~BIT(0);
+ h2c.media_status_rpt.parm |= ((role << 4) & 0xf0);
h2c.media_status_rpt.macid = macid;
rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.media_status_rpt));
@@ -4947,13 +4948,13 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
rtl8xxxu_write16(priv, REG_BCN_PSR_RPT,
0xc000 | vif->cfg.aid);
- priv->fops->report_connect(priv, 0, true);
+ priv->fops->report_connect(priv, 0, H2C_MACID_ROLE_AP, true);
} else {
val8 = rtl8xxxu_read8(priv, REG_BEACON_CTRL);
val8 |= BEACON_DISABLE_TSF_UPDATE;
rtl8xxxu_write8(priv, REG_BEACON_CTRL, val8);
- priv->fops->report_connect(priv, 0, false);
+ priv->fops->report_connect(priv, 0, H2C_MACID_ROLE_AP, false);
}
}
@@ -5014,7 +5015,7 @@ static int rtl8xxxu_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
dev_dbg(dev, "Start AP mode\n");
rtl8xxxu_set_bssid(priv, vif->bss_conf.bssid);
rtl8xxxu_write16(priv, REG_BCN_INTERVAL, vif->bss_conf.beacon_int);
- priv->fops->report_connect(priv, RTL8XXXU_BC_MC_MACID, true);
+ priv->fops->report_connect(priv, RTL8XXXU_BC_MC_MACID, 0, true);
return 0;
}
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 09/18] wifi: rtl8xxxu: Add parameter force to rtl8xxxu_refresh_rate_mask
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (7 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 08/18] wifi: rtl8xxxu: Add parameter role to report_connect Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 10/18] wifi: rtl8xxxu: Add sta_add() and sta_remove() callbacks Martin Kaistra
` (10 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
In AP mode, when multiple STAs connect to us, we need to set an initial
rate mask for each of them. This initialisation should happen regardless
of the rssi_level saved in the priv struct.
Add a parameter called force to rtl8xxxu_refresh_rate_mask() which will
be used for this initialisation.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index 0e951dee127ec..a3ca6ea9b2d66 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -6830,7 +6830,8 @@ static u8 rtl8xxxu_signal_to_snr(int signal)
}
static void rtl8xxxu_refresh_rate_mask(struct rtl8xxxu_priv *priv,
- int signal, struct ieee80211_sta *sta)
+ int signal, struct ieee80211_sta *sta,
+ bool force)
{
struct ieee80211_hw *hw = priv->hw;
u16 wireless_mode;
@@ -6864,7 +6865,7 @@ static void rtl8xxxu_refresh_rate_mask(struct rtl8xxxu_priv *priv,
else
rssi_level = RTL8XXXU_RATR_STA_LOW;
- if (rssi_level != priv->rssi_level) {
+ if (rssi_level != priv->rssi_level || force) {
int sgi = 0;
u32 rate_bitmap = 0;
@@ -7080,7 +7081,7 @@ static void rtl8xxxu_watchdog_callback(struct work_struct *work)
if (priv->fops->set_crystal_cap)
rtl8xxxu_track_cfo(priv);
- rtl8xxxu_refresh_rate_mask(priv, signal, sta);
+ rtl8xxxu_refresh_rate_mask(priv, signal, sta, false);
}
out:
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 10/18] wifi: rtl8xxxu: Add sta_add() and sta_remove() callbacks
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (8 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 09/18] wifi: rtl8xxxu: Add parameter force to rtl8xxxu_refresh_rate_mask Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 11/18] wifi: rtl8xxxu: Put the macid in txdesc Martin Kaistra
` (9 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
In AP mode, sta_add() gets called when a new STA gets associated to
us. Call rtl8xxxu_refresh_rate_mask() to set a rate mask for the newly
connected STA (referenced by the macid) and then send a media connnect
report. Ignore the call to sta_add() in station mode.
Reserve one macid for broadcast/multicast packets in init.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 9 ++++
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 52 +++++++++++++++++++
2 files changed, 61 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 2dc9b205f08c0..a918d1283d1e6 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -1730,6 +1730,7 @@ struct rtl8xxxu_cfo_tracking {
};
#define RTL8XXXU_HW_LED_CONTROL 2
+#define RTL8XXXU_MAX_MAC_ID_NUM 128
#define RTL8XXXU_BC_MC_MACID 0
struct rtl8xxxu_priv {
@@ -1863,6 +1864,14 @@ struct rtl8xxxu_priv {
bool led_registered;
char led_name[32];
struct led_classdev led_cdev;
+ DECLARE_BITMAP(mac_id_map, RTL8XXXU_MAX_MAC_ID_NUM);
+};
+
+struct rtl8xxxu_sta_info {
+ struct ieee80211_sta *sta;
+ struct ieee80211_vif *vif;
+
+ u8 macid;
};
struct rtl8xxxu_rx_urb {
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index a3ca6ea9b2d66..dd678f2803894 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -3977,6 +3977,22 @@ void rtl8xxxu_init_burst(struct rtl8xxxu_priv *priv)
rtl8xxxu_write8(priv, REG_RSV_CTRL, val8);
}
+static u8 rtl8xxxu_acquire_macid(struct rtl8xxxu_priv *priv)
+{
+ u8 macid;
+
+ macid = find_first_zero_bit(priv->mac_id_map, RTL8XXXU_MAX_MAC_ID_NUM);
+ if (macid < RTL8XXXU_MAX_MAC_ID_NUM)
+ set_bit(macid, priv->mac_id_map);
+
+ return macid;
+}
+
+static void rtl8xxxu_release_macid(struct rtl8xxxu_priv *priv, u8 macid)
+{
+ clear_bit(macid, priv->mac_id_map);
+}
+
static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
{
struct rtl8xxxu_priv *priv = hw->priv;
@@ -4446,6 +4462,8 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
if (priv->rtl_chip == RTL8188E)
rtl8188e_ra_info_init_all(&priv->ra_info);
+ set_bit(RTL8XXXU_BC_MC_MACID, priv->mac_id_map);
+
exit:
return ret;
}
@@ -7212,6 +7230,38 @@ static void rtl8xxxu_stop(struct ieee80211_hw *hw)
rtl8xxxu_free_tx_resources(priv);
}
+static int rtl8xxxu_sta_add(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif,
+ struct ieee80211_sta *sta)
+{
+ struct rtl8xxxu_sta_info *sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
+ struct rtl8xxxu_priv *priv = hw->priv;
+
+ if (vif->type == NL80211_IFTYPE_AP) {
+ sta_info->macid = rtl8xxxu_acquire_macid(priv);
+ if (sta_info->macid >= RTL8XXXU_MAX_MAC_ID_NUM)
+ return -ENOSPC;
+
+ rtl8xxxu_refresh_rate_mask(priv, 0, sta, true);
+ priv->fops->report_connect(priv, sta_info->macid, H2C_MACID_ROLE_STA, true);
+ }
+
+ return 0;
+}
+
+static int rtl8xxxu_sta_remove(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif,
+ struct ieee80211_sta *sta)
+{
+ struct rtl8xxxu_sta_info *sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
+ struct rtl8xxxu_priv *priv = hw->priv;
+
+ if (vif->type == NL80211_IFTYPE_AP)
+ rtl8xxxu_release_macid(priv, sta_info->macid);
+
+ return 0;
+}
+
static const struct ieee80211_ops rtl8xxxu_ops = {
.tx = rtl8xxxu_tx,
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
@@ -7232,6 +7282,8 @@ static const struct ieee80211_ops rtl8xxxu_ops = {
.sta_statistics = rtl8xxxu_sta_statistics,
.get_antenna = rtl8xxxu_get_antenna,
.set_tim = rtl8xxxu_set_tim,
+ .sta_add = rtl8xxxu_sta_add,
+ .sta_remove = rtl8xxxu_sta_remove,
};
static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv,
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 11/18] wifi: rtl8xxxu: Put the macid in txdesc
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (9 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 10/18] wifi: rtl8xxxu: Add sta_add() and sta_remove() callbacks Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 12/18] wifi: rtl8xxxu: Add parameter macid to update_rate_mask Martin Kaistra
` (8 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Add a parameter macid to fill_txdesc(), implement setting it for the
gen2 version.
This is used to tell the HW who the recipient of the packet is, so that
the appropriate data rate can be selected.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 8 +++---
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 28 +++++++++++++++----
2 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index a918d1283d1e6..688168e0723c0 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -1924,7 +1924,7 @@ struct rtl8xxxu_fileops {
struct ieee80211_tx_info *tx_info,
struct rtl8xxxu_txdesc32 *tx_desc, bool sgi,
bool short_preamble, bool ampdu_enable,
- u32 rts_rate);
+ u32 rts_rate, u8 macid);
void (*set_crystal_cap) (struct rtl8xxxu_priv *priv, u8 crystal_cap);
s8 (*cck_rssi) (struct rtl8xxxu_priv *priv, struct rtl8723au_phy_stats *phy_stats);
int (*led_classdev_brightness_set) (struct led_classdev *led_cdev,
@@ -2070,17 +2070,17 @@ void rtl8xxxu_fill_txdesc_v1(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
struct ieee80211_tx_info *tx_info,
struct rtl8xxxu_txdesc32 *tx_desc, bool sgi,
bool short_preamble, bool ampdu_enable,
- u32 rts_rate);
+ u32 rts_rate, u8 macid);
void rtl8xxxu_fill_txdesc_v2(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
struct ieee80211_tx_info *tx_info,
struct rtl8xxxu_txdesc32 *tx_desc32, bool sgi,
bool short_preamble, bool ampdu_enable,
- u32 rts_rate);
+ u32 rts_rate, u8 macid);
void rtl8xxxu_fill_txdesc_v3(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
struct ieee80211_tx_info *tx_info,
struct rtl8xxxu_txdesc32 *tx_desc32, bool sgi,
bool short_preamble, bool ampdu_enable,
- u32 rts_rate);
+ u32 rts_rate, u8 macid);
void rtl8723bu_set_ps_tdma(struct rtl8xxxu_priv *priv,
u8 arg1, u8 arg2, u8 arg3, u8 arg4, u8 arg5);
void rtl8723bu_phy_init_antenna_selection(struct rtl8xxxu_priv *priv);
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index dd678f2803894..dfb24de81197f 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -3993,6 +3993,18 @@ static void rtl8xxxu_release_macid(struct rtl8xxxu_priv *priv, u8 macid)
clear_bit(macid, priv->mac_id_map);
}
+static inline u8 rtl8xxxu_get_macid(struct rtl8xxxu_priv *priv,
+ struct ieee80211_sta *sta)
+{
+ struct rtl8xxxu_sta_info *sta_info;
+
+ if (!priv->vif || priv->vif->type == NL80211_IFTYPE_STATION || !sta)
+ return 0;
+
+ sta_info = (struct rtl8xxxu_sta_info *)sta->drv_priv;
+ return sta_info->macid;
+}
+
static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
{
struct rtl8xxxu_priv *priv = hw->priv;
@@ -5231,7 +5243,8 @@ void
rtl8xxxu_fill_txdesc_v1(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
struct ieee80211_tx_info *tx_info,
struct rtl8xxxu_txdesc32 *tx_desc, bool sgi,
- bool short_preamble, bool ampdu_enable, u32 rts_rate)
+ bool short_preamble, bool ampdu_enable, u32 rts_rate,
+ u8 macid)
{
struct ieee80211_rate *tx_rate = ieee80211_get_tx_rate(hw, tx_info);
struct rtl8xxxu_priv *priv = hw->priv;
@@ -5303,7 +5316,8 @@ void
rtl8xxxu_fill_txdesc_v2(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
struct ieee80211_tx_info *tx_info,
struct rtl8xxxu_txdesc32 *tx_desc32, bool sgi,
- bool short_preamble, bool ampdu_enable, u32 rts_rate)
+ bool short_preamble, bool ampdu_enable, u32 rts_rate,
+ u8 macid)
{
struct ieee80211_rate *tx_rate = ieee80211_get_tx_rate(hw, tx_info);
struct rtl8xxxu_priv *priv = hw->priv;
@@ -5327,6 +5341,8 @@ rtl8xxxu_fill_txdesc_v2(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
dev_info(dev, "%s: TX rate: %d, pkt size %u\n",
__func__, rate, le16_to_cpu(tx_desc40->pkt_size));
+ tx_desc40->txdw1 |= cpu_to_le32(macid << TXDESC40_MACID_SHIFT);
+
seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
tx_desc40->txdw4 = cpu_to_le32(rate);
@@ -5378,7 +5394,8 @@ void
rtl8xxxu_fill_txdesc_v3(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
struct ieee80211_tx_info *tx_info,
struct rtl8xxxu_txdesc32 *tx_desc, bool sgi,
- bool short_preamble, bool ampdu_enable, u32 rts_rate)
+ bool short_preamble, bool ampdu_enable, u32 rts_rate,
+ u8 macid)
{
struct ieee80211_rate *tx_rate = ieee80211_get_tx_rate(hw, tx_info);
struct rtl8xxxu_priv *priv = hw->priv;
@@ -5477,6 +5494,7 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
u16 pktlen = skb->len;
u16 rate_flag = tx_info->control.rates[0].flags;
int tx_desc_size = priv->fops->tx_desc_size;
+ u8 macid;
int ret;
bool ampdu_enable, sgi = false, short_preamble = false;
@@ -5576,9 +5594,9 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
else
rts_rate = 0;
-
+ macid = rtl8xxxu_get_macid(priv, sta);
priv->fops->fill_txdesc(hw, hdr, tx_info, tx_desc, sgi, short_preamble,
- ampdu_enable, rts_rate);
+ ampdu_enable, rts_rate, macid);
rtl8xxxu_calc_tx_desc_csum(tx_desc);
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 12/18] wifi: rtl8xxxu: Add parameter macid to update_rate_mask
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (10 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 11/18] wifi: rtl8xxxu: Put the macid in txdesc Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 13/18] wifi: rtl8xxxu: Enable hw seq for mgmt/non-QoS data frames Martin Kaistra
` (7 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
The HW maintains a rate_mask for each connection, referenced by the
macid. Add a parameter to update_rate_mask and add the macid to the
h2c call in the gen2 implementation.
Also extend refresh_rate_mask to get the macid from sta_info.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 7 ++++---
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 3 ++-
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 13 +++++++++----
3 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 688168e0723c0..1cf2ea4b02655 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -1916,7 +1916,8 @@ struct rtl8xxxu_fileops {
void (*set_tx_power) (struct rtl8xxxu_priv *priv, int channel,
bool ht40);
void (*update_rate_mask) (struct rtl8xxxu_priv *priv,
- u32 ramask, u8 rateid, int sgi, int txbw_40mhz);
+ u32 ramask, u8 rateid, int sgi, int txbw_40mhz,
+ u8 macid);
void (*report_connect) (struct rtl8xxxu_priv *priv,
u8 macid, u8 role, bool connect);
void (*report_rssi) (struct rtl8xxxu_priv *priv, u8 macid, u8 rssi);
@@ -2035,9 +2036,9 @@ void rtl8xxxu_gen2_config_channel(struct ieee80211_hw *hw);
void rtl8xxxu_gen1_usb_quirks(struct rtl8xxxu_priv *priv);
void rtl8xxxu_gen2_usb_quirks(struct rtl8xxxu_priv *priv);
void rtl8xxxu_update_rate_mask(struct rtl8xxxu_priv *priv,
- u32 ramask, u8 rateid, int sgi, int txbw_40mhz);
+ u32 ramask, u8 rateid, int sgi, int txbw_40mhz, u8 macid);
void rtl8xxxu_gen2_update_rate_mask(struct rtl8xxxu_priv *priv,
- u32 ramask, u8 rateid, int sgi, int txbw_40mhz);
+ u32 ramask, u8 rateid, int sgi, int txbw_40mhz, u8 macid);
void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
u8 macid, u8 role, bool connect);
void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
index 8986783ae8fa7..6d0f975f891b7 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
@@ -1794,7 +1794,8 @@ static void rtl8188e_arfb_refresh(struct rtl8xxxu_ra_info *ra)
static void
rtl8188e_update_rate_mask(struct rtl8xxxu_priv *priv,
- u32 ramask, u8 rateid, int sgi, int txbw_40mhz)
+ u32 ramask, u8 rateid, int sgi, int txbw_40mhz,
+ u8 macid)
{
struct rtl8xxxu_ra_info *ra = &priv->ra_info;
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index dfb24de81197f..61231be816653 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -4566,7 +4566,8 @@ static void rtl8xxxu_sw_scan_complete(struct ieee80211_hw *hw,
}
void rtl8xxxu_update_rate_mask(struct rtl8xxxu_priv *priv,
- u32 ramask, u8 rateid, int sgi, int txbw_40mhz)
+ u32 ramask, u8 rateid, int sgi, int txbw_40mhz,
+ u8 macid)
{
struct h2c_cmd h2c;
@@ -4586,7 +4587,8 @@ void rtl8xxxu_update_rate_mask(struct rtl8xxxu_priv *priv,
}
void rtl8xxxu_gen2_update_rate_mask(struct rtl8xxxu_priv *priv,
- u32 ramask, u8 rateid, int sgi, int txbw_40mhz)
+ u32 ramask, u8 rateid, int sgi, int txbw_40mhz,
+ u8 macid)
{
struct h2c_cmd h2c;
u8 bw;
@@ -4603,6 +4605,7 @@ void rtl8xxxu_gen2_update_rate_mask(struct rtl8xxxu_priv *priv,
h2c.b_macid_cfg.ramask1 = (ramask >> 8) & 0xff;
h2c.b_macid_cfg.ramask2 = (ramask >> 16) & 0xff;
h2c.b_macid_cfg.ramask3 = (ramask >> 24) & 0xff;
+ h2c.b_macid_cfg.macid = macid;
h2c.b_macid_cfg.data1 = rateid;
if (sgi)
@@ -4968,7 +4971,8 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
priv->vif = vif;
priv->rssi_level = RTL8XXXU_RATR_STA_INIT;
- priv->fops->update_rate_mask(priv, ramask, 0, sgi, bw == RATE_INFO_BW_40);
+ priv->fops->update_rate_mask(priv, ramask, 0, sgi,
+ bw == RATE_INFO_BW_40, 0);
rtl8xxxu_write8(priv, REG_BCN_MAX_ERR, 0xff);
@@ -6875,6 +6879,7 @@ static void rtl8xxxu_refresh_rate_mask(struct rtl8xxxu_priv *priv,
u8 txbw_40mhz;
u8 snr, snr_thresh_high, snr_thresh_low;
u8 go_up_gap = 5;
+ u8 macid = rtl8xxxu_get_macid(priv, sta);
rssi_level = priv->rssi_level;
snr = rtl8xxxu_signal_to_snr(signal);
@@ -6994,7 +6999,7 @@ static void rtl8xxxu_refresh_rate_mask(struct rtl8xxxu_priv *priv,
}
priv->rssi_level = rssi_level;
- priv->fops->update_rate_mask(priv, rate_bitmap, ratr_idx, sgi, txbw_40mhz);
+ priv->fops->update_rate_mask(priv, rate_bitmap, ratr_idx, sgi, txbw_40mhz, macid);
}
}
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 13/18] wifi: rtl8xxxu: Enable hw seq for mgmt/non-QoS data frames
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (11 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 12/18] wifi: rtl8xxxu: Add parameter macid to update_rate_mask Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 14/18] wifi: rtl8xxxu: Clean up filter configuration Martin Kaistra
` (6 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Beacon frames are generated by the HW and therefore contain a HW
generated seq number. Enable HW sequence number for other frames to
match that.
mac80211 will tell us via IEEE80211_TX_CTL_ASSIGN_SEQ when that is
necessary.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index 61231be816653..2e075094a37a5 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -5370,6 +5370,9 @@ rtl8xxxu_fill_txdesc_v2(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
tx_desc40->txdw4 |= cpu_to_le32(TXDESC40_RETRY_LIMIT_ENABLE);
}
+ if (tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)
+ tx_desc40->txdw8 |= cpu_to_le32(TXDESC40_HW_SEQ_ENABLE);
+
if (short_preamble)
tx_desc40->txdw5 |= cpu_to_le32(TXDESC40_SHORT_PREAMBLE);
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 14/18] wifi: rtl8xxxu: Clean up filter configuration
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (12 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 13/18] wifi: rtl8xxxu: Enable hw seq for mgmt/non-QoS data frames Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 15/18] wifi: rtl8xxxu: Remove usage of ieee80211_get_tx_rate() Martin Kaistra
` (5 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
When RCR_CHECK_BSSID_MATCH is set in AP mode, we don't receive any data
frames. Rearrange RCR bits to filter flags to match other realtek drivers
and remove RCR_CHECK_BSSID_MATCH in AP mode.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
.../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index 2e075094a37a5..9e9d172a37f1e 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -6689,22 +6689,22 @@ static void rtl8xxxu_configure_filter(struct ieee80211_hw *hw,
*/
if (*total_flags & FIF_BCN_PRBRESP_PROMISC)
- rcr &= ~RCR_CHECK_BSSID_BEACON;
+ rcr &= ~(RCR_CHECK_BSSID_BEACON | RCR_CHECK_BSSID_MATCH);
else
- rcr |= RCR_CHECK_BSSID_BEACON;
+ rcr |= RCR_CHECK_BSSID_BEACON | RCR_CHECK_BSSID_MATCH;
+
+ if (priv->vif && priv->vif->type == NL80211_IFTYPE_AP)
+ rcr &= ~RCR_CHECK_BSSID_MATCH;
if (*total_flags & FIF_CONTROL)
rcr |= RCR_ACCEPT_CTRL_FRAME;
else
rcr &= ~RCR_ACCEPT_CTRL_FRAME;
- if (*total_flags & FIF_OTHER_BSS) {
+ if (*total_flags & FIF_OTHER_BSS)
rcr |= RCR_ACCEPT_AP;
- rcr &= ~RCR_CHECK_BSSID_MATCH;
- } else {
+ else
rcr &= ~RCR_ACCEPT_AP;
- rcr |= RCR_CHECK_BSSID_MATCH;
- }
if (*total_flags & FIF_PSPOLL)
rcr |= RCR_ACCEPT_PM;
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 15/18] wifi: rtl8xxxu: Remove usage of ieee80211_get_tx_rate()
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (13 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 14/18] wifi: rtl8xxxu: Clean up filter configuration Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 16/18] wifi: rtl8xxxu: Remove usage of tx_info->control.rates[0].flags Martin Kaistra
` (4 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
As this driver uses HAS_RATE_CONTROL, tx_rates will not be provided by
mac80211.
For some frames c->control.rates[0].idx is negative, which means
ieee80211_get_tx_rate() will print a warning and return NULL.
Only management frames have USE_DRIVER_RATE set, so for all others the
rate info of txdesc is ignored anyway.
Remove call to ieee80211_get_tx_rate() and send management frames with
1M (rate info = 0).
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 27 +++----------------
1 file changed, 3 insertions(+), 24 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index 9e9d172a37f1e..a2cc9177fba49 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -5250,21 +5250,14 @@ rtl8xxxu_fill_txdesc_v1(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
bool short_preamble, bool ampdu_enable, u32 rts_rate,
u8 macid)
{
- struct ieee80211_rate *tx_rate = ieee80211_get_tx_rate(hw, tx_info);
struct rtl8xxxu_priv *priv = hw->priv;
struct device *dev = &priv->udev->dev;
u8 *qc = ieee80211_get_qos_ctl(hdr);
u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
- u32 rate;
+ u32 rate = 0;
u16 rate_flags = tx_info->control.rates[0].flags;
u16 seq_number;
- if (rate_flags & IEEE80211_TX_RC_MCS &&
- !ieee80211_is_mgmt(hdr->frame_control))
- rate = tx_info->control.rates[0].idx + DESC_RATE_MCS0;
- else
- rate = tx_rate->hw_value;
-
if (rtl8xxxu_debug & RTL8XXXU_DEBUG_TX)
dev_info(dev, "%s: TX rate: %d, pkt size %u\n",
__func__, rate, le16_to_cpu(tx_desc->pkt_size));
@@ -5323,24 +5316,17 @@ rtl8xxxu_fill_txdesc_v2(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
bool short_preamble, bool ampdu_enable, u32 rts_rate,
u8 macid)
{
- struct ieee80211_rate *tx_rate = ieee80211_get_tx_rate(hw, tx_info);
struct rtl8xxxu_priv *priv = hw->priv;
struct device *dev = &priv->udev->dev;
struct rtl8xxxu_txdesc40 *tx_desc40;
u8 *qc = ieee80211_get_qos_ctl(hdr);
u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
- u32 rate;
+ u32 rate = 0;
u16 rate_flags = tx_info->control.rates[0].flags;
u16 seq_number;
tx_desc40 = (struct rtl8xxxu_txdesc40 *)tx_desc32;
- if (rate_flags & IEEE80211_TX_RC_MCS &&
- !ieee80211_is_mgmt(hdr->frame_control))
- rate = tx_info->control.rates[0].idx + DESC_RATE_MCS0;
- else
- rate = tx_rate->hw_value;
-
if (rtl8xxxu_debug & RTL8XXXU_DEBUG_TX)
dev_info(dev, "%s: TX rate: %d, pkt size %u\n",
__func__, rate, le16_to_cpu(tx_desc40->pkt_size));
@@ -5404,22 +5390,15 @@ rtl8xxxu_fill_txdesc_v3(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
bool short_preamble, bool ampdu_enable, u32 rts_rate,
u8 macid)
{
- struct ieee80211_rate *tx_rate = ieee80211_get_tx_rate(hw, tx_info);
struct rtl8xxxu_priv *priv = hw->priv;
struct device *dev = &priv->udev->dev;
struct rtl8xxxu_ra_info *ra = &priv->ra_info;
u8 *qc = ieee80211_get_qos_ctl(hdr);
u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
- u32 rate;
+ u32 rate = 0;
u16 rate_flags = tx_info->control.rates[0].flags;
u16 seq_number;
- if (rate_flags & IEEE80211_TX_RC_MCS &&
- !ieee80211_is_mgmt(hdr->frame_control))
- rate = tx_info->control.rates[0].idx + DESC_RATE_MCS0;
- else
- rate = tx_rate->hw_value;
-
seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
if (ieee80211_is_data(hdr->frame_control)) {
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 16/18] wifi: rtl8xxxu: Remove usage of tx_info->control.rates[0].flags
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (14 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 15/18] wifi: rtl8xxxu: Remove usage of ieee80211_get_tx_rate() Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 17/18] wifi: rtl8xxxu: Declare AP mode support for 8188f Martin Kaistra
` (3 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
As this driver uses HAS_RATE_CONTROL, rate_flags will not be provided by
mac80211.
Stop using tx_info->control.rates[0].flags and ieee80211_get_rts_cts_rate()
and use rts_threshold and bss_conf.use_cts_prot instead to determine
when to use RTS and CTS.
Send RTS with 24M rate like the vendor drivers. Also set this RTS rate
for ampdu_enable = true, because we also enable RTS for these frames.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
.../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 40 +++++++++----------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index a2cc9177fba49..aa430a912d822 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -5255,7 +5255,6 @@ rtl8xxxu_fill_txdesc_v1(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
u8 *qc = ieee80211_get_qos_ctl(hdr);
u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
u32 rate = 0;
- u16 rate_flags = tx_info->control.rates[0].flags;
u16 seq_number;
if (rtl8xxxu_debug & RTL8XXXU_DEBUG_TX)
@@ -5296,10 +5295,10 @@ rtl8xxxu_fill_txdesc_v1(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
* rts_rate is zero if RTS/CTS or CTS to SELF are not enabled
*/
tx_desc->txdw4 |= cpu_to_le32(rts_rate << TXDESC32_RTS_RATE_SHIFT);
- if (ampdu_enable || (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS)) {
+ if (ampdu_enable || tx_info->control.use_rts) {
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_RTS_CTS_ENABLE);
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_HW_RTS_ENABLE);
- } else if (rate_flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
+ } else if (tx_info->control.use_cts_prot) {
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_CTS_SELF_ENABLE);
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_HW_RTS_ENABLE);
}
@@ -5322,7 +5321,6 @@ rtl8xxxu_fill_txdesc_v2(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
u8 *qc = ieee80211_get_qos_ctl(hdr);
u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
u32 rate = 0;
- u16 rate_flags = tx_info->control.rates[0].flags;
u16 seq_number;
tx_desc40 = (struct rtl8xxxu_txdesc40 *)tx_desc32;
@@ -5363,13 +5361,14 @@ rtl8xxxu_fill_txdesc_v2(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
tx_desc40->txdw5 |= cpu_to_le32(TXDESC40_SHORT_PREAMBLE);
tx_desc40->txdw4 |= cpu_to_le32(rts_rate << TXDESC40_RTS_RATE_SHIFT);
+
/*
* rts_rate is zero if RTS/CTS or CTS to SELF are not enabled
*/
- if (ampdu_enable || (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS)) {
+ if (ampdu_enable || tx_info->control.use_rts) {
tx_desc40->txdw3 |= cpu_to_le32(TXDESC40_RTS_CTS_ENABLE);
tx_desc40->txdw3 |= cpu_to_le32(TXDESC40_HW_RTS_ENABLE);
- } else if (rate_flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
+ } else if (tx_info->control.use_cts_prot) {
/*
* For some reason the vendor driver doesn't set
* TXDESC40_HW_RTS_ENABLE for CTS to SELF
@@ -5396,7 +5395,6 @@ rtl8xxxu_fill_txdesc_v3(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
u8 *qc = ieee80211_get_qos_ctl(hdr);
u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
u32 rate = 0;
- u16 rate_flags = tx_info->control.rates[0].flags;
u16 seq_number;
seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
@@ -5451,10 +5449,10 @@ rtl8xxxu_fill_txdesc_v3(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
* rts_rate is zero if RTS/CTS or CTS to SELF are not enabled
*/
tx_desc->txdw4 |= cpu_to_le32(rts_rate << TXDESC32_RTS_RATE_SHIFT);
- if (ampdu_enable || (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS)) {
+ if (ampdu_enable || tx_info->control.use_rts) {
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_RTS_CTS_ENABLE);
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_HW_RTS_ENABLE);
- } else if (rate_flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
+ } else if (tx_info->control.use_cts_prot) {
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_CTS_SELF_ENABLE);
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_HW_RTS_ENABLE);
}
@@ -5478,7 +5476,6 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
struct device *dev = &priv->udev->dev;
u32 queue, rts_rate;
u16 pktlen = skb->len;
- u16 rate_flag = tx_info->control.rates[0].flags;
int tx_desc_size = priv->fops->tx_desc_size;
u8 macid;
int ret;
@@ -5563,20 +5560,23 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
}
}
- if (rate_flag & IEEE80211_TX_RC_SHORT_GI ||
- (ieee80211_is_data_qos(hdr->frame_control) &&
- sta && sta->deflink.ht_cap.cap &
- (IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20)))
+ if (ieee80211_is_data_qos(hdr->frame_control) &&
+ sta && sta->deflink.ht_cap.cap &
+ (IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20))
sgi = true;
- if (rate_flag & IEEE80211_TX_RC_USE_SHORT_PREAMBLE ||
- (sta && vif && vif->bss_conf.use_short_preamble))
+ if (sta && vif && vif->bss_conf.use_short_preamble)
short_preamble = true;
- if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS)
- rts_rate = ieee80211_get_rts_cts_rate(hw, tx_info)->hw_value;
- else if (rate_flag & IEEE80211_TX_RC_USE_CTS_PROTECT)
- rts_rate = ieee80211_get_rts_cts_rate(hw, tx_info)->hw_value;
+ if (skb->len > hw->wiphy->rts_threshold)
+ tx_info->control.use_rts = true;
+
+ if (sta && vif && vif->bss_conf.use_cts_prot)
+ tx_info->control.use_cts_prot = true;
+
+ if (ampdu_enable || tx_info->control.use_rts ||
+ tx_info->control.use_cts_prot)
+ rts_rate = DESC_RATE_24M;
else
rts_rate = 0;
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 17/18] wifi: rtl8xxxu: Declare AP mode support for 8188f
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (15 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 16/18] wifi: rtl8xxxu: Remove usage of tx_info->control.rates[0].flags Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 18/18] wifi: rtl8xxxu: Set maximum number of supported stations Martin Kaistra
` (2 subsequent siblings)
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Everything is in place now for AP mode, we can tell the system that we
support it. Put the feature behind a flag in priv->fops, because it is
not (yet) implemented for all chips.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c | 1 +
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 ++
3 files changed, 4 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 1cf2ea4b02655..296f345784682 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -1943,6 +1943,7 @@ struct rtl8xxxu_fileops {
u8 init_reg_hmtfr:1;
u8 ampdu_max_time;
u8 ustime_tsf_edca;
+ u8 supports_ap:1;
u32 adda_1t_init;
u32 adda_1t_path_on;
u32 adda_2t_path_on_a;
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
index dbdfd77874655..7fd258bf65e36 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
@@ -1748,6 +1748,7 @@ struct rtl8xxxu_fileops rtl8188fu_fops = {
.init_reg_hmtfr = 1,
.ampdu_max_time = 0x70,
.ustime_tsf_edca = 0x28,
+ .supports_ap = 1,
.adda_1t_init = 0x03c00014,
.adda_1t_path_on = 0x03c00014,
.trxff_boundary = 0x3f7f,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index aa430a912d822..71c715ec5608d 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -7533,6 +7533,8 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
hw->wiphy->max_scan_ssids = 1;
hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
+ if (priv->fops->supports_ap)
+ hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP);
hw->queues = 4;
sband = &rtl8xxxu_supported_band;
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [PATCH v4 18/18] wifi: rtl8xxxu: Set maximum number of supported stations
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (16 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 17/18] wifi: rtl8xxxu: Declare AP mode support for 8188f Martin Kaistra
@ 2023-04-28 15:08 ` Martin Kaistra
2023-05-07 23:09 ` [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Reto Schneider
2023-07-05 9:00 ` Georg Müller
19 siblings, 0 replies; 25+ messages in thread
From: Martin Kaistra @ 2023-04-28 15:08 UTC (permalink / raw)
To: linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Set maximum number of associated stations supported in AP mode. For
8188f, the maximum number of supported macids is 16, reserve one for
broadcast/multicast frames.
Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
---
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 1 +
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c | 1 +
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 2 ++
3 files changed, 4 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index 296f345784682..2c756640f59d3 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -1944,6 +1944,7 @@ struct rtl8xxxu_fileops {
u8 ampdu_max_time;
u8 ustime_tsf_edca;
u8 supports_ap:1;
+ u16 max_macid_num;
u32 adda_1t_init;
u32 adda_1t_path_on;
u32 adda_2t_path_on_a;
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
index 7fd258bf65e36..71b7f0d31bf43 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
@@ -1749,6 +1749,7 @@ struct rtl8xxxu_fileops rtl8188fu_fops = {
.ampdu_max_time = 0x70,
.ustime_tsf_edca = 0x28,
.supports_ap = 1,
+ .max_macid_num = 16,
.adda_1t_init = 0x03c00014,
.adda_1t_path_on = 0x03c00014,
.trxff_boundary = 0x3f7f,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
index 71c715ec5608d..67901b3ee8968 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
@@ -7532,6 +7532,8 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
hw->wiphy->max_scan_ssids = 1;
hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
+ if (priv->fops->max_macid_num)
+ hw->wiphy->max_ap_assoc_sta = priv->fops->max_macid_num - 1;
hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
if (priv->fops->supports_ap)
hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP);
--
2.30.2
^ permalink raw reply related [flat|nested] 25+ messages in thread
* RE: [PATCH v4 03/18] wifi: rtl8xxxu: Add beacon functions
2023-04-28 15:08 ` [PATCH v4 03/18] wifi: rtl8xxxu: Add beacon functions Martin Kaistra
@ 2023-05-02 1:24 ` Ping-Ke Shih
0 siblings, 0 replies; 25+ messages in thread
From: Ping-Ke Shih @ 2023-05-02 1:24 UTC (permalink / raw)
To: Martin Kaistra, linux-wireless@vger.kernel.org
Cc: Jes Sorensen, Kalle Valo, Bitterblue Smith,
Sebastian Andrzej Siewior
> -----Original Message-----
> From: Martin Kaistra <martin.kaistra@linutronix.de>
> Sent: Friday, April 28, 2023 11:08 PM
> To: linux-wireless@vger.kernel.org
> Cc: Jes Sorensen <Jes.Sorensen@gmail.com>; Kalle Valo <kvalo@kernel.org>; Ping-Ke Shih
> <pkshih@realtek.com>; Bitterblue Smith <rtl8821cerfe2@gmail.com>; Sebastian Andrzej Siewior
> <bigeasy@linutronix.de>
> Subject: [PATCH v4 03/18] wifi: rtl8xxxu: Add beacon functions
>
> Add a workqueue to update the beacon contents asynchronously and
> implement downloading the beacon to the HW and starting beacon tx like
> the vendor driver.
>
> Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
[...]
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v4 01/18] wifi: rtl8xxxu: Add start_ap() callback
2023-04-28 15:08 ` [PATCH v4 01/18] wifi: rtl8xxxu: Add start_ap() callback Martin Kaistra
@ 2023-05-05 7:32 ` Kalle Valo
0 siblings, 0 replies; 25+ messages in thread
From: Kalle Valo @ 2023-05-05 7:32 UTC (permalink / raw)
To: Martin Kaistra
Cc: linux-wireless, Jes Sorensen, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Martin Kaistra <martin.kaistra@linutronix.de> wrote:
> This gets called at the start of AP mode operation. Set bssid, beacon
> interval and send a connect report to the HW.
>
> Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
> Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
18 patches applied to wireless-next.git, thanks.
ac48499e2bf5 wifi: rtl8xxxu: Add start_ap() callback
25ed009cc0aa wifi: rtl8xxxu: Select correct queue for beacon frames
cde8848cad0b wifi: rtl8xxxu: Add beacon functions
f5db4d11fda1 wifi: rtl8xxxu: Add set_tim() callback
20d595154894 wifi: rtl8xxxu: Allow setting rts threshold to -1
fd5440f9311f wifi: rtl8xxxu: Allow creating interface in AP mode
d59a105acc03 wifi: rtl8xxxu: Actually use macid in rtl8xxxu_gen2_report_connect
2be2eed4c39b wifi: rtl8xxxu: Add parameter role to report_connect
40d02ff2b186 wifi: rtl8xxxu: Add parameter force to rtl8xxxu_refresh_rate_mask
726e478ce1b3 wifi: rtl8xxxu: Add sta_add() and sta_remove() callbacks
9aa45598d054 wifi: rtl8xxxu: Put the macid in txdesc
769f326322e7 wifi: rtl8xxxu: Add parameter macid to update_rate_mask
89819a651144 wifi: rtl8xxxu: Enable hw seq for mgmt/non-QoS data frames
66dcb574418e wifi: rtl8xxxu: Clean up filter configuration
07342528f7c8 wifi: rtl8xxxu: Remove usage of ieee80211_get_tx_rate()
19b396c241cf wifi: rtl8xxxu: Remove usage of tx_info->control.rates[0].flags
b468481c9ad3 wifi: rtl8xxxu: Declare AP mode support for 8188f
b9a07c443a82 wifi: rtl8xxxu: Set maximum number of supported stations
--
https://patchwork.kernel.org/project/linux-wireless/patch/20230428150833.218605-2-martin.kaistra@linutronix.de/
https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (17 preceding siblings ...)
2023-04-28 15:08 ` [PATCH v4 18/18] wifi: rtl8xxxu: Set maximum number of supported stations Martin Kaistra
@ 2023-05-07 23:09 ` Reto Schneider
2023-07-05 9:00 ` Georg Müller
19 siblings, 0 replies; 25+ messages in thread
From: Reto Schneider @ 2023-05-07 23:09 UTC (permalink / raw)
To: Martin Kaistra, linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Hi Martin,
On 28.04.23 17:08, Martin Kaistra wrote:
> This series intends to bring AP mode support to the rtl8xxxu driver,
> more specifically for the 8188f, because this is the HW I have.
Awesome work, thanks a lot!
I have access to and will try getting AP mode working on the RTL8192CUS
by filling in the gen1 implementation parts.
If someone is already working on gen1 support, please let me know. Same
if there are know pitfalls I might encounter. :)
Kind regards,
Reto
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
` (18 preceding siblings ...)
2023-05-07 23:09 ` [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Reto Schneider
@ 2023-07-05 9:00 ` Georg Müller
2023-07-07 7:23 ` Martin Kaistra
19 siblings, 1 reply; 25+ messages in thread
From: Georg Müller @ 2023-07-05 9:00 UTC (permalink / raw)
To: Martin Kaistra, linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Hi Martin,
Am 28.04.23 um 17:08 schrieb Martin Kaistra:
> This series intends to bring AP mode support to the rtl8xxxu driver,
> more specifically for the 8188f, because this is the HW I have.
> The work is based on the vendor driver as I do not have access to
> datasheets.
I tried to enable AP mode for a 8188EU device (TP-Link TL-WN725N) with
some mixed results.
I added .supports_ap = 1 and .max_macid_num = 16 to rtl8188eu_fops.
The AP was visible and I once was able to connect to it. When connected,
the link was stable, but I didn't do any benchmarks.
Most of my tries I was not able to establish a connection (looks like
timeouts) and once I got this message:
usb 1-4: rtl8xxxu_send_beacon_frame: Failed to read beacon valid bit
The driver I am using currently is the out-of-tree driver rtl8188eu [1],
which has a stable AP mode, but has some stability issues in managed mode.
Please give me a hint if and how I may help tracking down the issue to
enable AP mode for 8188EU as well.
Best regards,
Georg
[1]
https://github.com/lwfinger/rtl8188eu/tree/v5.2.2.4
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f
2023-07-05 9:00 ` Georg Müller
@ 2023-07-07 7:23 ` Martin Kaistra
2023-07-07 17:55 ` Bitterblue Smith
0 siblings, 1 reply; 25+ messages in thread
From: Martin Kaistra @ 2023-07-07 7:23 UTC (permalink / raw)
To: Georg Müller, linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Bitterblue Smith,
Sebastian Andrzej Siewior
Hi Georg,
Am 05.07.23 um 11:00 schrieb Georg Müller:
> Hi Martin,
>
> Am 28.04.23 um 17:08 schrieb Martin Kaistra:
>> This series intends to bring AP mode support to the rtl8xxxu driver,
>> more specifically for the 8188f, because this is the HW I have.
>> The work is based on the vendor driver as I do not have access to
>> datasheets.
>
> I tried to enable AP mode for a 8188EU device (TP-Link TL-WN725N) with
> some mixed results.
>
> I added .supports_ap = 1 and .max_macid_num = 16 to rtl8188eu_fops.
According to [1], you might be able to increase max_macid_num to 64.
>
> The AP was visible and I once was able to connect to it. When connected,
> the link was stable, but I didn't do any benchmarks.
>
> Most of my tries I was not able to establish a connection (looks like
> timeouts) and once I got this message:
>
> usb 1-4: rtl8xxxu_send_beacon_frame: Failed to read beacon valid bit
>
> The driver I am using currently is the out-of-tree driver rtl8188eu [1],
> which has a stable AP mode, but has some stability issues in managed mode.
>
> Please give me a hint if and how I may help tracking down the issue to
> enable AP mode for 8188EU as well.
I would suggest the following:
- in rtl8xxxu_fill_txdesc_v3, set macid, HW_SEQ like in the v2 function
- 8188e does decide on the tx rate in software, so
rtl8188e_handle_ra_tx_report2() will probably need some adjustments to handle
multiple macids (maybe ra_info in rtl8xxxu_priv should be an array of size
RTL8XXXU_MAX_MAC_ID_NUM?)
For testing I use a separate machine (or at least separate wifi interface) in
monitoring mode, which I can set to the correct channel and then see in
wireshark, if all beacons, ACKs and other frames get sent correctly.
If you have a wireshark trace of a problematic behavior and need some help with
determining the cause or have some further questions, let me know.
Thanks,
Martin
>
> Best regards,
> Georg
>
> [1]
> https://github.com/lwfinger/rtl8188eu/tree/v5.2.2.4
[1]
https://lore.kernel.org/linux-wireless/27e83382-4c84-1841-c428-d1e5143ea20c@gmail.com/
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f
2023-07-07 7:23 ` Martin Kaistra
@ 2023-07-07 17:55 ` Bitterblue Smith
0 siblings, 0 replies; 25+ messages in thread
From: Bitterblue Smith @ 2023-07-07 17:55 UTC (permalink / raw)
To: Martin Kaistra, Georg Müller, linux-wireless
Cc: Jes Sorensen, Kalle Valo, Ping-Ke Shih, Sebastian Andrzej Siewior
On 07/07/2023 10:23, Martin Kaistra wrote:
> Hi Georg,
>
> Am 05.07.23 um 11:00 schrieb Georg Müller:
>> Hi Martin,
>>
[...]
>> Please give me a hint if and how I may help tracking down the issue to
>> enable AP mode for 8188EU as well.
>
> I would suggest the following:
> - in rtl8xxxu_fill_txdesc_v3, set macid, HW_SEQ like in the v2 function
> - 8188e does decide on the tx rate in software, so rtl8188e_handle_ra_tx_report2() will probably need some adjustments to handle multiple macids (maybe ra_info in rtl8xxxu_priv should be an array of size RTL8XXXU_MAX_MAC_ID_NUM?)
ra_info should be an array(?), except the dynamic_tx_rpt_timing_counter
member should be moved to rtl8xxxu_priv. In the vendor driver it was
a static variable in the odm_rate_decision_8188e() function.
An array or some dynamic data structure? The array would take up at
least 3072 bytes, including when the driver is handling some other
chip which doesn't need the array.
Additionally, rtl8xxxu_sta_add() and rtl8xxxu_sta_remove() need to
increase/decrease REG_TX_REPORT_CTRL + 1, otherwise you will only get
correct rate control for the first station which connects to the AP.
^ permalink raw reply [flat|nested] 25+ messages in thread
end of thread, other threads:[~2023-07-07 17:55 UTC | newest]
Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-28 15:08 [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 01/18] wifi: rtl8xxxu: Add start_ap() callback Martin Kaistra
2023-05-05 7:32 ` Kalle Valo
2023-04-28 15:08 ` [PATCH v4 02/18] wifi: rtl8xxxu: Select correct queue for beacon frames Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 03/18] wifi: rtl8xxxu: Add beacon functions Martin Kaistra
2023-05-02 1:24 ` Ping-Ke Shih
2023-04-28 15:08 ` [PATCH v4 04/18] wifi: rtl8xxxu: Add set_tim() callback Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 05/18] wifi: rtl8xxxu: Allow setting rts threshold to -1 Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 06/18] wifi: rtl8xxxu: Allow creating interface in AP mode Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 07/18] wifi: rtl8xxxu: Actually use macid in rtl8xxxu_gen2_report_connect Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 08/18] wifi: rtl8xxxu: Add parameter role to report_connect Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 09/18] wifi: rtl8xxxu: Add parameter force to rtl8xxxu_refresh_rate_mask Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 10/18] wifi: rtl8xxxu: Add sta_add() and sta_remove() callbacks Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 11/18] wifi: rtl8xxxu: Put the macid in txdesc Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 12/18] wifi: rtl8xxxu: Add parameter macid to update_rate_mask Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 13/18] wifi: rtl8xxxu: Enable hw seq for mgmt/non-QoS data frames Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 14/18] wifi: rtl8xxxu: Clean up filter configuration Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 15/18] wifi: rtl8xxxu: Remove usage of ieee80211_get_tx_rate() Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 16/18] wifi: rtl8xxxu: Remove usage of tx_info->control.rates[0].flags Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 17/18] wifi: rtl8xxxu: Declare AP mode support for 8188f Martin Kaistra
2023-04-28 15:08 ` [PATCH v4 18/18] wifi: rtl8xxxu: Set maximum number of supported stations Martin Kaistra
2023-05-07 23:09 ` [PATCH v4 00/18] wifi: rtl8xxxu: Add AP mode support for 8188f Reto Schneider
2023-07-05 9:00 ` Georg Müller
2023-07-07 7:23 ` Martin Kaistra
2023-07-07 17:55 ` Bitterblue Smith
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).