mirror of
https://github.com/opnsense/src.git
synced 2026-02-04 03:00:53 -06:00
rtw89: merge Realtek's rtw89 driver based on Linux v6.14
This version is based on git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 38fec10eb60d687e30c8c6b5420d86e8149f7557 ( tag: v6.14 ). Sponsored by: The FreeBSD Foundation (cherry picked from commit df279a26d3315e7abc9e6f0744137959a4c2fb86)
This commit is contained in:
parent
53e30a7797
commit
75a6ccfd21
@ -12,6 +12,7 @@ if RTW89
|
||||
|
||||
config RTW89_CORE
|
||||
tristate
|
||||
select WANT_DEV_COREDUMP
|
||||
|
||||
config RTW89_PCI
|
||||
tristate
|
||||
@ -28,6 +29,9 @@ config RTW89_8852B_COMMON
|
||||
config RTW89_8852B
|
||||
tristate
|
||||
|
||||
config RTW89_8852BT
|
||||
tristate
|
||||
|
||||
config RTW89_8852C
|
||||
tristate
|
||||
|
||||
@ -68,6 +72,18 @@ config RTW89_8852BE
|
||||
|
||||
802.11ax PCIe wireless network (Wi-Fi 6) adapter
|
||||
|
||||
config RTW89_8852BTE
|
||||
tristate "Realtek 8852BE-VT PCI wireless network (Wi-Fi 6) adapter"
|
||||
depends on PCI
|
||||
select RTW89_CORE
|
||||
select RTW89_PCI
|
||||
select RTW89_8852BT
|
||||
select RTW89_8852B_COMMON
|
||||
help
|
||||
Select this option will enable support for 8852BE-VT chipset
|
||||
|
||||
802.11ax PCIe wireless network (Wi-Fi 6) adapter
|
||||
|
||||
config RTW89_8852CE
|
||||
tristate "Realtek 8852CE PCI wireless network (Wi-Fi 6E) adapter"
|
||||
depends on PCI
|
||||
@ -80,17 +96,19 @@ config RTW89_8852CE
|
||||
802.11ax PCIe wireless network (Wi-Fi 6E) adapter
|
||||
|
||||
config RTW89_8922AE
|
||||
tristate "Realtek 8922AE PCI wireless network (Wi-Fi 7) adapter"
|
||||
tristate "Realtek 8922AE/8922AE-VS PCI wireless network (Wi-Fi 7) adapter"
|
||||
depends on PCI
|
||||
select RTW89_CORE
|
||||
select RTW89_PCI
|
||||
select RTW89_8922A
|
||||
help
|
||||
Select this option will enable support for 8922AE chipset
|
||||
Select this option will enable support for 8922AE/8922AE-VS chipset
|
||||
|
||||
802.11be PCIe wireless network (Wi-Fi 7) adapter
|
||||
supporting 2x2 2GHz/5GHz/6GHz 4096-QAM 160MHz channels.
|
||||
|
||||
The variant 8922AE-VS has the same features except 1024-QAM.
|
||||
|
||||
config RTW89_DEBUG
|
||||
bool
|
||||
|
||||
|
||||
@ -52,6 +52,14 @@ rtw89_8852b-objs := rtw8852b.o \
|
||||
obj-$(CONFIG_RTW89_8852BE) += rtw89_8852be.o
|
||||
rtw89_8852be-objs := rtw8852be.o
|
||||
|
||||
obj-$(CONFIG_RTW89_8852BT) += rtw89_8852bt.o
|
||||
rtw89_8852bt-objs := rtw8852bt.o \
|
||||
rtw8852bt_rfk.o \
|
||||
rtw8852bt_rfk_table.o
|
||||
|
||||
obj-$(CONFIG_RTW89_8852BTE) += rtw89_8852bte.o
|
||||
rtw89_8852bte-objs := rtw8852bte.o
|
||||
|
||||
obj-$(CONFIG_RTW89_8852C) += rtw89_8852c.o
|
||||
rtw89_8852c-objs := rtw8852c.o \
|
||||
rtw8852c_table.o \
|
||||
|
||||
@ -157,3 +157,67 @@ int rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev,
|
||||
return -ENOENT;
|
||||
}
|
||||
#endif
|
||||
|
||||
int rtw89_acpi_evaluate_rtag(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_acpi_rtag_result *res)
|
||||
{
|
||||
struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
acpi_handle root, handle;
|
||||
union acpi_object *obj;
|
||||
acpi_status status;
|
||||
u32 buf_len;
|
||||
int ret = 0;
|
||||
|
||||
root = ACPI_HANDLE(rtwdev->dev);
|
||||
if (!root)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
status = acpi_get_handle(root, (acpi_string)"RTAG", &handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -EIO;
|
||||
|
||||
status = acpi_evaluate_object(handle, NULL, NULL, &buf);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -EIO;
|
||||
|
||||
#if defined(__linux__)
|
||||
obj = buf.pointer;
|
||||
if (obj->type != ACPI_TYPE_BUFFER) {
|
||||
#elif defined(__FreeBSD__)
|
||||
obj = buf.Pointer;
|
||||
if (obj->Type != ACPI_TYPE_BUFFER) {
|
||||
#endif
|
||||
rtw89_debug(rtwdev, RTW89_DBG_ACPI,
|
||||
#if defined(__linux__)
|
||||
"acpi: expect buffer but type: %d\n", obj->type);
|
||||
#elif defined(__FreeBSD__)
|
||||
"acpi: expect buffer but type: %d\n", obj->Type);
|
||||
#endif
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
#if defined(__linux__)
|
||||
buf_len = obj->buffer.length;
|
||||
#elif defined(__FreeBSD__)
|
||||
buf_len = obj->Buffer.Length;
|
||||
#endif
|
||||
if (buf_len != sizeof(*res)) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_ACPI, "%s: invalid buffer length: %u\n",
|
||||
__func__, buf_len);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
#if defined(__linux__)
|
||||
*res = *(struct rtw89_acpi_rtag_result *)obj->buffer.pointer;
|
||||
#elif defined(__FreeBSD__)
|
||||
*res = *(struct rtw89_acpi_rtag_result *)obj->Buffer.Pointer;
|
||||
#endif
|
||||
|
||||
rtw89_hex_dump(rtwdev, RTW89_DBG_ACPI, "antenna_gain: ", res, sizeof(*res));
|
||||
|
||||
out:
|
||||
ACPI_FREE(obj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -63,8 +63,17 @@ struct rtw89_acpi_dsm_result {
|
||||
} u;
|
||||
};
|
||||
|
||||
struct rtw89_acpi_rtag_result {
|
||||
u8 tag[4];
|
||||
u8 revision;
|
||||
__le32 domain;
|
||||
u8 ant_gain_table[RTW89_ANT_GAIN_CHAIN_NUM][RTW89_ANT_GAIN_SUBBAND_NR];
|
||||
} __packed;
|
||||
|
||||
int rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_acpi_dsm_func func,
|
||||
struct rtw89_acpi_dsm_result *res);
|
||||
int rtw89_acpi_evaluate_rtag(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_acpi_rtag_result *res);
|
||||
|
||||
#endif
|
||||
|
||||
@ -135,8 +135,8 @@ again:
|
||||
}
|
||||
|
||||
static int rtw89_cam_get_addr_cam_key_idx(struct rtw89_addr_cam_entry *addr_cam,
|
||||
struct rtw89_sec_cam_entry *sec_cam,
|
||||
struct ieee80211_key_conf *key,
|
||||
const struct rtw89_sec_cam_entry *sec_cam,
|
||||
const struct ieee80211_key_conf *key,
|
||||
u8 *key_idx)
|
||||
{
|
||||
u8 idx;
|
||||
@ -211,25 +211,17 @@ static int rtw89_cam_get_addr_cam_key_idx(struct rtw89_addr_cam_entry *addr_cam,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
const struct rtw89_sec_cam_entry *sec_cam,
|
||||
bool inform_fw)
|
||||
static int __rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
const struct rtw89_sec_cam_entry *sec_cam,
|
||||
bool inform_fw)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_addr_cam_entry *addr_cam;
|
||||
unsigned int i;
|
||||
int ret = 0;
|
||||
|
||||
if (!vif) {
|
||||
rtw89_err(rtwdev, "No iface for deleting sec cam\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
addr_cam = rtw89_get_addr_cam_of(rtwvif, rtwsta);
|
||||
addr_cam = rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link);
|
||||
|
||||
for_each_set_bit(i, addr_cam->sec_cam_map, RTW89_SEC_CAM_IN_ADDR_CAM) {
|
||||
if (addr_cam->sec_ent[i] != sec_cam->sec_cam_idx)
|
||||
@ -239,11 +231,11 @@ static int rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
if (inform_fw) {
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif_link, rtwsta_link);
|
||||
if (ret)
|
||||
rtw89_err(rtwdev,
|
||||
"failed to update dctl cam del key: %d\n", ret);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta_link, NULL);
|
||||
if (ret)
|
||||
rtw89_err(rtwdev, "failed to update cam del key: %d\n", ret);
|
||||
}
|
||||
@ -251,25 +243,17 @@ static int rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key,
|
||||
struct rtw89_sec_cam_entry *sec_cam)
|
||||
static int __rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
const struct ieee80211_key_conf *key,
|
||||
const struct rtw89_sec_cam_entry *sec_cam)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
|
||||
struct rtw89_vif *rtwvif;
|
||||
struct rtw89_addr_cam_entry *addr_cam;
|
||||
u8 key_idx = 0;
|
||||
int ret;
|
||||
|
||||
if (!vif) {
|
||||
rtw89_err(rtwdev, "No iface for adding sec cam\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
addr_cam = rtw89_get_addr_cam_of(rtwvif, rtwsta);
|
||||
addr_cam = rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link);
|
||||
|
||||
if (key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
|
||||
key->cipher == WLAN_CIPHER_SUITE_WEP104)
|
||||
@ -285,13 +269,13 @@ static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev,
|
||||
addr_cam->sec_ent_keyid[key_idx] = key->keyidx;
|
||||
addr_cam->sec_ent[key_idx] = sec_cam->sec_cam_idx;
|
||||
set_bit(key_idx, addr_cam->sec_cam_map);
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif_link, rtwsta_link);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to update dctl cam sec entry: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta_link, NULL);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to update addr cam sec entry: %d\n",
|
||||
ret);
|
||||
@ -302,6 +286,113 @@ static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtw89_cam_attach_link_sec_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
u8 sec_cam_idx)
|
||||
{
|
||||
struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
|
||||
const struct rtw89_sec_cam_entry *sec_cam;
|
||||
|
||||
sec_cam = cam_info->sec_entries[sec_cam_idx];
|
||||
if (!sec_cam)
|
||||
return -ENOENT;
|
||||
|
||||
return __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link, rtwsta_link,
|
||||
sec_cam->key_conf, sec_cam);
|
||||
}
|
||||
|
||||
static int rtw89_cam_detach_sec_cam(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
const struct rtw89_sec_cam_entry *sec_cam,
|
||||
bool inform_fw)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
|
||||
struct rtw89_sta_link *rtwsta_link;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_vif *rtwvif;
|
||||
unsigned int link_id;
|
||||
int ret;
|
||||
|
||||
if (!vif) {
|
||||
rtw89_err(rtwdev, "No iface for deleting sec cam\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rtwvif = vif_to_rtwvif(vif);
|
||||
|
||||
if (rtwsta)
|
||||
clear_bit(sec_cam->sec_cam_idx, rtwsta->pairwise_sec_cam_map);
|
||||
|
||||
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) {
|
||||
rtwsta_link = rtwsta ? rtwsta->links[link_id] : NULL;
|
||||
if (rtwsta && !rtwsta_link)
|
||||
continue;
|
||||
|
||||
ret = __rtw89_cam_detach_sec_cam(rtwdev, rtwvif_link, rtwsta_link,
|
||||
sec_cam, inform_fw);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_cam_attach_sec_cam(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key,
|
||||
struct rtw89_sec_cam_entry *sec_cam)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
|
||||
struct rtw89_sta_link *rtwsta_link;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_vif *rtwvif;
|
||||
unsigned int link_id;
|
||||
int key_link_id;
|
||||
int ret;
|
||||
|
||||
if (!vif) {
|
||||
rtw89_err(rtwdev, "No iface for adding sec cam\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rtwvif = vif_to_rtwvif(vif);
|
||||
|
||||
key_link_id = ieee80211_vif_is_mld(vif) ? key->link_id : 0;
|
||||
if (key_link_id >= 0) {
|
||||
rtwvif_link = rtwvif->links[key_link_id];
|
||||
rtwsta_link = rtwsta ? rtwsta->links[key_link_id] : NULL;
|
||||
|
||||
if (!rtwvif_link || (rtwsta && !rtwsta_link)) {
|
||||
rtw89_err(rtwdev, "No drv link for adding sec cam\n");
|
||||
return -ENOLINK;
|
||||
}
|
||||
|
||||
return __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link,
|
||||
rtwsta_link, key, sec_cam);
|
||||
}
|
||||
|
||||
/* key_link_id < 0: MLD pairwise key */
|
||||
if (!rtwsta) {
|
||||
rtw89_err(rtwdev, "No sta for adding MLD pairwise sec cam\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
|
||||
rtwvif_link = rtwsta_link->rtwvif_link;
|
||||
ret = __rtw89_cam_attach_sec_cam(rtwdev, rtwvif_link,
|
||||
rtwsta_link, key, sec_cam);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
set_bit(sec_cam->sec_cam_idx, rtwsta->pairwise_sec_cam_map);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_cam_sec_key_install(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
@ -340,6 +431,9 @@ static int rtw89_cam_sec_key_install(struct rtw89_dev *rtwdev,
|
||||
sec_cam->len = RTW89_SEC_CAM_LEN;
|
||||
sec_cam->ext_key = ext_key;
|
||||
memcpy(sec_cam->key, key->key, key->keylen);
|
||||
|
||||
sec_cam->key_conf = key;
|
||||
|
||||
ret = rtw89_cam_send_sec_key_cmd(rtwdev, sec_cam);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to send sec key cmd: %d\n", ret);
|
||||
@ -384,20 +478,24 @@ int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev,
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
hw_key_type = RTW89_SEC_KEY_TYPE_CCMP128;
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
if (!chip->hw_mgmt_tx_encrypt)
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
hw_key_type = RTW89_SEC_KEY_TYPE_CCMP256;
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
if (!chip->hw_mgmt_tx_encrypt)
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
ext_key = true;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
hw_key_type = RTW89_SEC_KEY_TYPE_GCMP128;
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
if (!chip->hw_mgmt_tx_encrypt)
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
hw_key_type = RTW89_SEC_KEY_TYPE_GCMP256;
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
if (!chip->hw_mgmt_tx_encrypt)
|
||||
key->flags |= IEEE80211_KEY_FLAG_SW_MGMT_TX;
|
||||
ext_key = true;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
@ -481,10 +579,10 @@ void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev,
|
||||
clear_bit(bssid_cam->bssid_cam_idx, cam_info->bssid_cam_map);
|
||||
}
|
||||
|
||||
void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_addr_cam_entry *addr_cam = &rtwvif->addr_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
|
||||
struct rtw89_addr_cam_entry *addr_cam = &rtwvif_link->addr_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
|
||||
|
||||
rtw89_cam_deinit_addr_cam(rtwdev, addr_cam);
|
||||
rtw89_cam_deinit_bssid_cam(rtwdev, bssid_cam);
|
||||
@ -589,7 +687,7 @@ static int rtw89_cam_get_avail_bssid_cam(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_bssid_cam_entry *bssid_cam,
|
||||
const u8 *bssid)
|
||||
{
|
||||
@ -609,7 +707,7 @@ int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
bssid_cam->bssid_cam_idx = bssid_cam_idx;
|
||||
bssid_cam->phy_idx = rtwvif->phy_idx;
|
||||
bssid_cam->phy_idx = rtwvif_link->phy_idx;
|
||||
bssid_cam->len = BSSID_CAM_ENT_SIZE;
|
||||
bssid_cam->offset = 0;
|
||||
bssid_cam->valid = true;
|
||||
@ -618,20 +716,21 @@ int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
|
||||
|
||||
ether_addr_copy(bssid_cam->bssid, rtwvif->bssid);
|
||||
ether_addr_copy(bssid_cam->bssid, rtwvif_link->bssid);
|
||||
}
|
||||
|
||||
int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_addr_cam_entry *addr_cam = &rtwvif->addr_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
|
||||
struct rtw89_addr_cam_entry *addr_cam = &rtwvif_link->addr_cam;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif, bssid_cam, rtwvif->bssid);
|
||||
ret = rtw89_cam_init_bssid_cam(rtwdev, rtwvif_link, bssid_cam,
|
||||
rtwvif_link->bssid);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to init bssid cam\n");
|
||||
return ret;
|
||||
@ -647,19 +746,27 @@ int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
}
|
||||
|
||||
int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta, u8 *cmd)
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link, u8 *cmd)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif, rtwsta);
|
||||
u8 bss_color = vif->bss_conf.he_bss_color.color;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = rtw89_get_bssid_cam_of(rtwvif_link,
|
||||
rtwsta_link);
|
||||
struct ieee80211_bss_conf *bss_conf;
|
||||
u8 bss_color;
|
||||
u8 bss_mask;
|
||||
|
||||
if (vif->bss_conf.nontransmitted)
|
||||
rcu_read_lock();
|
||||
|
||||
bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, false);
|
||||
bss_color = bss_conf->he_bss_color.color;
|
||||
|
||||
if (bss_conf->nontransmitted)
|
||||
bss_mask = RTW89_BSSID_MATCH_5_BYTES;
|
||||
else
|
||||
bss_mask = RTW89_BSSID_MATCH_ALL;
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
FWCMD_SET_ADDR_BSSID_IDX(cmd, bssid_cam->bssid_cam_idx);
|
||||
FWCMD_SET_ADDR_BSSID_OFFSET(cmd, bssid_cam->offset);
|
||||
FWCMD_SET_ADDR_BSSID_LEN(cmd, bssid_cam->len);
|
||||
@ -690,19 +797,30 @@ static u8 rtw89_cam_addr_hash(u8 start, const u8 *addr)
|
||||
}
|
||||
|
||||
void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
const u8 *scan_mac_addr,
|
||||
u8 *cmd)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct rtw89_addr_cam_entry *addr_cam = rtw89_get_addr_cam_of(rtwvif, rtwsta);
|
||||
struct ieee80211_sta *sta = rtwsta_to_sta_safe(rtwsta);
|
||||
const u8 *sma = scan_mac_addr ? scan_mac_addr : rtwvif->mac_addr;
|
||||
struct ieee80211_vif *vif = rtwvif_link_to_vif(rtwvif_link);
|
||||
struct rtw89_addr_cam_entry *addr_cam =
|
||||
rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link);
|
||||
struct ieee80211_sta *sta = rtwsta_link_to_sta_safe(rtwsta_link);
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
const u8 *sma = scan_mac_addr ? scan_mac_addr : rtwvif_link->mac_addr;
|
||||
u8 sma_hash, tma_hash, addr_msk_start;
|
||||
u8 sma_start = 0;
|
||||
u8 tma_start = 0;
|
||||
u8 *tma = sta ? sta->addr : rtwvif->bssid;
|
||||
const u8 *tma;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
if (sta) {
|
||||
link_sta = rtw89_sta_rcu_dereference_link(rtwsta_link, true);
|
||||
tma = link_sta->addr;
|
||||
} else {
|
||||
tma = rtwvif_link->bssid;
|
||||
}
|
||||
|
||||
if (addr_cam->addr_mask != 0) {
|
||||
addr_msk_start = __ffs(addr_cam->addr_mask);
|
||||
@ -719,10 +837,10 @@ void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
|
||||
FWCMD_SET_ADDR_LEN(cmd, addr_cam->len);
|
||||
|
||||
FWCMD_SET_ADDR_VALID(cmd, addr_cam->valid);
|
||||
FWCMD_SET_ADDR_NET_TYPE(cmd, rtwvif->net_type);
|
||||
FWCMD_SET_ADDR_BCN_HIT_COND(cmd, rtwvif->bcn_hit_cond);
|
||||
FWCMD_SET_ADDR_HIT_RULE(cmd, rtwvif->hit_rule);
|
||||
FWCMD_SET_ADDR_BB_SEL(cmd, rtwvif->phy_idx);
|
||||
FWCMD_SET_ADDR_NET_TYPE(cmd, rtwvif_link->net_type);
|
||||
FWCMD_SET_ADDR_BCN_HIT_COND(cmd, rtwvif_link->bcn_hit_cond);
|
||||
FWCMD_SET_ADDR_HIT_RULE(cmd, rtwvif_link->hit_rule);
|
||||
FWCMD_SET_ADDR_BB_SEL(cmd, rtwvif_link->phy_idx);
|
||||
FWCMD_SET_ADDR_ADDR_MASK(cmd, addr_cam->addr_mask);
|
||||
FWCMD_SET_ADDR_MASK_SEL(cmd, addr_cam->mask_sel);
|
||||
FWCMD_SET_ADDR_SMA_HASH(cmd, sma_hash);
|
||||
@ -744,20 +862,21 @@ void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
|
||||
FWCMD_SET_ADDR_TMA4(cmd, tma[4]);
|
||||
FWCMD_SET_ADDR_TMA5(cmd, tma[5]);
|
||||
|
||||
FWCMD_SET_ADDR_PORT_INT(cmd, rtwvif->port);
|
||||
FWCMD_SET_ADDR_TSF_SYNC(cmd, rtwvif->port);
|
||||
FWCMD_SET_ADDR_TF_TRS(cmd, rtwvif->trigger);
|
||||
FWCMD_SET_ADDR_LSIG_TXOP(cmd, rtwvif->lsig_txop);
|
||||
FWCMD_SET_ADDR_TGT_IND(cmd, rtwvif->tgt_ind);
|
||||
FWCMD_SET_ADDR_FRM_TGT_IND(cmd, rtwvif->frm_tgt_ind);
|
||||
FWCMD_SET_ADDR_MACID(cmd, rtwsta ? rtwsta->mac_id : rtwvif->mac_id);
|
||||
if (rtwvif->net_type == RTW89_NET_TYPE_INFRA)
|
||||
FWCMD_SET_ADDR_PORT_INT(cmd, rtwvif_link->port);
|
||||
FWCMD_SET_ADDR_TSF_SYNC(cmd, rtwvif_link->port);
|
||||
FWCMD_SET_ADDR_TF_TRS(cmd, rtwvif_link->trigger);
|
||||
FWCMD_SET_ADDR_LSIG_TXOP(cmd, rtwvif_link->lsig_txop);
|
||||
FWCMD_SET_ADDR_TGT_IND(cmd, rtwvif_link->tgt_ind);
|
||||
FWCMD_SET_ADDR_FRM_TGT_IND(cmd, rtwvif_link->frm_tgt_ind);
|
||||
FWCMD_SET_ADDR_MACID(cmd, rtwsta_link ? rtwsta_link->mac_id :
|
||||
rtwvif_link->mac_id);
|
||||
if (rtwvif_link->net_type == RTW89_NET_TYPE_INFRA)
|
||||
FWCMD_SET_ADDR_AID12(cmd, vif->cfg.aid & 0xfff);
|
||||
else if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE)
|
||||
else if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE)
|
||||
FWCMD_SET_ADDR_AID12(cmd, sta ? sta->aid & 0xfff : 0);
|
||||
FWCMD_SET_ADDR_WOL_PATTERN(cmd, rtwvif->wowlan_pattern);
|
||||
FWCMD_SET_ADDR_WOL_UC(cmd, rtwvif->wowlan_uc);
|
||||
FWCMD_SET_ADDR_WOL_MAGIC(cmd, rtwvif->wowlan_magic);
|
||||
FWCMD_SET_ADDR_WOL_PATTERN(cmd, rtwvif_link->wowlan_pattern);
|
||||
FWCMD_SET_ADDR_WOL_UC(cmd, rtwvif_link->wowlan_uc);
|
||||
FWCMD_SET_ADDR_WOL_MAGIC(cmd, rtwvif_link->wowlan_magic);
|
||||
FWCMD_SET_ADDR_WAPI(cmd, addr_cam->wapi);
|
||||
FWCMD_SET_ADDR_SEC_ENT_MODE(cmd, addr_cam->sec_ent_mode);
|
||||
FWCMD_SET_ADDR_SEC_ENT0_KEYID(cmd, addr_cam->sec_ent_keyid[0]);
|
||||
@ -776,18 +895,22 @@ void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
|
||||
FWCMD_SET_ADDR_SEC_ENT4(cmd, addr_cam->sec_ent[4]);
|
||||
FWCMD_SET_ADDR_SEC_ENT5(cmd, addr_cam->sec_ent[5]);
|
||||
FWCMD_SET_ADDR_SEC_ENT6(cmd, addr_cam->sec_ent[6]);
|
||||
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
struct rtw89_h2c_dctlinfo_ud_v1 *h2c)
|
||||
{
|
||||
struct rtw89_addr_cam_entry *addr_cam = rtw89_get_addr_cam_of(rtwvif, rtwsta);
|
||||
struct rtw89_addr_cam_entry *addr_cam =
|
||||
rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link);
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv;
|
||||
|
||||
h2c->c0 = le32_encode_bits(rtwsta ? rtwsta->mac_id : rtwvif->mac_id,
|
||||
h2c->c0 = le32_encode_bits(rtwsta_link ? rtwsta_link->mac_id :
|
||||
rtwvif_link->mac_id,
|
||||
DCTLINFO_V1_C0_MACID) |
|
||||
le32_encode_bits(1, DCTLINFO_V1_C0_OP);
|
||||
|
||||
@ -858,18 +981,28 @@ void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
struct rtw89_h2c_dctlinfo_ud_v2 *h2c)
|
||||
{
|
||||
struct rtw89_addr_cam_entry *addr_cam = rtw89_get_addr_cam_of(rtwvif, rtwsta);
|
||||
struct ieee80211_sta *sta = rtwsta_link_to_sta_safe(rtwsta_link);
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link->rtwvif);
|
||||
struct rtw89_vif *rtwvif = rtwvif_link->rtwvif;
|
||||
struct rtw89_addr_cam_entry *addr_cam =
|
||||
rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link);
|
||||
bool is_mld = sta ? sta->mlo : ieee80211_vif_is_mld(vif);
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv;
|
||||
u8 *mld_sma, *mld_tma, *mld_bssid;
|
||||
|
||||
h2c->c0 = le32_encode_bits(rtwsta ? rtwsta->mac_id : rtwvif->mac_id,
|
||||
h2c->c0 = le32_encode_bits(rtwsta_link ? rtwsta_link->mac_id :
|
||||
rtwvif_link->mac_id,
|
||||
DCTLINFO_V2_C0_MACID) |
|
||||
le32_encode_bits(1, DCTLINFO_V2_C0_OP);
|
||||
|
||||
h2c->w2 = le32_encode_bits(is_mld, DCTLINFO_V2_W2_IS_MLD);
|
||||
h2c->m2 = cpu_to_le32(DCTLINFO_V2_W2_IS_MLD);
|
||||
|
||||
h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0],
|
||||
DCTLINFO_V2_W4_SEC_ENT0_KEYID) |
|
||||
le32_encode_bits(addr_cam->sec_ent_keyid[1],
|
||||
@ -935,4 +1068,47 @@ void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
|
||||
DCTLINFO_V2_W4_SEC_KEY_ID);
|
||||
h2c->m4 |= cpu_to_le32(DCTLINFO_V2_W4_SEC_KEY_ID);
|
||||
}
|
||||
|
||||
if (!is_mld)
|
||||
return;
|
||||
|
||||
if (rtwvif_link->net_type == RTW89_NET_TYPE_INFRA) {
|
||||
mld_sma = rtwvif->mac_addr;
|
||||
mld_tma = vif->cfg.ap_addr;
|
||||
mld_bssid = vif->cfg.ap_addr;
|
||||
} else if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE && sta) {
|
||||
mld_sma = rtwvif->mac_addr;
|
||||
mld_tma = sta->addr;
|
||||
mld_bssid = rtwvif->mac_addr;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
h2c->w8 = le32_encode_bits(mld_sma[0], DCTLINFO_V2_W8_MLD_SMA_0) |
|
||||
le32_encode_bits(mld_sma[1], DCTLINFO_V2_W8_MLD_SMA_1) |
|
||||
le32_encode_bits(mld_sma[2], DCTLINFO_V2_W8_MLD_SMA_2) |
|
||||
le32_encode_bits(mld_sma[3], DCTLINFO_V2_W8_MLD_SMA_3);
|
||||
h2c->m8 = cpu_to_le32(DCTLINFO_V2_W8_ALL);
|
||||
|
||||
h2c->w9 = le32_encode_bits(mld_sma[4], DCTLINFO_V2_W9_MLD_SMA_4) |
|
||||
le32_encode_bits(mld_sma[5], DCTLINFO_V2_W9_MLD_SMA_5) |
|
||||
le32_encode_bits(mld_tma[0], DCTLINFO_V2_W9_MLD_TMA_0) |
|
||||
le32_encode_bits(mld_tma[1], DCTLINFO_V2_W9_MLD_TMA_1);
|
||||
h2c->m9 = cpu_to_le32(DCTLINFO_V2_W9_ALL);
|
||||
|
||||
h2c->w10 = le32_encode_bits(mld_tma[2], DCTLINFO_V2_W10_MLD_TMA_2) |
|
||||
le32_encode_bits(mld_tma[3], DCTLINFO_V2_W10_MLD_TMA_3) |
|
||||
le32_encode_bits(mld_tma[4], DCTLINFO_V2_W10_MLD_TMA_4) |
|
||||
le32_encode_bits(mld_tma[5], DCTLINFO_V2_W10_MLD_TMA_5);
|
||||
h2c->m10 = cpu_to_le32(DCTLINFO_V2_W10_ALL);
|
||||
|
||||
h2c->w11 = le32_encode_bits(mld_bssid[0], DCTLINFO_V2_W11_MLD_BSSID_0) |
|
||||
le32_encode_bits(mld_bssid[1], DCTLINFO_V2_W11_MLD_BSSID_1) |
|
||||
le32_encode_bits(mld_bssid[2], DCTLINFO_V2_W11_MLD_BSSID_2) |
|
||||
le32_encode_bits(mld_bssid[3], DCTLINFO_V2_W11_MLD_BSSID_3);
|
||||
h2c->m11 = cpu_to_le32(DCTLINFO_V2_W11_ALL);
|
||||
|
||||
h2c->w12 = le32_encode_bits(mld_bssid[4], DCTLINFO_V2_W12_MLD_BSSID_4) |
|
||||
le32_encode_bits(mld_bssid[5], DCTLINFO_V2_W12_MLD_BSSID_5);
|
||||
h2c->m12 = cpu_to_le32(DCTLINFO_V2_W12_ALL);
|
||||
}
|
||||
|
||||
@ -514,46 +514,58 @@ struct rtw89_h2c_dctlinfo_ud_v2 {
|
||||
#define DCTLINFO_V2_W7_SEC_ENT7 GENMASK(23, 16)
|
||||
#define DCTLINFO_V2_W7_SEC_ENT8 GENMASK(31, 24)
|
||||
#define DCTLINFO_V2_W7_ALL GENMASK(31, 0)
|
||||
#define DCTLINFO_V2_W8_MLD_SMA_L_V1 GENMASK(31, 0)
|
||||
#define DCTLINFO_V2_W8_MLD_SMA_0 GENMASK(7, 0)
|
||||
#define DCTLINFO_V2_W8_MLD_SMA_1 GENMASK(15, 8)
|
||||
#define DCTLINFO_V2_W8_MLD_SMA_2 GENMASK(23, 16)
|
||||
#define DCTLINFO_V2_W8_MLD_SMA_3 GENMASK(31, 24)
|
||||
#define DCTLINFO_V2_W8_ALL GENMASK(31, 0)
|
||||
#define DCTLINFO_V2_W9_MLD_SMA_H_V1 GENMASK(15, 0)
|
||||
#define DCTLINFO_V2_W9_MLD_TMA_L_V1 GENMASK(31, 16)
|
||||
#define DCTLINFO_V2_W9_MLD_SMA_4 GENMASK(7, 0)
|
||||
#define DCTLINFO_V2_W9_MLD_SMA_5 GENMASK(15, 8)
|
||||
#define DCTLINFO_V2_W9_MLD_TMA_0 GENMASK(23, 16)
|
||||
#define DCTLINFO_V2_W9_MLD_TMA_1 GENMASK(31, 24)
|
||||
#define DCTLINFO_V2_W9_ALL GENMASK(31, 0)
|
||||
#define DCTLINFO_V2_W10_MLD_TMA_H_V1 GENMASK(31, 0)
|
||||
#define DCTLINFO_V2_W10_MLD_TMA_2 GENMASK(7, 0)
|
||||
#define DCTLINFO_V2_W10_MLD_TMA_3 GENMASK(15, 8)
|
||||
#define DCTLINFO_V2_W10_MLD_TMA_4 GENMASK(23, 16)
|
||||
#define DCTLINFO_V2_W10_MLD_TMA_5 GENMASK(31, 24)
|
||||
#define DCTLINFO_V2_W10_ALL GENMASK(31, 0)
|
||||
#define DCTLINFO_V2_W11_MLD_TA_BSSID_L_V1 GENMASK(31, 0)
|
||||
#define DCTLINFO_V2_W11_MLD_BSSID_0 GENMASK(7, 0)
|
||||
#define DCTLINFO_V2_W11_MLD_BSSID_1 GENMASK(15, 8)
|
||||
#define DCTLINFO_V2_W11_MLD_BSSID_2 GENMASK(23, 16)
|
||||
#define DCTLINFO_V2_W11_MLD_BSSID_3 GENMASK(31, 24)
|
||||
#define DCTLINFO_V2_W11_ALL GENMASK(31, 0)
|
||||
#define DCTLINFO_V2_W12_MLD_TA_BSSID_H_V1 GENMASK(15, 0)
|
||||
#define DCTLINFO_V2_W12_MLD_BSSID_4 GENMASK(7, 0)
|
||||
#define DCTLINFO_V2_W12_MLD_BSSID_5 GENMASK(15, 8)
|
||||
#define DCTLINFO_V2_W12_ALL GENMASK(15, 0)
|
||||
|
||||
int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
|
||||
void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
|
||||
int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);
|
||||
void rtw89_cam_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);
|
||||
int rtw89_cam_init_addr_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_addr_cam_entry *addr_cam,
|
||||
const struct rtw89_bssid_cam_entry *bssid_cam);
|
||||
void rtw89_cam_deinit_addr_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_addr_cam_entry *addr_cam);
|
||||
int rtw89_cam_init_bssid_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_bssid_cam_entry *bssid_cam,
|
||||
const u8 *bssid);
|
||||
void rtw89_cam_deinit_bssid_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_bssid_cam_entry *bssid_cam);
|
||||
void rtw89_cam_fill_addr_cam_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *vif,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_vif_link *vif,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
const u8 *scan_mac_addr, u8 *cmd);
|
||||
void rtw89_cam_fill_dctl_sec_cam_info_v1(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
struct rtw89_h2c_dctlinfo_ud_v1 *h2c);
|
||||
void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
struct rtw89_h2c_dctlinfo_ud_v2 *h2c);
|
||||
int rtw89_cam_fill_bssid_cam_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta, u8 *cmd);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link, u8 *cmd);
|
||||
int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
@ -564,6 +576,11 @@ int rtw89_cam_sec_key_del(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_key_conf *key,
|
||||
bool inform_fw);
|
||||
void rtw89_cam_bssid_changed(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_cam_reset_keys(struct rtw89_dev *rtwdev);
|
||||
int rtw89_cam_attach_link_sec_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
u8 sec_cam_idx);
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -38,23 +38,32 @@ enum rtw89_chanctx_pause_reasons {
|
||||
RTW89_CHANCTX_PAUSE_REASON_ROC,
|
||||
};
|
||||
|
||||
struct rtw89_chanctx_cb_parm {
|
||||
int (*cb)(struct rtw89_dev *rtwdev, void *data);
|
||||
void *data;
|
||||
const char *caller;
|
||||
};
|
||||
|
||||
struct rtw89_entity_weight {
|
||||
unsigned int active_chanctxs;
|
||||
unsigned int active_roles;
|
||||
};
|
||||
|
||||
static inline bool rtw89_get_entity_state(struct rtw89_dev *rtwdev)
|
||||
static inline bool rtw89_get_entity_state(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
|
||||
return READ_ONCE(hal->entity_active);
|
||||
return READ_ONCE(hal->entity_active[phy_idx]);
|
||||
}
|
||||
|
||||
static inline void rtw89_set_entity_state(struct rtw89_dev *rtwdev, bool active)
|
||||
static inline void rtw89_set_entity_state(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
bool active)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
|
||||
WRITE_ONCE(hal->entity_active, active);
|
||||
WRITE_ONCE(hal->entity_active[phy_idx], active);
|
||||
}
|
||||
|
||||
static inline
|
||||
@ -76,17 +85,17 @@ static inline void rtw89_set_entity_mode(struct rtw89_dev *rtwdev,
|
||||
void rtw89_chan_create(struct rtw89_chan *chan, u8 center_chan, u8 primary_chan,
|
||||
enum rtw89_band band, enum rtw89_bandwidth bandwidth);
|
||||
bool rtw89_assign_entity_chan(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx,
|
||||
enum rtw89_chanctx_idx idx,
|
||||
const struct rtw89_chan *new);
|
||||
int rtw89_iterate_entity_chan(struct rtw89_dev *rtwdev,
|
||||
int (*iterator)(const struct rtw89_chan *chan,
|
||||
void *data),
|
||||
void *data);
|
||||
void rtw89_config_entity_chandef(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx,
|
||||
enum rtw89_chanctx_idx idx,
|
||||
const struct cfg80211_chan_def *chandef);
|
||||
void rtw89_config_roc_chandef(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_sub_entity_idx idx,
|
||||
enum rtw89_chanctx_idx idx,
|
||||
const struct cfg80211_chan_def *chandef);
|
||||
void rtw89_entity_init(struct rtw89_dev *rtwdev);
|
||||
enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev);
|
||||
@ -97,7 +106,16 @@ void rtw89_queue_chanctx_change(struct rtw89_dev *rtwdev,
|
||||
void rtw89_chanctx_track(struct rtw89_dev *rtwdev);
|
||||
void rtw89_chanctx_pause(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_chanctx_pause_reasons rsn);
|
||||
void rtw89_chanctx_proceed(struct rtw89_dev *rtwdev);
|
||||
void rtw89_chanctx_proceed(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chanctx_cb_parm *cb_parm);
|
||||
|
||||
const struct rtw89_chan *__rtw89_mgnt_chan_get(struct rtw89_dev *rtwdev,
|
||||
const char *caller_message,
|
||||
u8 link_index);
|
||||
|
||||
#define rtw89_mgnt_chan_get(rtwdev, link_index) \
|
||||
__rtw89_mgnt_chan_get(rtwdev, __func__, link_index)
|
||||
|
||||
int rtw89_chanctx_ops_add(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
void rtw89_chanctx_ops_remove(struct rtw89_dev *rtwdev,
|
||||
@ -106,10 +124,10 @@ void rtw89_chanctx_ops_change(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
u32 changed);
|
||||
int rtw89_chanctx_ops_assign_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
void rtw89_chanctx_ops_unassign_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -193,6 +193,8 @@ enum btc_wa_type {
|
||||
BTC_WA_5G_HI_CH_RX = BIT(0),
|
||||
BTC_WA_NULL_AP = BIT(1),
|
||||
BTC_WA_HFP_ZB = BIT(2), /* HFP PTA req bit4 define issue */
|
||||
BTC_WA_HFP_LAG = BIT(3), /* 52BT WL break BT Rx lag issue */
|
||||
BTC_WA_INIT_SCAN = BIT(4) /* 52A/C/D init scan move to wl slot WA */
|
||||
};
|
||||
|
||||
enum btc_3cx_type {
|
||||
@ -269,8 +271,10 @@ void rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work);
|
||||
void rtw89_btc_ntfy_arp_packet_work(struct work_struct *work);
|
||||
void rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work);
|
||||
void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work);
|
||||
void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta, enum btc_role_state state);
|
||||
void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
enum btc_role_state state);
|
||||
void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_state);
|
||||
void rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map,
|
||||
enum btc_wl_rfk_type type,
|
||||
@ -289,9 +293,10 @@ void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev);
|
||||
|
||||
static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_rf_path_bit paths)
|
||||
enum rtw89_rf_path_bit paths,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 phy_map;
|
||||
|
||||
phy_map = FIELD_PREP(BTC_RFK_PATH_MAP, paths) |
|
||||
@ -303,9 +308,10 @@ static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev,
|
||||
|
||||
static inline u8 rtw89_btc_path_phymap(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path));
|
||||
return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path), chanctx_idx);
|
||||
}
|
||||
|
||||
/* return bt req len in TU */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -13,6 +13,7 @@
|
||||
#include "fw.h"
|
||||
#include "mac.h"
|
||||
#include "pci.h"
|
||||
#include "phy.h"
|
||||
#include "ps.h"
|
||||
#include "reg.h"
|
||||
#include "sar.h"
|
||||
@ -61,6 +62,27 @@ struct rtw89_debugfs_priv {
|
||||
};
|
||||
};
|
||||
|
||||
struct rtw89_debugfs {
|
||||
struct rtw89_debugfs_priv read_reg;
|
||||
struct rtw89_debugfs_priv write_reg;
|
||||
struct rtw89_debugfs_priv read_rf;
|
||||
struct rtw89_debugfs_priv write_rf;
|
||||
struct rtw89_debugfs_priv rf_reg_dump;
|
||||
struct rtw89_debugfs_priv txpwr_table;
|
||||
struct rtw89_debugfs_priv mac_reg_dump;
|
||||
struct rtw89_debugfs_priv mac_mem_dump;
|
||||
struct rtw89_debugfs_priv mac_dbg_port_dump;
|
||||
struct rtw89_debugfs_priv send_h2c;
|
||||
struct rtw89_debugfs_priv early_h2c;
|
||||
struct rtw89_debugfs_priv fw_crash;
|
||||
struct rtw89_debugfs_priv btc_info;
|
||||
struct rtw89_debugfs_priv btc_manual;
|
||||
struct rtw89_debugfs_priv fw_log_manual;
|
||||
struct rtw89_debugfs_priv phy_info;
|
||||
struct rtw89_debugfs_priv stations;
|
||||
struct rtw89_debugfs_priv disable_dm;
|
||||
};
|
||||
|
||||
static const u16 rtw89_rate_info_bw_to_mhz_map[] = {
|
||||
[RATE_INFO_BW_20] = 20,
|
||||
[RATE_INFO_BW_40] = 40,
|
||||
@ -811,6 +833,9 @@ static void __print_regd(struct seq_file *m, struct rtw89_dev *rtwdev,
|
||||
case_REGD(MEXICO);
|
||||
case_REGD(UKRAINE);
|
||||
case_REGD(CN);
|
||||
case_REGD(QATAR);
|
||||
case_REGD(UK);
|
||||
case_REGD(THAILAND);
|
||||
}
|
||||
}
|
||||
|
||||
@ -872,7 +897,7 @@ static int rtw89_debug_priv_txpwr_table_get(struct seq_file *m, void *v)
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw89_leave_ps_mode(rtwdev);
|
||||
chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_debug_priv_txpwr_table_get_regd(m, rtwdev, chan);
|
||||
|
||||
@ -882,6 +907,9 @@ static int rtw89_debug_priv_txpwr_table_get(struct seq_file *m, void *v)
|
||||
seq_puts(m, "[TAS]\n");
|
||||
rtw89_print_tas(m, rtwdev);
|
||||
|
||||
seq_puts(m, "[DAG]\n");
|
||||
rtw89_print_ant_gain(m, rtwdev, chan);
|
||||
|
||||
tbl = dbgfs_txpwr_tables[chip_gen];
|
||||
if (!tbl) {
|
||||
ret = -EOPNOTSUPP;
|
||||
@ -3484,9 +3512,9 @@ static ssize_t rtw89_debug_priv_btc_manual_set(struct file *filp,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t rtw89_debug_fw_log_manual_set(struct file *filp,
|
||||
const char __user *user_buf,
|
||||
size_t count, loff_t *loff)
|
||||
static ssize_t rtw89_debug_priv_fw_log_manual_set(struct file *filp,
|
||||
const char __user *user_buf,
|
||||
size_t count, loff_t *loff)
|
||||
{
|
||||
struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
|
||||
struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
|
||||
@ -3506,7 +3534,9 @@ out:
|
||||
return count;
|
||||
}
|
||||
|
||||
static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
|
||||
static void rtw89_sta_link_info_get_iter(struct seq_file *m,
|
||||
struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
static const char * const he_gi_str[] = {
|
||||
[NL80211_RATE_INFO_HE_GI_0_8] = "0.8",
|
||||
@ -3518,20 +3548,26 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
|
||||
[NL80211_RATE_INFO_EHT_GI_1_6] = "1.6",
|
||||
[NL80211_RATE_INFO_EHT_GI_3_2] = "3.2",
|
||||
};
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rate_info *rate = &rtwsta->ra_report.txrate;
|
||||
struct ieee80211_rx_status *status = &rtwsta->rx_status;
|
||||
struct seq_file *m = (struct seq_file *)data;
|
||||
struct rtw89_dev *rtwdev = rtwsta->rtwdev;
|
||||
struct rate_info *rate = &rtwsta_link->ra_report.txrate;
|
||||
struct ieee80211_rx_status *status = &rtwsta_link->rx_status;
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
u8 ant_num = hal->ant_diversity ? 2 : rtwdev->chip->rf_path_num;
|
||||
bool ant_asterisk = hal->tx_path_diversity || hal->ant_diversity;
|
||||
u8 evm_min, evm_max;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
u8 evm_min, evm_max, evm_1ss;
|
||||
u16 max_rc_amsdu_len;
|
||||
u8 rssi;
|
||||
u8 snr;
|
||||
int i;
|
||||
|
||||
seq_printf(m, "TX rate [%d]: ", rtwsta->mac_id);
|
||||
rcu_read_lock();
|
||||
|
||||
link_sta = rtw89_sta_rcu_dereference_link(rtwsta_link, true);
|
||||
max_rc_amsdu_len = link_sta->agg.max_rc_amsdu_len;
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
seq_printf(m, "TX rate [%u, %u]: ", rtwsta_link->mac_id, rtwsta_link->link_id);
|
||||
|
||||
if (rate->flags & RATE_INFO_FLAGS_MCS)
|
||||
seq_printf(m, "HT MCS-%d%s", rate->mcs,
|
||||
@ -3549,13 +3585,13 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
|
||||
eht_gi_str[rate->eht_gi] : "N/A");
|
||||
else
|
||||
seq_printf(m, "Legacy %d", rate->legacy);
|
||||
seq_printf(m, "%s", rtwsta->ra_report.might_fallback_legacy ? " FB_G" : "");
|
||||
seq_printf(m, "%s", rtwsta_link->ra_report.might_fallback_legacy ? " FB_G" : "");
|
||||
seq_printf(m, " BW:%u", rtw89_rate_info_bw_to_mhz(rate->bw));
|
||||
seq_printf(m, "\t(hw_rate=0x%x)", rtwsta->ra_report.hw_rate);
|
||||
seq_printf(m, "\t==> agg_wait=%d (%d)\n", rtwsta->max_agg_wait,
|
||||
sta->deflink.agg.max_rc_amsdu_len);
|
||||
seq_printf(m, " (hw_rate=0x%x)", rtwsta_link->ra_report.hw_rate);
|
||||
seq_printf(m, " ==> agg_wait=%d (%d)\n", rtwsta_link->max_agg_wait,
|
||||
max_rc_amsdu_len);
|
||||
|
||||
seq_printf(m, "RX rate [%d]: ", rtwsta->mac_id);
|
||||
seq_printf(m, "RX rate [%u, %u]: ", rtwsta_link->mac_id, rtwsta_link->link_id);
|
||||
|
||||
switch (status->encoding) {
|
||||
case RX_ENC_LEGACY:
|
||||
@ -3582,23 +3618,24 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
|
||||
break;
|
||||
}
|
||||
seq_printf(m, " BW:%u", rtw89_rate_info_bw_to_mhz(status->bw));
|
||||
seq_printf(m, "\t(hw_rate=0x%x)\n", rtwsta->rx_hw_rate);
|
||||
seq_printf(m, " (hw_rate=0x%x)\n", rtwsta_link->rx_hw_rate);
|
||||
|
||||
rssi = ewma_rssi_read(&rtwsta->avg_rssi);
|
||||
rssi = ewma_rssi_read(&rtwsta_link->avg_rssi);
|
||||
seq_printf(m, "RSSI: %d dBm (raw=%d, prev=%d) [",
|
||||
RTW89_RSSI_RAW_TO_DBM(rssi), rssi, rtwsta->prev_rssi);
|
||||
RTW89_RSSI_RAW_TO_DBM(rssi), rssi, rtwsta_link->prev_rssi);
|
||||
for (i = 0; i < ant_num; i++) {
|
||||
rssi = ewma_rssi_read(&rtwsta->rssi[i]);
|
||||
rssi = ewma_rssi_read(&rtwsta_link->rssi[i]);
|
||||
seq_printf(m, "%d%s%s", RTW89_RSSI_RAW_TO_DBM(rssi),
|
||||
ant_asterisk && (hal->antenna_tx & BIT(i)) ? "*" : "",
|
||||
i + 1 == ant_num ? "" : ", ");
|
||||
}
|
||||
seq_puts(m, "]\n");
|
||||
|
||||
seq_puts(m, "EVM: [");
|
||||
evm_1ss = ewma_evm_read(&rtwsta_link->evm_1ss);
|
||||
seq_printf(m, "EVM: [%2u.%02u, ", evm_1ss >> 2, (evm_1ss & 0x3) * 25);
|
||||
for (i = 0; i < (hal->ant_diversity ? 2 : 1); i++) {
|
||||
evm_min = ewma_evm_read(&rtwsta->evm_min[i]);
|
||||
evm_max = ewma_evm_read(&rtwsta->evm_max[i]);
|
||||
evm_min = ewma_evm_read(&rtwsta_link->evm_min[i]);
|
||||
evm_max = ewma_evm_read(&rtwsta_link->evm_max[i]);
|
||||
|
||||
seq_printf(m, "%s(%2u.%02u, %2u.%02u)", i == 0 ? "" : " ",
|
||||
evm_min >> 2, (evm_min & 0x3) * 25,
|
||||
@ -3606,10 +3643,22 @@ static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
|
||||
}
|
||||
seq_puts(m, "]\t");
|
||||
|
||||
snr = ewma_snr_read(&rtwsta->avg_snr);
|
||||
snr = ewma_snr_read(&rtwsta_link->avg_snr);
|
||||
seq_printf(m, "SNR: %u\n", snr);
|
||||
}
|
||||
|
||||
static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct seq_file *m = (struct seq_file *)data;
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta(sta);
|
||||
struct rtw89_dev *rtwdev = rtwsta->rtwdev;
|
||||
struct rtw89_sta_link *rtwsta_link;
|
||||
unsigned int link_id;
|
||||
|
||||
rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id)
|
||||
rtw89_sta_link_info_get_iter(m, rtwdev, rtwsta_link);
|
||||
}
|
||||
|
||||
static void
|
||||
rtw89_debug_append_rx_rate(struct seq_file *m, struct rtw89_pkt_stat *pkt_stat,
|
||||
enum rtw89_hw_rate first_rate, int len)
|
||||
@ -3651,14 +3700,22 @@ static int rtw89_debug_priv_phy_info_get(struct seq_file *m, void *v)
|
||||
struct rtw89_pkt_stat *pkt_stat = &rtwdev->phystat.last_pkt_stat;
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw89_rx_rate_cnt_info *info;
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
enum rtw89_hw_rate first_rate;
|
||||
u8 rssi;
|
||||
int i;
|
||||
|
||||
seq_printf(m, "TP TX: %u [%u] Mbps (lv: %d), RX: %u [%u] Mbps (lv: %d)\n",
|
||||
stats->tx_throughput, stats->tx_throughput_raw, stats->tx_tfc_lv,
|
||||
rssi = ewma_rssi_read(&rtwdev->phystat.bcn_rssi);
|
||||
|
||||
seq_printf(m, "TP TX: %u [%u] Mbps (lv: %d",
|
||||
stats->tx_throughput, stats->tx_throughput_raw, stats->tx_tfc_lv);
|
||||
if (hal->thermal_prot_lv)
|
||||
seq_printf(m, ", duty: %d%%",
|
||||
100 - hal->thermal_prot_lv * RTW89_THERMAL_PROT_STEP);
|
||||
seq_printf(m, "), RX: %u [%u] Mbps (lv: %d)\n",
|
||||
stats->rx_throughput, stats->rx_throughput_raw, stats->rx_tfc_lv);
|
||||
seq_printf(m, "Beacon: %u, TF: %u\n", pkt_stat->beacon_nr,
|
||||
stats->rx_tf_periodic);
|
||||
seq_printf(m, "Beacon: %u (%d dBm), TF: %u\n", pkt_stat->beacon_nr,
|
||||
RTW89_RSSI_RAW_TO_DBM(rssi), stats->rx_tf_periodic);
|
||||
seq_printf(m, "Avg packet length: TX=%u, RX=%u\n", stats->tx_avg_len,
|
||||
stats->rx_avg_len);
|
||||
|
||||
@ -3736,28 +3793,41 @@ static void rtw89_dump_pkt_offload(struct seq_file *m, struct list_head *pkt_lis
|
||||
seq_puts(m, "\n");
|
||||
}
|
||||
|
||||
static void rtw89_vif_link_ids_get(struct seq_file *m, u8 *mac,
|
||||
struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif_link->bssid_cam;
|
||||
|
||||
seq_printf(m, " [%u] %pM\n", rtwvif_link->mac_id, rtwvif_link->mac_addr);
|
||||
seq_printf(m, "\tlink_id=%u\n", rtwvif_link->link_id);
|
||||
seq_printf(m, "\tbssid_cam_idx=%u\n", bssid_cam->bssid_cam_idx);
|
||||
rtw89_dump_addr_cam(m, rtwdev, &rtwvif_link->addr_cam);
|
||||
rtw89_dump_pkt_offload(m, &rtwvif_link->general_pkt_list,
|
||||
"\tpkt_ofld[GENERAL]: ");
|
||||
}
|
||||
|
||||
static
|
||||
void rtw89_vif_ids_get_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
struct seq_file *m = (struct seq_file *)data;
|
||||
struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
|
||||
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
unsigned int link_id;
|
||||
|
||||
seq_printf(m, "VIF [%d] %pM\n", rtwvif->mac_id, rtwvif->mac_addr);
|
||||
seq_printf(m, "\tbssid_cam_idx=%u\n", bssid_cam->bssid_cam_idx);
|
||||
rtw89_dump_addr_cam(m, rtwdev, &rtwvif->addr_cam);
|
||||
rtw89_dump_pkt_offload(m, &rtwvif->general_pkt_list, "\tpkt_ofld[GENERAL]: ");
|
||||
seq_printf(m, "VIF %pM\n", rtwvif->mac_addr);
|
||||
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id)
|
||||
rtw89_vif_link_ids_get(m, mac, rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
static void rtw89_dump_ba_cam(struct seq_file *m, struct rtw89_sta *rtwsta)
|
||||
static void rtw89_dump_ba_cam(struct seq_file *m, struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
struct rtw89_ba_cam_entry *entry;
|
||||
bool first = true;
|
||||
|
||||
list_for_each_entry(entry, &rtwsta->ba_cam_list, list) {
|
||||
list_for_each_entry(entry, &rtwsta_link->ba_cam_list, list) {
|
||||
if (first) {
|
||||
seq_puts(m, "\tba_cam ");
|
||||
first = false;
|
||||
@ -3770,16 +3840,36 @@ static void rtw89_dump_ba_cam(struct seq_file *m, struct rtw89_sta *rtwsta)
|
||||
seq_puts(m, "\n");
|
||||
}
|
||||
|
||||
static void rtw89_sta_link_ids_get(struct seq_file *m,
|
||||
struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
link_sta = rtw89_sta_rcu_dereference_link(rtwsta_link, true);
|
||||
|
||||
seq_printf(m, " [%u] %pM\n", rtwsta_link->mac_id, link_sta->addr);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
seq_printf(m, "\tlink_id=%u\n", rtwsta_link->link_id);
|
||||
rtw89_dump_addr_cam(m, rtwdev, &rtwsta_link->addr_cam);
|
||||
rtw89_dump_ba_cam(m, rtwdev, rtwsta_link);
|
||||
}
|
||||
|
||||
static void rtw89_sta_ids_get_iter(void *data, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_dev *rtwdev = rtwsta->rtwdev;
|
||||
struct seq_file *m = (struct seq_file *)data;
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta(sta);
|
||||
struct rtw89_dev *rtwdev = rtwsta->rtwdev;
|
||||
struct rtw89_sta_link *rtwsta_link;
|
||||
unsigned int link_id;
|
||||
|
||||
seq_printf(m, "STA [%d] %pM %s\n", rtwsta->mac_id, sta->addr,
|
||||
sta->tdls ? "(TDLS)" : "");
|
||||
rtw89_dump_addr_cam(m, rtwdev, &rtwsta->addr_cam);
|
||||
rtw89_dump_ba_cam(m, rtwsta);
|
||||
seq_printf(m, "STA %pM %s\n", sta->addr, sta->tdls ? "(TDLS)" : "");
|
||||
rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id)
|
||||
rtw89_sta_link_ids_get(m, rtwdev, rtwsta_link);
|
||||
}
|
||||
|
||||
static int rtw89_debug_priv_stations_get(struct seq_file *m, void *v)
|
||||
@ -3829,6 +3919,7 @@ static const struct rtw89_disabled_dm_info {
|
||||
const char *name;
|
||||
} rtw89_disabled_dm_infos[] = {
|
||||
DM_INFO(DYNAMIC_EDCCA),
|
||||
DM_INFO(THERMAL_PROTECT),
|
||||
};
|
||||
|
||||
static int
|
||||
@ -3874,92 +3965,55 @@ rtw89_debug_priv_disable_dm_set(struct file *filp, const char __user *user_buf,
|
||||
return count;
|
||||
}
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_read_reg = {
|
||||
.cb_read = rtw89_debug_priv_read_reg_get,
|
||||
.cb_write = rtw89_debug_priv_read_reg_select,
|
||||
};
|
||||
#define rtw89_debug_priv_get(name) \
|
||||
{ \
|
||||
.cb_read = rtw89_debug_priv_ ##name## _get, \
|
||||
}
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_write_reg = {
|
||||
.cb_write = rtw89_debug_priv_write_reg_set,
|
||||
};
|
||||
#define rtw89_debug_priv_set(name) \
|
||||
{ \
|
||||
.cb_write = rtw89_debug_priv_ ##name## _set, \
|
||||
}
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_read_rf = {
|
||||
.cb_read = rtw89_debug_priv_read_rf_get,
|
||||
.cb_write = rtw89_debug_priv_read_rf_select,
|
||||
};
|
||||
#define rtw89_debug_priv_select_and_get(name) \
|
||||
{ \
|
||||
.cb_write = rtw89_debug_priv_ ##name## _select, \
|
||||
.cb_read = rtw89_debug_priv_ ##name## _get, \
|
||||
}
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_write_rf = {
|
||||
.cb_write = rtw89_debug_priv_write_rf_set,
|
||||
};
|
||||
#define rtw89_debug_priv_set_and_get(name) \
|
||||
{ \
|
||||
.cb_write = rtw89_debug_priv_ ##name## _set, \
|
||||
.cb_read = rtw89_debug_priv_ ##name## _get, \
|
||||
}
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_rf_reg_dump = {
|
||||
.cb_read = rtw89_debug_priv_rf_reg_dump_get,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_txpwr_table = {
|
||||
.cb_read = rtw89_debug_priv_txpwr_table_get,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_mac_reg_dump = {
|
||||
.cb_read = rtw89_debug_priv_mac_reg_dump_get,
|
||||
.cb_write = rtw89_debug_priv_mac_reg_dump_select,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_mac_mem_dump = {
|
||||
.cb_read = rtw89_debug_priv_mac_mem_dump_get,
|
||||
.cb_write = rtw89_debug_priv_mac_mem_dump_select,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_mac_dbg_port_dump = {
|
||||
.cb_read = rtw89_debug_priv_mac_dbg_port_dump_get,
|
||||
.cb_write = rtw89_debug_priv_mac_dbg_port_dump_select,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_send_h2c = {
|
||||
.cb_write = rtw89_debug_priv_send_h2c_set,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_early_h2c = {
|
||||
.cb_read = rtw89_debug_priv_early_h2c_get,
|
||||
.cb_write = rtw89_debug_priv_early_h2c_set,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_fw_crash = {
|
||||
.cb_read = rtw89_debug_priv_fw_crash_get,
|
||||
.cb_write = rtw89_debug_priv_fw_crash_set,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_btc_info = {
|
||||
.cb_read = rtw89_debug_priv_btc_info_get,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_btc_manual = {
|
||||
.cb_write = rtw89_debug_priv_btc_manual_set,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_fw_log_manual = {
|
||||
.cb_write = rtw89_debug_fw_log_manual_set,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_phy_info = {
|
||||
.cb_read = rtw89_debug_priv_phy_info_get,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_stations = {
|
||||
.cb_read = rtw89_debug_priv_stations_get,
|
||||
};
|
||||
|
||||
static struct rtw89_debugfs_priv rtw89_debug_priv_disable_dm = {
|
||||
.cb_read = rtw89_debug_priv_disable_dm_get,
|
||||
.cb_write = rtw89_debug_priv_disable_dm_set,
|
||||
static const struct rtw89_debugfs rtw89_debugfs_templ = {
|
||||
.read_reg = rtw89_debug_priv_select_and_get(read_reg),
|
||||
.write_reg = rtw89_debug_priv_set(write_reg),
|
||||
.read_rf = rtw89_debug_priv_select_and_get(read_rf),
|
||||
.write_rf = rtw89_debug_priv_set(write_rf),
|
||||
.rf_reg_dump = rtw89_debug_priv_get(rf_reg_dump),
|
||||
.txpwr_table = rtw89_debug_priv_get(txpwr_table),
|
||||
.mac_reg_dump = rtw89_debug_priv_select_and_get(mac_reg_dump),
|
||||
.mac_mem_dump = rtw89_debug_priv_select_and_get(mac_mem_dump),
|
||||
.mac_dbg_port_dump = rtw89_debug_priv_select_and_get(mac_dbg_port_dump),
|
||||
.send_h2c = rtw89_debug_priv_set(send_h2c),
|
||||
.early_h2c = rtw89_debug_priv_set_and_get(early_h2c),
|
||||
.fw_crash = rtw89_debug_priv_set_and_get(fw_crash),
|
||||
.btc_info = rtw89_debug_priv_get(btc_info),
|
||||
.btc_manual = rtw89_debug_priv_set(btc_manual),
|
||||
.fw_log_manual = rtw89_debug_priv_set(fw_log_manual),
|
||||
.phy_info = rtw89_debug_priv_get(phy_info),
|
||||
.stations = rtw89_debug_priv_get(stations),
|
||||
.disable_dm = rtw89_debug_priv_set_and_get(disable_dm),
|
||||
};
|
||||
|
||||
#define rtw89_debugfs_add(name, mode, fopname, parent) \
|
||||
do { \
|
||||
rtw89_debug_priv_ ##name.rtwdev = rtwdev; \
|
||||
if (!debugfs_create_file(#name, mode, \
|
||||
parent, &rtw89_debug_priv_ ##name, \
|
||||
&file_ops_ ##fopname)) \
|
||||
struct rtw89_debugfs_priv *priv = &rtwdev->debugfs->name; \
|
||||
priv->rtwdev = rtwdev; \
|
||||
if (IS_ERR(debugfs_create_file(#name, mode, parent, priv, \
|
||||
&file_ops_ ##fopname))) \
|
||||
pr_debug("Unable to initialize debugfs:%s\n", #name); \
|
||||
} while (0)
|
||||
|
||||
@ -3970,17 +4024,9 @@ static struct rtw89_debugfs_priv rtw89_debug_priv_disable_dm = {
|
||||
#define rtw89_debugfs_add_r(name) \
|
||||
rtw89_debugfs_add(name, S_IFREG | 0444, single_r, debugfs_topdir)
|
||||
|
||||
void rtw89_debugfs_init(struct rtw89_dev *rtwdev)
|
||||
static
|
||||
void rtw89_debugfs_add_sec0(struct rtw89_dev *rtwdev, struct dentry *debugfs_topdir)
|
||||
{
|
||||
struct dentry *debugfs_topdir;
|
||||
|
||||
#if defined(__linux__)
|
||||
debugfs_topdir = debugfs_create_dir("rtw89",
|
||||
#elif defined(__FreeBSD__)
|
||||
debugfs_topdir = debugfs_create_dir(dev_name(rtwdev->dev),
|
||||
#endif
|
||||
rtwdev->hw->wiphy->debugfsdir);
|
||||
|
||||
rtw89_debugfs_add_rw(read_reg);
|
||||
rtw89_debugfs_add_w(write_reg);
|
||||
rtw89_debugfs_add_rw(read_rf);
|
||||
@ -3990,6 +4036,11 @@ void rtw89_debugfs_init(struct rtw89_dev *rtwdev)
|
||||
rtw89_debugfs_add_rw(mac_reg_dump);
|
||||
rtw89_debugfs_add_rw(mac_mem_dump);
|
||||
rtw89_debugfs_add_rw(mac_dbg_port_dump);
|
||||
}
|
||||
|
||||
static
|
||||
void rtw89_debugfs_add_sec1(struct rtw89_dev *rtwdev, struct dentry *debugfs_topdir)
|
||||
{
|
||||
rtw89_debugfs_add_w(send_h2c);
|
||||
rtw89_debugfs_add_rw(early_h2c);
|
||||
rtw89_debugfs_add_rw(fw_crash);
|
||||
@ -4000,6 +4051,31 @@ void rtw89_debugfs_init(struct rtw89_dev *rtwdev)
|
||||
rtw89_debugfs_add_r(stations);
|
||||
rtw89_debugfs_add_rw(disable_dm);
|
||||
}
|
||||
|
||||
void rtw89_debugfs_init(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct dentry *debugfs_topdir;
|
||||
|
||||
rtwdev->debugfs = kmemdup(&rtw89_debugfs_templ,
|
||||
sizeof(rtw89_debugfs_templ), GFP_KERNEL);
|
||||
if (!rtwdev->debugfs)
|
||||
return;
|
||||
|
||||
#if defined(__linux__)
|
||||
debugfs_topdir = debugfs_create_dir("rtw89",
|
||||
#elif defined(__FreeBSD__)
|
||||
debugfs_topdir = debugfs_create_dir(dev_name(rtwdev->dev),
|
||||
#endif
|
||||
rtwdev->hw->wiphy->debugfsdir);
|
||||
|
||||
rtw89_debugfs_add_sec0(rtwdev, debugfs_topdir);
|
||||
rtw89_debugfs_add_sec1(rtwdev, debugfs_topdir);
|
||||
}
|
||||
|
||||
void rtw89_debugfs_deinit(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
kfree(rtwdev->debugfs);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RTW89_DEBUGMSG
|
||||
|
||||
@ -59,8 +59,10 @@ enum rtw89_debug_mac_reg_sel {
|
||||
|
||||
#ifdef CONFIG_RTW89_DEBUGFS
|
||||
void rtw89_debugfs_init(struct rtw89_dev *rtwdev);
|
||||
void rtw89_debugfs_deinit(struct rtw89_dev *rtwdev);
|
||||
#else
|
||||
static inline void rtw89_debugfs_init(struct rtw89_dev *rtwdev) {}
|
||||
static inline void rtw89_debugfs_deinit(struct rtw89_dev *rtwdev) {}
|
||||
#endif
|
||||
|
||||
#define rtw89_info(rtwdev, a...) dev_info((rtwdev)->dev, ##a)
|
||||
|
||||
@ -11,11 +11,38 @@
|
||||
#define EF_CV_MASK GENMASK(7, 4)
|
||||
#define EF_CV_INV 15
|
||||
|
||||
#define EFUSE_B1_MSSDEVTYPE_MASK GENMASK(3, 0)
|
||||
#define EFUSE_B1_MSSCUSTIDX0_MASK GENMASK(7, 4)
|
||||
#define EFUSE_B2_MSSKEYNUM_MASK GENMASK(3, 0)
|
||||
#define EFUSE_B2_MSSCUSTIDX1_MASK BIT(6)
|
||||
|
||||
#define EFUSE_EXTERNALPN_ADDR_AX 0x5EC
|
||||
#define EFUSE_CUSTOMER_ADDR_AX 0x5ED
|
||||
#define EFUSE_SERIALNUM_ADDR_AX 0x5ED
|
||||
|
||||
#define EFUSE_B1_EXTERNALPN_MASK GENMASK(7, 0)
|
||||
#define EFUSE_B2_CUSTOMER_MASK GENMASK(3, 0)
|
||||
#define EFUSE_B2_SERIALNUM_MASK GENMASK(6, 4)
|
||||
|
||||
#define OTP_KEY_INFO_NUM 2
|
||||
|
||||
static const u8 otp_key_info_externalPN[OTP_KEY_INFO_NUM] = {0x0, 0x0};
|
||||
static const u8 otp_key_info_customer[OTP_KEY_INFO_NUM] = {0x0, 0x1};
|
||||
static const u8 otp_key_info_serialNum[OTP_KEY_INFO_NUM] = {0x0, 0x1};
|
||||
|
||||
enum rtw89_efuse_bank {
|
||||
RTW89_EFUSE_BANK_WIFI,
|
||||
RTW89_EFUSE_BANK_BT,
|
||||
};
|
||||
|
||||
enum rtw89_efuse_mss_dev_type {
|
||||
MSS_DEV_TYPE_FWSEC_DEF = 0xF,
|
||||
MSS_DEV_TYPE_FWSEC_WINLIN_INBOX = 0xC,
|
||||
MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_NON_COB = 0xA,
|
||||
MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_COB = 0x9,
|
||||
MSS_DEV_TYPE_FWSEC_NONWIN_INBOX = 0x6,
|
||||
};
|
||||
|
||||
static int rtw89_switch_efuse_bank(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_efuse_bank bank)
|
||||
{
|
||||
@ -354,3 +381,126 @@ int rtw89_read_efuse_ver(struct rtw89_dev *rtwdev, u8 *ecv)
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_read_efuse_ver);
|
||||
|
||||
static u8 get_mss_dev_type_idx(struct rtw89_dev *rtwdev, u8 mss_dev_type)
|
||||
{
|
||||
switch (mss_dev_type) {
|
||||
case MSS_DEV_TYPE_FWSEC_WINLIN_INBOX:
|
||||
mss_dev_type = 0x0;
|
||||
break;
|
||||
case MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_NON_COB:
|
||||
mss_dev_type = 0x1;
|
||||
break;
|
||||
case MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_COB:
|
||||
mss_dev_type = 0x2;
|
||||
break;
|
||||
case MSS_DEV_TYPE_FWSEC_NONWIN_INBOX:
|
||||
mss_dev_type = 0x3;
|
||||
break;
|
||||
case MSS_DEV_TYPE_FWSEC_DEF:
|
||||
mss_dev_type = RTW89_FW_MSS_DEV_TYPE_FWSEC_DEF;
|
||||
break;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "unknown mss_dev_type %d", mss_dev_type);
|
||||
mss_dev_type = RTW89_FW_MSS_DEV_TYPE_FWSEC_INV;
|
||||
break;
|
||||
}
|
||||
|
||||
return mss_dev_type;
|
||||
}
|
||||
|
||||
int rtw89_efuse_recognize_mss_info_v1(struct rtw89_dev *rtwdev, u8 b1, u8 b2)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
|
||||
u8 mss_dev_type;
|
||||
|
||||
if (chip->chip_id == RTL8852B && b1 == 0xFF && b2 == 0x6E) {
|
||||
mss_dev_type = MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_NON_COB;
|
||||
sec->mss_cust_idx = 0;
|
||||
sec->mss_key_num = 0;
|
||||
|
||||
goto mss_dev_type;
|
||||
}
|
||||
|
||||
mss_dev_type = u8_get_bits(b1, EFUSE_B1_MSSDEVTYPE_MASK);
|
||||
sec->mss_cust_idx = 0x1F - (u8_get_bits(b1, EFUSE_B1_MSSCUSTIDX0_MASK) |
|
||||
u8_get_bits(b2, EFUSE_B2_MSSCUSTIDX1_MASK) << 4);
|
||||
sec->mss_key_num = 0xF - u8_get_bits(b2, EFUSE_B2_MSSKEYNUM_MASK);
|
||||
|
||||
mss_dev_type:
|
||||
sec->mss_dev_type = get_mss_dev_type_idx(rtwdev, mss_dev_type);
|
||||
if (sec->mss_dev_type == RTW89_FW_MSS_DEV_TYPE_FWSEC_INV) {
|
||||
rtw89_warn(rtwdev, "invalid mss_dev_type %d\n", mss_dev_type);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
sec->can_mss_v1 = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
int rtw89_efuse_recognize_mss_index_v0(struct rtw89_dev *rtwdev, u8 b1, u8 b2)
|
||||
{
|
||||
struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
|
||||
u8 externalPN;
|
||||
u8 serialNum;
|
||||
u8 customer;
|
||||
u8 i;
|
||||
|
||||
externalPN = 0xFF - u8_get_bits(b1, EFUSE_B1_EXTERNALPN_MASK);
|
||||
customer = 0xF - u8_get_bits(b2, EFUSE_B2_CUSTOMER_MASK);
|
||||
serialNum = 0x7 - u8_get_bits(b2, EFUSE_B2_SERIALNUM_MASK);
|
||||
|
||||
for (i = 0; i < OTP_KEY_INFO_NUM; i++) {
|
||||
if (externalPN == otp_key_info_externalPN[i] &&
|
||||
customer == otp_key_info_customer[i] &&
|
||||
serialNum == otp_key_info_serialNum[i]) {
|
||||
sec->mss_idx = i;
|
||||
sec->can_mss_v0 = true;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
int rtw89_efuse_read_fw_secure_ax(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
|
||||
u32 sec_addr = EFUSE_EXTERNALPN_ADDR_AX;
|
||||
u32 sec_size = 2;
|
||||
u8 sec_map[2];
|
||||
u8 b1, b2;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_dump_physical_efuse_map(rtwdev, sec_map,
|
||||
sec_addr, sec_size, false);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to dump secsel map\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
b1 = sec_map[0];
|
||||
b2 = sec_map[1];
|
||||
|
||||
if (b1 == 0xFF && b2 == 0xFF)
|
||||
return 0;
|
||||
|
||||
rtw89_efuse_recognize_mss_index_v0(rtwdev, b1, b2);
|
||||
rtw89_efuse_recognize_mss_info_v1(rtwdev, b1, b2);
|
||||
if (!sec->can_mss_v1 && !sec->can_mss_v0)
|
||||
goto out;
|
||||
|
||||
sec->secure_boot = true;
|
||||
|
||||
out:
|
||||
rtw89_debug(rtwdev, RTW89_DBG_FW,
|
||||
"MSS secure_boot=%d(%d/%d) dev_type=%d cust_idx=%d key_num=%d mss_index=%d\n",
|
||||
sec->secure_boot, sec->can_mss_v0, sec->can_mss_v1,
|
||||
sec->mss_dev_type, sec->mss_cust_idx,
|
||||
sec->mss_key_num, sec->mss_idx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -23,6 +23,8 @@ int rtw89_parse_efuse_map_be(struct rtw89_dev *rtwdev);
|
||||
int rtw89_parse_phycap_map_be(struct rtw89_dev *rtwdev);
|
||||
int rtw89_cnv_efuse_state_be(struct rtw89_dev *rtwdev, bool idle);
|
||||
int rtw89_read_efuse_ver(struct rtw89_dev *rtwdev, u8 *efv);
|
||||
int rtw89_efuse_recognize_mss_info_v1(struct rtw89_dev *rtwdev, u8 b1, u8 b2);
|
||||
int rtw89_efuse_read_fw_secure_ax(struct rtw89_dev *rtwdev);
|
||||
int rtw89_efuse_read_fw_secure_be(struct rtw89_dev *rtwdev);
|
||||
|
||||
#endif
|
||||
|
||||
@ -8,11 +8,7 @@
|
||||
#include "reg.h"
|
||||
|
||||
#define EFUSE_EXTERNALPN_ADDR_BE 0x1580
|
||||
#define EFUSE_B1_MSSDEVTYPE_MASK GENMASK(3, 0)
|
||||
#define EFUSE_B1_MSSCUSTIDX0_MASK GENMASK(7, 4)
|
||||
#define EFUSE_SERIALNUM_ADDR_BE 0x1581
|
||||
#define EFUSE_B2_MSSKEYNUM_MASK GENMASK(3, 0)
|
||||
#define EFUSE_B2_MSSCUSTIDX1_MASK BIT(6)
|
||||
#define EFUSE_SB_CRYP_SEL_ADDR 0x1582
|
||||
#define EFUSE_SB_CRYP_SEL_SIZE 2
|
||||
#define EFUSE_SB_CRYP_SEL_DEFAULT 0xFFFF
|
||||
@ -20,14 +16,6 @@
|
||||
#define EFUSE_SEC_BE_START 0x1580
|
||||
#define EFUSE_SEC_BE_SIZE 4
|
||||
|
||||
enum rtw89_efuse_mss_dev_type {
|
||||
MSS_DEV_TYPE_FWSEC_DEF = 0xF,
|
||||
MSS_DEV_TYPE_FWSEC_WINLIN_INBOX = 0xC,
|
||||
MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_NON_COB = 0xA,
|
||||
MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_COB = 0x9,
|
||||
MSS_DEV_TYPE_FWSEC_NONWIN_INBOX = 0x6,
|
||||
};
|
||||
|
||||
static const u32 sb_sel_mgn[SB_SEL_MGN_MAX_SIZE] = {
|
||||
0x8000100, 0xC000180
|
||||
};
|
||||
@ -477,33 +465,6 @@ static u16 get_sb_cryp_sel_idx(u16 sb_cryp_sel)
|
||||
return sb_cryp_sel_v + low_bit;
|
||||
}
|
||||
|
||||
static u8 get_mss_dev_type_idx(struct rtw89_dev *rtwdev, u8 mss_dev_type)
|
||||
{
|
||||
switch (mss_dev_type) {
|
||||
case MSS_DEV_TYPE_FWSEC_WINLIN_INBOX:
|
||||
mss_dev_type = 0x0;
|
||||
break;
|
||||
case MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_NON_COB:
|
||||
mss_dev_type = 0x1;
|
||||
break;
|
||||
case MSS_DEV_TYPE_FWSEC_NONLIN_INBOX_COB:
|
||||
mss_dev_type = 0x2;
|
||||
break;
|
||||
case MSS_DEV_TYPE_FWSEC_NONWIN_INBOX:
|
||||
mss_dev_type = 0x3;
|
||||
break;
|
||||
case MSS_DEV_TYPE_FWSEC_DEF:
|
||||
mss_dev_type = RTW89_FW_MSS_DEV_TYPE_FWSEC_DEF;
|
||||
break;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "unknown mss_dev_type %d", mss_dev_type);
|
||||
mss_dev_type = RTW89_FW_MSS_DEV_TYPE_FWSEC_INV;
|
||||
break;
|
||||
}
|
||||
|
||||
return mss_dev_type;
|
||||
}
|
||||
|
||||
int rtw89_efuse_read_fw_secure_be(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
|
||||
@ -511,7 +472,6 @@ int rtw89_efuse_read_fw_secure_be(struct rtw89_dev *rtwdev)
|
||||
u32 sec_size = EFUSE_SEC_BE_SIZE;
|
||||
u16 sb_cryp_sel, sb_cryp_sel_idx;
|
||||
u8 sec_map[EFUSE_SEC_BE_SIZE];
|
||||
u8 mss_dev_type;
|
||||
u8 b1, b2;
|
||||
int ret;
|
||||
|
||||
@ -538,16 +498,9 @@ int rtw89_efuse_read_fw_secure_be(struct rtw89_dev *rtwdev)
|
||||
b1 = sec_map[EFUSE_EXTERNALPN_ADDR_BE - sec_addr];
|
||||
b2 = sec_map[EFUSE_SERIALNUM_ADDR_BE - sec_addr];
|
||||
|
||||
mss_dev_type = u8_get_bits(b1, EFUSE_B1_MSSDEVTYPE_MASK);
|
||||
sec->mss_cust_idx = 0x1F - (u8_get_bits(b1, EFUSE_B1_MSSCUSTIDX0_MASK) |
|
||||
u8_get_bits(b2, EFUSE_B2_MSSCUSTIDX1_MASK) << 4);
|
||||
sec->mss_key_num = 0xF - u8_get_bits(b2, EFUSE_B2_MSSKEYNUM_MASK);
|
||||
|
||||
sec->mss_dev_type = get_mss_dev_type_idx(rtwdev, mss_dev_type);
|
||||
if (sec->mss_dev_type == RTW89_FW_MSS_DEV_TYPE_FWSEC_INV) {
|
||||
rtw89_warn(rtwdev, "invalid mss_dev_type %d\n", mss_dev_type);
|
||||
ret = rtw89_efuse_recognize_mss_info_v1(rtwdev, b1, b2);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
sec->secure_boot = true;
|
||||
|
||||
@ -559,4 +512,3 @@ out:
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_efuse_read_fw_secure_be);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -47,6 +47,19 @@ struct rtw89_c2hreg_phycap {
|
||||
#define RTW89_C2HREG_PHYCAP_W2_HW_TYPE GENMASK(7, 0)
|
||||
#define RTW89_C2HREG_PHYCAP_W3_ANT_TX_NUM GENMASK(15, 8)
|
||||
#define RTW89_C2HREG_PHYCAP_W3_ANT_RX_NUM GENMASK(23, 16)
|
||||
#define RTW89_C2HREG_PHYCAP_W3_BAND_SEL GENMASK(31, 24)
|
||||
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W0_B1_RX_NSS GENMASK(23, 16)
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W0_B1_BW GENMASK(31, 24)
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W1_B1_TX_NSS GENMASK(7, 0)
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W1_B1_ANT_TX_NUM GENMASK(15, 8)
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W1_B1_ANT_RX_NUM GENMASK(23, 16)
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W1_B1_BAND_SEL GENMASK(31, 24)
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W2_QAM GENMASK(7, 0)
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W2_QAM_256 0x1
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W2_QAM_1024 0x2
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W2_QAM_4096 0x3
|
||||
#define RTW89_C2HREG_PHYCAP_P1_W2_B1_QAM GENMASK(15, 8)
|
||||
|
||||
#define RTW89_C2HREG_AOAC_RPT_1_W0_KEY_IDX GENMASK(23, 16)
|
||||
#define RTW89_C2HREG_AOAC_RPT_1_W1_IV_0 GENMASK(7, 0)
|
||||
@ -92,6 +105,8 @@ struct rtw89_h2creg_sch_tx_en {
|
||||
|
||||
#define RTW89_H2CREG_WOW_CPUIO_RX_CTRL_EN GENMASK(23, 16)
|
||||
|
||||
#define RTW89_H2CREG_GET_FEATURE_PART_NUM GENMASK(23, 16)
|
||||
|
||||
#define RTW89_H2CREG_MAX 4
|
||||
#define RTW89_C2HREG_MAX 4
|
||||
#define RTW89_C2HREG_HDR_LEN 2
|
||||
@ -138,6 +153,7 @@ enum rtw89_mac_c2h_type {
|
||||
RTW89_FWCMD_C2HREG_FUNC_PHY_CAP,
|
||||
RTW89_FWCMD_C2HREG_FUNC_TX_PAUSE_RPT,
|
||||
RTW89_FWCMD_C2HREG_FUNC_WOW_CPUIO_RX_ACK = 0xA,
|
||||
RTW89_FWCMD_C2HREG_FUNC_PHY_CAP_PART1 = 0xC,
|
||||
RTW89_FWCMD_C2HREG_FUNC_NULL = 0xFF,
|
||||
};
|
||||
|
||||
@ -261,6 +277,7 @@ struct rtw89_fw_hdr_section_info {
|
||||
u8 redl;
|
||||
const u8 *addr;
|
||||
u32 len;
|
||||
u32 len_override;
|
||||
u32 dladdr;
|
||||
u32 mssc;
|
||||
u8 type;
|
||||
@ -275,6 +292,7 @@ struct rtw89_fw_bin_info {
|
||||
u32 hdr_len;
|
||||
bool dynamic_hdr_en;
|
||||
u32 dynamic_hdr_len;
|
||||
u8 idmem_share_mode;
|
||||
bool dsp_checksum;
|
||||
bool secure_section_exist;
|
||||
struct rtw89_fw_hdr_section_info section_info[FWDL_SECTION_MAX_NUM];
|
||||
@ -308,9 +326,12 @@ struct rtw89_fw_macid_pause_sleep_grp {
|
||||
#define RTW89_SCANOFLD_DEBUG_MASK 0x1F
|
||||
#define RTW89_CHAN_INVALID 0xFF
|
||||
#define RTW89_MAC_CHINFO_SIZE 28
|
||||
#define RTW89_MAC_CHINFO_SIZE_BE 32
|
||||
#define RTW89_SCAN_LIST_GUARD 4
|
||||
#define RTW89_SCAN_LIST_LIMIT \
|
||||
((RTW89_H2C_MAX_SIZE / RTW89_MAC_CHINFO_SIZE) - RTW89_SCAN_LIST_GUARD)
|
||||
#define RTW89_SCAN_LIST_LIMIT(size) \
|
||||
((RTW89_H2C_MAX_SIZE / (size)) - RTW89_SCAN_LIST_GUARD)
|
||||
#define RTW89_SCAN_LIST_LIMIT_AX RTW89_SCAN_LIST_LIMIT(RTW89_MAC_CHINFO_SIZE)
|
||||
#define RTW89_SCAN_LIST_LIMIT_BE RTW89_SCAN_LIST_LIMIT(RTW89_MAC_CHINFO_SIZE_BE)
|
||||
|
||||
#define RTW89_BCN_LOSS_CNT 10
|
||||
|
||||
@ -563,6 +584,7 @@ struct rtw89_fw_hdr {
|
||||
#define FW_HDR_W6_SEC_NUM GENMASK(15, 8)
|
||||
#define FW_HDR_W7_PART_SIZE GENMASK(15, 0)
|
||||
#define FW_HDR_W7_DYN_HDR BIT(16)
|
||||
#define FW_HDR_W7_IDMEM_SHARE_MODE GENMASK(21, 18)
|
||||
#define FW_HDR_W7_CMD_VERSERION GENMASK(31, 24)
|
||||
|
||||
struct rtw89_fw_hdr_section_v1 {
|
||||
@ -580,6 +602,7 @@ struct rtw89_fw_hdr_section_v1 {
|
||||
#define FWSECTION_HDR_V1_W1_REDL BIT(29)
|
||||
#define FWSECTION_HDR_V1_W2_MSSC GENMASK(7, 0)
|
||||
#define FORMATTED_MSSC 0xFF
|
||||
#define FORMATTED_MSSC_MASK GENMASK(7, 0)
|
||||
#define FWSECTION_HDR_V1_W2_BBMCU_IDX GENMASK(27, 24)
|
||||
|
||||
struct rtw89_fw_hdr_v1 {
|
||||
@ -615,6 +638,7 @@ struct rtw89_fw_hdr_v1 {
|
||||
#define FW_HDR_V1_W6_DSP_CHKSUM BIT(24)
|
||||
#define FW_HDR_V1_W7_PART_SIZE GENMASK(15, 0)
|
||||
#define FW_HDR_V1_W7_DYN_HDR BIT(16)
|
||||
#define FW_HDR_V1_W7_IDMEM_SHARE_MODE GENMASK(21, 18)
|
||||
|
||||
enum rtw89_fw_mss_pool_rmp_tbl_type {
|
||||
MSS_POOL_RMP_TBL_BITMASK = 0x0,
|
||||
@ -1775,6 +1799,21 @@ struct rtw89_h2c_lps_ch_info {
|
||||
__le32 mlo_dbcc_mode_lps;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_h2c_lps_ml_cmn_info {
|
||||
u8 fmt_id;
|
||||
u8 rsvd0[3];
|
||||
__le32 mlo_dbcc_mode;
|
||||
u8 central_ch[RTW89_PHY_MAX];
|
||||
u8 pri_ch[RTW89_PHY_MAX];
|
||||
u8 bw[RTW89_PHY_MAX];
|
||||
u8 band[RTW89_PHY_MAX];
|
||||
u8 bcn_rate_type[RTW89_PHY_MAX];
|
||||
u8 rsvd1[2];
|
||||
__le16 tia_gain[RTW89_PHY_MAX][TIA_GAIN_NUM];
|
||||
u8 lna_gain[RTW89_PHY_MAX][LNA_GAIN_NUM];
|
||||
u8 rsvd2[2];
|
||||
} __packed;
|
||||
|
||||
static inline void RTW89_SET_FWCMD_CPU_EXCEPTION_TYPE(void *cmd, u32 val)
|
||||
{
|
||||
le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 0));
|
||||
@ -1898,6 +1937,24 @@ struct rtw89_h2c_wow_global {
|
||||
#define RTW89_H2C_WOW_GLOBAL_W0_PAIRWISE_SEC_ALGO GENMASK(23, 16)
|
||||
#define RTW89_H2C_WOW_GLOBAL_W0_GROUP_SEC_ALGO GENMASK(31, 24)
|
||||
|
||||
#define RTW89_MAX_SUPPORT_NL_NUM 16
|
||||
struct rtw89_h2c_cfg_nlo {
|
||||
__le32 w0;
|
||||
u8 nlo_cnt;
|
||||
u8 rsvd[3];
|
||||
__le32 patterncheck;
|
||||
__le32 rsvd1;
|
||||
__le32 rsvd2;
|
||||
u8 ssid_len[RTW89_MAX_SUPPORT_NL_NUM];
|
||||
u8 chiper[RTW89_MAX_SUPPORT_NL_NUM];
|
||||
u8 rsvd3[24];
|
||||
u8 ssid[RTW89_MAX_SUPPORT_NL_NUM][IEEE80211_MAX_SSID_LEN];
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_NLO_W0_ENABLE BIT(0)
|
||||
#define RTW89_H2C_NLO_W0_IGNORE_CIPHER BIT(2)
|
||||
#define RTW89_H2C_NLO_W0_MACID GENMASK(31, 24)
|
||||
|
||||
static inline void RTW89_SET_WOW_WAKEUP_CTRL_PATTERN_MATCH_ENABLE(void *h2c, u32 val)
|
||||
{
|
||||
le32p_replace_bits((__le32 *)h2c, val, BIT(0));
|
||||
@ -2089,10 +2146,15 @@ enum rtw89_btc_cxdrvinfo {
|
||||
|
||||
enum rtw89_scan_mode {
|
||||
RTW89_SCAN_IMMEDIATE,
|
||||
RTW89_SCAN_DELAY,
|
||||
};
|
||||
|
||||
enum rtw89_scan_type {
|
||||
RTW89_SCAN_ONCE,
|
||||
RTW89_SCAN_NORMAL,
|
||||
RTW89_SCAN_NORMAL_SLOW,
|
||||
RTW89_SCAN_SEAMLESS,
|
||||
RTW89_SCAN_MAX,
|
||||
};
|
||||
|
||||
static inline void RTW89_SET_FWCMD_CXHDR_TYPE(void *cmd, u8 val)
|
||||
@ -2124,6 +2186,30 @@ struct rtw89_h2c_cxctrl_v7 {
|
||||
#define H2C_LEN_CXDRVHDR sizeof(struct rtw89_h2c_cxhdr)
|
||||
#define H2C_LEN_CXDRVHDR_V7 sizeof(struct rtw89_h2c_cxhdr_v7)
|
||||
|
||||
struct rtw89_btc_wl_role_info_v7_u8 {
|
||||
u8 connect_cnt;
|
||||
u8 link_mode;
|
||||
u8 link_mode_chg;
|
||||
u8 p2p_2g;
|
||||
|
||||
struct rtw89_btc_wl_active_role_v7 active_role[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER];
|
||||
} __packed;
|
||||
|
||||
struct rtw89_btc_wl_role_info_v7_u32 {
|
||||
__le32 role_map;
|
||||
__le32 mrole_type;
|
||||
__le32 mrole_noa_duration;
|
||||
__le32 dbcc_en;
|
||||
__le32 dbcc_chg;
|
||||
__le32 dbcc_2g_phy;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_h2c_cxrole_v7 {
|
||||
struct rtw89_h2c_cxhdr_v7 hdr;
|
||||
struct rtw89_btc_wl_role_info_v7_u8 _u8;
|
||||
struct rtw89_btc_wl_role_info_v7_u32 _u32;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_btc_wl_role_info_v8_u8 {
|
||||
u8 connect_cnt;
|
||||
u8 link_mode;
|
||||
@ -2145,7 +2231,7 @@ struct rtw89_btc_wl_role_info_v8_u32 {
|
||||
} __packed;
|
||||
|
||||
struct rtw89_h2c_cxrole_v8 {
|
||||
struct rtw89_h2c_cxhdr hdr;
|
||||
struct rtw89_h2c_cxhdr_v7 hdr;
|
||||
struct rtw89_btc_wl_role_info_v8_u8 _u8;
|
||||
struct rtw89_btc_wl_role_info_v8_u32 _u32;
|
||||
} __packed;
|
||||
@ -2595,6 +2681,7 @@ struct rtw89_h2c_chinfo_elem_be {
|
||||
__le32 w4;
|
||||
__le32 w5;
|
||||
__le32 w6;
|
||||
__le32 w7;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_CHINFO_BE_W0_PERIOD GENMASK(7, 0)
|
||||
@ -2626,6 +2713,7 @@ struct rtw89_h2c_chinfo_elem_be {
|
||||
#define RTW89_H2C_CHINFO_BE_W5_FW_PROBE0_SSIDS GENMASK(31, 16)
|
||||
#define RTW89_H2C_CHINFO_BE_W6_FW_PROBE0_SHORTSSIDS GENMASK(15, 0)
|
||||
#define RTW89_H2C_CHINFO_BE_W6_FW_PROBE0_BSSIDS GENMASK(31, 16)
|
||||
#define RTW89_H2C_CHINFO_BE_W7_PERIOD_V1 GENMASK(15, 0)
|
||||
|
||||
struct rtw89_h2c_chinfo {
|
||||
u8 ch_num;
|
||||
@ -2635,6 +2723,14 @@ struct rtw89_h2c_chinfo {
|
||||
struct rtw89_h2c_chinfo_elem elem[] __counted_by(ch_num);
|
||||
} __packed;
|
||||
|
||||
struct rtw89_h2c_chinfo_be {
|
||||
u8 ch_num;
|
||||
u8 elem_size;
|
||||
u8 arg;
|
||||
u8 rsvd0;
|
||||
struct rtw89_h2c_chinfo_elem_be elem[] __counted_by(ch_num);
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_CHINFO_ARG_MAC_IDX_MASK BIT(0)
|
||||
#define RTW89_H2C_CHINFO_ARG_APPEND_MASK BIT(1)
|
||||
|
||||
@ -2664,6 +2760,8 @@ struct rtw89_h2c_scanofld {
|
||||
#define RTW89_H2C_SCANOFLD_W1_PROBE_REQ_PKT_ID GENMASK(31, 24)
|
||||
#define RTW89_H2C_SCANOFLD_W2_NORM_PD GENMASK(15, 0)
|
||||
#define RTW89_H2C_SCANOFLD_W2_SLOW_PD GENMASK(23, 16)
|
||||
#define RTW89_H2C_SCANOFLD_W3_TSF_HIGH GENMASK(31, 0)
|
||||
#define RTW89_H2C_SCANOFLD_W4_TSF_LOW GENMASK(31, 0)
|
||||
|
||||
struct rtw89_h2c_scanofld_be_macc_role {
|
||||
__le32 w0;
|
||||
@ -2679,6 +2777,7 @@ struct rtw89_h2c_scanofld_be_opch {
|
||||
__le32 w1;
|
||||
__le32 w2;
|
||||
__le32 w3;
|
||||
__le32 w4;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_SCANOFLD_BE_OPCH_W0_MACID GENMASK(15, 0)
|
||||
@ -2700,6 +2799,7 @@ struct rtw89_h2c_scanofld_be_opch {
|
||||
#define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT1 GENMASK(15, 8)
|
||||
#define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT2 GENMASK(23, 16)
|
||||
#define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT3 GENMASK(31, 24)
|
||||
#define RTW89_H2C_SCANOFLD_BE_OPCH_W4_DURATION_V1 GENMASK(15, 0)
|
||||
|
||||
struct rtw89_h2c_scanofld_be {
|
||||
__le32 w0;
|
||||
@ -2711,7 +2811,9 @@ struct rtw89_h2c_scanofld_be {
|
||||
__le32 w6;
|
||||
__le32 w7;
|
||||
__le32 w8;
|
||||
struct rtw89_h2c_scanofld_be_macc_role role[];
|
||||
__le32 w9; /* Added after SCAN_OFFLOAD_BE_V1 */
|
||||
/* struct rtw89_h2c_scanofld_be_macc_role (flexible number) */
|
||||
/* struct rtw89_h2c_scanofld_be_opch (flexible number) */
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_SCANOFLD_BE_W0_OP GENMASK(1, 0)
|
||||
@ -2742,6 +2844,16 @@ struct rtw89_h2c_scanofld_be {
|
||||
#define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_2GHZ GENMASK(7, 0)
|
||||
#define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_5GHZ GENMASK(15, 8)
|
||||
#define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_6GHZ GENMASK(23, 16)
|
||||
#define RTW89_H2C_SCANOFLD_BE_W9_SIZE_CFG GENMASK(7, 0)
|
||||
#define RTW89_H2C_SCANOFLD_BE_W9_SIZE_MACC GENMASK(15, 8)
|
||||
#define RTW89_H2C_SCANOFLD_BE_W9_SIZE_OP GENMASK(23, 16)
|
||||
|
||||
struct rtw89_h2c_fwips {
|
||||
__le32 w0;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_FW_IPS_W0_MACID GENMASK(7, 0)
|
||||
#define RTW89_H2C_FW_IPS_W0_ENABLE BIT(8)
|
||||
|
||||
static inline void RTW89_SET_FWCMD_P2P_MACID(void *cmd, u32 val)
|
||||
{
|
||||
@ -3400,6 +3512,12 @@ struct rtw89_h2c_wow_aoac {
|
||||
__le32 w0;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_h2c_ap_info {
|
||||
__le32 w0;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_AP_INFO_W0_PWR_INT_EN BIT(0)
|
||||
|
||||
#define RTW89_C2H_HEADER_LEN 8
|
||||
|
||||
struct rtw89_c2h_hdr {
|
||||
@ -3528,6 +3646,7 @@ struct rtw89_c2h_scanofld {
|
||||
__le32 w5;
|
||||
__le32 w6;
|
||||
__le32 w7;
|
||||
__le32 w8;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_C2H_SCANOFLD_W2_PRI_CH GENMASK(7, 0)
|
||||
@ -3542,6 +3661,8 @@ struct rtw89_c2h_scanofld {
|
||||
#define RTW89_C2H_SCANOFLD_W6_EXPECT_PERIOD GENMASK(15, 8)
|
||||
#define RTW89_C2H_SCANOFLD_W6_FW_DEF GENMASK(23, 16)
|
||||
#define RTW89_C2H_SCANOFLD_W7_REPORT_TSF GENMASK(31, 0)
|
||||
#define RTW89_C2H_SCANOFLD_W8_PERIOD_V1 GENMASK(15, 0)
|
||||
#define RTW89_C2H_SCANOFLD_W8_EXPECT_PERIOD_V1 GENMASK(31, 16)
|
||||
|
||||
#define RTW89_GET_MAC_C2H_MCC_RCV_ACK_GROUP(c2h) \
|
||||
le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0))
|
||||
@ -3636,6 +3757,13 @@ struct rtw89_c2h_pkt_ofld_rsp {
|
||||
#define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_OP GENMASK(10, 8)
|
||||
#define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_LEN GENMASK(31, 16)
|
||||
|
||||
struct rtw89_c2h_tx_duty_rpt {
|
||||
struct rtw89_c2h_hdr c2h_hdr;
|
||||
__le32 w2;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_C2H_TX_DUTY_RPT_W2_TIMER_ERR GENMASK(2, 0)
|
||||
|
||||
struct rtw89_c2h_wow_aoac_report {
|
||||
struct rtw89_c2h_hdr c2h_hdr;
|
||||
u8 rpt_ver;
|
||||
@ -3660,6 +3788,23 @@ struct rtw89_c2h_wow_aoac_report {
|
||||
|
||||
#define RTW89_C2H_WOW_AOAC_RPT_REKEY_IDX BIT(0)
|
||||
|
||||
struct rtw89_c2h_pwr_int_notify {
|
||||
struct rtw89_c2h_hdr hdr;
|
||||
__le32 w2;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_C2H_PWR_INT_NOTIFY_W2_MACID GENMASK(15, 0)
|
||||
#define RTW89_C2H_PWR_INT_NOTIFY_W2_PWR_STATUS BIT(16)
|
||||
|
||||
struct rtw89_h2c_tx_duty {
|
||||
__le32 w0;
|
||||
__le32 w1;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_H2C_TX_DUTY_W0_PAUSE_INTVL_MASK GENMASK(15, 0)
|
||||
#define RTW89_H2C_TX_DUTY_W0_TX_INTVL_MASK GENMASK(31, 16)
|
||||
#define RTW89_H2C_TX_DUTY_W1_STOP BIT(0)
|
||||
|
||||
struct rtw89_h2c_bcnfltr {
|
||||
__le32 w0;
|
||||
} __packed;
|
||||
@ -3749,17 +3894,28 @@ enum rtw89_fw_element_id {
|
||||
RTW89_FW_ELEMENT_ID_NUM,
|
||||
};
|
||||
|
||||
#define BITS_OF_RTW89_TXPWR_FW_ELEMENTS \
|
||||
#define BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ \
|
||||
(BIT(RTW89_FW_ELEMENT_ID_TXPWR_BYRATE) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_2GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_5GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_2GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_5GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU))
|
||||
|
||||
#define BITS_OF_RTW89_TXPWR_FW_ELEMENTS \
|
||||
(BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ))
|
||||
|
||||
#define RTW89_AX_GEN_DEF_NEEDED_FW_ELEMENTS_NO_6GHZ \
|
||||
(BIT(RTW89_FW_ELEMENT_ID_BB_REG) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_RADIO_A) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_RADIO_B) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_RF_NCTL) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_TXPWR_TRK) | \
|
||||
BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ)
|
||||
|
||||
#define RTW89_BE_GEN_DEF_NEEDED_FW_ELEMENTS (BIT(RTW89_FW_ELEMENT_ID_BBMCU0) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_BB_REG) | \
|
||||
BIT(RTW89_FW_ELEMENT_ID_RADIO_A) | \
|
||||
@ -3943,6 +4099,7 @@ enum rtw89_wow_h2c_func {
|
||||
H2C_FUNC_WOW_GLOBAL = 0x2,
|
||||
H2C_FUNC_GTK_OFLD = 0x3,
|
||||
H2C_FUNC_ARP_OFLD = 0x4,
|
||||
H2C_FUNC_NLO = 0x7,
|
||||
H2C_FUNC_WAKEUP_CTRL = 0x8,
|
||||
H2C_FUNC_WOW_CAM_UPD = 0xC,
|
||||
H2C_FUNC_AOAC_REPORT_REQ = 0xD,
|
||||
@ -3950,13 +4107,27 @@ enum rtw89_wow_h2c_func {
|
||||
NUM_OF_RTW89_WOW_H2C_FUNC,
|
||||
};
|
||||
|
||||
#define RTW89_WOW_WAIT_COND(func) \
|
||||
(NUM_OF_RTW89_WOW_H2C_FUNC + (func))
|
||||
#define RTW89_WOW_WAIT_COND(tag, func) \
|
||||
((tag) * NUM_OF_RTW89_WOW_H2C_FUNC + (func))
|
||||
|
||||
#define RTW89_WOW_WAIT_COND_AOAC \
|
||||
RTW89_WOW_WAIT_COND(0 /* don't care */, H2C_FUNC_AOAC_REPORT_REQ)
|
||||
|
||||
/* CLASS 2 - PS */
|
||||
#define H2C_CL_MAC_PS 0x2
|
||||
#define H2C_FUNC_MAC_LPS_PARM 0x0
|
||||
#define H2C_FUNC_P2P_ACT 0x1
|
||||
enum rtw89_ps_h2c_func {
|
||||
H2C_FUNC_MAC_LPS_PARM = 0x0,
|
||||
H2C_FUNC_P2P_ACT = 0x1,
|
||||
H2C_FUNC_IPS_CFG = 0x3,
|
||||
|
||||
NUM_OF_RTW89_PS_H2C_FUNC,
|
||||
};
|
||||
|
||||
#define RTW89_PS_WAIT_COND(tag, func) \
|
||||
((tag) * NUM_OF_RTW89_PS_H2C_FUNC + (func))
|
||||
|
||||
#define RTW89_PS_WAIT_COND_IPS_CFG \
|
||||
RTW89_PS_WAIT_COND(0 /* don't care */, H2C_FUNC_IPS_CFG)
|
||||
|
||||
/* CLASS 3 - FW download */
|
||||
#define H2C_CL_MAC_FWDL 0x3
|
||||
@ -3992,6 +4163,7 @@ enum rtw89_fw_ofld_h2c_func {
|
||||
H2C_FUNC_OFLD_CFG = 0x14,
|
||||
H2C_FUNC_ADD_SCANOFLD_CH = 0x16,
|
||||
H2C_FUNC_SCANOFLD = 0x17,
|
||||
H2C_FUNC_TX_DUTY = 0x18,
|
||||
H2C_FUNC_PKT_DROP = 0x1b,
|
||||
H2C_FUNC_CFG_BCNFLTR = 0x1e,
|
||||
H2C_FUNC_OFLD_RSSI = 0x1f,
|
||||
@ -4067,6 +4239,10 @@ enum rtw89_mrc_h2c_func {
|
||||
#define RTW89_MRC_WAIT_COND_REQ_TSF \
|
||||
RTW89_MRC_WAIT_COND(0 /* don't care */, H2C_FUNC_MRC_REQ_TSF)
|
||||
|
||||
/* CLASS 36 - AP */
|
||||
#define H2C_CL_AP 0x24
|
||||
#define H2C_FUNC_AP_INFO 0x0
|
||||
|
||||
#define H2C_CAT_OUTSRC 0x2
|
||||
|
||||
#define H2C_CL_OUTSRC_RA 0x1
|
||||
@ -4074,6 +4250,7 @@ enum rtw89_mrc_h2c_func {
|
||||
|
||||
#define H2C_CL_OUTSRC_DM 0x2
|
||||
#define H2C_FUNC_FW_LPS_CH_INFO 0xb
|
||||
#define H2C_FUNC_FW_LPS_ML_CMN_INFO 0xe
|
||||
|
||||
#define H2C_CL_OUTSRC_RF_REG_A 0x8
|
||||
#define H2C_CL_OUTSRC_RF_REG_B 0x9
|
||||
@ -4103,7 +4280,7 @@ struct rtw89_fw_h2c_rf_get_mccch {
|
||||
#define NUM_OF_RTW89_FW_RFK_PATH 2
|
||||
#define NUM_OF_RTW89_FW_RFK_TBL 3
|
||||
|
||||
struct rtw89_fw_h2c_rfk_pre_info {
|
||||
struct rtw89_fw_h2c_rfk_pre_info_common {
|
||||
struct {
|
||||
__le32 ch[NUM_OF_RTW89_FW_RFK_PATH][NUM_OF_RTW89_FW_RFK_TBL];
|
||||
__le32 band[NUM_OF_RTW89_FW_RFK_PATH][NUM_OF_RTW89_FW_RFK_TBL];
|
||||
@ -4116,6 +4293,11 @@ struct rtw89_fw_h2c_rfk_pre_info {
|
||||
} __packed tbl;
|
||||
|
||||
__le32 phy_idx;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_fw_h2c_rfk_pre_info_v0 {
|
||||
struct rtw89_fw_h2c_rfk_pre_info_common common;
|
||||
|
||||
__le32 cur_band;
|
||||
__le32 cur_bw;
|
||||
__le32 cur_center_ch;
|
||||
@ -4135,6 +4317,16 @@ struct rtw89_fw_h2c_rfk_pre_info {
|
||||
} __packed mlo;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_fw_h2c_rfk_pre_info_v1 {
|
||||
struct rtw89_fw_h2c_rfk_pre_info_common common;
|
||||
__le32 mlo_1_1;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_fw_h2c_rfk_pre_info {
|
||||
struct rtw89_fw_h2c_rfk_pre_info_v1 base_v1;
|
||||
__le32 cur_bandwidth[NUM_OF_RTW89_FW_RFK_PATH];
|
||||
} __packed;
|
||||
|
||||
struct rtw89_h2c_rf_tssi {
|
||||
__le16 len;
|
||||
u8 phy;
|
||||
@ -4197,7 +4389,7 @@ struct rtw89_h2c_rf_dack {
|
||||
__le32 type;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_h2c_rf_rxdck {
|
||||
struct rtw89_h2c_rf_rxdck_v0 {
|
||||
u8 len;
|
||||
u8 phy;
|
||||
u8 is_afe;
|
||||
@ -4208,6 +4400,11 @@ struct rtw89_h2c_rf_rxdck {
|
||||
u8 rxdck_dbg_en;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_h2c_rf_rxdck {
|
||||
struct rtw89_h2c_rf_rxdck_v0 v0;
|
||||
u8 is_chl_k;
|
||||
} __packed;
|
||||
|
||||
enum rtw89_rf_log_type {
|
||||
RTW89_RF_RUN_LOG = 0,
|
||||
RTW89_RF_RPT_LOG = 1,
|
||||
@ -4224,6 +4421,42 @@ struct rtw89_c2h_rf_run_log {
|
||||
__le32 arg[4];
|
||||
} __packed;
|
||||
|
||||
struct rtw89_c2h_rf_iqk_rpt_log {
|
||||
bool iqk_tx_fail[2];
|
||||
bool iqk_rx_fail[2];
|
||||
bool is_iqk_init;
|
||||
bool is_reload;
|
||||
bool is_wb_txiqk[2];
|
||||
bool is_wb_rxiqk[2];
|
||||
bool is_nbiqk;
|
||||
bool txiqk_en;
|
||||
bool rxiqk_en;
|
||||
bool lok_en;
|
||||
bool iqk_xym_en;
|
||||
bool iqk_sram_en;
|
||||
bool iqk_fft_en;
|
||||
bool is_fw_iqk;
|
||||
bool is_iqk_enable;
|
||||
bool iqk_cfir_en;
|
||||
bool thermal_rek_en;
|
||||
u8 iqk_band[2];
|
||||
u8 iqk_ch[2];
|
||||
u8 iqk_bw[2];
|
||||
u8 iqk_times;
|
||||
u8 version;
|
||||
u8 phy;
|
||||
u8 fwk_status;
|
||||
u8 rsvd;
|
||||
__le32 reload_cnt;
|
||||
__le32 iqk_fail_cnt;
|
||||
__le32 lok_idac[2];
|
||||
__le32 lok_vbuf[2];
|
||||
__le32 rftxgain[2][4];
|
||||
__le32 rfrxgain[2][4];
|
||||
__le32 tx_xym[2][4];
|
||||
__le32 rx_xym[2][4];
|
||||
} __packed;
|
||||
|
||||
struct rtw89_c2h_rf_dpk_rpt_log {
|
||||
u8 ver;
|
||||
u8 idx[2];
|
||||
@ -4245,19 +4478,25 @@ struct rtw89_c2h_rf_dpk_rpt_log {
|
||||
|
||||
struct rtw89_c2h_rf_dack_rpt_log {
|
||||
u8 fwdack_ver;
|
||||
u8 fwdack_rpt_ver;
|
||||
u8 fwdack_info_ver;
|
||||
u8 msbk_d[2][2][16];
|
||||
u8 dadck_d[2][2];
|
||||
u8 cdack_d[2][2][2];
|
||||
__le16 addck2_d[2][2][2];
|
||||
u8 addck2_hd[2][2][2];
|
||||
u8 addck2_ld[2][2][2];
|
||||
u8 adgaink_d[2][2];
|
||||
__le16 biask_d[2][2];
|
||||
u8 biask_hd[2][2];
|
||||
u8 biask_ld[2][2];
|
||||
u8 addck_timeout;
|
||||
u8 cdack_timeout;
|
||||
u8 dadck_timeout;
|
||||
u8 msbk_timeout;
|
||||
u8 adgaink_timeout;
|
||||
u8 wbadcdck_timeout;
|
||||
u8 drck_timeout;
|
||||
u8 dack_fail;
|
||||
u8 wbdck_d[2];
|
||||
u8 rck_d;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_c2h_rf_rxdck_rpt_log {
|
||||
@ -4268,6 +4507,14 @@ struct rtw89_c2h_rf_rxdck_rpt_log {
|
||||
u8 timeout[2];
|
||||
} __packed;
|
||||
|
||||
struct rtw89_c2h_rf_tssi_rpt_log {
|
||||
s8 alignment_power[2][2][4];
|
||||
u8 alignment_power_cw_h[2][2][4];
|
||||
u8 alignment_power_cw_l[2][2][4];
|
||||
u8 tssi_alimk_state[2][2];
|
||||
u8 default_txagc_offset[2][2];
|
||||
} __packed;
|
||||
|
||||
struct rtw89_c2h_rf_txgapk_rpt_log {
|
||||
__le32 r0x8010[2];
|
||||
__le32 chk_cnt;
|
||||
@ -4315,65 +4562,67 @@ void rtw89_h2c_pkt_set_hdr(struct rtw89_dev *rtwdev, struct sk_buff *skb,
|
||||
u8 type, u8 cat, u8 class, u8 func,
|
||||
bool rack, bool dack, u32 len);
|
||||
int rtw89_fw_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_default_cmac_tbl_g7(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_default_dmac_tbl_v2(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_assoc_cmac_tbl_g7(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_ampdu_cmac_tbl_g7(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta *rtwsta);
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta *rtwsta);
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_fw_h2c_update_beacon_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif *vif,
|
||||
struct rtw89_sta *rtwsta, const u8 *scan_mac_addr);
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif,
|
||||
struct rtw89_sta_link *rtwsta_link, const u8 *scan_mac_addr);
|
||||
int rtw89_fw_h2c_dctl_sec_cam_v1(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
int rtw89_fw_h2c_dctl_sec_cam_v2(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
void rtw89_fw_c2h_irqsafe(struct rtw89_dev *rtwdev, struct sk_buff *c2h);
|
||||
void rtw89_fw_c2h_work(struct work_struct *work);
|
||||
int rtw89_fw_h2c_role_maintain(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
enum rtw89_upd_mode upd_mode);
|
||||
int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta, bool dis_conn);
|
||||
int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link, bool dis_conn);
|
||||
int rtw89_fw_h2c_notify_dbcc(struct rtw89_dev *rtwdev, bool en);
|
||||
int rtw89_fw_h2c_macid_pause(struct rtw89_dev *rtwdev, u8 sh, u8 grp,
|
||||
bool pause);
|
||||
int rtw89_fw_h2c_set_edca(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_fw_h2c_set_edca(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u8 ac, u32 val);
|
||||
int rtw89_fw_h2c_set_ofld_cfg(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_tx_duty(struct rtw89_dev *rtwdev, u8 lv);
|
||||
int rtw89_fw_h2c_set_bcn_fltr_cfg(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool connect);
|
||||
int rtw89_fw_h2c_rssi_offload(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_rx_phy_ppdu *phy_ppdu);
|
||||
int rtw89_fw_h2c_tp_offload(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
int rtw89_fw_h2c_tp_offload(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_fw_h2c_ra(struct rtw89_dev *rtwdev, struct rtw89_ra_info *ra, bool csi);
|
||||
int rtw89_fw_h2c_cxdrv_init(struct rtw89_dev *rtwdev, u8 type);
|
||||
int rtw89_fw_h2c_cxdrv_init_v7(struct rtw89_dev *rtwdev, u8 type);
|
||||
int rtw89_fw_h2c_cxdrv_role(struct rtw89_dev *rtwdev, u8 type);
|
||||
int rtw89_fw_h2c_cxdrv_role_v1(struct rtw89_dev *rtwdev, u8 type);
|
||||
int rtw89_fw_h2c_cxdrv_role_v2(struct rtw89_dev *rtwdev, u8 type);
|
||||
int rtw89_fw_h2c_cxdrv_role_v7(struct rtw89_dev *rtwdev, u8 type);
|
||||
int rtw89_fw_h2c_cxdrv_role_v8(struct rtw89_dev *rtwdev, u8 type);
|
||||
int rtw89_fw_h2c_cxdrv_ctrl(struct rtw89_dev *rtwdev, u8 type);
|
||||
int rtw89_fw_h2c_cxdrv_ctrl_v7(struct rtw89_dev *rtwdev, u8 type);
|
||||
@ -4382,16 +4631,14 @@ int rtw89_fw_h2c_cxdrv_rfk(struct rtw89_dev *rtwdev, u8 type);
|
||||
int rtw89_fw_h2c_del_pkt_offload(struct rtw89_dev *rtwdev, u8 id);
|
||||
int rtw89_fw_h2c_add_pkt_offload(struct rtw89_dev *rtwdev, u8 *id,
|
||||
struct sk_buff *skb_ofld);
|
||||
int rtw89_fw_h2c_scan_list_offload(struct rtw89_dev *rtwdev, int ch_num,
|
||||
struct list_head *chan_list);
|
||||
int rtw89_fw_h2c_scan_list_offload_be(struct rtw89_dev *rtwdev, int ch_num,
|
||||
struct list_head *chan_list);
|
||||
int rtw89_fw_h2c_scan_offload(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *opt,
|
||||
struct rtw89_vif *vif);
|
||||
int rtw89_fw_h2c_scan_offload_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *opt,
|
||||
struct rtw89_vif_link *vif,
|
||||
bool wowlan);
|
||||
int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *opt,
|
||||
struct rtw89_vif *vif);
|
||||
struct rtw89_vif_link *vif,
|
||||
bool wowlan);
|
||||
int rtw89_fw_h2c_rf_reg(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_fw_h2c_rf_reg_info *info,
|
||||
u16 len, u8 page);
|
||||
@ -4399,26 +4646,36 @@ int rtw89_fw_h2c_rf_ntfy_mcc(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
int rtw89_fw_h2c_rf_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_tssi_mode tssi_mode);
|
||||
int rtw89_fw_h2c_rf_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
int rtw89_fw_h2c_rf_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
int rtw89_fw_h2c_rf_txgapk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
int rtw89_fw_h2c_rf_dack(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
int rtw89_fw_h2c_rf_rxdck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
const struct rtw89_chan *chan, enum rtw89_tssi_mode tssi_mode);
|
||||
int rtw89_fw_h2c_rf_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan);
|
||||
int rtw89_fw_h2c_rf_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan);
|
||||
int rtw89_fw_h2c_rf_txgapk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan);
|
||||
int rtw89_fw_h2c_rf_dack(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan);
|
||||
int rtw89_fw_h2c_rf_rxdck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan, bool is_chl_k);
|
||||
int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev,
|
||||
u8 h2c_class, u8 h2c_func, u8 *buf, u16 len,
|
||||
bool rack, bool dack);
|
||||
int rtw89_fw_h2c_raw(struct rtw89_dev *rtwdev, const u8 *buf, u16 len);
|
||||
void rtw89_fw_send_all_early_h2c(struct rtw89_dev *rtwdev);
|
||||
void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u8 macid);
|
||||
void rtw89_fw_release_general_pkt_list_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool notify_fw);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool notify_fw);
|
||||
void rtw89_fw_release_general_pkt_list(struct rtw89_dev *rtwdev, bool notify_fw);
|
||||
int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
||||
int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
bool valid, struct ieee80211_ampdu_params *params);
|
||||
int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
||||
int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
bool valid, struct ieee80211_ampdu_params *params);
|
||||
void rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users,
|
||||
@ -4426,8 +4683,11 @@ int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users,
|
||||
|
||||
int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_lps_parm *lps_param);
|
||||
int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif);
|
||||
int rtw89_fw_h2c_fwips(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
struct sk_buff *rtw89_fw_h2c_alloc_skb_with_hdr(struct rtw89_dev *rtwdev, u32 len);
|
||||
struct sk_buff *rtw89_fw_h2c_alloc_skb_no_hdr(struct rtw89_dev *rtwdev, u32 len);
|
||||
int rtw89_fw_msg_reg(struct rtw89_dev *rtwdev,
|
||||
@ -4435,43 +4695,56 @@ int rtw89_fw_msg_reg(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_mac_c2h_info *c2h_info);
|
||||
int rtw89_fw_h2c_fw_log(struct rtw89_dev *rtwdev, bool enable);
|
||||
void rtw89_fw_st_dbg_dump(struct rtw89_dev *rtwdev);
|
||||
void rtw89_hw_scan_start(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_scan_request *req);
|
||||
void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
void rtw89_hw_scan_start(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_scan_request *scan_req);
|
||||
void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool aborted);
|
||||
int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif);
|
||||
int rtw89_hw_scan_add_chan_list(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected);
|
||||
void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_hw_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link, bool connected);
|
||||
int rtw89_pno_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_hw_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected);
|
||||
struct rtw89_vif_link *rtwvif_link, bool connected);
|
||||
int rtw89_pno_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_fw_h2c_trigger_cpu_exception(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_pkt_drop(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_pkt_drop_params *params);
|
||||
int rtw89_fw_h2c_p2p_act(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
int rtw89_fw_h2c_p2p_act(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_bss_conf *bss_conf,
|
||||
struct ieee80211_p2p_noa_desc *desc,
|
||||
u8 act, u8 noa_id);
|
||||
int rtw89_fw_h2c_tsf32_toggle(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_fw_h2c_tsf32_toggle(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool en);
|
||||
int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool enable);
|
||||
int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link, bool enable);
|
||||
int rtw89_fw_h2c_cfg_pno(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_arp_offload(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool enable);
|
||||
struct rtw89_vif_link *rtwvif_link, bool enable);
|
||||
int rtw89_fw_h2c_disconnect_detect(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool enable);
|
||||
int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link, bool enable);
|
||||
int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool enable);
|
||||
struct rtw89_vif_link *rtwvif_link, bool enable);
|
||||
int rtw89_fw_wow_cam_update(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_wow_cam_info *cam_info);
|
||||
int rtw89_fw_h2c_wow_gtk_ofld(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool enable);
|
||||
int rtw89_fw_h2c_wow_request_aoac(struct rtw89_dev *rtwdev);
|
||||
int rtw89_fw_h2c_add_mcc(struct rtw89_dev *rtwdev,
|
||||
@ -4496,7 +4769,7 @@ int rtw89_fw_h2c_mrc_add(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_fw_mrc_add_arg *arg);
|
||||
int rtw89_fw_h2c_mrc_start(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_fw_mrc_start_arg *arg);
|
||||
int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx);
|
||||
int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx, u8 slot_idx);
|
||||
int rtw89_fw_h2c_mrc_req_tsf(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_fw_mrc_req_tsf_arg *arg,
|
||||
struct rtw89_mac_mrc_tsf_rpt *rpt);
|
||||
@ -4506,6 +4779,7 @@ int rtw89_fw_h2c_mrc_sync(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_fw_mrc_sync_arg *arg);
|
||||
int rtw89_fw_h2c_mrc_upd_duration(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_fw_mrc_upd_duration_arg *arg);
|
||||
int rtw89_fw_h2c_ap_info_refcount(struct rtw89_dev *rtwdev, bool en);
|
||||
|
||||
static inline void rtw89_fw_h2c_init_ba_cam(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
@ -4516,51 +4790,73 @@ static inline void rtw89_fw_h2c_init_ba_cam(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static inline int rtw89_chip_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta)
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return chip->ops->h2c_default_cmac_tbl(rtwdev, rtwvif, rtwsta);
|
||||
return chip->ops->h2c_default_cmac_tbl(rtwdev, rtwvif_link, rtwsta_link);
|
||||
}
|
||||
|
||||
static inline int rtw89_chip_h2c_default_dmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta)
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (chip->ops->h2c_default_dmac_tbl)
|
||||
return chip->ops->h2c_default_dmac_tbl(rtwdev, rtwvif, rtwsta);
|
||||
return chip->ops->h2c_default_dmac_tbl(rtwdev, rtwvif_link, rtwsta_link);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int rtw89_chip_h2c_update_beacon(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif)
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return chip->ops->h2c_update_beacon(rtwdev, rtwvif);
|
||||
return chip->ops->h2c_update_beacon(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
static inline int rtw89_chip_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return chip->ops->h2c_assoc_cmac_tbl(rtwdev, vif, sta);
|
||||
return chip->ops->h2c_assoc_cmac_tbl(rtwdev, rtwvif_link, rtwsta_link);
|
||||
}
|
||||
|
||||
static inline int rtw89_chip_h2c_ampdu_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
static inline
|
||||
int rtw89_chip_h2c_ampdu_link_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (chip->ops->h2c_ampdu_cmac_tbl)
|
||||
return chip->ops->h2c_ampdu_cmac_tbl(rtwdev, vif, sta);
|
||||
return chip->ops->h2c_ampdu_cmac_tbl(rtwdev, rtwvif_link,
|
||||
rtwsta_link);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int rtw89_chip_h2c_ampdu_cmac_tbl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_sta *rtwsta)
|
||||
{
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_sta_link *rtwsta_link;
|
||||
unsigned int link_id;
|
||||
int ret;
|
||||
|
||||
rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
|
||||
rtwvif_link = rtwsta_link->rtwvif_link;
|
||||
ret = rtw89_chip_h2c_ampdu_link_cmac_tbl(rtwdev, rtwvif_link,
|
||||
rtwsta_link);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -4570,8 +4866,20 @@ int rtw89_chip_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
||||
bool valid, struct ieee80211_ampdu_params *params)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_sta_link *rtwsta_link;
|
||||
unsigned int link_id;
|
||||
int ret;
|
||||
|
||||
return chip->ops->h2c_ba_cam(rtwdev, rtwsta, valid, params);
|
||||
rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
|
||||
rtwvif_link = rtwsta_link->rtwvif_link;
|
||||
ret = chip->ops->h2c_ba_cam(rtwdev, rtwvif_link, rtwsta_link,
|
||||
valid, params);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* must consider compatibility; don't insert new in the mid */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -169,6 +169,20 @@ enum rtw89_mac_ax_l0_to_l1_event {
|
||||
MAC_AX_L0_TO_L1_EVENT_MAX = 15,
|
||||
};
|
||||
|
||||
enum rtw89_mac_phy_rpt_size {
|
||||
MAC_AX_PHY_RPT_SIZE_0 = 0,
|
||||
MAC_AX_PHY_RPT_SIZE_8 = 1,
|
||||
MAC_AX_PHY_RPT_SIZE_16 = 2,
|
||||
MAC_AX_PHY_RPT_SIZE_24 = 3,
|
||||
};
|
||||
|
||||
enum rtw89_mac_hdr_cnv_size {
|
||||
MAC_AX_HDR_CNV_SIZE_0 = 0,
|
||||
MAC_AX_HDR_CNV_SIZE_32 = 1,
|
||||
MAC_AX_HDR_CNV_SIZE_64 = 2,
|
||||
MAC_AX_HDR_CNV_SIZE_96 = 3,
|
||||
};
|
||||
|
||||
enum rtw89_mac_wow_fw_status {
|
||||
WOWLAN_NOT_READY = 0x00,
|
||||
WOWLAN_SLEEP_READY = 0x01,
|
||||
@ -391,6 +405,7 @@ enum rtw89_mac_c2h_ofld_func {
|
||||
RTW89_MAC_C2H_FUNC_MACID_PAUSE,
|
||||
RTW89_MAC_C2H_FUNC_TSF32_TOGL_RPT = 0x6,
|
||||
RTW89_MAC_C2H_FUNC_SCANOFLD_RSP = 0x9,
|
||||
RTW89_MAC_C2H_FUNC_TX_DUTY_RPT = 0xa,
|
||||
RTW89_MAC_C2H_FUNC_BCNFLTR_RPT = 0xd,
|
||||
RTW89_MAC_C2H_FUNC_OFLD_MAX,
|
||||
};
|
||||
@ -421,11 +436,16 @@ enum rtw89_mac_c2h_mrc_func {
|
||||
|
||||
enum rtw89_mac_c2h_wow_func {
|
||||
RTW89_MAC_C2H_FUNC_AOAC_REPORT,
|
||||
RTW89_MAC_C2H_FUNC_READ_WOW_CAM,
|
||||
|
||||
NUM_OF_RTW89_MAC_C2H_FUNC_WOW,
|
||||
};
|
||||
|
||||
enum rtw89_mac_c2h_ap_func {
|
||||
RTW89_MAC_C2H_FUNC_PWR_INT_NOTIFY = 0,
|
||||
|
||||
NUM_OF_RTW89_MAC_C2H_FUNC_AP,
|
||||
};
|
||||
|
||||
enum rtw89_mac_c2h_class {
|
||||
RTW89_MAC_C2H_CLASS_INFO = 0x0,
|
||||
RTW89_MAC_C2H_CLASS_OFLD = 0x1,
|
||||
@ -434,6 +454,7 @@ enum rtw89_mac_c2h_class {
|
||||
RTW89_MAC_C2H_CLASS_MCC = 0x4,
|
||||
RTW89_MAC_C2H_CLASS_FWDBG = 0x5,
|
||||
RTW89_MAC_C2H_CLASS_MRC = 0xe,
|
||||
RTW89_MAC_C2H_CLASS_AP = 0x18,
|
||||
RTW89_MAC_C2H_CLASS_MAX,
|
||||
};
|
||||
|
||||
@ -885,12 +906,14 @@ struct rtw89_mac_size_set {
|
||||
const struct rtw89_dle_size wde_size9;
|
||||
const struct rtw89_dle_size wde_size18;
|
||||
const struct rtw89_dle_size wde_size19;
|
||||
const struct rtw89_dle_size wde_size23;
|
||||
const struct rtw89_dle_size ple_size0;
|
||||
const struct rtw89_dle_size ple_size0_v1;
|
||||
const struct rtw89_dle_size ple_size3_v1;
|
||||
const struct rtw89_dle_size ple_size4;
|
||||
const struct rtw89_dle_size ple_size6;
|
||||
const struct rtw89_dle_size ple_size8;
|
||||
const struct rtw89_dle_size ple_size9;
|
||||
const struct rtw89_dle_size ple_size18;
|
||||
const struct rtw89_dle_size ple_size19;
|
||||
const struct rtw89_wde_quota wde_qt0;
|
||||
@ -900,6 +923,7 @@ struct rtw89_mac_size_set {
|
||||
const struct rtw89_wde_quota wde_qt7;
|
||||
const struct rtw89_wde_quota wde_qt17;
|
||||
const struct rtw89_wde_quota wde_qt18;
|
||||
const struct rtw89_wde_quota wde_qt23;
|
||||
const struct rtw89_ple_quota ple_qt0;
|
||||
const struct rtw89_ple_quota ple_qt1;
|
||||
const struct rtw89_ple_quota ple_qt4;
|
||||
@ -911,9 +935,12 @@ struct rtw89_mac_size_set {
|
||||
const struct rtw89_ple_quota ple_qt45;
|
||||
const struct rtw89_ple_quota ple_qt46;
|
||||
const struct rtw89_ple_quota ple_qt47;
|
||||
const struct rtw89_ple_quota ple_qt57;
|
||||
const struct rtw89_ple_quota ple_qt58;
|
||||
const struct rtw89_ple_quota ple_qt59;
|
||||
const struct rtw89_ple_quota ple_qt_52a_wow;
|
||||
const struct rtw89_ple_quota ple_qt_52b_wow;
|
||||
const struct rtw89_ple_quota ple_qt_52bt_wow;
|
||||
const struct rtw89_ple_quota ple_qt_51b_wow;
|
||||
const struct rtw89_rsvd_quota ple_rsvd_qt0;
|
||||
const struct rtw89_rsvd_quota ple_rsvd_qt1;
|
||||
@ -946,14 +973,16 @@ struct rtw89_mac_gen_def {
|
||||
void (*dmac_func_pre_en)(struct rtw89_dev *rtwdev);
|
||||
void (*dle_func_en)(struct rtw89_dev *rtwdev, bool enable);
|
||||
void (*dle_clk_en)(struct rtw89_dev *rtwdev, bool enable);
|
||||
void (*bf_assoc)(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta);
|
||||
void (*bf_assoc)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
|
||||
int (*typ_fltr_opt)(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_machdr_frame_type type,
|
||||
enum rtw89_mac_fwd_target fwd_target,
|
||||
u8 mac_idx);
|
||||
int (*cfg_ppdu_status)(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable);
|
||||
void (*cfg_phy_rpt)(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable);
|
||||
|
||||
int (*dle_mix_cfg)(struct rtw89_dev *rtwdev, const struct rtw89_dle_mem *cfg);
|
||||
int (*chk_dle_rdy)(struct rtw89_dev *rtwdev, bool wde_or_ple);
|
||||
@ -978,9 +1007,11 @@ struct rtw89_mac_gen_def {
|
||||
bool dlfw, bool include_bb);
|
||||
u8 (*fwdl_get_status)(struct rtw89_dev *rtwdev, enum rtw89_fwdl_check_type type);
|
||||
int (*fwdl_check_path_ready)(struct rtw89_dev *rtwdev, bool h2c_or_fwdl);
|
||||
void (*fwdl_secure_idmem_share_mode)(struct rtw89_dev *rtwdev, u8 mode);
|
||||
int (*parse_efuse_map)(struct rtw89_dev *rtwdev);
|
||||
int (*parse_phycap_map)(struct rtw89_dev *rtwdev);
|
||||
int (*cnv_efuse_state)(struct rtw89_dev *rtwdev, bool idle);
|
||||
int (*efuse_read_fw_secure)(struct rtw89_dev *rtwdev);
|
||||
|
||||
int (*cfg_plt)(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_plt *plt);
|
||||
u16 (*get_plt_cnt)(struct rtw89_dev *rtwdev, u8 band);
|
||||
@ -999,10 +1030,13 @@ struct rtw89_mac_gen_def {
|
||||
bool (*is_txq_empty)(struct rtw89_dev *rtwdev);
|
||||
|
||||
int (*add_chan_list)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool connected);
|
||||
struct rtw89_vif_link *rtwvif_link, bool connected);
|
||||
int (*add_chan_list_pno)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
int (*scan_offload)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_scan_option *option,
|
||||
struct rtw89_vif *rtwvif);
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool wowlan);
|
||||
|
||||
int (*wow_config_mac)(struct rtw89_dev *rtwdev, bool enable_wow);
|
||||
};
|
||||
@ -1025,81 +1059,89 @@ u32 rtw89_mac_reg_by_port(struct rtw89_dev *rtwdev, u32 base, u8 port, u8 mac_id
|
||||
}
|
||||
|
||||
static inline u32
|
||||
rtw89_read32_port(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, u32 base)
|
||||
rtw89_read32_port(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, u32 base)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
return rtw89_read32(rtwdev, reg);
|
||||
}
|
||||
|
||||
static inline u32
|
||||
rtw89_read32_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_read32_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u32 mask)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
return rtw89_read32_mask(rtwdev, reg, mask);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write32_port(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, u32 base,
|
||||
rtw89_write32_port(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, u32 base,
|
||||
u32 data)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write32(rtwdev, reg, data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write32_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_write32_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u32 mask, u32 data)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, mask, data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write16_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_write16_port_mask(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u32 mask, u16 data)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write16_mask(rtwdev, reg, mask, data);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write32_port_clr(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_write32_port_clr(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u32 bit)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write32_clr(rtwdev, reg, bit);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write16_port_clr(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_write16_port_clr(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u16 bit)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write16_clr(rtwdev, reg, bit);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u32 base, u32 bit)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif->port, rtwvif->mac_idx);
|
||||
reg = rtw89_mac_reg_by_port(rtwdev, base, rtwvif_link->port,
|
||||
rtwvif_link->mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, bit);
|
||||
}
|
||||
|
||||
@ -1131,21 +1173,21 @@ int rtw89_mac_dle_dfi_qempty_cfg(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_mac_dle_dfi_qempty *qempty);
|
||||
void rtw89_mac_dump_l0_to_l1(struct rtw89_dev *rtwdev,
|
||||
enum mac_ax_err_info err);
|
||||
int rtw89_mac_add_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
|
||||
int rtw89_mac_port_update(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
int rtw89_mac_add_vif(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);
|
||||
int rtw89_mac_port_update(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_mac_port_tsf_sync(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif *rtwvif_src,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_vif_link *rtwvif_src,
|
||||
u16 offset_tu);
|
||||
int rtw89_mac_port_get_tsf(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_mac_port_get_tsf(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
u64 *tsf);
|
||||
void rtw89_mac_port_cfg_rx_sync(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool en);
|
||||
struct rtw89_vif_link *rtwvif_link, bool en);
|
||||
void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif);
|
||||
void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_mac_enable_beacon_for_ap_vifs(struct rtw89_dev *rtwdev, bool en);
|
||||
int rtw89_mac_remove_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *vif);
|
||||
int rtw89_mac_remove_vif(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);
|
||||
int rtw89_mac_enable_bb_rf(struct rtw89_dev *rtwdev);
|
||||
int rtw89_mac_disable_bb_rf(struct rtw89_dev *rtwdev);
|
||||
|
||||
@ -1196,6 +1238,27 @@ int rtw89_mac_stop_sch_tx_v2(struct rtw89_dev *rtwdev, u8 mac_idx,
|
||||
int rtw89_mac_resume_sch_tx(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
|
||||
int rtw89_mac_resume_sch_tx_v1(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
|
||||
int rtw89_mac_resume_sch_tx_v2(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en);
|
||||
void rtw89_mac_cfg_phy_rpt_be(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable);
|
||||
|
||||
static inline
|
||||
void rtw89_mac_cfg_phy_rpt(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
|
||||
if (mac->cfg_phy_rpt)
|
||||
mac->cfg_phy_rpt(rtwdev, mac_idx, enable);
|
||||
}
|
||||
|
||||
static inline
|
||||
void rtw89_mac_cfg_phy_rpt_bands(struct rtw89_dev *rtwdev, bool enable)
|
||||
{
|
||||
rtw89_mac_cfg_phy_rpt(rtwdev, RTW89_MAC_0, enable);
|
||||
|
||||
if (!rtwdev->dbcc_en)
|
||||
return;
|
||||
|
||||
rtw89_mac_cfg_phy_rpt(rtwdev, RTW89_MAC_1, enable);
|
||||
}
|
||||
|
||||
static inline
|
||||
int rtw89_mac_cfg_ppdu_status(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable)
|
||||
@ -1205,7 +1268,22 @@ int rtw89_mac_cfg_ppdu_status(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable)
|
||||
return mac->cfg_ppdu_status(rtwdev, mac_idx, enable);
|
||||
}
|
||||
|
||||
void rtw89_mac_update_rts_threshold(struct rtw89_dev *rtwdev, u8 mac_idx);
|
||||
static inline
|
||||
int rtw89_mac_cfg_ppdu_status_bands(struct rtw89_dev *rtwdev, bool enable)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, enable);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!rtwdev->dbcc_en)
|
||||
return 0;
|
||||
|
||||
return rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_1, enable);
|
||||
}
|
||||
|
||||
void rtw89_mac_update_rts_threshold(struct rtw89_dev *rtwdev);
|
||||
void rtw89_mac_flush_txq(struct rtw89_dev *rtwdev, u32 queues, bool drop);
|
||||
int rtw89_mac_coex_init(struct rtw89_dev *rtwdev, const struct rtw89_mac_ax_coex *coex);
|
||||
int rtw89_mac_coex_init_v1(struct rtw89_dev *rtwdev,
|
||||
@ -1243,27 +1321,30 @@ void rtw89_mac_power_mode_change(struct rtw89_dev *rtwdev, bool enter);
|
||||
void rtw89_mac_notify_wake(struct rtw89_dev *rtwdev);
|
||||
|
||||
static inline
|
||||
void rtw89_mac_bf_assoc(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
void rtw89_mac_bf_assoc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
|
||||
if (mac->bf_assoc)
|
||||
mac->bf_assoc(rtwdev, vif, sta);
|
||||
mac->bf_assoc(rtwdev, rtwvif_link, rtwsta_link);
|
||||
}
|
||||
|
||||
void rtw89_mac_bf_disassoc(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta);
|
||||
void rtw89_mac_bf_disassoc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link);
|
||||
void rtw89_mac_bf_set_gid_table(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *conf);
|
||||
void rtw89_mac_bf_monitor_calc(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_sta *sta, bool disconnect);
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
bool disconnect);
|
||||
void _rtw89_mac_bf_monitor_track(struct rtw89_dev *rtwdev);
|
||||
void rtw89_mac_bfee_ctrl(struct rtw89_dev *rtwdev, u8 mac_idx, bool en);
|
||||
int rtw89_mac_vif_init(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
int rtw89_mac_vif_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
int rtw89_mac_vif_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_mac_vif_deinit(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
int rtw89_mac_set_hw_muedca_ctrl(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool en);
|
||||
struct rtw89_vif_link *rtwvif_link, bool en);
|
||||
int rtw89_mac_set_macid_pause(struct rtw89_dev *rtwdev, u8 macid, bool pause);
|
||||
|
||||
static inline void rtw89_mac_bf_monitor_track(struct rtw89_dev *rtwdev)
|
||||
@ -1368,15 +1449,15 @@ static inline bool rtw89_mac_get_power_state(struct rtw89_dev *rtwdev)
|
||||
return !!val;
|
||||
}
|
||||
|
||||
int rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
||||
int rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_link,
|
||||
bool resume, u32 tx_time);
|
||||
int rtw89_mac_get_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
|
||||
int rtw89_mac_get_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_link,
|
||||
u32 *tx_time);
|
||||
int rtw89_mac_set_tx_retry_limit(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta *rtwsta,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
bool resume, u8 tx_retry);
|
||||
int rtw89_mac_get_tx_retry_limit(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta *rtwsta, u8 *tx_retry);
|
||||
struct rtw89_sta_link *rtwsta_link, u8 *tx_retry);
|
||||
|
||||
enum rtw89_mac_xtal_si_offset {
|
||||
XTAL0 = 0x0,
|
||||
@ -1458,4 +1539,14 @@ int rtw89_mac_get_dle_rsvd_qt_cfg(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_mac_dle_rsvd_qt_cfg *cfg);
|
||||
int rtw89_mac_cpu_io_rx(struct rtw89_dev *rtwdev, bool wow_enable);
|
||||
|
||||
static inline
|
||||
void rtw89_fwdl_secure_idmem_share_mode(struct rtw89_dev *rtwdev, u8 mode)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
|
||||
if (!mac->fwdl_secure_idmem_share_mode)
|
||||
return;
|
||||
|
||||
return mac->fwdl_secure_idmem_share_mode(rtwdev, mode);
|
||||
}
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -773,7 +773,7 @@ static int dmac_init_be(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_mac_preload_init(rtwdev, RTW89_MAC_0, rtwdev->mac.qta_mode);
|
||||
ret = rtw89_mac_preload_init(rtwdev, mac_idx, rtwdev->mac.qta_mode);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "[ERR]preload init %d\n", ret);
|
||||
return ret;
|
||||
@ -1988,6 +1988,20 @@ int rtw89_mac_resume_sch_tx_v2(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en)
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_mac_resume_sch_tx_v2);
|
||||
|
||||
void rtw89_mac_cfg_phy_rpt_be(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable)
|
||||
{
|
||||
u32 reg, val;
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RCR, mac_idx);
|
||||
val = enable ? MAC_AX_PHY_RPT_SIZE_8 : MAC_AX_PHY_RPT_SIZE_0;
|
||||
rtw89_write32_mask(rtwdev, reg, B_BE_PHY_RPT_SZ_MASK, val);
|
||||
rtw89_write32_mask(rtwdev, reg, B_BE_HDR_CNV_SZ_MASK, MAC_AX_HDR_CNV_SIZE_0);
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_DRV_INFO_OPTION, mac_idx);
|
||||
rtw89_write32_mask(rtwdev, reg, B_BE_DRV_INFO_PHYRPT_EN, enable);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_mac_cfg_phy_rpt_be);
|
||||
|
||||
static
|
||||
int rtw89_mac_cfg_ppdu_status_be(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable)
|
||||
{
|
||||
@ -2091,13 +2105,13 @@ static int rtw89_mac_init_bfee_be(struct rtw89_dev *rtwdev, u8 mac_idx)
|
||||
}
|
||||
|
||||
static int rtw89_mac_set_csi_para_reg_be(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
u8 nc = 1, nr = 3, ng = 0, cb = 1, cs = 1, ldpc_en = 1, stbc_en = 1;
|
||||
u8 mac_idx = rtwvif->mac_idx;
|
||||
u8 port_sel = rtwvif->port;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
u8 mac_idx = rtwvif_link->mac_idx;
|
||||
u8 port_sel = rtwvif_link->port;
|
||||
u8 sound_dim = 3, t;
|
||||
u8 *phy_cap;
|
||||
u32 reg;
|
||||
@ -2108,7 +2122,10 @@ static int rtw89_mac_set_csi_para_reg_be(struct rtw89_dev *rtwdev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
phy_cap = sta->deflink.he_cap.he_cap_elem.phy_cap_info;
|
||||
rcu_read_lock();
|
||||
|
||||
link_sta = rtw89_sta_rcu_dereference_link(rtwsta_link, true);
|
||||
phy_cap = link_sta->he_cap.he_cap_elem.phy_cap_info;
|
||||
|
||||
if ((phy_cap[3] & IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER) ||
|
||||
(phy_cap[4] & IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER)) {
|
||||
@ -2119,11 +2136,11 @@ static int rtw89_mac_set_csi_para_reg_be(struct rtw89_dev *rtwdev,
|
||||
sound_dim = min(sound_dim, t);
|
||||
}
|
||||
|
||||
if ((sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) ||
|
||||
(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
|
||||
ldpc_en &= !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
|
||||
stbc_en &= !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK);
|
||||
t = u32_get_bits(sta->deflink.vht_cap.cap,
|
||||
if ((link_sta->vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) ||
|
||||
(link_sta->vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) {
|
||||
ldpc_en &= !!(link_sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC);
|
||||
stbc_en &= !!(link_sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK);
|
||||
t = u32_get_bits(link_sta->vht_cap.cap,
|
||||
IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK);
|
||||
sound_dim = min(sound_dim, t);
|
||||
}
|
||||
@ -2131,6 +2148,8 @@ static int rtw89_mac_set_csi_para_reg_be(struct rtw89_dev *rtwdev,
|
||||
nc = min(nc, sound_dim);
|
||||
nr = min(nr, sound_dim);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_CTRL_0, mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, B_BE_BFMEE_BFPARAM_SEL);
|
||||
|
||||
@ -2155,12 +2174,12 @@ static int rtw89_mac_set_csi_para_reg_be(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static int rtw89_mac_csi_rrsc_be(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
u32 rrsc = BIT(RTW89_MAC_BF_RRSC_6M) | BIT(RTW89_MAC_BF_RRSC_24M);
|
||||
u8 mac_idx = rtwvif->mac_idx;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
u8 mac_idx = rtwvif_link->mac_idx;
|
||||
int ret;
|
||||
u32 reg;
|
||||
|
||||
@ -2168,22 +2187,28 @@ static int rtw89_mac_csi_rrsc_be(struct rtw89_dev *rtwdev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
rcu_read_lock();
|
||||
|
||||
link_sta = rtw89_sta_rcu_dereference_link(rtwsta_link, true);
|
||||
|
||||
if (link_sta->he_cap.has_he) {
|
||||
rrsc |= (BIT(RTW89_MAC_BF_RRSC_HE_MSC0) |
|
||||
BIT(RTW89_MAC_BF_RRSC_HE_MSC3) |
|
||||
BIT(RTW89_MAC_BF_RRSC_HE_MSC5));
|
||||
}
|
||||
if (sta->deflink.vht_cap.vht_supported) {
|
||||
if (link_sta->vht_cap.vht_supported) {
|
||||
rrsc |= (BIT(RTW89_MAC_BF_RRSC_VHT_MSC0) |
|
||||
BIT(RTW89_MAC_BF_RRSC_VHT_MSC3) |
|
||||
BIT(RTW89_MAC_BF_RRSC_VHT_MSC5));
|
||||
}
|
||||
if (sta->deflink.ht_cap.ht_supported) {
|
||||
if (link_sta->ht_cap.ht_supported) {
|
||||
rrsc |= (BIT(RTW89_MAC_BF_RRSC_HT_MSC0) |
|
||||
BIT(RTW89_MAC_BF_RRSC_HT_MSC3) |
|
||||
BIT(RTW89_MAC_BF_RRSC_HT_MSC5));
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_CTRL_0, mac_idx);
|
||||
rtw89_write32_set(rtwdev, reg, B_BE_BFMEE_BFPARAM_SEL);
|
||||
rtw89_write32_clr(rtwdev, reg, B_BE_BFMEE_CSI_FORCE_RETE_EN);
|
||||
@ -2195,17 +2220,25 @@ static int rtw89_mac_csi_rrsc_be(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void rtw89_mac_bf_assoc_be(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_sta_link *rtwsta_link)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
bool has_beamformer_cap;
|
||||
|
||||
if (rtw89_sta_has_beamformer_cap(sta)) {
|
||||
rcu_read_lock();
|
||||
|
||||
link_sta = rtw89_sta_rcu_dereference_link(rtwsta_link, true);
|
||||
has_beamformer_cap = rtw89_sta_has_beamformer_cap(link_sta);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
if (has_beamformer_cap) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_BF,
|
||||
"initialize bfee for new association\n");
|
||||
rtw89_mac_init_bfee_be(rtwdev, rtwvif->mac_idx);
|
||||
rtw89_mac_set_csi_para_reg_be(rtwdev, vif, sta);
|
||||
rtw89_mac_csi_rrsc_be(rtwdev, vif, sta);
|
||||
rtw89_mac_init_bfee_be(rtwdev, rtwvif_link->mac_idx);
|
||||
rtw89_mac_set_csi_para_reg_be(rtwdev, rtwvif_link, rtwsta_link);
|
||||
rtw89_mac_csi_rrsc_be(rtwdev, rtwvif_link, rtwsta_link);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2564,6 +2597,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
|
||||
|
||||
.typ_fltr_opt = rtw89_mac_typ_fltr_opt_be,
|
||||
.cfg_ppdu_status = rtw89_mac_cfg_ppdu_status_be,
|
||||
.cfg_phy_rpt = rtw89_mac_cfg_phy_rpt_be,
|
||||
|
||||
.dle_mix_cfg = dle_mix_cfg_be,
|
||||
.chk_dle_rdy = chk_dle_rdy_be,
|
||||
@ -2581,9 +2615,11 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
|
||||
.fwdl_enable_wcpu = rtw89_mac_fwdl_enable_wcpu_be,
|
||||
.fwdl_get_status = fwdl_get_status_be,
|
||||
.fwdl_check_path_ready = rtw89_fwdl_check_path_ready_be,
|
||||
.fwdl_secure_idmem_share_mode = NULL,
|
||||
.parse_efuse_map = rtw89_parse_efuse_map_be,
|
||||
.parse_phycap_map = rtw89_parse_phycap_map_be,
|
||||
.cnv_efuse_state = rtw89_cnv_efuse_state_be,
|
||||
.efuse_read_fw_secure = rtw89_efuse_read_fw_secure_be,
|
||||
|
||||
.cfg_plt = rtw89_mac_cfg_plt_be,
|
||||
.get_plt_cnt = rtw89_mac_get_plt_cnt_be,
|
||||
@ -2599,6 +2635,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
|
||||
.is_txq_empty = mac_is_txq_empty_be,
|
||||
|
||||
.add_chan_list = rtw89_hw_scan_add_chan_list_be,
|
||||
.add_chan_list_pno = rtw89_pno_scan_add_chan_list_be,
|
||||
.scan_offload = rtw89_fw_h2c_scan_offload_be,
|
||||
|
||||
.wow_config_mac = rtw89_wow_config_mac_be,
|
||||
|
||||
@ -328,10 +328,11 @@ static u32 rtw89_pci_get_rx_skb_idx(struct rtw89_dev *rtwdev,
|
||||
static u32 rtw89_pci_rxbd_deliver_skbs(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_pci_rx_ring *rx_ring)
|
||||
{
|
||||
struct rtw89_pci_dma_ring *bd_ring = &rx_ring->bd_ring;
|
||||
struct rtw89_pci_rx_info *rx_info;
|
||||
struct rtw89_rx_desc_info *desc_info = &rx_ring->diliver_desc;
|
||||
struct rtw89_pci_dma_ring *bd_ring = &rx_ring->bd_ring;
|
||||
const struct rtw89_pci_info *info = rtwdev->pci_info;
|
||||
struct sk_buff *new = rx_ring->diliver_skb;
|
||||
struct rtw89_pci_rx_info *rx_info;
|
||||
struct sk_buff *skb;
|
||||
u32 rxinfo_size = sizeof(struct rtw89_pci_rxbd_info);
|
||||
u32 skb_idx;
|
||||
@ -351,9 +352,14 @@ static u32 rtw89_pci_rxbd_deliver_skbs(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
rx_info = RTW89_PCI_RX_SKB_CB(skb);
|
||||
fs = rx_info->fs;
|
||||
fs = info->no_rxbd_fs ? !new : rx_info->fs;
|
||||
ls = rx_info->ls;
|
||||
|
||||
if (unlikely(!fs || !ls))
|
||||
rtw89_debug(rtwdev, RTW89_DBG_UNEXP,
|
||||
"unexpected fs/ls=%d/%d tag=%u len=%u new->len=%u\n",
|
||||
fs, ls, rx_info->tag, rx_info->len, new ? new->len : 0);
|
||||
|
||||
if (fs) {
|
||||
if (new) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_UNEXP,
|
||||
@ -2430,13 +2436,15 @@ static int rtw89_pci_deglitch_setting(struct rtw89_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rtw89_pci_disable_eq(struct rtw89_dev *rtwdev)
|
||||
static void rtw89_pci_disable_eq_ax(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u16 g1_oobs, g2_oobs;
|
||||
u32 backup_aspm;
|
||||
u32 phy_offset;
|
||||
u16 offset_cal;
|
||||
u16 oobs_val;
|
||||
int ret;
|
||||
u8 gen;
|
||||
|
||||
if (rtwdev->chip->chip_id != RTL8852C)
|
||||
return;
|
||||
@ -2472,6 +2480,28 @@ static void rtw89_pci_disable_eq(struct rtw89_dev *rtwdev)
|
||||
rtw89_write16_set(rtwdev, R_RAC_DIRECT_OFFSET_G2 + RAC_ANA09 * RAC_MULT,
|
||||
BAC_OOBS_SEL);
|
||||
|
||||
/* offset K */
|
||||
for (gen = 1; gen <= 2; gen++) {
|
||||
phy_offset = gen == 1 ? R_RAC_DIRECT_OFFSET_G1 :
|
||||
R_RAC_DIRECT_OFFSET_G2;
|
||||
|
||||
rtw89_write16_clr(rtwdev, phy_offset + RAC_ANA19 * RAC_MULT,
|
||||
B_PCIE_BIT_RD_SEL);
|
||||
}
|
||||
|
||||
offset_cal = rtw89_read16_mask(rtwdev, R_RAC_DIRECT_OFFSET_G1 +
|
||||
RAC_ANA1F * RAC_MULT, OFFSET_CAL_MASK);
|
||||
|
||||
for (gen = 1; gen <= 2; gen++) {
|
||||
phy_offset = gen == 1 ? R_RAC_DIRECT_OFFSET_G1 :
|
||||
R_RAC_DIRECT_OFFSET_G2;
|
||||
|
||||
rtw89_write16_mask(rtwdev, phy_offset + RAC_ANA0B * RAC_MULT,
|
||||
MANUAL_LVL_MASK, offset_cal);
|
||||
rtw89_write16_clr(rtwdev, phy_offset + RAC_ANA0D * RAC_MULT,
|
||||
OFFSET_CAL_MODE);
|
||||
}
|
||||
|
||||
out:
|
||||
rtw89_write32(rtwdev, R_AX_PCIE_MIX_CFG_V1, backup_aspm);
|
||||
}
|
||||
@ -2564,7 +2594,7 @@ static int rtw89_pci_dphy_delay(struct rtw89_dev *rtwdev)
|
||||
PCIE_DPHY_DLY_25US, PCIE_PHY_GEN1);
|
||||
}
|
||||
|
||||
static void rtw89_pci_power_wake(struct rtw89_dev *rtwdev, bool pwr_up)
|
||||
static void rtw89_pci_power_wake_ax(struct rtw89_dev *rtwdev, bool pwr_up)
|
||||
{
|
||||
if (pwr_up)
|
||||
rtw89_write32_set(rtwdev, R_AX_HCI_OPT_CTRL, BIT_WAKE_CTRL);
|
||||
@ -2719,9 +2749,10 @@ static void rtw89_pci_clr_idx_all_ax(struct rtw89_dev *rtwdev)
|
||||
static int rtw89_pci_poll_txdma_ch_idle_ax(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_pci_info *info = rtwdev->pci_info;
|
||||
u32 ret, check, dma_busy;
|
||||
u32 dma_busy1 = info->dma_busy1.addr;
|
||||
u32 dma_busy2 = info->dma_busy2_reg;
|
||||
u32 check, dma_busy;
|
||||
int ret;
|
||||
|
||||
check = info->dma_busy1.mask;
|
||||
|
||||
@ -2746,8 +2777,9 @@ static int rtw89_pci_poll_txdma_ch_idle_ax(struct rtw89_dev *rtwdev)
|
||||
static int rtw89_pci_poll_rxdma_ch_idle_ax(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_pci_info *info = rtwdev->pci_info;
|
||||
u32 ret, check, dma_busy;
|
||||
u32 dma_busy3 = info->dma_busy3_reg;
|
||||
u32 check, dma_busy;
|
||||
int ret;
|
||||
|
||||
check = B_AX_RXQ_BUSY | B_AX_RPQ_BUSY;
|
||||
|
||||
@ -2871,6 +2903,8 @@ static int rtw89_pci_ops_deinit(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_pci_info *info = rtwdev->pci_info;
|
||||
|
||||
rtw89_pci_power_wake(rtwdev, false);
|
||||
|
||||
if (rtwdev->chip->chip_id == RTL8852A) {
|
||||
/* ltr sw trigger */
|
||||
rtw89_write32_set(rtwdev, R_AX_LTR_CTRL_0, B_AX_APP_LTR_IDLE);
|
||||
@ -2913,7 +2947,7 @@ static int rtw89_pci_ops_mac_pre_init_ax(struct rtw89_dev *rtwdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
rtw89_pci_power_wake(rtwdev, true);
|
||||
rtw89_pci_power_wake_ax(rtwdev, true);
|
||||
rtw89_pci_autoload_hang(rtwdev);
|
||||
rtw89_pci_l12_vmain(rtwdev);
|
||||
rtw89_pci_gen2_force_ib(rtwdev);
|
||||
@ -2958,6 +2992,13 @@ static int rtw89_pci_ops_mac_pre_init_ax(struct rtw89_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_pci_ops_mac_pre_deinit_ax(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
rtw89_pci_power_wake_ax(rtwdev, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtw89_pci_ltr_set(struct rtw89_dev *rtwdev, bool en)
|
||||
{
|
||||
u32 val;
|
||||
@ -3098,23 +3139,53 @@ static void rtw89_pci_declaim_device(struct rtw89_dev *rtwdev,
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
static void rtw89_pci_cfg_dac(struct rtw89_dev *rtwdev)
|
||||
static bool rtw89_pci_chip_is_manual_dac(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv;
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (!rtwpci->enable_dac)
|
||||
return;
|
||||
|
||||
switch (chip->chip_id) {
|
||||
case RTL8852A:
|
||||
case RTL8852B:
|
||||
case RTL8851B:
|
||||
case RTL8852BT:
|
||||
break;
|
||||
return true;
|
||||
default:
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static bool rtw89_pci_is_dac_compatible_bridge(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv;
|
||||
struct pci_dev *bridge = pci_upstream_bridge(rtwpci->pdev);
|
||||
|
||||
if (!rtw89_pci_chip_is_manual_dac(rtwdev))
|
||||
return true;
|
||||
|
||||
if (!bridge)
|
||||
return false;
|
||||
|
||||
switch (bridge->vendor) {
|
||||
case PCI_VENDOR_ID_INTEL:
|
||||
return true;
|
||||
case PCI_VENDOR_ID_ASMEDIA:
|
||||
if (bridge->device == 0x2806)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void rtw89_pci_cfg_dac(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv;
|
||||
|
||||
if (!rtwpci->enable_dac)
|
||||
return;
|
||||
|
||||
if (!rtw89_pci_chip_is_manual_dac(rtwdev))
|
||||
return;
|
||||
|
||||
rtw89_pci_config_byte_set(rtwdev, RTW89_PCIE_L1_CTRL, RTW89_PCIE_BIT_EN_64BITS);
|
||||
}
|
||||
@ -3133,6 +3204,9 @@ static int rtw89_pci_setup_mapping(struct rtw89_dev *rtwdev,
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!rtw89_pci_is_dac_compatible_bridge(rtwdev))
|
||||
goto no_dac;
|
||||
|
||||
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(36));
|
||||
if (!ret) {
|
||||
rtwpci->enable_dac = true;
|
||||
@ -3145,6 +3219,7 @@ static int rtw89_pci_setup_mapping(struct rtw89_dev *rtwdev,
|
||||
goto err_release_regions;
|
||||
}
|
||||
}
|
||||
no_dac:
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
linuxkpi_pcim_want_to_use_bus_functions(pdev);
|
||||
@ -3807,19 +3882,16 @@ static void rtw89_pci_free_irq(struct rtw89_dev *rtwdev,
|
||||
pci_free_irq_vectors(pdev);
|
||||
}
|
||||
|
||||
static u16 gray_code_to_bin(u16 gray_code, u32 bit_num)
|
||||
static u16 gray_code_to_bin(u16 gray_code)
|
||||
{
|
||||
u16 bin = 0, gray_bit;
|
||||
u32 bit_idx;
|
||||
u16 binary = gray_code;
|
||||
|
||||
for (bit_idx = 0; bit_idx < bit_num; bit_idx++) {
|
||||
gray_bit = (gray_code >> bit_idx) & 0x1;
|
||||
if (bit_num - bit_idx > 1)
|
||||
gray_bit ^= (gray_code >> (bit_idx + 1)) & 0x1;
|
||||
bin |= (gray_bit << bit_idx);
|
||||
while (gray_code) {
|
||||
gray_code >>= 1;
|
||||
binary ^= gray_code;
|
||||
}
|
||||
|
||||
return bin;
|
||||
return binary;
|
||||
}
|
||||
|
||||
static int rtw89_pci_filter_out(struct rtw89_dev *rtwdev)
|
||||
@ -3855,7 +3927,7 @@ static int rtw89_pci_filter_out(struct rtw89_dev *rtwdev)
|
||||
val16 = rtw89_read16_mask(rtwdev,
|
||||
phy_offset + RAC_ANA1F * RAC_MULT,
|
||||
FILTER_OUT_EQ_MASK);
|
||||
val16 = gray_code_to_bin(val16, hweight16(val16));
|
||||
val16 = gray_code_to_bin(val16);
|
||||
filter_out_val = rtw89_read16(rtwdev, phy_offset + RAC_ANA24 *
|
||||
RAC_MULT);
|
||||
filter_out_val &= ~REG_FILTER_OUT_MASK;
|
||||
@ -4095,6 +4167,15 @@ static void rtw89_pci_l1ss_cfg(struct rtw89_dev *rtwdev)
|
||||
rtw89_pci_l1ss_set(rtwdev, true);
|
||||
}
|
||||
|
||||
static void rtw89_pci_cpl_timeout_cfg(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv;
|
||||
struct pci_dev *pdev = rtwpci->pdev;
|
||||
|
||||
pcie_capability_set_word(pdev, PCI_EXP_DEVCTL2,
|
||||
PCI_EXP_DEVCTL2_COMP_TMOUT_DIS);
|
||||
}
|
||||
|
||||
static int rtw89_pci_poll_io_idle_ax(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
int ret = 0;
|
||||
@ -4237,6 +4318,36 @@ static int rtw89_pci_napi_poll(struct napi_struct *napi, int budget)
|
||||
return work_done;
|
||||
}
|
||||
|
||||
static
|
||||
void rtw89_check_pci_ssid_quirks(struct rtw89_dev *rtwdev,
|
||||
struct pci_dev *pdev,
|
||||
const struct rtw89_pci_ssid_quirk *ssid_quirks)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!ssid_quirks)
|
||||
return;
|
||||
|
||||
for (i = 0; i < 200; i++, ssid_quirks++) {
|
||||
if (ssid_quirks->vendor == 0 && ssid_quirks->device == 0)
|
||||
break;
|
||||
|
||||
if (ssid_quirks->vendor != pdev->vendor ||
|
||||
ssid_quirks->device != pdev->device ||
|
||||
ssid_quirks->subsystem_vendor != pdev->subsystem_vendor ||
|
||||
ssid_quirks->subsystem_device != pdev->subsystem_device)
|
||||
continue;
|
||||
|
||||
bitmap_or(rtwdev->quirks, rtwdev->quirks, &ssid_quirks->bitmap,
|
||||
NUM_OF_RTW89_QUIRKS);
|
||||
rtwdev->custid = ssid_quirks->custid;
|
||||
break;
|
||||
}
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_HCI, "quirks=%*ph custid=%d\n",
|
||||
(int)sizeof(rtwdev->quirks), rtwdev->quirks, rtwdev->custid);
|
||||
}
|
||||
|
||||
static int __maybe_unused rtw89_pci_suspend(struct device *dev)
|
||||
{
|
||||
struct ieee80211_hw *hw = dev_get_drvdata(dev);
|
||||
@ -4271,6 +4382,18 @@ static void rtw89_pci_l2_hci_ldo(struct rtw89_dev *rtwdev)
|
||||
RTW89_PCIE_BIT_CFG_RST_MSTATE);
|
||||
}
|
||||
|
||||
void rtw89_pci_basic_cfg(struct rtw89_dev *rtwdev, bool resume)
|
||||
{
|
||||
if (resume)
|
||||
rtw89_pci_cfg_dac(rtwdev);
|
||||
|
||||
rtw89_pci_disable_eq(rtwdev);
|
||||
rtw89_pci_filter_out(rtwdev);
|
||||
rtw89_pci_cpl_timeout_cfg(rtwdev);
|
||||
rtw89_pci_link_cfg(rtwdev);
|
||||
rtw89_pci_l1ss_cfg(rtwdev);
|
||||
}
|
||||
|
||||
static int __maybe_unused rtw89_pci_resume(struct device *dev)
|
||||
{
|
||||
struct ieee80211_hw *hw = dev_get_drvdata(dev);
|
||||
@ -4292,11 +4415,8 @@ static int __maybe_unused rtw89_pci_resume(struct device *dev)
|
||||
B_AX_SEL_REQ_ENTR_L1);
|
||||
}
|
||||
rtw89_pci_l2_hci_ldo(rtwdev);
|
||||
rtw89_pci_disable_eq(rtwdev);
|
||||
rtw89_pci_cfg_dac(rtwdev);
|
||||
rtw89_pci_filter_out(rtwdev);
|
||||
rtw89_pci_link_cfg(rtwdev);
|
||||
rtw89_pci_l1ss_cfg(rtwdev);
|
||||
|
||||
rtw89_pci_basic_cfg(rtwdev, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -4313,7 +4433,7 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = {
|
||||
B_AX_RDU_INT},
|
||||
|
||||
.mac_pre_init = rtw89_pci_ops_mac_pre_init_ax,
|
||||
.mac_pre_deinit = NULL,
|
||||
.mac_pre_deinit = rtw89_pci_ops_mac_pre_deinit_ax,
|
||||
.mac_post_init = rtw89_pci_ops_mac_post_init_ax,
|
||||
|
||||
.clr_idx_all = rtw89_pci_clr_idx_all_ax,
|
||||
@ -4329,6 +4449,9 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = {
|
||||
.aspm_set = rtw89_pci_aspm_set_ax,
|
||||
.clkreq_set = rtw89_pci_clkreq_set_ax,
|
||||
.l1ss_set = rtw89_pci_l1ss_set_ax,
|
||||
|
||||
.disable_eq = rtw89_pci_disable_eq_ax,
|
||||
.power_wake = rtw89_pci_power_wake_ax,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw89_pci_gen_ax);
|
||||
|
||||
@ -4386,7 +4509,7 @@ int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
rtwdev = rtw89_alloc_ieee80211_hw(&pdev->dev,
|
||||
sizeof(struct rtw89_pci),
|
||||
info->chip);
|
||||
info->chip, info->variant);
|
||||
if (!rtwdev) {
|
||||
dev_err(&pdev->dev, "failed to allocate hw\n");
|
||||
return -ENOMEM;
|
||||
@ -4401,6 +4524,7 @@ int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
rtwdev->hci.cpwm_addr = pci_info->cpwm_addr;
|
||||
|
||||
rtw89_check_quirks(rtwdev, info->quirks);
|
||||
rtw89_check_pci_ssid_quirks(rtwdev, pdev, pci_info->ssid_quirks);
|
||||
|
||||
SET_IEEE80211_DEV(rtwdev->hw, &pdev->dev);
|
||||
|
||||
@ -4428,10 +4552,7 @@ int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
goto err_clear_resource;
|
||||
}
|
||||
|
||||
rtw89_pci_disable_eq(rtwdev);
|
||||
rtw89_pci_filter_out(rtwdev);
|
||||
rtw89_pci_link_cfg(rtwdev);
|
||||
rtw89_pci_l1ss_cfg(rtwdev);
|
||||
rtw89_pci_basic_cfg(rtwdev, false);
|
||||
|
||||
ret = rtw89_core_napi_init(rtwdev);
|
||||
if (ret) {
|
||||
|
||||
@ -18,11 +18,16 @@
|
||||
#define BAC_OOBS_SEL BIT(4)
|
||||
#define RAC_ANA0A 0x0A
|
||||
#define B_BAC_EQ_SEL BIT(5)
|
||||
#define RAC_ANA0B 0x0B
|
||||
#define MANUAL_LVL_MASK GENMASK(8, 5)
|
||||
#define RAC_ANA0C 0x0C
|
||||
#define B_PCIE_BIT_PSAVE BIT(15)
|
||||
#define RAC_ANA0D 0x0D
|
||||
#define OFFSET_CAL_MODE BIT(13)
|
||||
#define BAC_RX_TEST_EN BIT(6)
|
||||
#define RAC_ANA10 0x10
|
||||
#define ADDR_SEL_MASK GENMASK(9, 4)
|
||||
#define ADDR_SEL_VAL 0x3C
|
||||
#define ADDR_SEL_PINOUT_DIS_VAL 0x3C4
|
||||
#define B_PCIE_BIT_PINOUT_DIS BIT(3)
|
||||
#define RAC_REG_REV2 0x1B
|
||||
@ -38,6 +43,7 @@
|
||||
#define RAC_ANA1E_G2_VAL 0x6EEA
|
||||
#define RAC_ANA1F 0x1F
|
||||
#define OOBS_LEVEL_MASK GENMASK(12, 8)
|
||||
#define OFFSET_CAL_MASK GENMASK(7, 4)
|
||||
#define RAC_ANA24 0x24
|
||||
#define B_AX_DEGLITCH GENMASK(11, 8)
|
||||
#define RAC_ANA26 0x26
|
||||
@ -134,6 +140,11 @@
|
||||
#define REG_FILTER_OUT_MASK GENMASK(6, 2)
|
||||
#define RAC_MULT 2
|
||||
|
||||
#define R_RAC_DIRECT_OFFSET_BE_LANE0_G1 0x3800
|
||||
#define R_RAC_DIRECT_OFFSET_BE_LANE1_G1 0x3880
|
||||
#define R_RAC_DIRECT_OFFSET_BE_LANE0_G2 0x3900
|
||||
#define R_RAC_DIRECT_OFFSET_BE_LANE1_G2 0x3980
|
||||
|
||||
#define RTW89_PCI_WR_RETRY_CNT 20
|
||||
|
||||
/* Interrupts */
|
||||
@ -299,6 +310,7 @@
|
||||
#define B_BE_L1SS_TIMEOUT_CTRL BIT(18)
|
||||
#define B_BE_ASPM_CTRL_L1 BIT(17)
|
||||
#define B_BE_ASPM_CTRL_L0 BIT(16)
|
||||
#define B_BE_RTK_ASPM_CTRL_MASK GENMASK(17, 16)
|
||||
#define B_BE_XFER_PENDING_FW BIT(11)
|
||||
#define B_BE_XFER_PENDING BIT(10)
|
||||
#define B_BE_REQ_EXIT_L1 BIT(9)
|
||||
@ -1039,7 +1051,8 @@
|
||||
#define RTW89_PCI_TXWD_NUM_MAX 512
|
||||
#define RTW89_PCI_TXWD_PAGE_SIZE 128
|
||||
#define RTW89_PCI_ADDRINFO_MAX 4
|
||||
#define RTW89_PCI_RX_BUF_SIZE (11454 + 40) /* +40 for rtw89_rxdesc_long_v2 */
|
||||
/* +40 for rtw89_rxdesc_long_v2; +4 for rtw89_pci_rxbd_info */
|
||||
#define RTW89_PCI_RX_BUF_SIZE (11454 + 40 + 4)
|
||||
|
||||
#define RTW89_PCI_POLL_BDRAM_RST_CNT 100
|
||||
#define RTW89_PCI_MULTITAG 8
|
||||
@ -1276,6 +1289,22 @@ struct rtw89_pci_gen_def {
|
||||
void (*aspm_set)(struct rtw89_dev *rtwdev, bool enable);
|
||||
void (*clkreq_set)(struct rtw89_dev *rtwdev, bool enable);
|
||||
void (*l1ss_set)(struct rtw89_dev *rtwdev, bool enable);
|
||||
|
||||
void (*disable_eq)(struct rtw89_dev *rtwdev);
|
||||
void (*power_wake)(struct rtw89_dev *rtwdev, bool pwr_up);
|
||||
};
|
||||
|
||||
#define RTW89_PCI_SSID(v, d, ssv, ssd, cust) \
|
||||
.vendor = v, .device = d, .subsystem_vendor = ssv, .subsystem_device = ssd, \
|
||||
.custid = RTW89_CUSTID_ ##cust
|
||||
|
||||
struct rtw89_pci_ssid_quirk {
|
||||
unsigned short vendor;
|
||||
unsigned short device;
|
||||
unsigned short subsystem_vendor;
|
||||
unsigned short subsystem_device;
|
||||
enum rtw89_custid custid;
|
||||
unsigned long bitmap; /* bitmap of rtw89_quirks */
|
||||
};
|
||||
|
||||
struct rtw89_pci_info {
|
||||
@ -1296,6 +1325,7 @@ struct rtw89_pci_info {
|
||||
enum mac_ax_io_rcy_tmr io_rcy_tmr;
|
||||
bool rx_ring_eq_is_full;
|
||||
bool check_rx_tag;
|
||||
bool no_rxbd_fs;
|
||||
|
||||
u32 init_cfg_reg;
|
||||
u32 txhci_en_bit;
|
||||
@ -1331,6 +1361,8 @@ struct rtw89_pci_info {
|
||||
void (*recognize_intrs)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_pci *rtwpci,
|
||||
struct rtw89_pci_isrs *isrs);
|
||||
|
||||
const struct rtw89_pci_ssid_quirk *ssid_quirks;
|
||||
};
|
||||
|
||||
struct rtw89_pci_tx_data {
|
||||
@ -1600,6 +1632,7 @@ struct pci_device_id;
|
||||
|
||||
int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id);
|
||||
void rtw89_pci_remove(struct pci_dev *pdev);
|
||||
void rtw89_pci_basic_cfg(struct rtw89_dev *rtwdev, bool resume);
|
||||
void rtw89_pci_ops_reset(struct rtw89_dev *rtwdev);
|
||||
int rtw89_pci_ltr_set(struct rtw89_dev *rtwdev, bool en);
|
||||
int rtw89_pci_ltr_set_v1(struct rtw89_dev *rtwdev, bool en);
|
||||
@ -1766,4 +1799,21 @@ static inline int rtw89_pci_poll_txdma_ch_idle(struct rtw89_dev *rtwdev)
|
||||
|
||||
return gen_def->poll_txdma_ch_idle(rtwdev);
|
||||
}
|
||||
|
||||
static inline void rtw89_pci_disable_eq(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_pci_info *info = rtwdev->pci_info;
|
||||
const struct rtw89_pci_gen_def *gen_def = info->gen_def;
|
||||
|
||||
gen_def->disable_eq(rtwdev);
|
||||
}
|
||||
|
||||
static inline void rtw89_pci_power_wake(struct rtw89_dev *rtwdev, bool pwr_up)
|
||||
{
|
||||
const struct rtw89_pci_info *info = rtwdev->pci_info;
|
||||
const struct rtw89_pci_gen_def *gen_def = info->gen_def;
|
||||
|
||||
gen_def->power_wake(rtwdev, pwr_up);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@ -550,6 +550,79 @@ static int rtw89_pci_lv1rst_start_dma_be(struct rtw89_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rtw89_pci_disable_eq_be(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 backup_aspm, phy_offset;
|
||||
u16 oobs_val, offset_cal;
|
||||
u16 g1_oobs, g2_oobs;
|
||||
u8 gen;
|
||||
|
||||
if (rtwdev->chip->chip_id != RTL8922A)
|
||||
return;
|
||||
|
||||
g1_oobs = rtw89_read16_mask(rtwdev, R_RAC_DIRECT_OFFSET_BE_LANE0_G1 +
|
||||
RAC_ANA09 * RAC_MULT, BAC_OOBS_SEL);
|
||||
g2_oobs = rtw89_read16_mask(rtwdev, R_RAC_DIRECT_OFFSET_BE_LANE0_G2 +
|
||||
RAC_ANA09 * RAC_MULT, BAC_OOBS_SEL);
|
||||
if (g1_oobs && g2_oobs)
|
||||
return;
|
||||
|
||||
backup_aspm = rtw89_read32(rtwdev, R_BE_PCIE_MIX_CFG);
|
||||
rtw89_write32_clr(rtwdev, R_BE_PCIE_MIX_CFG, B_BE_RTK_ASPM_CTRL_MASK);
|
||||
|
||||
/* offset K */
|
||||
for (gen = 1; gen <= 2; gen++) {
|
||||
phy_offset = gen == 1 ? R_RAC_DIRECT_OFFSET_BE_LANE0_G1 :
|
||||
R_RAC_DIRECT_OFFSET_BE_LANE0_G2;
|
||||
|
||||
rtw89_write16_clr(rtwdev, phy_offset + RAC_ANA19 * RAC_MULT,
|
||||
B_PCIE_BIT_RD_SEL);
|
||||
}
|
||||
|
||||
offset_cal = rtw89_read16_mask(rtwdev, R_RAC_DIRECT_OFFSET_BE_LANE0_G1 +
|
||||
RAC_ANA1F * RAC_MULT, OFFSET_CAL_MASK);
|
||||
|
||||
for (gen = 1; gen <= 2; gen++) {
|
||||
phy_offset = gen == 1 ? R_RAC_DIRECT_OFFSET_BE_LANE0_G1 :
|
||||
R_RAC_DIRECT_OFFSET_BE_LANE0_G2;
|
||||
|
||||
rtw89_write16_mask(rtwdev, phy_offset + RAC_ANA0B * RAC_MULT,
|
||||
MANUAL_LVL_MASK, offset_cal);
|
||||
rtw89_write16_clr(rtwdev, phy_offset + RAC_ANA0D * RAC_MULT,
|
||||
OFFSET_CAL_MODE);
|
||||
}
|
||||
|
||||
/* OOBS */
|
||||
for (gen = 1; gen <= 2; gen++) {
|
||||
phy_offset = gen == 1 ? R_RAC_DIRECT_OFFSET_BE_LANE0_G1 :
|
||||
R_RAC_DIRECT_OFFSET_BE_LANE0_G2;
|
||||
|
||||
rtw89_write16_set(rtwdev, phy_offset + RAC_ANA0D * RAC_MULT,
|
||||
BAC_RX_TEST_EN);
|
||||
rtw89_write16_mask(rtwdev, phy_offset + RAC_ANA10 * RAC_MULT,
|
||||
ADDR_SEL_MASK, ADDR_SEL_VAL);
|
||||
rtw89_write16_clr(rtwdev, phy_offset + RAC_ANA10 * RAC_MULT,
|
||||
B_PCIE_BIT_PINOUT_DIS);
|
||||
rtw89_write16_set(rtwdev, phy_offset + RAC_ANA19 * RAC_MULT,
|
||||
B_PCIE_BIT_RD_SEL);
|
||||
}
|
||||
|
||||
oobs_val = rtw89_read16_mask(rtwdev, R_RAC_DIRECT_OFFSET_BE_LANE0_G1 +
|
||||
RAC_ANA1F * RAC_MULT, OOBS_LEVEL_MASK);
|
||||
|
||||
for (gen = 1; gen <= 2; gen++) {
|
||||
phy_offset = gen == 1 ? R_RAC_DIRECT_OFFSET_BE_LANE0_G1 :
|
||||
R_RAC_DIRECT_OFFSET_BE_LANE0_G2;
|
||||
|
||||
rtw89_write16_mask(rtwdev, phy_offset + RAC_ANA03 * RAC_MULT,
|
||||
OOBS_SEN_MASK, oobs_val);
|
||||
rtw89_write16_set(rtwdev, phy_offset + RAC_ANA09 * RAC_MULT,
|
||||
BAC_OOBS_SEL);
|
||||
}
|
||||
|
||||
rtw89_write32(rtwdev, R_BE_PCIE_MIX_CFG, backup_aspm);
|
||||
}
|
||||
|
||||
static int __maybe_unused rtw89_pci_suspend_be(struct device *dev)
|
||||
{
|
||||
struct ieee80211_hw *hw = dev_get_drvdata(dev);
|
||||
@ -584,6 +657,8 @@ static int __maybe_unused rtw89_pci_resume_be(struct device *dev)
|
||||
rtw89_write32_set(rtwdev, R_BE_SER_PL1_CTRL, B_BE_PL1_SER_PL1_EN);
|
||||
rtw89_write32_set(rtwdev, R_BE_REG_PL1_MASK, B_BE_SER_PM_MASTER_IMR);
|
||||
|
||||
rtw89_pci_basic_cfg(rtwdev, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -614,5 +689,8 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_be = {
|
||||
.aspm_set = rtw89_pci_aspm_set_be,
|
||||
.clkreq_set = rtw89_pci_clkreq_set_be,
|
||||
.l1ss_set = rtw89_pci_l1ss_set_be,
|
||||
|
||||
.disable_eq = rtw89_pci_disable_eq_be,
|
||||
.power_wake = _patch_pcie_power_wake_be,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw89_pci_gen_be);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -51,13 +51,17 @@
|
||||
#define RA_MASK_EHT_2SS_RATES GENMASK_ULL(43, 28)
|
||||
#define RA_MASK_EHT_3SS_RATES GENMASK_ULL(59, 44)
|
||||
#define RA_MASK_EHT_4SS_RATES GENMASK_ULL(62, 60)
|
||||
#define RA_MASK_EHT_1SS_MCS0_11 GENMASK_ULL(23, 12)
|
||||
#define RA_MASK_EHT_2SS_MCS0_11 GENMASK_ULL(39, 28)
|
||||
#define RA_MASK_EHT_3SS_MCS0_11 GENMASK_ULL(55, 44)
|
||||
#define RA_MASK_EHT_4SS_MCS0_11 GENMASK_ULL(62, 60)
|
||||
#define RA_MASK_EHT_RATES GENMASK_ULL(62, 12)
|
||||
|
||||
#define CFO_TRK_ENABLE_TH (2 << 2)
|
||||
#define CFO_TRK_STOP_TH_4 (30 << 2)
|
||||
#define CFO_TRK_STOP_TH_3 (20 << 2)
|
||||
#define CFO_TRK_STOP_TH_2 (10 << 2)
|
||||
#define CFO_TRK_STOP_TH_1 (00 << 2)
|
||||
#define CFO_TRK_STOP_TH_1 (03 << 2)
|
||||
#define CFO_TRK_STOP_TH (2 << 2)
|
||||
#define CFO_SW_COMP_FINE_TUNE (2 << 2)
|
||||
#define CFO_PERIOD_CNT 15
|
||||
@ -151,6 +155,7 @@ enum rtw89_phy_c2h_rfk_log_func {
|
||||
|
||||
enum rtw89_phy_c2h_rfk_report_func {
|
||||
RTW89_PHY_C2H_RFK_REPORT_FUNC_STATE = 0,
|
||||
RTW89_PHY_C2H_RFK_LOG_TAS_PWR = 6,
|
||||
};
|
||||
|
||||
enum rtw89_phy_c2h_dm_func {
|
||||
@ -813,8 +818,13 @@ void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_rf_path rf_path,
|
||||
void *extra_data);
|
||||
void rtw89_phy_dm_init(struct rtw89_dev *rtwdev);
|
||||
void rtw89_phy_dm_reinit(struct rtw89_dev *rtwdev);
|
||||
void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
|
||||
u32 data, enum rtw89_phy_idx phy_idx);
|
||||
void rtw89_phy_write32_idx_set(struct rtw89_dev *rtwdev, u32 addr, u32 bits,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
void rtw89_phy_write32_idx_clr(struct rtw89_dev *rtwdev, u32 addr, u32 bits,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
u32 rtw89_phy_read32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
s8 *rtw89_phy_raw_byr_seek(struct rtw89_dev *rtwdev,
|
||||
@ -822,6 +832,11 @@ s8 *rtw89_phy_raw_byr_seek(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_rate_desc *desc);
|
||||
s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev, u8 band, u8 bw,
|
||||
const struct rtw89_rate_desc *rate_desc);
|
||||
void rtw89_phy_ant_gain_init(struct rtw89_dev *rtwdev);
|
||||
s16 rtw89_phy_ant_gain_pwr_offset(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan);
|
||||
void rtw89_print_ant_gain(struct seq_file *m, struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan);
|
||||
void rtw89_phy_load_txpwr_byrate(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_txpwr_table *tbl);
|
||||
s8 rtw89_phy_read_txpwr_limit(struct rtw89_dev *rtwdev, u8 band,
|
||||
@ -892,10 +907,34 @@ void rtw89_phy_set_txpwr_limit_ru(struct rtw89_dev *rtwdev,
|
||||
phy->set_txpwr_limit_ru(rtwdev, chan, phy_idx);
|
||||
}
|
||||
|
||||
void rtw89_phy_ra_assoc(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta);
|
||||
static inline s8 rtw89_phy_txpwr_rf_to_bb(struct rtw89_dev *rtwdev, s8 txpwr_rf)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return txpwr_rf << (chip->txpwr_factor_bb - chip->txpwr_factor_rf);
|
||||
}
|
||||
|
||||
static inline s8 rtw89_phy_txpwr_rf_to_mac(struct rtw89_dev *rtwdev, s8 txpwr_rf)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return txpwr_rf >> (chip->txpwr_factor_rf - chip->txpwr_factor_mac);
|
||||
}
|
||||
|
||||
static inline s8 rtw89_phy_txpwr_dbm_to_mac(struct rtw89_dev *rtwdev, s8 dbm)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return clamp_t(s16, dbm << chip->txpwr_factor_mac, -64, 63);
|
||||
}
|
||||
|
||||
void rtw89_phy_ra_assoc(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_link);
|
||||
void rtw89_phy_ra_update(struct rtw89_dev *rtwdev);
|
||||
void rtw89_phy_ra_updata_sta(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
void rtw89_phy_ra_update_sta(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
u32 changed);
|
||||
void rtw89_phy_ra_update_sta_link(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_sta_link *rtwsta_link,
|
||||
u32 changed);
|
||||
void rtw89_phy_rate_pattern_vif(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif,
|
||||
const struct cfg80211_bitrate_mask *mask);
|
||||
@ -907,23 +946,29 @@ int rtw89_phy_rfk_pre_ntfy_and_wait(struct rtw89_dev *rtwdev,
|
||||
unsigned int ms);
|
||||
int rtw89_phy_rfk_tssi_and_wait(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_tssi_mode tssi_mode,
|
||||
unsigned int ms);
|
||||
int rtw89_phy_rfk_iqk_and_wait(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan,
|
||||
unsigned int ms);
|
||||
int rtw89_phy_rfk_dpk_and_wait(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan,
|
||||
unsigned int ms);
|
||||
int rtw89_phy_rfk_txgapk_and_wait(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan,
|
||||
unsigned int ms);
|
||||
int rtw89_phy_rfk_dack_and_wait(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan,
|
||||
unsigned int ms);
|
||||
int rtw89_phy_rfk_rxdck_and_wait(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
unsigned int ms);
|
||||
const struct rtw89_chan *chan,
|
||||
bool is_chl_k, unsigned int ms);
|
||||
void rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan,
|
||||
@ -947,11 +992,12 @@ void rtw89_phy_antdiv_parse(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_rx_phy_ppdu *phy_ppdu);
|
||||
void rtw89_phy_antdiv_track(struct rtw89_dev *rtwdev);
|
||||
void rtw89_phy_antdiv_work(struct work_struct *work);
|
||||
void rtw89_phy_set_bss_color(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif);
|
||||
void rtw89_phy_set_bss_color(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_phy_tssi_ctrl_set_bandedge_cfg(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_mac_idx mac_idx,
|
||||
enum rtw89_tssi_bandedge_cfg bandedge_cfg);
|
||||
void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void rtw89_phy_ul_tb_assoc(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_phy_ul_tb_ctrl_track(struct rtw89_dev *rtwdev);
|
||||
u8 rtw89_encode_chan_idx(struct rtw89_dev *rtwdev, u8 central_ch, u8 band);
|
||||
void rtw89_decode_chan_idx(struct rtw89_dev *rtwdev, u8 chan_idx,
|
||||
|
||||
@ -398,10 +398,9 @@ static void rtw89_phy_bb_wrap_ul_pwr(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw89_phy_bb_wrap_init_be(struct rtw89_dev *rtwdev)
|
||||
static void __rtw89_phy_bb_wrap_init_be(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_mac_idx mac_idx)
|
||||
{
|
||||
enum rtw89_mac_idx mac_idx = RTW89_MAC_0;
|
||||
|
||||
rtw89_phy_bb_wrap_pwr_by_macid_init(rtwdev);
|
||||
rtw89_phy_bb_wrap_tx_path_by_macid_init(rtwdev);
|
||||
rtw89_phy_bb_wrap_listen_path_en_init(rtwdev);
|
||||
@ -411,6 +410,13 @@ static void rtw89_phy_bb_wrap_init_be(struct rtw89_dev *rtwdev)
|
||||
rtw89_phy_bb_wrap_ul_pwr(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw89_phy_bb_wrap_init_be(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
__rtw89_phy_bb_wrap_init_be(rtwdev, RTW89_MAC_0);
|
||||
if (rtwdev->dbcc_en)
|
||||
__rtw89_phy_bb_wrap_init_be(rtwdev, RTW89_MAC_1);
|
||||
}
|
||||
|
||||
static void rtw89_phy_ch_info_init_be(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
rtw89_phy_write32_mask(rtwdev, R_CHINFO_SEG, B_CHINFO_SEG_LEN, 0x0);
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
#include "debug.h"
|
||||
#include "fw.h"
|
||||
#include "mac.h"
|
||||
#include "phy.h"
|
||||
#include "ps.h"
|
||||
#include "reg.h"
|
||||
#include "util.h"
|
||||
@ -62,11 +63,8 @@ static void rtw89_ps_power_mode_change(struct rtw89_dev *rtwdev, bool enter)
|
||||
rtw89_mac_power_mode_change(rtwdev, enter);
|
||||
}
|
||||
|
||||
void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
if (rtwvif->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT)
|
||||
return;
|
||||
|
||||
if (!rtwdev->ps_mode)
|
||||
return;
|
||||
|
||||
@ -85,23 +83,24 @@ void __rtw89_leave_ps_mode(struct rtw89_dev *rtwdev)
|
||||
rtw89_ps_power_mode_change(rtwdev, false);
|
||||
}
|
||||
|
||||
static void __rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void __rtw89_enter_lps_link(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_lps_parm lps_param = {
|
||||
.macid = rtwvif->mac_id,
|
||||
.macid = rtwvif_link->mac_id,
|
||||
.psmode = RTW89_MAC_AX_PS_MODE_LEGACY,
|
||||
.lastrpwm = RTW89_LAST_RPWM_PS,
|
||||
};
|
||||
|
||||
rtw89_btc_ntfy_radio_state(rtwdev, BTC_RFCTRL_FW_CTRL);
|
||||
rtw89_fw_h2c_lps_parm(rtwdev, &lps_param);
|
||||
rtw89_fw_h2c_lps_ch_info(rtwdev, rtwvif);
|
||||
}
|
||||
|
||||
static void __rtw89_leave_lps(struct rtw89_dev *rtwdev, u8 mac_id)
|
||||
static void __rtw89_leave_lps(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_lps_parm lps_param = {
|
||||
.macid = mac_id,
|
||||
.macid = rtwvif_link->mac_id,
|
||||
.psmode = RTW89_MAC_AX_PS_MODE_ACTIVE,
|
||||
.lastrpwm = RTW89_LAST_RPWM_ACTIVE,
|
||||
};
|
||||
@ -109,6 +108,7 @@ static void __rtw89_leave_lps(struct rtw89_dev *rtwdev, u8 mac_id)
|
||||
rtw89_fw_h2c_lps_parm(rtwdev, &lps_param);
|
||||
rtw89_fw_leave_lps_check(rtwdev, 0);
|
||||
rtw89_btc_ntfy_radio_state(rtwdev, BTC_RFCTRL_WL_ON);
|
||||
rtw89_chip_digital_pwr_comp(rtwdev, rtwvif_link->phy_idx);
|
||||
}
|
||||
|
||||
void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev)
|
||||
@ -121,28 +121,46 @@ void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev)
|
||||
void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool ps_mode)
|
||||
{
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
bool can_ps_mode = true;
|
||||
unsigned int link_id;
|
||||
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
if (test_and_set_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags))
|
||||
return;
|
||||
|
||||
__rtw89_enter_lps(rtwdev, rtwvif);
|
||||
if (ps_mode)
|
||||
__rtw89_enter_ps_mode(rtwdev, rtwvif);
|
||||
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) {
|
||||
__rtw89_enter_lps_link(rtwdev, rtwvif_link);
|
||||
|
||||
if (rtwvif_link->wifi_role == RTW89_WIFI_ROLE_P2P_CLIENT)
|
||||
can_ps_mode = false;
|
||||
}
|
||||
|
||||
if (RTW89_CHK_FW_FEATURE(LPS_CH_INFO, &rtwdev->fw))
|
||||
rtw89_fw_h2c_lps_ch_info(rtwdev, rtwvif);
|
||||
else
|
||||
rtw89_fw_h2c_lps_ml_cmn_info(rtwdev, rtwvif);
|
||||
|
||||
if (ps_mode && can_ps_mode)
|
||||
__rtw89_enter_ps_mode(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw89_leave_lps_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw89_leave_lps_vif(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION &&
|
||||
rtwvif->wifi_role != RTW89_WIFI_ROLE_P2P_CLIENT)
|
||||
if (rtwvif_link->wifi_role != RTW89_WIFI_ROLE_STATION &&
|
||||
rtwvif_link->wifi_role != RTW89_WIFI_ROLE_P2P_CLIENT)
|
||||
return;
|
||||
|
||||
__rtw89_leave_lps(rtwdev, rtwvif->mac_id);
|
||||
__rtw89_leave_lps(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
void rtw89_leave_lps(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_vif *rtwvif;
|
||||
unsigned int link_id;
|
||||
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
@ -151,13 +169,18 @@ void rtw89_leave_lps(struct rtw89_dev *rtwdev)
|
||||
|
||||
__rtw89_leave_ps_mode(rtwdev);
|
||||
|
||||
rtw89_phy_dm_reinit(rtwdev);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_leave_lps_vif(rtwdev, rtwvif);
|
||||
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id)
|
||||
rtw89_leave_lps_vif(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
void rtw89_enter_ips(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_vif *rtwvif;
|
||||
unsigned int link_id;
|
||||
|
||||
set_bit(RTW89_FLAG_INACTIVE_PS, rtwdev->flags);
|
||||
|
||||
@ -165,14 +188,17 @@ void rtw89_enter_ips(struct rtw89_dev *rtwdev)
|
||||
return;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_mac_vif_deinit(rtwdev, rtwvif);
|
||||
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id)
|
||||
rtw89_mac_vif_deinit(rtwdev, rtwvif_link);
|
||||
|
||||
rtw89_core_stop(rtwdev);
|
||||
}
|
||||
|
||||
void rtw89_leave_ips(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_vif *rtwvif;
|
||||
unsigned int link_id;
|
||||
int ret;
|
||||
|
||||
if (test_bit(RTW89_FLAG_POWERON, rtwdev->flags))
|
||||
@ -185,7 +211,8 @@ void rtw89_leave_ips(struct rtw89_dev *rtwdev)
|
||||
rtw89_set_channel(rtwdev);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_mac_vif_init(rtwdev, rtwvif);
|
||||
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id)
|
||||
rtw89_mac_vif_init(rtwdev, rtwvif_link);
|
||||
|
||||
clear_bit(RTW89_FLAG_INACTIVE_PS, rtwdev->flags);
|
||||
}
|
||||
@ -196,48 +223,50 @@ void rtw89_set_coex_ctrl_lps(struct rtw89_dev *rtwdev, bool btc_ctrl)
|
||||
rtw89_leave_lps(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw89_tsf32_toggle(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
static void rtw89_tsf32_toggle(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
enum rtw89_p2pps_action act)
|
||||
{
|
||||
if (act == RTW89_P2P_ACT_UPDATE || act == RTW89_P2P_ACT_REMOVE)
|
||||
return;
|
||||
|
||||
if (act == RTW89_P2P_ACT_INIT)
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, rtwvif, true);
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, rtwvif_link, true);
|
||||
else if (act == RTW89_P2P_ACT_TERMINATE)
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, rtwvif, false);
|
||||
rtw89_fw_h2c_tsf32_toggle(rtwdev, rtwvif_link, false);
|
||||
}
|
||||
|
||||
static void rtw89_p2p_disable_all_noa(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif)
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_bss_conf *bss_conf)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
enum rtw89_p2pps_action act;
|
||||
u8 noa_id;
|
||||
|
||||
if (rtwvif->last_noa_nr == 0)
|
||||
if (rtwvif_link->last_noa_nr == 0)
|
||||
return;
|
||||
|
||||
for (noa_id = 0; noa_id < rtwvif->last_noa_nr; noa_id++) {
|
||||
if (noa_id == rtwvif->last_noa_nr - 1)
|
||||
for (noa_id = 0; noa_id < rtwvif_link->last_noa_nr; noa_id++) {
|
||||
if (noa_id == rtwvif_link->last_noa_nr - 1)
|
||||
act = RTW89_P2P_ACT_TERMINATE;
|
||||
else
|
||||
act = RTW89_P2P_ACT_REMOVE;
|
||||
rtw89_tsf32_toggle(rtwdev, rtwvif, act);
|
||||
rtw89_fw_h2c_p2p_act(rtwdev, vif, NULL, act, noa_id);
|
||||
rtw89_tsf32_toggle(rtwdev, rtwvif_link, act);
|
||||
rtw89_fw_h2c_p2p_act(rtwdev, rtwvif_link, bss_conf,
|
||||
NULL, act, noa_id);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw89_p2p_update_noa(struct rtw89_dev *rtwdev,
|
||||
struct ieee80211_vif *vif)
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_bss_conf *bss_conf)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
|
||||
struct ieee80211_p2p_noa_desc *desc;
|
||||
enum rtw89_p2pps_action act;
|
||||
u8 noa_id;
|
||||
|
||||
for (noa_id = 0; noa_id < RTW89_P2P_MAX_NOA_NUM; noa_id++) {
|
||||
desc = &vif->bss_conf.p2p_noa_attr.desc[noa_id];
|
||||
desc = &bss_conf->p2p_noa_attr.desc[noa_id];
|
||||
if (!desc->count || !desc->duration)
|
||||
break;
|
||||
|
||||
@ -245,16 +274,19 @@ static void rtw89_p2p_update_noa(struct rtw89_dev *rtwdev,
|
||||
act = RTW89_P2P_ACT_INIT;
|
||||
else
|
||||
act = RTW89_P2P_ACT_UPDATE;
|
||||
rtw89_tsf32_toggle(rtwdev, rtwvif, act);
|
||||
rtw89_fw_h2c_p2p_act(rtwdev, vif, desc, act, noa_id);
|
||||
rtw89_tsf32_toggle(rtwdev, rtwvif_link, act);
|
||||
rtw89_fw_h2c_p2p_act(rtwdev, rtwvif_link, bss_conf,
|
||||
desc, act, noa_id);
|
||||
}
|
||||
rtwvif->last_noa_nr = noa_id;
|
||||
rtwvif_link->last_noa_nr = noa_id;
|
||||
}
|
||||
|
||||
void rtw89_process_p2p_ps(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif)
|
||||
void rtw89_process_p2p_ps(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_bss_conf *bss_conf)
|
||||
{
|
||||
rtw89_p2p_disable_all_noa(rtwdev, vif);
|
||||
rtw89_p2p_update_noa(rtwdev, vif);
|
||||
rtw89_p2p_disable_all_noa(rtwdev, rtwvif_link, bss_conf);
|
||||
rtw89_p2p_update_noa(rtwdev, rtwvif_link, bss_conf);
|
||||
}
|
||||
|
||||
void rtw89_recalc_lps(struct rtw89_dev *rtwdev)
|
||||
@ -290,9 +322,9 @@ disable_lps:
|
||||
rtwdev->lps_enabled = false;
|
||||
}
|
||||
|
||||
void rtw89_p2p_noa_renew(struct rtw89_vif *rtwvif)
|
||||
void rtw89_p2p_noa_renew(struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif->p2p_noa;
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif_link->p2p_noa;
|
||||
struct rtw89_p2p_noa_ie *ie = &setter->ie;
|
||||
struct rtw89_p2p_ie_head *p2p_head = &ie->p2p_head;
|
||||
struct rtw89_noa_attr_head *noa_head = &ie->noa_head;
|
||||
@ -317,10 +349,10 @@ void rtw89_p2p_noa_renew(struct rtw89_vif *rtwvif)
|
||||
noa_head->oppps_ctwindow = 0;
|
||||
}
|
||||
|
||||
void rtw89_p2p_noa_append(struct rtw89_vif *rtwvif,
|
||||
void rtw89_p2p_noa_append(struct rtw89_vif_link *rtwvif_link,
|
||||
const struct ieee80211_p2p_noa_desc *desc)
|
||||
{
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif->p2p_noa;
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif_link->p2p_noa;
|
||||
struct rtw89_p2p_noa_ie *ie = &setter->ie;
|
||||
struct rtw89_p2p_ie_head *p2p_head = &ie->p2p_head;
|
||||
struct rtw89_noa_attr_head *noa_head = &ie->noa_head;
|
||||
@ -337,9 +369,9 @@ void rtw89_p2p_noa_append(struct rtw89_vif *rtwvif,
|
||||
ie->noa_desc[setter->noa_count++] = *desc;
|
||||
}
|
||||
|
||||
u8 rtw89_p2p_noa_fetch(struct rtw89_vif *rtwvif, void **data)
|
||||
u8 rtw89_p2p_noa_fetch(struct rtw89_vif_link *rtwvif_link, void **data)
|
||||
{
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif->p2p_noa;
|
||||
struct rtw89_p2p_noa_setter *setter = &rtwvif_link->p2p_noa;
|
||||
struct rtw89_p2p_noa_ie *ie = &setter->ie;
|
||||
#if defined(__linux__)
|
||||
void *tail;
|
||||
|
||||
@ -9,17 +9,19 @@ void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
bool ps_mode);
|
||||
void rtw89_leave_lps(struct rtw89_dev *rtwdev);
|
||||
void __rtw89_leave_ps_mode(struct rtw89_dev *rtwdev);
|
||||
void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
|
||||
void __rtw89_enter_ps_mode(struct rtw89_dev *rtwdev);
|
||||
void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev);
|
||||
void rtw89_enter_ips(struct rtw89_dev *rtwdev);
|
||||
void rtw89_leave_ips(struct rtw89_dev *rtwdev);
|
||||
void rtw89_set_coex_ctrl_lps(struct rtw89_dev *rtwdev, bool btc_ctrl);
|
||||
void rtw89_process_p2p_ps(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif);
|
||||
void rtw89_process_p2p_ps(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct ieee80211_bss_conf *bss_conf);
|
||||
void rtw89_recalc_lps(struct rtw89_dev *rtwdev);
|
||||
void rtw89_p2p_noa_renew(struct rtw89_vif *rtwvif);
|
||||
void rtw89_p2p_noa_append(struct rtw89_vif *rtwvif,
|
||||
void rtw89_p2p_noa_renew(struct rtw89_vif_link *rtwvif_link);
|
||||
void rtw89_p2p_noa_append(struct rtw89_vif_link *rtwvif_link,
|
||||
const struct ieee80211_p2p_noa_desc *desc);
|
||||
u8 rtw89_p2p_noa_fetch(struct rtw89_vif *rtwvif, void **data);
|
||||
u8 rtw89_p2p_noa_fetch(struct rtw89_vif_link *rtwvif_link, void **data);
|
||||
|
||||
static inline void rtw89_leave_ips_by_hwflags(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
|
||||
@ -107,6 +107,15 @@
|
||||
#define B_AX_DBG_SEL0_16BIT BIT(11)
|
||||
#define B_AX_DBG_SEL0 GENMASK(7, 0)
|
||||
|
||||
#define R_AX_GPIO_EXT_CTRL 0x0060
|
||||
#define B_AX_GPIO_MOD_15_TO_8_MASK GENMASK(31, 24)
|
||||
#define B_AX_GPIO_MOD_9 BIT(25)
|
||||
#define B_AX_GPIO_IO_SEL_15_TO_8_MASK GENMASK(23, 16)
|
||||
#define B_AX_GPIO_IO_SEL_9 BIT(17)
|
||||
#define B_AX_GPIO_OUT_15_TO_8_MASK GENMASK(15, 8)
|
||||
#define B_AX_GPIO_IN_15_TO_8_MASK GENMASK(7, 0)
|
||||
#define B_AX_GPIO_IN_9 BIT(1)
|
||||
|
||||
#define R_AX_SYS_SDIO_CTRL 0x0070
|
||||
#define B_AX_PCIE_DIS_L2_CTRL_LDO_HCI BIT(15)
|
||||
#define B_AX_PCIE_DIS_WLSUS_AFT_PDN BIT(14)
|
||||
@ -187,6 +196,8 @@
|
||||
#define R_AX_HALT_C2H 0x016C
|
||||
|
||||
#define R_AX_WCPU_FW_CTRL 0x01E0
|
||||
#define B_AX_IDMEM_SHARE_MODE_RECORD_MASK GENMASK(27, 24)
|
||||
#define B_AX_IDMEM_SHARE_MODE_RECORD_VALID BIT(23)
|
||||
#define B_AX_WCPU_FWDL_STS_MASK GENMASK(7, 5)
|
||||
#define B_AX_FWDL_PATH_RDY BIT(2)
|
||||
#define B_AX_H2C_PATH_RDY BIT(1)
|
||||
@ -267,6 +278,9 @@
|
||||
|
||||
#define R_AX_GPIO0_7_FUNC_SEL 0x02D0
|
||||
|
||||
#define R_AX_GPIO8_15_FUNC_SEL 0x02D4
|
||||
#define B_AX_PINMUX_GPIO9_FUNC_SEL_MASK GENMASK(7, 4)
|
||||
|
||||
#define R_AX_EECS_EESK_FUNC_SEL 0x02D8
|
||||
#define B_AX_PINMUX_EESK_FUNC_SEL_MASK GENMASK(7, 4)
|
||||
|
||||
@ -706,6 +720,14 @@
|
||||
B_AX_HDT_CHANNEL_DMA_ERR_INT_EN | \
|
||||
B_AX_HDT_TOTAL_LEN_ERR_INT_EN | \
|
||||
B_AX_HDT_DMA_PROCESS_ERR_INT_EN)
|
||||
#define B_AX_HOST_DISP_IMR_SET_V01 (B_AX_HDT_CHANNEL_DIFF_ERR_INT_EN | \
|
||||
B_AX_HDT_PAYLOAD_OVERFLOW_INT_EN | \
|
||||
B_AX_HDT_PAYLOAD_UNDERFLOW_INT_EN | \
|
||||
B_AX_HDT_CHANNEL_DMA_ERR_INT_EN | \
|
||||
B_AX_HDT_TOTAL_LEN_ERR_INT_EN | \
|
||||
B_AX_HDT_DMA_PROCESS_ERR_INT_EN | \
|
||||
B_AX_HDT_RX_WRITE_OVERFLOW_INT_EN | \
|
||||
B_AX_HDT_RX_WRITE_UNDERFLOW_INT_EN)
|
||||
|
||||
#define B_AX_HR_WRFF_UNDERFLOW_ERR_INT_EN BIT(31)
|
||||
#define B_AX_HR_WRFF_OVERFLOW_ERR_INT_EN BIT(30)
|
||||
@ -1096,6 +1118,7 @@
|
||||
#define B_AX_WDE_BUFMGN_FRZTMR_MODE BIT(0)
|
||||
|
||||
#define R_AX_WDE_ERR_IMR 0x8C38
|
||||
#define B_AX_WDE_DATCHN_UAPG_ERR_INT_EN BIT(30)
|
||||
#define B_AX_WDE_DATCHN_RRDY_ERR_INT_EN BIT(27)
|
||||
#define B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN BIT(26)
|
||||
#define B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN BIT(25)
|
||||
@ -1135,6 +1158,29 @@
|
||||
B_AX_WDE_DATCHN_ARBT_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN)
|
||||
#define B_AX_WDE_IMR_CLR_V01 (B_AX_WDE_BUFREQ_QTAID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_UNAVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_INVLD_PKTID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_SIZE_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_SRCHTAILPG_ERR_INT_EN | \
|
||||
B_AX_WDE_GETNPG_STRPG_ERR_INT_EN | \
|
||||
B_AX_WDE_GETNPG_PGOFST_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFMGN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_CMDTYPE_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_DSTQUEID_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_SRCQUEID_ERR_INT_EN | \
|
||||
B_AX_WDE_ENQ_PKTCNT_OVRF_ERR_INT_EN | \
|
||||
B_AX_WDE_ENQ_PKTCNT_NVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_PREPKTLLT_AD_ERR_INT_EN | \
|
||||
B_AX_WDE_NXTPKTLL_AD_ERR_INT_EN | \
|
||||
B_AX_WDE_QUEMGN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_ARBT_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_RRDY_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_ADRERR_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_CAMREQ_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_UAPG_ERR_INT_EN)
|
||||
#define B_AX_WDE_IMR_SET (B_AX_WDE_BUFREQ_QTAID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_UNAVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_INVLD_PKTID_ERR_INT_EN | \
|
||||
@ -1154,6 +1200,28 @@
|
||||
B_AX_WDE_DATCHN_ARBT_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN)
|
||||
#define B_AX_WDE_IMR_SET_V01 (B_AX_WDE_BUFREQ_QTAID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_UNAVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_INVLD_PKTID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_SIZE_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_SRCHTAILPG_ERR_INT_EN | \
|
||||
B_AX_WDE_GETNPG_STRPG_ERR_INT_EN | \
|
||||
B_AX_WDE_GETNPG_PGOFST_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFMGN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_CMDTYPE_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_DSTQUEID_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_SRCQUEID_ERR_INT_EN | \
|
||||
B_AX_WDE_ENQ_PKTCNT_OVRF_ERR_INT_EN | \
|
||||
B_AX_WDE_ENQ_PKTCNT_NVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_PREPKTLLT_AD_ERR_INT_EN | \
|
||||
B_AX_WDE_NXTPKTLL_AD_ERR_INT_EN | \
|
||||
B_AX_WDE_QUEMGN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_ARBT_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_RRDY_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_ADRERR_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_CAMREQ_ERR_INT_EN)
|
||||
|
||||
#define B_AX_WDE_DATCHN_CAMREQ_ERR_INT_EN BIT(29)
|
||||
#define B_AX_WDE_DATCHN_ADRERR_ERR_INT_EN BIT(28)
|
||||
@ -2440,6 +2508,10 @@
|
||||
#define B_AX_RTS_TXTIME_TH_MASK GENMASK(15, 8)
|
||||
#define B_AX_RTS_LEN_TH_MASK GENMASK(7, 0)
|
||||
|
||||
#define R_AX_AGG_LEN_VHT_0 0xC618
|
||||
#define R_AX_AGG_LEN_VHT_0_C1 0xE618
|
||||
#define B_AX_AMPDU_MAX_LEN_VHT_MASK GENMASK(19, 0)
|
||||
|
||||
#define S_AX_CTS2S_TH_SEC_256B 1
|
||||
#define R_AX_SIFS_SETTING 0xC624
|
||||
#define R_AX_SIFS_SETTING_C1 0xE624
|
||||
@ -3098,7 +3170,9 @@
|
||||
B_AX_OFDM_CCA_TIMEOUT_INT_EN | \
|
||||
B_AX_DATA_ON_TIMEOUT_INT_EN | \
|
||||
B_AX_STS_ON_TIMEOUT_INT_EN | \
|
||||
B_AX_CSI_ON_TIMEOUT_INT_EN)
|
||||
B_AX_CSI_ON_TIMEOUT_INT_EN | \
|
||||
B_AX_PHYINTF_TIMEOUT_THR_MSAK)
|
||||
#define B_AX_PHYINFO_IMR_SET (B_AX_PHY_TXON_TIMEOUT_INT_EN | 0x7)
|
||||
|
||||
#define R_AX_PHYINFO_ERR_ISR 0xCCFC
|
||||
#define R_AX_PHYINFO_ERR_ISR_C1 0xECFC
|
||||
@ -3854,6 +3928,15 @@
|
||||
#define R_BE_EFUSE_CTRL_1_V1 0x0034
|
||||
#define B_BE_EF_DATA_MASK GENMASK(31, 0)
|
||||
|
||||
#define R_BE_GPIO_EXT_CTRL 0x0060
|
||||
#define B_BE_GPIO_MOD_15_TO_8_MASK GENMASK(31, 24)
|
||||
#define B_BE_GPIO_MOD_9 BIT(25)
|
||||
#define B_BE_GPIO_IO_SEL_15_TO_8_MASK GENMASK(23, 16)
|
||||
#define B_BE_GPIO_IO_SEL_9 BIT(17)
|
||||
#define B_BE_GPIO_OUT_15_TO_8_MASK GENMASK(15, 8)
|
||||
#define B_BE_GPIO_IN_15_TO_8_MASK GENMASK(7, 0)
|
||||
#define B_BE_GPIO_IN_9 BIT(1)
|
||||
|
||||
#define R_BE_WL_BT_PWR_CTRL 0x0068
|
||||
#define B_BE_ISO_BD2PP BIT(31)
|
||||
#define B_BE_LDOV12B_EN BIT(30)
|
||||
@ -4299,6 +4382,9 @@
|
||||
#define B_BE_REG_CK40M_EN BIT(1)
|
||||
#define B_BE_REG_CK640M_EN BIT(0)
|
||||
|
||||
#define R_BE_GPIO8_15_FUNC_SEL 0x02D4
|
||||
#define B_BE_PINMUX_GPIO9_FUNC_SEL_MASK GENMASK(7, 4)
|
||||
|
||||
#define R_BE_WLAN_XTAL_SI_CTRL 0x0270
|
||||
#define B_BE_WL_XTAL_SI_CMD_POLL BIT(31)
|
||||
#define B_BE_WL_XTAL_SI_CHIPID_MASK GENMASK(30, 28)
|
||||
@ -5964,6 +6050,9 @@
|
||||
#define R_BE_WP_PAGE_INFO1 0xB7AC
|
||||
#define B_BE_WP_AVAL_PG_MASK GENMASK(28, 16)
|
||||
|
||||
#define R_BE_LTPC_T0_PATH0 0xBA28
|
||||
#define R_BE_LTPC_T0_PATH1 0xBB28
|
||||
|
||||
#define R_BE_CMAC_SHARE_FUNC_EN 0x0E000
|
||||
#define B_BE_CMAC_SHARE_CRPRT BIT(31)
|
||||
#define B_BE_CMAC_SHARE_EN BIT(30)
|
||||
@ -7358,6 +7447,10 @@
|
||||
#define B_BE_CSIPRT_HESU_AID_EN BIT(25)
|
||||
#define B_BE_CSIPRT_VHTSU_AID_EN BIT(24)
|
||||
|
||||
#define R_BE_DRV_INFO_OPTION 0x11470
|
||||
#define R_BE_DRV_INFO_OPTION_C1 0x15470
|
||||
#define B_BE_DRV_INFO_PHYRPT_EN BIT(0)
|
||||
|
||||
#define R_BE_RX_ERR_ISR 0x114F4
|
||||
#define R_BE_RX_ERR_ISR_C1 0x154F4
|
||||
#define B_BE_RX_ERR_TRIG_ACT_TO BIT(9)
|
||||
|
||||
@ -17,7 +17,7 @@ static const struct rtw89_regd rtw89_ww_regd =
|
||||
|
||||
static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("AR", RTW89_MEXICO, RTW89_MEXICO, RTW89_FCC),
|
||||
COUNTRY_REGD("BO", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("BO", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("BR", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("CL", RTW89_CHILE, RTW89_CHILE, RTW89_CHILE),
|
||||
COUNTRY_REGD("CO", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
@ -35,7 +35,7 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("UY", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("VE", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("PR", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("DO", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("DO", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("AT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("BE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("CY", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
@ -72,7 +72,7 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("BA", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("BG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("HR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("EG", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("EG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("GH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("IQ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("IL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
@ -82,13 +82,13 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("KW", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("KG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("LB", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("LS", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("LS", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("MK", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("MA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("MZ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("MZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("NA", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("NG", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("OM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("NG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("OM", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("QA", RTW89_QATAR, RTW89_QATAR, RTW89_QATAR),
|
||||
COUNTRY_REGD("RO", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("RU", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
@ -101,7 +101,7 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("UA", RTW89_UKRAINE, RTW89_UKRAINE, RTW89_UKRAINE),
|
||||
COUNTRY_REGD("AE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("YE", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("ZW", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("ZW", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("BD", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("KH", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("CN", RTW89_CN, RTW89_CN, RTW89_CN),
|
||||
@ -110,12 +110,12 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("ID", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("KR", RTW89_KCC, RTW89_KCC, RTW89_KCC),
|
||||
COUNTRY_REGD("MY", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("PK", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("PH", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("PK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("PH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("SG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("LK", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("TW", RTW89_FCC, RTW89_FCC, RTW89_ETSI),
|
||||
COUNTRY_REGD("TH", RTW89_ETSI, RTW89_ETSI, RTW89_THAILAND),
|
||||
COUNTRY_REGD("TH", RTW89_THAILAND, RTW89_THAILAND, RTW89_THAILAND),
|
||||
COUNTRY_REGD("VN", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("AU", RTW89_ACMA, RTW89_ACMA, RTW89_ACMA),
|
||||
COUNTRY_REGD("NZ", RTW89_ACMA, RTW89_ACMA, RTW89_ACMA),
|
||||
@ -158,9 +158,9 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("TD", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("CX", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
|
||||
COUNTRY_REGD("CC", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
|
||||
COUNTRY_REGD("KM", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("CG", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("CD", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("KM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("CG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("CD", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("CK", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("CI", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("DJ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
@ -176,12 +176,12 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("TF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("GA", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("GM", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("GE", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("GI", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("GE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("GI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("GL", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("GD", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("GP", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("GU", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("GU", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("GG", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("GN", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("GW", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
@ -194,19 +194,19 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("KI", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("XK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("LA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("LR", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("LR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("LY", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("MO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("MG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("MW", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("MV", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("ML", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("MH", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("MH", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("MQ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("MR", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("MU", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("YT", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("FM", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("FM", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("MD", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("MN", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("MS", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
@ -216,15 +216,15 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("NE", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("NU", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
|
||||
COUNTRY_REGD("NF", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
|
||||
COUNTRY_REGD("MP", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("PW", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("MP", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("PW", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("RE", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("RW", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("SH", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("KN", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("LC", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("MF", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("SX", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("MF", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("SX", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("PM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("VC", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("WS", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
@ -237,9 +237,9 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("GS", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("SR", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("SJ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("SZ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("SZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("TJ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("TZ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("TZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("TG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("TK", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
|
||||
COUNTRY_REGD("TO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
@ -247,13 +247,16 @@ static const struct rtw89_regd rtw89_regd_map[] = {
|
||||
COUNTRY_REGD("TC", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("TV", RTW89_ETSI, RTW89_NA, RTW89_NA),
|
||||
COUNTRY_REGD("UG", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("VI", RTW89_FCC, RTW89_FCC, RTW89_NA),
|
||||
COUNTRY_REGD("VI", RTW89_FCC, RTW89_FCC, RTW89_FCC),
|
||||
COUNTRY_REGD("UZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
|
||||
COUNTRY_REGD("VU", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("WF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("EH", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("ZM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("CU", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("IR", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("SY", RTW89_ETSI, RTW89_NA, RTW89_NA),
|
||||
COUNTRY_REGD("SD", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
COUNTRY_REGD("PS", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
|
||||
};
|
||||
|
||||
@ -651,22 +654,44 @@ static void rtw89_regd_apply_policy_unii4(struct rtw89_dev *rtwdev,
|
||||
sband->channels[i].flags |= IEEE80211_CHAN_DISABLED;
|
||||
}
|
||||
|
||||
static void rtw89_regd_apply_policy_6ghz(struct rtw89_dev *rtwdev,
|
||||
struct wiphy *wiphy)
|
||||
static bool regd_is_6ghz_blocked(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
|
||||
const struct rtw89_regd *regd = regulatory->regd;
|
||||
struct ieee80211_supported_band *sband;
|
||||
u8 index;
|
||||
int i;
|
||||
|
||||
index = rtw89_regd_get_index(regd);
|
||||
if (index != RTW89_REGD_MAX_COUNTRY_NUM &&
|
||||
!test_bit(index, regulatory->block_6ghz))
|
||||
return;
|
||||
return false;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_REGD, "%c%c 6 GHz is blocked by policy\n",
|
||||
regd->alpha2[0], regd->alpha2[1]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool regd_is_6ghz_not_applicable(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
|
||||
const struct rtw89_regd *regd = regulatory->regd;
|
||||
|
||||
if (regd->txpwr_regd[RTW89_BAND_6G] != RTW89_NA)
|
||||
return false;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_REGD, "%c%c 6 GHz is N/A in regd map\n",
|
||||
regd->alpha2[0], regd->alpha2[1]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void rtw89_regd_apply_policy_6ghz(struct rtw89_dev *rtwdev,
|
||||
struct wiphy *wiphy)
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
int i;
|
||||
|
||||
if (!regd_is_6ghz_blocked(rtwdev) &&
|
||||
!regd_is_6ghz_not_applicable(rtwdev))
|
||||
return;
|
||||
|
||||
sband = wiphy->bands[NL80211_BAND_6GHZ];
|
||||
if (!sband)
|
||||
@ -798,22 +823,26 @@ static bool __rtw89_reg_6ghz_tpe_recalc(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
|
||||
struct rtw89_reg_6ghz_tpe new = {};
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_vif *rtwvif;
|
||||
unsigned int link_id;
|
||||
bool changed = false;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
const struct rtw89_reg_6ghz_tpe *tmp;
|
||||
const struct rtw89_chan *chan;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx);
|
||||
if (chan->band_type != RTW89_BAND_6G)
|
||||
continue;
|
||||
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) {
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
|
||||
if (chan->band_type != RTW89_BAND_6G)
|
||||
continue;
|
||||
|
||||
tmp = &rtwvif->reg_6ghz_tpe;
|
||||
if (!tmp->valid)
|
||||
continue;
|
||||
tmp = &rtwvif_link->reg_6ghz_tpe;
|
||||
if (!tmp->valid)
|
||||
continue;
|
||||
|
||||
tpe_intersect_constraint(&new, tmp->constraint);
|
||||
tpe_intersect_constraint(&new, tmp->constraint);
|
||||
}
|
||||
}
|
||||
|
||||
if (memcmp(®ulatory->reg_6ghz_tpe, &new,
|
||||
@ -836,19 +865,24 @@ static bool __rtw89_reg_6ghz_tpe_recalc(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static int rtw89_reg_6ghz_tpe_recalc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool active,
|
||||
struct rtw89_vif_link *rtwvif_link, bool active,
|
||||
unsigned int *changed)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
|
||||
struct rtw89_reg_6ghz_tpe *tpe = &rtwvif->reg_6ghz_tpe;
|
||||
struct rtw89_reg_6ghz_tpe *tpe = &rtwvif_link->reg_6ghz_tpe;
|
||||
struct ieee80211_bss_conf *bss_conf;
|
||||
|
||||
memset(tpe, 0, sizeof(*tpe));
|
||||
|
||||
if (!active || rtwvif->reg_6ghz_power != RTW89_REG_6GHZ_POWER_STD)
|
||||
if (!active || rtwvif_link->reg_6ghz_power != RTW89_REG_6GHZ_POWER_STD)
|
||||
goto bottom;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, true);
|
||||
rtw89_calculate_tpe(rtwdev, tpe, &bss_conf->tpe);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
if (!tpe->valid)
|
||||
goto bottom;
|
||||
|
||||
@ -872,20 +906,24 @@ static bool __rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev)
|
||||
const struct rtw89_regd *regd = regulatory->regd;
|
||||
enum rtw89_reg_6ghz_power sel;
|
||||
const struct rtw89_chan *chan;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_vif *rtwvif;
|
||||
unsigned int link_id;
|
||||
int count = 0;
|
||||
u8 index;
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx);
|
||||
if (chan->band_type != RTW89_BAND_6G)
|
||||
continue;
|
||||
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) {
|
||||
chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
|
||||
if (chan->band_type != RTW89_BAND_6G)
|
||||
continue;
|
||||
|
||||
if (count != 0 && rtwvif->reg_6ghz_power == sel)
|
||||
continue;
|
||||
if (count != 0 && rtwvif_link->reg_6ghz_power == sel)
|
||||
continue;
|
||||
|
||||
sel = rtwvif->reg_6ghz_power;
|
||||
count++;
|
||||
sel = rtwvif_link->reg_6ghz_power;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (count != 1)
|
||||
@ -913,35 +951,41 @@ static bool __rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static int rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif, bool active,
|
||||
struct rtw89_vif_link *rtwvif_link, bool active,
|
||||
unsigned int *changed)
|
||||
{
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_bss_conf *bss_conf;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, true);
|
||||
|
||||
if (active) {
|
||||
switch (vif->bss_conf.power_type) {
|
||||
switch (bss_conf->power_type) {
|
||||
case IEEE80211_REG_VLP_AP:
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_VLP;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_VLP;
|
||||
break;
|
||||
case IEEE80211_REG_LPI_AP:
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_LPI;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_LPI;
|
||||
break;
|
||||
case IEEE80211_REG_SP_AP:
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_STD;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_STD;
|
||||
break;
|
||||
default:
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
rtwvif_link->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
*changed += __rtw89_reg_6ghz_power_recalc(rtwdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtw89_reg_6ghz_recalc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
int rtw89_reg_6ghz_recalc(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
|
||||
bool active)
|
||||
{
|
||||
unsigned int changed = 0;
|
||||
@ -953,11 +997,11 @@ int rtw89_reg_6ghz_recalc(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
|
||||
* so must do reg_6ghz_tpe_recalc() after reg_6ghz_power_recalc().
|
||||
*/
|
||||
|
||||
ret = rtw89_reg_6ghz_power_recalc(rtwdev, rtwvif, active, &changed);
|
||||
ret = rtw89_reg_6ghz_power_recalc(rtwdev, rtwvif_link, active, &changed);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = rtw89_reg_6ghz_tpe_recalc(rtwdev, rtwvif, active, &changed);
|
||||
ret = rtw89_reg_6ghz_tpe_recalc(rtwdev, rtwvif_link, active, &changed);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@ -185,6 +185,15 @@ static const struct rtw89_rrsr_cfgs rtw8851b_rrsr_cfgs = {
|
||||
.rsc = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8851b_rfkill_regs = {
|
||||
.pinmux = {R_AX_GPIO8_15_FUNC_SEL,
|
||||
B_AX_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_AX_GPIO_EXT_CTRL + 2,
|
||||
(B_AX_GPIO_MOD_9 | B_AX_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8851b_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD_V1,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
@ -273,7 +282,7 @@ static int rtw8851b_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
u8 val8;
|
||||
u32 ret;
|
||||
int ret;
|
||||
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_AFSM_WLSUS_EN |
|
||||
B_AX_AFSM_PCIE_SUS_EN);
|
||||
@ -392,7 +401,7 @@ static void rtw8851b_patch_swr_pfm2pwm(struct rtw89_dev *rtwdev)
|
||||
static int rtw8851b_pwr_off_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
u32 ret;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_RFC2RF,
|
||||
XTAL_SI_RFC2RF);
|
||||
@ -1578,28 +1587,34 @@ static void rtw8851b_rfk_init(struct rtw89_dev *rtwdev)
|
||||
rtw8851b_aack(rtwdev);
|
||||
rtw8851b_rck(rtwdev);
|
||||
rtw8851b_dack(rtwdev);
|
||||
rtw8851b_rx_dck(rtwdev, RTW89_PHY_0);
|
||||
rtw8851b_rx_dck(rtwdev, RTW89_PHY_0, RTW89_CHANCTX_0);
|
||||
}
|
||||
|
||||
static void rtw8851b_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static void rtw8851b_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
|
||||
rtw8851b_rx_dck(rtwdev, phy_idx);
|
||||
rtw8851b_iqk(rtwdev, phy_idx);
|
||||
rtw8851b_tssi(rtwdev, phy_idx, true);
|
||||
rtw8851b_dpk(rtwdev, phy_idx);
|
||||
rtw8851b_rx_dck(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8851b_iqk(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8851b_tssi(rtwdev, phy_idx, true, chanctx_idx);
|
||||
rtw8851b_dpk(rtwdev, phy_idx, chanctx_idx);
|
||||
}
|
||||
|
||||
static void rtw8851b_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
rtw8851b_tssi_scan(rtwdev, phy_idx);
|
||||
rtw8851b_tssi_scan(rtwdev, phy_idx, chan);
|
||||
}
|
||||
|
||||
static void rtw8851b_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static void rtw8851b_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
rtw8851b_wifi_scan_notify(rtwdev, start, RTW89_PHY_0);
|
||||
rtw8851b_wifi_scan_notify(rtwdev, start, rtwvif_link->phy_idx,
|
||||
rtwvif_link->chanctx_idx);
|
||||
}
|
||||
|
||||
static void rtw8851b_rfk_track(struct rtw89_dev *rtwdev)
|
||||
@ -1807,7 +1822,7 @@ rtw8851b_init_txpwr_unit(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
static void rtw8851b_ctrl_nbtg_bt_tx(struct rtw89_dev *rtwdev, bool en,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_phy_write_reg3_tbl(rtwdev, en ? &rtw8851b_btc_preagc_en_defs_tbl :
|
||||
&rtw8851b_btc_preagc_dis_defs_tbl);
|
||||
@ -1830,7 +1845,7 @@ static void rtw8851b_ctrl_nbtg_bt_tx(struct rtw89_dev *rtwdev, bool en,
|
||||
static void rtw8851b_ctrl_btg_bt_rx(struct rtw89_dev *rtwdev, bool en,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
if (en) {
|
||||
rtw89_phy_write32_mask(rtwdev, R_PATH0_BT_SHARE_V1,
|
||||
@ -1875,7 +1890,7 @@ static void rtw8851b_ctrl_btg_bt_rx(struct rtw89_dev *rtwdev, bool en,
|
||||
static void rtw8851b_bb_ctrl_rx_path(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_rf_path_bit rx_path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u32 rst_mask0;
|
||||
|
||||
if (rx_path == RF_A) {
|
||||
@ -2289,7 +2304,8 @@ static void rtw8851b_query_ppdu(struct rtw89_dev *rtwdev,
|
||||
u8 path;
|
||||
u8 *rx_power = phy_ppdu->rssi;
|
||||
|
||||
status->signal = RTW89_RSSI_RAW_TO_DBM(rx_power[RF_PATH_A]);
|
||||
if (!status->signal)
|
||||
status->signal = RTW89_RSSI_RAW_TO_DBM(rx_power[RF_PATH_A]);
|
||||
|
||||
for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
|
||||
status->chains |= BIT(path);
|
||||
@ -2381,9 +2397,12 @@ static const struct rtw89_chip_ops rtw8851b_chip_ops = {
|
||||
.get_thermal = rtw8851b_get_thermal,
|
||||
.ctrl_btg_bt_rx = rtw8851b_ctrl_btg_bt_rx,
|
||||
.query_ppdu = rtw8851b_query_ppdu,
|
||||
.convert_rpl_to_rssi = NULL,
|
||||
.phy_rpt_to_rssi = NULL,
|
||||
.ctrl_nbtg_bt_tx = rtw8851b_ctrl_nbtg_bt_tx,
|
||||
.cfg_txrx_path = rtw8851b_bb_cfg_txrx_path,
|
||||
.set_txpwr_ul_tb_offset = rtw8851b_set_txpwr_ul_tb_offset,
|
||||
.digital_pwr_comp = NULL,
|
||||
.pwr_on_func = rtw8851b_pwr_on_func,
|
||||
.pwr_off_func = rtw8851b_pwr_off_func,
|
||||
.query_rxdesc = rtw89_core_query_rxdesc,
|
||||
@ -2443,6 +2462,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
|
||||
.wde_qempty_acq_grpnum = 4,
|
||||
.wde_qempty_mgq_grpsel = 4,
|
||||
.rf_base_addr = {0xe000},
|
||||
.thermal_th = {0x32, 0x35},
|
||||
.pwr_on_seq = NULL,
|
||||
.pwr_off_seq = NULL,
|
||||
.bb_table = &rtw89_8851b_phy_bb_table,
|
||||
@ -2452,12 +2472,14 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
|
||||
.nctl_post_table = &rtw8851b_nctl_post_defs_tbl,
|
||||
.dflt_parms = &rtw89_8851b_dflt_parms,
|
||||
.rfe_parms_conf = rtw89_8851b_rfe_parms_conf,
|
||||
.txpwr_factor_bb = 3,
|
||||
.txpwr_factor_rf = 2,
|
||||
.txpwr_factor_mac = 1,
|
||||
.dig_table = NULL,
|
||||
.dig_regs = &rtw8851b_dig_regs,
|
||||
.tssi_dbw_table = NULL,
|
||||
.support_macid_num = RTW89_MAX_MAC_ID_NUM,
|
||||
.support_link_num = 0,
|
||||
.support_chanctx_num = 0,
|
||||
.support_rnr = false,
|
||||
.support_bands = BIT(NL80211_BAND_2GHZ) |
|
||||
@ -2466,9 +2488,11 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
|
||||
BIT(NL80211_CHAN_WIDTH_40) |
|
||||
BIT(NL80211_CHAN_WIDTH_80),
|
||||
.support_unii4 = true,
|
||||
.support_ant_gain = false,
|
||||
.ul_tb_waveform_ctrl = true,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.hw_sec_hdr = false,
|
||||
.hw_mgmt_tx_encrypt = false,
|
||||
.rf_path_num = 1,
|
||||
.tx_nss = 1,
|
||||
.rx_nss = 1,
|
||||
@ -2530,6 +2554,8 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
|
||||
.rrsr_cfgs = &rtw8851b_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_MAP_V1, B_BSS_CLR_MAP_VLD0},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP_V1,
|
||||
.rfkill_init = &rtw8851b_rfkill_regs,
|
||||
.rfkill_get = {R_AX_GPIO_EXT_CTRL, B_AX_GPIO_IN_9},
|
||||
.dma_ch_mask = BIT(RTW89_DMA_ACH4) | BIT(RTW89_DMA_ACH5) |
|
||||
BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
|
||||
BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
|
||||
|
||||
@ -521,9 +521,10 @@ static void _dac_cal(struct rtw89_dev *rtwdev, bool force)
|
||||
}
|
||||
|
||||
static void _rx_dck_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, bool is_afe)
|
||||
enum rtw89_rf_path path, bool is_afe,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[RX_DCK] ==== S%d RX DCK (%s / CH%d / %s / by %s)====\n", path,
|
||||
@ -574,7 +575,8 @@ static void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 rf
|
||||
_rxbb_ofst_swap(rtwdev, path, rf_mode);
|
||||
}
|
||||
|
||||
static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_afe)
|
||||
static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_afe,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u32 rf_reg5;
|
||||
u8 path;
|
||||
@ -584,7 +586,7 @@ static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_af
|
||||
0x2, rtwdev->hal.cv);
|
||||
|
||||
for (path = 0; path < RF_PATH_NUM_8851B; path++) {
|
||||
_rx_dck_info(rtwdev, phy, path, is_afe);
|
||||
_rx_dck_info(rtwdev, phy, path, is_afe, chanctx_idx);
|
||||
|
||||
rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);
|
||||
|
||||
@ -1481,9 +1483,9 @@ static void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
u8 path)
|
||||
u8 path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u8 idx = 0;
|
||||
|
||||
@ -1586,10 +1588,11 @@ static void _iqk_init(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, chanctx_idx);
|
||||
u32 backup_rf_val[RTW8851B_IQK_SS][BACKUP_RF_REGS_NR];
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
|
||||
@ -1602,7 +1605,7 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
iqk_info->version = RTW8851B_IQK_VER;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path, chanctx_idx);
|
||||
|
||||
_rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]);
|
||||
_rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
|
||||
@ -1618,9 +1621,10 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
BTC_WRFK_ONESHOT_STOP);
|
||||
}
|
||||
|
||||
static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force)
|
||||
static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
bool force, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A, chanctx_idx);
|
||||
}
|
||||
|
||||
static void _dpk_bkup_kip(struct rtw89_dev *rtwdev, const u32 *reg,
|
||||
@ -1746,9 +1750,9 @@ static void _dpk_init(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
|
||||
}
|
||||
|
||||
static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
|
||||
u8 kidx = dpk->cur_idx[path];
|
||||
@ -2195,7 +2199,7 @@ static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
|
||||
if (dgain > 0x5fc || dgain < 0x556) {
|
||||
_dpk_one_shot(rtwdev, phy, path, D_SYNC);
|
||||
dgain = _dpk_dgain_read(rtwdev);
|
||||
_dpk_dgain_read(rtwdev);
|
||||
}
|
||||
|
||||
if (agc_cnt == 0) {
|
||||
@ -2449,7 +2453,8 @@ _error:
|
||||
}
|
||||
|
||||
static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_phy_idx phy, u8 kpath)
|
||||
enum rtw89_phy_idx phy, u8 kpath,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
u32 kip_bkup[RF_PATH_NUM_8851B][DPK_KIP_REG_NUM_8851B] = {};
|
||||
@ -2465,7 +2470,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
continue;
|
||||
_dpk_bkup_kip(rtwdev, dpk_kip_reg, kip_bkup, path);
|
||||
_dpk_bkup_rf(rtwdev, dpk_rf_reg, rf_bkup, path);
|
||||
_dpk_information(rtwdev, phy, path);
|
||||
_dpk_information(rtwdev, phy, path, chanctx_idx);
|
||||
_dpk_init(rtwdev, path);
|
||||
|
||||
if (rtwdev->is_tssi_mode[path])
|
||||
@ -2505,13 +2510,14 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
_dpk_kip_pwr_clk_onoff(rtwdev, false);
|
||||
}
|
||||
|
||||
static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force)
|
||||
static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[DPK] ****** 8851B DPK Start (Ver: 0x%x, Cv: %d) ******\n",
|
||||
DPK_VER_8851B, rtwdev->hal.cv);
|
||||
|
||||
_dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy));
|
||||
_dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy), chanctx_idx);
|
||||
}
|
||||
|
||||
static void _dpk_track(struct rtw89_dev *rtwdev)
|
||||
@ -2617,9 +2623,8 @@ static void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
|
||||
}
|
||||
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_sys_defs_tbl);
|
||||
@ -2650,7 +2655,7 @@ static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
#define RTW8851B_TSSI_GET_VAL(ptr, idx) \
|
||||
({ \
|
||||
@ -2664,7 +2669,6 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
__val; \
|
||||
})
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 subband = chan->subband_type;
|
||||
const s8 *thm_up_a = NULL;
|
||||
@ -2755,9 +2759,8 @@ static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx
|
||||
}
|
||||
|
||||
static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
|
||||
@ -2766,9 +2769,9 @@ static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
}
|
||||
|
||||
static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, bool all)
|
||||
enum rtw89_rf_path path, bool all,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
|
||||
@ -2944,10 +2947,9 @@ static u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch)
|
||||
}
|
||||
|
||||
static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u32 gidx, gidx_1st, gidx_2nd;
|
||||
u8 ch = chan->channel;
|
||||
s8 de_1st;
|
||||
@ -2980,10 +2982,9 @@ static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u32 tgidx, tgidx_1st, tgidx_2nd;
|
||||
u8 ch = chan->channel;
|
||||
s8 tde_1st;
|
||||
@ -3017,10 +3018,10 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
return val;
|
||||
}
|
||||
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 gidx;
|
||||
s8 ofdm_de;
|
||||
@ -3033,7 +3034,7 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx p
|
||||
|
||||
for (i = RF_PATH_A; i < RTW8851B_TSSI_PATH_NR; i++) {
|
||||
gidx = _tssi_get_cck_group(rtwdev, ch);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);
|
||||
val = tssi_info->tssi_cck[i][gidx] + trim_de;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
@ -3049,8 +3050,8 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx p
|
||||
rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i],
|
||||
_TSSI_DE_MASK));
|
||||
|
||||
ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
|
||||
ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i, chan);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);
|
||||
val = ofdm_de + trim_de;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
@ -3096,10 +3097,10 @@ static void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_p
|
||||
}
|
||||
|
||||
static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, enum rtw89_rf_path path)
|
||||
enum rtw89_phy_idx phy, enum rtw89_rf_path path,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 channel = chan->channel;
|
||||
u8 band;
|
||||
|
||||
@ -3255,9 +3256,10 @@ void rtw8851b_dack(struct rtw89_dev *rtwdev)
|
||||
_dac_cal(rtwdev, false);
|
||||
}
|
||||
|
||||
void rtw8851b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8851b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
@ -3265,30 +3267,32 @@ void rtw8851b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
|
||||
|
||||
_iqk_init(rtwdev);
|
||||
_iqk(rtwdev, phy_idx, false);
|
||||
_iqk(rtwdev, phy_idx, false, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8851b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8851b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
|
||||
|
||||
_rx_dck(rtwdev, phy_idx, false);
|
||||
_rx_dck(rtwdev, phy_idx, false, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8851b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8851b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
@ -3297,7 +3301,7 @@ void rtw8851b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
rtwdev->dpk.is_dpk_enable = true;
|
||||
rtwdev->dpk.is_dpk_reload_en = false;
|
||||
_dpk(rtwdev, phy_idx, false);
|
||||
_dpk(rtwdev, phy_idx, false, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);
|
||||
@ -3308,9 +3312,11 @@ void rtw8851b_dpk_track(struct rtw89_dev *rtwdev)
|
||||
_dpk_track(rtwdev);
|
||||
}
|
||||
|
||||
void rtw8851b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en)
|
||||
void rtw8851b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
bool hwtx_en, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_A);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_A, chanctx_idx);
|
||||
u8 i;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy);
|
||||
@ -3319,26 +3325,26 @@ void rtw8851b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_e
|
||||
_tssi_disable(rtwdev, phy);
|
||||
|
||||
for (i = RF_PATH_A; i < RF_PATH_NUM_8851B; i++) {
|
||||
_tssi_set_sys(rtwdev, phy, i);
|
||||
_tssi_set_sys(rtwdev, phy, i, chan);
|
||||
_tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i);
|
||||
_tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i);
|
||||
_tssi_set_dck(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);
|
||||
_tssi_set_dac_gain_tbl(rtwdev, phy, i);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i);
|
||||
_tssi_alignment_default(rtwdev, phy, i, true);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i, chan);
|
||||
_tssi_alignment_default(rtwdev, phy, i, true, chan);
|
||||
_tssi_set_tssi_slope(rtwdev, phy, i);
|
||||
}
|
||||
|
||||
_tssi_enable(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy, chan);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
|
||||
}
|
||||
|
||||
void rtw8851b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
void rtw8851b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 channel = chan->channel;
|
||||
u32 i;
|
||||
|
||||
@ -3348,20 +3354,21 @@ void rtw8851b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
_tssi_disable(rtwdev, phy);
|
||||
|
||||
for (i = RF_PATH_A; i < RF_PATH_NUM_8851B; i++) {
|
||||
_tssi_set_sys(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i);
|
||||
_tssi_alignment_default(rtwdev, phy, i, true);
|
||||
_tssi_set_sys(rtwdev, phy, i, chan);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i, chan);
|
||||
_tssi_alignment_default(rtwdev, phy, i, true, chan);
|
||||
}
|
||||
|
||||
_tssi_enable(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy, chan);
|
||||
}
|
||||
|
||||
static void rtw8851b_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, bool enable)
|
||||
enum rtw89_phy_idx phy, bool enable,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 channel = chan->channel;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n",
|
||||
@ -3379,7 +3386,7 @@ static void rtw8851b_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1);
|
||||
|
||||
_tssi_alimentk_done(rtwdev, phy, RF_PATH_A);
|
||||
_tssi_alimentk_done(rtwdev, phy, RF_PATH_A, chan);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x\n",
|
||||
@ -3391,12 +3398,13 @@ static void rtw8851b_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
void rtw8851b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
if (scan_start)
|
||||
rtw8851b_tssi_default_txagc(rtwdev, phy_idx, true);
|
||||
rtw8851b_tssi_default_txagc(rtwdev, phy_idx, true, chanctx_idx);
|
||||
else
|
||||
rtw8851b_tssi_default_txagc(rtwdev, phy_idx, false);
|
||||
rtw8851b_tssi_default_txagc(rtwdev, phy_idx, false, chanctx_idx);
|
||||
}
|
||||
|
||||
static void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
|
||||
|
||||
@ -12,15 +12,21 @@ void rtw8851b_lck_init(struct rtw89_dev *rtwdev);
|
||||
void rtw8851b_lck_track(struct rtw89_dev *rtwdev);
|
||||
void rtw8851b_rck(struct rtw89_dev *rtwdev);
|
||||
void rtw8851b_dack(struct rtw89_dev *rtwdev);
|
||||
void rtw8851b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
void rtw8851b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
void rtw8851b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8851b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8851b_dpk_init(struct rtw89_dev *rtwdev);
|
||||
void rtw8851b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8851b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8851b_dpk_track(struct rtw89_dev *rtwdev);
|
||||
void rtw8851b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en);
|
||||
void rtw8851b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8851b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
bool hwtx_en, enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8851b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan);
|
||||
void rtw8851b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8851b_set_channel_rf(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
|
||||
@ -27,6 +27,7 @@ static const struct rtw89_pci_info rtw8851b_pci_info = {
|
||||
.io_rcy_tmr = MAC_AX_IO_RCY_ANA_TMR_6MS,
|
||||
.rx_ring_eq_is_full = false,
|
||||
.check_rx_tag = false,
|
||||
.no_rxbd_fs = false,
|
||||
|
||||
.init_cfg_reg = R_AX_PCIE_INIT_CFG1,
|
||||
.txhci_en_bit = B_AX_TXHCI_EN,
|
||||
@ -60,10 +61,13 @@ static const struct rtw89_pci_info rtw8851b_pci_info = {
|
||||
.enable_intr = rtw89_pci_enable_intr,
|
||||
.disable_intr = rtw89_pci_disable_intr,
|
||||
.recognize_intrs = rtw89_pci_recognize_intrs,
|
||||
|
||||
.ssid_quirks = NULL,
|
||||
};
|
||||
|
||||
static const struct rtw89_driver_info rtw89_8851be_info = {
|
||||
.chip = &rtw8851b_chip_info,
|
||||
.variant = NULL,
|
||||
.quirks = NULL,
|
||||
.bus = {
|
||||
.pci = &rtw8851b_pci_info,
|
||||
|
||||
@ -337,6 +337,11 @@ static const struct rtw89_pwr_cfg rtw8852a_pwroff[] = {
|
||||
PWR_INTF_MSK_PCIE,
|
||||
PWR_BASE_MAC,
|
||||
PWR_CMD_WRITE, BIT(0), 0},
|
||||
{0x0092,
|
||||
PWR_CV_MSK_ALL,
|
||||
PWR_INTF_MSK_PCIE,
|
||||
PWR_BASE_MAC,
|
||||
PWR_CMD_WRITE, BIT(4), BIT(4)},
|
||||
{0x0005,
|
||||
PWR_CV_MSK_ALL,
|
||||
PWR_INTF_MSK_PCIE,
|
||||
@ -478,6 +483,15 @@ static const struct rtw89_rrsr_cfgs rtw8852a_rrsr_cfgs = {
|
||||
.rsc = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8852a_rfkill_regs = {
|
||||
.pinmux = {R_AX_GPIO8_15_FUNC_SEL,
|
||||
B_AX_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_AX_GPIO_EXT_CTRL + 2,
|
||||
(B_AX_GPIO_MOD_9 | B_AX_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8852a_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
@ -1332,29 +1346,34 @@ static void rtw8852a_rfk_init(struct rtw89_dev *rtwdev)
|
||||
rtwdev->is_tssi_mode[RF_PATH_B] = false;
|
||||
|
||||
rtw8852a_rck(rtwdev);
|
||||
rtw8852a_dack(rtwdev);
|
||||
rtw8852a_rx_dck(rtwdev, RTW89_PHY_0, true);
|
||||
rtw8852a_dack(rtwdev, RTW89_CHANCTX_0);
|
||||
rtw8852a_rx_dck(rtwdev, RTW89_PHY_0, true, RTW89_CHANCTX_0);
|
||||
}
|
||||
|
||||
static void rtw8852a_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static void rtw8852a_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
|
||||
rtw8852a_rx_dck(rtwdev, phy_idx, true);
|
||||
rtw8852a_iqk(rtwdev, phy_idx);
|
||||
rtw8852a_tssi(rtwdev, phy_idx);
|
||||
rtw8852a_dpk(rtwdev, phy_idx);
|
||||
rtw8852a_rx_dck(rtwdev, phy_idx, true, chanctx_idx);
|
||||
rtw8852a_iqk(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8852a_tssi(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8852a_dpk(rtwdev, phy_idx, chanctx_idx);
|
||||
}
|
||||
|
||||
static void rtw8852a_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
rtw8852a_tssi_scan(rtwdev, phy_idx);
|
||||
rtw8852a_tssi_scan(rtwdev, phy_idx, chan);
|
||||
}
|
||||
|
||||
static void rtw8852a_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static void rtw8852a_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
rtw8852a_wifi_scan_notify(rtwdev, start, RTW89_PHY_0);
|
||||
rtw8852a_wifi_scan_notify(rtwdev, start, rtwvif_link->phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852a_rfk_track(struct rtw89_dev *rtwdev)
|
||||
@ -1534,10 +1553,8 @@ static void rtw8852a_start_pmac_tx(struct rtw89_dev *rtwdev,
|
||||
|
||||
void rtw8852a_bb_set_pmac_tx(struct rtw89_dev *rtwdev,
|
||||
struct rtw8852a_bb_pmac_info *tx_info,
|
||||
enum rtw89_phy_idx idx)
|
||||
enum rtw89_phy_idx idx, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
|
||||
if (!tx_info->en_pmac_tx) {
|
||||
rtw8852a_stop_pmac_tx(rtwdev, tx_info, idx);
|
||||
rtw89_phy_write32_idx(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0, idx);
|
||||
@ -1559,7 +1576,7 @@ void rtw8852a_bb_set_pmac_tx(struct rtw89_dev *rtwdev,
|
||||
|
||||
void rtw8852a_bb_set_pmac_pkt_tx(struct rtw89_dev *rtwdev, u8 enable,
|
||||
u16 tx_cnt, u16 period, u16 tx_time,
|
||||
enum rtw89_phy_idx idx)
|
||||
enum rtw89_phy_idx idx, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw8852a_bb_pmac_info tx_info = {0};
|
||||
|
||||
@ -1569,7 +1586,7 @@ void rtw8852a_bb_set_pmac_pkt_tx(struct rtw89_dev *rtwdev, u8 enable,
|
||||
tx_info.tx_cnt = tx_cnt;
|
||||
tx_info.period = period;
|
||||
tx_info.tx_time = tx_time;
|
||||
rtw8852a_bb_set_pmac_tx(rtwdev, &tx_info, idx);
|
||||
rtw8852a_bb_set_pmac_tx(rtwdev, &tx_info, idx, chan);
|
||||
}
|
||||
|
||||
void rtw8852a_bb_set_power(struct rtw89_dev *rtwdev, s16 pwr_dbm,
|
||||
@ -2051,7 +2068,9 @@ static void rtw8852a_query_ppdu(struct rtw89_dev *rtwdev,
|
||||
u8 path;
|
||||
u8 *rx_power = phy_ppdu->rssi;
|
||||
|
||||
status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
|
||||
if (!status->signal)
|
||||
status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A],
|
||||
rx_power[RF_PATH_B]));
|
||||
for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
|
||||
status->chains |= BIT(path);
|
||||
status->chain_signal[path] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
|
||||
@ -2098,9 +2117,12 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
|
||||
.get_thermal = rtw8852a_get_thermal,
|
||||
.ctrl_btg_bt_rx = rtw8852a_ctrl_btg_bt_rx,
|
||||
.query_ppdu = rtw8852a_query_ppdu,
|
||||
.convert_rpl_to_rssi = NULL,
|
||||
.phy_rpt_to_rssi = NULL,
|
||||
.ctrl_nbtg_bt_tx = rtw8852a_ctrl_nbtg_bt_tx,
|
||||
.cfg_txrx_path = NULL,
|
||||
.set_txpwr_ul_tb_offset = rtw8852a_set_txpwr_ul_tb_offset,
|
||||
.digital_pwr_comp = NULL,
|
||||
.pwr_on_func = NULL,
|
||||
.pwr_off_func = NULL,
|
||||
.query_rxdesc = rtw89_core_query_rxdesc,
|
||||
@ -2151,6 +2173,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
.wde_qempty_acq_grpnum = 16,
|
||||
.wde_qempty_mgq_grpsel = 16,
|
||||
.rf_base_addr = {0xc000, 0xd000},
|
||||
.thermal_th = {0x32, 0x35},
|
||||
.pwr_on_seq = pwr_on_seq_8852a,
|
||||
.pwr_off_seq = pwr_off_seq_8852a,
|
||||
.bb_table = &rtw89_8852a_phy_bb_table,
|
||||
@ -2161,12 +2184,14 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
.nctl_post_table = NULL,
|
||||
.dflt_parms = &rtw89_8852a_dflt_parms,
|
||||
.rfe_parms_conf = NULL,
|
||||
.txpwr_factor_bb = 3,
|
||||
.txpwr_factor_rf = 2,
|
||||
.txpwr_factor_mac = 1,
|
||||
.dig_table = &rtw89_8852a_phy_dig_table,
|
||||
.dig_regs = &rtw8852a_dig_regs,
|
||||
.tssi_dbw_table = NULL,
|
||||
.support_macid_num = RTW89_MAX_MAC_ID_NUM,
|
||||
.support_link_num = 0,
|
||||
.support_chanctx_num = 1,
|
||||
.support_rnr = false,
|
||||
.support_bands = BIT(NL80211_BAND_2GHZ) |
|
||||
@ -2175,9 +2200,11 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
BIT(NL80211_CHAN_WIDTH_40) |
|
||||
BIT(NL80211_CHAN_WIDTH_80),
|
||||
.support_unii4 = false,
|
||||
.support_ant_gain = false,
|
||||
.ul_tb_waveform_ctrl = false,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.hw_sec_hdr = false,
|
||||
.hw_mgmt_tx_encrypt = false,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
@ -2240,6 +2267,8 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
.rrsr_cfgs = &rtw8852a_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_MAP, B_BSS_CLR_MAP_VLD0},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP,
|
||||
.rfkill_init = &rtw8852a_rfkill_regs,
|
||||
.rfkill_get = {R_AX_GPIO_EXT_CTRL, B_AX_GPIO_IN_9},
|
||||
.dma_ch_mask = 0,
|
||||
.edcca_regs = &rtw8852a_edcca_regs,
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@ -97,10 +97,10 @@ extern const struct rtw89_chip_info rtw8852a_chip_info;
|
||||
void rtw8852a_bb_set_plcp_tx(struct rtw89_dev *rtwdev);
|
||||
void rtw8852a_bb_set_pmac_tx(struct rtw89_dev *rtwdev,
|
||||
struct rtw8852a_bb_pmac_info *tx_info,
|
||||
enum rtw89_phy_idx idx);
|
||||
enum rtw89_phy_idx idx, const struct rtw89_chan *chan);
|
||||
void rtw8852a_bb_set_pmac_pkt_tx(struct rtw89_dev *rtwdev, u8 enable,
|
||||
u16 tx_cnt, u16 period, u16 tx_time,
|
||||
enum rtw89_phy_idx idx);
|
||||
enum rtw89_phy_idx idx, const struct rtw89_chan *chan);
|
||||
void rtw8852a_bb_set_power(struct rtw89_dev *rtwdev, s16 pwr_dbm,
|
||||
enum rtw89_phy_idx idx);
|
||||
void rtw8852a_bb_cfg_tx_path(struct rtw89_dev *rtwdev, u8 tx_path);
|
||||
|
||||
@ -493,11 +493,12 @@ static void _dack(struct rtw89_dev *rtwdev)
|
||||
_dack_s1(rtwdev);
|
||||
}
|
||||
|
||||
static void _dac_cal(struct rtw89_dev *rtwdev, bool force)
|
||||
static void _dac_cal(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dack_info *dack = &rtwdev->dack;
|
||||
u32 rf0_0, rf1_0;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB, chanctx_idx);
|
||||
|
||||
dack->dack_done = false;
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK b\n");
|
||||
@ -799,12 +800,13 @@ static bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path, u8 ktype)
|
||||
}
|
||||
|
||||
static bool _iqk_one_shot(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx, u8 path, u8 ktype)
|
||||
enum rtw89_phy_idx phy_idx, u8 path, u8 ktype,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
bool fail = false;
|
||||
u32 iqk_cmd = 0x0;
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy_idx, path);
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy_idx, path, chanctx_idx);
|
||||
u32 addr_rfc_ctl = 0x0;
|
||||
|
||||
if (path == RF_PATH_A)
|
||||
@ -888,7 +890,8 @@ static bool _iqk_one_shot(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static bool _rxk_group_sel(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
static const u32 rxgn_a[4] = {0x18C, 0x1A0, 0x28C, 0x2A0};
|
||||
@ -927,7 +930,7 @@ static bool _rxk_group_sel(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, gp);
|
||||
rtw89_phy_write32_mask(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_EN, 0x1);
|
||||
rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP);
|
||||
fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK);
|
||||
fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK, chanctx_idx);
|
||||
rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(16 + gp + path * 4), fail);
|
||||
}
|
||||
|
||||
@ -952,7 +955,8 @@ static bool _rxk_group_sel(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static bool _iqk_nbrxk(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u8 group = 0x0;
|
||||
@ -991,7 +995,7 @@ static bool _iqk_nbrxk(struct rtw89_dev *rtwdev,
|
||||
B_CFIR_LUT_GP, group);
|
||||
rtw89_phy_write32_set(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_EN);
|
||||
rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP);
|
||||
fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK);
|
||||
fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK, chanctx_idx);
|
||||
|
||||
switch (iqk_info->iqk_band[path]) {
|
||||
case RTW89_BAND_2G:
|
||||
@ -1040,7 +1044,8 @@ static void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path)
|
||||
}
|
||||
|
||||
static bool _txk_group_sel(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
static const u32 a_txgain[4] = {0xE466, 0x646D, 0xE4E2, 0x64ED};
|
||||
static const u32 g_txgain[4] = {0x60e8, 0x60f0, 0x61e8, 0x61ED};
|
||||
@ -1083,7 +1088,7 @@ static bool _txk_group_sel(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
|
||||
B_CFIR_LUT_GP, gp);
|
||||
rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP);
|
||||
fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK);
|
||||
fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK, chanctx_idx);
|
||||
rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(8 + gp + path * 4), fail);
|
||||
}
|
||||
|
||||
@ -1098,7 +1103,8 @@ static bool _txk_group_sel(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static bool _iqk_nbtxk(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u8 group = 0x2;
|
||||
@ -1131,7 +1137,7 @@ static bool _iqk_nbtxk(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, group);
|
||||
rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, itqt);
|
||||
rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP);
|
||||
fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK);
|
||||
fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK, chanctx_idx);
|
||||
if (!fail) {
|
||||
tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD);
|
||||
iqk_info->nb_txcfir[path] = tmp | 0x2;
|
||||
@ -1179,7 +1185,8 @@ static bool _lok_finetune_check(struct rtw89_dev *rtwdev, u8 path)
|
||||
}
|
||||
|
||||
static bool _iqk_lok(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 rf0 = 0x0;
|
||||
@ -1210,11 +1217,11 @@ static bool _iqk_lok(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_write32_set(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_EN);
|
||||
rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP);
|
||||
rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, itqt);
|
||||
tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_COARSE);
|
||||
tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_COARSE, chanctx_idx);
|
||||
iqk_info->lok_cor_fail[0][path] = tmp;
|
||||
fsleep(10);
|
||||
rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, itqt);
|
||||
tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_FINE);
|
||||
tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_FINE, chanctx_idx);
|
||||
iqk_info->lok_fin_fail[0][path] = tmp;
|
||||
fail = _lok_finetune_check(rtwdev, path);
|
||||
return fail;
|
||||
@ -1321,7 +1328,8 @@ static void _iqk_info_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
}
|
||||
|
||||
static
|
||||
void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
|
||||
void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
bool lok_is_fail = false;
|
||||
@ -1333,30 +1341,35 @@ void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
|
||||
for (i = 0; i < 3; i++) {
|
||||
_lok_res_table(rtwdev, path, ibias++);
|
||||
_iqk_txk_setting(rtwdev, path);
|
||||
lok_is_fail = _iqk_lok(rtwdev, phy_idx, path);
|
||||
lok_is_fail = _iqk_lok(rtwdev, phy_idx, path, chanctx_idx);
|
||||
if (!lok_is_fail)
|
||||
break;
|
||||
}
|
||||
if (iqk_info->is_nbiqk)
|
||||
iqk_info->iqk_tx_fail[0][path] = _iqk_nbtxk(rtwdev, phy_idx, path);
|
||||
iqk_info->iqk_tx_fail[0][path] = _iqk_nbtxk(rtwdev, phy_idx, path,
|
||||
chanctx_idx);
|
||||
else
|
||||
iqk_info->iqk_tx_fail[0][path] = _txk_group_sel(rtwdev, phy_idx, path);
|
||||
iqk_info->iqk_tx_fail[0][path] = _txk_group_sel(rtwdev, phy_idx, path,
|
||||
chanctx_idx);
|
||||
|
||||
_iqk_rxclk_setting(rtwdev, path);
|
||||
_iqk_rxk_setting(rtwdev, path);
|
||||
if (iqk_info->is_nbiqk || rtwdev->dbcc_en || iqk_info->iqk_band[path] == RTW89_BAND_2G)
|
||||
iqk_info->iqk_rx_fail[0][path] = _iqk_nbrxk(rtwdev, phy_idx, path);
|
||||
iqk_info->iqk_rx_fail[0][path] = _iqk_nbrxk(rtwdev, phy_idx, path,
|
||||
chanctx_idx);
|
||||
else
|
||||
iqk_info->iqk_rx_fail[0][path] = _rxk_group_sel(rtwdev, phy_idx, path);
|
||||
iqk_info->iqk_rx_fail[0][path] = _rxk_group_sel(rtwdev, phy_idx, path,
|
||||
chanctx_idx);
|
||||
|
||||
_iqk_info_iqk(rtwdev, phy_idx, path);
|
||||
}
|
||||
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, u8 path)
|
||||
enum rtw89_phy_idx phy, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u32 reg_rf18 = 0x0, reg_35c = 0x0;
|
||||
u8 idx = 0;
|
||||
u8 get_empty_table = false;
|
||||
@ -1413,9 +1426,9 @@ static void _iqk_get_ch_info(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
u8 path)
|
||||
u8 path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
_iqk_by_path(rtwdev, phy_idx, path);
|
||||
_iqk_by_path(rtwdev, phy_idx, path, chanctx_idx);
|
||||
}
|
||||
|
||||
static void _iqk_restore(struct rtw89_dev *rtwdev, u8 path)
|
||||
@ -1513,7 +1526,8 @@ static void _iqk_macbb_setting(struct rtw89_dev *rtwdev,
|
||||
rtw89_rfk_parser(rtwdev, tbl);
|
||||
}
|
||||
|
||||
static void _iqk_dbcc(struct rtw89_dev *rtwdev, u8 path)
|
||||
static void _iqk_dbcc(struct rtw89_dev *rtwdev, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u8 phy_idx = 0x0;
|
||||
@ -1525,10 +1539,10 @@ static void _iqk_dbcc(struct rtw89_dev *rtwdev, u8 path)
|
||||
else
|
||||
phy_idx = RTW89_PHY_1;
|
||||
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path, chanctx_idx);
|
||||
_iqk_macbb_setting(rtwdev, phy_idx, path);
|
||||
_iqk_preset(rtwdev, path);
|
||||
_iqk_start_iqk(rtwdev, phy_idx, path);
|
||||
_iqk_start_iqk(rtwdev, phy_idx, path, chanctx_idx);
|
||||
_iqk_restore(rtwdev, path);
|
||||
_iqk_afebb_restore(rtwdev, phy_idx, path);
|
||||
}
|
||||
@ -1607,12 +1621,13 @@ static void _iqk_init(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
u32 backup_rf_val[RTW8852A_IQK_SS][BACKUP_RF_REGS_NR];
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
|
||||
|
||||
@ -1622,12 +1637,12 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
iqk_info->version = RTW8852A_IQK_VER;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path, chanctx_idx);
|
||||
_rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]);
|
||||
_rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
|
||||
_iqk_macbb_setting(rtwdev, phy_idx, path);
|
||||
_iqk_preset(rtwdev, path);
|
||||
_iqk_start_iqk(rtwdev, phy_idx, path);
|
||||
_iqk_start_iqk(rtwdev, phy_idx, path, chanctx_idx);
|
||||
_iqk_restore(rtwdev, path);
|
||||
_iqk_afebb_restore(rtwdev, phy_idx, path);
|
||||
_rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]);
|
||||
@ -1635,18 +1650,19 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
|
||||
}
|
||||
|
||||
static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force)
|
||||
static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
switch (_kpath(rtwdev, phy_idx)) {
|
||||
case RF_A:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A, chanctx_idx);
|
||||
break;
|
||||
case RF_B:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B, chanctx_idx);
|
||||
break;
|
||||
case RF_AB:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A, chanctx_idx);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B, chanctx_idx);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1656,9 +1672,10 @@ static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool forc
|
||||
#define RXDCK_VER_8852A 0xe
|
||||
|
||||
static void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, bool is_afe)
|
||||
enum rtw89_rf_path path, bool is_afe,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path);
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path, chanctx_idx);
|
||||
u32 ori_val;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
@ -1704,7 +1721,7 @@ static void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
bool is_afe)
|
||||
bool is_afe, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 path, kpath, dck_tune;
|
||||
u32 rf_reg5;
|
||||
@ -1732,7 +1749,7 @@ static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
|
||||
rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0);
|
||||
rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
|
||||
_set_rx_dck(rtwdev, phy, path, is_afe);
|
||||
_set_rx_dck(rtwdev, phy, path, is_afe, chanctx_idx);
|
||||
rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, dck_tune);
|
||||
rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
|
||||
|
||||
@ -1800,9 +1817,10 @@ static void _dpk_reload_kip(struct rtw89_dev *rtwdev, u32 *reg,
|
||||
}
|
||||
|
||||
static u8 _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, enum rtw8852a_dpk_id id)
|
||||
enum rtw89_rf_path path, enum rtw8852a_dpk_id id,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path);
|
||||
u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path, chanctx_idx);
|
||||
u16 dpk_cmd = 0x0;
|
||||
u32 val;
|
||||
int ret;
|
||||
@ -1841,18 +1859,19 @@ static u8 _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
|
||||
static void _dpk_rx_dck(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_EN_TIA_IDA, 0x3);
|
||||
_set_rx_dck(rtwdev, phy, path, false);
|
||||
_set_rx_dck(rtwdev, phy, path, false, chanctx_idx);
|
||||
}
|
||||
|
||||
static void _dpk_information(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 kidx = dpk->cur_idx[path];
|
||||
|
||||
dpk->bp[path][kidx].band = chan->band_type;
|
||||
@ -1967,7 +1986,8 @@ static void _dpk_kip_restore(struct rtw89_dev *rtwdev,
|
||||
|
||||
static void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 cur_rxbb;
|
||||
|
||||
@ -1997,7 +2017,7 @@ static void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev,
|
||||
|
||||
rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11);
|
||||
|
||||
_dpk_one_shot(rtwdev, phy, path, LBK_RXIQK);
|
||||
_dpk_one_shot(rtwdev, phy, path, LBK_RXIQK, chanctx_idx);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d LBK RXIQC = 0x%x\n", path,
|
||||
rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD));
|
||||
@ -2186,10 +2206,11 @@ static bool _dpk_sync_check(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static bool _dpk_sync(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kidx)
|
||||
enum rtw89_rf_path path, u8 kidx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
_dpk_tpg_sel(rtwdev, path, kidx);
|
||||
_dpk_one_shot(rtwdev, phy, path, SYNC);
|
||||
_dpk_one_shot(rtwdev, phy, path, SYNC, chanctx_idx);
|
||||
return _dpk_sync_check(rtwdev, path); /*1= fail*/
|
||||
}
|
||||
|
||||
@ -2242,10 +2263,10 @@ static u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev)
|
||||
|
||||
static void _dpk_gainloss(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, enum rtw89_rf_path path,
|
||||
u8 kidx)
|
||||
u8 kidx, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
_dpk_table_select(rtwdev, path, kidx, 1);
|
||||
_dpk_one_shot(rtwdev, phy, path, GAIN_LOSS);
|
||||
_dpk_one_shot(rtwdev, phy, path, GAIN_LOSS, chanctx_idx);
|
||||
}
|
||||
|
||||
#define DPK_TXAGC_LOWER 0x2e
|
||||
@ -2322,7 +2343,7 @@ static u8 _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check)
|
||||
|
||||
static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kidx, u8 init_txagc,
|
||||
bool loss_only)
|
||||
bool loss_only, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
#define DPK_AGC_ADJ_LMT 6
|
||||
#define DPK_DGAIN_UPPER 1922
|
||||
@ -2330,7 +2351,7 @@ static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
#define DPK_RXBB_UPPER 0x1f
|
||||
#define DPK_RXBB_LOWER 0
|
||||
#define DPK_GL_CRIT 7
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 tmp_txagc, tmp_rxbb = 0, tmp_gl_idx = 0;
|
||||
u8 agc_cnt = 0;
|
||||
bool limited_rxbb = false;
|
||||
@ -2344,7 +2365,7 @@ static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
do {
|
||||
switch (step) {
|
||||
case DPK_AGC_STEP_SYNC_DGAIN:
|
||||
if (_dpk_sync(rtwdev, phy, path, kidx)) {
|
||||
if (_dpk_sync(rtwdev, phy, path, kidx, chanctx_idx)) {
|
||||
tmp_txagc = DPK_TXAGC_INVAL;
|
||||
goout = true;
|
||||
break;
|
||||
@ -2380,7 +2401,8 @@ static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
if (chan->band_width < RTW89_CHANNEL_WIDTH_80)
|
||||
_dpk_bypass_rxcfir(rtwdev, path, true);
|
||||
else
|
||||
_dpk_lbk_rxiqk(rtwdev, phy, path);
|
||||
_dpk_lbk_rxiqk(rtwdev, phy, path,
|
||||
chanctx_idx);
|
||||
}
|
||||
if (dgain > DPK_DGAIN_UPPER || dgain < DPK_DGAIN_LOWER)
|
||||
step = DPK_AGC_STEP_SYNC_DGAIN;
|
||||
@ -2391,7 +2413,7 @@ static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
break;
|
||||
|
||||
case DPK_AGC_STEP_GAIN_LOSS_IDX:
|
||||
_dpk_gainloss(rtwdev, phy, path, kidx);
|
||||
_dpk_gainloss(rtwdev, phy, path, kidx, chanctx_idx);
|
||||
tmp_gl_idx = _dpk_gainloss_read(rtwdev);
|
||||
|
||||
if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, true)) ||
|
||||
@ -2475,11 +2497,12 @@ static void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, u8 order)
|
||||
}
|
||||
|
||||
static void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kidx, u8 gain)
|
||||
enum rtw89_rf_path path, u8 kidx, u8 gain,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
_dpk_set_mdpd_para(rtwdev, 0x0);
|
||||
_dpk_table_select(rtwdev, path, kidx, 1);
|
||||
_dpk_one_shot(rtwdev, phy, path, MDPK_IDL);
|
||||
_dpk_one_shot(rtwdev, phy, path, MDPK_IDL, chanctx_idx);
|
||||
}
|
||||
|
||||
static void _dpk_fill_result(struct rtw89_dev *rtwdev,
|
||||
@ -2518,10 +2541,10 @@ static void _dpk_fill_result(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
bool is_reload = false;
|
||||
u8 idx, cur_band, cur_ch;
|
||||
|
||||
@ -2545,7 +2568,8 @@ static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 gain)
|
||||
enum rtw89_rf_path path, u8 gain,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
u8 txagc = 0, kidx = dpk->cur_idx[path];
|
||||
@ -2558,16 +2582,16 @@ static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
_rf_direct_cntrl(rtwdev, path, false);
|
||||
txagc = _dpk_set_tx_pwr(rtwdev, gain, path);
|
||||
_dpk_rf_setting(rtwdev, gain, path, kidx);
|
||||
_dpk_rx_dck(rtwdev, phy, path);
|
||||
_dpk_rx_dck(rtwdev, phy, path, chanctx_idx);
|
||||
|
||||
_dpk_kip_setting(rtwdev, path, kidx);
|
||||
_dpk_manual_txcfir(rtwdev, path, true);
|
||||
txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false);
|
||||
txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false, chanctx_idx);
|
||||
if (txagc == DPK_TXAGC_INVAL)
|
||||
is_fail = true;
|
||||
_dpk_get_thermal(rtwdev, kidx, path);
|
||||
|
||||
_dpk_idl_mpa(rtwdev, phy, path, kidx, gain);
|
||||
_dpk_idl_mpa(rtwdev, phy, path, kidx, gain, chanctx_idx);
|
||||
rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
|
||||
_dpk_fill_result(rtwdev, path, kidx, gain, txagc);
|
||||
_dpk_manual_txcfir(rtwdev, path, false);
|
||||
@ -2584,7 +2608,8 @@ static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_phy_idx phy, u8 kpath)
|
||||
enum rtw89_phy_idx phy, u8 kpath,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
@ -2599,7 +2624,8 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
if (!(kpath & BIT(path)))
|
||||
continue;
|
||||
|
||||
reloaded[path] = _dpk_reload_check(rtwdev, phy, path);
|
||||
reloaded[path] = _dpk_reload_check(rtwdev, phy, path,
|
||||
chanctx_idx);
|
||||
if (!reloaded[path] && dpk->bp[path][0].ch != 0)
|
||||
dpk->cur_idx[path] = !dpk->cur_idx[path];
|
||||
else
|
||||
@ -2624,7 +2650,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
_dpk_tssi_pause(rtwdev, path, true);
|
||||
_dpk_bkup_kip(rtwdev, kip_reg, kip_bkup, path);
|
||||
_rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
|
||||
_dpk_information(rtwdev, phy, path);
|
||||
_dpk_information(rtwdev, phy, path, chanctx_idx);
|
||||
}
|
||||
|
||||
_dpk_bb_afe_setting(rtwdev, phy, path, kpath);
|
||||
@ -2633,7 +2659,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
if (!(kpath & BIT(path)) || reloaded[path])
|
||||
continue;
|
||||
|
||||
is_fail = _dpk_main(rtwdev, phy, path, 1);
|
||||
is_fail = _dpk_main(rtwdev, phy, path, 1, chanctx_idx);
|
||||
_dpk_onoff(rtwdev, path, is_fail);
|
||||
}
|
||||
|
||||
@ -2652,10 +2678,11 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
}
|
||||
}
|
||||
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_fem_info *fem = &rtwdev->fem;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
|
||||
if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
@ -2682,17 +2709,19 @@ static void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
}
|
||||
}
|
||||
|
||||
static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force)
|
||||
static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
bool force, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[DPK] ****** DPK Start (Ver: 0x%x, Cv: %d, RF_para: %d) ******\n",
|
||||
RTW8852A_DPK_VER, rtwdev->hal.cv,
|
||||
RTW8852A_RF_REL_VERSION);
|
||||
|
||||
if (_dpk_bypass_check(rtwdev, phy))
|
||||
if (_dpk_bypass_check(rtwdev, phy, chanctx_idx))
|
||||
_dpk_force_bypass(rtwdev, phy);
|
||||
else
|
||||
_dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy));
|
||||
_dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy),
|
||||
chanctx_idx);
|
||||
}
|
||||
|
||||
static void _dpk_onoff(struct rtw89_dev *rtwdev,
|
||||
@ -2815,9 +2844,8 @@ static void _dpk_track(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (band == RTW89_BAND_2G)
|
||||
@ -2826,9 +2854,9 @@ static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXA, 0x1);
|
||||
}
|
||||
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_sys_defs_tbl);
|
||||
@ -2838,9 +2866,9 @@ static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
}
|
||||
|
||||
static void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
|
||||
@ -2869,7 +2897,7 @@ static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
#define __get_val(ptr, idx) \
|
||||
({ \
|
||||
@ -2883,7 +2911,6 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
__val; \
|
||||
})
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 subband = chan->subband_type;
|
||||
const s8 *thm_up_a = NULL;
|
||||
@ -3076,9 +3103,8 @@ static void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void _tssi_pak(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 subband = chan->subband_type;
|
||||
|
||||
switch (subband) {
|
||||
@ -3252,10 +3278,9 @@ static u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch)
|
||||
}
|
||||
|
||||
static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 gidx, gidx_1st, gidx_2nd;
|
||||
s8 de_1st = 0;
|
||||
@ -3290,10 +3315,9 @@ static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
|
||||
static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 tgidx, tgidx_1st, tgidx_2nd;
|
||||
s8 tde_1st = 0;
|
||||
@ -3328,11 +3352,10 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy)
|
||||
enum rtw89_phy_idx phy, const struct rtw89_chan *chan)
|
||||
{
|
||||
#define __DE_MASK 0x003ff000
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
static const u32 r_cck_long[RF_PATH_NUM_8852A] = {0x5858, 0x7858};
|
||||
static const u32 r_cck_short[RF_PATH_NUM_8852A] = {0x5860, 0x7860};
|
||||
static const u32 r_mcs_20m[RF_PATH_NUM_8852A] = {0x5838, 0x7838};
|
||||
@ -3352,7 +3375,7 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev,
|
||||
|
||||
for (i = 0; i < RF_PATH_NUM_8852A; i++) {
|
||||
gidx = _tssi_get_cck_group(rtwdev, ch);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);
|
||||
val = tssi_info->tssi_cck[i][gidx] + trim_de;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
@ -3368,8 +3391,8 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_read32_mask(rtwdev, r_cck_long[i],
|
||||
__DE_MASK));
|
||||
|
||||
ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
|
||||
ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i, chan);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);
|
||||
val = ofdm_de + trim_de;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
@ -3458,10 +3481,10 @@ static void _tssi_track(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
}
|
||||
|
||||
static void _tssi_high_power(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void _tssi_high_power(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel, ch_tmp;
|
||||
u8 bw = chan->band_width;
|
||||
u8 band = chan->band_type;
|
||||
@ -3497,24 +3520,25 @@ static void _tssi_high_power(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
}
|
||||
|
||||
static void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
u8 path, s16 pwr_dbm, u8 enable)
|
||||
u8 path, s16 pwr_dbm, u8 enable, const struct rtw89_chan *chan)
|
||||
{
|
||||
rtw8852a_bb_set_plcp_tx(rtwdev);
|
||||
rtw8852a_bb_cfg_tx_path(rtwdev, path);
|
||||
rtw8852a_bb_set_power(rtwdev, pwr_dbm, phy);
|
||||
rtw8852a_bb_set_pmac_pkt_tx(rtwdev, enable, 20, 5000, 0, phy);
|
||||
rtw8852a_bb_set_pmac_pkt_tx(rtwdev, enable, 20, 5000, 0, phy, chan);
|
||||
}
|
||||
|
||||
static void _tssi_pre_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void _tssi_pre_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
const struct rtw89_chip_info *mac_reg = rtwdev->chip;
|
||||
u8 ch = chan->channel, ch_tmp;
|
||||
u8 bw = chan->band_width;
|
||||
u8 band = chan->band_type;
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, 0, chanctx_idx);
|
||||
s8 power;
|
||||
s16 xdbm;
|
||||
u32 i, tx_counter = 0;
|
||||
@ -3546,9 +3570,9 @@ static void _tssi_pre_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy));
|
||||
tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
|
||||
|
||||
_tssi_hw_tx(rtwdev, phy, RF_PATH_AB, xdbm, true);
|
||||
_tssi_hw_tx(rtwdev, phy, RF_PATH_AB, xdbm, true, chan);
|
||||
mdelay(15);
|
||||
_tssi_hw_tx(rtwdev, phy, RF_PATH_AB, xdbm, false);
|
||||
_tssi_hw_tx(rtwdev, phy, RF_PATH_AB, xdbm, false, chan);
|
||||
|
||||
tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD) -
|
||||
tx_counter;
|
||||
@ -3600,19 +3624,21 @@ void rtw8852a_rck(struct rtw89_dev *rtwdev)
|
||||
_rck(rtwdev, path);
|
||||
}
|
||||
|
||||
void rtw8852a_dack(struct rtw89_dev *rtwdev)
|
||||
void rtw8852a_dack(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
|
||||
_dac_cal(rtwdev, false);
|
||||
_dac_cal(rtwdev, false, chanctx_idx);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
@ -3620,34 +3646,35 @@ void rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
_iqk_init(rtwdev);
|
||||
if (rtwdev->dbcc_en)
|
||||
_iqk_dbcc(rtwdev, phy_idx);
|
||||
_iqk_dbcc(rtwdev, phy_idx, chanctx_idx);
|
||||
else
|
||||
_iqk(rtwdev, phy_idx, false);
|
||||
_iqk(rtwdev, phy_idx, false, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8852a_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
bool is_afe)
|
||||
bool is_afe, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
|
||||
|
||||
_rx_dck(rtwdev, phy_idx, is_afe);
|
||||
_rx_dck(rtwdev, phy_idx, is_afe, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
@ -3655,7 +3682,7 @@ void rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
rtwdev->dpk.is_dpk_enable = true;
|
||||
rtwdev->dpk.is_dpk_reload_en = false;
|
||||
_dpk(rtwdev, phy_idx, false);
|
||||
_dpk(rtwdev, phy_idx, false, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);
|
||||
@ -3666,8 +3693,10 @@ void rtw8852a_dpk_track(struct rtw89_dev *rtwdev)
|
||||
_dpk_track(rtwdev);
|
||||
}
|
||||
|
||||
void rtw8852a_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
void rtw8852a_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 i;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n",
|
||||
@ -3676,26 +3705,27 @@ void rtw8852a_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
_tssi_disable(rtwdev, phy);
|
||||
|
||||
for (i = RF_PATH_A; i < RF_PATH_NUM_8852A; i++) {
|
||||
_tssi_rf_setting(rtwdev, phy, i);
|
||||
_tssi_set_sys(rtwdev, phy);
|
||||
_tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i);
|
||||
_tssi_rf_setting(rtwdev, phy, i, chan);
|
||||
_tssi_set_sys(rtwdev, phy, chan);
|
||||
_tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i, chan);
|
||||
_tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i);
|
||||
_tssi_set_dck(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);
|
||||
_tssi_set_dac_gain_tbl(rtwdev, phy, i);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i);
|
||||
_tssi_set_rf_gap_tbl(rtwdev, phy, i);
|
||||
_tssi_set_slope(rtwdev, phy, i);
|
||||
_tssi_pak(rtwdev, phy, i);
|
||||
_tssi_pak(rtwdev, phy, i, chan);
|
||||
}
|
||||
|
||||
_tssi_enable(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy);
|
||||
_tssi_high_power(rtwdev, phy);
|
||||
_tssi_pre_tx(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy, chan);
|
||||
_tssi_high_power(rtwdev, phy, chan);
|
||||
_tssi_pre_tx(rtwdev, phy, chanctx_idx);
|
||||
}
|
||||
|
||||
void rtw8852a_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
void rtw8852a_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
@ -3710,14 +3740,14 @@ void rtw8852a_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
_tssi_disable(rtwdev, phy);
|
||||
|
||||
for (i = RF_PATH_A; i < RF_PATH_NUM_8852A; i++) {
|
||||
_tssi_rf_setting(rtwdev, phy, i);
|
||||
_tssi_set_sys(rtwdev, phy);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i);
|
||||
_tssi_pak(rtwdev, phy, i);
|
||||
_tssi_rf_setting(rtwdev, phy, i, chan);
|
||||
_tssi_set_sys(rtwdev, phy, chan);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);
|
||||
_tssi_pak(rtwdev, phy, i, chan);
|
||||
}
|
||||
|
||||
_tssi_enable(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy, chan);
|
||||
}
|
||||
|
||||
void rtw8852a_tssi_track(struct rtw89_dev *rtwdev)
|
||||
|
||||
@ -8,14 +8,19 @@
|
||||
#include "core.h"
|
||||
|
||||
void rtw8852a_rck(struct rtw89_dev *rtwdev);
|
||||
void rtw8852a_dack(struct rtw89_dev *rtwdev);
|
||||
void rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
void rtw8852a_dack(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852a_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
bool is_afe);
|
||||
void rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
bool is_afe, enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852a_dpk_track(struct rtw89_dev *rtwdev);
|
||||
void rtw8852a_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852a_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852a_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852a_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan);
|
||||
void rtw8852a_tssi_track(struct rtw89_dev *rtwdev);
|
||||
void rtw8852a_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
|
||||
@ -27,6 +27,7 @@ static const struct rtw89_pci_info rtw8852a_pci_info = {
|
||||
.io_rcy_tmr = MAC_AX_IO_RCY_ANA_TMR_6MS,
|
||||
.rx_ring_eq_is_full = false,
|
||||
.check_rx_tag = false,
|
||||
.no_rxbd_fs = false,
|
||||
|
||||
.init_cfg_reg = R_AX_PCIE_INIT_CFG1,
|
||||
.txhci_en_bit = B_AX_TXHCI_EN,
|
||||
@ -58,10 +59,13 @@ static const struct rtw89_pci_info rtw8852a_pci_info = {
|
||||
.enable_intr = rtw89_pci_enable_intr,
|
||||
.disable_intr = rtw89_pci_disable_intr,
|
||||
.recognize_intrs = rtw89_pci_recognize_intrs,
|
||||
|
||||
.ssid_quirks = NULL,
|
||||
};
|
||||
|
||||
static const struct rtw89_driver_info rtw89_8852ae_info = {
|
||||
.chip = &rtw8852a_chip_info,
|
||||
.variant = NULL,
|
||||
.quirks = NULL,
|
||||
.bus = {
|
||||
.pci = &rtw8852a_pci_info,
|
||||
|
||||
@ -150,6 +150,15 @@ static const struct rtw89_rrsr_cfgs rtw8852b_rrsr_cfgs = {
|
||||
.rsc = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8852b_rfkill_regs = {
|
||||
.pinmux = {R_AX_GPIO8_15_FUNC_SEL,
|
||||
B_AX_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_AX_GPIO_EXT_CTRL + 2,
|
||||
(B_AX_GPIO_MOD_9 | B_AX_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8852b_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD_V1,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
@ -245,7 +254,7 @@ static void rtw8852b_pwr_sps_ana(struct rtw89_dev *rtwdev)
|
||||
static int rtw8852b_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
u32 ret;
|
||||
int ret;
|
||||
|
||||
rtw8852b_pwr_sps_ana(rtwdev);
|
||||
|
||||
@ -374,7 +383,7 @@ func_en:
|
||||
static int rtw8852b_pwr_off_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
u32 ret;
|
||||
int ret;
|
||||
|
||||
rtw8852b_pwr_sps_ana(rtwdev);
|
||||
|
||||
@ -549,29 +558,35 @@ static void rtw8852b_rfk_init(struct rtw89_dev *rtwdev)
|
||||
|
||||
rtw8852b_dpk_init(rtwdev);
|
||||
rtw8852b_rck(rtwdev);
|
||||
rtw8852b_dack(rtwdev);
|
||||
rtw8852b_rx_dck(rtwdev, RTW89_PHY_0);
|
||||
rtw8852b_dack(rtwdev, RTW89_CHANCTX_0);
|
||||
rtw8852b_rx_dck(rtwdev, RTW89_PHY_0, RTW89_CHANCTX_0);
|
||||
}
|
||||
|
||||
static void rtw8852b_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static void rtw8852b_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
|
||||
rtw8852b_rx_dck(rtwdev, phy_idx);
|
||||
rtw8852b_iqk(rtwdev, phy_idx);
|
||||
rtw8852b_tssi(rtwdev, phy_idx, true);
|
||||
rtw8852b_dpk(rtwdev, phy_idx);
|
||||
rtw8852b_rx_dck(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8852b_iqk(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8852b_tssi(rtwdev, phy_idx, true, chanctx_idx);
|
||||
rtw8852b_dpk(rtwdev, phy_idx, chanctx_idx);
|
||||
}
|
||||
|
||||
static void rtw8852b_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
rtw8852b_tssi_scan(rtwdev, phy_idx);
|
||||
rtw8852b_tssi_scan(rtwdev, phy_idx, chan);
|
||||
}
|
||||
|
||||
static void rtw8852b_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static void rtw8852b_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
rtw8852b_wifi_scan_notify(rtwdev, start, RTW89_PHY_0);
|
||||
rtw8852b_wifi_scan_notify(rtwdev, start, rtwvif_link->phy_idx,
|
||||
rtwvif_link->chanctx_idx);
|
||||
}
|
||||
|
||||
static void rtw8852b_rfk_track(struct rtw89_dev *rtwdev)
|
||||
@ -729,9 +744,12 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {
|
||||
.get_thermal = rtw8852bx_get_thermal,
|
||||
.ctrl_btg_bt_rx = rtw8852bx_ctrl_btg_bt_rx,
|
||||
.query_ppdu = rtw8852bx_query_ppdu,
|
||||
.convert_rpl_to_rssi = rtw8852bx_convert_rpl_to_rssi,
|
||||
.phy_rpt_to_rssi = NULL,
|
||||
.ctrl_nbtg_bt_tx = rtw8852bx_ctrl_nbtg_bt_tx,
|
||||
.cfg_txrx_path = rtw8852bx_bb_cfg_txrx_path,
|
||||
.set_txpwr_ul_tb_offset = rtw8852bx_set_txpwr_ul_tb_offset,
|
||||
.digital_pwr_comp = NULL,
|
||||
.pwr_on_func = rtw8852b_pwr_on_func,
|
||||
.pwr_off_func = rtw8852b_pwr_off_func,
|
||||
.query_rxdesc = rtw89_core_query_rxdesc,
|
||||
@ -791,6 +809,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
|
||||
.wde_qempty_acq_grpnum = 4,
|
||||
.wde_qempty_mgq_grpsel = 4,
|
||||
.rf_base_addr = {0xe000, 0xf000},
|
||||
.thermal_th = {0x32, 0x35},
|
||||
.pwr_on_seq = NULL,
|
||||
.pwr_off_seq = NULL,
|
||||
.bb_table = &rtw89_8852b_phy_bb_table,
|
||||
@ -801,12 +820,14 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
|
||||
.nctl_post_table = NULL,
|
||||
.dflt_parms = &rtw89_8852b_dflt_parms,
|
||||
.rfe_parms_conf = NULL,
|
||||
.txpwr_factor_bb = 3,
|
||||
.txpwr_factor_rf = 2,
|
||||
.txpwr_factor_mac = 1,
|
||||
.dig_table = NULL,
|
||||
.dig_regs = &rtw8852b_dig_regs,
|
||||
.tssi_dbw_table = NULL,
|
||||
.support_macid_num = RTW89_MAX_MAC_ID_NUM,
|
||||
.support_link_num = 0,
|
||||
.support_chanctx_num = 0,
|
||||
.support_rnr = false,
|
||||
.support_bands = BIT(NL80211_BAND_2GHZ) |
|
||||
@ -815,9 +836,11 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
|
||||
BIT(NL80211_CHAN_WIDTH_40) |
|
||||
BIT(NL80211_CHAN_WIDTH_80),
|
||||
.support_unii4 = true,
|
||||
.support_ant_gain = true,
|
||||
.ul_tb_waveform_ctrl = true,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.hw_sec_hdr = false,
|
||||
.hw_mgmt_tx_encrypt = false,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
@ -880,6 +903,8 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
|
||||
.rrsr_cfgs = &rtw8852b_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_MAP_V1, B_BSS_CLR_MAP_VLD0},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP_V1,
|
||||
.rfkill_init = &rtw8852b_rfkill_regs,
|
||||
.rfkill_get = {R_AX_GPIO_EXT_CTRL, B_AX_GPIO_IN_9},
|
||||
.dma_ch_mask = BIT(RTW89_DMA_ACH4) | BIT(RTW89_DMA_ACH5) |
|
||||
BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
|
||||
BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
|
||||
|
||||
@ -905,7 +905,6 @@ static void rtw8852bx_ctrl_bw(struct rtw89_dev *rtwdev, u8 pri_ch, u8 bw,
|
||||
{
|
||||
enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
|
||||
u32 rx_path_0;
|
||||
u32 val;
|
||||
|
||||
rx_path_0 = rtw89_phy_read32_idx(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, phy_idx);
|
||||
|
||||
@ -985,12 +984,11 @@ static void rtw8852bx_ctrl_bw(struct rtw89_dev *rtwdev, u8 pri_ch, u8 bw,
|
||||
rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH,
|
||||
pri_ch, phy_idx);
|
||||
|
||||
/*Set RF mode at A */
|
||||
val = chip_id == RTL8852BT ? 0x333 : 0xaaa;
|
||||
/*Set RF mode at 3 */
|
||||
rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX,
|
||||
B_P0_RFMODE_ORI_RX_ALL, val, phy_idx);
|
||||
B_P0_RFMODE_ORI_RX_ALL, 0x333, phy_idx);
|
||||
rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX,
|
||||
B_P1_RFMODE_ORI_RX_ALL, val, phy_idx);
|
||||
B_P1_RFMODE_ORI_RX_ALL, 0x333, phy_idx);
|
||||
break;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "Fail to switch bw (bw:%d, pri ch:%d)\n", bw,
|
||||
@ -1208,24 +1206,25 @@ void __rtw8852bx_set_channel_bb(struct rtw89_dev *rtwdev, const struct rtw89_cha
|
||||
}
|
||||
|
||||
static u32 rtw8852bx_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx, s16 ref)
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
s16 ref, u16 pwr_ofst_decrease)
|
||||
{
|
||||
const u16 tssi_16dbm_cw = 0x12c;
|
||||
const u8 base_cw_0db = 0x27;
|
||||
const s8 ofst_int = 0;
|
||||
s16 pwr_s10_3;
|
||||
s16 rf_pwr_cw;
|
||||
u16 bb_pwr_cw;
|
||||
u32 pwr_cw;
|
||||
u32 tssi_ofst_cw;
|
||||
|
||||
pwr_s10_3 = (ref << 1) + (s16)(ofst_int) + (s16)(base_cw_0db << 3);
|
||||
pwr_s10_3 = (ref << 1) + (s16)(base_cw_0db << 3) - pwr_ofst_decrease;
|
||||
bb_pwr_cw = u16_get_bits(pwr_s10_3, GENMASK(2, 0));
|
||||
rf_pwr_cw = u16_get_bits(pwr_s10_3, GENMASK(8, 3));
|
||||
rf_pwr_cw = clamp_t(s16, rf_pwr_cw, 15, 63);
|
||||
pwr_cw = (rf_pwr_cw << 3) | bb_pwr_cw;
|
||||
|
||||
tssi_ofst_cw = (u32)((s16)tssi_16dbm_cw + (ref << 1) - (16 << 3));
|
||||
tssi_ofst_cw = (u32)((s16)tssi_16dbm_cw + (ref << 1) - (16 << 3)) -
|
||||
pwr_ofst_decrease;
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
|
||||
"[TXPWR] tssi_ofst_cw=%d rf_cw=0x%x bb_cw=0x%x\n",
|
||||
tssi_ofst_cw, rf_pwr_cw, bb_pwr_cw);
|
||||
@ -1236,10 +1235,11 @@ static u32 rtw8852bx_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void rtw8852bx_set_txpwr_ref(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
enum rtw89_phy_idx phy_idx, s16 pwr_ofst)
|
||||
{
|
||||
static const u32 addr[RF_PATH_NUM_8852BX] = {0x5800, 0x7800};
|
||||
const u32 mask = B_DPD_TSSI_CW | B_DPD_PWR_CW | B_DPD_REF;
|
||||
u16 ofst_dec[RF_PATH_NUM_8852BX];
|
||||
const u8 ofst_ofdm = 0x4;
|
||||
const u8 ofst_cck = 0x8;
|
||||
const s16 ref_ofdm = 0;
|
||||
@ -1252,19 +1252,20 @@ static void rtw8852bx_set_txpwr_ref(struct rtw89_dev *rtwdev,
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, phy_idx, R_AX_PWR_RATE_CTRL,
|
||||
B_AX_PWR_REF, 0x0);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set bb ofdm txpwr ref\n");
|
||||
val = rtw8852bx_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_ofdm);
|
||||
ofst_dec[RF_PATH_A] = pwr_ofst > 0 ? 0 : abs(pwr_ofst);
|
||||
ofst_dec[RF_PATH_B] = pwr_ofst > 0 ? pwr_ofst : 0;
|
||||
|
||||
for (i = 0; i < RF_PATH_NUM_8852BX; i++)
|
||||
rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_ofdm, mask, val,
|
||||
phy_idx);
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set bb ofdm txpwr ref\n");
|
||||
for (i = 0; i < RF_PATH_NUM_8852BX; i++) {
|
||||
val = rtw8852bx_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_ofdm, ofst_dec[i]);
|
||||
rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_ofdm, mask, val, phy_idx);
|
||||
}
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set bb cck txpwr ref\n");
|
||||
val = rtw8852bx_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_cck);
|
||||
|
||||
for (i = 0; i < RF_PATH_NUM_8852BX; i++)
|
||||
rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_cck, mask, val,
|
||||
phy_idx);
|
||||
for (i = 0; i < RF_PATH_NUM_8852BX; i++) {
|
||||
val = rtw8852bx_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_cck, ofst_dec[i]);
|
||||
rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_cck, mask, val, phy_idx);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8852bx_bb_set_tx_shape_dfir(struct rtw89_dev *rtwdev,
|
||||
@ -1335,6 +1336,16 @@ static void rtw8852bx_set_tx_shape(struct rtw89_dev *rtwdev,
|
||||
tx_shape_ofdm);
|
||||
}
|
||||
|
||||
static void rtw8852bx_set_txpwr_diff(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
s16 pwr_ofst;
|
||||
|
||||
pwr_ofst = rtw89_phy_ant_gain_pwr_offset(rtwdev, chan);
|
||||
rtw8852bx_set_txpwr_ref(rtwdev, phy_idx, pwr_ofst);
|
||||
}
|
||||
|
||||
static void __rtw8852bx_set_txpwr(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
@ -1344,12 +1355,13 @@ static void __rtw8852bx_set_txpwr(struct rtw89_dev *rtwdev,
|
||||
rtw8852bx_set_tx_shape(rtwdev, chan, phy_idx);
|
||||
rtw89_phy_set_txpwr_limit(rtwdev, chan, phy_idx);
|
||||
rtw89_phy_set_txpwr_limit_ru(rtwdev, chan, phy_idx);
|
||||
rtw8852bx_set_txpwr_diff(rtwdev, chan, phy_idx);
|
||||
}
|
||||
|
||||
static void __rtw8852bx_set_txpwr_ctrl(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
rtw8852bx_set_txpwr_ref(rtwdev, phy_idx);
|
||||
rtw8852bx_set_txpwr_ref(rtwdev, phy_idx, 0);
|
||||
}
|
||||
|
||||
static
|
||||
@ -1445,10 +1457,8 @@ static void rtw8852bx_start_pmac_tx(struct rtw89_dev *rtwdev,
|
||||
static
|
||||
void rtw8852bx_bb_set_pmac_tx(struct rtw89_dev *rtwdev,
|
||||
struct rtw8852bx_bb_pmac_info *tx_info,
|
||||
enum rtw89_phy_idx idx)
|
||||
enum rtw89_phy_idx idx, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
|
||||
if (!tx_info->en_pmac_tx) {
|
||||
rtw8852bx_stop_pmac_tx(rtwdev, tx_info, idx);
|
||||
rtw89_phy_write32_idx(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0, idx);
|
||||
@ -1473,7 +1483,7 @@ void rtw8852bx_bb_set_pmac_tx(struct rtw89_dev *rtwdev,
|
||||
static
|
||||
void __rtw8852bx_bb_set_pmac_pkt_tx(struct rtw89_dev *rtwdev, u8 enable,
|
||||
u16 tx_cnt, u16 period, u16 tx_time,
|
||||
enum rtw89_phy_idx idx)
|
||||
enum rtw89_phy_idx idx, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw8852bx_bb_pmac_info tx_info = {0};
|
||||
|
||||
@ -1484,7 +1494,7 @@ void __rtw8852bx_bb_set_pmac_pkt_tx(struct rtw89_dev *rtwdev, u8 enable,
|
||||
tx_info.period = period;
|
||||
tx_info.tx_time = tx_time;
|
||||
|
||||
rtw8852bx_bb_set_pmac_tx(rtwdev, &tx_info, idx);
|
||||
rtw8852bx_bb_set_pmac_tx(rtwdev, &tx_info, idx, chan);
|
||||
}
|
||||
|
||||
static
|
||||
@ -1623,9 +1633,9 @@ static void __rtw8852bx_ctrl_btg_bt_rx(struct rtw89_dev *rtwdev, bool en,
|
||||
|
||||
static
|
||||
void __rtw8852bx_bb_ctrl_rx_path(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_rf_path_bit rx_path)
|
||||
enum rtw89_rf_path_bit rx_path,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u32 rst_mask0;
|
||||
u32 rst_mask1;
|
||||
|
||||
@ -1713,9 +1723,10 @@ static void rtw8852bx_bb_ctrl_rf_mode_rx_path(struct rtw89_dev *rtwdev,
|
||||
static void __rtw8852bx_bb_cfg_txrx_path(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_rf_path_bit rx_path = hal->antenna_rx ? hal->antenna_rx : RF_AB;
|
||||
|
||||
rtw8852bx_bb_ctrl_rx_path(rtwdev, rx_path);
|
||||
rtw8852bx_bb_ctrl_rx_path(rtwdev, rx_path, chan);
|
||||
rtw8852bx_bb_ctrl_rf_mode_rx_path(rtwdev, rx_path);
|
||||
|
||||
if (rtwdev->hal.rx_nss == 1) {
|
||||
@ -1939,7 +1950,9 @@ static void __rtw8852bx_query_ppdu(struct rtw89_dev *rtwdev,
|
||||
u8 path;
|
||||
u8 *rx_power = phy_ppdu->rssi;
|
||||
|
||||
status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
|
||||
if (!status->signal)
|
||||
status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A],
|
||||
rx_power[RF_PATH_B]));
|
||||
for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
|
||||
status->chains |= BIT(path);
|
||||
status->chain_signal[path] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
|
||||
@ -1948,6 +1961,19 @@ static void __rtw8852bx_query_ppdu(struct rtw89_dev *rtwdev,
|
||||
rtw8852bx_fill_freq_with_ppdu(rtwdev, phy_ppdu, status);
|
||||
}
|
||||
|
||||
static void __rtw8852bx_convert_rpl_to_rssi(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_rx_phy_ppdu *phy_ppdu)
|
||||
{
|
||||
u8 delta = phy_ppdu->rpl_avg - phy_ppdu->rssi_avg;
|
||||
u8 *rssi = phy_ppdu->rssi;
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < RF_PATH_NUM_8852BX; i++)
|
||||
rssi[i] += delta;
|
||||
|
||||
phy_ppdu->rssi_avg = phy_ppdu->rpl_avg;
|
||||
}
|
||||
|
||||
static int __rtw8852bx_mac_enable_bb_rf(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
|
||||
@ -2030,6 +2056,7 @@ const struct rtw8852bx_info rtw8852bx_info = {
|
||||
.ctrl_nbtg_bt_tx = __rtw8852bx_ctrl_nbtg_bt_tx,
|
||||
.ctrl_btg_bt_rx = __rtw8852bx_ctrl_btg_bt_rx,
|
||||
.query_ppdu = __rtw8852bx_query_ppdu,
|
||||
.convert_rpl_to_rssi = __rtw8852bx_convert_rpl_to_rssi,
|
||||
.read_efuse = __rtw8852bx_read_efuse,
|
||||
.read_phycap = __rtw8852bx_read_phycap,
|
||||
.power_trim = __rtw8852bx_power_trim,
|
||||
|
||||
@ -121,13 +121,14 @@ struct rtw8852bx_info {
|
||||
void (*bb_cfg_txrx_path)(struct rtw89_dev *rtwdev);
|
||||
void (*bb_cfg_tx_path)(struct rtw89_dev *rtwdev, u8 tx_path);
|
||||
void (*bb_ctrl_rx_path)(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_rf_path_bit rx_path);
|
||||
enum rtw89_rf_path_bit rx_path,
|
||||
const struct rtw89_chan *chan);
|
||||
void (*bb_set_plcp_tx)(struct rtw89_dev *rtwdev);
|
||||
void (*bb_set_power)(struct rtw89_dev *rtwdev, s16 pwr_dbm,
|
||||
enum rtw89_phy_idx idx);
|
||||
void (*bb_set_pmac_pkt_tx)(struct rtw89_dev *rtwdev, u8 enable,
|
||||
u16 tx_cnt, u16 period, u16 tx_time,
|
||||
enum rtw89_phy_idx idx);
|
||||
enum rtw89_phy_idx idx, const struct rtw89_chan *chan);
|
||||
void (*bb_backup_tssi)(struct rtw89_dev *rtwdev, enum rtw89_phy_idx idx,
|
||||
struct rtw8852bx_bb_tssi_bak *bak);
|
||||
void (*bb_restore_tssi)(struct rtw89_dev *rtwdev, enum rtw89_phy_idx idx,
|
||||
@ -145,6 +146,8 @@ struct rtw8852bx_info {
|
||||
void (*query_ppdu)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_rx_phy_ppdu *phy_ppdu,
|
||||
struct ieee80211_rx_status *status);
|
||||
void (*convert_rpl_to_rssi)(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_rx_phy_ppdu *phy_ppdu);
|
||||
int (*read_efuse)(struct rtw89_dev *rtwdev, u8 *log_map,
|
||||
enum rtw89_efuse_block block);
|
||||
int (*read_phycap)(struct rtw89_dev *rtwdev, u8 *phycap_map);
|
||||
@ -207,9 +210,10 @@ void rtw8852bx_bb_cfg_tx_path(struct rtw89_dev *rtwdev, u8 tx_path)
|
||||
|
||||
static inline
|
||||
void rtw8852bx_bb_ctrl_rx_path(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_rf_path_bit rx_path)
|
||||
enum rtw89_rf_path_bit rx_path,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
rtw8852bx_info.bb_ctrl_rx_path(rtwdev, rx_path);
|
||||
rtw8852bx_info.bb_ctrl_rx_path(rtwdev, rx_path, chan);
|
||||
}
|
||||
|
||||
static inline
|
||||
@ -228,9 +232,10 @@ void rtw8852bx_bb_set_power(struct rtw89_dev *rtwdev, s16 pwr_dbm,
|
||||
static inline
|
||||
void rtw8852bx_bb_set_pmac_pkt_tx(struct rtw89_dev *rtwdev, u8 enable,
|
||||
u16 tx_cnt, u16 period, u16 tx_time,
|
||||
enum rtw89_phy_idx idx)
|
||||
enum rtw89_phy_idx idx, const struct rtw89_chan *chan)
|
||||
{
|
||||
rtw8852bx_info.bb_set_pmac_pkt_tx(rtwdev, enable, tx_cnt, period, tx_time, idx);
|
||||
rtw8852bx_info.bb_set_pmac_pkt_tx(rtwdev, enable, tx_cnt, period, tx_time, idx,
|
||||
chan);
|
||||
}
|
||||
|
||||
static inline
|
||||
@ -290,6 +295,13 @@ void rtw8852bx_query_ppdu(struct rtw89_dev *rtwdev,
|
||||
rtw8852bx_info.query_ppdu(rtwdev, phy_ppdu, status);
|
||||
}
|
||||
|
||||
static inline
|
||||
void rtw8852bx_convert_rpl_to_rssi(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_rx_phy_ppdu *phy_ppdu)
|
||||
{
|
||||
rtw8852bx_info.convert_rpl_to_rssi(rtwdev, phy_ppdu);
|
||||
}
|
||||
|
||||
static inline
|
||||
int rtw8852bx_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,
|
||||
enum rtw89_efuse_block block)
|
||||
|
||||
@ -1382,9 +1382,10 @@ static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u
|
||||
_iqk_info_iqk(rtwdev, phy_idx, path);
|
||||
}
|
||||
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path)
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 reg_rf18;
|
||||
u32 reg_35c;
|
||||
@ -1608,12 +1609,13 @@ static void _tmac_tx_pause(struct rtw89_dev *rtwdev, enum rtw89_phy_idx band_idx
|
||||
}
|
||||
|
||||
static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
u32 backup_rf_val[RTW8852B_IQK_SS][BACKUP_RF_REGS_NR];
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
|
||||
|
||||
@ -1623,7 +1625,7 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
iqk_info->version = RTW8852B_IQK_VER;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path, chanctx_idx);
|
||||
|
||||
_rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]);
|
||||
_rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
|
||||
@ -1638,20 +1640,21 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
|
||||
}
|
||||
|
||||
static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force)
|
||||
static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 kpath = _kpath(rtwdev, phy_idx);
|
||||
|
||||
switch (kpath) {
|
||||
case RF_A:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A, chanctx_idx);
|
||||
break;
|
||||
case RF_B:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B, chanctx_idx);
|
||||
break;
|
||||
case RF_AB:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A, chanctx_idx);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B, chanctx_idx);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1761,9 +1764,9 @@ static void _dpk_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
|
||||
u8 kidx = dpk->cur_idx[path];
|
||||
@ -1786,9 +1789,10 @@ static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
|
||||
static void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kpath)
|
||||
enum rtw89_rf_path path, u8 kpath,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_defs_tbl);
|
||||
|
||||
@ -1803,9 +1807,10 @@ static void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev,
|
||||
|
||||
static void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kpath)
|
||||
enum rtw89_rf_path path, u8 kpath,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_restore_defs_tbl);
|
||||
|
||||
@ -2217,9 +2222,9 @@ static bool _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check)
|
||||
|
||||
static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kidx, u8 init_txagc,
|
||||
bool loss_only)
|
||||
bool loss_only, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 step = DPK_AGC_STEP_SYNC_DGAIN;
|
||||
u8 tmp_txagc, tmp_rxbb = 0, tmp_gl_idx = 0;
|
||||
u8 goout = 0, agc_cnt = 0, limited_rxbb = 0;
|
||||
@ -2416,9 +2421,9 @@ static void _dpk_fill_result(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
bool is_reload = false;
|
||||
u8 idx, cur_band, cur_ch;
|
||||
@ -2443,7 +2448,8 @@ static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 gain)
|
||||
enum rtw89_rf_path path, u8 gain,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
u8 txagc = 0x38, kidx = dpk->cur_idx[path];
|
||||
@ -2464,7 +2470,7 @@ static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
_dpk_kip_set_rxagc(rtwdev, phy, path);
|
||||
_dpk_table_select(rtwdev, path, kidx, gain);
|
||||
|
||||
txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false);
|
||||
txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false, chanctx_idx);
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Adjust txagc = 0x%x\n", txagc);
|
||||
|
||||
if (txagc == 0xff) {
|
||||
@ -2491,7 +2497,8 @@ static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_phy_idx phy, u8 kpath)
|
||||
enum rtw89_phy_idx phy, u8 kpath,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
static const u32 kip_reg[] = {0x813c, 0x8124, 0x8120};
|
||||
@ -2503,7 +2510,8 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
|
||||
if (dpk->is_dpk_reload_en) {
|
||||
for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
|
||||
reloaded[path] = _dpk_reload_check(rtwdev, phy, path);
|
||||
reloaded[path] = _dpk_reload_check(rtwdev, phy, path,
|
||||
chanctx_idx);
|
||||
if (!reloaded[path] && dpk->bp[path][0].ch)
|
||||
dpk->cur_idx[path] = !dpk->cur_idx[path];
|
||||
else
|
||||
@ -2519,19 +2527,19 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
|
||||
_dpk_bkup_kip(rtwdev, kip_reg, kip_bkup, path);
|
||||
_rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
|
||||
_dpk_information(rtwdev, phy, path);
|
||||
_dpk_information(rtwdev, phy, path, chanctx_idx);
|
||||
if (rtwdev->is_tssi_mode[path])
|
||||
_dpk_tssi_pause(rtwdev, path, true);
|
||||
}
|
||||
|
||||
_dpk_bb_afe_setting(rtwdev, phy, path, kpath);
|
||||
_dpk_bb_afe_setting(rtwdev, phy, path, kpath, chanctx_idx);
|
||||
|
||||
for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
|
||||
is_fail = _dpk_main(rtwdev, phy, path, 1);
|
||||
is_fail = _dpk_main(rtwdev, phy, path, 1, chanctx_idx);
|
||||
_dpk_onoff(rtwdev, path, is_fail);
|
||||
}
|
||||
|
||||
_dpk_bb_afe_restore(rtwdev, phy, path, kpath);
|
||||
_dpk_bb_afe_restore(rtwdev, phy, path, kpath, chanctx_idx);
|
||||
_rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]);
|
||||
|
||||
for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
|
||||
@ -2543,9 +2551,10 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
}
|
||||
}
|
||||
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_fem_info *fem = &rtwdev->fem;
|
||||
|
||||
if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) {
|
||||
@ -2577,17 +2586,18 @@ static void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
}
|
||||
}
|
||||
|
||||
static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force)
|
||||
static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[DPK] ****** DPK Start (Ver: 0x%x, Cv: %d, RF_para: %d) ******\n",
|
||||
RTW8852B_DPK_VER, rtwdev->hal.cv,
|
||||
RTW8852B_RF_REL_VERSION);
|
||||
|
||||
if (_dpk_bypass_check(rtwdev, phy))
|
||||
if (_dpk_bypass_check(rtwdev, phy, chanctx_idx))
|
||||
_dpk_force_bypass(rtwdev, phy);
|
||||
else
|
||||
_dpk_cal_select(rtwdev, force, phy, RF_AB);
|
||||
_dpk_cal_select(rtwdev, force, phy, RF_AB, chanctx_idx);
|
||||
}
|
||||
|
||||
static void _dpk_track(struct rtw89_dev *rtwdev)
|
||||
@ -2722,9 +2732,8 @@ static void _set_dpd_backoff(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
}
|
||||
|
||||
static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (band == RTW89_BAND_2G)
|
||||
@ -2734,9 +2743,8 @@ static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8852b_tssi_sys_defs_tbl);
|
||||
@ -2778,7 +2786,7 @@ static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
#define RTW8852B_TSSI_GET_VAL(ptr, idx) \
|
||||
({ \
|
||||
@ -2792,7 +2800,6 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
__val; \
|
||||
})
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 subband = chan->subband_type;
|
||||
const s8 *thm_up_a = NULL;
|
||||
@ -2944,9 +2951,8 @@ static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx
|
||||
}
|
||||
|
||||
static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (path == RF_PATH_A)
|
||||
@ -2960,9 +2966,9 @@ static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
}
|
||||
|
||||
static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, bool all)
|
||||
enum rtw89_rf_path path, bool all,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
const struct rtw89_rfk_tbl *tbl = NULL;
|
||||
u8 ch = chan->channel;
|
||||
@ -3231,10 +3237,9 @@ static u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch)
|
||||
}
|
||||
|
||||
static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 gidx, gidx_1st, gidx_2nd;
|
||||
s8 de_1st;
|
||||
@ -3267,10 +3272,9 @@ static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 tgidx, tgidx_1st, tgidx_2nd;
|
||||
s8 tde_1st;
|
||||
@ -3304,10 +3308,10 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
return val;
|
||||
}
|
||||
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 gidx;
|
||||
s8 ofdm_de;
|
||||
@ -3320,7 +3324,7 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx p
|
||||
|
||||
for (i = RF_PATH_A; i < RF_PATH_NUM_8852B; i++) {
|
||||
gidx = _tssi_get_cck_group(rtwdev, ch);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);
|
||||
val = tssi_info->tssi_cck[i][gidx] + trim_de;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
@ -3336,8 +3340,8 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx p
|
||||
rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i],
|
||||
_TSSI_DE_MASK));
|
||||
|
||||
ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
|
||||
ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i, chan);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);
|
||||
val = ofdm_de + trim_de;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
@ -3383,10 +3387,10 @@ static void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_p
|
||||
}
|
||||
|
||||
static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, enum rtw89_rf_path path)
|
||||
enum rtw89_phy_idx phy, enum rtw89_rf_path path,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 channel = chan->channel;
|
||||
u8 band;
|
||||
|
||||
@ -3420,7 +3424,7 @@ static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
|
||||
|
||||
static void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u16 cnt, u16 period, s16 pwr_dbm,
|
||||
u8 enable)
|
||||
u8 enable, const struct rtw89_chan *chan)
|
||||
{
|
||||
enum rtw89_rf_path_bit rx_path;
|
||||
|
||||
@ -3436,11 +3440,11 @@ static void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
if (enable) {
|
||||
rtw8852bx_bb_set_plcp_tx(rtwdev);
|
||||
rtw8852bx_bb_cfg_tx_path(rtwdev, path);
|
||||
rtw8852bx_bb_ctrl_rx_path(rtwdev, rx_path);
|
||||
rtw8852bx_bb_ctrl_rx_path(rtwdev, rx_path, chan);
|
||||
rtw8852bx_bb_set_power(rtwdev, pwr_dbm, phy);
|
||||
}
|
||||
|
||||
rtw8852bx_bb_set_pmac_pkt_tx(rtwdev, enable, cnt, period, 20, phy);
|
||||
rtw8852bx_bb_set_pmac_pkt_tx(rtwdev, enable, cnt, period, 20, phy, chan);
|
||||
}
|
||||
|
||||
static void _tssi_backup_bb_registers(struct rtw89_dev *rtwdev,
|
||||
@ -3494,7 +3498,7 @@ static u8 _tssi_ch_to_idx(struct rtw89_dev *rtwdev, u8 channel)
|
||||
|
||||
static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, const s16 *power,
|
||||
u32 *tssi_cw_rpt)
|
||||
u32 *tssi_cw_rpt, const struct rtw89_chan *chan)
|
||||
{
|
||||
u32 tx_counter, tx_counter_tmp;
|
||||
const int retry = 100;
|
||||
@ -3513,9 +3517,10 @@ static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
_tssi_trigger[path], tmp, path);
|
||||
|
||||
if (j == 0)
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], true);
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], true, chan);
|
||||
else
|
||||
_tssi_hw_tx(rtwdev, phy, RF_PATH_ABCD, 100, 5000, power[j], true);
|
||||
_tssi_hw_tx(rtwdev, phy, RF_PATH_ABCD, 100, 5000, power[j], true,
|
||||
chan);
|
||||
|
||||
tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
|
||||
tx_counter_tmp -= tx_counter;
|
||||
@ -3546,14 +3551,14 @@ static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
"[TSSI PA K] TSSI finish bit k > %d mp:100ms normal:30us path=%d\n",
|
||||
k, path);
|
||||
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false);
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false, chan);
|
||||
return false;
|
||||
}
|
||||
|
||||
tssi_cw_rpt[j] =
|
||||
rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path], B_TSSI_CWRPT);
|
||||
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false);
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false, chan);
|
||||
|
||||
tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
|
||||
tx_counter_tmp -= tx_counter;
|
||||
@ -3567,14 +3572,13 @@ static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
}
|
||||
|
||||
static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
static const u32 bb_reg[8] = {0x5820, 0x7820, 0x4978, 0x58e4,
|
||||
0x78e4, 0x49c0, 0x0d18, 0x0d80};
|
||||
static const s16 power_2g[4] = {48, 20, 4, 4};
|
||||
static const s16 power_5g[4] = {48, 20, 4, 4};
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
s32 tssi_alim_offset_1, tssi_alim_offset_2, tssi_alim_offset_3;
|
||||
u32 tssi_cw_rpt[RTW8852B_TSSI_PATH_NR] = {0};
|
||||
u8 channel = chan->channel;
|
||||
@ -3635,7 +3639,7 @@ static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x2);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x2);
|
||||
|
||||
ok = _tssi_get_cw_report(rtwdev, phy, path, power, tssi_cw_rpt);
|
||||
ok = _tssi_get_cw_report(rtwdev, phy, path, power, tssi_cw_rpt, chan);
|
||||
if (!ok)
|
||||
goto out;
|
||||
|
||||
@ -3755,18 +3759,19 @@ void rtw8852b_rck(struct rtw89_dev *rtwdev)
|
||||
_rck(rtwdev, path);
|
||||
}
|
||||
|
||||
void rtw8852b_dack(struct rtw89_dev *rtwdev)
|
||||
void rtw8852b_dack(struct rtw89_dev *rtwdev, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
|
||||
_dac_cal(rtwdev, false);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
@ -3774,15 +3779,16 @@ void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
|
||||
|
||||
_iqk_init(rtwdev);
|
||||
_iqk(rtwdev, phy_idx, false);
|
||||
_iqk(rtwdev, phy_idx, false, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
|
||||
@ -3795,9 +3801,10 @@ void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
@ -3806,7 +3813,7 @@ void rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
rtwdev->dpk.is_dpk_enable = true;
|
||||
rtwdev->dpk.is_dpk_reload_en = false;
|
||||
_dpk(rtwdev, phy_idx, false);
|
||||
_dpk(rtwdev, phy_idx, false, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);
|
||||
@ -3817,9 +3824,11 @@ void rtw8852b_dpk_track(struct rtw89_dev *rtwdev)
|
||||
_dpk_track(rtwdev);
|
||||
}
|
||||
|
||||
void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en)
|
||||
void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
bool hwtx_en, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB, chanctx_idx);
|
||||
u32 tx_en;
|
||||
u8 i;
|
||||
|
||||
@ -3829,34 +3838,34 @@ void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_e
|
||||
_tssi_disable(rtwdev, phy);
|
||||
|
||||
for (i = RF_PATH_A; i < RF_PATH_NUM_8852B; i++) {
|
||||
_tssi_rf_setting(rtwdev, phy, i);
|
||||
_tssi_set_sys(rtwdev, phy, i);
|
||||
_tssi_rf_setting(rtwdev, phy, i, chan);
|
||||
_tssi_set_sys(rtwdev, phy, i, chan);
|
||||
_tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i);
|
||||
_tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i);
|
||||
_tssi_set_dck(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);
|
||||
_tssi_set_dac_gain_tbl(rtwdev, phy, i);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i);
|
||||
_tssi_alignment_default(rtwdev, phy, i, true);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i, chan);
|
||||
_tssi_alignment_default(rtwdev, phy, i, true, chan);
|
||||
_tssi_set_tssi_slope(rtwdev, phy, i);
|
||||
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
_tmac_tx_pause(rtwdev, phy, true);
|
||||
if (hwtx_en)
|
||||
_tssi_alimentk(rtwdev, phy, i);
|
||||
_tssi_alimentk(rtwdev, phy, i, chan);
|
||||
_tmac_tx_pause(rtwdev, phy, false);
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en);
|
||||
}
|
||||
|
||||
_tssi_enable(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy, chan);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
|
||||
}
|
||||
|
||||
void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
u8 channel = chan->channel;
|
||||
u8 band;
|
||||
@ -3879,24 +3888,25 @@ void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
_tssi_disable(rtwdev, phy);
|
||||
|
||||
for (i = RF_PATH_A; i < RTW8852B_TSSI_PATH_NR; i++) {
|
||||
_tssi_rf_setting(rtwdev, phy, i);
|
||||
_tssi_set_sys(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i);
|
||||
_tssi_rf_setting(rtwdev, phy, i, chan);
|
||||
_tssi_set_sys(rtwdev, phy, i, chan);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);
|
||||
|
||||
if (tssi_info->alignment_done[i][band])
|
||||
_tssi_alimentk_done(rtwdev, phy, i);
|
||||
_tssi_alimentk_done(rtwdev, phy, i, chan);
|
||||
else
|
||||
_tssi_alignment_default(rtwdev, phy, i, true);
|
||||
_tssi_alignment_default(rtwdev, phy, i, true, chan);
|
||||
}
|
||||
|
||||
_tssi_enable(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy, chan);
|
||||
}
|
||||
|
||||
static void rtw8852b_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, bool enable)
|
||||
enum rtw89_phy_idx phy, bool enable,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 channel = chan->channel;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n",
|
||||
@ -3904,7 +3914,7 @@ static void rtw8852b_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
|
||||
if (enable) {
|
||||
if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B])
|
||||
rtw8852b_tssi(rtwdev, phy, true);
|
||||
rtw8852b_tssi(rtwdev, phy, true, chanctx_idx);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3921,8 +3931,8 @@ static void rtw8852b_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1);
|
||||
|
||||
_tssi_alimentk_done(rtwdev, phy, RF_PATH_A);
|
||||
_tssi_alimentk_done(rtwdev, phy, RF_PATH_B);
|
||||
_tssi_alimentk_done(rtwdev, phy, RF_PATH_A, chan);
|
||||
_tssi_alimentk_done(rtwdev, phy, RF_PATH_B, chan);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n",
|
||||
@ -3935,12 +3945,13 @@ static void rtw8852b_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
void rtw8852b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
if (scan_start)
|
||||
rtw8852b_tssi_default_txagc(rtwdev, phy_idx, true);
|
||||
rtw8852b_tssi_default_txagc(rtwdev, phy_idx, true, chanctx_idx);
|
||||
else
|
||||
rtw8852b_tssi_default_txagc(rtwdev, phy_idx, false);
|
||||
rtw8852b_tssi_default_txagc(rtwdev, phy_idx, false, chanctx_idx);
|
||||
}
|
||||
|
||||
static void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
|
||||
|
||||
@ -8,16 +8,22 @@
|
||||
#include "core.h"
|
||||
|
||||
void rtw8852b_rck(struct rtw89_dev *rtwdev);
|
||||
void rtw8852b_dack(struct rtw89_dev *rtwdev);
|
||||
void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
void rtw8852b_dack(struct rtw89_dev *rtwdev, enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852b_dpk_init(struct rtw89_dev *rtwdev);
|
||||
void rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852b_dpk_track(struct rtw89_dev *rtwdev);
|
||||
void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en);
|
||||
void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
bool hwtx_en, enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan);
|
||||
void rtw8852b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852b_set_channel_rf(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
|
||||
@ -27,6 +27,7 @@ static const struct rtw89_pci_info rtw8852b_pci_info = {
|
||||
.io_rcy_tmr = MAC_AX_IO_RCY_ANA_TMR_6MS,
|
||||
.rx_ring_eq_is_full = false,
|
||||
.check_rx_tag = false,
|
||||
.no_rxbd_fs = false,
|
||||
|
||||
.init_cfg_reg = R_AX_PCIE_INIT_CFG1,
|
||||
.txhci_en_bit = B_AX_TXHCI_EN,
|
||||
@ -60,10 +61,13 @@ static const struct rtw89_pci_info rtw8852b_pci_info = {
|
||||
.enable_intr = rtw89_pci_enable_intr,
|
||||
.disable_intr = rtw89_pci_disable_intr,
|
||||
.recognize_intrs = rtw89_pci_recognize_intrs,
|
||||
|
||||
.ssid_quirks = NULL,
|
||||
};
|
||||
|
||||
static const struct rtw89_driver_info rtw89_8852be_info = {
|
||||
.chip = &rtw8852b_chip_info,
|
||||
.variant = NULL,
|
||||
.quirks = NULL,
|
||||
.bus = {
|
||||
.pci = &rtw8852b_pci_info,
|
||||
|
||||
855
sys/contrib/dev/rtw89/rtw8852bt.c
Normal file
855
sys/contrib/dev/rtw89/rtw8852bt.c
Normal file
@ -0,0 +1,855 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/* Copyright(c) 2024 Realtek Corporation
|
||||
*/
|
||||
|
||||
#include "coex.h"
|
||||
#include "fw.h"
|
||||
#include "mac.h"
|
||||
#include "phy.h"
|
||||
#include "reg.h"
|
||||
#include "rtw8852bt.h"
|
||||
#include "rtw8852bt_rfk.h"
|
||||
#include "rtw8852b_common.h"
|
||||
|
||||
#define RTW8852BT_FW_FORMAT_MAX 0
|
||||
#define RTW8852BT_FW_BASENAME "rtw89/rtw8852bt_fw"
|
||||
#define RTW8852BT_MODULE_FIRMWARE \
|
||||
RTW8852BT_FW_BASENAME ".bin"
|
||||
|
||||
static const struct rtw89_hfc_ch_cfg rtw8852bt_hfc_chcfg_pcie[] = {
|
||||
{16, 742, grp_0}, /* ACH 0 */
|
||||
{16, 742, grp_0}, /* ACH 1 */
|
||||
{16, 742, grp_0}, /* ACH 2 */
|
||||
{16, 742, grp_0}, /* ACH 3 */
|
||||
{0, 0, grp_0}, /* ACH 4 */
|
||||
{0, 0, grp_0}, /* ACH 5 */
|
||||
{0, 0, grp_0}, /* ACH 6 */
|
||||
{0, 0, grp_0}, /* ACH 7 */
|
||||
{15, 743, grp_0}, /* B0MGQ */
|
||||
{15, 743, grp_0}, /* B0HIQ */
|
||||
{0, 0, grp_0}, /* B1MGQ */
|
||||
{0, 0, grp_0}, /* B1HIQ */
|
||||
{40, 0, 0} /* FWCMDQ */
|
||||
};
|
||||
|
||||
static const struct rtw89_hfc_pub_cfg rtw8852bt_hfc_pubcfg_pcie = {
|
||||
958, /* Group 0 */
|
||||
0, /* Group 1 */
|
||||
958, /* Public Max */
|
||||
0 /* WP threshold */
|
||||
};
|
||||
|
||||
static const struct rtw89_hfc_param_ini rtw8852bt_hfc_param_ini_pcie[] = {
|
||||
[RTW89_QTA_SCC] = {rtw8852bt_hfc_chcfg_pcie, &rtw8852bt_hfc_pubcfg_pcie,
|
||||
&rtw89_mac_size.hfc_preccfg_pcie, RTW89_HCIFC_POH},
|
||||
[RTW89_QTA_DLFW] = {NULL, NULL, &rtw89_mac_size.hfc_preccfg_pcie,
|
||||
RTW89_HCIFC_POH},
|
||||
[RTW89_QTA_INVALID] = {NULL},
|
||||
};
|
||||
|
||||
static const struct rtw89_dle_mem rtw8852bt_dle_mem_pcie[] = {
|
||||
[RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size23,
|
||||
&rtw89_mac_size.ple_size9, &rtw89_mac_size.wde_qt23,
|
||||
&rtw89_mac_size.wde_qt23, &rtw89_mac_size.ple_qt57,
|
||||
&rtw89_mac_size.ple_qt59},
|
||||
[RTW89_QTA_WOW] = {RTW89_QTA_WOW, &rtw89_mac_size.wde_size23,
|
||||
&rtw89_mac_size.ple_size9, &rtw89_mac_size.wde_qt23,
|
||||
&rtw89_mac_size.wde_qt23, &rtw89_mac_size.ple_qt57,
|
||||
&rtw89_mac_size.ple_qt_52bt_wow},
|
||||
[RTW89_QTA_DLFW] = {RTW89_QTA_DLFW, &rtw89_mac_size.wde_size4,
|
||||
&rtw89_mac_size.ple_size4, &rtw89_mac_size.wde_qt4,
|
||||
&rtw89_mac_size.wde_qt4, &rtw89_mac_size.ple_qt13,
|
||||
&rtw89_mac_size.ple_qt13},
|
||||
[RTW89_QTA_INVALID] = {RTW89_QTA_INVALID, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL},
|
||||
};
|
||||
|
||||
static const u32 rtw8852bt_h2c_regs[RTW89_H2CREG_MAX] = {
|
||||
R_AX_H2CREG_DATA0, R_AX_H2CREG_DATA1, R_AX_H2CREG_DATA2,
|
||||
R_AX_H2CREG_DATA3
|
||||
};
|
||||
|
||||
static const u32 rtw8852bt_c2h_regs[RTW89_C2HREG_MAX] = {
|
||||
R_AX_C2HREG_DATA0, R_AX_C2HREG_DATA1, R_AX_C2HREG_DATA2,
|
||||
R_AX_C2HREG_DATA3
|
||||
};
|
||||
|
||||
static const u32 rtw8852bt_wow_wakeup_regs[RTW89_WOW_REASON_NUM] = {
|
||||
R_AX_C2HREG_DATA3 + 3, R_AX_C2HREG_DATA3 + 3,
|
||||
};
|
||||
|
||||
static const struct rtw89_page_regs rtw8852bt_page_regs = {
|
||||
.hci_fc_ctrl = R_AX_HCI_FC_CTRL,
|
||||
.ch_page_ctrl = R_AX_CH_PAGE_CTRL,
|
||||
.ach_page_ctrl = R_AX_ACH0_PAGE_CTRL,
|
||||
.ach_page_info = R_AX_ACH0_PAGE_INFO,
|
||||
.pub_page_info3 = R_AX_PUB_PAGE_INFO3,
|
||||
.pub_page_ctrl1 = R_AX_PUB_PAGE_CTRL1,
|
||||
.pub_page_ctrl2 = R_AX_PUB_PAGE_CTRL2,
|
||||
.pub_page_info1 = R_AX_PUB_PAGE_INFO1,
|
||||
.pub_page_info2 = R_AX_PUB_PAGE_INFO2,
|
||||
.wp_page_ctrl1 = R_AX_WP_PAGE_CTRL1,
|
||||
.wp_page_ctrl2 = R_AX_WP_PAGE_CTRL2,
|
||||
.wp_page_info1 = R_AX_WP_PAGE_INFO1,
|
||||
};
|
||||
|
||||
static const struct rtw89_reg_def rtw8852bt_dcfo_comp = {
|
||||
R_DCFO_COMP_S0, B_DCFO_COMP_S0_MSK
|
||||
};
|
||||
|
||||
static const struct rtw89_imr_info rtw8852bt_imr_info = {
|
||||
.wdrls_imr_set = B_AX_WDRLS_IMR_SET,
|
||||
.wsec_imr_reg = R_AX_SEC_DEBUG,
|
||||
.wsec_imr_set = B_AX_IMR_ERROR,
|
||||
.mpdu_tx_imr_set = 0,
|
||||
.mpdu_rx_imr_set = 0,
|
||||
.sta_sch_imr_set = B_AX_STA_SCHEDULER_IMR_SET,
|
||||
.txpktctl_imr_b0_reg = R_AX_TXPKTCTL_ERR_IMR_ISR,
|
||||
.txpktctl_imr_b0_clr = B_AX_TXPKTCTL_IMR_B0_CLR,
|
||||
.txpktctl_imr_b0_set = B_AX_TXPKTCTL_IMR_B0_SET,
|
||||
.txpktctl_imr_b1_reg = R_AX_TXPKTCTL_ERR_IMR_ISR_B1,
|
||||
.txpktctl_imr_b1_clr = B_AX_TXPKTCTL_IMR_B1_CLR,
|
||||
.txpktctl_imr_b1_set = B_AX_TXPKTCTL_IMR_B1_SET,
|
||||
.wde_imr_clr = B_AX_WDE_IMR_CLR_V01,
|
||||
.wde_imr_set = B_AX_WDE_IMR_SET_V01,
|
||||
.ple_imr_clr = B_AX_PLE_IMR_CLR,
|
||||
.ple_imr_set = B_AX_PLE_IMR_SET,
|
||||
.host_disp_imr_clr = B_AX_HOST_DISP_IMR_CLR,
|
||||
.host_disp_imr_set = B_AX_HOST_DISP_IMR_SET_V01,
|
||||
.cpu_disp_imr_clr = B_AX_CPU_DISP_IMR_CLR,
|
||||
.cpu_disp_imr_set = B_AX_CPU_DISP_IMR_SET,
|
||||
.other_disp_imr_clr = B_AX_OTHER_DISP_IMR_CLR,
|
||||
.other_disp_imr_set = 0,
|
||||
.bbrpt_com_err_imr_reg = R_AX_BBRPT_COM_ERR_IMR_ISR,
|
||||
.bbrpt_chinfo_err_imr_reg = R_AX_BBRPT_CHINFO_ERR_IMR_ISR,
|
||||
.bbrpt_err_imr_set = 0,
|
||||
.bbrpt_dfs_err_imr_reg = R_AX_BBRPT_DFS_ERR_IMR_ISR,
|
||||
.ptcl_imr_clr = B_AX_PTCL_IMR_CLR_ALL,
|
||||
.ptcl_imr_set = B_AX_PTCL_IMR_SET,
|
||||
.cdma_imr_0_reg = R_AX_DLE_CTRL,
|
||||
.cdma_imr_0_clr = B_AX_DLE_IMR_CLR,
|
||||
.cdma_imr_0_set = B_AX_DLE_IMR_SET,
|
||||
.cdma_imr_1_reg = 0,
|
||||
.cdma_imr_1_clr = 0,
|
||||
.cdma_imr_1_set = 0,
|
||||
.phy_intf_imr_reg = R_AX_PHYINFO_ERR_IMR,
|
||||
.phy_intf_imr_clr = B_AX_PHYINFO_IMR_EN_ALL,
|
||||
.phy_intf_imr_set = B_AX_PHYINFO_IMR_SET,
|
||||
.rmac_imr_reg = R_AX_RMAC_ERR_ISR,
|
||||
.rmac_imr_clr = B_AX_RMAC_IMR_CLR,
|
||||
.rmac_imr_set = B_AX_RMAC_IMR_SET,
|
||||
.tmac_imr_reg = R_AX_TMAC_ERR_IMR_ISR,
|
||||
.tmac_imr_clr = B_AX_TMAC_IMR_CLR,
|
||||
.tmac_imr_set = B_AX_TMAC_IMR_SET,
|
||||
};
|
||||
|
||||
static const struct rtw89_rrsr_cfgs rtw8852bt_rrsr_cfgs = {
|
||||
.ref_rate = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_REF_RATE_SEL, 0},
|
||||
.rsc = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8852bt_rfkill_regs = {
|
||||
.pinmux = {R_AX_GPIO8_15_FUNC_SEL,
|
||||
B_AX_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_AX_GPIO_EXT_CTRL + 2,
|
||||
(B_AX_GPIO_MOD_9 | B_AX_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8852bt_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD_V1,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
.pd_spatial_reuse_en = B_SEG0R_PD_SPATIAL_REUSE_EN_MSK_V1,
|
||||
.bmode_pd_reg = R_BMODE_PDTH_EN_V1,
|
||||
.bmode_cca_rssi_limit_en = B_BMODE_PDTH_LIMIT_EN_MSK_V1,
|
||||
.bmode_pd_lower_bound_reg = R_BMODE_PDTH_V1,
|
||||
.bmode_rssi_nocca_low_th_mask = B_BMODE_PDTH_LOWER_BOUND_MSK_V1,
|
||||
.p0_lna_init = {R_PATH0_LNA_INIT_V1, B_PATH0_LNA_INIT_IDX_MSK},
|
||||
.p1_lna_init = {R_PATH1_LNA_INIT_V1, B_PATH1_LNA_INIT_IDX_MSK},
|
||||
.p0_tia_init = {R_PATH0_TIA_INIT_V1, B_PATH0_TIA_INIT_IDX_MSK_V1},
|
||||
.p1_tia_init = {R_PATH1_TIA_INIT_V1, B_PATH1_TIA_INIT_IDX_MSK_V1},
|
||||
.p0_rxb_init = {R_PATH0_RXB_INIT_V1, B_PATH0_RXB_INIT_IDX_MSK_V1},
|
||||
.p1_rxb_init = {R_PATH1_RXB_INIT_V1, B_PATH1_RXB_INIT_IDX_MSK_V1},
|
||||
.p0_p20_pagcugc_en = {R_PATH0_P20_FOLLOW_BY_PAGCUGC_V2,
|
||||
B_PATH0_P20_FOLLOW_BY_PAGCUGC_EN_MSK},
|
||||
.p0_s20_pagcugc_en = {R_PATH0_S20_FOLLOW_BY_PAGCUGC_V2,
|
||||
B_PATH0_S20_FOLLOW_BY_PAGCUGC_EN_MSK},
|
||||
.p1_p20_pagcugc_en = {R_PATH1_P20_FOLLOW_BY_PAGCUGC_V2,
|
||||
B_PATH1_P20_FOLLOW_BY_PAGCUGC_EN_MSK},
|
||||
.p1_s20_pagcugc_en = {R_PATH1_S20_FOLLOW_BY_PAGCUGC_V2,
|
||||
B_PATH1_S20_FOLLOW_BY_PAGCUGC_EN_MSK},
|
||||
};
|
||||
|
||||
static const struct rtw89_edcca_regs rtw8852bt_edcca_regs = {
|
||||
.edcca_level = R_SEG0R_EDCCA_LVL_V1,
|
||||
.edcca_mask = B_EDCCA_LVL_MSK0,
|
||||
.edcca_p_mask = B_EDCCA_LVL_MSK1,
|
||||
.ppdu_level = R_SEG0R_EDCCA_LVL_V1,
|
||||
.ppdu_mask = B_EDCCA_LVL_MSK3,
|
||||
.rpt_a = R_EDCCA_RPT_A,
|
||||
.rpt_b = R_EDCCA_RPT_B,
|
||||
.rpt_sel = R_EDCCA_RPT_SEL,
|
||||
.rpt_sel_mask = B_EDCCA_RPT_SEL_MSK,
|
||||
.tx_collision_t2r_st = R_TX_COLLISION_T2R_ST,
|
||||
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
|
||||
};
|
||||
|
||||
static const struct rtw89_btc_rf_trx_para rtw89_btc_8852bt_rf_ul[] = {
|
||||
{255, 0, 0, 7}, /* 0 -> original */
|
||||
{255, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
|
||||
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
|
||||
{255, 0, 0, 7}, /* 3- >reserved for shared-antenna */
|
||||
{255, 0, 0, 7}, /* 4 ->reserved for shared-antenna */
|
||||
{255, 1, 0, 7}, /* the below id is for non-shared-antenna free-run */
|
||||
{6, 1, 0, 7},
|
||||
{13, 1, 0, 7},
|
||||
{13, 1, 0, 7}
|
||||
};
|
||||
|
||||
static const struct rtw89_btc_rf_trx_para rtw89_btc_8852bt_rf_dl[] = {
|
||||
{255, 0, 0, 7}, /* 0 -> original */
|
||||
{255, 2, 0, 7}, /* 1 -> reserved for shared-antenna */
|
||||
{255, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
|
||||
{255, 0, 0, 7}, /* 3- >reserved for shared-antenna */
|
||||
{255, 0, 0, 7}, /* 4 ->reserved for shared-antenna */
|
||||
{255, 1, 0, 7}, /* the below id is for non-shared-antenna free-run */
|
||||
{255, 1, 0, 7},
|
||||
{255, 1, 0, 7},
|
||||
{255, 1, 0, 7}
|
||||
};
|
||||
|
||||
static const struct rtw89_btc_fbtc_mreg rtw89_btc_8852bt_mon_reg[] = {
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda24),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda28),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda2c),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda30),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda4c),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda10),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda20),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda34),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xcef4),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0x8424),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xd200),
|
||||
RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xd220),
|
||||
RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x980),
|
||||
RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x4aa4),
|
||||
RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x4778),
|
||||
RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x476c),
|
||||
};
|
||||
|
||||
static const u8 rtw89_btc_8852bt_wl_rssi_thres[BTC_WL_RSSI_THMAX] = {70, 60, 50, 40};
|
||||
static const u8 rtw89_btc_8852bt_bt_rssi_thres[BTC_BT_RSSI_THMAX] = {50, 40, 30, 20};
|
||||
|
||||
static int rtw8852bt_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
int ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_LDO_AON_CTRL0, B_AX_PD_REGU_L);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_AFSM_WLSUS_EN |
|
||||
B_AX_AFSM_PCIE_SUS_EN);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_DIS_WLBT_PDNSUSEN_SOPC);
|
||||
rtw89_write32_set(rtwdev, R_AX_WLLPS_CTRL, B_AX_DIS_WLBT_LPSEN_LOPC);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APDM_HPDN);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
|
||||
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_OCP_L1_MASK, 7);
|
||||
|
||||
ret = read_poll_timeout(rtw89_read32, val32, val32 & B_AX_RDY_SYSPWR,
|
||||
1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFN_ONMAC);
|
||||
|
||||
ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFN_ONMAC),
|
||||
1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3);
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL,
|
||||
XTAL_SI_GND_SHDN_WL, XTAL_SI_GND_SHDN_WL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_RFC_1P3);
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL,
|
||||
XTAL_SI_SHDN_WL, XTAL_SI_SHDN_WL);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_WEI,
|
||||
XTAL_SI_OFF_WEI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_EI,
|
||||
XTAL_SI_OFF_EI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_RFC2RF);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_PON_WEI,
|
||||
XTAL_SI_PON_WEI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_PON_EI,
|
||||
XTAL_SI_PON_EI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_SRAM2RFC);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_SRAM_CTRL, 0, XTAL_SI_SRAM_DIS);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_XMD_2, 0, XTAL_SI_LDO_LPS);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_XMD_4, 0, XTAL_SI_LPS_CAP);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_ISO_EB2CORE);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B15);
|
||||
|
||||
fsleep(1000);
|
||||
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B14);
|
||||
rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
|
||||
|
||||
if (!rtwdev->efuse.valid || rtwdev->efuse.power_k_valid)
|
||||
goto func_en;
|
||||
|
||||
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VOL_L1_MASK, 0x9);
|
||||
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VREFPFM_L_MASK, 0xA);
|
||||
|
||||
func_en:
|
||||
rtw89_write32_set(rtwdev, R_AX_DMAC_FUNC_EN,
|
||||
B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN | B_AX_MPDU_PROC_EN |
|
||||
B_AX_WD_RLS_EN | B_AX_DLE_WDE_EN | B_AX_TXPKT_CTRL_EN |
|
||||
B_AX_STA_SCH_EN | B_AX_DLE_PLE_EN | B_AX_PKT_BUF_EN |
|
||||
B_AX_DMAC_TBL_EN | B_AX_PKT_IN_EN | B_AX_DLE_CPUIO_EN |
|
||||
B_AX_DISPATCHER_EN | B_AX_BBRPT_EN | B_AX_MAC_SEC_EN |
|
||||
B_AX_DMACREG_GCKEN);
|
||||
rtw89_write32_set(rtwdev, R_AX_CMAC_FUNC_EN,
|
||||
B_AX_CMAC_EN | B_AX_CMAC_TXEN | B_AX_CMAC_RXEN |
|
||||
B_AX_FORCE_CMACREG_GCKEN | B_AX_PHYINTF_EN | B_AX_CMAC_DMA_EN |
|
||||
B_AX_PTCLTOP_EN | B_AX_SCHEDULER_EN | B_AX_TMAC_EN |
|
||||
B_AX_RMAC_EN);
|
||||
|
||||
rtw89_write32_mask(rtwdev, R_AX_EECS_EESK_FUNC_SEL,
|
||||
B_AX_PINMUX_EESK_FUNC_SEL_MASK, 0x1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw8852bt_pwr_off_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_RFC2RF,
|
||||
XTAL_SI_RFC2RF);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_EI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_WEI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S0, 0, XTAL_SI_RF00);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S1, 0, XTAL_SI_RF10);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_SRAM2RFC,
|
||||
XTAL_SI_SRAM2RFC);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_EI);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_WEI);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
|
||||
rtw89_write32_clr(rtwdev, R_AX_WLRF_CTRL, B_AX_AFC_AFEDIG);
|
||||
rtw89_write8_clr(rtwdev, R_AX_SYS_FUNC_EN, B_AX_FEN_BB_GLB_RSTN | B_AX_FEN_BBRSTB);
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_RFC_1P3);
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_SHDN_WL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_clr(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3);
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_GND_SHDN_WL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
|
||||
|
||||
ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFM_OFFMAC),
|
||||
1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_SWR_CTRL1, B_AX_SYM_CTRL_SPS_PWMFREQ);
|
||||
rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_REG_ZCDC_H_MASK, 0x3);
|
||||
rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rtw8852bt_bb_reset_en(struct rtw89_dev *rtwdev, enum rtw89_band band,
|
||||
enum rtw89_phy_idx phy_idx, bool en)
|
||||
{
|
||||
if (en) {
|
||||
rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS,
|
||||
B_S0_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx);
|
||||
rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS,
|
||||
B_S1_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx);
|
||||
rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 1, phy_idx);
|
||||
if (band == RTW89_BAND_2G)
|
||||
rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x0);
|
||||
rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x0);
|
||||
} else {
|
||||
rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x1);
|
||||
rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x1);
|
||||
rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS,
|
||||
B_S0_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx);
|
||||
rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS,
|
||||
B_S1_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx);
|
||||
fsleep(1);
|
||||
rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 0, phy_idx);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8852bt_bb_reset(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
rtw89_phy_write32_mask(rtwdev, R_P0_TXPW_RSTB,
|
||||
B_P0_TXPW_RSTB_MANON | B_P0_TXPW_RSTB_TSSI, 0x1);
|
||||
rtw89_phy_write32_set(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_TRK_EN);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_RSTB,
|
||||
B_P1_TXPW_RSTB_MANON | B_P1_TXPW_RSTB_TSSI, 0x1);
|
||||
rtw89_phy_write32_set(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_TRK_EN);
|
||||
rtw8852bx_bb_reset_all(rtwdev, phy_idx);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P0_TXPW_RSTB,
|
||||
B_P0_TXPW_RSTB_MANON | B_P0_TXPW_RSTB_TSSI, 3);
|
||||
rtw89_phy_write32_clr(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_TRK_EN);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_RSTB,
|
||||
B_P1_TXPW_RSTB_MANON | B_P0_TXPW_RSTB_TSSI, 0x3);
|
||||
rtw89_phy_write32_clr(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_TRK_EN);
|
||||
}
|
||||
|
||||
static void rtw8852bt_set_channel(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_mac_idx mac_idx,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
rtw8852bx_set_channel_mac(rtwdev, chan, mac_idx);
|
||||
rtw8852bx_set_channel_bb(rtwdev, chan, phy_idx);
|
||||
rtw8852bt_set_channel_rf(rtwdev, chan, phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852bt_tssi_cont_en(struct rtw89_dev *rtwdev, bool en,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
static const u32 tssi_trk[2] = {R_P0_TSSI_TRK, R_P1_TSSI_TRK};
|
||||
|
||||
if (en)
|
||||
rtw89_phy_write32_mask(rtwdev, tssi_trk[path], B_P0_TSSI_TRK_EN, 0x0);
|
||||
else
|
||||
rtw89_phy_write32_mask(rtwdev, tssi_trk[path], B_P0_TSSI_TRK_EN, 0x1);
|
||||
}
|
||||
|
||||
static void rtw8852bt_tssi_cont_en_phyidx(struct rtw89_dev *rtwdev, bool en,
|
||||
u8 phy_idx, const struct rtw89_chan *chan)
|
||||
{
|
||||
if (!rtwdev->dbcc_en) {
|
||||
rtw8852bt_tssi_cont_en(rtwdev, en, RF_PATH_A);
|
||||
rtw8852bt_tssi_cont_en(rtwdev, en, RF_PATH_B);
|
||||
rtw8852bt_tssi_scan(rtwdev, phy_idx, chan);
|
||||
} else {
|
||||
if (phy_idx == RTW89_PHY_0)
|
||||
rtw8852bt_tssi_cont_en(rtwdev, en, RF_PATH_A);
|
||||
else
|
||||
rtw8852bt_tssi_cont_en(rtwdev, en, RF_PATH_B);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8852bt_adc_en(struct rtw89_dev *rtwdev, bool en)
|
||||
{
|
||||
if (en)
|
||||
rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0);
|
||||
else
|
||||
rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0xf);
|
||||
}
|
||||
|
||||
static void rtw8852bt_set_channel_help(struct rtw89_dev *rtwdev, bool enter,
|
||||
struct rtw89_channel_help_params *p,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_mac_idx mac_idx,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
if (enter) {
|
||||
rtw89_chip_stop_sch_tx(rtwdev, RTW89_MAC_0, &p->tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false);
|
||||
rtw8852bt_tssi_cont_en_phyidx(rtwdev, false, RTW89_PHY_0, chan);
|
||||
rtw8852bt_adc_en(rtwdev, false);
|
||||
fsleep(40);
|
||||
rtw8852bt_bb_reset_en(rtwdev, chan->band_type, phy_idx, false);
|
||||
} else {
|
||||
rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true);
|
||||
rtw8852bt_adc_en(rtwdev, true);
|
||||
rtw8852bt_tssi_cont_en_phyidx(rtwdev, true, RTW89_PHY_0, chan);
|
||||
rtw8852bt_bb_reset_en(rtwdev, chan->band_type, phy_idx, true);
|
||||
rtw89_chip_resume_sch_tx(rtwdev, RTW89_MAC_0, p->tx_en);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_init(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
rtwdev->is_tssi_mode[RF_PATH_A] = false;
|
||||
rtwdev->is_tssi_mode[RF_PATH_B] = false;
|
||||
|
||||
rtw8852bt_dpk_init(rtwdev);
|
||||
rtw8852bt_rck(rtwdev);
|
||||
rtw8852bt_dack(rtwdev, RTW89_CHANCTX_0);
|
||||
rtw8852bt_rx_dck(rtwdev, RTW89_PHY_0, RTW89_CHANCTX_0);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
|
||||
rtw8852bt_rx_dck(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8852bt_iqk(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8852bt_tssi(rtwdev, phy_idx, true, chanctx_idx);
|
||||
rtw8852bt_dpk(rtwdev, phy_idx, chanctx_idx);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
rtw8852bt_tssi_scan(rtwdev, phy_idx, chan);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
rtw8852bt_wifi_scan_notify(rtwdev, start, rtwvif_link->phy_idx,
|
||||
rtwvif_link->chanctx_idx);
|
||||
}
|
||||
|
||||
static void rtw8852bt_rfk_track(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
rtw8852bt_dpk_track(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw8852bt_btc_set_rfe(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_btc_ver *ver = rtwdev->btc.ver;
|
||||
union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo;
|
||||
|
||||
if (ver->fcxinit == 7) {
|
||||
md->md_v7.rfe_type = rtwdev->efuse.rfe_type;
|
||||
md->md_v7.kt_ver = rtwdev->hal.cv;
|
||||
md->md_v7.kt_ver_adie = rtwdev->hal.acv;
|
||||
md->md_v7.bt_solo = 0;
|
||||
md->md_v7.bt_pos = BTC_BT_BTG;
|
||||
md->md_v7.switch_type = BTC_SWITCH_INTERNAL;
|
||||
md->md_v7.wa_type = 0;
|
||||
|
||||
md->md_v7.ant.type = BTC_ANT_SHARED;
|
||||
md->md_v7.ant.num = 2;
|
||||
md->md_v7.ant.isolation = 10;
|
||||
md->md_v7.ant.diversity = 0;
|
||||
/* WL 1-stream+1-Ant is located at 0:s0(path-A) or 1:s1(path-B) */
|
||||
md->md_v7.ant.single_pos = RF_PATH_A;
|
||||
md->md_v7.ant.btg_pos = RF_PATH_B;
|
||||
|
||||
if (md->md_v7.rfe_type == 0) {
|
||||
rtwdev->btc.dm.error.map.rfe_type0 = true;
|
||||
return;
|
||||
}
|
||||
|
||||
md->md_v7.ant.num = (md->md_v7.rfe_type % 2) ? 2 : 3;
|
||||
md->md_v7.ant.stream_cnt = 2;
|
||||
md->md_v7.wa_type |= BTC_WA_INIT_SCAN;
|
||||
|
||||
if (md->md_v7.ant.num == 2) {
|
||||
md->md_v7.ant.type = BTC_ANT_SHARED;
|
||||
md->md_v7.bt_pos = BTC_BT_BTG;
|
||||
md->md_v7.wa_type |= BTC_WA_HFP_LAG;
|
||||
} else {
|
||||
md->md_v7.ant.type = BTC_ANT_DEDICATED;
|
||||
md->md_v7.bt_pos = BTC_BT_ALONE;
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
rtw8852bt_btc_set_wl_txpwr_ctrl(struct rtw89_dev *rtwdev, u32 txpwr_val)
|
||||
{
|
||||
u16 ctrl_all_time = u32_get_bits(txpwr_val, GENMASK(15, 0));
|
||||
u16 ctrl_gnt_bt = u32_get_bits(txpwr_val, GENMASK(31, 16));
|
||||
|
||||
switch (ctrl_all_time) {
|
||||
case 0xffff:
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_RATE_CTRL,
|
||||
B_AX_FORCE_PWR_BY_RATE_EN, 0x0);
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_RATE_CTRL,
|
||||
B_AX_FORCE_PWR_BY_RATE_VALUE_MASK, 0x0);
|
||||
break;
|
||||
default:
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_RATE_CTRL,
|
||||
B_AX_FORCE_PWR_BY_RATE_VALUE_MASK,
|
||||
ctrl_all_time);
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_RATE_CTRL,
|
||||
B_AX_FORCE_PWR_BY_RATE_EN, 0x1);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (ctrl_gnt_bt) {
|
||||
case 0xffff:
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_COEXT_CTRL,
|
||||
B_AX_TXAGC_BT_EN, 0x0);
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_COEXT_CTRL,
|
||||
B_AX_TXAGC_BT_MASK, 0x0);
|
||||
break;
|
||||
default:
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_COEXT_CTRL,
|
||||
B_AX_TXAGC_BT_MASK, ctrl_gnt_bt);
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, R_AX_PWR_COEXT_CTRL,
|
||||
B_AX_TXAGC_BT_EN, 0x1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct rtw89_chip_ops rtw8852bt_chip_ops = {
|
||||
.enable_bb_rf = rtw8852bx_mac_enable_bb_rf,
|
||||
.disable_bb_rf = rtw8852bx_mac_disable_bb_rf,
|
||||
.bb_preinit = NULL,
|
||||
.bb_postinit = NULL,
|
||||
.bb_reset = rtw8852bt_bb_reset,
|
||||
.bb_sethw = rtw8852bx_bb_sethw,
|
||||
.read_rf = rtw89_phy_read_rf_v1,
|
||||
.write_rf = rtw89_phy_write_rf_v1,
|
||||
.set_channel = rtw8852bt_set_channel,
|
||||
.set_channel_help = rtw8852bt_set_channel_help,
|
||||
.read_efuse = rtw8852bx_read_efuse,
|
||||
.read_phycap = rtw8852bx_read_phycap,
|
||||
.fem_setup = NULL,
|
||||
.rfe_gpio = NULL,
|
||||
.rfk_hw_init = NULL,
|
||||
.rfk_init = rtw8852bt_rfk_init,
|
||||
.rfk_init_late = NULL,
|
||||
.rfk_channel = rtw8852bt_rfk_channel,
|
||||
.rfk_band_changed = rtw8852bt_rfk_band_changed,
|
||||
.rfk_scan = rtw8852bt_rfk_scan,
|
||||
.rfk_track = rtw8852bt_rfk_track,
|
||||
.power_trim = rtw8852bx_power_trim,
|
||||
.set_txpwr = rtw8852bx_set_txpwr,
|
||||
.set_txpwr_ctrl = rtw8852bx_set_txpwr_ctrl,
|
||||
.init_txpwr_unit = rtw8852bx_init_txpwr_unit,
|
||||
.get_thermal = rtw8852bx_get_thermal,
|
||||
.ctrl_btg_bt_rx = rtw8852bx_ctrl_btg_bt_rx,
|
||||
.query_ppdu = rtw8852bx_query_ppdu,
|
||||
.convert_rpl_to_rssi = rtw8852bx_convert_rpl_to_rssi,
|
||||
.phy_rpt_to_rssi = NULL,
|
||||
.ctrl_nbtg_bt_tx = rtw8852bx_ctrl_nbtg_bt_tx,
|
||||
.cfg_txrx_path = rtw8852bx_bb_cfg_txrx_path,
|
||||
.set_txpwr_ul_tb_offset = rtw8852bx_set_txpwr_ul_tb_offset,
|
||||
.digital_pwr_comp = NULL,
|
||||
.pwr_on_func = rtw8852bt_pwr_on_func,
|
||||
.pwr_off_func = rtw8852bt_pwr_off_func,
|
||||
.query_rxdesc = rtw89_core_query_rxdesc,
|
||||
.fill_txdesc = rtw89_core_fill_txdesc,
|
||||
.fill_txdesc_fwcmd = rtw89_core_fill_txdesc,
|
||||
.cfg_ctrl_path = rtw89_mac_cfg_ctrl_path,
|
||||
.mac_cfg_gnt = rtw89_mac_cfg_gnt,
|
||||
.stop_sch_tx = rtw89_mac_stop_sch_tx,
|
||||
.resume_sch_tx = rtw89_mac_resume_sch_tx,
|
||||
.h2c_dctl_sec_cam = NULL,
|
||||
.h2c_default_cmac_tbl = rtw89_fw_h2c_default_cmac_tbl,
|
||||
.h2c_assoc_cmac_tbl = rtw89_fw_h2c_assoc_cmac_tbl,
|
||||
.h2c_ampdu_cmac_tbl = NULL,
|
||||
.h2c_default_dmac_tbl = NULL,
|
||||
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
|
||||
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
|
||||
|
||||
.btc_set_rfe = rtw8852bt_btc_set_rfe,
|
||||
.btc_init_cfg = rtw8852bx_btc_init_cfg,
|
||||
.btc_set_wl_pri = rtw8852bx_btc_set_wl_pri,
|
||||
.btc_set_wl_txpwr_ctrl = rtw8852bt_btc_set_wl_txpwr_ctrl,
|
||||
.btc_get_bt_rssi = rtw8852bx_btc_get_bt_rssi,
|
||||
.btc_update_bt_cnt = rtw8852bx_btc_update_bt_cnt,
|
||||
.btc_wl_s1_standby = rtw8852bx_btc_wl_s1_standby,
|
||||
.btc_set_wl_rx_gain = rtw8852bx_btc_set_wl_rx_gain,
|
||||
.btc_set_policy = rtw89_btc_set_policy_v1,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct wiphy_wowlan_support rtw_wowlan_stub_8852bt = {
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
|
||||
.n_patterns = RTW89_MAX_PATTERN_NUM,
|
||||
.pattern_max_len = RTW89_MAX_PATTERN_SIZE,
|
||||
.pattern_min_len = 1,
|
||||
};
|
||||
#endif
|
||||
|
||||
const struct rtw89_chip_info rtw8852bt_chip_info = {
|
||||
.chip_id = RTL8852BT,
|
||||
.chip_gen = RTW89_CHIP_AX,
|
||||
.ops = &rtw8852bt_chip_ops,
|
||||
.mac_def = &rtw89_mac_gen_ax,
|
||||
.phy_def = &rtw89_phy_gen_ax,
|
||||
.fw_basename = RTW8852BT_FW_BASENAME,
|
||||
.fw_format_max = RTW8852BT_FW_FORMAT_MAX,
|
||||
.try_ce_fw = true,
|
||||
.bbmcu_nr = 0,
|
||||
.needed_fw_elms = RTW89_AX_GEN_DEF_NEEDED_FW_ELEMENTS_NO_6GHZ,
|
||||
.fifo_size = 458752,
|
||||
.small_fifo_size = true,
|
||||
.dle_scc_rsvd_size = 98304,
|
||||
.max_amsdu_limit = 5000,
|
||||
.dis_2g_40m_ul_ofdma = true,
|
||||
.rsvd_ple_ofst = 0x6f800,
|
||||
.hfc_param_ini = rtw8852bt_hfc_param_ini_pcie,
|
||||
.dle_mem = rtw8852bt_dle_mem_pcie,
|
||||
.wde_qempty_acq_grpnum = 4,
|
||||
.wde_qempty_mgq_grpsel = 4,
|
||||
.rf_base_addr = {0xe000, 0xf000},
|
||||
.thermal_th = {0x32, 0x35},
|
||||
.pwr_on_seq = NULL,
|
||||
.pwr_off_seq = NULL,
|
||||
.bb_table = NULL,
|
||||
.bb_gain_table = NULL,
|
||||
.rf_table = {},
|
||||
.nctl_table = NULL,
|
||||
.nctl_post_table = NULL,
|
||||
.dflt_parms = NULL,
|
||||
.rfe_parms_conf = NULL,
|
||||
.txpwr_factor_bb = 3,
|
||||
.txpwr_factor_rf = 2,
|
||||
.txpwr_factor_mac = 1,
|
||||
.dig_table = NULL,
|
||||
.dig_regs = &rtw8852bt_dig_regs,
|
||||
.tssi_dbw_table = NULL,
|
||||
.support_macid_num = RTW89_MAX_MAC_ID_NUM,
|
||||
.support_link_num = 0,
|
||||
.support_chanctx_num = 1,
|
||||
.support_rnr = false,
|
||||
.support_bands = BIT(NL80211_BAND_2GHZ) |
|
||||
BIT(NL80211_BAND_5GHZ),
|
||||
.support_bandwidths = BIT(NL80211_CHAN_WIDTH_20) |
|
||||
BIT(NL80211_CHAN_WIDTH_40) |
|
||||
BIT(NL80211_CHAN_WIDTH_80),
|
||||
.support_unii4 = true,
|
||||
.support_ant_gain = true,
|
||||
.ul_tb_waveform_ctrl = true,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.hw_sec_hdr = false,
|
||||
.hw_mgmt_tx_encrypt = false,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
.acam_num = 128,
|
||||
.bcam_num = 10,
|
||||
.scam_num = 128,
|
||||
.bacam_num = 2,
|
||||
.bacam_dynamic_num = 4,
|
||||
.bacam_ver = RTW89_BACAM_V0,
|
||||
.ppdu_max_usr = 4,
|
||||
.sec_ctrl_efuse_size = 4,
|
||||
.physical_efuse_size = 1216,
|
||||
.logical_efuse_size = 2048,
|
||||
.limit_efuse_size = 1280,
|
||||
.dav_phy_efuse_size = 96,
|
||||
.dav_log_efuse_size = 16,
|
||||
.efuse_blocks = NULL,
|
||||
.phycap_addr = 0x580,
|
||||
.phycap_size = 128,
|
||||
.para_ver = 0,
|
||||
.wlcx_desired = 0x070e0000,
|
||||
.btcx_desired = 0x7,
|
||||
.scbd = 0x1,
|
||||
.mailbox = 0x1,
|
||||
|
||||
.afh_guard_ch = 6,
|
||||
.wl_rssi_thres = rtw89_btc_8852bt_wl_rssi_thres,
|
||||
.bt_rssi_thres = rtw89_btc_8852bt_bt_rssi_thres,
|
||||
.rssi_tol = 2,
|
||||
.mon_reg_num = ARRAY_SIZE(rtw89_btc_8852bt_mon_reg),
|
||||
.mon_reg = rtw89_btc_8852bt_mon_reg,
|
||||
.rf_para_ulink_num = ARRAY_SIZE(rtw89_btc_8852bt_rf_ul),
|
||||
.rf_para_ulink = rtw89_btc_8852bt_rf_ul,
|
||||
.rf_para_dlink_num = ARRAY_SIZE(rtw89_btc_8852bt_rf_dl),
|
||||
.rf_para_dlink = rtw89_btc_8852bt_rf_dl,
|
||||
.ps_mode_supported = BIT(RTW89_PS_MODE_RFOFF) |
|
||||
BIT(RTW89_PS_MODE_CLK_GATED) |
|
||||
BIT(RTW89_PS_MODE_PWR_GATED),
|
||||
.low_power_hci_modes = 0,
|
||||
.h2c_cctl_func_id = H2C_FUNC_MAC_CCTLINFO_UD,
|
||||
.hci_func_en_addr = R_AX_HCI_FUNC_EN,
|
||||
.h2c_desc_size = sizeof(struct rtw89_txwd_body),
|
||||
.txwd_body_size = sizeof(struct rtw89_txwd_body),
|
||||
.txwd_info_size = sizeof(struct rtw89_txwd_info),
|
||||
.h2c_ctrl_reg = R_AX_H2CREG_CTRL,
|
||||
.h2c_counter_reg = {R_AX_UDM1 + 1, B_AX_UDM1_HALMAC_H2C_DEQ_CNT_MASK >> 8},
|
||||
.h2c_regs = rtw8852bt_h2c_regs,
|
||||
.c2h_ctrl_reg = R_AX_C2HREG_CTRL,
|
||||
.c2h_counter_reg = {R_AX_UDM1 + 1, B_AX_UDM1_HALMAC_C2H_ENQ_CNT_MASK >> 8},
|
||||
.c2h_regs = rtw8852bt_c2h_regs,
|
||||
.page_regs = &rtw8852bt_page_regs,
|
||||
.wow_reason_reg = rtw8852bt_wow_wakeup_regs,
|
||||
.cfo_src_fd = true,
|
||||
.cfo_hw_comp = true,
|
||||
.dcfo_comp = &rtw8852bt_dcfo_comp,
|
||||
.dcfo_comp_sft = 10,
|
||||
.imr_info = &rtw8852bt_imr_info,
|
||||
.imr_dmac_table = NULL,
|
||||
.imr_cmac_table = NULL,
|
||||
.rrsr_cfgs = &rtw8852bt_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_MAP_V1, B_BSS_CLR_MAP_VLD0},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP_V1,
|
||||
.rfkill_init = &rtw8852bt_rfkill_regs,
|
||||
.rfkill_get = {R_AX_GPIO_EXT_CTRL, B_AX_GPIO_IN_9},
|
||||
.dma_ch_mask = BIT(RTW89_DMA_ACH4) | BIT(RTW89_DMA_ACH5) |
|
||||
BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
|
||||
BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
|
||||
.edcca_regs = &rtw8852bt_edcca_regs,
|
||||
#ifdef CONFIG_PM
|
||||
.wowlan_stub = &rtw_wowlan_stub_8852bt,
|
||||
#endif
|
||||
.xtal_info = NULL,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8852bt_chip_info);
|
||||
|
||||
MODULE_FIRMWARE(RTW8852BT_MODULE_FIRMWARE);
|
||||
MODULE_AUTHOR("Realtek Corporation");
|
||||
MODULE_DESCRIPTION("Realtek 802.11ax wireless 8852BT driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
@ -10,4 +10,6 @@
|
||||
#define RF_PATH_NUM_8852BT 2
|
||||
#define BB_PATH_NUM_8852BT 2
|
||||
|
||||
extern const struct rtw89_chip_info rtw8852bt_chip_info;
|
||||
|
||||
#endif
|
||||
|
||||
@ -1525,9 +1525,10 @@ static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u
|
||||
lok_result, txk_result, rxk_result);
|
||||
}
|
||||
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path)
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u8 get_empty_table = false;
|
||||
u32 reg_rf18;
|
||||
@ -1755,12 +1756,13 @@ static void _tmac_tx_pause(struct rtw89_dev *rtwdev, enum rtw89_phy_idx band_idx
|
||||
}
|
||||
|
||||
static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
u32 backup_rf_val[RTW8852BT_SS][BACKUP_RF_REGS_NR];
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
|
||||
|
||||
@ -1770,7 +1772,7 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
iqk_info->version = RTW8852BT_IQK_VER;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path, chanctx_idx);
|
||||
|
||||
_rfk_backup_bb_reg(rtwdev, backup_bb_val);
|
||||
_rfk_backup_rf_reg(rtwdev, backup_rf_val[path], path);
|
||||
@ -1785,20 +1787,21 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
|
||||
}
|
||||
|
||||
static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force)
|
||||
static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 kpath = _kpath(rtwdev, phy_idx);
|
||||
|
||||
switch (kpath) {
|
||||
case RF_A:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A, chanctx_idx);
|
||||
break;
|
||||
case RF_B:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B, chanctx_idx);
|
||||
break;
|
||||
case RF_AB:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A, chanctx_idx);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B, chanctx_idx);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1824,7 +1827,7 @@ static void _dpk_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool o
|
||||
BIT(24), val);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path,
|
||||
kidx, dpk->is_dpk_enable & off_reverse ? "enable" : "disable");
|
||||
kidx, str_enable_disable(dpk->is_dpk_enable & off_reverse));
|
||||
}
|
||||
|
||||
static void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
@ -1863,7 +1866,7 @@ static void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
id == 0x14 ? "PWR_CAL" :
|
||||
id == 0x15 ? "DPK_RXAGC" :
|
||||
id == 0x16 ? "KIP_PRESET" :
|
||||
id == 0x17 ? "KIP_RESOTRE" :
|
||||
id == 0x17 ? "KIP_RESTORE" :
|
||||
"DPK_TXAGC", dpk_cmd);
|
||||
}
|
||||
|
||||
@ -1879,9 +1882,9 @@ static void _dpk_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
|
||||
u8 kidx = dpk->cur_idx[path];
|
||||
@ -2277,9 +2280,9 @@ static bool _dpk_pas_read(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
|
||||
|
||||
static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 kidx, u8 init_txagc,
|
||||
bool loss_only)
|
||||
bool loss_only, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
u8 goout = 0, agc_cnt = 0, limited_rxbb = 0, gl_cnt = 0;
|
||||
u8 tmp_txagc, tmp_rxbb, tmp_gl_idx = 0;
|
||||
@ -2504,9 +2507,9 @@ static void _dpk_fill_result(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
u8 idx, cur_band, cur_ch;
|
||||
bool is_reload = false;
|
||||
@ -2549,7 +2552,8 @@ void _drf_direct_cntrl(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool i
|
||||
}
|
||||
|
||||
static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u8 gain)
|
||||
enum rtw89_rf_path path, u8 gain,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
u8 txagc = 0x38, kidx = dpk->cur_idx[path];
|
||||
@ -2569,7 +2573,7 @@ static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
_dpk_kip_set_rxagc(rtwdev, phy, path);
|
||||
_dpk_table_select(rtwdev, path, kidx, gain);
|
||||
|
||||
txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false);
|
||||
txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false, chanctx_idx);
|
||||
|
||||
_rfk_get_thermal(rtwdev, kidx, path);
|
||||
|
||||
@ -2601,7 +2605,8 @@ _error:
|
||||
}
|
||||
|
||||
static void _dpk_cal_select(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, u8 kpath)
|
||||
enum rtw89_phy_idx phy, u8 kpath,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
u32 backup_kip_val[BACKUP_KIP_REGS_NR];
|
||||
@ -2611,7 +2616,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev,
|
||||
u8 path;
|
||||
|
||||
for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++) {
|
||||
reloaded[path] = _dpk_reload_check(rtwdev, phy, path);
|
||||
reloaded[path] = _dpk_reload_check(rtwdev, phy, path, chanctx_idx);
|
||||
if (!reloaded[path] && dpk->bp[path][0].ch != 0)
|
||||
dpk->cur_idx[path] = !dpk->cur_idx[path];
|
||||
else
|
||||
@ -2623,7 +2628,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev,
|
||||
|
||||
for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++) {
|
||||
_rfk_backup_rf_reg(rtwdev, backup_rf_val[path], path);
|
||||
_dpk_information(rtwdev, phy, path);
|
||||
_dpk_information(rtwdev, phy, path, chanctx_idx);
|
||||
if (rtwdev->is_tssi_mode[path])
|
||||
_dpk_tssi_pause(rtwdev, path, true);
|
||||
}
|
||||
@ -2631,7 +2636,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev,
|
||||
_rfk_bb_afe_setting(rtwdev, phy, path, kpath);
|
||||
|
||||
for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++)
|
||||
_dpk_main(rtwdev, phy, path, 1);
|
||||
_dpk_main(rtwdev, phy, path, 1, chanctx_idx);
|
||||
|
||||
_rfk_bb_afe_restore(rtwdev, phy, path, kpath);
|
||||
|
||||
@ -2646,9 +2651,10 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
}
|
||||
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_fem_info *fem = &rtwdev->fem;
|
||||
|
||||
if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) {
|
||||
@ -2817,9 +2823,8 @@ static void _tssi_dpk_off(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
}
|
||||
|
||||
static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (band == RTW89_BAND_2G)
|
||||
@ -2829,9 +2834,8 @@ static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
rtw89_rfk_parser(rtwdev, &rtw8852bt_tssi_sys_defs_tbl);
|
||||
@ -2878,7 +2882,7 @@ static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
#define RTW8852BT_TSSI_GET_VAL(ptr, idx) \
|
||||
({ \
|
||||
@ -2893,7 +2897,6 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
})
|
||||
struct rtw89_fw_txpwr_track_cfg *trk = rtwdev->fw.elm_info.txpwr_trk;
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 subband = chan->subband_type;
|
||||
const s8 *thm_up_a = NULL;
|
||||
@ -3047,9 +3050,8 @@ static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx
|
||||
}
|
||||
|
||||
static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (path == RF_PATH_A)
|
||||
@ -3063,9 +3065,9 @@ static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
}
|
||||
|
||||
static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, bool all)
|
||||
enum rtw89_rf_path path, bool all,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
const struct rtw89_rfk_tbl *tbl = NULL;
|
||||
u8 ch = chan->channel;
|
||||
@ -3310,10 +3312,9 @@ static u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch)
|
||||
}
|
||||
|
||||
static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 gidx, gidx_1st, gidx_2nd;
|
||||
s8 de_1st;
|
||||
@ -3346,10 +3347,9 @@ static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u32 tgidx, tgidx_1st, tgidx_2nd;
|
||||
s8 tde_1st;
|
||||
@ -3383,10 +3383,10 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
return val;
|
||||
}
|
||||
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 gidx;
|
||||
s8 ofdm_de;
|
||||
@ -3399,7 +3399,7 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx p
|
||||
|
||||
for (i = RF_PATH_A; i < RF_PATH_NUM_8852BT; i++) {
|
||||
gidx = _tssi_get_cck_group(rtwdev, ch);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);
|
||||
val = tssi_info->tssi_cck[i][gidx] + trim_de;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
@ -3415,8 +3415,8 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx p
|
||||
rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i],
|
||||
_TSSI_DE_MASK));
|
||||
|
||||
ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
|
||||
ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i, chan);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);
|
||||
val = ofdm_de + trim_de;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
@ -3463,10 +3463,10 @@ static void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_p
|
||||
}
|
||||
|
||||
static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, enum rtw89_rf_path path)
|
||||
enum rtw89_phy_idx phy, enum rtw89_rf_path path,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 channel = chan->channel;
|
||||
u8 band;
|
||||
|
||||
@ -3500,7 +3500,7 @@ static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
|
||||
|
||||
static void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, u16 cnt, u16 period, s16 pwr_dbm,
|
||||
u8 enable)
|
||||
u8 enable, const struct rtw89_chan *chan)
|
||||
{
|
||||
enum rtw89_rf_path_bit rx_path;
|
||||
|
||||
@ -3516,11 +3516,11 @@ static void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
if (enable) {
|
||||
rtw8852bx_bb_set_plcp_tx(rtwdev);
|
||||
rtw8852bx_bb_cfg_tx_path(rtwdev, path);
|
||||
rtw8852bx_bb_ctrl_rx_path(rtwdev, rx_path);
|
||||
rtw8852bx_bb_ctrl_rx_path(rtwdev, rx_path, chan);
|
||||
rtw8852bx_bb_set_power(rtwdev, pwr_dbm, phy);
|
||||
}
|
||||
|
||||
rtw8852bx_bb_set_pmac_pkt_tx(rtwdev, enable, cnt, period, 20, phy);
|
||||
rtw8852bx_bb_set_pmac_pkt_tx(rtwdev, enable, cnt, period, 20, phy, chan);
|
||||
}
|
||||
|
||||
static void _tssi_backup_bb_registers(struct rtw89_dev *rtwdev,
|
||||
@ -3574,7 +3574,7 @@ static u8 _tssi_ch_to_idx(struct rtw89_dev *rtwdev, u8 channel)
|
||||
|
||||
static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path, const s16 *power,
|
||||
u32 *tssi_cw_rpt)
|
||||
u32 *tssi_cw_rpt, const struct rtw89_chan *chan)
|
||||
{
|
||||
u32 tx_counter, tx_counter_tmp;
|
||||
const int retry = 100;
|
||||
@ -3593,9 +3593,11 @@ static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
_tssi_trigger[path], tmp, path);
|
||||
|
||||
if (j == 0)
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], true);
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], true,
|
||||
chan);
|
||||
else
|
||||
_tssi_hw_tx(rtwdev, phy, RF_PATH_ABCD, 100, 5000, power[j], true);
|
||||
_tssi_hw_tx(rtwdev, phy, RF_PATH_ABCD, 100, 5000, power[j], true,
|
||||
chan);
|
||||
|
||||
tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
|
||||
tx_counter_tmp -= tx_counter;
|
||||
@ -3626,7 +3628,7 @@ static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
"[TSSI PA K] TSSI finish bit k > %d mp:100ms normal:30us path=%d\n",
|
||||
k, path);
|
||||
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false);
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false, chan);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -3634,7 +3636,7 @@ static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path],
|
||||
B_TSSI_CWRPT);
|
||||
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false);
|
||||
_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false, chan);
|
||||
|
||||
tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
|
||||
tx_counter_tmp -= tx_counter;
|
||||
@ -3648,14 +3650,13 @@ static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
}
|
||||
|
||||
static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
static const u32 bb_reg[8] = {0x5820, 0x7820, 0x4978, 0x58e4,
|
||||
0x78e4, 0x49c0, 0x0d18, 0x0d80};
|
||||
static const s16 power_2g[4] = {48, 20, 4, -8};
|
||||
static const s16 power_5g[4] = {48, 20, 4, 4};
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
s32 tssi_alim_offset_1, tssi_alim_offset_2, tssi_alim_offset_3;
|
||||
u32 tssi_cw_rpt[RTW8852BT_TSSI_PATH_NR] = {};
|
||||
u8 channel = chan->channel;
|
||||
@ -3701,7 +3702,7 @@ static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x2);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x2);
|
||||
|
||||
ok = _tssi_get_cw_report(rtwdev, phy, path, power, tssi_cw_rpt);
|
||||
ok = _tssi_get_cw_report(rtwdev, phy, path, power, tssi_cw_rpt, chan);
|
||||
if (!ok)
|
||||
goto out;
|
||||
|
||||
@ -3833,18 +3834,19 @@ void rtw8852bt_rck(struct rtw89_dev *rtwdev)
|
||||
_rck(rtwdev, path);
|
||||
}
|
||||
|
||||
void rtw8852bt_dack(struct rtw89_dev *rtwdev)
|
||||
void rtw8852bt_dack(struct rtw89_dev *rtwdev, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
|
||||
_dac_cal(rtwdev, false);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
@ -3852,15 +3854,16 @@ void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
|
||||
|
||||
_iqk_init(rtwdev);
|
||||
_iqk(rtwdev, phy_idx, false);
|
||||
_iqk(rtwdev, phy_idx, false, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8852bt_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8852bt_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
|
||||
@ -3873,15 +3876,16 @@ void rtw8852bt_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8852bt_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8852bt_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[DPK] ****** DPK Start (Ver: 0x%x) ******\n", RTW8852BT_DPK_VER);
|
||||
|
||||
if (_dpk_bypass_check(rtwdev, phy_idx))
|
||||
if (_dpk_bypass_check(rtwdev, phy_idx, chanctx_idx))
|
||||
_dpk_force_bypass(rtwdev, phy_idx);
|
||||
else
|
||||
_dpk_cal_select(rtwdev, phy_idx, RF_AB);
|
||||
_dpk_cal_select(rtwdev, phy_idx, RF_AB, chanctx_idx);
|
||||
}
|
||||
|
||||
void rtw8852bt_dpk_track(struct rtw89_dev *rtwdev)
|
||||
@ -3889,10 +3893,12 @@ void rtw8852bt_dpk_track(struct rtw89_dev *rtwdev)
|
||||
_dpk_track(rtwdev);
|
||||
}
|
||||
|
||||
void rtw8852bt_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en)
|
||||
void rtw8852bt_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
bool hwtx_en, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
static const u32 reg[2] = {R_DPD_CH0A, R_DPD_CH0B};
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB, chanctx_idx);
|
||||
u32 reg_backup[2] = {};
|
||||
u32 tx_en;
|
||||
u8 i;
|
||||
@ -3905,36 +3911,36 @@ void rtw8852bt_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_
|
||||
_tssi_disable(rtwdev, phy);
|
||||
|
||||
for (i = RF_PATH_A; i < RF_PATH_NUM_8852BT; i++) {
|
||||
_tssi_rf_setting(rtwdev, phy, i);
|
||||
_tssi_set_sys(rtwdev, phy, i);
|
||||
_tssi_rf_setting(rtwdev, phy, i, chan);
|
||||
_tssi_set_sys(rtwdev, phy, i, chan);
|
||||
_tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i);
|
||||
_tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i);
|
||||
_tssi_set_dck(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);
|
||||
_tssi_set_dac_gain_tbl(rtwdev, phy, i);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i);
|
||||
_tssi_alignment_default(rtwdev, phy, i, true);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i, chan);
|
||||
_tssi_alignment_default(rtwdev, phy, i, true, chan);
|
||||
_tssi_set_tssi_slope(rtwdev, phy, i);
|
||||
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
_tmac_tx_pause(rtwdev, phy, true);
|
||||
if (hwtx_en)
|
||||
_tssi_alimentk(rtwdev, phy, i);
|
||||
_tssi_alimentk(rtwdev, phy, i, chan);
|
||||
_tmac_tx_pause(rtwdev, phy, false);
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en);
|
||||
}
|
||||
|
||||
_tssi_enable(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy, chan);
|
||||
|
||||
_tssi_reload_bb_registers(rtwdev, phy, reg, reg_backup, 2);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
|
||||
}
|
||||
|
||||
void rtw8852bt_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
void rtw8852bt_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
u8 channel = chan->channel;
|
||||
u8 band;
|
||||
@ -3957,24 +3963,25 @@ void rtw8852bt_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
_tssi_disable(rtwdev, phy);
|
||||
|
||||
for (i = RF_PATH_A; i < RTW8852BT_TSSI_PATH_NR; i++) {
|
||||
_tssi_rf_setting(rtwdev, phy, i);
|
||||
_tssi_set_sys(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i);
|
||||
_tssi_rf_setting(rtwdev, phy, i, chan);
|
||||
_tssi_set_sys(rtwdev, phy, i, chan);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);
|
||||
|
||||
if (tssi_info->alignment_done[i][band])
|
||||
_tssi_alimentk_done(rtwdev, phy, i);
|
||||
_tssi_alimentk_done(rtwdev, phy, i, chan);
|
||||
else
|
||||
_tssi_alignment_default(rtwdev, phy, i, true);
|
||||
_tssi_alignment_default(rtwdev, phy, i, true, chan);
|
||||
}
|
||||
|
||||
_tssi_enable(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy, chan);
|
||||
}
|
||||
|
||||
static void rtw8852bt_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, bool enable)
|
||||
enum rtw89_phy_idx phy, bool enable,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 channel = chan->channel;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n",
|
||||
@ -3996,8 +4003,8 @@ static void rtw8852bt_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0);
|
||||
rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1);
|
||||
|
||||
_tssi_alimentk_done(rtwdev, phy, RF_PATH_A);
|
||||
_tssi_alimentk_done(rtwdev, phy, RF_PATH_B);
|
||||
_tssi_alimentk_done(rtwdev, phy, RF_PATH_A, chan);
|
||||
_tssi_alimentk_done(rtwdev, phy, RF_PATH_B, chan);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n",
|
||||
@ -4010,10 +4017,237 @@ static void rtw8852bt_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
void rtw8852bt_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
if (scan_start)
|
||||
rtw8852bt_tssi_default_txagc(rtwdev, phy_idx, true);
|
||||
rtw8852bt_tssi_default_txagc(rtwdev, phy_idx, true, chanctx_idx);
|
||||
else
|
||||
rtw8852bt_tssi_default_txagc(rtwdev, phy_idx, false);
|
||||
rtw8852bt_tssi_default_txagc(rtwdev, phy_idx, false, chanctx_idx);
|
||||
}
|
||||
|
||||
static void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
|
||||
enum rtw89_bandwidth bw, bool dav)
|
||||
{
|
||||
u32 rf_reg18;
|
||||
u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__);
|
||||
|
||||
rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK);
|
||||
if (rf_reg18 == INV_RF_DATA) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[RFK]Invalid RF_0x18 for Path-%d\n", path);
|
||||
return;
|
||||
}
|
||||
rf_reg18 &= ~RR_CFGCH_BW;
|
||||
|
||||
switch (bw) {
|
||||
case RTW89_CHANNEL_WIDTH_5:
|
||||
case RTW89_CHANNEL_WIDTH_10:
|
||||
case RTW89_CHANNEL_WIDTH_20:
|
||||
rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_20M);
|
||||
break;
|
||||
case RTW89_CHANNEL_WIDTH_40:
|
||||
rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_40M);
|
||||
break;
|
||||
case RTW89_CHANNEL_WIDTH_80:
|
||||
rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_80M);
|
||||
break;
|
||||
default:
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]Fail to set CH\n");
|
||||
}
|
||||
|
||||
rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN |
|
||||
RR_CFGCH_BW2) & RFREG_MASK;
|
||||
rf_reg18 |= RR_CFGCH_BW2;
|
||||
rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set %x at path%d, %x =0x%x\n",
|
||||
bw, path, reg18_addr,
|
||||
rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK));
|
||||
}
|
||||
|
||||
static void _ctrl_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_bandwidth bw)
|
||||
{
|
||||
_bw_setting(rtwdev, RF_PATH_A, bw, true);
|
||||
_bw_setting(rtwdev, RF_PATH_B, bw, true);
|
||||
_bw_setting(rtwdev, RF_PATH_A, bw, false);
|
||||
_bw_setting(rtwdev, RF_PATH_B, bw, false);
|
||||
}
|
||||
|
||||
static bool _set_s0_arfc18(struct rtw89_dev *rtwdev, u32 val)
|
||||
{
|
||||
u32 tmp;
|
||||
int ret;
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK, val);
|
||||
|
||||
ret = read_poll_timeout_atomic(rtw89_read_rf, tmp, tmp == 0, 1, 1000,
|
||||
false, rtwdev, RF_PATH_A, RR_LPF, RR_LPF_BUSY);
|
||||
if (ret)
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]LCK timeout\n");
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
|
||||
return !!ret;
|
||||
}
|
||||
|
||||
static void _lck_check(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN MMD reset\n");
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x1);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x0);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x1);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x0);
|
||||
}
|
||||
|
||||
udelay(10);
|
||||
|
||||
if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]re-set RF 0x18\n");
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
|
||||
tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
|
||||
_set_s0_arfc18(rtwdev, tmp);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
|
||||
}
|
||||
|
||||
if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN off/on\n");
|
||||
|
||||
tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK, tmp);
|
||||
tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK, tmp);
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x1);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x0);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x3);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x0);
|
||||
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
|
||||
tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
|
||||
_set_s0_arfc18(rtwdev, tmp);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]0xb2=%x, 0xc5=%x\n",
|
||||
rtw89_read_rf(rtwdev, RF_PATH_A, RR_VCO, RFREG_MASK),
|
||||
rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RFREG_MASK));
|
||||
}
|
||||
}
|
||||
|
||||
static void _set_ch(struct rtw89_dev *rtwdev, u32 val)
|
||||
{
|
||||
bool timeout;
|
||||
u32 bak;
|
||||
|
||||
bak = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RR_LDO_SEL, 0x1);
|
||||
timeout = _set_s0_arfc18(rtwdev, val);
|
||||
rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK, bak);
|
||||
if (!timeout)
|
||||
_lck_check(rtwdev);
|
||||
}
|
||||
|
||||
static void _ch_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
|
||||
u8 central_ch, bool dav)
|
||||
{
|
||||
u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1;
|
||||
bool is_2g_ch = central_ch <= 14;
|
||||
u32 rf_reg18;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__);
|
||||
|
||||
rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK);
|
||||
rf_reg18 &= ~(RR_CFGCH_BAND1 | RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH |
|
||||
RR_CFGCH_BCN | RR_CFGCH_BAND0 | RR_CFGCH_CH);
|
||||
rf_reg18 |= FIELD_PREP(RR_CFGCH_CH, central_ch);
|
||||
|
||||
if (!is_2g_ch)
|
||||
rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_5G) |
|
||||
FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_5G);
|
||||
|
||||
rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN |
|
||||
RR_CFGCH_BW2) & RFREG_MASK;
|
||||
rf_reg18 |= RR_CFGCH_BW2;
|
||||
|
||||
if (path == RF_PATH_A && dav)
|
||||
_set_ch(rtwdev, rf_reg18);
|
||||
else
|
||||
rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18);
|
||||
|
||||
rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 0);
|
||||
rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 1);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[RFK]CH: %d for Path-%d, reg0x%x = 0x%x\n",
|
||||
central_ch, path, reg18_addr,
|
||||
rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK));
|
||||
}
|
||||
|
||||
static void _ctrl_ch(struct rtw89_dev *rtwdev, u8 central_ch)
|
||||
{
|
||||
_ch_setting(rtwdev, RF_PATH_A, central_ch, true);
|
||||
_ch_setting(rtwdev, RF_PATH_B, central_ch, true);
|
||||
_ch_setting(rtwdev, RF_PATH_A, central_ch, false);
|
||||
_ch_setting(rtwdev, RF_PATH_B, central_ch, false);
|
||||
}
|
||||
|
||||
static void _set_rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_bandwidth bw,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x1);
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M2, 0x12);
|
||||
|
||||
if (bw == RTW89_CHANNEL_WIDTH_20)
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x1b);
|
||||
else if (bw == RTW89_CHANNEL_WIDTH_40)
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x13);
|
||||
else if (bw == RTW89_CHANNEL_WIDTH_80)
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0xb);
|
||||
else
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x3);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set S%d RXBB BW 0x3F = 0x%x\n",
|
||||
path, rtw89_read_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB));
|
||||
|
||||
rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x0);
|
||||
}
|
||||
|
||||
static void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_bandwidth bw)
|
||||
{
|
||||
u8 kpath, path;
|
||||
|
||||
kpath = _kpath(rtwdev, phy);
|
||||
|
||||
for (path = 0; path < RF_PATH_NUM_8852BT; path++) {
|
||||
if (!(kpath & BIT(path)))
|
||||
continue;
|
||||
|
||||
_set_rxbb_bw(rtwdev, bw, path);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8852bt_ctrl_bw_ch(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, u8 central_ch,
|
||||
enum rtw89_band band, enum rtw89_bandwidth bw)
|
||||
{
|
||||
_ctrl_ch(rtwdev, central_ch);
|
||||
_ctrl_bw(rtwdev, phy, bw);
|
||||
_rxbb_bw(rtwdev, phy, bw);
|
||||
}
|
||||
|
||||
void rtw8852bt_set_channel_rf(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
rtw8852bt_ctrl_bw_ch(rtwdev, phy_idx, chan->channel, chan->band_type,
|
||||
chan->band_width);
|
||||
}
|
||||
|
||||
@ -8,15 +8,24 @@
|
||||
#include "core.h"
|
||||
|
||||
void rtw8852bt_rck(struct rtw89_dev *rtwdev);
|
||||
void rtw8852bt_dack(struct rtw89_dev *rtwdev);
|
||||
void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
void rtw8852bt_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
void rtw8852bt_dack(struct rtw89_dev *rtwdev, enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852bt_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852bt_dpk_init(struct rtw89_dev *rtwdev);
|
||||
void rtw8852bt_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852bt_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852bt_dpk_track(struct rtw89_dev *rtwdev);
|
||||
void rtw8852bt_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en);
|
||||
void rtw8852bt_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852bt_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
bool hwtx_en, enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852bt_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan);
|
||||
void rtw8852bt_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852bt_set_channel_rf(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
|
||||
#endif
|
||||
|
||||
103
sys/contrib/dev/rtw89/rtw8852bte.c
Normal file
103
sys/contrib/dev/rtw89/rtw8852bte.c
Normal file
@ -0,0 +1,103 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/* Copyright(c) 2024 Realtek Corporation
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "pci.h"
|
||||
#include "reg.h"
|
||||
#include "rtw8852bt.h"
|
||||
|
||||
static const struct rtw89_pci_ssid_quirk rtw8852bt_pci_ssid_quirks[] = {
|
||||
{RTW89_PCI_SSID(PCI_VENDOR_ID_REALTEK, 0xB520, 0x103C, 0x88E9, HP),
|
||||
.bitmap = BIT(RTW89_QUIRK_THERMAL_PROT_110C)},
|
||||
{},
|
||||
};
|
||||
|
||||
static const struct rtw89_pci_info rtw8852bt_pci_info = {
|
||||
.gen_def = &rtw89_pci_gen_ax,
|
||||
.txbd_trunc_mode = MAC_AX_BD_TRUNC,
|
||||
.rxbd_trunc_mode = MAC_AX_BD_TRUNC,
|
||||
.rxbd_mode = MAC_AX_RXBD_PKT,
|
||||
.tag_mode = MAC_AX_TAG_MULTI,
|
||||
.tx_burst = MAC_AX_TX_BURST_2048B,
|
||||
.rx_burst = MAC_AX_RX_BURST_128B,
|
||||
.wd_dma_idle_intvl = MAC_AX_WD_DMA_INTVL_256NS,
|
||||
.wd_dma_act_intvl = MAC_AX_WD_DMA_INTVL_256NS,
|
||||
.multi_tag_num = MAC_AX_TAG_NUM_8,
|
||||
.lbc_en = MAC_AX_PCIE_ENABLE,
|
||||
.lbc_tmr = MAC_AX_LBC_TMR_2MS,
|
||||
.autok_en = MAC_AX_PCIE_DISABLE,
|
||||
.io_rcy_en = MAC_AX_PCIE_DISABLE,
|
||||
.io_rcy_tmr = MAC_AX_IO_RCY_ANA_TMR_6MS,
|
||||
.rx_ring_eq_is_full = false,
|
||||
.check_rx_tag = false,
|
||||
.no_rxbd_fs = false,
|
||||
|
||||
.init_cfg_reg = R_AX_PCIE_INIT_CFG1,
|
||||
.txhci_en_bit = B_AX_TXHCI_EN,
|
||||
.rxhci_en_bit = B_AX_RXHCI_EN,
|
||||
.rxbd_mode_bit = B_AX_RXBD_MODE,
|
||||
.exp_ctrl_reg = R_AX_PCIE_EXP_CTRL,
|
||||
.max_tag_num_mask = B_AX_MAX_TAG_NUM,
|
||||
.rxbd_rwptr_clr_reg = R_AX_RXBD_RWPTR_CLR,
|
||||
.txbd_rwptr_clr2_reg = 0,
|
||||
.dma_io_stop = {R_AX_PCIE_DMA_STOP1, B_AX_STOP_PCIEIO},
|
||||
.dma_stop1 = {R_AX_PCIE_DMA_STOP1, B_AX_TX_STOP1_MASK_V1},
|
||||
.dma_stop2 = {0},
|
||||
.dma_busy1 = {R_AX_PCIE_DMA_BUSY1, DMA_BUSY1_CHECK_V1},
|
||||
.dma_busy2_reg = 0,
|
||||
.dma_busy3_reg = R_AX_PCIE_DMA_BUSY1,
|
||||
|
||||
.rpwm_addr = R_AX_PCIE_HRPWM,
|
||||
.cpwm_addr = R_AX_CPWM,
|
||||
.mit_addr = R_AX_INT_MIT_RX,
|
||||
.wp_sel_addr = 0,
|
||||
.tx_dma_ch_mask = BIT(RTW89_TXCH_ACH4) | BIT(RTW89_TXCH_ACH5) |
|
||||
BIT(RTW89_TXCH_ACH6) | BIT(RTW89_TXCH_ACH7) |
|
||||
BIT(RTW89_TXCH_CH10) | BIT(RTW89_TXCH_CH11),
|
||||
.bd_idx_addr_low_power = NULL,
|
||||
.dma_addr_set = &rtw89_pci_ch_dma_addr_set,
|
||||
.bd_ram_table = &rtw89_bd_ram_table_single,
|
||||
|
||||
.ltr_set = rtw89_pci_ltr_set,
|
||||
.fill_txaddr_info = rtw89_pci_fill_txaddr_info,
|
||||
.config_intr_mask = rtw89_pci_config_intr_mask,
|
||||
.enable_intr = rtw89_pci_enable_intr,
|
||||
.disable_intr = rtw89_pci_disable_intr,
|
||||
.recognize_intrs = rtw89_pci_recognize_intrs,
|
||||
|
||||
.ssid_quirks = rtw8852bt_pci_ssid_quirks,
|
||||
};
|
||||
|
||||
static const struct rtw89_driver_info rtw89_8852bte_info = {
|
||||
.chip = &rtw8852bt_chip_info,
|
||||
.variant = NULL,
|
||||
.quirks = NULL,
|
||||
.bus = {
|
||||
.pci = &rtw8852bt_pci_info,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct pci_device_id rtw89_8852bte_id_table[] = {
|
||||
{
|
||||
PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xb520),
|
||||
.driver_data = (kernel_ulong_t)&rtw89_8852bte_info,
|
||||
},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, rtw89_8852bte_id_table);
|
||||
|
||||
static struct pci_driver rtw89_8852bte_driver = {
|
||||
.name = "rtw89_8852bte",
|
||||
.id_table = rtw89_8852bte_id_table,
|
||||
.probe = rtw89_pci_probe,
|
||||
.remove = rtw89_pci_remove,
|
||||
.driver.pm = &rtw89_pm_ops,
|
||||
};
|
||||
module_pci_driver(rtw89_8852bte_driver);
|
||||
|
||||
MODULE_AUTHOR("Realtek Corporation");
|
||||
MODULE_DESCRIPTION("Realtek 802.11ax wireless 8852BE-VT driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
@ -14,10 +14,10 @@
|
||||
#include "rtw8852c_table.h"
|
||||
#include "util.h"
|
||||
|
||||
#define RTW8852C_FW_FORMAT_MAX 0
|
||||
#define RTW8852C_FW_FORMAT_MAX 1
|
||||
#define RTW8852C_FW_BASENAME "rtw89/rtw8852c_fw"
|
||||
#define RTW8852C_MODULE_FIRMWARE \
|
||||
RTW8852C_FW_BASENAME ".bin"
|
||||
RTW8852C_FW_BASENAME "-" __stringify(RTW8852C_FW_FORMAT_MAX) ".bin"
|
||||
|
||||
static const struct rtw89_hfc_ch_cfg rtw8852c_hfc_chcfg_pcie[] = {
|
||||
{13, 1614, grp_0}, /* ACH 0 */
|
||||
@ -147,6 +147,15 @@ static const struct rtw89_rrsr_cfgs rtw8852c_rrsr_cfgs = {
|
||||
.rsc = {R_AX_PTCL_RRSR1, B_AX_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8852c_rfkill_regs = {
|
||||
.pinmux = {R_AX_GPIO8_15_FUNC_SEL,
|
||||
B_AX_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_AX_GPIO_EXT_CTRL + 2,
|
||||
(B_AX_GPIO_MOD_9 | B_AX_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8852c_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
@ -194,7 +203,7 @@ static void rtw8852c_ctrl_tx_path_tmac(struct rtw89_dev *rtwdev, u8 tx_path,
|
||||
static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
u32 ret;
|
||||
int ret;
|
||||
|
||||
val32 = rtw89_read32_mask(rtwdev, R_AX_SYS_STATUS1, B_AX_PAD_HCI_SEL_V2_MASK);
|
||||
if (val32 == MAC_AX_HCI_SEL_PCIE_USB)
|
||||
@ -315,7 +324,7 @@ static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
static int rtw8852c_pwr_off_func(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
u32 val32;
|
||||
u32 ret;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_RFC2RF,
|
||||
XTAL_SI_RFC2RF);
|
||||
@ -1808,7 +1817,7 @@ static void rtw8852c_set_channel_help(struct rtw89_dev *rtwdev, bool enter,
|
||||
RTW89_SCH_TX_SEL_ALL);
|
||||
rtw89_mac_cfg_ppdu_status(rtwdev, mac_idx, false);
|
||||
rtw8852c_dfs_en(rtwdev, false);
|
||||
rtw8852c_tssi_cont_en_phyidx(rtwdev, false, phy_idx);
|
||||
rtw8852c_tssi_cont_en_phyidx(rtwdev, false, phy_idx, chan);
|
||||
rtw8852c_adc_en(rtwdev, false);
|
||||
fsleep(40);
|
||||
rtw8852c_bb_reset_en(rtwdev, chan->band_type, phy_idx, false);
|
||||
@ -1816,7 +1825,7 @@ static void rtw8852c_set_channel_help(struct rtw89_dev *rtwdev, bool enter,
|
||||
rtw89_mac_cfg_ppdu_status(rtwdev, mac_idx, true);
|
||||
rtw8852c_adc_en(rtwdev, true);
|
||||
rtw8852c_dfs_en(rtwdev, true);
|
||||
rtw8852c_tssi_cont_en_phyidx(rtwdev, true, phy_idx);
|
||||
rtw8852c_tssi_cont_en_phyidx(rtwdev, true, phy_idx, chan);
|
||||
rtw8852c_bb_reset_en(rtwdev, chan->band_type, phy_idx, true);
|
||||
rtw89_chip_resume_sch_tx(rtwdev, mac_idx, p->tx_en);
|
||||
}
|
||||
@ -1833,31 +1842,36 @@ static void rtw8852c_rfk_init(struct rtw89_dev *rtwdev)
|
||||
rtw8852c_dpk_init(rtwdev);
|
||||
|
||||
rtw8852c_rck(rtwdev);
|
||||
rtw8852c_dack(rtwdev);
|
||||
rtw8852c_dack(rtwdev, RTW89_CHANCTX_0);
|
||||
rtw8852c_rx_dck(rtwdev, RTW89_PHY_0, false);
|
||||
}
|
||||
|
||||
static void rtw8852c_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static void rtw8852c_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
|
||||
rtw8852c_mcc_get_ch_info(rtwdev, phy_idx);
|
||||
rtw8852c_rx_dck(rtwdev, phy_idx, false);
|
||||
rtw8852c_iqk(rtwdev, phy_idx);
|
||||
rtw8852c_tssi(rtwdev, phy_idx);
|
||||
rtw8852c_dpk(rtwdev, phy_idx);
|
||||
rtw8852c_iqk(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8852c_tssi(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw8852c_dpk(rtwdev, phy_idx, chanctx_idx);
|
||||
rtw89_fw_h2c_rf_ntfy_mcc(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw8852c_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
rtw8852c_tssi_scan(rtwdev, phy_idx);
|
||||
rtw8852c_tssi_scan(rtwdev, phy_idx, chan);
|
||||
}
|
||||
|
||||
static void rtw8852c_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static void rtw8852c_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
rtw8852c_wifi_scan_notify(rtwdev, start, RTW89_PHY_0);
|
||||
rtw8852c_wifi_scan_notify(rtwdev, start, rtwvif_link->phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852c_rfk_track(struct rtw89_dev *rtwdev)
|
||||
@ -1868,9 +1882,9 @@ static void rtw8852c_rfk_track(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static u32 rtw8852c_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx, s16 ref)
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
s16 ref, u16 pwr_ofst_decrease)
|
||||
{
|
||||
s8 ofst_int = 0;
|
||||
u8 base_cw_0db = 0x27;
|
||||
u16 tssi_16dbm_cw = 0x12c;
|
||||
s16 pwr_s10_3 = 0;
|
||||
@ -1879,13 +1893,14 @@ static u32 rtw8852c_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev,
|
||||
u32 pwr_cw = 0;
|
||||
u32 tssi_ofst_cw = 0;
|
||||
|
||||
pwr_s10_3 = (ref << 1) + (s16)(ofst_int) + (s16)(base_cw_0db << 3);
|
||||
pwr_s10_3 = (ref << 1) + (s16)(base_cw_0db << 3) - pwr_ofst_decrease;
|
||||
bb_pwr_cw = FIELD_GET(GENMASK(2, 0), pwr_s10_3);
|
||||
rf_pwr_cw = FIELD_GET(GENMASK(8, 3), pwr_s10_3);
|
||||
rf_pwr_cw = clamp_t(s16, rf_pwr_cw, 15, 63);
|
||||
pwr_cw = (rf_pwr_cw << 3) | bb_pwr_cw;
|
||||
|
||||
tssi_ofst_cw = (u32)((s16)tssi_16dbm_cw + (ref << 1) - (16 << 3));
|
||||
tssi_ofst_cw = (u32)((s16)tssi_16dbm_cw + (ref << 1) - (16 << 3)) -
|
||||
pwr_ofst_decrease;
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
|
||||
"[TXPWR] tssi_ofst_cw=%d rf_cw=0x%x bb_cw=0x%x\n",
|
||||
tssi_ofst_cw, rf_pwr_cw, bb_pwr_cw);
|
||||
@ -1929,9 +1944,10 @@ void rtw8852c_set_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void rtw8852c_set_txpwr_ref(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
enum rtw89_phy_idx phy_idx, s16 pwr_ofst)
|
||||
{
|
||||
static const u32 addr[RF_PATH_NUM_8852C] = {0x5800, 0x7800};
|
||||
u16 ofst_dec[RF_PATH_NUM_8852C];
|
||||
const u32 mask = 0x7FFFFFF;
|
||||
const u8 ofst_ofdm = 0x4;
|
||||
const u8 ofst_cck = 0x8;
|
||||
@ -1945,19 +1961,20 @@ static void rtw8852c_set_txpwr_ref(struct rtw89_dev *rtwdev,
|
||||
rtw89_mac_txpwr_write32_mask(rtwdev, phy_idx, R_AX_PWR_RATE_CTRL,
|
||||
GENMASK(27, 10), 0x0);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set bb ofdm txpwr ref\n");
|
||||
val = rtw8852c_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_ofdm);
|
||||
ofst_dec[RF_PATH_A] = pwr_ofst > 0 ? 0 : abs(pwr_ofst);
|
||||
ofst_dec[RF_PATH_B] = pwr_ofst > 0 ? pwr_ofst : 0;
|
||||
|
||||
for (i = 0; i < RF_PATH_NUM_8852C; i++)
|
||||
rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_ofdm, mask, val,
|
||||
phy_idx);
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set bb ofdm txpwr ref\n");
|
||||
for (i = 0; i < RF_PATH_NUM_8852C; i++) {
|
||||
val = rtw8852c_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_ofdm, ofst_dec[i]);
|
||||
rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_ofdm, mask, val, phy_idx);
|
||||
}
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set bb cck txpwr ref\n");
|
||||
val = rtw8852c_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_cck);
|
||||
|
||||
for (i = 0; i < RF_PATH_NUM_8852C; i++)
|
||||
rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_cck, mask, val,
|
||||
phy_idx);
|
||||
for (i = 0; i < RF_PATH_NUM_8852C; i++) {
|
||||
val = rtw8852c_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_cck, ofst_dec[i]);
|
||||
rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_cck, mask, val, phy_idx);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8852c_bb_set_tx_shape_dfir(struct rtw89_dev *rtwdev,
|
||||
@ -2044,6 +2061,16 @@ static void rtw8852c_set_tx_shape(struct rtw89_dev *rtwdev,
|
||||
B_P1_DAC_COMP_POST_DPD_EN);
|
||||
}
|
||||
|
||||
static void rtw8852c_set_txpwr_diff(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
s16 pwr_ofst;
|
||||
|
||||
pwr_ofst = rtw89_phy_ant_gain_pwr_offset(rtwdev, chan);
|
||||
rtw8852c_set_txpwr_ref(rtwdev, phy_idx, pwr_ofst);
|
||||
}
|
||||
|
||||
static void rtw8852c_set_txpwr(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
@ -2053,12 +2080,13 @@ static void rtw8852c_set_txpwr(struct rtw89_dev *rtwdev,
|
||||
rtw8852c_set_tx_shape(rtwdev, chan, phy_idx);
|
||||
rtw89_phy_set_txpwr_limit(rtwdev, chan, phy_idx);
|
||||
rtw89_phy_set_txpwr_limit_ru(rtwdev, chan, phy_idx);
|
||||
rtw8852c_set_txpwr_diff(rtwdev, chan, phy_idx);
|
||||
}
|
||||
|
||||
static void rtw8852c_set_txpwr_ctrl(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
rtw8852c_set_txpwr_ref(rtwdev, phy_idx);
|
||||
rtw8852c_set_txpwr_ref(rtwdev, phy_idx, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2114,7 +2142,7 @@ rtw8852c_init_txpwr_unit(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
|
||||
static void rtw8852c_bb_cfg_rx_path(struct rtw89_dev *rtwdev, u8 rx_path)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
u8 band = chan->band_type;
|
||||
u32 rst_mask0 = B_P0_TXPW_RSTB_MANON | B_P0_TXPW_RSTB_TSSI;
|
||||
u32 rst_mask1 = B_P1_TXPW_RSTB_MANON | B_P1_TXPW_RSTB_TSSI;
|
||||
@ -2785,7 +2813,10 @@ static void rtw8852c_query_ppdu(struct rtw89_dev *rtwdev,
|
||||
u8 path;
|
||||
u8 *rx_power = phy_ppdu->rssi;
|
||||
|
||||
status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
|
||||
if (!status->signal)
|
||||
status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A],
|
||||
rx_power[RF_PATH_B]));
|
||||
|
||||
for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
|
||||
status->chains |= BIT(path);
|
||||
status->chain_signal[path] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
|
||||
@ -2846,10 +2877,12 @@ static const struct rtw89_chanctx_listener rtw8852c_chanctx_listener = {
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct wiphy_wowlan_support rtw_wowlan_stub_8852c = {
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
|
||||
WIPHY_WOWLAN_NET_DETECT,
|
||||
.n_patterns = RTW89_MAX_PATTERN_NUM,
|
||||
.pattern_max_len = RTW89_MAX_PATTERN_SIZE,
|
||||
.pattern_min_len = 1,
|
||||
.max_nd_match_sets = RTW89_SCANOFLD_MAX_SSID,
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -2882,9 +2915,12 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
|
||||
.get_thermal = rtw8852c_get_thermal,
|
||||
.ctrl_btg_bt_rx = rtw8852c_ctrl_btg_bt_rx,
|
||||
.query_ppdu = rtw8852c_query_ppdu,
|
||||
.convert_rpl_to_rssi = NULL,
|
||||
.phy_rpt_to_rssi = NULL,
|
||||
.ctrl_nbtg_bt_tx = rtw8852c_ctrl_nbtg_bt_tx,
|
||||
.cfg_txrx_path = rtw8852c_bb_cfg_txrx_path,
|
||||
.set_txpwr_ul_tb_offset = rtw8852c_set_txpwr_ul_tb_offset,
|
||||
.digital_pwr_comp = NULL,
|
||||
.pwr_on_func = rtw8852c_pwr_on_func,
|
||||
.pwr_off_func = rtw8852c_pwr_off_func,
|
||||
.query_rxdesc = rtw89_core_query_rxdesc,
|
||||
@ -2935,6 +2971,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.wde_qempty_acq_grpnum = 16,
|
||||
.wde_qempty_mgq_grpsel = 16,
|
||||
.rf_base_addr = {0xe000, 0xf000},
|
||||
.thermal_th = {0x32, 0x35},
|
||||
.pwr_on_seq = NULL,
|
||||
.pwr_off_seq = NULL,
|
||||
.bb_table = &rtw89_8852c_phy_bb_table,
|
||||
@ -2946,12 +2983,14 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.dflt_parms = &rtw89_8852c_dflt_parms,
|
||||
.rfe_parms_conf = NULL,
|
||||
.chanctx_listener = &rtw8852c_chanctx_listener,
|
||||
.txpwr_factor_bb = 3,
|
||||
.txpwr_factor_rf = 2,
|
||||
.txpwr_factor_mac = 1,
|
||||
.dig_table = NULL,
|
||||
.dig_regs = &rtw8852c_dig_regs,
|
||||
.tssi_dbw_table = &rtw89_8852c_tssi_dbw_table,
|
||||
.support_macid_num = RTW89_MAX_MAC_ID_NUM,
|
||||
.support_link_num = 0,
|
||||
.support_chanctx_num = 2,
|
||||
.support_rnr = false,
|
||||
.support_bands = BIT(NL80211_BAND_2GHZ) |
|
||||
@ -2962,9 +3001,11 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
BIT(NL80211_CHAN_WIDTH_80) |
|
||||
BIT(NL80211_CHAN_WIDTH_160),
|
||||
.support_unii4 = true,
|
||||
.support_ant_gain = true,
|
||||
.ul_tb_waveform_ctrl = false,
|
||||
.ul_tb_pwr_diff = true,
|
||||
.hw_sec_hdr = true,
|
||||
.hw_mgmt_tx_encrypt = true,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
@ -3028,6 +3069,8 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.rrsr_cfgs = &rtw8852c_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_MAP, B_BSS_CLR_MAP_VLD0},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP,
|
||||
.rfkill_init = &rtw8852c_rfkill_regs,
|
||||
.rfkill_get = {R_AX_GPIO_EXT_CTRL, B_AX_GPIO_IN_9},
|
||||
.dma_ch_mask = 0,
|
||||
.edcca_regs = &rtw8852c_edcca_regs,
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
#include "chan.h"
|
||||
#include "coex.h"
|
||||
#include "debug.h"
|
||||
#include "fw.h"
|
||||
#include "phy.h"
|
||||
#include "reg.h"
|
||||
#include "rtw8852c.h"
|
||||
@ -584,11 +585,12 @@ static void _drck(struct rtw89_dev *rtwdev)
|
||||
rtw89_phy_read32_mask(rtwdev, R_DRCK, MASKDWORD));
|
||||
}
|
||||
|
||||
static void _dac_cal(struct rtw89_dev *rtwdev, bool force)
|
||||
static void _dac_cal(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dack_info *dack = &rtwdev->dack;
|
||||
u32 rf0_0, rf1_0;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB, chanctx_idx);
|
||||
|
||||
dack->dack_done = false;
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK b\n");
|
||||
@ -1063,7 +1065,7 @@ static bool _iqk_nbtxk(struct rtw89_dev *rtwdev,
|
||||
|
||||
static bool _lok_finetune_check(struct rtw89_dev *rtwdev, u8 path)
|
||||
{
|
||||
struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc;
|
||||
struct rtw89_rfk_mcc_info_data *rfk_mcc = rtwdev->rfk_mcc.data;
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u8 idx = rfk_mcc->table_idx;
|
||||
bool is_fail1, is_fail2;
|
||||
@ -1321,9 +1323,10 @@ static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u
|
||||
}
|
||||
|
||||
static void _iqk_get_ch_info(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy, u8 path)
|
||||
enum rtw89_phy_idx phy, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
|
||||
@ -1405,7 +1408,7 @@ static void _iqk_afebb_restore(struct rtw89_dev *rtwdev,
|
||||
|
||||
static void _iqk_preset(struct rtw89_dev *rtwdev, u8 path)
|
||||
{
|
||||
struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc;
|
||||
struct rtw89_rfk_mcc_info_data *rfk_mcc = rtwdev->rfk_mcc.data;
|
||||
u8 idx = 0;
|
||||
|
||||
idx = rfk_mcc->table_idx;
|
||||
@ -1516,12 +1519,13 @@ static void _iqk_init(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_phy_idx phy_idx, u8 path)
|
||||
enum rtw89_phy_idx phy_idx, u8 path,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
|
||||
u32 backup_bb_val[BACKUP_BB_REGS_NR];
|
||||
u32 backup_rf_val[RTW8852C_IQK_SS][BACKUP_RF_REGS_NR];
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
|
||||
|
||||
@ -1531,7 +1535,7 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
iqk_info->version = RTW8852C_IQK_VER;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path);
|
||||
_iqk_get_ch_info(rtwdev, phy_idx, path, chanctx_idx);
|
||||
_rfk_backup_bb_reg(rtwdev, backup_bb_val);
|
||||
_rfk_backup_rf_reg(rtwdev, backup_rf_val[path], path);
|
||||
_iqk_macbb_setting(rtwdev, phy_idx, path);
|
||||
@ -1544,18 +1548,19 @@ static void _doiqk(struct rtw89_dev *rtwdev, bool force,
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
|
||||
}
|
||||
|
||||
static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force)
|
||||
static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
switch (_kpath(rtwdev, phy_idx)) {
|
||||
case RF_A:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A, chanctx_idx);
|
||||
break;
|
||||
case RF_B:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B, chanctx_idx);
|
||||
break;
|
||||
case RF_AB:
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_A, chanctx_idx);
|
||||
_doiqk(rtwdev, force, phy_idx, RF_PATH_B, chanctx_idx);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1764,10 +1769,10 @@ u8 _rx_dck_channel_calc(struct rtw89_dev *rtwdev, const struct rtw89_chan *chan)
|
||||
target_ch = chan->channel - 33;
|
||||
}
|
||||
} else if (chan->band_type == RTW89_BAND_6G) {
|
||||
if (chan->channel >= 1 && chan->channel <= 125)
|
||||
target_ch = chan->channel + 32;
|
||||
else
|
||||
if (chan->channel > 125)
|
||||
target_ch = chan->channel - 32;
|
||||
else
|
||||
target_ch = chan->channel + 32;
|
||||
} else {
|
||||
target_ch = chan->channel;
|
||||
}
|
||||
@ -1901,9 +1906,9 @@ static u8 _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
|
||||
static void _dpk_information(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
|
||||
u8 kidx = dpk->cur_idx[path];
|
||||
@ -2345,7 +2350,7 @@ static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
|
||||
if (dgain > 0x5fc || dgain < 0x556) {
|
||||
_dpk_one_shot(rtwdev, phy, path, D_SYNC);
|
||||
dgain = _dpk_dgain_read(rtwdev);
|
||||
_dpk_dgain_read(rtwdev);
|
||||
}
|
||||
|
||||
if (agc_cnt == 0) {
|
||||
@ -2495,9 +2500,9 @@ static void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
}
|
||||
|
||||
static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
bool is_reload = false;
|
||||
u8 idx, cur_band, cur_ch;
|
||||
@ -2689,7 +2694,8 @@ static void _dpk_drf_direct_cntrl(struct rtw89_dev *rtwdev, u8 path, bool is_byb
|
||||
}
|
||||
|
||||
static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
enum rtw89_phy_idx phy, u8 kpath)
|
||||
enum rtw89_phy_idx phy, u8 kpath,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_dpk_info *dpk = &rtwdev->dpk;
|
||||
static const u32 kip_reg[] = {0x813c, 0x8124, 0x8120, 0xc0c4, 0xc0e8, 0xc0d4, 0xc0d8};
|
||||
@ -2709,7 +2715,8 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
if (!(kpath & BIT(path)))
|
||||
continue;
|
||||
|
||||
reloaded[path] = _dpk_reload_check(rtwdev, phy, path);
|
||||
reloaded[path] = _dpk_reload_check(rtwdev, phy, path,
|
||||
chanctx_idx);
|
||||
if (!reloaded[path] && dpk->bp[path][0].ch != 0)
|
||||
dpk->cur_idx[path] = !dpk->cur_idx[path];
|
||||
else
|
||||
@ -2726,7 +2733,7 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
path, dpk->cur_idx[path]);
|
||||
_dpk_bkup_kip(rtwdev, kip_reg, kip_bkup, path);
|
||||
_rfk_backup_rf_reg(rtwdev, backup_rf_val[path], path);
|
||||
_dpk_information(rtwdev, phy, path);
|
||||
_dpk_information(rtwdev, phy, path, chanctx_idx);
|
||||
_dpk_init(rtwdev, path);
|
||||
if (rtwdev->is_tssi_mode[path])
|
||||
_dpk_tssi_pause(rtwdev, path, true);
|
||||
@ -2759,10 +2766,11 @@ static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
|
||||
_dpk_kip_pwr_clk_onoff(rtwdev, false);
|
||||
}
|
||||
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
struct rtw89_fem_info *fem = &rtwdev->fem;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u8 band = chan->band_type;
|
||||
|
||||
if (rtwdev->hal.cv == CHIP_CAV && band != RTW89_BAND_2G) {
|
||||
@ -2794,17 +2802,18 @@ static void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
}
|
||||
}
|
||||
|
||||
static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force)
|
||||
static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
rtw89_debug(rtwdev, RTW89_DBG_RFK,
|
||||
"[DPK] ****** DPK Start (Ver: 0x%x, Cv: %d, RF_para: %d) ******\n",
|
||||
RTW8852C_DPK_VER, rtwdev->hal.cv,
|
||||
RTW8852C_RF_REL_VERSION);
|
||||
|
||||
if (_dpk_bypass_check(rtwdev, phy))
|
||||
if (_dpk_bypass_check(rtwdev, phy, chanctx_idx))
|
||||
_dpk_force_bypass(rtwdev, phy);
|
||||
else
|
||||
_dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy));
|
||||
_dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy), chanctx_idx);
|
||||
|
||||
if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_DCKC, RR_DCKC_CHK) == 0x1)
|
||||
rtw8852c_rx_dck(rtwdev, phy, false);
|
||||
@ -2895,9 +2904,8 @@ static void _dpk_track(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_bandwidth bw = chan->band_width;
|
||||
enum rtw89_band band = chan->band_type;
|
||||
u32 clk = 0x0;
|
||||
@ -2949,9 +2957,8 @@ static void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (path == RF_PATH_A) {
|
||||
@ -2976,7 +2983,7 @@ static void _tssi_set_bbgain_split(struct rtw89_dev *rtwdev, enum rtw89_phy_idx
|
||||
}
|
||||
|
||||
static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
#define RTW8852C_TSSI_GET_VAL(ptr, idx) \
|
||||
({ \
|
||||
@ -2989,8 +2996,8 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
} \
|
||||
__val; \
|
||||
})
|
||||
struct rtw89_fw_txpwr_track_cfg *trk = rtwdev->fw.elm_info.txpwr_trk;
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 subband = chan->subband_type;
|
||||
const s8 *thm_up_a = NULL;
|
||||
@ -3005,56 +3012,88 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
switch (subband) {
|
||||
default:
|
||||
case RTW89_CH_2G:
|
||||
thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_2ga_p;
|
||||
thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_2ga_n;
|
||||
thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_2gb_p;
|
||||
thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_2gb_n;
|
||||
thm_up_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GA_P][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_2ga_p;
|
||||
thm_down_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GA_N][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_2ga_n;
|
||||
thm_up_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GB_P][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_2gb_p;
|
||||
thm_down_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GB_N][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_2gb_n;
|
||||
break;
|
||||
case RTW89_CH_5G_BAND_1:
|
||||
thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_p[0];
|
||||
thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_n[0];
|
||||
thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_p[0];
|
||||
thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_n[0];
|
||||
thm_up_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5ga_p[0];
|
||||
thm_down_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5ga_n[0];
|
||||
thm_up_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5gb_p[0];
|
||||
thm_down_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5gb_n[0];
|
||||
break;
|
||||
case RTW89_CH_5G_BAND_3:
|
||||
thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_p[1];
|
||||
thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_n[1];
|
||||
thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_p[1];
|
||||
thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_n[1];
|
||||
thm_up_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][1] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5ga_p[1];
|
||||
thm_down_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][1] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5ga_n[1];
|
||||
thm_up_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][1] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5gb_p[1];
|
||||
thm_down_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][1] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5gb_n[1];
|
||||
break;
|
||||
case RTW89_CH_5G_BAND_4:
|
||||
thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_p[2];
|
||||
thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_n[2];
|
||||
thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_p[2];
|
||||
thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_n[2];
|
||||
thm_up_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][2] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5ga_p[2];
|
||||
thm_down_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][2] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5ga_n[2];
|
||||
thm_up_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][2] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5gb_p[2];
|
||||
thm_down_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][2] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_5gb_n[2];
|
||||
break;
|
||||
case RTW89_CH_6G_BAND_IDX0:
|
||||
case RTW89_CH_6G_BAND_IDX1:
|
||||
thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[0];
|
||||
thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[0];
|
||||
thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[0];
|
||||
thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[0];
|
||||
thm_up_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_P][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[0];
|
||||
thm_down_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_N][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[0];
|
||||
thm_up_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_P][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[0];
|
||||
thm_down_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_N][0] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[0];
|
||||
break;
|
||||
case RTW89_CH_6G_BAND_IDX2:
|
||||
case RTW89_CH_6G_BAND_IDX3:
|
||||
thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[1];
|
||||
thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[1];
|
||||
thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[1];
|
||||
thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[1];
|
||||
thm_up_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_P][1] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[1];
|
||||
thm_down_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_N][1] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[1];
|
||||
thm_up_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_P][1] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[1];
|
||||
thm_down_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_N][1] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[1];
|
||||
break;
|
||||
case RTW89_CH_6G_BAND_IDX4:
|
||||
case RTW89_CH_6G_BAND_IDX5:
|
||||
thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[2];
|
||||
thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[2];
|
||||
thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[2];
|
||||
thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[2];
|
||||
thm_up_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_P][2] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[2];
|
||||
thm_down_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_N][2] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[2];
|
||||
thm_up_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_P][2] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[2];
|
||||
thm_down_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_N][2] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[2];
|
||||
break;
|
||||
case RTW89_CH_6G_BAND_IDX6:
|
||||
case RTW89_CH_6G_BAND_IDX7:
|
||||
thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[3];
|
||||
thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[3];
|
||||
thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[3];
|
||||
thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[3];
|
||||
thm_up_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_P][3] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[3];
|
||||
thm_down_a = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_N][3] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[3];
|
||||
thm_up_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_P][3] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[3];
|
||||
thm_down_b = trk ? trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_N][3] :
|
||||
rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[3];
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3162,9 +3201,8 @@ static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx ph
|
||||
}
|
||||
|
||||
static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
|
||||
if (path == RF_PATH_A) {
|
||||
@ -3179,9 +3217,9 @@ static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
|
||||
}
|
||||
|
||||
static void _tssi_set_aligk_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
const struct rtw89_rfk_tbl *tbl;
|
||||
|
||||
@ -3590,10 +3628,9 @@ static u32 _tssi_get_6g_trim_group(struct rtw89_dev *rtwdev, u8 ch)
|
||||
}
|
||||
|
||||
static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
u8 ch = chan->channel;
|
||||
u32 gidx, gidx_1st, gidx_2nd;
|
||||
@ -3654,10 +3691,9 @@ static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
|
||||
static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
u8 ch = chan->channel;
|
||||
u32 tgidx, tgidx_1st, tgidx_2nd;
|
||||
@ -3719,10 +3755,9 @@ static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy)
|
||||
enum rtw89_phy_idx phy, const struct rtw89_chan *chan)
|
||||
{
|
||||
struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
u8 ch = chan->channel;
|
||||
u8 gidx;
|
||||
s8 ofdm_de;
|
||||
@ -3745,7 +3780,7 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev,
|
||||
|
||||
for (i = path; i < path_max; i++) {
|
||||
gidx = _tssi_get_cck_group(rtwdev, ch);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);
|
||||
val = tssi_info->tssi_cck[i][gidx] + trim_de;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
@ -3761,8 +3796,8 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev,
|
||||
rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i],
|
||||
_TSSI_DE_MASK));
|
||||
|
||||
ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
|
||||
ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i, chan);
|
||||
trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);
|
||||
val = ofdm_de + trim_de;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI,
|
||||
@ -3785,7 +3820,7 @@ static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void rtw8852c_tssi_cont_en(struct rtw89_dev *rtwdev, bool en,
|
||||
enum rtw89_rf_path path)
|
||||
enum rtw89_rf_path path, const struct rtw89_chan *chan)
|
||||
{
|
||||
static const u32 tssi_trk[2] = {0x5818, 0x7818};
|
||||
static const u32 tssi_en[2] = {0x5820, 0x7820};
|
||||
@ -3794,25 +3829,26 @@ static void rtw8852c_tssi_cont_en(struct rtw89_dev *rtwdev, bool en,
|
||||
rtw89_phy_write32_mask(rtwdev, tssi_trk[path], BIT(30), 0x0);
|
||||
rtw89_phy_write32_mask(rtwdev, tssi_en[path], BIT(31), 0x0);
|
||||
if (rtwdev->dbcc_en && path == RF_PATH_B)
|
||||
_tssi_set_efuse_to_de(rtwdev, RTW89_PHY_1);
|
||||
_tssi_set_efuse_to_de(rtwdev, RTW89_PHY_1, chan);
|
||||
else
|
||||
_tssi_set_efuse_to_de(rtwdev, RTW89_PHY_0);
|
||||
_tssi_set_efuse_to_de(rtwdev, RTW89_PHY_0, chan);
|
||||
} else {
|
||||
rtw89_phy_write32_mask(rtwdev, tssi_trk[path], BIT(30), 0x1);
|
||||
rtw89_phy_write32_mask(rtwdev, tssi_en[path], BIT(31), 0x1);
|
||||
}
|
||||
}
|
||||
|
||||
void rtw8852c_tssi_cont_en_phyidx(struct rtw89_dev *rtwdev, bool en, u8 phy_idx)
|
||||
void rtw8852c_tssi_cont_en_phyidx(struct rtw89_dev *rtwdev, bool en, u8 phy_idx,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
if (!rtwdev->dbcc_en) {
|
||||
rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_A);
|
||||
rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_B);
|
||||
rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_A, chan);
|
||||
rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_B, chan);
|
||||
} else {
|
||||
if (phy_idx == RTW89_PHY_0)
|
||||
rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_A);
|
||||
rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_A, chan);
|
||||
else
|
||||
rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_B);
|
||||
rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_B, chan);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4073,7 +4109,7 @@ void rtw8852c_set_channel_rf(struct rtw89_dev *rtwdev,
|
||||
|
||||
void rtw8852c_mcc_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc;
|
||||
struct rtw89_rfk_mcc_info_data *rfk_mcc = rtwdev->rfk_mcc.data;
|
||||
struct rtw89_rfk_chan_desc desc[__RTW89_RFK_CHS_NR_V0] = {};
|
||||
const struct rtw89_chan *chan;
|
||||
enum rtw89_entity_mode mode;
|
||||
@ -4083,10 +4119,10 @@ void rtw8852c_mcc_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_i
|
||||
mode = rtw89_get_entity_mode(rtwdev);
|
||||
switch (mode) {
|
||||
case RTW89_ENTITY_MODE_MCC_PREPARE:
|
||||
chan_idx = RTW89_SUB_ENTITY_1;
|
||||
chan_idx = RTW89_CHANCTX_1;
|
||||
break;
|
||||
default:
|
||||
chan_idx = RTW89_SUB_ENTITY_0;
|
||||
chan_idx = RTW89_CHANCTX_0;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4116,26 +4152,27 @@ void rtw8852c_rck(struct rtw89_dev *rtwdev)
|
||||
_rck(rtwdev, path);
|
||||
}
|
||||
|
||||
void rtw8852c_dack(struct rtw89_dev *rtwdev)
|
||||
void rtw8852c_dack(struct rtw89_dev *rtwdev, enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
|
||||
_dac_cal(rtwdev, false);
|
||||
_dac_cal(rtwdev, false, chanctx_idx);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
|
||||
|
||||
_iqk_init(rtwdev);
|
||||
_iqk(rtwdev, phy_idx, false);
|
||||
_iqk(rtwdev, phy_idx, false, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
|
||||
@ -4206,10 +4243,11 @@ void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_a
|
||||
|
||||
void rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
enum rtw89_chanctx_idx chanctx_idx = RTW89_CHANCTX_0;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
struct rtw89_rx_dck_info *rx_dck = &rtwdev->rx_dck;
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
u8 dck_channel;
|
||||
u8 cur_thermal;
|
||||
u32 tx_en;
|
||||
@ -4263,16 +4301,17 @@ void rtw8852c_dpk_init(struct rtw89_dev *rtwdev)
|
||||
dpk->is_dpk_reload_en = false;
|
||||
}
|
||||
|
||||
void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
|
||||
void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
u32 tx_en;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
|
||||
rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
|
||||
_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
|
||||
|
||||
_dpk(rtwdev, phy_idx, false);
|
||||
_dpk(rtwdev, phy_idx, false, chanctx_idx);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);
|
||||
@ -4283,8 +4322,10 @@ void rtw8852c_dpk_track(struct rtw89_dev *rtwdev)
|
||||
_dpk_track(rtwdev);
|
||||
}
|
||||
|
||||
void rtw8852c_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
void rtw8852c_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_chanctx_idx chanctx_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
u32 i, path = RF_PATH_A, path_max = RF_PATH_NUM_8852C;
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy);
|
||||
@ -4302,23 +4343,24 @@ void rtw8852c_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
_tssi_disable(rtwdev, phy);
|
||||
|
||||
for (i = path; i < path_max; i++) {
|
||||
_tssi_set_sys(rtwdev, phy, i);
|
||||
_tssi_set_sys(rtwdev, phy, i, chan);
|
||||
_tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i);
|
||||
_tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i);
|
||||
_tssi_set_dck(rtwdev, phy, i);
|
||||
_tssi_set_dck(rtwdev, phy, i, chan);
|
||||
_tssi_set_bbgain_split(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i);
|
||||
_tssi_set_aligk_default(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i, chan);
|
||||
_tssi_set_aligk_default(rtwdev, phy, i, chan);
|
||||
_tssi_set_slope(rtwdev, phy, i);
|
||||
_tssi_run_slope(rtwdev, phy, i);
|
||||
}
|
||||
|
||||
_tssi_enable(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy, chan);
|
||||
}
|
||||
|
||||
void rtw8852c_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
void rtw8852c_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
u32 i, path = RF_PATH_A, path_max = RF_PATH_NUM_8852C;
|
||||
|
||||
@ -4343,15 +4385,15 @@ void rtw8852c_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
|
||||
_tssi_disable(rtwdev, phy);
|
||||
|
||||
for (i = path; i < path_max; i++) {
|
||||
_tssi_set_sys(rtwdev, phy, i);
|
||||
_tssi_set_dck(rtwdev, phy, i);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i);
|
||||
_tssi_set_aligk_default(rtwdev, phy, i);
|
||||
_tssi_set_sys(rtwdev, phy, i, chan);
|
||||
_tssi_set_dck(rtwdev, phy, i, chan);
|
||||
_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);
|
||||
_tssi_slope_cal_org(rtwdev, phy, i, chan);
|
||||
_tssi_set_aligk_default(rtwdev, phy, i, chan);
|
||||
}
|
||||
|
||||
_tssi_enable(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy);
|
||||
_tssi_set_efuse_to_de(rtwdev, phy, chan);
|
||||
}
|
||||
|
||||
static void rtw8852c_tssi_default_txagc(struct rtw89_dev *rtwdev,
|
||||
@ -4426,7 +4468,7 @@ void rtw8852c_rfk_chanctx_cb(struct rtw89_dev *rtwdev,
|
||||
dpk->is_dpk_enable = true;
|
||||
for (path = 0; path < RTW8852C_DPK_RF_PATH; path++)
|
||||
_dpk_onoff(rtwdev, path, false);
|
||||
rtw8852c_dpk(rtwdev, RTW89_PHY_0);
|
||||
rtw8852c_dpk(rtwdev, RTW89_PHY_0, RTW89_CHANCTX_0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@ -9,16 +9,21 @@
|
||||
|
||||
void rtw8852c_mcc_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852c_rck(struct rtw89_dev *rtwdev);
|
||||
void rtw8852c_dack(struct rtw89_dev *rtwdev);
|
||||
void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
|
||||
void rtw8852c_dack(struct rtw89_dev *rtwdev, enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool is_afe);
|
||||
void rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev);
|
||||
void rtw8852c_dpk_init(struct rtw89_dev *rtwdev);
|
||||
void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852c_dpk_track(struct rtw89_dev *rtwdev);
|
||||
void rtw8852c_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852c_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
|
||||
void rtw8852c_tssi_cont_en_phyidx(struct rtw89_dev *rtwdev, bool en, u8 phy_idx);
|
||||
void rtw8852c_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
enum rtw89_chanctx_idx chanctx_idx);
|
||||
void rtw8852c_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
|
||||
const struct rtw89_chan *chan);
|
||||
void rtw8852c_tssi_cont_en_phyidx(struct rtw89_dev *rtwdev, bool en, u8 phy_idx,
|
||||
const struct rtw89_chan *chan);
|
||||
void rtw8852c_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
|
||||
enum rtw89_phy_idx phy_idx);
|
||||
void rtw8852c_set_channel_rf(struct rtw89_dev *rtwdev,
|
||||
|
||||
@ -36,6 +36,7 @@ static const struct rtw89_pci_info rtw8852c_pci_info = {
|
||||
.io_rcy_tmr = MAC_AX_IO_RCY_ANA_TMR_6MS,
|
||||
.rx_ring_eq_is_full = false,
|
||||
.check_rx_tag = false,
|
||||
.no_rxbd_fs = false,
|
||||
|
||||
.init_cfg_reg = R_AX_HAXI_INIT_CFG1,
|
||||
.txhci_en_bit = B_AX_TXHCI_EN_V1,
|
||||
@ -67,6 +68,8 @@ static const struct rtw89_pci_info rtw8852c_pci_info = {
|
||||
.enable_intr = rtw89_pci_enable_intr_v1,
|
||||
.disable_intr = rtw89_pci_disable_intr_v1,
|
||||
.recognize_intrs = rtw89_pci_recognize_intrs_v1,
|
||||
|
||||
.ssid_quirks = NULL,
|
||||
};
|
||||
|
||||
static const struct dmi_system_id rtw8852c_pci_quirks[] = {
|
||||
@ -93,6 +96,7 @@ static const struct dmi_system_id rtw8852c_pci_quirks[] = {
|
||||
|
||||
static const struct rtw89_driver_info rtw89_8852ce_info = {
|
||||
.chip = &rtw8852c_chip_info,
|
||||
.variant = NULL,
|
||||
.quirks = rtw8852c_pci_quirks,
|
||||
.bus = {
|
||||
.pci = &rtw8852c_pci_info,
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
/* Copyright(c) 2023 Realtek Corporation
|
||||
*/
|
||||
|
||||
#include "chan.h"
|
||||
#include "coex.h"
|
||||
#include "debug.h"
|
||||
#include "efuse.h"
|
||||
@ -13,10 +14,10 @@
|
||||
#include "rtw8922a_rfk.h"
|
||||
#include "util.h"
|
||||
|
||||
#define RTW8922A_FW_FORMAT_MAX 0
|
||||
#define RTW8922A_FW_FORMAT_MAX 3
|
||||
#define RTW8922A_FW_BASENAME "rtw89/rtw8922a_fw"
|
||||
#define RTW8922A_MODULE_FIRMWARE \
|
||||
RTW8922A_FW_BASENAME ".bin"
|
||||
RTW8922A_FW_BASENAME "-" __stringify(RTW8922A_FW_FORMAT_MAX) ".bin"
|
||||
|
||||
#define HE_N_USER_MAX_8922A 4
|
||||
|
||||
@ -165,6 +166,15 @@ static const struct rtw89_rrsr_cfgs rtw8922a_rrsr_cfgs = {
|
||||
.rsc = {R_BE_PTCL_RRSR1, B_BE_RSC_MASK, 2},
|
||||
};
|
||||
|
||||
static const struct rtw89_rfkill_regs rtw8922a_rfkill_regs = {
|
||||
.pinmux = {R_BE_GPIO8_15_FUNC_SEL,
|
||||
B_BE_PINMUX_GPIO9_FUNC_SEL_MASK,
|
||||
0xf},
|
||||
.mode = {R_BE_GPIO_EXT_CTRL + 2,
|
||||
(B_BE_GPIO_MOD_9 | B_BE_GPIO_IO_SEL_9) >> 16,
|
||||
0x0},
|
||||
};
|
||||
|
||||
static const struct rtw89_dig_regs rtw8922a_dig_regs = {
|
||||
.seg0_pd_reg = R_SEG0R_PD_V2,
|
||||
.pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
|
||||
@ -389,9 +399,6 @@ static int rtw8922a_pwr_on_func(struct rtw89_dev *rtwdev)
|
||||
rtw89_write32_set(rtwdev, R_BE_FEN_RST_ENABLE, B_BE_FEN_BB_IP_RSTN |
|
||||
B_BE_FEN_BBPLAT_RSTB);
|
||||
|
||||
if (!test_bit(RTW89_FLAG_PROBE_DONE, rtwdev->flags))
|
||||
rtw89_efuse_read_fw_secure_be(rtwdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -956,6 +963,42 @@ static const struct rtw8922a_bb_gain bb_gain_tia[TIA_GAIN_NUM] = {
|
||||
.gain_g_mask = 0x1FF, .gain_a_mask = 0x3FE00 },
|
||||
};
|
||||
|
||||
static const struct rtw8922a_bb_gain bb_op1db_lna[LNA_GAIN_NUM] = {
|
||||
{ .gain_g = {0x40ac, 0x44ac}, .gain_a = {0x4078, 0x4478},
|
||||
.gain_g_mask = 0xFF00, .gain_a_mask = 0xFF000000},
|
||||
{ .gain_g = {0x40ac, 0x44ac}, .gain_a = {0x407c, 0x447c},
|
||||
.gain_g_mask = 0xFF0000, .gain_a_mask = 0xFF},
|
||||
{ .gain_g = {0x40ac, 0x44ac}, .gain_a = {0x407c, 0x447c},
|
||||
.gain_g_mask = 0xFF000000, .gain_a_mask = 0xFF00},
|
||||
{ .gain_g = {0x40b0, 0x44b0}, .gain_a = {0x407c, 0x447c},
|
||||
.gain_g_mask = 0xFF, .gain_a_mask = 0xFF0000},
|
||||
{ .gain_g = {0x40b0, 0x44b0}, .gain_a = {0x407c, 0x447c},
|
||||
.gain_g_mask = 0xFF00, .gain_a_mask = 0xFF000000},
|
||||
{ .gain_g = {0x40b0, 0x44b0}, .gain_a = {0x4080, 0x4480},
|
||||
.gain_g_mask = 0xFF0000, .gain_a_mask = 0xFF},
|
||||
{ .gain_g = {0x40b0, 0x44b0}, .gain_a = {0x4080, 0x4480},
|
||||
.gain_g_mask = 0xFF000000, .gain_a_mask = 0xFF00},
|
||||
};
|
||||
|
||||
static const struct rtw8922a_bb_gain bb_op1db_tia_lna[TIA_LNA_OP1DB_NUM] = {
|
||||
{ .gain_g = {0x40b4, 0x44b4}, .gain_a = {0x4080, 0x4480},
|
||||
.gain_g_mask = 0xFF0000, .gain_a_mask = 0xFF000000},
|
||||
{ .gain_g = {0x40b4, 0x44b4}, .gain_a = {0x4084, 0x4484},
|
||||
.gain_g_mask = 0xFF000000, .gain_a_mask = 0xFF},
|
||||
{ .gain_g = {0x40b8, 0x44b8}, .gain_a = {0x4084, 0x4484},
|
||||
.gain_g_mask = 0xFF, .gain_a_mask = 0xFF00},
|
||||
{ .gain_g = {0x40b8, 0x44b8}, .gain_a = {0x4084, 0x4484},
|
||||
.gain_g_mask = 0xFF00, .gain_a_mask = 0xFF0000},
|
||||
{ .gain_g = {0x40b8, 0x44b8}, .gain_a = {0x4084, 0x4484},
|
||||
.gain_g_mask = 0xFF0000, .gain_a_mask = 0xFF000000},
|
||||
{ .gain_g = {0x40b8, 0x44b8}, .gain_a = {0x4088, 0x4488},
|
||||
.gain_g_mask = 0xFF000000, .gain_a_mask = 0xFF},
|
||||
{ .gain_g = {0x40bc, 0x44bc}, .gain_a = {0x4088, 0x4488},
|
||||
.gain_g_mask = 0xFF, .gain_a_mask = 0xFF00},
|
||||
{ .gain_g = {0x40bc, 0x44bc}, .gain_a = {0x4088, 0x4488},
|
||||
.gain_g_mask = 0xFF00, .gain_a_mask = 0xFF0000},
|
||||
};
|
||||
|
||||
struct rtw8922a_bb_gain_bypass {
|
||||
u32 gain_g[BB_PATH_NUM_8922A];
|
||||
u32 gain_a[BB_PATH_NUM_8922A];
|
||||
@ -1047,6 +1090,30 @@ static void rtw8922a_set_lna_tia_gain(struct rtw89_dev *rtwdev,
|
||||
val = gain->tia_gain[gain_band][bw_type][path][i];
|
||||
rtw89_phy_write32_idx(rtwdev, reg, mask, val, phy_idx);
|
||||
}
|
||||
|
||||
for (i = 0; i < LNA_GAIN_NUM; i++) {
|
||||
if (chan->band_type == RTW89_BAND_2G) {
|
||||
reg = bb_op1db_lna[i].gain_g[path];
|
||||
mask = bb_op1db_lna[i].gain_g_mask;
|
||||
} else {
|
||||
reg = bb_op1db_lna[i].gain_a[path];
|
||||
mask = bb_op1db_lna[i].gain_a_mask;
|
||||
}
|
||||
val = gain->lna_op1db[gain_band][bw_type][path][i];
|
||||
rtw89_phy_write32_idx(rtwdev, reg, mask, val, phy_idx);
|
||||
}
|
||||
|
||||
for (i = 0; i < TIA_LNA_OP1DB_NUM; i++) {
|
||||
if (chan->band_type == RTW89_BAND_2G) {
|
||||
reg = bb_op1db_tia_lna[i].gain_g[path];
|
||||
mask = bb_op1db_tia_lna[i].gain_g_mask;
|
||||
} else {
|
||||
reg = bb_op1db_tia_lna[i].gain_a[path];
|
||||
mask = bb_op1db_tia_lna[i].gain_a_mask;
|
||||
}
|
||||
val = gain->tia_lna_op1db[gain_band][bw_type][path][i];
|
||||
rtw89_phy_write32_idx(rtwdev, reg, mask, val, phy_idx);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8922a_set_gain(struct rtw89_dev *rtwdev,
|
||||
@ -1680,9 +1747,63 @@ static int rtw8922a_ctrl_rx_path_tmac(struct rtw89_dev *rtwdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define DIGITAL_PWR_COMP_REG_NUM 22
|
||||
static const u32 rtw8922a_digital_pwr_comp_val[][DIGITAL_PWR_COMP_REG_NUM] = {
|
||||
{0x012C0096, 0x044C02BC, 0x00322710, 0x015E0096, 0x03C8028A,
|
||||
0x0BB80708, 0x17701194, 0x02020100, 0x03030303, 0x01000303,
|
||||
0x05030302, 0x06060605, 0x06050300, 0x0A090807, 0x02000B0B,
|
||||
0x09080604, 0x0D0D0C0B, 0x08060400, 0x110F0C0B, 0x05001111,
|
||||
0x0D0C0907, 0x12121210},
|
||||
{0x012C0096, 0x044C02BC, 0x00322710, 0x015E0096, 0x03C8028A,
|
||||
0x0BB80708, 0x17701194, 0x04030201, 0x05050505, 0x01000505,
|
||||
0x07060504, 0x09090908, 0x09070400, 0x0E0D0C0B, 0x03000E0E,
|
||||
0x0D0B0907, 0x1010100F, 0x0B080500, 0x1512100D, 0x05001515,
|
||||
0x100D0B08, 0x15151512},
|
||||
};
|
||||
|
||||
static void rtw8922a_set_digital_pwr_comp(struct rtw89_dev *rtwdev,
|
||||
bool enable, u8 nss,
|
||||
enum rtw89_rf_path path)
|
||||
{
|
||||
static const u32 ltpc_t0[2] = {R_BE_LTPC_T0_PATH0, R_BE_LTPC_T0_PATH1};
|
||||
const u32 *digital_pwr_comp;
|
||||
u32 addr, val;
|
||||
u32 i;
|
||||
|
||||
if (nss == 1)
|
||||
digital_pwr_comp = rtw8922a_digital_pwr_comp_val[0];
|
||||
else
|
||||
digital_pwr_comp = rtw8922a_digital_pwr_comp_val[1];
|
||||
|
||||
addr = ltpc_t0[path];
|
||||
for (i = 0; i < DIGITAL_PWR_COMP_REG_NUM; i++, addr += 4) {
|
||||
val = enable ? digital_pwr_comp[i] : 0;
|
||||
rtw89_phy_write32(rtwdev, addr, val);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8922a_digital_pwr_comp(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
bool enable = chan->band_type != RTW89_BAND_2G;
|
||||
u8 path;
|
||||
|
||||
if (rtwdev->mlo_dbcc_mode == MLO_1_PLUS_1_1RF) {
|
||||
if (phy_idx == RTW89_PHY_0)
|
||||
path = RF_PATH_A;
|
||||
else
|
||||
path = RF_PATH_B;
|
||||
rtw8922a_set_digital_pwr_comp(rtwdev, enable, 1, path);
|
||||
} else {
|
||||
rtw8922a_set_digital_pwr_comp(rtwdev, enable, 2, RF_PATH_A);
|
||||
rtw8922a_set_digital_pwr_comp(rtwdev, enable, 2, RF_PATH_B);
|
||||
}
|
||||
}
|
||||
|
||||
static int rtw8922a_ctrl_mlo(struct rtw89_dev *rtwdev, enum rtw89_mlo_dbcc_mode mode)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan0, *chan1;
|
||||
|
||||
if (mode == MLO_1_PLUS_1_1RF || mode == DBCC_LEGACY) {
|
||||
rtw89_phy_write32_mask(rtwdev, R_DBCC, B_DBCC_EN, 0x1);
|
||||
@ -1695,13 +1816,20 @@ static int rtw8922a_ctrl_mlo(struct rtw89_dev *rtwdev, enum rtw89_mlo_dbcc_mode
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (mode == MLO_2_PLUS_0_1RF) {
|
||||
rtw8922a_ctrl_afe_dac(rtwdev, chan->band_width, RF_PATH_A);
|
||||
rtw8922a_ctrl_afe_dac(rtwdev, chan->band_width, RF_PATH_B);
|
||||
if (mode == MLO_1_PLUS_1_1RF) {
|
||||
chan0 = rtw89_mgnt_chan_get(rtwdev, 0);
|
||||
chan1 = rtw89_mgnt_chan_get(rtwdev, 1);
|
||||
} else if (mode == MLO_0_PLUS_2_1RF) {
|
||||
chan1 = rtw89_mgnt_chan_get(rtwdev, 1);
|
||||
chan0 = chan1;
|
||||
} else {
|
||||
rtw89_warn(rtwdev, "unsupported MLO mode %d\n", mode);
|
||||
chan0 = rtw89_mgnt_chan_get(rtwdev, 0);
|
||||
chan1 = chan0;
|
||||
}
|
||||
|
||||
rtw8922a_ctrl_afe_dac(rtwdev, chan0->band_width, RF_PATH_A);
|
||||
rtw8922a_ctrl_afe_dac(rtwdev, chan1->band_width, RF_PATH_B);
|
||||
|
||||
rtw89_phy_write32_mask(rtwdev, R_EMLSR, B_EMLSR_PARM, 0x6180);
|
||||
|
||||
if (mode == MLO_2_PLUS_0_1RF) {
|
||||
@ -1801,11 +1929,13 @@ static void rtw8922a_pre_set_channel_bb(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static void rtw8922a_post_set_channel_bb(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_mlo_dbcc_mode mode)
|
||||
enum rtw89_mlo_dbcc_mode mode,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
{
|
||||
if (!rtwdev->dbcc_en)
|
||||
return;
|
||||
|
||||
rtw8922a_digital_pwr_comp(rtwdev, phy_idx);
|
||||
rtw8922a_ctrl_mlo(rtwdev, mode);
|
||||
}
|
||||
|
||||
@ -1912,7 +2042,7 @@ static void rtw8922a_set_channel_help(struct rtw89_dev *rtwdev, bool enter,
|
||||
rtw8922a_hal_reset(rtwdev, phy_idx, mac_idx, chan->band_type, &p->tx_en, enter);
|
||||
|
||||
if (!enter) {
|
||||
rtw8922a_post_set_channel_bb(rtwdev, rtwdev->mlo_dbcc_mode);
|
||||
rtw8922a_post_set_channel_bb(rtwdev, rtwdev->mlo_dbcc_mode, phy_idx);
|
||||
rtw8922a_post_set_channel_rf(rtwdev, phy_idx);
|
||||
}
|
||||
}
|
||||
@ -1926,12 +2056,23 @@ static void rtw8922a_rfk_init(struct rtw89_dev *rtwdev)
|
||||
memset(rfk_mcc, 0, sizeof(*rfk_mcc));
|
||||
}
|
||||
|
||||
static void __rtw8922a_rfk_init_late(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
rtw89_phy_rfk_pre_ntfy_and_wait(rtwdev, phy_idx, 5);
|
||||
|
||||
rtw89_phy_rfk_dack_and_wait(rtwdev, phy_idx, chan, 58);
|
||||
rtw89_phy_rfk_rxdck_and_wait(rtwdev, phy_idx, chan, false, 32);
|
||||
}
|
||||
|
||||
static void rtw8922a_rfk_init_late(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
rtw89_phy_rfk_pre_ntfy_and_wait(rtwdev, RTW89_PHY_0, 5);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
|
||||
rtw89_phy_rfk_dack_and_wait(rtwdev, RTW89_PHY_0, 58);
|
||||
rtw89_phy_rfk_rxdck_and_wait(rtwdev, RTW89_PHY_0, 32);
|
||||
__rtw8922a_rfk_init_late(rtwdev, RTW89_PHY_0, chan);
|
||||
if (rtwdev->dbcc_en)
|
||||
__rtw8922a_rfk_init_late(rtwdev, RTW89_PHY_1, chan);
|
||||
}
|
||||
|
||||
static void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath)
|
||||
@ -1953,10 +2094,13 @@ static void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath)
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8922a_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
static void rtw8922a_rfk_channel(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
|
||||
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);
|
||||
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
|
||||
u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, chanctx_idx);
|
||||
u32 tx_en;
|
||||
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_CHLK, BTC_WRFK_START);
|
||||
@ -1964,23 +2108,26 @@ static void rtw8922a_rfk_channel(struct rtw89_dev *rtwdev)
|
||||
_wait_rx_mode(rtwdev, RF_AB);
|
||||
|
||||
rtw89_phy_rfk_pre_ntfy_and_wait(rtwdev, phy_idx, 5);
|
||||
rtw89_phy_rfk_txgapk_and_wait(rtwdev, phy_idx, 54);
|
||||
rtw89_phy_rfk_iqk_and_wait(rtwdev, phy_idx, 84);
|
||||
rtw89_phy_rfk_tssi_and_wait(rtwdev, phy_idx, RTW89_TSSI_NORMAL, 6);
|
||||
rtw89_phy_rfk_dpk_and_wait(rtwdev, phy_idx, 34);
|
||||
rtw89_phy_rfk_rxdck_and_wait(rtwdev, RTW89_PHY_0, 32);
|
||||
rtw89_phy_rfk_txgapk_and_wait(rtwdev, phy_idx, chan, 54);
|
||||
rtw89_phy_rfk_iqk_and_wait(rtwdev, phy_idx, chan, 84);
|
||||
rtw89_phy_rfk_tssi_and_wait(rtwdev, phy_idx, chan, RTW89_TSSI_NORMAL, 20);
|
||||
rtw89_phy_rfk_dpk_and_wait(rtwdev, phy_idx, chan, 34);
|
||||
rtw89_phy_rfk_rxdck_and_wait(rtwdev, RTW89_PHY_0, chan, true, 32);
|
||||
|
||||
rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
|
||||
rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_CHLK, BTC_WRFK_STOP);
|
||||
}
|
||||
|
||||
static void rtw8922a_rfk_band_changed(struct rtw89_dev *rtwdev,
|
||||
enum rtw89_phy_idx phy_idx)
|
||||
enum rtw89_phy_idx phy_idx,
|
||||
const struct rtw89_chan *chan)
|
||||
{
|
||||
rtw89_phy_rfk_tssi_and_wait(rtwdev, phy_idx, RTW89_TSSI_SCAN, 6);
|
||||
rtw89_phy_rfk_tssi_and_wait(rtwdev, phy_idx, chan, RTW89_TSSI_SCAN, 6);
|
||||
}
|
||||
|
||||
static void rtw8922a_rfk_scan(struct rtw89_dev *rtwdev, bool start)
|
||||
static void rtw8922a_rfk_scan(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
bool start)
|
||||
{
|
||||
}
|
||||
|
||||
@ -2109,7 +2256,7 @@ static void rtw8922a_ctrl_nbtg_bt_tx(struct rtw89_dev *rtwdev, bool en,
|
||||
|
||||
static void rtw8922a_bb_cfg_txrx_path(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
enum rtw89_band band = chan->band_type;
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
u8 ntx_path = RF_PATH_AB;
|
||||
@ -2136,10 +2283,12 @@ static void rtw8922a_bb_cfg_txrx_path(struct rtw89_dev *rtwdev)
|
||||
static u8 rtw8922a_get_thermal(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path)
|
||||
{
|
||||
struct rtw89_power_trim_info *info = &rtwdev->pwr_trim;
|
||||
struct rtw89_hal *hal = &rtwdev->hal;
|
||||
int th;
|
||||
|
||||
/* read thermal only if debugging */
|
||||
if (!rtw89_debug_is_enabled(rtwdev, RTW89_DBG_CFO | RTW89_DBG_RFK_TRACK))
|
||||
/* read thermal only if debugging or thermal protection enabled */
|
||||
if (!rtw89_debug_is_enabled(rtwdev, RTW89_DBG_CFO | RTW89_DBG_RFK_TRACK) &&
|
||||
!hal->thermal_prot_th)
|
||||
return 80;
|
||||
|
||||
rtw89_write_rf(rtwdev, rf_path, RR_TM, RR_TM_TRI, 0x1);
|
||||
@ -2416,8 +2565,10 @@ static void rtw8922a_query_ppdu(struct rtw89_dev *rtwdev,
|
||||
u8 path;
|
||||
u8 *rx_power = phy_ppdu->rssi;
|
||||
|
||||
status->signal =
|
||||
RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
|
||||
if (!status->signal)
|
||||
status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A],
|
||||
rx_power[RF_PATH_B]));
|
||||
|
||||
for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
|
||||
status->chains |= BIT(path);
|
||||
status->chain_signal[path] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
|
||||
@ -2426,6 +2577,48 @@ static void rtw8922a_query_ppdu(struct rtw89_dev *rtwdev,
|
||||
rtw8922a_fill_freq_with_ppdu(rtwdev, phy_ppdu, status);
|
||||
}
|
||||
|
||||
static void rtw8922a_convert_rpl_to_rssi(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_rx_phy_ppdu *phy_ppdu)
|
||||
{
|
||||
/* Mapping to BW: 5, 10, 20, 40, 80, 160, 80_80 */
|
||||
static const u8 bw_compensate[] = {0, 0, 0, 6, 12, 18, 0};
|
||||
u8 *rssi = phy_ppdu->rssi;
|
||||
u8 compensate = 0;
|
||||
u16 rpl_tmp;
|
||||
u8 i;
|
||||
|
||||
if (phy_ppdu->bw_idx < ARRAY_SIZE(bw_compensate))
|
||||
compensate = bw_compensate[phy_ppdu->bw_idx];
|
||||
|
||||
for (i = 0; i < RF_PATH_NUM_8922A; i++) {
|
||||
if (!(phy_ppdu->rx_path_en & BIT(i))) {
|
||||
rssi[i] = 0;
|
||||
phy_ppdu->rpl_path[i] = 0;
|
||||
phy_ppdu->rpl_fd[i] = 0;
|
||||
}
|
||||
if (phy_ppdu->rate >= RTW89_HW_RATE_OFDM6) {
|
||||
rpl_tmp = phy_ppdu->rpl_fd[i];
|
||||
if (rpl_tmp)
|
||||
rpl_tmp += compensate;
|
||||
|
||||
phy_ppdu->rpl_path[i] = rpl_tmp;
|
||||
}
|
||||
rssi[i] = phy_ppdu->rpl_path[i];
|
||||
}
|
||||
|
||||
phy_ppdu->rssi_avg = phy_ppdu->rpl_avg;
|
||||
}
|
||||
|
||||
static void rtw8922a_phy_rpt_to_rssi(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_rx_desc_info *desc_info,
|
||||
struct ieee80211_rx_status *rx_status)
|
||||
{
|
||||
if (desc_info->rssi <= 0x1 || (desc_info->rssi >> 2) > MAX_RSSI)
|
||||
return;
|
||||
|
||||
rx_status->signal = (desc_info->rssi >> 2) - MAX_RSSI;
|
||||
}
|
||||
|
||||
static int rtw8922a_mac_enable_bb_rf(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
rtw89_write8_set(rtwdev, R_BE_FEN_RST_ENABLE,
|
||||
@ -2445,10 +2638,12 @@ static int rtw8922a_mac_disable_bb_rf(struct rtw89_dev *rtwdev)
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct wiphy_wowlan_support rtw_wowlan_stub_8922a = {
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
|
||||
.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT |
|
||||
WIPHY_WOWLAN_NET_DETECT,
|
||||
.n_patterns = RTW89_MAX_PATTERN_NUM,
|
||||
.pattern_max_len = RTW89_MAX_PATTERN_SIZE,
|
||||
.pattern_min_len = 1,
|
||||
.max_nd_match_sets = RTW89_SCANOFLD_MAX_SSID,
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -2481,9 +2676,12 @@ static const struct rtw89_chip_ops rtw8922a_chip_ops = {
|
||||
.get_thermal = rtw8922a_get_thermal,
|
||||
.ctrl_btg_bt_rx = rtw8922a_ctrl_btg_bt_rx,
|
||||
.query_ppdu = rtw8922a_query_ppdu,
|
||||
.convert_rpl_to_rssi = rtw8922a_convert_rpl_to_rssi,
|
||||
.phy_rpt_to_rssi = rtw8922a_phy_rpt_to_rssi,
|
||||
.ctrl_nbtg_bt_tx = rtw8922a_ctrl_nbtg_bt_tx,
|
||||
.cfg_txrx_path = rtw8922a_bb_cfg_txrx_path,
|
||||
.set_txpwr_ul_tb_offset = NULL,
|
||||
.digital_pwr_comp = rtw8922a_digital_pwr_comp,
|
||||
.pwr_on_func = rtw8922a_pwr_on_func,
|
||||
.pwr_off_func = rtw8922a_pwr_off_func,
|
||||
.query_rxdesc = rtw89_core_query_rxdesc_v2,
|
||||
@ -2534,6 +2732,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
|
||||
.wde_qempty_acq_grpnum = 4,
|
||||
.wde_qempty_mgq_grpsel = 4,
|
||||
.rf_base_addr = {0xe000, 0xf000},
|
||||
.thermal_th = {0xad, 0xb4},
|
||||
.pwr_on_seq = NULL,
|
||||
.pwr_off_seq = NULL,
|
||||
.bb_table = NULL,
|
||||
@ -2543,12 +2742,14 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
|
||||
.nctl_post_table = NULL,
|
||||
.dflt_parms = NULL, /* load parm from fw */
|
||||
.rfe_parms_conf = NULL, /* load parm from fw */
|
||||
.txpwr_factor_bb = 3,
|
||||
.txpwr_factor_rf = 2,
|
||||
.txpwr_factor_mac = 1,
|
||||
.dig_table = NULL,
|
||||
.dig_regs = &rtw8922a_dig_regs,
|
||||
.tssi_dbw_table = NULL,
|
||||
.support_macid_num = 32,
|
||||
.support_link_num = 2,
|
||||
.support_chanctx_num = 2,
|
||||
.support_rnr = true,
|
||||
.support_bands = BIT(NL80211_BAND_2GHZ) |
|
||||
@ -2559,9 +2760,11 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
|
||||
BIT(NL80211_CHAN_WIDTH_80) |
|
||||
BIT(NL80211_CHAN_WIDTH_160),
|
||||
.support_unii4 = true,
|
||||
.support_ant_gain = false,
|
||||
.ul_tb_waveform_ctrl = false,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.hw_sec_hdr = true,
|
||||
.hw_mgmt_tx_encrypt = true,
|
||||
.rf_path_num = 2,
|
||||
.tx_nss = 2,
|
||||
.rx_nss = 2,
|
||||
@ -2624,6 +2827,8 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
|
||||
.rrsr_cfgs = &rtw8922a_rrsr_cfgs,
|
||||
.bss_clr_vld = {R_BSS_CLR_VLD_V2, B_BSS_CLR_VLD0_V2},
|
||||
.bss_clr_map_reg = R_BSS_CLR_MAP_V2,
|
||||
.rfkill_init = &rtw8922a_rfkill_regs,
|
||||
.rfkill_get = {R_BE_GPIO_EXT_CTRL, B_BE_GPIO_IN_9},
|
||||
.dma_ch_mask = 0,
|
||||
.edcca_regs = &rtw8922a_edcca_regs,
|
||||
#ifdef CONFIG_PM
|
||||
@ -2633,6 +2838,12 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8922a_chip_info);
|
||||
|
||||
const struct rtw89_chip_variant rtw8922ae_vs_variant = {
|
||||
.no_mcs_12_13 = true,
|
||||
.fw_min_ver_code = RTW89_FW_VER_CODE(0, 35, 54, 0),
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8922ae_vs_variant);
|
||||
|
||||
MODULE_FIRMWARE(RTW8922A_MODULE_FIRMWARE);
|
||||
MODULE_AUTHOR("Realtek Corporation");
|
||||
MODULE_DESCRIPTION("Realtek 802.11be wireless 8922A driver");
|
||||
|
||||
@ -69,5 +69,6 @@ struct rtw8922a_efuse {
|
||||
} __packed;
|
||||
|
||||
extern const struct rtw89_chip_info rtw8922a_chip_info;
|
||||
extern const struct rtw89_chip_variant rtw8922ae_vs_variant;
|
||||
|
||||
#endif
|
||||
|
||||
@ -252,49 +252,58 @@ static void rtw8922a_chlk_ktbl_sel(struct rtw89_dev *rtwdev, u8 kpath, u8 idx)
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw8922a_chlk_reload(struct rtw89_dev *rtwdev)
|
||||
static u8 rtw8922a_chlk_reload_sel_tbl(struct rtw89_dev *rtwdev,
|
||||
const struct rtw89_chan *chan, u8 path)
|
||||
{
|
||||
struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc;
|
||||
struct rtw89_rfk_chan_desc desc[__RTW89_RFK_CHS_NR_V1] = {};
|
||||
enum rtw89_sub_entity_idx sub_entity_idx;
|
||||
const struct rtw89_chan *chan;
|
||||
enum rtw89_entity_mode mode;
|
||||
u8 s0_tbl, s1_tbl;
|
||||
u8 tbl_sel;
|
||||
|
||||
mode = rtw89_get_entity_mode(rtwdev);
|
||||
switch (mode) {
|
||||
case RTW89_ENTITY_MODE_MCC_PREPARE:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_1;
|
||||
break;
|
||||
default:
|
||||
sub_entity_idx = RTW89_SUB_ENTITY_0;
|
||||
break;
|
||||
}
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, sub_entity_idx);
|
||||
|
||||
for (tbl_sel = 0; tbl_sel < ARRAY_SIZE(desc); tbl_sel++) {
|
||||
struct rtw89_rfk_chan_desc *p = &desc[tbl_sel];
|
||||
|
||||
p->ch = rfk_mcc->ch[tbl_sel];
|
||||
p->ch = rfk_mcc->data[path].ch[tbl_sel];
|
||||
|
||||
p->has_band = true;
|
||||
p->band = rfk_mcc->band[tbl_sel];
|
||||
p->band = rfk_mcc->data[path].band[tbl_sel];
|
||||
|
||||
p->has_bw = true;
|
||||
p->bw = rfk_mcc->bw[tbl_sel];
|
||||
p->bw = rfk_mcc->data[path].bw[tbl_sel];
|
||||
}
|
||||
|
||||
tbl_sel = rtw89_rfk_chan_lookup(rtwdev, desc, ARRAY_SIZE(desc), chan);
|
||||
|
||||
rfk_mcc->ch[tbl_sel] = chan->channel;
|
||||
rfk_mcc->band[tbl_sel] = chan->band_type;
|
||||
rfk_mcc->bw[tbl_sel] = chan->band_width;
|
||||
rfk_mcc->table_idx = tbl_sel;
|
||||
rfk_mcc->data[path].ch[tbl_sel] = chan->channel;
|
||||
rfk_mcc->data[path].band[tbl_sel] = chan->band_type;
|
||||
rfk_mcc->data[path].bw[tbl_sel] = chan->band_width;
|
||||
rfk_mcc->data[path].table_idx = tbl_sel;
|
||||
|
||||
s0_tbl = tbl_sel;
|
||||
s1_tbl = tbl_sel;
|
||||
return tbl_sel;
|
||||
}
|
||||
|
||||
static void rtw8922a_chlk_reload(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
const struct rtw89_chan *chan0, *chan1;
|
||||
u8 s0_tbl, s1_tbl;
|
||||
|
||||
switch (rtwdev->mlo_dbcc_mode) {
|
||||
default:
|
||||
case MLO_2_PLUS_0_1RF:
|
||||
chan0 = rtw89_mgnt_chan_get(rtwdev, 0);
|
||||
chan1 = chan0;
|
||||
break;
|
||||
case MLO_0_PLUS_2_1RF:
|
||||
chan1 = rtw89_mgnt_chan_get(rtwdev, 1);
|
||||
chan0 = chan1;
|
||||
break;
|
||||
case MLO_1_PLUS_1_1RF:
|
||||
chan0 = rtw89_mgnt_chan_get(rtwdev, 0);
|
||||
chan1 = rtw89_mgnt_chan_get(rtwdev, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
s0_tbl = rtw8922a_chlk_reload_sel_tbl(rtwdev, chan0, 0);
|
||||
s1_tbl = rtw8922a_chlk_reload_sel_tbl(rtwdev, chan1, 1);
|
||||
|
||||
rtw8922a_chlk_ktbl_sel(rtwdev, RF_A, s0_tbl);
|
||||
rtw8922a_chlk_ktbl_sel(rtwdev, RF_B, s1_tbl);
|
||||
|
||||
@ -9,6 +9,12 @@
|
||||
#include "reg.h"
|
||||
#include "rtw8922a.h"
|
||||
|
||||
static const struct rtw89_pci_ssid_quirk rtw8922a_pci_ssid_quirks[] = {
|
||||
{RTW89_PCI_SSID(PCI_VENDOR_ID_REALTEK, 0x8922, 0x10EC, 0xA891, DELL),
|
||||
.bitmap = BIT(RTW89_QUIRK_THERMAL_PROT_120C)},
|
||||
{},
|
||||
};
|
||||
|
||||
static const struct rtw89_pci_info rtw8922a_pci_info = {
|
||||
.gen_def = &rtw89_pci_gen_be,
|
||||
.txbd_trunc_mode = MAC_AX_BD_TRUNC,
|
||||
@ -27,6 +33,7 @@ static const struct rtw89_pci_info rtw8922a_pci_info = {
|
||||
.io_rcy_tmr = MAC_AX_IO_RCY_ANA_TMR_DEF,
|
||||
.rx_ring_eq_is_full = true,
|
||||
.check_rx_tag = true,
|
||||
.no_rxbd_fs = true,
|
||||
|
||||
.init_cfg_reg = R_BE_HAXI_INIT_CFG1,
|
||||
.txhci_en_bit = B_BE_TXDMA_EN,
|
||||
@ -58,10 +65,22 @@ static const struct rtw89_pci_info rtw8922a_pci_info = {
|
||||
.enable_intr = rtw89_pci_enable_intr_v2,
|
||||
.disable_intr = rtw89_pci_disable_intr_v2,
|
||||
.recognize_intrs = rtw89_pci_recognize_intrs_v2,
|
||||
|
||||
.ssid_quirks = rtw8922a_pci_ssid_quirks,
|
||||
};
|
||||
|
||||
static const struct rtw89_driver_info rtw89_8922ae_info = {
|
||||
.chip = &rtw8922a_chip_info,
|
||||
.variant = NULL,
|
||||
.quirks = NULL,
|
||||
.bus = {
|
||||
.pci = &rtw8922a_pci_info,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct rtw89_driver_info rtw89_8922ae_vs_info = {
|
||||
.chip = &rtw8922a_chip_info,
|
||||
.variant = &rtw8922ae_vs_variant,
|
||||
.quirks = NULL,
|
||||
.bus = {
|
||||
.pci = &rtw8922a_pci_info,
|
||||
@ -73,6 +92,10 @@ static const struct pci_device_id rtw89_8922ae_id_table[] = {
|
||||
PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8922),
|
||||
.driver_data = (kernel_ulong_t)&rtw89_8922ae_info,
|
||||
},
|
||||
{
|
||||
PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x892B),
|
||||
.driver_data = (kernel_ulong_t)&rtw89_8922ae_vs_info,
|
||||
},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, rtw89_8922ae_id_table);
|
||||
@ -90,5 +113,5 @@ static struct pci_driver rtw89_8922ae_driver = {
|
||||
module_pci_driver(rtw89_8922ae_driver);
|
||||
|
||||
MODULE_AUTHOR("Realtek Corporation");
|
||||
MODULE_DESCRIPTION("Realtek 802.11be wireless 8922AE driver");
|
||||
MODULE_DESCRIPTION("Realtek 802.11be wireless 8922AE/8922AE-VS driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
@ -27,8 +27,8 @@ static enum rtw89_sar_subband rtw89_sar_get_subband(struct rtw89_dev *rtwdev,
|
||||
return RTW89_SAR_5GHZ_SUBBAND_1_2;
|
||||
case 5500 ... 5720:
|
||||
return RTW89_SAR_5GHZ_SUBBAND_2_E;
|
||||
case 5745 ... 5825:
|
||||
return RTW89_SAR_5GHZ_SUBBAND_3;
|
||||
case 5745 ... 5885:
|
||||
return RTW89_SAR_5GHZ_SUBBAND_3_4;
|
||||
case 5955 ... 6155:
|
||||
return RTW89_SAR_6GHZ_SUBBAND_5_L;
|
||||
case 6175 ... 6415:
|
||||
@ -42,7 +42,7 @@ static enum rtw89_sar_subband rtw89_sar_get_subband(struct rtw89_dev *rtwdev,
|
||||
|
||||
/* freq 6875 (ch 185, 20MHz) spans RTW89_SAR_6GHZ_SUBBAND_7_H
|
||||
* and RTW89_SAR_6GHZ_SUBBAND_8, so directly describe it with
|
||||
* struct rtw89_sar_span in the following.
|
||||
* struct rtw89_6ghz_span.
|
||||
*/
|
||||
|
||||
case 6895 ... 7115:
|
||||
@ -50,63 +50,18 @@ static enum rtw89_sar_subband rtw89_sar_get_subband(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
}
|
||||
|
||||
struct rtw89_sar_span {
|
||||
enum rtw89_sar_subband subband_low;
|
||||
enum rtw89_sar_subband subband_high;
|
||||
};
|
||||
|
||||
#define RTW89_SAR_SPAN_VALID(span) ((span)->subband_high)
|
||||
|
||||
#define RTW89_SAR_6GHZ_SPAN_HEAD 6145
|
||||
#define RTW89_SAR_6GHZ_SPAN_IDX(center_freq) \
|
||||
((((int)(center_freq) - RTW89_SAR_6GHZ_SPAN_HEAD) / 5) / 2)
|
||||
|
||||
#define RTW89_DECL_SAR_6GHZ_SPAN(center_freq, subband_l, subband_h) \
|
||||
[RTW89_SAR_6GHZ_SPAN_IDX(center_freq)] = { \
|
||||
.subband_low = RTW89_SAR_6GHZ_ ## subband_l, \
|
||||
.subband_high = RTW89_SAR_6GHZ_ ## subband_h, \
|
||||
}
|
||||
|
||||
/* Since 6GHz SAR subbands are not edge aligned, some cases span two SAR
|
||||
* subbands. In the following, we describe each of them with rtw89_sar_span.
|
||||
*/
|
||||
static const struct rtw89_sar_span rtw89_sar_overlapping_6ghz[] = {
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6145, SUBBAND_5_L, SUBBAND_5_H),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6165, SUBBAND_5_L, SUBBAND_5_H),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6185, SUBBAND_5_L, SUBBAND_5_H),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6505, SUBBAND_6, SUBBAND_7_L),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6525, SUBBAND_6, SUBBAND_7_L),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6545, SUBBAND_6, SUBBAND_7_L),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6665, SUBBAND_7_L, SUBBAND_7_H),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6705, SUBBAND_7_L, SUBBAND_7_H),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6825, SUBBAND_7_H, SUBBAND_8),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6865, SUBBAND_7_H, SUBBAND_8),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6875, SUBBAND_7_H, SUBBAND_8),
|
||||
RTW89_DECL_SAR_6GHZ_SPAN(6885, SUBBAND_7_H, SUBBAND_8),
|
||||
};
|
||||
|
||||
static int rtw89_query_sar_config_common(struct rtw89_dev *rtwdev,
|
||||
u32 center_freq, s32 *cfg)
|
||||
{
|
||||
struct rtw89_sar_cfg_common *rtwsar = &rtwdev->sar.cfg_common;
|
||||
const struct rtw89_sar_span *span = NULL;
|
||||
enum rtw89_sar_subband subband_l, subband_h;
|
||||
int idx;
|
||||
const struct rtw89_6ghz_span *span;
|
||||
|
||||
if (center_freq >= RTW89_SAR_6GHZ_SPAN_HEAD) {
|
||||
idx = RTW89_SAR_6GHZ_SPAN_IDX(center_freq);
|
||||
/* To decrease size of rtw89_sar_overlapping_6ghz[],
|
||||
* RTW89_SAR_6GHZ_SPAN_IDX() truncates the leading NULLs
|
||||
* to make first span as index 0 of the table. So, if center
|
||||
* frequency is less than the first one, it will get netative.
|
||||
*/
|
||||
if (idx >= 0 && idx < ARRAY_SIZE(rtw89_sar_overlapping_6ghz))
|
||||
span = &rtw89_sar_overlapping_6ghz[idx];
|
||||
}
|
||||
span = rtw89_get_6ghz_span(rtwdev, center_freq);
|
||||
|
||||
if (span && RTW89_SAR_SPAN_VALID(span)) {
|
||||
subband_l = span->subband_low;
|
||||
subband_h = span->subband_high;
|
||||
subband_l = span->sar_subband_low;
|
||||
subband_h = span->sar_subband_high;
|
||||
} else {
|
||||
subband_l = rtw89_sar_get_subband(rtwdev, center_freq);
|
||||
subband_h = subband_l;
|
||||
@ -295,7 +250,7 @@ static const struct cfg80211_sar_freq_ranges rtw89_common_sar_freq_ranges[] = {
|
||||
{ .start_freq = 2412, .end_freq = 2484, },
|
||||
{ .start_freq = 5180, .end_freq = 5320, },
|
||||
{ .start_freq = 5500, .end_freq = 5720, },
|
||||
{ .start_freq = 5745, .end_freq = 5825, },
|
||||
{ .start_freq = 5745, .end_freq = 5885, },
|
||||
{ .start_freq = 5955, .end_freq = 6155, },
|
||||
{ .start_freq = 6175, .end_freq = 6415, },
|
||||
{ .start_freq = 6435, .end_freq = 6515, },
|
||||
@ -370,7 +325,7 @@ static void rtw89_tas_state_update(struct rtw89_dev *rtwdev)
|
||||
if (src == RTW89_SAR_SOURCE_NONE)
|
||||
return;
|
||||
|
||||
chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
|
||||
chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
|
||||
ret = sar_hdl->query_sar_config(rtwdev, chan->freq, &cfg);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
@ -300,37 +300,54 @@ static void drv_resume_rx(struct rtw89_ser *ser)
|
||||
|
||||
static void ser_reset_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif->port);
|
||||
rtwvif->net_type = RTW89_NET_TYPE_NO_LINK;
|
||||
rtwvif->trigger = false;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
unsigned int link_id;
|
||||
|
||||
rtwvif->tdls_peer = 0;
|
||||
|
||||
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) {
|
||||
rtw89_core_release_bit_map(rtwdev->hw_port, rtwvif_link->port);
|
||||
rtwvif_link->net_type = RTW89_NET_TYPE_NO_LINK;
|
||||
rtwvif_link->trigger = false;
|
||||
}
|
||||
}
|
||||
|
||||
static void ser_sta_deinit_cam_iter(void *data, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *target_rtwvif = (struct rtw89_vif *)data;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_sta *rtwsta = sta_to_rtwsta(sta);
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_sta_link *rtwsta_link;
|
||||
unsigned int link_id;
|
||||
|
||||
if (rtwvif != target_rtwvif)
|
||||
return;
|
||||
|
||||
if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE || sta->tdls)
|
||||
rtw89_cam_deinit_addr_cam(rtwdev, &rtwsta->addr_cam);
|
||||
if (sta->tdls)
|
||||
rtw89_cam_deinit_bssid_cam(rtwdev, &rtwsta->bssid_cam);
|
||||
rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
|
||||
rtwvif_link = rtwsta_link->rtwvif_link;
|
||||
|
||||
INIT_LIST_HEAD(&rtwsta->ba_cam_list);
|
||||
if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE || sta->tdls)
|
||||
rtw89_cam_deinit_addr_cam(rtwdev, &rtwsta_link->addr_cam);
|
||||
if (sta->tdls)
|
||||
rtw89_cam_deinit_bssid_cam(rtwdev, &rtwsta_link->bssid_cam);
|
||||
|
||||
INIT_LIST_HEAD(&rtwsta_link->ba_cam_list);
|
||||
}
|
||||
}
|
||||
|
||||
static void ser_deinit_cam(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
{
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
unsigned int link_id;
|
||||
|
||||
ieee80211_iterate_stations_atomic(rtwdev->hw,
|
||||
ser_sta_deinit_cam_iter,
|
||||
rtwvif);
|
||||
|
||||
rtw89_cam_deinit(rtwdev, rtwvif);
|
||||
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id)
|
||||
rtw89_cam_deinit(rtwdev, rtwvif_link);
|
||||
|
||||
bitmap_zero(rtwdev->cam_info.ba_cam_map, RTW89_MAX_BA_CAM_NUM);
|
||||
}
|
||||
@ -348,6 +365,7 @@ static void ser_reset_mac_binding(struct rtw89_dev *rtwdev)
|
||||
ser_reset_vif(rtwdev, rtwvif);
|
||||
|
||||
rtwdev->total_sta_assoc = 0;
|
||||
refcount_set(&rtwdev->refcount_ap_info, 0);
|
||||
}
|
||||
|
||||
/* hal function */
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
#define DATA_RATE_HT_IDX_MASK GENMASK(4, 0)
|
||||
#define DATA_RATE_HT_IDX_MASK_V1 GENMASK(4, 0)
|
||||
#define DATA_RATE_MODE_HT 0x1
|
||||
#define DATA_RATE_HT_NSS_MASK GENMASK(4, 3)
|
||||
#define DATA_RATE_VHT_HE_NSS_MASK GENMASK(6, 4)
|
||||
#define DATA_RATE_VHT_HE_IDX_MASK GENMASK(3, 0)
|
||||
#define DATA_RATE_NSS_MASK_V1 GENMASK(7, 5)
|
||||
@ -51,6 +52,11 @@ static inline u8 rtw89_get_data_mcs(struct rtw89_dev *rtwdev, u16 hw_rate)
|
||||
return u16_get_bits(hw_rate, DATA_RATE_VHT_HE_IDX_MASK);
|
||||
}
|
||||
|
||||
static inline u8 rtw89_get_data_ht_nss(struct rtw89_dev *rtwdev, u16 hw_rate)
|
||||
{
|
||||
return u16_get_bits(hw_rate, DATA_RATE_HT_NSS_MASK);
|
||||
}
|
||||
|
||||
static inline u8 rtw89_get_data_nss(struct rtw89_dev *rtwdev, u16 hw_rate)
|
||||
{
|
||||
if (rtwdev->chip->chip_gen == RTW89_CHIP_BE)
|
||||
@ -408,7 +414,7 @@ struct rtw89_rxinfo_user {
|
||||
#define RTW89_RXINFO_USER_DATA BIT(1)
|
||||
#define RTW89_RXINFO_USER_CTRL BIT(2)
|
||||
#define RTW89_RXINFO_USER_MGMT BIT(3)
|
||||
#define RTW89_RXINFO_USER_BCM BIT(4)
|
||||
#define RTW89_RXINFO_USER_BCN BIT(4)
|
||||
#define RTW89_RXINFO_USER_MACID GENMASK(15, 8)
|
||||
|
||||
struct rtw89_rxinfo {
|
||||
@ -435,6 +441,7 @@ struct rtw89_phy_sts_hdr {
|
||||
} __packed;
|
||||
|
||||
#define RTW89_PHY_STS_HDR_W0_IE_MAP GENMASK(4, 0)
|
||||
#define RTW89_PHY_STS_HDR_W0_HDR_2_EN BIT(5)
|
||||
#define RTW89_PHY_STS_HDR_W0_VALID BIT(7)
|
||||
#define RTW89_PHY_STS_HDR_W0_LEN GENMASK(15, 8)
|
||||
#define RTW89_PHY_STS_HDR_W0_RSSI_AVG GENMASK(31, 24)
|
||||
@ -443,6 +450,13 @@ struct rtw89_phy_sts_hdr {
|
||||
#define RTW89_PHY_STS_HDR_W1_RSSI_C GENMASK(23, 16)
|
||||
#define RTW89_PHY_STS_HDR_W1_RSSI_D GENMASK(31, 24)
|
||||
|
||||
struct rtw89_phy_sts_hdr_v2 {
|
||||
__le32 w0;
|
||||
__le32 w1;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_PHY_STS_HDR_V2_W0_PATH_EN GENMASK(20, 16)
|
||||
|
||||
struct rtw89_phy_sts_iehdr {
|
||||
__le32 w0;
|
||||
};
|
||||
@ -546,13 +560,46 @@ struct rtw89_phy_sts_iehdr {
|
||||
#define BE_RXD_HDR_OFFSET_MASK GENMASK(20, 16)
|
||||
#define BE_RXD_WL_HD_IV_LEN_MASK GENMASK(26, 21)
|
||||
|
||||
struct rtw89_phy_sts_ie0 {
|
||||
/* BE RXD - PHY RPT dword0 */
|
||||
#define BE_RXD_PHY_RSSI GENMASK(11, 0)
|
||||
|
||||
struct rtw89_phy_sts_ie00 {
|
||||
__le32 w0;
|
||||
__le32 w1;
|
||||
__le32 w2;
|
||||
__le32 w3;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_PHY_STS_IE00_W0_RPL GENMASK(15, 7)
|
||||
|
||||
struct rtw89_phy_sts_ie00_v2 {
|
||||
__le32 w0;
|
||||
__le32 w1;
|
||||
__le32 w2;
|
||||
__le32 w3;
|
||||
__le32 w4;
|
||||
__le32 w5;
|
||||
__le32 w6;
|
||||
__le32 w7;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_PHY_STS_IE00_V2_W4_RPL_TD_A GENMASK(8, 0)
|
||||
#define RTW89_PHY_STS_IE00_V2_W4_RPL_TD_B GENMASK(17, 9)
|
||||
#define RTW89_PHY_STS_IE00_V2_W4_RPL_TD_C GENMASK(26, 18)
|
||||
#define RTW89_PHY_STS_IE00_V2_W5_RPL_TD_D GENMASK(8, 0)
|
||||
|
||||
struct rtw89_phy_sts_ie01 {
|
||||
__le32 w0;
|
||||
__le32 w1;
|
||||
__le32 w2;
|
||||
__le32 w3;
|
||||
__le32 w4;
|
||||
__le32 w5;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_PHY_STS_IE01_W0_CH_IDX GENMASK(23, 16)
|
||||
#define RTW89_PHY_STS_IE01_W0_RSSI_AVG_FD GENMASK(15, 8)
|
||||
#define RTW89_PHY_STS_IE01_W0_RX_PATH_EN GENMASK(31, 28)
|
||||
#define RTW89_PHY_STS_IE01_W1_FD_CFO GENMASK(19, 8)
|
||||
#define RTW89_PHY_STS_IE01_W1_PREMB_CFO GENMASK(31, 20)
|
||||
#define RTW89_PHY_STS_IE01_W2_AVG_SNR GENMASK(5, 0)
|
||||
@ -561,6 +608,25 @@ struct rtw89_phy_sts_ie0 {
|
||||
#define RTW89_PHY_STS_IE01_W2_LDPC BIT(28)
|
||||
#define RTW89_PHY_STS_IE01_W2_STBC BIT(30)
|
||||
|
||||
struct rtw89_phy_sts_ie01_v2 {
|
||||
__le32 w0;
|
||||
__le32 w1;
|
||||
__le32 w2;
|
||||
__le32 w3;
|
||||
__le32 w4;
|
||||
__le32 w5;
|
||||
__le32 w6;
|
||||
__le32 w7;
|
||||
__le32 w8;
|
||||
__le32 w9;
|
||||
} __packed;
|
||||
|
||||
#define RTW89_PHY_STS_IE01_V2_W5_BW_IDX GENMASK(31, 29)
|
||||
#define RTW89_PHY_STS_IE01_V2_W8_RPL_FD_A GENMASK(11, 4)
|
||||
#define RTW89_PHY_STS_IE01_V2_W8_RPL_FD_B GENMASK(23, 16)
|
||||
#define RTW89_PHY_STS_IE01_V2_W9_RPL_FD_C GENMASK(11, 4)
|
||||
#define RTW89_PHY_STS_IE01_V2_W9_RPL_FD_D GENMASK(23, 16)
|
||||
|
||||
enum rtw89_tx_channel {
|
||||
RTW89_TXCH_ACH0 = 0,
|
||||
RTW89_TXCH_ACH1 = 1,
|
||||
|
||||
@ -16,6 +16,24 @@
|
||||
#define rtw89_for_each_rtwvif(rtwdev, rtwvif) \
|
||||
list_for_each_entry(rtwvif, &(rtwdev)->rtwvifs_list, list)
|
||||
|
||||
/* Before adding rtwvif to list, we need to check if it already exist, beacase
|
||||
* in some case such as SER L2 happen during WoWLAN flow, calling reconfig
|
||||
* twice cause the list to be added twice.
|
||||
*/
|
||||
static inline bool rtw89_rtwvif_in_list(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *new)
|
||||
{
|
||||
struct rtw89_vif *rtwvif;
|
||||
|
||||
lockdep_assert_held(&rtwdev->mutex);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
if (rtwvif == new)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* The result of negative dividend and positive divisor is undefined, but it
|
||||
* should be one case of round-down or round-up. So, make it round-down if the
|
||||
* result is round-up.
|
||||
|
||||
@ -421,7 +421,8 @@ static void rtw89_wow_construct_key_info(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_wow_key_info *key_info = &rtw_wow->key_info;
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
struct ieee80211_vif *wow_vif = rtwvif_link_to_vif(rtwvif_link);
|
||||
bool err = false;
|
||||
|
||||
rcu_read_lock();
|
||||
@ -596,7 +597,8 @@ static int rtw89_wow_get_aoac_rpt(struct rtw89_dev *rtwdev, bool rx_ready)
|
||||
static struct ieee80211_key_conf *rtw89_wow_gtk_rekey(struct rtw89_dev *rtwdev,
|
||||
u32 cipher, u8 keyidx, u8 *gtk)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
struct ieee80211_vif *wow_vif = rtwvif_link_to_vif(rtwvif_link);
|
||||
const struct rtw89_cipher_info *cipher_info;
|
||||
struct ieee80211_key_conf *rekey_conf;
|
||||
struct ieee80211_key_conf *key;
|
||||
@ -618,7 +620,10 @@ static struct ieee80211_key_conf *rtw89_wow_gtk_rekey(struct rtw89_dev *rtwdev,
|
||||
* need to unlock mutex
|
||||
*/
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
key = ieee80211_gtk_rekey_add(wow_vif, rekey_conf, -1);
|
||||
if (ieee80211_vif_is_mld(wow_vif))
|
||||
key = ieee80211_gtk_rekey_add(wow_vif, rekey_conf, rtwvif_link->link_id);
|
||||
else
|
||||
key = ieee80211_gtk_rekey_add(wow_vif, rekey_conf, -1);
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
|
||||
kfree(rekey_conf);
|
||||
@ -632,11 +637,13 @@ static struct ieee80211_key_conf *rtw89_wow_gtk_rekey(struct rtw89_dev *rtwdev,
|
||||
|
||||
static void rtw89_wow_update_key_info(struct rtw89_dev *rtwdev, bool rx_ready)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
struct ieee80211_vif *wow_vif = rtwvif_link_to_vif(rtwvif_link);
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_wow_aoac_report *aoac_rpt = &rtw_wow->aoac_rpt;
|
||||
struct rtw89_set_key_info_iter_data data = {.error = false,
|
||||
.rx_ready = rx_ready};
|
||||
struct ieee80211_bss_conf *bss_conf;
|
||||
struct ieee80211_key_conf *key;
|
||||
|
||||
rcu_read_lock();
|
||||
@ -669,9 +676,15 @@ static void rtw89_wow_update_key_info(struct rtw89_dev *rtwdev, bool rx_ready)
|
||||
return;
|
||||
|
||||
rtw89_rx_pn_set_pmf(rtwdev, key, aoac_rpt->igtk_ipn);
|
||||
ieee80211_gtk_rekey_notify(wow_vif, wow_vif->bss_conf.bssid,
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, true);
|
||||
ieee80211_gtk_rekey_notify(wow_vif, bss_conf->bssid,
|
||||
aoac_rpt->eapol_key_replay_count,
|
||||
GFP_KERNEL);
|
||||
GFP_ATOMIC);
|
||||
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static void rtw89_wow_leave_deep_ps(struct rtw89_dev *rtwdev)
|
||||
@ -681,23 +694,31 @@ static void rtw89_wow_leave_deep_ps(struct rtw89_dev *rtwdev)
|
||||
|
||||
static void rtw89_wow_enter_deep_ps(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
|
||||
__rtw89_enter_ps_mode(rtwdev, rtwvif);
|
||||
__rtw89_enter_ps_mode(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw89_wow_enter_lps(struct rtw89_dev *rtwdev)
|
||||
static void rtw89_wow_enter_ps(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct ieee80211_vif *wow_vif = rtwdev->wow.wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
|
||||
rtw89_enter_lps(rtwdev, rtwvif, false);
|
||||
if (rtw89_wow_mgd_linked(rtwdev))
|
||||
rtw89_enter_lps(rtwdev, rtwvif_link->rtwvif, false);
|
||||
else if (rtw89_wow_no_link(rtwdev))
|
||||
rtw89_fw_h2c_fwips(rtwdev, rtwvif_link, true);
|
||||
}
|
||||
|
||||
static void rtw89_wow_leave_lps(struct rtw89_dev *rtwdev)
|
||||
static void rtw89_wow_leave_ps(struct rtw89_dev *rtwdev, bool enable_wow)
|
||||
{
|
||||
rtw89_leave_lps(rtwdev);
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
|
||||
if (rtw89_wow_mgd_linked(rtwdev)) {
|
||||
rtw89_leave_lps(rtwdev);
|
||||
} else if (rtw89_wow_no_link(rtwdev)) {
|
||||
if (enable_wow)
|
||||
rtw89_leave_ips(rtwdev);
|
||||
else
|
||||
rtw89_fw_h2c_fwips(rtwdev, rtwvif_link, false);
|
||||
}
|
||||
}
|
||||
|
||||
static int rtw89_wow_config_mac(struct rtw89_dev *rtwdev, bool enable_wow)
|
||||
@ -721,6 +742,8 @@ static void rtw89_wow_set_rx_filter(struct rtw89_dev *rtwdev, bool enable)
|
||||
|
||||
static void rtw89_wow_show_wakeup_reason(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
struct ieee80211_vif *wow_vif = rtwvif_link_to_vif(rtwvif_link);
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_wow_aoac_report *aoac_rpt = &rtw_wow->aoac_rpt;
|
||||
struct cfg80211_wowlan_nd_info nd_info;
|
||||
@ -767,31 +790,35 @@ static void rtw89_wow_show_wakeup_reason(struct rtw89_dev *rtwdev)
|
||||
break;
|
||||
default:
|
||||
rtw89_warn(rtwdev, "Unknown wakeup reason %x\n", reason);
|
||||
ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, NULL,
|
||||
GFP_KERNEL);
|
||||
ieee80211_report_wowlan_wakeup(wow_vif, NULL, GFP_KERNEL);
|
||||
return;
|
||||
}
|
||||
|
||||
ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, &wakeup,
|
||||
GFP_KERNEL);
|
||||
ieee80211_report_wowlan_wakeup(wow_vif, &wakeup, GFP_KERNEL);
|
||||
}
|
||||
|
||||
static void rtw89_wow_vif_iter(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
||||
static void rtw89_wow_vif_iter(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
|
||||
struct ieee80211_vif *vif = rtwvif_link_to_vif(rtwvif_link);
|
||||
|
||||
/* Current wowlan function support setting of only one STATION vif.
|
||||
* So when one suitable vif is found, stop the iteration.
|
||||
/* Current WoWLAN function support setting of only vif in
|
||||
* infra mode or no link mode. When one suitable vif is found,
|
||||
* stop the iteration.
|
||||
*/
|
||||
if (rtw_wow->wow_vif || vif->type != NL80211_IFTYPE_STATION)
|
||||
if (rtw_wow->rtwvif_link || vif->type != NL80211_IFTYPE_STATION)
|
||||
return;
|
||||
|
||||
switch (rtwvif->net_type) {
|
||||
switch (rtwvif_link->net_type) {
|
||||
case RTW89_NET_TYPE_INFRA:
|
||||
rtw_wow->wow_vif = vif;
|
||||
if (rtw_wow_has_mgd_features(rtwdev))
|
||||
rtw_wow->rtwvif_link = rtwvif_link;
|
||||
break;
|
||||
case RTW89_NET_TYPE_NO_LINK:
|
||||
if (rtw_wow->pno_inited)
|
||||
rtw_wow->rtwvif_link = rtwvif_link;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -847,7 +874,7 @@ static u16 rtw89_calc_crc(u8 *pdata, int length)
|
||||
return ~crc;
|
||||
}
|
||||
|
||||
static int rtw89_wow_pattern_get_type(struct rtw89_vif *rtwvif,
|
||||
static int rtw89_wow_pattern_get_type(struct rtw89_vif_link *rtwvif_link,
|
||||
struct rtw89_wow_cam_info *rtw_pattern,
|
||||
const u8 *pattern, u8 da_mask)
|
||||
{
|
||||
@ -867,7 +894,7 @@ static int rtw89_wow_pattern_get_type(struct rtw89_vif *rtwvif,
|
||||
rtw_pattern->bc = true;
|
||||
else if (is_multicast_ether_addr(da))
|
||||
rtw_pattern->mc = true;
|
||||
else if (ether_addr_equal(da, rtwvif->mac_addr) &&
|
||||
else if (ether_addr_equal(da, rtwvif_link->mac_addr) &&
|
||||
da_mask == GENMASK(5, 0))
|
||||
rtw_pattern->uc = true;
|
||||
else if (!da_mask) /*da_mask == 0 mean wildcard*/
|
||||
@ -879,7 +906,7 @@ static int rtw89_wow_pattern_get_type(struct rtw89_vif *rtwvif,
|
||||
}
|
||||
|
||||
static int rtw89_wow_pattern_generate(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
const struct cfg80211_pkt_pattern *pkt_pattern,
|
||||
struct rtw89_wow_cam_info *rtw_pattern)
|
||||
{
|
||||
@ -898,7 +925,7 @@ static int rtw89_wow_pattern_generate(struct rtw89_dev *rtwdev,
|
||||
mask_len = DIV_ROUND_UP(len, 8);
|
||||
memset(rtw_pattern, 0, sizeof(*rtw_pattern));
|
||||
|
||||
ret = rtw89_wow_pattern_get_type(rtwvif, rtw_pattern, pattern,
|
||||
ret = rtw89_wow_pattern_get_type(rtwvif_link, rtw_pattern, pattern,
|
||||
mask[0] & GENMASK(5, 0));
|
||||
if (ret)
|
||||
return ret;
|
||||
@ -952,7 +979,7 @@ static int rtw89_wow_pattern_generate(struct rtw89_dev *rtwdev,
|
||||
}
|
||||
|
||||
static int rtw89_wow_parse_patterns(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif *rtwvif,
|
||||
struct rtw89_vif_link *rtwvif_link,
|
||||
struct cfg80211_wowlan *wowlan)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
@ -965,7 +992,7 @@ static int rtw89_wow_parse_patterns(struct rtw89_dev *rtwdev,
|
||||
|
||||
for (i = 0; i < wowlan->n_patterns; i++) {
|
||||
rtw_pattern = &rtw_wow->patterns[i];
|
||||
ret = rtw89_wow_pattern_generate(rtwdev, rtwvif,
|
||||
ret = rtw89_wow_pattern_generate(rtwdev, rtwvif_link,
|
||||
&wowlan->patterns[i],
|
||||
rtw_pattern);
|
||||
if (ret) {
|
||||
@ -1022,63 +1049,123 @@ static void rtw89_wow_clear_wakeups(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
|
||||
rtw_wow->wow_vif = NULL;
|
||||
rtw_wow->rtwvif_link = NULL;
|
||||
rtw89_core_release_all_bits_map(rtw_wow->flags, RTW89_WOW_FLAG_NUM);
|
||||
rtw_wow->pattern_cnt = 0;
|
||||
rtw_wow->pno_inited = false;
|
||||
}
|
||||
|
||||
static void rtw89_wow_init_pno(struct rtw89_dev *rtwdev,
|
||||
struct cfg80211_sched_scan_request *nd_config)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
|
||||
if (!nd_config->n_match_sets || !nd_config->n_channels)
|
||||
return;
|
||||
|
||||
rtw_wow->nd_config = nd_config;
|
||||
rtw_wow->pno_inited = true;
|
||||
|
||||
INIT_LIST_HEAD(&rtw_wow->pno_pkt_list);
|
||||
|
||||
rtw89_debug(rtwdev, RTW89_DBG_WOW, "WOW: net-detect is enabled\n");
|
||||
}
|
||||
|
||||
static int rtw89_wow_set_wakeups(struct rtw89_dev *rtwdev,
|
||||
struct cfg80211_wowlan *wowlan)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_vif_link *rtwvif_link;
|
||||
struct rtw89_vif *rtwvif;
|
||||
|
||||
if (wowlan->disconnect)
|
||||
set_bit(RTW89_WOW_FLAG_EN_DISCONNECT, rtw_wow->flags);
|
||||
if (wowlan->magic_pkt)
|
||||
set_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags);
|
||||
if (wowlan->n_patterns && wowlan->patterns)
|
||||
set_bit(RTW89_WOW_FLAG_EN_PATTERN, rtw_wow->flags);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_wow_vif_iter(rtwdev, rtwvif);
|
||||
if (wowlan->nd_config)
|
||||
rtw89_wow_init_pno(rtwdev, wowlan->nd_config);
|
||||
|
||||
if (!rtw_wow->wow_vif)
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif) {
|
||||
/* use the link on HW-0 to do wow flow */
|
||||
rtwvif_link = rtw89_vif_get_link_inst(rtwvif, 0);
|
||||
if (!rtwvif_link)
|
||||
continue;
|
||||
|
||||
rtw89_wow_vif_iter(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
rtwvif_link = rtw_wow->rtwvif_link;
|
||||
if (!rtwvif_link)
|
||||
return -EPERM;
|
||||
|
||||
rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv;
|
||||
return rtw89_wow_parse_patterns(rtwdev, rtwvif, wowlan);
|
||||
return rtw89_wow_parse_patterns(rtwdev, rtwvif_link, wowlan);
|
||||
}
|
||||
|
||||
static int rtw89_wow_cfg_wake_pno(struct rtw89_dev *rtwdev, bool wow)
|
||||
{
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_fw_h2c_cfg_pno(rtwdev, rtwvif_link, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to config pno\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_wakeup_ctrl(rtwdev, rtwvif_link, wow);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_global(rtwdev, rtwvif_link, wow);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to fw wow global\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_wow_cfg_wake(struct rtw89_dev *rtwdev, bool wow)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = rtw_wow->rtwvif_link;
|
||||
struct ieee80211_vif *wow_vif = rtwvif_link_to_vif(rtwvif_link);
|
||||
struct ieee80211_sta *wow_sta;
|
||||
struct rtw89_sta *rtwsta = NULL;
|
||||
struct rtw89_sta_link *rtwsta_link = NULL;
|
||||
struct rtw89_sta *rtwsta;
|
||||
int ret;
|
||||
|
||||
wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid);
|
||||
if (wow_sta)
|
||||
rtwsta = (struct rtw89_sta *)wow_sta->drv_priv;
|
||||
wow_sta = ieee80211_find_sta(wow_vif, wow_vif->cfg.ap_addr);
|
||||
if (wow_sta) {
|
||||
rtwsta = sta_to_rtwsta(wow_sta);
|
||||
rtwsta_link = rtwsta->links[rtwvif_link->link_id];
|
||||
if (!rtwsta_link)
|
||||
return -ENOLINK;
|
||||
}
|
||||
|
||||
if (wow) {
|
||||
if (rtw_wow->pattern_cnt)
|
||||
rtwvif->wowlan_pattern = true;
|
||||
rtwvif_link->wowlan_pattern = true;
|
||||
if (test_bit(RTW89_WOW_FLAG_EN_MAGIC_PKT, rtw_wow->flags))
|
||||
rtwvif->wowlan_magic = true;
|
||||
rtwvif_link->wowlan_magic = true;
|
||||
} else {
|
||||
rtwvif->wowlan_pattern = false;
|
||||
rtwvif->wowlan_magic = false;
|
||||
rtwvif_link->wowlan_pattern = false;
|
||||
rtwvif_link->wowlan_magic = false;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_wakeup_ctrl(rtwdev, rtwvif, wow);
|
||||
ret = rtw89_fw_h2c_wow_wakeup_ctrl(rtwdev, rtwvif_link, wow);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to fw wow wakeup ctrl\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (wow) {
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif, rtwsta);
|
||||
ret = rtw89_chip_h2c_dctl_sec_cam(rtwdev, rtwvif_link, rtwsta_link);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to update dctl cam sec entry: %d\n",
|
||||
ret);
|
||||
@ -1086,13 +1173,13 @@ static int rtw89_wow_cfg_wake(struct rtw89_dev *rtwdev, bool wow)
|
||||
}
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta_link, NULL);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c cam\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_global(rtwdev, rtwvif, wow);
|
||||
ret = rtw89_fw_h2c_wow_global(rtwdev, rtwvif_link, wow);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to fw wow global\n");
|
||||
return ret;
|
||||
@ -1122,25 +1209,30 @@ static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
|
||||
enum rtw89_fw_type fw_type = wow ? RTW89_FW_WOWLAN : RTW89_FW_NORMAL;
|
||||
enum rtw89_chip_gen chip_gen = rtwdev->chip->chip_gen;
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *wow_vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = rtw_wow->rtwvif_link;
|
||||
struct ieee80211_vif *wow_vif = rtwvif_link_to_vif(rtwvif_link);
|
||||
enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
bool include_bb = !!chip->bbmcu_nr;
|
||||
bool disable_intr_for_dlfw = false;
|
||||
struct ieee80211_sta *wow_sta;
|
||||
struct rtw89_sta *rtwsta = NULL;
|
||||
struct rtw89_sta_link *rtwsta_link = NULL;
|
||||
struct rtw89_sta *rtwsta;
|
||||
bool is_conn = true;
|
||||
int ret;
|
||||
|
||||
if (chip_id == RTL8852C || chip_id == RTL8922A)
|
||||
disable_intr_for_dlfw = true;
|
||||
|
||||
wow_sta = ieee80211_find_sta(wow_vif, rtwvif->bssid);
|
||||
if (wow_sta)
|
||||
rtwsta = (struct rtw89_sta *)wow_sta->drv_priv;
|
||||
else
|
||||
wow_sta = ieee80211_find_sta(wow_vif, wow_vif->cfg.ap_addr);
|
||||
if (wow_sta) {
|
||||
rtwsta = sta_to_rtwsta(wow_sta);
|
||||
rtwsta_link = rtwsta->links[rtwvif_link->link_id];
|
||||
if (!rtwsta_link)
|
||||
return -ENOLINK;
|
||||
} else {
|
||||
is_conn = false;
|
||||
}
|
||||
|
||||
if (disable_intr_for_dlfw)
|
||||
rtw89_hci_disable_intr(rtwdev);
|
||||
@ -1156,14 +1248,14 @@ static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
|
||||
|
||||
rtw89_phy_init_rf_reg(rtwdev, true);
|
||||
|
||||
ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif, rtwsta,
|
||||
ret = rtw89_fw_h2c_role_maintain(rtwdev, rtwvif_link, rtwsta_link,
|
||||
RTW89_ROLE_FW_RESTORE);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c role maintain\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_chip_h2c_assoc_cmac_tbl(rtwdev, wow_vif, wow_sta);
|
||||
ret = rtw89_chip_h2c_assoc_cmac_tbl(rtwdev, rtwvif_link, rtwsta_link);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c assoc cmac tbl\n");
|
||||
return ret;
|
||||
@ -1172,27 +1264,27 @@ static int rtw89_wow_swap_fw(struct rtw89_dev *rtwdev, bool wow)
|
||||
if (!is_conn)
|
||||
rtw89_cam_reset_keys(rtwdev);
|
||||
|
||||
ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif, rtwsta, !is_conn);
|
||||
ret = rtw89_fw_h2c_join_info(rtwdev, rtwvif_link, rtwsta_link, !is_conn);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c join info\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif, rtwsta, NULL);
|
||||
ret = rtw89_fw_h2c_cam(rtwdev, rtwvif_link, rtwsta_link, NULL);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c cam\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (is_conn) {
|
||||
ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif, rtwsta->mac_id);
|
||||
ret = rtw89_fw_h2c_general_pkt(rtwdev, rtwvif_link, rtwsta_link->mac_id);
|
||||
if (ret) {
|
||||
rtw89_warn(rtwdev, "failed to send h2c general packet\n");
|
||||
return ret;
|
||||
}
|
||||
rtw89_phy_ra_assoc(rtwdev, wow_sta);
|
||||
rtw89_phy_set_bss_color(rtwdev, wow_vif);
|
||||
rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, wow_vif);
|
||||
rtw89_phy_ra_assoc(rtwdev, rtwsta_link);
|
||||
rtw89_phy_set_bss_color(rtwdev, rtwvif_link);
|
||||
rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, rtwvif_link);
|
||||
}
|
||||
|
||||
if (chip_gen == RTW89_CHIP_BE)
|
||||
@ -1295,113 +1387,248 @@ static int rtw89_wow_disable_trx_pre(struct rtw89_dev *rtwdev)
|
||||
|
||||
static int rtw89_wow_disable_trx_post(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct ieee80211_vif *vif = rtw_wow->wow_vif;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
int ret;
|
||||
|
||||
ret = rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true);
|
||||
if (ret)
|
||||
rtw89_err(rtwdev, "cfg ppdu status\n");
|
||||
|
||||
rtw89_fw_h2c_set_bcn_fltr_cfg(rtwdev, vif, true);
|
||||
rtw89_fw_h2c_set_bcn_fltr_cfg(rtwdev, rtwvif_link, true);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rtw89_fw_release_pno_pkt_list(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct list_head *pkt_list = &rtw_wow->pno_pkt_list;
|
||||
struct rtw89_pktofld_info *info, *tmp;
|
||||
|
||||
list_for_each_entry_safe(info, tmp, pkt_list, list) {
|
||||
rtw89_fw_h2c_del_pkt_offload(rtwdev, info->id);
|
||||
list_del(&info->list);
|
||||
kfree(info);
|
||||
}
|
||||
}
|
||||
|
||||
static int rtw89_pno_scan_update_probe_req(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_vif_link *rtwvif_link)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct cfg80211_sched_scan_request *nd_config = rtw_wow->nd_config;
|
||||
u8 num = nd_config->n_match_sets, i;
|
||||
struct rtw89_pktofld_info *info;
|
||||
struct sk_buff *skb;
|
||||
int ret;
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
skb = ieee80211_probereq_get(rtwdev->hw, rtwvif_link->mac_addr,
|
||||
nd_config->match_sets[i].ssid.ssid,
|
||||
nd_config->match_sets[i].ssid.ssid_len,
|
||||
nd_config->ie_len);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
skb_put_data(skb, nd_config->ie, nd_config->ie_len);
|
||||
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info) {
|
||||
kfree_skb(skb);
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif_link);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, skb);
|
||||
if (ret) {
|
||||
kfree_skb(skb);
|
||||
kfree(info);
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif_link);
|
||||
return ret;
|
||||
}
|
||||
|
||||
list_add_tail(&info->list, &rtw_wow->pno_pkt_list);
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_pno_scan_offload(struct rtw89_dev *rtwdev, bool enable)
|
||||
{
|
||||
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
int interval = rtw_wow->nd_config->scan_plans[0].interval;
|
||||
struct rtw89_scan_option opt = {};
|
||||
int ret;
|
||||
|
||||
if (enable) {
|
||||
ret = rtw89_pno_scan_update_probe_req(rtwdev, rtwvif_link);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "Update probe request failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = mac->add_chan_list_pno(rtwdev, rtwvif_link);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "Update channel list failed\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
opt.enable = enable;
|
||||
opt.repeat = RTW89_SCAN_NORMAL;
|
||||
opt.norm_pd = max(interval, 1) * 10; /* in unit of 100ms */
|
||||
opt.delay = max(rtw_wow->nd_config->delay, 1);
|
||||
|
||||
if (rtwdev->chip->chip_gen == RTW89_CHIP_BE) {
|
||||
opt.operation = enable ? RTW89_SCAN_OP_START : RTW89_SCAN_OP_STOP;
|
||||
opt.scan_mode = RTW89_SCAN_MODE_SA;
|
||||
opt.band = RTW89_PHY_0;
|
||||
opt.num_macc_role = 0;
|
||||
opt.mlo_mode = rtwdev->mlo_dbcc_mode;
|
||||
opt.num_opch = 0;
|
||||
opt.opch_end = RTW89_CHAN_INVALID;
|
||||
}
|
||||
|
||||
mac->scan_offload(rtwdev, &opt, rtwvif_link, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_wow_fw_start(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = rtw_wow->rtwvif_link;
|
||||
int ret;
|
||||
|
||||
rtw89_wow_pattern_write(rtwdev);
|
||||
rtw89_wow_construct_key_info(rtwdev);
|
||||
if (rtw89_wow_no_link(rtwdev)) {
|
||||
ret = rtw89_pno_scan_offload(rtwdev, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable pno scan offload\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable keep alive\n");
|
||||
return ret;
|
||||
ret = rtw89_pno_scan_offload(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable pno scan offload\n");
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
rtw89_wow_pattern_write(rtwdev);
|
||||
rtw89_wow_construct_key_info(rtwdev);
|
||||
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif_link, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable keep alive\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif_link, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable disconnect detect\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif_link, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable GTK offload\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif_link, true);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "wow: failed to enable arp offload\n");
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable disconnect detect\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to enable GTK offload\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif, true);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "wow: failed to enable arp offload\n");
|
||||
|
||||
ret = rtw89_wow_cfg_wake(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to config wake\n");
|
||||
goto out;
|
||||
if (rtw89_wow_no_link(rtwdev)) {
|
||||
ret = rtw89_wow_cfg_wake_pno(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to config wake PNO\n");
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
ret = rtw89_wow_cfg_wake(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to config wake\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = rtw89_wow_check_fw_status(rtwdev, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to check enable fw ready\n");
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_wow_fw_stop(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)rtw_wow->wow_vif->drv_priv;
|
||||
struct rtw89_vif_link *rtwvif_link = rtw_wow->rtwvif_link;
|
||||
int ret;
|
||||
|
||||
rtw89_wow_pattern_clear(rtwdev);
|
||||
if (rtw89_wow_no_link(rtwdev)) {
|
||||
ret = rtw89_pno_scan_offload(rtwdev, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable pno scan offload\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable keep alive\n");
|
||||
goto out;
|
||||
ret = rtw89_fw_h2c_cfg_pno(rtwdev, rtwvif_link, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable pno\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
rtw89_fw_release_pno_pkt_list(rtwdev, rtwvif_link);
|
||||
} else {
|
||||
rtw89_wow_pattern_clear(rtwdev);
|
||||
|
||||
ret = rtw89_fw_h2c_keep_alive(rtwdev, rtwvif_link, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable keep alive\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif_link, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable disconnect detect\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif_link, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable GTK offload\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif_link, false);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "wow: failed to disable arp offload\n");
|
||||
|
||||
rtw89_wow_key_clear(rtwdev);
|
||||
rtw89_fw_release_general_pkt_list(rtwdev, true);
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_disconnect_detect(rtwdev, rtwvif, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable disconnect detect\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_wow_gtk_ofld(rtwdev, rtwvif, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable GTK offload\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = rtw89_fw_h2c_arp_offload(rtwdev, rtwvif, false);
|
||||
if (ret)
|
||||
rtw89_warn(rtwdev, "wow: failed to disable arp offload\n");
|
||||
|
||||
rtw89_wow_key_clear(rtwdev);
|
||||
rtw89_fw_release_general_pkt_list(rtwdev, true);
|
||||
|
||||
ret = rtw89_wow_cfg_wake(rtwdev, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to disable config wake\n");
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = rtw89_wow_check_fw_status(rtwdev, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "wow: failed to check disable fw ready\n");
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rtw89_wow_enable(struct rtw89_dev *rtwdev)
|
||||
@ -1430,7 +1657,7 @@ static int rtw89_wow_enable(struct rtw89_dev *rtwdev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
rtw89_wow_enter_lps(rtwdev);
|
||||
rtw89_wow_enter_ps(rtwdev);
|
||||
|
||||
ret = rtw89_wow_enable_trx_post(rtwdev);
|
||||
if (ret) {
|
||||
@ -1455,7 +1682,7 @@ static int rtw89_wow_disable(struct rtw89_dev *rtwdev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
rtw89_wow_leave_lps(rtwdev);
|
||||
rtw89_wow_leave_ps(rtwdev, false);
|
||||
|
||||
ret = rtw89_wow_fw_stop(rtwdev);
|
||||
if (ret) {
|
||||
@ -1480,6 +1707,12 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rtw89_wow_restore_ps(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
if (rtw89_wow_no_link(rtwdev))
|
||||
rtw89_enter_ips(rtwdev);
|
||||
}
|
||||
|
||||
int rtw89_wow_resume(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
int ret;
|
||||
@ -1504,6 +1737,7 @@ int rtw89_wow_resume(struct rtw89_dev *rtwdev)
|
||||
if (ret)
|
||||
rtw89_err(rtwdev, "failed to disable wow\n");
|
||||
|
||||
rtw89_wow_restore_ps(rtwdev);
|
||||
out:
|
||||
rtw89_wow_clear_wakeups(rtwdev);
|
||||
return ret;
|
||||
@ -1519,7 +1753,7 @@ int rtw89_wow_suspend(struct rtw89_dev *rtwdev, struct cfg80211_wowlan *wowlan)
|
||||
return ret;
|
||||
}
|
||||
|
||||
rtw89_wow_leave_lps(rtwdev);
|
||||
rtw89_wow_leave_ps(rtwdev, true);
|
||||
|
||||
ret = rtw89_wow_enable(rtwdev);
|
||||
if (ret) {
|
||||
|
||||
@ -95,6 +95,27 @@ static inline int rtw89_wow_get_sec_hdr_len(struct rtw89_dev *rtwdev)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static inline bool rtw89_wow_mgd_linked(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
|
||||
return rtwvif_link->net_type == RTW89_NET_TYPE_INFRA;
|
||||
}
|
||||
|
||||
static inline bool rtw89_wow_no_link(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_vif_link *rtwvif_link = rtwdev->wow.rtwvif_link;
|
||||
|
||||
return rtwvif_link->net_type == RTW89_NET_TYPE_NO_LINK;
|
||||
}
|
||||
|
||||
static inline bool rtw_wow_has_mgd_features(struct rtw89_dev *rtwdev)
|
||||
{
|
||||
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
|
||||
|
||||
return !bitmap_empty(rtw_wow->flags, RTW89_WOW_FLAG_NUM);
|
||||
}
|
||||
|
||||
int rtw89_wow_suspend(struct rtw89_dev *rtwdev, struct cfg80211_wowlan *wowlan);
|
||||
int rtw89_wow_resume(struct rtw89_dev *rtwdev);
|
||||
void rtw89_wow_parse_akm(struct rtw89_dev *rtwdev, struct sk_buff *skb);
|
||||
|
||||
@ -21,7 +21,8 @@ SRCS+= rtw8851be.c
|
||||
SRCS+= rtw8852b_common.c
|
||||
SRCS+= rtw8852b.c rtw8852b_rfk.c rtw8852b_rfk_table.c rtw8852b_table.c
|
||||
SRCS+= rtw8852be.c
|
||||
#SRCS+= rtw8852bt_rfk.c rtw8852bt_rfk_table.c
|
||||
SRCS+= rtw8852bt.c rtw8852bt_rfk.c rtw8852bt_rfk_table.c
|
||||
SRCS+= rtw8852bte.c
|
||||
SRCS+= rtw8922a.c rtw8922a_rfk.c
|
||||
SRCS+= rtw8922ae.c
|
||||
|
||||
@ -38,7 +39,6 @@ SRCS+= ${LINUXKPI_GENSRCS}
|
||||
SRCS+= opt_wlan.h opt_inet6.h opt_inet.h opt_acpi.h
|
||||
|
||||
CFLAGS+= -DKBUILD_MODNAME='"rtw89"'
|
||||
CFLAGS+= -DLINUXKPI_VERSION=60800
|
||||
|
||||
CFLAGS+= -I${DEVRTW89DIR}
|
||||
CFLAGS+= ${LINUXKPI_INCLUDES}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user