Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
8530efd
wifi: rtw89: Add rtw89_core_get_ch_dma_v2()
Nov 1, 2025
dd6a451
wifi: rtw89: usb: Move bulk out map to new struct rtw89_usb_info
Nov 1, 2025
6de968b
wifi: rtw89: usb: Prepare rtw89_usb_ops_mac_pre_init() for RTL8852CU
Nov 1, 2025
abe4628
wifi: rtw89: usb: Prepare rtw89_usb_ops_mac_post_init() for RTL8852CU
Nov 1, 2025
9e7e8ee
wifi: rtw89: Fix rtw89_mac_dmac_func_pre_en_ax() for USB/SDIO
Nov 1, 2025
3056b67
wifi: rtw89: usb: use ieee80211_free_txskb() where appropriate
pchelkin91 Nov 4, 2025
87aecbd
wifi: rtw89: refine rtw89_core_tx_wait_complete()
pchelkin91 Nov 4, 2025
46f9d82
wifi: rtw89: implement C2H TX report handler
pchelkin91 Nov 4, 2025
1fb2f03
wifi: rtw89: fill TX descriptor of FWCMD in shortcut
Nov 4, 2025
cc79e63
wifi: rtw89: usb: anchor TX URBs
pchelkin91 Nov 4, 2025
7d5371c
wifi: rtw89: handle IEEE80211_TX_CTL_REQ_TX_STATUS frames for USB
pchelkin91 Nov 4, 2025
3547cf1
wifi: rtw89: provide TX reports for management frames
pchelkin91 Nov 4, 2025
252364c
wifi: rtw89: process TX wait skbs for USB via C2H handler
pchelkin91 Nov 4, 2025
e6e4d08
wifi: rtw89: Use the correct power sequences for USB/SDIO
Nov 7, 2025
39ec6ca
wifi: rtw89: Add rtw8852a_dle_mem_usb
Nov 7, 2025
73d4073
wifi: rtw89: Add rtw8852a_hfc_param_ini_usb
Nov 7, 2025
a128ef0
wifi: rtw89: 8852a: Accept USB devices and load their MAC address
Nov 7, 2025
c3f324c
wifi: rtw89: Add rtw8852au.c
Nov 7, 2025
5edc731
wifi: rtw89: Enable the new rtw89_8852au module
Nov 7, 2025
b2ba665
wifi: rtw89: 8852au: add support for TP TX30U Plus
bit Dec 12, 2025
990237b
wifi: rtw89: correct use sequence of driver_data in skb->info
Dec 17, 2025
f5a4f3e
wifi: rtw89: Add support for D-Link VR Air Bridge (DWA-F18)
a5a5aa555oo Jan 12, 2026
b17063f
wifi: rtw89: usb: fix TX flow control by tracking in-flight URBs
Lucid-Duck Apr 2, 2026
55e3fea
wifi: rtw89: usb: Support switching to USB 3 mode
May 20, 2026
58b9ca9
configs: Enable the rtw8852au driver module
pelwell Sep 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions arch/arm/configs/bcm2709_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -601,6 +601,7 @@ CONFIG_RTW88_8812AU=m
CONFIG_RTW88_8814AU=m
CONFIG_RTW89=m
CONFIG_RTW89_8851BU=m
CONFIG_RTW89_8852AU=m
CONFIG_RTW89_8852BU=m
CONFIG_WL12XX=m
CONFIG_ZD1211RW=m
Expand Down
1 change: 1 addition & 0 deletions arch/arm/configs/bcmrpi_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,7 @@ CONFIG_RTW88_8812AU=m
CONFIG_RTW88_8814AU=m
CONFIG_RTW89=m
CONFIG_RTW89_8851BU=m
CONFIG_RTW89_8852AU=m
CONFIG_RTW89_8852BU=m
CONFIG_WL12XX=m
CONFIG_ZD1211RW=m
Expand Down
1 change: 1 addition & 0 deletions arch/arm64/configs/bcm2711_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,7 @@ CONFIG_RTW89=m
CONFIG_RTW89_8851BE=m
CONFIG_RTW89_8851BU=m
CONFIG_RTW89_8852AE=m
CONFIG_RTW89_8852AU=m
CONFIG_RTW89_8852BE=m
CONFIG_RTW89_8852BU=m
CONFIG_RTW89_8852BTE=m
Expand Down
1 change: 1 addition & 0 deletions arch/arm64/configs/bcm2711_rt_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,7 @@ CONFIG_RTW89=m
CONFIG_RTW89_8851BE=m
CONFIG_RTW89_8851BU=m
CONFIG_RTW89_8852AE=m
CONFIG_RTW89_8852AU=m
CONFIG_RTW89_8852BE=m
CONFIG_RTW89_8852BU=m
CONFIG_RTW89_8852BTE=m
Expand Down
1 change: 1 addition & 0 deletions arch/arm64/configs/bcm2712_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -674,6 +674,7 @@ CONFIG_RTW89=m
CONFIG_RTW89_8851BE=m
CONFIG_RTW89_8851BU=m
CONFIG_RTW89_8852AE=m
CONFIG_RTW89_8852AU=m
CONFIG_RTW89_8852BE=m
CONFIG_RTW89_8852BU=m
CONFIG_RTW89_8852BTE=m
Expand Down
11 changes: 11 additions & 0 deletions drivers/net/wireless/realtek/rtw89/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,17 @@

