[PATCH 00/10] RTW88: Add support for USB variants

From: Sascha Hauer
Date: Wed May 18 2022 - 04:24:20 EST


This series adds support for the USB chip variants to the RTW88 driver.

The first patches in the series consolidate the locking in the driver.
The rtw88 driver protects the register accesses with spinlocks which
naturally don't cope well with the asynchronous nature of USB. It turned
out though that in most cases where additional locks are taken the
global driver mutex is acquired anyway which makes them mostly
unnecessary. The exception is the debugfs code which depends on the
additional locks. This is changed to acquire the global driver mutex as
well, so the additional locks can be removed. I verified the callstacks
leading to the different locks with a cscope based shell script, so I am
pretty confident that I haven't missed any pathes. Nevertheless please
have a careful look, please.

Another problem to address is that the driver uses
ieee80211_iterate_stations_atomic() and
ieee80211_iterate_active_interfaces_atomic() and does register accesses
in the iterator. This doesn't work with USB, so iteration is done in two
steps now: The ieee80211_iterate_*_atomic() functions are only used to
collect the stations/interfaces on a list which is then iterated over
non-atomically in the second step. The implementation for this is
basically the one suggested by Ping-Ke here:
https://lore.kernel.org/lkml/423f474e15c948eda4db5bc9a50fd391@xxxxxxxxxxx/

The USB driver code itself is based on
https://github.com/ulli-kroll/rtw88-usb.git. The most significant
change to that code base is likely the TX queue handling. It seems the
PCI versions of the RTW88 chips have eight differently prioritized TX
queues whereas the USB variants only have one to three queues (one per
bulk endpoint). The original code base first mapped the TX packets
coming into the driver onto eight TX queues which were then re-mapped
again to the existing endpoints. As the eight TX queues do not
physically exist on the USB variants I changed that to map the incoming
TX packets directly onto the bulk endpoints.

I tested this series on the RTW8822CU only. I don't have access to any
of the other chips supported by the RTW88 driver, so testing feedback
would be greatly appreciated.

This is my first excursion to the Linux wireless world, so please review
carefully :)

Sascha


Sascha Hauer (10):
rtw88: Call rtw_fw_beacon_filter_config() with rtwdev->mutex held
rtw88: Drop rf_lock
rtw88: Drop h2c.lock
rtw88: Drop coex mutex
rtw88: Do not access registers while atomic
rtw88: Add common USB chip support
rtw88: Add rtw8723du chipset support
rtw88: Add rtw8821cu chipset support
rtw88: Add rtw8822bu chipset support
rtw88: Add rtw8822cu chipset support

drivers/net/wireless/realtek/rtw88/Kconfig | 47 +
drivers/net/wireless/realtek/rtw88/Makefile | 14 +
drivers/net/wireless/realtek/rtw88/coex.c | 3 +-
drivers/net/wireless/realtek/rtw88/debug.c | 15 +
drivers/net/wireless/realtek/rtw88/fw.c | 13 +-
drivers/net/wireless/realtek/rtw88/hci.h | 9 +-
drivers/net/wireless/realtek/rtw88/mac.c | 3 +
drivers/net/wireless/realtek/rtw88/mac80211.c | 2 +-
drivers/net/wireless/realtek/rtw88/main.c | 9 +-
drivers/net/wireless/realtek/rtw88/main.h | 11 +-
drivers/net/wireless/realtek/rtw88/phy.c | 6 +-
drivers/net/wireless/realtek/rtw88/ps.c | 2 +-
drivers/net/wireless/realtek/rtw88/reg.h | 1 +
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 19 +
drivers/net/wireless/realtek/rtw88/rtw8723d.h | 1 +
.../net/wireless/realtek/rtw88/rtw8723du.c | 40 +
.../net/wireless/realtek/rtw88/rtw8723du.h | 13 +
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 23 +
drivers/net/wireless/realtek/rtw88/rtw8821c.h | 21 +
.../net/wireless/realtek/rtw88/rtw8821cu.c | 69 ++
.../net/wireless/realtek/rtw88/rtw8821cu.h | 15 +
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 19 +
.../net/wireless/realtek/rtw88/rtw8822bu.c | 62 +
.../net/wireless/realtek/rtw88/rtw8822bu.h | 15 +
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 24 +
.../net/wireless/realtek/rtw88/rtw8822cu.c | 40 +
.../net/wireless/realtek/rtw88/rtw8822cu.h | 15 +
drivers/net/wireless/realtek/rtw88/tx.h | 31 +
drivers/net/wireless/realtek/rtw88/usb.c | 1051 +++++++++++++++++
drivers/net/wireless/realtek/rtw88/usb.h | 109 ++
drivers/net/wireless/realtek/rtw88/util.c | 92 ++
drivers/net/wireless/realtek/rtw88/util.h | 12 +-
32 files changed, 1770 insertions(+), 36 deletions(-)
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8723du.c
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8723du.h
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821cu.c
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821cu.h
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822bu.c
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822bu.h
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822cu.c
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822cu.h
create mode 100644 drivers/net/wireless/realtek/rtw88/usb.c
create mode 100644 drivers/net/wireless/realtek/rtw88/usb.h

--
2.30.2