mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
mac80211: add rtl8821cu chipset support in rtw88
This commit is contained in:
parent
956f36403a
commit
8b581837f0
@ -0,0 +1,14 @@
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
index 5cdc54c9a9aae..3c07485d6ba47 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
@@ -466,8 +466,8 @@ static int rtw_ops_sta_remove(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
|
||||
- rtw_fw_beacon_filter_config(rtwdev, false, vif);
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
+ rtw_fw_beacon_filter_config(rtwdev, false, vif);
|
||||
rtw_sta_remove(rtwdev, sta, true);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
117
package/kernel/mac80211/patches/rtl/002-rtw88-Drop-rf_lock.patch
Normal file
117
package/kernel/mac80211/patches/rtl/002-rtw88-Drop-rf_lock.patch
Normal file
@ -0,0 +1,117 @@
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
index 1a52ff585fbc7..ba5ba852efb8c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
@@ -144,7 +144,9 @@ static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v)
|
||||
addr = debugfs_priv->rf_addr;
|
||||
mask = debugfs_priv->rf_mask;
|
||||
|
||||
+ mutex_lock(&rtwdev->mutex);
|
||||
val = rtw_read_rf(rtwdev, path, addr, mask);
|
||||
+ mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
seq_printf(m, "rf_read path:%d addr:0x%08x mask:0x%08x val=0x%08x\n",
|
||||
path, addr, mask, val);
|
||||
@@ -418,7 +420,9 @@ static ssize_t rtw_debugfs_set_rf_write(struct file *filp,
|
||||
return count;
|
||||
}
|
||||
|
||||
+ mutex_lock(&rtwdev->mutex);
|
||||
rtw_write_rf(rtwdev, path, addr, mask, val);
|
||||
+ mutex_unlock(&rtwdev->mutex);
|
||||
rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
|
||||
"write_rf path:%d addr:0x%08x mask:0x%08x, val:0x%08x\n",
|
||||
path, addr, mask, val);
|
||||
@@ -523,6 +527,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
|
||||
u32 addr, offset, data;
|
||||
u8 path;
|
||||
|
||||
+ mutex_lock(&rtwdev->mutex);
|
||||
+
|
||||
for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
|
||||
seq_printf(m, "RF path:%d\n", path);
|
||||
for (addr = 0; addr < 0x100; addr += 4) {
|
||||
@@ -537,6 +543,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
|
||||
seq_puts(m, "\n");
|
||||
}
|
||||
|
||||
+ mutex_unlock(&rtwdev->mutex);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1027,6 +1035,8 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m)
|
||||
dm_info->dm_flags & BIT(RTW_DM_CAP_TXGAPK) ? '-' : '+',
|
||||
rtw_dm_cap_strs[RTW_DM_CAP_TXGAPK]);
|
||||
|
||||
+ mutex_lock(&rtwdev->mutex);
|
||||
+
|
||||
for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
|
||||
val = rtw_read_rf(rtwdev, path, RF_GAINTX, RFREG_MASK);
|
||||
seq_printf(m, "path %d:\n0x%x = 0x%x\n", path, RF_GAINTX, val);
|
||||
@@ -1036,6 +1046,7 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m)
|
||||
txgapk->rf3f_fs[path][i], i);
|
||||
seq_puts(m, "\n");
|
||||
}
|
||||
+ mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/hci.h b/drivers/net/wireless/realtek/rtw88/hci.h
|
||||
index 4c6fc6fb3f83b..830d7532f2a35 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/hci.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/hci.h
|
||||
@@ -166,12 +166,11 @@ static inline u32
|
||||
rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
|
||||
u32 addr, u32 mask)
|
||||
{
|
||||
- unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
- spin_lock_irqsave(&rtwdev->rf_lock, flags);
|
||||
+ lockdep_assert_held(&rtwdev->mutex);
|
||||
+
|
||||
val = rtwdev->chip->ops->read_rf(rtwdev, rf_path, addr, mask);
|
||||
- spin_unlock_irqrestore(&rtwdev->rf_lock, flags);
|
||||
|
||||
return val;
|
||||
}
|
||||
@@ -180,11 +179,9 @@ static inline void
|
||||
rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
|
||||
u32 addr, u32 mask, u32 data)
|
||||
{
|
||||
- unsigned long flags;
|
||||
+ lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
- spin_lock_irqsave(&rtwdev->rf_lock, flags);
|
||||
rtwdev->chip->ops->write_rf(rtwdev, rf_path, addr, mask, data);
|
||||
- spin_unlock_irqrestore(&rtwdev->rf_lock, flags);
|
||||
}
|
||||
|
||||
static inline u32
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index 8b9899e41b0bb..f9864840ffd9c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -1994,7 +1994,6 @@ int rtw_core_init(struct rtw_dev *rtwdev)
|
||||
skb_queue_head_init(&rtwdev->coex.queue);
|
||||
skb_queue_head_init(&rtwdev->tx_report.queue);
|
||||
|
||||
- spin_lock_init(&rtwdev->rf_lock);
|
||||
spin_lock_init(&rtwdev->h2c.lock);
|
||||
spin_lock_init(&rtwdev->txq_lock);
|
||||
spin_lock_init(&rtwdev->tx_report.q_lock);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 17815af9dd4ea..df6c6032bbd3b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1994,9 +1994,6 @@ struct rtw_dev {
|
||||
/* ensures exclusive access from mac80211 callbacks */
|
||||
struct mutex mutex;
|
||||
|
||||
- /* read/write rf register */
|
||||
- spinlock_t rf_lock;
|
||||
-
|
||||
/* watch dog every 2 sec */
|
||||
struct delayed_work watch_dog_work;
|
||||
u32 watch_dog_cnt;
|
@ -0,0 +1,97 @@
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
index ba5ba852efb8c..79939aa6b752c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
@@ -396,7 +396,9 @@ static ssize_t rtw_debugfs_set_h2c(struct file *filp,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ mutex_lock(&rtwdev->mutex);
|
||||
rtw_fw_h2c_cmd_dbg(rtwdev, param);
|
||||
+ mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return count;
|
||||
}
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index aa2aeb5fb2ccd..c3ad2a1b47212 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -320,7 +320,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
|
||||
h2c[3], h2c[2], h2c[1], h2c[0],
|
||||
h2c[7], h2c[6], h2c[5], h2c[4]);
|
||||
|
||||
- spin_lock(&rtwdev->h2c.lock);
|
||||
+ lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
box = rtwdev->h2c.last_box_num;
|
||||
switch (box) {
|
||||
@@ -342,7 +342,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
|
||||
break;
|
||||
default:
|
||||
WARN(1, "invalid h2c mail box number\n");
|
||||
- goto out;
|
||||
+ return;
|
||||
}
|
||||
|
||||
ret = read_poll_timeout_atomic(rtw_read8, box_state,
|
||||
@@ -351,7 +351,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
|
||||
|
||||
if (ret) {
|
||||
rtw_err(rtwdev, "failed to send h2c command\n");
|
||||
- goto out;
|
||||
+ return;
|
||||
}
|
||||
|
||||
for (idx = 0; idx < 4; idx++)
|
||||
@@ -361,9 +361,6 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
|
||||
|
||||
if (++rtwdev->h2c.last_box_num >= 4)
|
||||
rtwdev->h2c.last_box_num = 0;
|
||||
-
|
||||
-out:
|
||||
- spin_unlock(&rtwdev->h2c.lock);
|
||||
}
|
||||
|
||||
void rtw_fw_h2c_cmd_dbg(struct rtw_dev *rtwdev, u8 *h2c)
|
||||
@@ -375,15 +372,13 @@ static void rtw_fw_send_h2c_packet(struct rtw_dev *rtwdev, u8 *h2c_pkt)
|
||||
{
|
||||
int ret;
|
||||
|
||||
- spin_lock(&rtwdev->h2c.lock);
|
||||
+ lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
FW_OFFLOAD_H2C_SET_SEQ_NUM(h2c_pkt, rtwdev->h2c.seq);
|
||||
ret = rtw_hci_write_data_h2c(rtwdev, h2c_pkt, H2C_PKT_SIZE);
|
||||
if (ret)
|
||||
rtw_err(rtwdev, "failed to send h2c packet\n");
|
||||
rtwdev->h2c.seq++;
|
||||
-
|
||||
- spin_unlock(&rtwdev->h2c.lock);
|
||||
}
|
||||
|
||||
void
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index f9864840ffd9c..baf4d29fde678 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -1994,7 +1994,6 @@ int rtw_core_init(struct rtw_dev *rtwdev)
|
||||
skb_queue_head_init(&rtwdev->coex.queue);
|
||||
skb_queue_head_init(&rtwdev->tx_report.queue);
|
||||
|
||||
- spin_lock_init(&rtwdev->h2c.lock);
|
||||
spin_lock_init(&rtwdev->txq_lock);
|
||||
spin_lock_init(&rtwdev->tx_report.q_lock);
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index df6c6032bbd3b..619ee6e8d2807 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -2018,8 +2018,6 @@ struct rtw_dev {
|
||||
struct {
|
||||
/* incicate the mail box to use with fw */
|
||||
u8 last_box_num;
|
||||
- /* protect to send h2c to fw */
|
||||
- spinlock_t lock;
|
||||
u32 seq;
|
||||
} h2c;
|
||||
|
@ -0,0 +1,68 @@
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
index cac053f485c3b..b156f8c48ffbb 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
@@ -633,7 +633,7 @@ static struct sk_buff *rtw_coex_info_request(struct rtw_dev *rtwdev,
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct sk_buff *skb_resp = NULL;
|
||||
|
||||
- mutex_lock(&coex->mutex);
|
||||
+ lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
rtw_fw_query_bt_mp_info(rtwdev, req);
|
||||
|
||||
@@ -650,7 +650,6 @@ static struct sk_buff *rtw_coex_info_request(struct rtw_dev *rtwdev,
|
||||
}
|
||||
|
||||
out:
|
||||
- mutex_unlock(&coex->mutex);
|
||||
return skb_resp;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
index 79939aa6b752c..1453a32ea3ef0 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
@@ -842,7 +842,9 @@ static int rtw_debugfs_get_coex_info(struct seq_file *m, void *v)
|
||||
struct rtw_debugfs_priv *debugfs_priv = m->private;
|
||||
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
|
||||
|
||||
+ mutex_lock(&rtwdev->mutex);
|
||||
rtw_coex_display_coex_info(rtwdev, m);
|
||||
+ mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index baf4d29fde678..5afb8bef9696a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -1998,7 +1998,6 @@ int rtw_core_init(struct rtw_dev *rtwdev)
|
||||
spin_lock_init(&rtwdev->tx_report.q_lock);
|
||||
|
||||
mutex_init(&rtwdev->mutex);
|
||||
- mutex_init(&rtwdev->coex.mutex);
|
||||
mutex_init(&rtwdev->hal.tx_power_mutex);
|
||||
|
||||
init_waitqueue_head(&rtwdev->coex.wait);
|
||||
@@ -2066,7 +2065,6 @@ void rtw_core_deinit(struct rtw_dev *rtwdev)
|
||||
}
|
||||
|
||||
mutex_destroy(&rtwdev->mutex);
|
||||
- mutex_destroy(&rtwdev->coex.mutex);
|
||||
mutex_destroy(&rtwdev->hal.tx_power_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_core_deinit);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 619ee6e8d2807..fc27066a67a72 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1507,8 +1507,6 @@ struct rtw_coex_stat {
|
||||
};
|
||||
|
||||
struct rtw_coex {
|
||||
- /* protects coex info request section */
|
||||
- struct mutex mutex;
|
||||
struct sk_buff_head queue;
|
||||
wait_queue_head_t wait;
|
||||
|
@ -0,0 +1,185 @@
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
index e505d17f107e4..5521a7c2c1afe 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
@@ -300,7 +300,7 @@ static void rtw_phy_stat_rssi(struct rtw_dev *rtwdev)
|
||||
|
||||
data.rtwdev = rtwdev;
|
||||
data.min_rssi = U8_MAX;
|
||||
- rtw_iterate_stas_atomic(rtwdev, rtw_phy_stat_rssi_iter, &data);
|
||||
+ rtw_iterate_stas(rtwdev, rtw_phy_stat_rssi_iter, &data);
|
||||
|
||||
dm_info->pre_min_rssi = dm_info->min_rssi;
|
||||
dm_info->min_rssi = data.min_rssi;
|
||||
@@ -544,7 +544,7 @@ static void rtw_phy_ra_info_update(struct rtw_dev *rtwdev)
|
||||
if (rtwdev->watch_dog_cnt & 0x3)
|
||||
return;
|
||||
|
||||
- rtw_iterate_stas_atomic(rtwdev, rtw_phy_ra_info_update_iter, rtwdev);
|
||||
+ rtw_iterate_stas(rtwdev, rtw_phy_ra_info_update_iter, rtwdev);
|
||||
}
|
||||
|
||||
static u32 rtw_phy_get_rrsr_mask(struct rtw_dev *rtwdev, u8 rate_idx)
|
||||
@@ -597,7 +597,7 @@ static void rtw_phy_rrsr_update(struct rtw_dev *rtwdev)
|
||||
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
|
||||
|
||||
dm_info->rrsr_mask_min = RRSR_RATE_ORDER_MAX;
|
||||
- rtw_iterate_stas_atomic(rtwdev, rtw_phy_rrsr_mask_min_iter, rtwdev);
|
||||
+ rtw_iterate_stas(rtwdev, rtw_phy_rrsr_mask_min_iter, rtwdev);
|
||||
rtw_write32(rtwdev, REG_RRSR, dm_info->rrsr_val_init & dm_info->rrsr_mask_min);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
index bfa64c038f5f0..a7213ff2c2244 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
@@ -58,7 +58,7 @@ int rtw_leave_ips(struct rtw_dev *rtwdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
- rtw_iterate_vifs_atomic(rtwdev, rtw_restore_port_cfg_iter, rtwdev);
|
||||
+ rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev);
|
||||
|
||||
rtw_coex_ips_notify(rtwdev, COEX_IPS_LEAVE);
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/util.c b/drivers/net/wireless/realtek/rtw88/util.c
|
||||
index 2c515af214e76..ed61c962fa27f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/util.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/util.c
|
||||
@@ -105,3 +105,106 @@ void rtw_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss)
|
||||
*mcs = rate - DESC_RATEMCS0;
|
||||
}
|
||||
}
|
||||
+
|
||||
+struct rtw_stas_entry {
|
||||
+ struct list_head list;
|
||||
+ struct ieee80211_sta *sta;
|
||||
+};
|
||||
+
|
||||
+struct rtw_iter_stas_data {
|
||||
+ struct rtw_dev *rtwdev;
|
||||
+ struct list_head list;
|
||||
+};
|
||||
+
|
||||
+static void rtw_collect_sta_iter(void *data, struct ieee80211_sta *sta)
|
||||
+{
|
||||
+ struct rtw_iter_stas_data *iter_stas = data;
|
||||
+ struct rtw_stas_entry *stas_entry;
|
||||
+
|
||||
+ stas_entry = kmalloc(sizeof(*stas_entry), GFP_ATOMIC);
|
||||
+ if (!stas_entry)
|
||||
+ return;
|
||||
+
|
||||
+ stas_entry->sta = sta;
|
||||
+ list_add_tail(&stas_entry->list, &iter_stas->list);
|
||||
+}
|
||||
+
|
||||
+void rtw_iterate_stas(struct rtw_dev *rtwdev,
|
||||
+ void (*iterator)(void *data,
|
||||
+ struct ieee80211_sta *sta),
|
||||
+ void *data)
|
||||
+{
|
||||
+ struct rtw_iter_stas_data iter_data;
|
||||
+ struct rtw_stas_entry *sta_entry, *tmp;
|
||||
+
|
||||
+ /* &rtwdev->mutex makes sure no stations can be removed between
|
||||
+ * collecting the stations and iterating over them.
|
||||
+ */
|
||||
+ lockdep_assert_held(&rtwdev->mutex);
|
||||
+
|
||||
+ iter_data.rtwdev = rtwdev;
|
||||
+ INIT_LIST_HEAD(&iter_data.list);
|
||||
+
|
||||
+ ieee80211_iterate_stations_atomic(rtwdev->hw, rtw_collect_sta_iter,
|
||||
+ &iter_data);
|
||||
+
|
||||
+ list_for_each_entry_safe(sta_entry, tmp, &iter_data.list,
|
||||
+ list) {
|
||||
+ list_del_init(&sta_entry->list);
|
||||
+ iterator(data, sta_entry->sta);
|
||||
+ kfree(sta_entry);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+struct rtw_vifs_entry {
|
||||
+ struct list_head list;
|
||||
+ struct ieee80211_vif *vif;
|
||||
+ u8 mac[ETH_ALEN];
|
||||
+};
|
||||
+
|
||||
+struct rtw_iter_vifs_data {
|
||||
+ struct rtw_dev *rtwdev;
|
||||
+ struct list_head list;
|
||||
+};
|
||||
+
|
||||
+void rtw_collect_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
|
||||
+{
|
||||
+ struct rtw_iter_vifs_data *iter_stas = data;
|
||||
+ struct rtw_vifs_entry *vifs_entry;
|
||||
+
|
||||
+ vifs_entry = kmalloc(sizeof(*vifs_entry), GFP_ATOMIC);
|
||||
+ if (!vifs_entry)
|
||||
+ return;
|
||||
+
|
||||
+ vifs_entry->vif = vif;
|
||||
+ ether_addr_copy(vifs_entry->mac, mac);
|
||||
+ list_add_tail(&vifs_entry->list, &iter_stas->list);
|
||||
+}
|
||||
+
|
||||
+void rtw_iterate_vifs(struct rtw_dev *rtwdev,
|
||||
+ void (*iterator)(void *data, u8 *mac,
|
||||
+ struct ieee80211_vif *vif),
|
||||
+ void *data)
|
||||
+{
|
||||
+ struct rtw_iter_vifs_data iter_data;
|
||||
+ struct rtw_vifs_entry *vif_entry, *tmp;
|
||||
+
|
||||
+ /* &rtwdev->mutex makes sure no interfaces can be removed between
|
||||
+ * collecting the interfaces and iterating over them.
|
||||
+ */
|
||||
+ lockdep_assert_held(&rtwdev->mutex);
|
||||
+
|
||||
+ iter_data.rtwdev = rtwdev;
|
||||
+ INIT_LIST_HEAD(&iter_data.list);
|
||||
+
|
||||
+ ieee80211_iterate_active_interfaces_atomic(rtwdev->hw,
|
||||
+ IEEE80211_IFACE_ITER_NORMAL,
|
||||
+ rtw_collect_vif_iter, &iter_data);
|
||||
+
|
||||
+ list_for_each_entry_safe(vif_entry, tmp, &iter_data.list,
|
||||
+ list) {
|
||||
+ list_del_init(&vif_entry->list);
|
||||
+ iterator(data, vif_entry->mac, vif_entry->vif);
|
||||
+ kfree(vif_entry);
|
||||
+ }
|
||||
+}
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/util.h b/drivers/net/wireless/realtek/rtw88/util.h
|
||||
index 0c23b5069be0b..dc89655254002 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/util.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/util.h
|
||||
@@ -7,9 +7,6 @@
|
||||
|
||||
struct rtw_dev;
|
||||
|
||||
-#define rtw_iterate_vifs(rtwdev, iterator, data) \
|
||||
- ieee80211_iterate_active_interfaces(rtwdev->hw, \
|
||||
- IEEE80211_IFACE_ITER_NORMAL, iterator, data)
|
||||
#define rtw_iterate_vifs_atomic(rtwdev, iterator, data) \
|
||||
ieee80211_iterate_active_interfaces_atomic(rtwdev->hw, \
|
||||
IEEE80211_IFACE_ITER_NORMAL, iterator, data)
|
||||
@@ -20,6 +17,15 @@ struct rtw_dev;
|
||||
#define rtw_iterate_keys_rcu(rtwdev, vif, iterator, data) \
|
||||
ieee80211_iter_keys_rcu((rtwdev)->hw, vif, iterator, data)
|
||||
|
||||
+void rtw_iterate_vifs(struct rtw_dev *rtwdev,
|
||||
+ void (*iterator)(void *data, u8 *mac,
|
||||
+ struct ieee80211_vif *vif),
|
||||
+ void *data);
|
||||
+void rtw_iterate_stas(struct rtw_dev *rtwdev,
|
||||
+ void (*iterator)(void *data,
|
||||
+ struct ieee80211_sta *sta),
|
||||
+ void *data);
|
||||
+
|
||||
static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr)
|
||||
{
|
||||
__le16 fc = hdr->frame_control;
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,212 @@
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig
|
||||
index 1624c5db69bac..2b500dbefbc2d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/Kconfig
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/Kconfig
|
||||
@@ -75,6 +75,18 @@ config RTW88_8821CE
|
||||
|
||||
802.11ac PCIe wireless network adapter
|
||||
|
||||
+config RTW88_8821CU
|
||||
+ tristate "Realtek 8821CU USB wireless network adapter"
|
||||
+ depends on m
|
||||
+ depends on USB
|
||||
+ select RTW88_CORE
|
||||
+ select RTW88_USB
|
||||
+ select RTW88_8821C
|
||||
+ help
|
||||
+ Select this option will enable support for 8821CU chipset
|
||||
+
|
||||
+ 802.11ac USB wireless network adapter
|
||||
+
|
||||
config RTW88_DEBUG
|
||||
bool "Realtek rtw88 debug support"
|
||||
depends on RTW88_CORE
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
index 9e095f8181483..3c1f08f12e44e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
@@ -44,6 +44,9 @@ rtw88_8821c-objs := rtw8821c.o rtw8821c_table.o
|
||||
obj-$(CPTCFG_RTW88_8821CE) += rtw88_8821ce.o
|
||||
rtw88_8821ce-objs := rtw8821ce.o
|
||||
|
||||
+obj-$(CPTCFG_RTW88_8821CU) += rtw88_8821cu.o
|
||||
+rtw88_8821cu-objs := rtw8821cu.o
|
||||
+
|
||||
obj-$(CPTCFG_RTW88_PCI) += rtw88_pci.o
|
||||
rtw88_pci-objs := pci.o
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index 99eee128ae945..82e78559d8264 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -26,6 +26,12 @@ static void rtw8821ce_efuse_parsing(struct rtw_efuse *efuse,
|
||||
ether_addr_copy(efuse->addr, map->e.mac_addr);
|
||||
}
|
||||
|
||||
+static void rtw8821cu_efuse_parsing(struct rtw_efuse *efuse,
|
||||
+ struct rtw8821c_efuse *map)
|
||||
+{
|
||||
+ ether_addr_copy(efuse->addr, map->u.mac_addr);
|
||||
+}
|
||||
+
|
||||
enum rtw8821ce_rf_set {
|
||||
SWITCH_TO_BTG,
|
||||
SWITCH_TO_WLG,
|
||||
@@ -68,6 +74,9 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
|
||||
case RTW_HCI_TYPE_PCIE:
|
||||
rtw8821ce_efuse_parsing(efuse, map);
|
||||
break;
|
||||
+ case RTW_HCI_TYPE_USB:
|
||||
+ rtw8821cu_efuse_parsing(efuse, map);
|
||||
+ break;
|
||||
default:
|
||||
/* unsupported now */
|
||||
return -ENOTSUPP;
|
||||
@@ -1142,6 +1151,18 @@ static void rtw8821c_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
|
||||
dm_info->cck_pd_default + new_lvl * 2);
|
||||
}
|
||||
|
||||
+static void rtw8821c_fill_txdesc_checksum(struct rtw_dev *rtwdev,
|
||||
+ struct rtw_tx_pkt_info *pkt_info,
|
||||
+ u8 *txdesc)
|
||||
+{
|
||||
+ struct rtw_chip_info *chip = rtwdev->chip;
|
||||
+ size_t words;
|
||||
+
|
||||
+ words = (pkt_info->pkt_offset * 8 + chip->tx_pkt_desc_sz) / 2;
|
||||
+
|
||||
+ fill_txdesc_checksum_common(txdesc, words);
|
||||
+}
|
||||
+
|
||||
static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = {
|
||||
{0x0086,
|
||||
RTW_PWR_CUT_ALL_MSK,
|
||||
@@ -1499,6 +1499,9 @@
|
||||
static const struct rtw_rfe_def rtw8821c_rfe_defs[] = {
|
||||
[0] = RTW_DEF_RFE(8821c, 0, 0),
|
||||
[2] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2),
|
||||
+ [4] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2),
|
||||
+ [6] = RTW_DEF_RFE(8821c, 0, 0),
|
||||
+ [34] = RTW_DEF_RFE(8821c, 0, 0),
|
||||
};
|
||||
|
||||
static struct rtw_hw_reg rtw8821c_dig[] = {
|
||||
@@ -1589,6 +1611,7 @@ static struct rtw_chip_ops rtw8821c_ops = {
|
||||
.config_bfee = rtw8821c_bf_config_bfee,
|
||||
.set_gid_table = rtw_bf_set_gid_table,
|
||||
.cfg_csi_rate = rtw_bf_cfg_csi_rate,
|
||||
+ .fill_txdesc_checksum = rtw8821c_fill_txdesc_checksum,
|
||||
|
||||
.coex_set_init = rtw8821c_coex_cfg_init,
|
||||
.coex_set_ant_switch = rtw8821c_coex_cfg_ant_switch,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
||||
index d9fbddd7b0f35..e2e17a822e48d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
||||
@@ -9,6 +9,26 @@
|
||||
|
||||
#define RCR_VHT_ACK BIT(26)
|
||||
|
||||
+struct rtw8821cu_efuse {
|
||||
+ u8 res4[4]; /* 0xd0 */
|
||||
+ u8 usb_optional_function;
|
||||
+ u8 res5[0x1e];
|
||||
+ u8 res6[2];
|
||||
+ u8 serial[0x0b]; /* 0xf5 */
|
||||
+ u8 vid; /* 0x100 */
|
||||
+ u8 res7;
|
||||
+ u8 pid;
|
||||
+ u8 res8[4];
|
||||
+ u8 mac_addr[ETH_ALEN]; /* 0x107 */
|
||||
+ u8 res9[2];
|
||||
+ u8 vendor_name[0x07];
|
||||
+ u8 res10[2];
|
||||
+ u8 device_name[0x14];
|
||||
+ u8 res11[0xcf];
|
||||
+ u8 package_type; /* 0x1fb */
|
||||
+ u8 res12[0x4];
|
||||
+};
|
||||
+
|
||||
struct rtw8821ce_efuse {
|
||||
u8 mac_addr[ETH_ALEN]; /* 0xd0 */
|
||||
u8 vender_id[2];
|
||||
@@ -73,6 +93,7 @@ struct rtw8821c_efuse {
|
||||
u8 res[3];
|
||||
union {
|
||||
struct rtw8821ce_efuse e;
|
||||
+ struct rtw8821cu_efuse u;
|
||||
};
|
||||
};
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821cu.c b/drivers/net/wireless/realtek/rtw88/rtw8821cu.c
|
||||
new file mode 100644
|
||||
index 0000000000000..f43e200515f5b
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cu.c
|
||||
@@ -0,0 +1,50 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2018-2019 Realtek Corporation
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/usb.h>
|
||||
+#include "main.h"
|
||||
+#include "rtw8821cu.h"
|
||||
+#include "usb.h"
|
||||
+
|
||||
+static const struct usb_device_id rtw_8821cu_id_table[] = {
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb82b, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb820, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc821, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc820, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82a, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82b, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8821CU */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc811, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8811CU */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8811, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* 8811CU */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x2006, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821c_hw_spec) }, /* TOTOLINK A650UA v3 */
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(usb, rtw_8821cu_id_table);
|
||||
+
|
||||
+static int rtw_8821cu_probe(struct usb_interface *intf,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ return rtw_usb_probe(intf, id);
|
||||
+}
|
||||
+
|
||||
+static struct usb_driver rtw_8821cu_driver = {
|
||||
+ .name = "rtw_8821cu",
|
||||
+ .id_table = rtw_8821cu_id_table,
|
||||
+ .probe = rtw_8821cu_probe,
|
||||
+ .disconnect = rtw_usb_disconnect,
|
||||
+};
|
||||
+module_usb_driver(rtw_8821cu_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Hans Ulli Kroll <linux@ulli-kroll.de>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cu driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821cu.h b/drivers/net/wireless/realtek/rtw88/rtw8821cu.h
|
||||
new file mode 100644
|
||||
index 0000000000000..c896792240011
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cu.h
|
||||
@@ -0,0 +1,10 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
+/* Copyright(c) 2018-2019 Realtek Corporation
|
||||
+ */
|
||||
+
|
||||
+#ifndef __RTW_8821CU_H_
|
||||
+#define __RTW_8821CU_H_
|
||||
+
|
||||
+extern struct rtw_chip_info rtw8821c_hw_spec;
|
||||
+
|
||||
+#endif
|
@ -0,0 +1,14 @@
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
index 3c07485d6ba47..fb5faf3bf1eed 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
|
||||
@@ -89,7 +89,8 @@ static int rtw_ops_config(struct ieee80211_hw *hw, u32 changed)
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_PS) {
|
||||
- if (hw->conf.flags & IEEE80211_CONF_PS) {
|
||||
+ if (hw->conf.flags & IEEE80211_CONF_PS &&
|
||||
+ rtw_hci_type(rtwdev) != RTW_HCI_TYPE_USB) {
|
||||
rtwdev->ps_enabled = true;
|
||||
} else {
|
||||
rtwdev->ps_enabled = false;
|
@ -25,8 +25,8 @@ config-y += RTL8XXXU_UNTESTED
|
||||
config-$(call config_package,rtl8723bs) += RTL8723BS
|
||||
config-y += STAGING
|
||||
|
||||
config-$(call config_package,rtw88) += RTW88 RTW88_CORE RTW88_PCI
|
||||
config-y += RTW88_8822BE RTW88_8822CE RTW88_8723DE
|
||||
config-$(call config_package,rtw88) += RTW88 RTW88_CORE RTW88_PCI RTW88_USB
|
||||
config-y += RTW88_8821CU RTW88_8822BE RTW88_8822CE RTW88_8723DE
|
||||
config-$(CONFIG_PACKAGE_RTW88_DEBUG) += RTW88_DEBUG
|
||||
config-$(CONFIG_PACKAGE_RTW88_DEBUGFS) += RTW88_DEBUGFS
|
||||
|
||||
@ -195,9 +195,11 @@ endef
|
||||
|
||||
define KernelPackage/rtw88
|
||||
$(call KernelPackage/mac80211/Default)
|
||||
TITLE:=Realtek RTL8822BE/RTL8822CE/RTL8723DE
|
||||
DEPENDS+= @(PCI_SUPPORT) +kmod-mac80211 +@DRIVER_11AC_SUPPORT +@DRIVER_11N_SUPPORT
|
||||
TITLE:=Realtek RTL8821CU/RTL8822BE/RTL8822CE/RTL8723DE
|
||||
DEPENDS+= @(PCI_SUPPORT||USB_SUPPORT) +kmod-mac80211 +@DRIVER_11AC_SUPPORT +@DRIVER_11N_SUPPORT
|
||||
FILES:=\
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_8821c.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_8821cu.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_8822be.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_8822b.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_8822ce.ko \
|
||||
@ -205,8 +207,9 @@ define KernelPackage/rtw88
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_8723de.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_8723d.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_core.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_pci.ko
|
||||
AUTOLOAD:=$(call AutoProbe,rtw88_8822be rtw88_8822ce rtw88_8723de)
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_pci.ko \
|
||||
$(PKG_BUILD_DIR)/drivers/net/wireless/realtek/rtw88/rtw88_usb.ko
|
||||
AUTOLOAD:=$(call AutoProbe,rtw88_8821cu rtw88_8822be rtw88_8822ce rtw88_8723de)
|
||||
endef
|
||||
|
||||
define KernelPackage/rtl8723bs
|
||||
|
Loading…
Reference in New Issue
Block a user