802.11ax PCIe wireless network (Wi-Fi 6) adapter

config RTW89_8852AU

Check failure on line 77 in drivers/net/wireless/realtek/rtw89/Kconfig

View workflow job for this annotation

GitHub Actions / checkpatch review

WARNING: please write a help paragraph that fully describes the config symbol
tristate "Realtek 8852AU USB wireless network (Wi-Fi 6) adapter"
depends on USB
select RTW89_CORE
select RTW89_USB
select RTW89_8852A
help
Select this option will enable support for 8852AU chipset

802.11ax USB wireless network (Wi-Fi 6) adapter

config RTW89_8852BE
tristate "Realtek 8852BE PCI wireless network (Wi-Fi 6) adapter"
depends on PCI
Expand Down
3 changes: 3 additions & 0 deletions drivers/net/wireless/realtek/rtw89/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ rtw89_8852a-objs := rtw8852a.o \
obj-$(CONFIG_RTW89_8852AE) += rtw89_8852ae.o
rtw89_8852ae-objs := rtw8852ae.o

obj-$(CONFIG_RTW89_8852AU) += rtw89_8852au.o
rtw89_8852au-objs := rtw8852au.o

obj-$(CONFIG_RTW89_8852B_COMMON) += rtw89_8852b_common.o
rtw89_8852b_common-objs := rtw8852b_common.o

Expand Down
78 changes: 61 additions & 17 deletions drivers/net/wireless/realtek/rtw89/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -759,6 +759,25 @@ u8 rtw89_core_get_ch_dma_v1(struct rtw89_dev *rtwdev, u8 qsel)
}
EXPORT_SYMBOL(rtw89_core_get_ch_dma_v1);

u8 rtw89_core_get_ch_dma_v2(struct rtw89_dev *rtwdev, u8 qsel)
{
switch (qsel) {
default:
rtw89_warn(rtwdev, "Cannot map qsel to dma v2: %d\n", qsel);
fallthrough;
case RTW89_TX_QSEL_BE_0:
case RTW89_TX_QSEL_VO_0:
return RTW89_TXCH_ACH0;
case RTW89_TX_QSEL_BK_0:
case RTW89_TX_QSEL_VI_0:
return RTW89_TXCH_ACH2;
case RTW89_TX_QSEL_B0_MGMT:
case RTW89_TX_QSEL_B0_HI:
return RTW89_TXCH_CH8;
}
}
EXPORT_SYMBOL(rtw89_core_get_ch_dma_v2);

static void
rtw89_core_tx_update_mgmt_info(struct rtw89_dev *rtwdev,
struct rtw89_core_tx_request *tx_req)
Expand Down Expand Up @@ -1091,32 +1110,38 @@ rtw89_core_tx_update_desc_info(struct rtw89_dev *rtwdev,
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_hdr *hdr = (void *)skb->data;
struct rtw89_addr_cam_entry *addr_cam;
enum rtw89_core_tx_type tx_type;
enum btc_pkt_type pkt_type;
bool upd_wlan_hdr = false;
bool is_bmc;
u16 seq;

desc_info->pkt_size = skb->len;

if (unlikely(tx_req->tx_type == RTW89_CORE_TX_TYPE_FWCMD)) {
rtw89_core_tx_update_h2c_info(rtwdev, tx_req);
return;
}

tx_req->tx_type = rtw89_core_get_tx_type(rtwdev, skb);

if (tx_req->sta)
desc_info->mlo = tx_req->sta->mlo;
else if (tx_req->vif)
desc_info->mlo = ieee80211_vif_is_mld(tx_req->vif);

seq = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
if (tx_req->tx_type != RTW89_CORE_TX_TYPE_FWCMD) {
tx_type = rtw89_core_get_tx_type(rtwdev, skb);
tx_req->tx_type = tx_type;
addr_cam = rtw89_get_addr_cam_of(tx_req->rtwvif_link,
tx_req->rtwsta_link);
if (addr_cam->valid && desc_info->mlo)
upd_wlan_hdr = true;

if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS || tx_req->with_wait)
rtw89_tx_rpt_init(rtwdev, tx_req);

addr_cam = rtw89_get_addr_cam_of(tx_req->rtwvif_link,
tx_req->rtwsta_link);
if (addr_cam->valid && desc_info->mlo)
upd_wlan_hdr = true;
}
is_bmc = (is_broadcast_ether_addr(hdr->addr1) ||
is_multicast_ether_addr(hdr->addr1));

desc_info->seq = seq;
desc_info->pkt_size = skb->len;
desc_info->is_bmc = is_bmc;
desc_info->wd_page = true;
desc_info->hiq = info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM;
Expand All @@ -1133,8 +1158,7 @@ rtw89_core_tx_update_desc_info(struct rtw89_dev *rtwdev,
rtw89_core_tx_update_ampdu_info(rtwdev, tx_req, pkt_type);
rtw89_core_tx_update_llc_hdr(rtwdev, desc_info, skb);
break;
case RTW89_CORE_TX_TYPE_FWCMD:
rtw89_core_tx_update_h2c_info(rtwdev, tx_req);
default:
break;
}
}
Expand Down Expand Up @@ -1243,6 +1267,7 @@ static int rtw89_core_tx_write_link(struct rtw89_dev *rtwdev,
tx_req.rtwvif_link = rtwvif_link;
tx_req.rtwsta_link = rtwsta_link;
tx_req.desc_info.sw_mld = sw_mld;
tx_req.with_wait = !!wait;

rtw89_traffic_stats_accu(rtwdev, rtwvif, skb, true, true);
rtw89_wow_parse_akm(rtwdev, skb);
Expand Down Expand Up @@ -1400,7 +1425,10 @@ static __le32 rtw89_build_txwd_info1(struct rtw89_tx_desc_info *desc_info)
u32 dword = FIELD_PREP(RTW89_TXWD_INFO1_MAX_AGGNUM, desc_info->ampdu_num) |
FIELD_PREP(RTW89_TXWD_INFO1_A_CTRL_BSR, desc_info->a_ctrl_bsr) |
FIELD_PREP(RTW89_TXWD_INFO1_DATA_RTY_LOWEST_RATE,
desc_info->data_retry_lowest_rate);
desc_info->data_retry_lowest_rate) |
FIELD_PREP(RTW89_TXWD_INFO1_DATA_TXCNT_LMT_SEL,
desc_info->tx_cnt_lmt_en) |
FIELD_PREP(RTW89_TXWD_INFO1_DATA_TXCNT_LMT, desc_info->tx_cnt_lmt);

return cpu_to_le32(dword);
}
Expand All @@ -1424,11 +1452,19 @@ static __le32 rtw89_build_txwd_info2_v1(struct rtw89_tx_desc_info *desc_info)
return cpu_to_le32(dword);
}

static __le32 rtw89_build_txwd_info3(struct rtw89_tx_desc_info *desc_info)
{
u32 dword = FIELD_PREP(RTW89_TXWD_INFO3_SPE_RPT, desc_info->report);

return cpu_to_le32(dword);
}

static __le32 rtw89_build_txwd_info4(struct rtw89_tx_desc_info *desc_info)
{
bool rts_en = !desc_info->is_bmc;
u32 dword = FIELD_PREP(RTW89_TXWD_INFO4_RTS_EN, rts_en) |
FIELD_PREP(RTW89_TXWD_INFO4_HW_RTS_EN, 1);
FIELD_PREP(RTW89_TXWD_INFO4_HW_RTS_EN, 1) |
FIELD_PREP(RTW89_TXWD_INFO4_SW_DEFINE, desc_info->sn);

return cpu_to_le32(dword);
}
Expand All @@ -1451,6 +1487,7 @@ void rtw89_core_fill_txdesc(struct rtw89_dev *rtwdev,
txwd_info->dword0 = rtw89_build_txwd_info0(desc_info);
txwd_info->dword1 = rtw89_build_txwd_info1(desc_info);
txwd_info->dword2 = rtw89_build_txwd_info2(desc_info);
txwd_info->dword3 = rtw89_build_txwd_info3(desc_info);
txwd_info->dword4 = rtw89_build_txwd_info4(desc_info);

}
Expand Down Expand Up @@ -1480,6 +1517,7 @@ void rtw89_core_fill_txdesc_v1(struct rtw89_dev *rtwdev,
txwd_info->dword0 = rtw89_build_txwd_info0_v1(desc_info);
txwd_info->dword1 = rtw89_build_txwd_info1(desc_info);
txwd_info->dword2 = rtw89_build_txwd_info2_v1(desc_info);
txwd_info->dword3 = rtw89_build_txwd_info3(desc_info);
txwd_info->dword4 = rtw89_build_txwd_info4(desc_info);
}
EXPORT_SYMBOL(rtw89_core_fill_txdesc_v1);
Expand Down Expand Up @@ -1565,7 +1603,10 @@ static __le32 rtw89_build_txwd_info0_v2(struct rtw89_tx_desc_info *desc_info)
u32 dword = FIELD_PREP(BE_TXD_INFO0_DATA_STBC, desc_info->stbc) |
FIELD_PREP(BE_TXD_INFO0_DATA_LDPC, desc_info->ldpc) |
FIELD_PREP(BE_TXD_INFO0_DISDATAFB, desc_info->dis_data_fb) |
FIELD_PREP(BE_TXD_INFO0_MULTIPORT_ID, desc_info->port);
FIELD_PREP(BE_TXD_INFO0_MULTIPORT_ID, desc_info->port) |
FIELD_PREP(BE_TXD_INFO0_DATA_TXCNT_LMT_SEL,
desc_info->tx_cnt_lmt_en) |
FIELD_PREP(BE_TXD_INFO0_DATA_TXCNT_LMT, desc_info->tx_cnt_lmt);

return cpu_to_le32(dword);
}
Expand All @@ -1575,7 +1616,8 @@ static __le32 rtw89_build_txwd_info1_v2(struct rtw89_tx_desc_info *desc_info)
u32 dword = FIELD_PREP(BE_TXD_INFO1_MAX_AGG_NUM, desc_info->ampdu_num) |
FIELD_PREP(BE_TXD_INFO1_A_CTRL_BSR, desc_info->a_ctrl_bsr) |
FIELD_PREP(BE_TXD_INFO1_DATA_RTY_LOWEST_RATE,
desc_info->data_retry_lowest_rate);
desc_info->data_retry_lowest_rate) |
FIELD_PREP(BE_TXD_INFO1_SW_DEFINE, desc_info->sn);

return cpu_to_le32(dword);
}
Expand All @@ -1584,7 +1626,8 @@ static __le32 rtw89_build_txwd_info2_v2(struct rtw89_tx_desc_info *desc_info)
{
u32 dword = FIELD_PREP(BE_TXD_INFO2_AMPDU_DENSITY, desc_info->ampdu_density) |
FIELD_PREP(BE_TXD_INFO2_FORCE_KEY_EN, desc_info->sec_en) |
FIELD_PREP(BE_TXD_INFO2_SEC_CAM_IDX, desc_info->sec_cam_idx);
FIELD_PREP(BE_TXD_INFO2_SEC_CAM_IDX, desc_info->sec_cam_idx) |
FIELD_PREP(BE_TXD_INFO2_SPE_RPT_V1, desc_info->report);

return cpu_to_le32(dword);
}
Expand Down Expand Up @@ -5849,6 +5892,7 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)
wiphy_work_init(&rtwdev->cancel_6ghz_probe_work, rtw89_cancel_6ghz_probe_work);
INIT_WORK(&rtwdev->load_firmware_work, rtw89_load_firmware_work);

spin_lock_init(&rtwdev->tx_rpt.skb_lock);
skb_queue_head_init(&rtwdev->c2h_queue);
rtw89_core_ppdu_sts_init(rtwdev);
rtw89_traffic_stats_init(rtwdev, &rtwdev->stats);
Expand Down
Loading
Loading