summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/realtek
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/realtek')
-rw-r--r--drivers/net/wireless/realtek/rtl8xxxu/8192c.c2
-rw-r--r--drivers/net/wireless/realtek/rtl8xxxu/core.c17
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/base.c2
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c4
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c6
-rw-r--r--drivers/net/wireless/realtek/rtw88/Kconfig25
-rw-r--r--drivers/net/wireless/realtek/rtw88/Makefile9
-rw-r--r--drivers/net/wireless/realtek/rtw88/debug.c57
-rw-r--r--drivers/net/wireless/realtek/rtw88/fw.c15
-rw-r--r--drivers/net/wireless/realtek/rtw88/fw.h1
-rw-r--r--drivers/net/wireless/realtek/rtw88/mac.c7
-rw-r--r--drivers/net/wireless/realtek/rtw88/main.c58
-rw-r--r--drivers/net/wireless/realtek/rtw88/main.h45
-rw-r--r--drivers/net/wireless/realtek/rtw88/pci.c4
-rw-r--r--drivers/net/wireless/realtek/rtw88/phy.c215
-rw-r--r--drivers/net/wireless/realtek/rtw88/phy.h20
-rw-r--r--drivers/net/wireless/realtek/rtw88/reg.h69
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8723d.c4
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8814a.c2257
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8814a.h62
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8814a_table.c23930
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8814a_table.h40
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8814ae.c31
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8814au.c54
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8821c.c16
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8822b.c16
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8822bu.c4
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw8822c.c2
-rw-r--r--drivers/net/wireless/realtek/rtw88/rtw88xxa.c2
-rw-r--r--drivers/net/wireless/realtek/rtw88/rx.c6
-rw-r--r--drivers/net/wireless/realtek/rtw88/sar.c2
-rw-r--r--drivers/net/wireless/realtek/rtw88/sdio.c2
-rw-r--r--drivers/net/wireless/realtek/rtw88/usb.c2
-rw-r--r--drivers/net/wireless/realtek/rtw88/util.c3
-rw-r--r--drivers/net/wireless/realtek/rtw89/Kconfig2
-rw-r--r--drivers/net/wireless/realtek/rtw89/cam.c6
-rw-r--r--drivers/net/wireless/realtek/rtw89/chan.c38
-rw-r--r--drivers/net/wireless/realtek/rtw89/chan.h2
-rw-r--r--drivers/net/wireless/realtek/rtw89/coex.c2959
-rw-r--r--drivers/net/wireless/realtek/rtw89/coex.h18
-rw-r--r--drivers/net/wireless/realtek/rtw89/core.c240
-rw-r--r--drivers/net/wireless/realtek/rtw89/core.h208
-rw-r--r--drivers/net/wireless/realtek/rtw89/debug.c2063
-rw-r--r--drivers/net/wireless/realtek/rtw89/fw.c369
-rw-r--r--drivers/net/wireless/realtek/rtw89/fw.h103
-rw-r--r--drivers/net/wireless/realtek/rtw89/mac.c80
-rw-r--r--drivers/net/wireless/realtek/rtw89/mac.h5
-rw-r--r--drivers/net/wireless/realtek/rtw89/mac80211.c282
-rw-r--r--drivers/net/wireless/realtek/rtw89/mac_be.c8
-rw-r--r--drivers/net/wireless/realtek/rtw89/pci.h56
-rw-r--r--drivers/net/wireless/realtek/rtw89/pci_be.c2
-rw-r--r--drivers/net/wireless/realtek/rtw89/phy.c789
-rw-r--r--drivers/net/wireless/realtek/rtw89/phy.h22
-rw-r--r--drivers/net/wireless/realtek/rtw89/ps.c6
-rw-r--r--drivers/net/wireless/realtek/rtw89/reg.h44
-rw-r--r--drivers/net/wireless/realtek/rtw89/regd.c601
-rw-r--r--drivers/net/wireless/realtek/rtw89/rtw8851b.c26
-rw-r--r--drivers/net/wireless/realtek/rtw89/rtw8852a.c26
-rw-r--r--drivers/net/wireless/realtek/rtw89/rtw8852b.c26
-rw-r--r--drivers/net/wireless/realtek/rtw89/rtw8852b_common.c6
-rw-r--r--drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c13
-rw-r--r--drivers/net/wireless/realtek/rtw89/rtw8852bt.c26
-rw-r--r--drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk.c13
-rw-r--r--drivers/net/wireless/realtek/rtw89/rtw8852c.c28
-rw-r--r--drivers/net/wireless/realtek/rtw89/rtw8922a.c74
-rw-r--r--drivers/net/wireless/realtek/rtw89/sar.c422
-rw-r--r--drivers/net/wireless/realtek/rtw89/sar.h10
-rw-r--r--drivers/net/wireless/realtek/rtw89/ser.c17
-rw-r--r--drivers/net/wireless/realtek/rtw89/util.c220
-rw-r--r--drivers/net/wireless/realtek/rtw89/util.h13
-rw-r--r--drivers/net/wireless/realtek/rtw89/wow.c7
71 files changed, 32048 insertions, 3771 deletions
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/8192c.c b/drivers/net/wireless/realtek/rtl8xxxu/8192c.c
index 0abb1b092bc2..73034e7e41d1 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/8192c.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/8192c.c
@@ -644,6 +644,8 @@ struct rtl8xxxu_fileops rtl8192cu_fops = {
.rx_agg_buf_size = 16000,
.tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
.rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
+ .supports_ap = 1,
+ .max_macid_num = 32,
.max_sec_cam_num = 32,
.adda_1t_init = 0x0b1b25a0,
.adda_1t_path_on = 0x0bdb25a0,
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/core.c b/drivers/net/wireless/realtek/rtl8xxxu/core.c
index 4ce0c05c5129..569856ca677f 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/core.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/core.c
@@ -860,9 +860,10 @@ rtl8xxxu_writeN(struct rtl8xxxu_priv *priv, u16 addr, u8 *buf, u16 len)
return len;
write_error:
- dev_info(&udev->dev,
- "%s: Failed to write block at addr: %04x size: %04x\n",
- __func__, addr, blocksize);
+ if (rtl8xxxu_debug & RTL8XXXU_DEBUG_REG_WRITE)
+ dev_info(&udev->dev,
+ "%s: Failed to write block at addr: %04x size: %04x\n",
+ __func__, addr, blocksize);
return -EAGAIN;
}
@@ -4064,8 +4065,14 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
*/
rtl8xxxu_write16(priv, REG_TRXFF_BNDY + 2, fops->trxff_boundary);
- ret = rtl8xxxu_download_firmware(priv);
- dev_dbg(dev, "%s: download_firmware %i\n", __func__, ret);
+ for (int retry = 5; retry >= 0 ; retry--) {
+ ret = rtl8xxxu_download_firmware(priv);
+ dev_dbg(dev, "%s: download_firmware %i\n", __func__, ret);
+ if (ret != -EAGAIN)
+ break;
+ if (retry)
+ dev_dbg(dev, "%s: retry firmware download\n", __func__);
+ }
if (ret)
goto exit;
ret = rtl8xxxu_start_firmware(priv);
diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index ff61867d142f..6189edc1d8d7 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -473,7 +473,7 @@ void rtl_deinit_deferred_work(struct ieee80211_hw *hw, bool ips_wq)
{
struct rtl_priv *rtlpriv = rtl_priv(hw);
- del_timer_sync(&rtlpriv->works.watchdog_timer);
+ timer_delete_sync(&rtlpriv->works.watchdog_timer);
cancel_delayed_work_sync(&rtlpriv->works.watchdog_wq);
if (ips_wq)
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c
index 35875cda30fc..2ad4523d1bef 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c
@@ -179,9 +179,9 @@ static void rtl88e_deinit_sw_vars(struct ieee80211_hw *hw)
}
if (rtlpriv->psc.low_power_enable)
- del_timer_sync(&rtlpriv->works.fw_clockoff_timer);
+ timer_delete_sync(&rtlpriv->works.fw_clockoff_timer);
- del_timer_sync(&rtlpriv->works.fast_antenna_training_timer);
+ timer_delete_sync(&rtlpriv->works.fast_antenna_training_timer);
}
/* get bt coexist status */
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c
index d429560009bb..e07402e73ba3 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c
@@ -484,7 +484,7 @@ bool rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
* pathA or mac1 has to set phy0&phy1 pathA */
if ((content == radiob_txt) && (rfpath == RF90_PATH_A)) {
rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
- " ===> althougth Path A, we load radiob.txt\n");
+ " ===> although Path A, we load radiob.txt\n");
radioa_arraylen = radiob_arraylen;
radioa_array_table = radiob_array_table;
}
@@ -750,7 +750,7 @@ static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
&& rtlhal->interfaceindex == 1) {
need_pwr_down = rtl92d_phy_enable_anotherphy(hw, false);
rtlhal->during_mac1init_radioa = true;
- /* asume no this case */
+ /* assume no this case */
if (need_pwr_down)
rtl92d_phy_enable_rf_env(hw, path,
&u4regvalue);
@@ -1885,7 +1885,7 @@ static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
bneed_powerdown_radio =
rtl92d_phy_enable_anotherphy(hw, false);
rtlpriv->rtlhal.during_mac1init_radioa = true;
- /* asume no this case */
+ /* assume no this case */
if (bneed_powerdown_radio)
rtl92d_phy_enable_rf_env(hw, erfpath,
&u4regvalue);
diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig
index ab21b8059e0b..3736f290bd42 100644
--- a/drivers/net/wireless/realtek/rtw88/Kconfig
+++ b/drivers/net/wireless/realtek/rtw88/Kconfig
@@ -54,6 +54,9 @@ config RTW88_8812A
tristate
select RTW88_88XXA
+config RTW88_8814A
+ tristate
+
config RTW88_8822BE
tristate "Realtek 8822BE PCI wireless network adapter"
depends on PCI
@@ -222,6 +225,28 @@ config RTW88_8812AU
802.11ac USB wireless network adapter
+config RTW88_8814AE
+ tristate "Realtek 8814AE PCI wireless network adapter"
+ depends on PCI
+ select RTW88_CORE
+ select RTW88_PCI
+ select RTW88_8814A
+ help
+ Select this option will enable support for 8814AE chipset
+
+ 802.11ac PCIe wireless network adapter
+
+config RTW88_8814AU
+ tristate "Realtek 8814AU USB wireless network adapter"
+ depends on USB
+ select RTW88_CORE
+ select RTW88_USB
+ select RTW88_8814A
+ help
+ Select this option will enable support for 8814AU chipset
+
+ 802.11ac USB wireless network adapter
+
config RTW88_DEBUG
bool "Realtek rtw88 debug support"
depends on RTW88_CORE
diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile
index 0cbbb366e393..0b3da05a2938 100644
--- a/drivers/net/wireless/realtek/rtw88/Makefile
+++ b/drivers/net/wireless/realtek/rtw88/Makefile
@@ -94,6 +94,15 @@ rtw88_8821au-objs := rtw8821au.o
obj-$(CONFIG_RTW88_8812AU) += rtw88_8812au.o
rtw88_8812au-objs := rtw8812au.o
+obj-$(CONFIG_RTW88_8814A) += rtw88_8814a.o
+rtw88_8814a-objs := rtw8814a.o rtw8814a_table.o
+
+obj-$(CONFIG_RTW88_8814AE) += rtw88_8814ae.o
+rtw88_8814ae-objs := rtw8814ae.o
+
+obj-$(CONFIG_RTW88_8814AU) += rtw88_8814au.o
+rtw88_8814au-objs := rtw8814au.o
+
obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o
rtw88_pci-objs := pci.o
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
index 364ec0436d0f..b67d69b01f87 100644
--- a/drivers/net/wireless/realtek/rtw88/debug.c
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
@@ -654,10 +654,10 @@ static void rtw_print_rate(struct seq_file *m, u8 rate)
case DESC_RATE6M...DESC_RATE54M:
rtw_print_ofdm_rate_txt(m, rate);
break;
- case DESC_RATEMCS0...DESC_RATEMCS15:
+ case DESC_RATEMCS0...DESC_RATEMCS31:
rtw_print_ht_rate_txt(m, rate);
break;
- case DESC_RATEVHT1SS_MCS0...DESC_RATEVHT2SS_MCS9:
+ case DESC_RATEVHT1SS_MCS0...DESC_RATEVHT4SS_MCS9:
rtw_print_vht_rate_txt(m, rate);
break;
default:
@@ -692,9 +692,11 @@ static int rtw_debugfs_get_tx_pwr_tbl(struct seq_file *m, void *v)
{
struct rtw_debugfs_priv *debugfs_priv = m->private;
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
+ struct rtw_power_params pwr_param = {0};
struct rtw_hal *hal = &rtwdev->hal;
+ u8 nss = rtwdev->efuse.hw_cap.nss;
u8 path, rate, bw, ch, regd;
- struct rtw_power_params pwr_param = {0};
+ u8 max_ht_rate, max_rate;
mutex_lock(&rtwdev->mutex);
bw = hal->current_band_width;
@@ -707,19 +709,23 @@ static int rtw_debugfs_get_tx_pwr_tbl(struct seq_file *m, void *v)
seq_printf(m, "%-4s %-10s %-9s %-9s (%-4s %-4s %-4s) %-4s\n",
"path", "rate", "pwr", "base", "byr", "lmt", "sar", "rem");
+ max_ht_rate = DESC_RATEMCS0 + nss * 8 - 1;
+
+ if (rtwdev->chip->vht_supported)
+ max_rate = DESC_RATEVHT1SS_MCS0 + nss * 10 - 1;
+ else
+ max_rate = max_ht_rate;
+
mutex_lock(&hal->tx_power_mutex);
- for (path = RF_PATH_A; path <= RF_PATH_B; path++) {
+ for (path = RF_PATH_A; path < hal->rf_path_num; path++) {
/* there is no CCK rates used in 5G */
if (hal->current_band_type == RTW_BAND_5G)
rate = DESC_RATE6M;
else
rate = DESC_RATE1M;
- /* now, not support vht 3ss and vht 4ss*/
- for (; rate <= DESC_RATEVHT2SS_MCS9; rate++) {
- /* now, not support ht 3ss and ht 4ss*/
- if (rate > DESC_RATEMCS15 &&
- rate < DESC_RATEVHT1SS_MCS0)
+ for (; rate <= max_rate; rate++) {
+ if (rate > max_ht_rate && rate <= DESC_RATEMCS31)
continue;
rtw_get_tx_power_params(rtwdev, path, rate, bw,
@@ -849,20 +855,28 @@ static int rtw_debugfs_get_phy_info(struct seq_file *m, void *v)
last_cnt->num_qry_pkt[rate_id + 9]);
}
- seq_printf(m, "[RSSI(dBm)] = {%d, %d}\n",
+ seq_printf(m, "[RSSI(dBm)] = {%d, %d, %d, %d}\n",
dm_info->rssi[RF_PATH_A] - 100,
- dm_info->rssi[RF_PATH_B] - 100);
- seq_printf(m, "[Rx EVM(dB)] = {-%d, -%d}\n",
+ dm_info->rssi[RF_PATH_B] - 100,
+ dm_info->rssi[RF_PATH_C] - 100,
+ dm_info->rssi[RF_PATH_D] - 100);
+ seq_printf(m, "[Rx EVM(dB)] = {-%d, -%d, -%d, -%d}\n",
dm_info->rx_evm_dbm[RF_PATH_A],
- dm_info->rx_evm_dbm[RF_PATH_B]);
- seq_printf(m, "[Rx SNR] = {%d, %d}\n",
+ dm_info->rx_evm_dbm[RF_PATH_B],
+ dm_info->rx_evm_dbm[RF_PATH_C],
+ dm_info->rx_evm_dbm[RF_PATH_D]);
+ seq_printf(m, "[Rx SNR] = {%d, %d, %d, %d}\n",
dm_info->rx_snr[RF_PATH_A],
- dm_info->rx_snr[RF_PATH_B]);
- seq_printf(m, "[CFO_tail(KHz)] = {%d, %d}\n",
+ dm_info->rx_snr[RF_PATH_B],
+ dm_info->rx_snr[RF_PATH_C],
+ dm_info->rx_snr[RF_PATH_D]);
+ seq_printf(m, "[CFO_tail(KHz)] = {%d, %d, %d, %d}\n",
dm_info->cfo_tail[RF_PATH_A],
- dm_info->cfo_tail[RF_PATH_B]);
+ dm_info->cfo_tail[RF_PATH_B],
+ dm_info->cfo_tail[RF_PATH_C],
+ dm_info->cfo_tail[RF_PATH_D]);
- if (dm_info->curr_rx_rate >= DESC_RATE11M) {
+ if (dm_info->curr_rx_rate >= DESC_RATE6M) {
seq_puts(m, "[Rx Average Status]:\n");
seq_printf(m, " * OFDM, EVM: {-%d}, SNR: {%d}\n",
(u8)ewma_evm_read(&ewma_evm[RTW_EVM_OFDM]),
@@ -875,6 +889,13 @@ static int rtw_debugfs_get_phy_info(struct seq_file *m, void *v)
(u8)ewma_evm_read(&ewma_evm[RTW_EVM_2SS_B]),
(u8)ewma_snr_read(&ewma_snr[RTW_SNR_2SS_A]),
(u8)ewma_snr_read(&ewma_snr[RTW_SNR_2SS_B]));
+ seq_printf(m, " * 3SS, EVM: {-%d, -%d, -%d}, SNR: {%d, %d, %d}\n",
+ (u8)ewma_evm_read(&ewma_evm[RTW_EVM_3SS_A]),
+ (u8)ewma_evm_read(&ewma_evm[RTW_EVM_3SS_B]),
+ (u8)ewma_evm_read(&ewma_evm[RTW_EVM_3SS_C]),
+ (u8)ewma_snr_read(&ewma_snr[RTW_SNR_3SS_A]),
+ (u8)ewma_snr_read(&ewma_snr[RTW_SNR_3SS_B]),
+ (u8)ewma_snr_read(&ewma_snr[RTW_SNR_3SS_C]));
}
seq_puts(m, "[Rx Counter]:\n");
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
index 02389b7c6876..6b563ac489a7 100644
--- a/drivers/net/wireless/realtek/rtw88/fw.c
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
@@ -735,6 +735,7 @@ void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
{
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
bool disable_pt = true;
+ u32 mask_hi;
SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_RA_INFO);
@@ -755,6 +756,20 @@ void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
si->init_ra_lv = 0;
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
+
+ if (rtwdev->chip->id != RTW_CHIP_TYPE_8814A)
+ return;
+
+ SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_RA_INFO_HI);
+
+ mask_hi = si->ra_mask >> 32;
+
+ SET_RA_INFO_RA_MASK0(h2c_pkt, (mask_hi & 0xff));
+ SET_RA_INFO_RA_MASK1(h2c_pkt, (mask_hi & 0xff00) >> 8);
+ SET_RA_INFO_RA_MASK2(h2c_pkt, (mask_hi & 0xff0000) >> 16);
+ SET_RA_INFO_RA_MASK3(h2c_pkt, (mask_hi & 0xff000000) >> 24);
+
+ rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
}
void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool connect)
diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h
index 404de1b0c407..48ad9ceab6ea 100644
--- a/drivers/net/wireless/realtek/rtw88/fw.h
+++ b/drivers/net/wireless/realtek/rtw88/fw.h
@@ -557,6 +557,7 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
#define H2C_CMD_DEFAULT_PORT 0x2c
#define H2C_CMD_RA_INFO 0x40
#define H2C_CMD_RSSI_MONITOR 0x42
+#define H2C_CMD_RA_INFO_HI 0x46
#define H2C_CMD_BCN_FILTER_OFFLOAD_P0 0x56
#define H2C_CMD_BCN_FILTER_OFFLOAD_P1 0x57
#define H2C_CMD_WL_PHY_INFO 0x58
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
index cae9cca6dca3..0491f501c138 100644
--- a/drivers/net/wireless/realtek/rtw88/mac.c
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
@@ -291,6 +291,7 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
if (rtw_read8(rtwdev, REG_CR) == 0xea)
cur_pwr = false;
else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB &&
+ chip->id != RTW_CHIP_TYPE_8814A &&
(rtw_read8(rtwdev, REG_SYS_STATUS1 + 1) & BIT(0)))
cur_pwr = false;
else
@@ -784,7 +785,8 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev,
if (!check_firmware_size(data, size))
return -EINVAL;
- if (!ltecoex_read_reg(rtwdev, 0x38, &ltecoex_bckp))
+ if (rtwdev->chip->ltecoex_addr &&
+ !ltecoex_read_reg(rtwdev, 0x38, &ltecoex_bckp))
return -EBUSY;
wlan_cpu_enable(rtwdev, false);
@@ -802,7 +804,8 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev,
wlan_cpu_enable(rtwdev, true);
- if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) {
+ if (rtwdev->chip->ltecoex_addr &&
+ !ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) {
ret = -EBUSY;
goto dlfw_fail;
}
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
index 0cee0fd8c0ef..959f56a3cc1a 100644
--- a/drivers/net/wireless/realtek/rtw88/main.c
+++ b/drivers/net/wireless/realtek/rtw88/main.c
@@ -136,7 +136,7 @@ u16 rtw_desc_to_bitrate(u8 desc_rate)
return rate.bitrate;
}
-static struct ieee80211_supported_band rtw_band_2ghz = {
+static const struct ieee80211_supported_band rtw_band_2ghz = {
.band = NL80211_BAND_2GHZ,
.channels = rtw_channeltable_2g,
@@ -149,7 +149,7 @@ static struct ieee80211_supported_band rtw_band_2ghz = {
.vht_cap = {0},
};
-static struct ieee80211_supported_band rtw_band_5ghz = {
+static const struct ieee80211_supported_band rtw_band_5ghz = {
.band = NL80211_BAND_5GHZ,
.channels = rtw_channeltable_5g,
@@ -1234,7 +1234,9 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
if (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC)
ldpc_en = VHT_LDPC_EN;
} else if (sta->deflink.ht_cap.ht_supported) {
- ra_mask |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20) |
+ ra_mask |= ((u64)sta->deflink.ht_cap.mcs.rx_mask[3] << 36) |
+ ((u64)sta->deflink.ht_cap.mcs.rx_mask[2] << 28) |
+ (sta->deflink.ht_cap.mcs.rx_mask[1] << 20) |
(sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
if (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_RX_STBC)
stbc_en = HT_STBC_EN;
@@ -1244,6 +1246,9 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
if (efuse->hw_cap.nss == 1 || rtwdev->hal.txrx_1ss)
ra_mask &= RA_MASK_VHT_RATES_1SS | RA_MASK_HT_RATES_1SS;
+ else if (efuse->hw_cap.nss == 2)
+ ra_mask &= RA_MASK_VHT_RATES_2SS | RA_MASK_HT_RATES_2SS |
+ RA_MASK_VHT_RATES_1SS | RA_MASK_HT_RATES_1SS;
if (hal->current_band_type == RTW_BAND_5G) {
ra_mask |= (u64)sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 4;
@@ -1302,10 +1307,9 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
break;
}
- if (sta->deflink.vht_cap.vht_supported && ra_mask & 0xffc00000)
- tx_num = 2;
- else if (sta->deflink.ht_cap.ht_supported && ra_mask & 0xfff00000)
- tx_num = 2;
+ if (sta->deflink.vht_cap.vht_supported ||
+ sta->deflink.ht_cap.ht_supported)
+ tx_num = efuse->hw_cap.nss;
rate_id = get_rate_id(wireless_set, bw_mode, tx_num);
@@ -1561,6 +1565,7 @@ static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
{
const struct rtw_chip_info *chip = rtwdev->chip;
struct rtw_efuse *efuse = &rtwdev->efuse;
+ int i;
ht_cap->ht_supported = true;
ht_cap->cap = 0;
@@ -1580,25 +1585,20 @@ static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
ht_cap->ampdu_density = chip->ampdu_density;
ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
- if (efuse->hw_cap.nss > 1) {
- ht_cap->mcs.rx_mask[0] = 0xFF;
- ht_cap->mcs.rx_mask[1] = 0xFF;
- ht_cap->mcs.rx_mask[4] = 0x01;
- ht_cap->mcs.rx_highest = cpu_to_le16(300);
- } else {
- ht_cap->mcs.rx_mask[0] = 0xFF;
- ht_cap->mcs.rx_mask[1] = 0x00;
- ht_cap->mcs.rx_mask[4] = 0x01;
- ht_cap->mcs.rx_highest = cpu_to_le16(150);
- }
+
+ for (i = 0; i < efuse->hw_cap.nss; i++)
+ ht_cap->mcs.rx_mask[i] = 0xFF;
+ ht_cap->mcs.rx_mask[4] = 0x01;
+ ht_cap->mcs.rx_highest = cpu_to_le16(150 * efuse->hw_cap.nss);
}
static void rtw_init_vht_cap(struct rtw_dev *rtwdev,
struct ieee80211_sta_vht_cap *vht_cap)
{
struct rtw_efuse *efuse = &rtwdev->efuse;
- u16 mcs_map;
+ u16 mcs_map = 0;
__le16 highest;
+ int i;
if (efuse->hw_cap.ptcl != EFUSE_HW_CAP_IGNORE &&
efuse->hw_cap.ptcl != EFUSE_HW_CAP_PTCL_VHT)
@@ -1621,21 +1621,15 @@ static void rtw_init_vht_cap(struct rtw_dev *rtwdev,
if (rtw_chip_has_rx_ldpc(rtwdev))
vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
- mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
- IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
- IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
- IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
- IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
- IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
- IEEE80211_VHT_MCS_NOT_SUPPORTED << 14;
- if (efuse->hw_cap.nss > 1) {
- highest = cpu_to_le16(780);
- mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << 2;
- } else {
- highest = cpu_to_le16(390);
- mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << 2;
+ for (i = 0; i < 8; i++) {
+ if (i < efuse->hw_cap.nss)
+ mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
+ else
+ mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
}
+ highest = cpu_to_le16(390 * efuse->hw_cap.nss);
+
vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
vht_cap->vht_mcs.rx_highest = highest;
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
index 62cd4c526301..02343e059fd9 100644
--- a/drivers/net/wireless/realtek/rtw88/main.h
+++ b/drivers/net/wireless/realtek/rtw88/main.h
@@ -61,7 +61,7 @@ enum rtw_hci_type {
};
struct rtw_hci {
- struct rtw_hci_ops *ops;
+ const struct rtw_hci_ops *ops;
enum rtw_hci_type type;
u32 rpwm_addr;
@@ -166,9 +166,14 @@ enum rtw_rate_section {
RTW_RATE_SECTION_HT_2S,
RTW_RATE_SECTION_VHT_1S,
RTW_RATE_SECTION_VHT_2S,
+ __RTW_RATE_SECTION_2SS_MAX = RTW_RATE_SECTION_VHT_2S,
+ RTW_RATE_SECTION_HT_3S,
+ RTW_RATE_SECTION_HT_4S,
+ RTW_RATE_SECTION_VHT_3S,
+ RTW_RATE_SECTION_VHT_4S,
/* keep last */
- RTW_RATE_SECTION_MAX,
+ RTW_RATE_SECTION_NUM,
};
enum rtw_wireless_set {
@@ -191,6 +196,7 @@ enum rtw_chip_type {
RTW_CHIP_TYPE_8703B,
RTW_CHIP_TYPE_8821A,
RTW_CHIP_TYPE_8812A,
+ RTW_CHIP_TYPE_8814A,
};
enum rtw_tx_queue_type {
@@ -380,6 +386,9 @@ enum rtw_evm {
RTW_EVM_1SS,
RTW_EVM_2SS_A,
RTW_EVM_2SS_B,
+ RTW_EVM_3SS_A,
+ RTW_EVM_3SS_B,
+ RTW_EVM_3SS_C,
/* keep it last */
RTW_EVM_NUM
};
@@ -397,6 +406,10 @@ enum rtw_snr {
RTW_SNR_2SS_B,
RTW_SNR_2SS_C,
RTW_SNR_2SS_D,
+ RTW_SNR_3SS_A,
+ RTW_SNR_3SS_B,
+ RTW_SNR_3SS_C,
+ RTW_SNR_3SS_D,
/* keep it last */
RTW_SNR_NUM
};
@@ -822,7 +835,7 @@ struct rtw_vif {
};
struct rtw_regulatory {
- char alpha2[2];
+ char alpha2[2] __nonstring;
u8 txpwr_regd_2g;
u8 txpwr_regd_5g;
};
@@ -1130,14 +1143,26 @@ struct rtw_rfe_def {
* For 2G there are cck rate and ofdm rate with different settings.
*/
struct rtw_pwr_track_tbl {
+ const u8 *pwrtrk_5gd_n[RTW_PWR_TRK_5G_NUM];
+ const u8 *pwrtrk_5gd_p[RTW_PWR_TRK_5G_NUM];
+ const u8 *pwrtrk_5gc_n[RTW_PWR_TRK_5G_NUM];
+ const u8 *pwrtrk_5gc_p[RTW_PWR_TRK_5G_NUM];
const u8 *pwrtrk_5gb_n[RTW_PWR_TRK_5G_NUM];
const u8 *pwrtrk_5gb_p[RTW_PWR_TRK_5G_NUM];
const u8 *pwrtrk_5ga_n[RTW_PWR_TRK_5G_NUM];
const u8 *pwrtrk_5ga_p[RTW_PWR_TRK_5G_NUM];
+ const u8 *pwrtrk_2gd_n;
+ const u8 *pwrtrk_2gd_p;
+ const u8 *pwrtrk_2gc_n;
+ const u8 *pwrtrk_2gc_p;
const u8 *pwrtrk_2gb_n;
const u8 *pwrtrk_2gb_p;
const u8 *pwrtrk_2ga_n;
const u8 *pwrtrk_2ga_p;
+ const u8 *pwrtrk_2g_cckd_n;
+ const u8 *pwrtrk_2g_cckd_p;
+ const u8 *pwrtrk_2g_cckc_n;
+ const u8 *pwrtrk_2g_cckc_p;
const u8 *pwrtrk_2g_cckb_n;
const u8 *pwrtrk_2g_cckb_p;
const u8 *pwrtrk_2g_ccka_n;
@@ -1227,8 +1252,8 @@ struct rtw_chip_info {
const struct rtw_hw_reg *dig;
const struct rtw_hw_reg *dig_cck;
- u32 rf_base_addr[2];
- u32 rf_sipi_addr[2];
+ u32 rf_base_addr[RTW_RF_PATH_MAX];
+ u32 rf_sipi_addr[RTW_RF_PATH_MAX];
const struct rtw_rf_sipi_addr *rf_sipi_read_addr;
u8 fix_rf_phy_num;
const struct rtw_ltecoex_addr *ltecoex_addr;
@@ -1924,7 +1949,7 @@ union rtw_sar_cfg {
struct rtw_sar {
enum rtw_sar_sources src;
- union rtw_sar_cfg cfg[RTW_RF_PATH_MAX][RTW_RATE_SECTION_MAX];
+ union rtw_sar_cfg cfg[RTW_RF_PATH_MAX][RTW_RATE_SECTION_NUM];
};
struct rtw_hal {
@@ -1968,16 +1993,16 @@ struct rtw_hal {
s8 tx_pwr_by_rate_offset_5g[RTW_RF_PATH_MAX]
[DESC_RATE_MAX];
s8 tx_pwr_by_rate_base_2g[RTW_RF_PATH_MAX]
- [RTW_RATE_SECTION_MAX];
+ [RTW_RATE_SECTION_NUM];
s8 tx_pwr_by_rate_base_5g[RTW_RF_PATH_MAX]
- [RTW_RATE_SECTION_MAX];
+ [RTW_RATE_SECTION_NUM];
s8 tx_pwr_limit_2g[RTW_REGD_MAX]
[RTW_CHANNEL_WIDTH_MAX]
- [RTW_RATE_SECTION_MAX]
+ [RTW_RATE_SECTION_NUM]
[RTW_MAX_CHANNEL_NUM_2G];
s8 tx_pwr_limit_5g[RTW_REGD_MAX]
[RTW_CHANNEL_WIDTH_MAX]
- [RTW_RATE_SECTION_MAX]
+ [RTW_RATE_SECTION_NUM]
[RTW_MAX_CHANNEL_NUM_5G];
s8 tx_pwr_tbl[RTW_RF_PATH_MAX]
[DESC_RATE_MAX];
diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
index 0ecaefc4c83d..bb4c4ccb31d4 100644
--- a/drivers/net/wireless/realtek/rtw88/pci.c
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
@@ -20,7 +20,7 @@ module_param_named(disable_aspm, rtw_pci_disable_aspm, bool, 0644);
MODULE_PARM_DESC(disable_msi, "Set Y to disable MSI interrupt support");
MODULE_PARM_DESC(disable_aspm, "Set Y to disable PCI ASPM support");
-static u32 rtw_pci_tx_queue_idx_addr[] = {
+static const u32 rtw_pci_tx_queue_idx_addr[] = {
[RTW_TX_QUEUE_BK] = RTK_PCI_TXBD_IDX_BKQ,
[RTW_TX_QUEUE_BE] = RTK_PCI_TXBD_IDX_BEQ,
[RTW_TX_QUEUE_VI] = RTK_PCI_TXBD_IDX_VIQ,
@@ -1591,7 +1591,7 @@ static void rtw_pci_destroy(struct rtw_dev *rtwdev, struct pci_dev *pdev)
rtw_pci_io_unmapping(rtwdev, pdev);
}
-static struct rtw_hci_ops rtw_pci_ops = {
+static const struct rtw_hci_ops rtw_pci_ops = {
.tx_write = rtw_pci_tx_write,
.tx_kick_off = rtw_pci_tx_kick_off,
.flush_queues = rtw_pci_flush_queues,
diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
index 8ed20c89d216..55be0d8e0c28 100644
--- a/drivers/net/wireless/realtek/rtw88/phy.c
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
@@ -52,60 +52,93 @@ static const u32 db_invert_table[12][8] = {
1995262315, 2511886432U, 3162277660U, 3981071706U}
};
-u8 rtw_cck_rates[] = { DESC_RATE1M, DESC_RATE2M, DESC_RATE5_5M, DESC_RATE11M };
-u8 rtw_ofdm_rates[] = {
+const u8 rtw_cck_rates[] = { DESC_RATE1M, DESC_RATE2M, DESC_RATE5_5M, DESC_RATE11M };
+
+const u8 rtw_ofdm_rates[] = {
DESC_RATE6M, DESC_RATE9M, DESC_RATE12M,
DESC_RATE18M, DESC_RATE24M, DESC_RATE36M,
DESC_RATE48M, DESC_RATE54M
};
-u8 rtw_ht_1s_rates[] = {
+
+const u8 rtw_ht_1s_rates[] = {
DESC_RATEMCS0, DESC_RATEMCS1, DESC_RATEMCS2,
DESC_RATEMCS3, DESC_RATEMCS4, DESC_RATEMCS5,
DESC_RATEMCS6, DESC_RATEMCS7
};
-u8 rtw_ht_2s_rates[] = {
+
+const u8 rtw_ht_2s_rates[] = {
DESC_RATEMCS8, DESC_RATEMCS9, DESC_RATEMCS10,
DESC_RATEMCS11, DESC_RATEMCS12, DESC_RATEMCS13,
DESC_RATEMCS14, DESC_RATEMCS15
};
-u8 rtw_vht_1s_rates[] = {
+
+const u8 rtw_vht_1s_rates[] = {
DESC_RATEVHT1SS_MCS0, DESC_RATEVHT1SS_MCS1,
DESC_RATEVHT1SS_MCS2, DESC_RATEVHT1SS_MCS3,
DESC_RATEVHT1SS_MCS4, DESC_RATEVHT1SS_MCS5,
DESC_RATEVHT1SS_MCS6, DESC_RATEVHT1SS_MCS7,
DESC_RATEVHT1SS_MCS8, DESC_RATEVHT1SS_MCS9
};
-u8 rtw_vht_2s_rates[] = {
+
+const u8 rtw_vht_2s_rates[] = {
DESC_RATEVHT2SS_MCS0, DESC_RATEVHT2SS_MCS1,
DESC_RATEVHT2SS_MCS2, DESC_RATEVHT2SS_MCS3,
DESC_RATEVHT2SS_MCS4, DESC_RATEVHT2SS_MCS5,
DESC_RATEVHT2SS_MCS6, DESC_RATEVHT2SS_MCS7,
DESC_RATEVHT2SS_MCS8, DESC_RATEVHT2SS_MCS9
};
-u8 *rtw_rate_section[RTW_RATE_SECTION_MAX] = {
+
+const u8 rtw_ht_3s_rates[] = {
+ DESC_RATEMCS16, DESC_RATEMCS17, DESC_RATEMCS18,
+ DESC_RATEMCS19, DESC_RATEMCS20, DESC_RATEMCS21,
+ DESC_RATEMCS22, DESC_RATEMCS23
+};
+
+const u8 rtw_ht_4s_rates[] = {
+ DESC_RATEMCS24, DESC_RATEMCS25, DESC_RATEMCS26,
+ DESC_RATEMCS27, DESC_RATEMCS28, DESC_RATEMCS29,
+ DESC_RATEMCS30, DESC_RATEMCS31
+};
+
+const u8 rtw_vht_3s_rates[] = {
+ DESC_RATEVHT3SS_MCS0, DESC_RATEVHT3SS_MCS1,
+ DESC_RATEVHT3SS_MCS2, DESC_RATEVHT3SS_MCS3,
+ DESC_RATEVHT3SS_MCS4, DESC_RATEVHT3SS_MCS5,
+ DESC_RATEVHT3SS_MCS6, DESC_RATEVHT3SS_MCS7,
+ DESC_RATEVHT3SS_MCS8, DESC_RATEVHT3SS_MCS9
+};
+
+const u8 rtw_vht_4s_rates[] = {
+ DESC_RATEVHT4SS_MCS0, DESC_RATEVHT4SS_MCS1,
+ DESC_RATEVHT4SS_MCS2, DESC_RATEVHT4SS_MCS3,
+ DESC_RATEVHT4SS_MCS4, DESC_RATEVHT4SS_MCS5,
+ DESC_RATEVHT4SS_MCS6, DESC_RATEVHT4SS_MCS7,
+ DESC_RATEVHT4SS_MCS8, DESC_RATEVHT4SS_MCS9
+};
+
+const u8 * const rtw_rate_section[RTW_RATE_SECTION_NUM] = {
rtw_cck_rates, rtw_ofdm_rates,
rtw_ht_1s_rates, rtw_ht_2s_rates,
- rtw_vht_1s_rates, rtw_vht_2s_rates
+ rtw_vht_1s_rates, rtw_vht_2s_rates,
+ rtw_ht_3s_rates, rtw_ht_4s_rates,
+ rtw_vht_3s_rates, rtw_vht_4s_rates
};
EXPORT_SYMBOL(rtw_rate_section);
-u8 rtw_rate_size[RTW_RATE_SECTION_MAX] = {
+const u8 rtw_rate_size[RTW_RATE_SECTION_NUM] = {
ARRAY_SIZE(rtw_cck_rates),
ARRAY_SIZE(rtw_ofdm_rates),
ARRAY_SIZE(rtw_ht_1s_rates),
ARRAY_SIZE(rtw_ht_2s_rates),
ARRAY_SIZE(rtw_vht_1s_rates),
- ARRAY_SIZE(rtw_vht_2s_rates)
+ ARRAY_SIZE(rtw_vht_2s_rates),
+ ARRAY_SIZE(rtw_ht_3s_rates),
+ ARRAY_SIZE(rtw_ht_4s_rates),
+ ARRAY_SIZE(rtw_vht_3s_rates),
+ ARRAY_SIZE(rtw_vht_4s_rates)
};
EXPORT_SYMBOL(rtw_rate_size);
-static const u8 rtw_cck_size = ARRAY_SIZE(rtw_cck_rates);
-static const u8 rtw_ofdm_size = ARRAY_SIZE(rtw_ofdm_rates);
-static const u8 rtw_ht_1s_size = ARRAY_SIZE(rtw_ht_1s_rates);
-static const u8 rtw_ht_2s_size = ARRAY_SIZE(rtw_ht_2s_rates);
-static const u8 rtw_vht_1s_size = ARRAY_SIZE(rtw_vht_1s_rates);
-static const u8 rtw_vht_2s_size = ARRAY_SIZE(rtw_vht_2s_rates);
-
enum rtw_phy_band_type {
PHY_BAND_2G = 0,
PHY_BAND_5G = 1,
@@ -1590,7 +1623,7 @@ static void rtw_phy_set_tx_power_limit(struct rtw_dev *rtwdev, u8 regd, u8 band,
ch_idx = rtw_channel_to_idx(band, ch);
if (regd >= RTW_REGD_MAX || bw >= RTW_CHANNEL_WIDTH_MAX ||
- rs >= RTW_RATE_SECTION_MAX || ch_idx < 0) {
+ rs >= RTW_RATE_SECTION_NUM || ch_idx < 0) {
WARN(1,
"wrong txpwr_lmt regd=%u, band=%u bw=%u, rs=%u, ch_idx=%u, pwr_limit=%d\n",
regd, band, bw, rs, ch_idx, pwr_limit);
@@ -1634,11 +1667,15 @@ rtw_xref_5g_txpwr_lmt(struct rtw_dev *rtwdev, u8 regd,
static void
rtw_xref_txpwr_lmt_by_rs(struct rtw_dev *rtwdev, u8 regd, u8 bw, u8 ch_idx)
{
+ static const u8 rs_cmp[4][2] = {
+ {RTW_RATE_SECTION_HT_1S, RTW_RATE_SECTION_VHT_1S},
+ {RTW_RATE_SECTION_HT_2S, RTW_RATE_SECTION_VHT_2S},
+ {RTW_RATE_SECTION_HT_3S, RTW_RATE_SECTION_VHT_3S},
+ {RTW_RATE_SECTION_HT_4S, RTW_RATE_SECTION_VHT_4S}
+ };
u8 rs_idx, rs_ht, rs_vht;
- u8 rs_cmp[2][2] = {{RTW_RATE_SECTION_HT_1S, RTW_RATE_SECTION_VHT_1S},
- {RTW_RATE_SECTION_HT_2S, RTW_RATE_SECTION_VHT_2S} };
- for (rs_idx = 0; rs_idx < 2; rs_idx++) {
+ for (rs_idx = 0; rs_idx < 4; rs_idx++) {
rs_ht = rs_cmp[rs_idx][0];
rs_vht = rs_cmp[rs_idx][1];
@@ -1695,7 +1732,7 @@ rtw_cfg_txpwr_lmt_by_alt(struct rtw_dev *rtwdev, u8 regd, u8 regd_alt)
u8 bw, rs;
for (bw = 0; bw < RTW_CHANNEL_WIDTH_MAX; bw++)
- for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++)
+ for (rs = 0; rs < RTW_RATE_SECTION_NUM; rs++)
__cfg_txpwr_lmt_by_alt(&rtwdev->hal, regd, regd_alt,
bw, rs);
}
@@ -1959,10 +1996,10 @@ static u8 rtw_phy_get_2g_tx_power_index(struct rtw_dev *rtwdev,
u8 rate, u8 group)
{
const struct rtw_chip_info *chip = rtwdev->chip;
- u8 tx_power;
- bool mcs_rate;
- bool above_2ss;
+ bool above_2ss, above_3ss, above_4ss;
u8 factor = chip->txgi_factor;
+ bool mcs_rate;
+ u8 tx_power;
if (rate <= DESC_RATE11M)
tx_power = pwr_idx_2g->cck_base[group];
@@ -1972,11 +2009,15 @@ static u8 rtw_phy_get_2g_tx_power_index(struct rtw_dev *rtwdev,
if (rate >= DESC_RATE6M && rate <= DESC_RATE54M)
tx_power += pwr_idx_2g->ht_1s_diff.ofdm * factor;
- mcs_rate = (rate >= DESC_RATEMCS0 && rate <= DESC_RATEMCS15) ||
+ mcs_rate = (rate >= DESC_RATEMCS0 && rate <= DESC_RATEMCS31) ||
(rate >= DESC_RATEVHT1SS_MCS0 &&
- rate <= DESC_RATEVHT2SS_MCS9);
- above_2ss = (rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS15) ||
+ rate <= DESC_RATEVHT4SS_MCS9);
+ above_2ss = (rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS31) ||
(rate >= DESC_RATEVHT2SS_MCS0);
+ above_3ss = (rate >= DESC_RATEMCS16 && rate <= DESC_RATEMCS31) ||
+ (rate >= DESC_RATEVHT3SS_MCS0);
+ above_4ss = (rate >= DESC_RATEMCS24 && rate <= DESC_RATEMCS31) ||
+ (rate >= DESC_RATEVHT4SS_MCS0);
if (!mcs_rate)
return tx_power;
@@ -1989,11 +2030,19 @@ static u8 rtw_phy_get_2g_tx_power_index(struct rtw_dev *rtwdev,
tx_power += pwr_idx_2g->ht_1s_diff.bw20 * factor;
if (above_2ss)
tx_power += pwr_idx_2g->ht_2s_diff.bw20 * factor;
+ if (above_3ss)
+ tx_power += pwr_idx_2g->ht_3s_diff.bw20 * factor;
+ if (above_4ss)
+ tx_power += pwr_idx_2g->ht_4s_diff.bw20 * factor;
break;
case RTW_CHANNEL_WIDTH_40:
/* bw40 is the base power */
if (above_2ss)
tx_power += pwr_idx_2g->ht_2s_diff.bw40 * factor;
+ if (above_3ss)
+ tx_power += pwr_idx_2g->ht_3s_diff.bw40 * factor;
+ if (above_4ss)
+ tx_power += pwr_idx_2g->ht_4s_diff.bw40 * factor;
break;
}
@@ -2006,19 +2055,23 @@ static u8 rtw_phy_get_5g_tx_power_index(struct rtw_dev *rtwdev,
u8 rate, u8 group)
{
const struct rtw_chip_info *chip = rtwdev->chip;
- u8 tx_power;
+ bool above_2ss, above_3ss, above_4ss;
+ u8 factor = chip->txgi_factor;
u8 upper, lower;
bool mcs_rate;
- bool above_2ss;
- u8 factor = chip->txgi_factor;
+ u8 tx_power;
tx_power = pwr_idx_5g->bw40_base[group];
- mcs_rate = (rate >= DESC_RATEMCS0 && rate <= DESC_RATEMCS15) ||
+ mcs_rate = (rate >= DESC_RATEMCS0 && rate <= DESC_RATEMCS31) ||
(rate >= DESC_RATEVHT1SS_MCS0 &&
- rate <= DESC_RATEVHT2SS_MCS9);
- above_2ss = (rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS15) ||
+ rate <= DESC_RATEVHT4SS_MCS9);
+ above_2ss = (rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS31) ||
(rate >= DESC_RATEVHT2SS_MCS0);
+ above_3ss = (rate >= DESC_RATEMCS16 && rate <= DESC_RATEMCS31) ||
+ (rate >= DESC_RATEVHT3SS_MCS0);
+ above_4ss = (rate >= DESC_RATEMCS24 && rate <= DESC_RATEMCS31) ||
+ (rate >= DESC_RATEVHT4SS_MCS0);
if (!mcs_rate) {
tx_power += pwr_idx_5g->ht_1s_diff.ofdm * factor;
@@ -2033,11 +2086,19 @@ static u8 rtw_phy_get_5g_tx_power_index(struct rtw_dev *rtwdev,
tx_power += pwr_idx_5g->ht_1s_diff.bw20 * factor;
if (above_2ss)
tx_power += pwr_idx_5g->ht_2s_diff.bw20 * factor;
+ if (above_3ss)
+ tx_power += pwr_idx_5g->ht_3s_diff.bw20 * factor;
+ if (above_4ss)
+ tx_power += pwr_idx_5g->ht_4s_diff.bw20 * factor;
break;
case RTW_CHANNEL_WIDTH_40:
/* bw40 is the base power */
if (above_2ss)
tx_power += pwr_idx_5g->ht_2s_diff.bw40 * factor;
+ if (above_3ss)
+ tx_power += pwr_idx_5g->ht_3s_diff.bw40 * factor;
+ if (above_4ss)
+ tx_power += pwr_idx_5g->ht_4s_diff.bw40 * factor;
break;
case RTW_CHANNEL_WIDTH_80:
/* the base idx of bw80 is the average of bw40+/bw40- */
@@ -2048,13 +2109,17 @@ static u8 rtw_phy_get_5g_tx_power_index(struct rtw_dev *rtwdev,
tx_power += pwr_idx_5g->vht_1s_diff.bw80 * factor;
if (above_2ss)
tx_power += pwr_idx_5g->vht_2s_diff.bw80 * factor;
+ if (above_3ss)
+ tx_power += pwr_idx_5g->vht_3s_diff.bw80 * factor;
+ if (above_4ss)
+ tx_power += pwr_idx_5g->vht_4s_diff.bw80 * factor;
break;
}
return tx_power;
}
-/* return RTW_RATE_SECTION_MAX to indicate rate is invalid */
+/* return RTW_RATE_SECTION_NUM to indicate rate is invalid */
static u8 rtw_phy_rate_to_rate_section(u8 rate)
{
if (rate >= DESC_RATE1M && rate <= DESC_RATE11M)
@@ -2065,12 +2130,20 @@ static u8 rtw_phy_rate_to_rate_section(u8 rate)
return RTW_RATE_SECTION_HT_1S;
else if (rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS15)
return RTW_RATE_SECTION_HT_2S;
+ else if (rate >= DESC_RATEMCS16 && rate <= DESC_RATEMCS23)
+ return RTW_RATE_SECTION_HT_3S;
+ else if (rate >= DESC_RATEMCS24 && rate <= DESC_RATEMCS31)
+ return RTW_RATE_SECTION_HT_4S;
else if (rate >= DESC_RATEVHT1SS_MCS0 && rate <= DESC_RATEVHT1SS_MCS9)
return RTW_RATE_SECTION_VHT_1S;
else if (rate >= DESC_RATEVHT2SS_MCS0 && rate <= DESC_RATEVHT2SS_MCS9)
return RTW_RATE_SECTION_VHT_2S;
+ else if (rate >= DESC_RATEVHT3SS_MCS0 && rate <= DESC_RATEVHT3SS_MCS9)
+ return RTW_RATE_SECTION_VHT_3S;
+ else if (rate >= DESC_RATEVHT4SS_MCS0 && rate <= DESC_RATEVHT4SS_MCS9)
+ return RTW_RATE_SECTION_VHT_4S;
else
- return RTW_RATE_SECTION_MAX;
+ return RTW_RATE_SECTION_NUM;
}
static s8 rtw_phy_get_tx_power_limit(struct rtw_dev *rtwdev, u8 band,
@@ -2088,7 +2161,7 @@ static s8 rtw_phy_get_tx_power_limit(struct rtw_dev *rtwdev, u8 band,
if (regd > RTW_REGD_WW)
return power_limit;
- if (rs == RTW_RATE_SECTION_MAX)
+ if (rs == RTW_RATE_SECTION_NUM)
goto err;
/* only 20M BW with cck and ofdm */
@@ -2096,7 +2169,7 @@ static s8 rtw_phy_get_tx_power_limit(struct rtw_dev *rtwdev, u8 band,
bw = RTW_CHANNEL_WIDTH_20;
/* only 20/40M BW with ht */
- if (rs == RTW_RATE_SECTION_HT_1S || rs == RTW_RATE_SECTION_HT_2S)
+ if (rate >= DESC_RATEMCS0 && rate <= DESC_RATEMCS31)
bw = min_t(u8, bw, RTW_CHANNEL_WIDTH_40);
/* select min power limit among [20M BW ~ current BW] */
@@ -2132,7 +2205,7 @@ static s8 rtw_phy_get_tx_power_sar(struct rtw_dev *rtwdev, u8 sar_band,
.rs = rs,
};
- if (rs == RTW_RATE_SECTION_MAX)
+ if (rs == RTW_RATE_SECTION_NUM)
goto err;
return rtw_query_sar(rtwdev, &arg);
@@ -2214,14 +2287,14 @@ static void rtw_phy_set_tx_power_index_by_rs(struct rtw_dev *rtwdev,
{
struct rtw_hal *hal = &rtwdev->hal;
u8 regd = rtw_regd_get(rtwdev);
- u8 *rates;
+ const u8 *rates;
u8 size;
u8 rate;
u8 pwr_idx;
u8 bw;
int i;
- if (rs >= RTW_RATE_SECTION_MAX)
+ if (rs >= RTW_RATE_SECTION_NUM)
return;
rates = rtw_rate_section[rs];
@@ -2252,7 +2325,7 @@ static void rtw_phy_set_tx_power_level_by_path(struct rtw_dev *rtwdev,
else
rs = RTW_RATE_SECTION_OFDM;
- for (; rs < RTW_RATE_SECTION_MAX; rs++)
+ for (; rs < RTW_RATE_SECTION_NUM; rs++)
rtw_phy_set_tx_power_index_by_rs(rtwdev, ch, path, rs);
}
@@ -2274,13 +2347,13 @@ EXPORT_SYMBOL(rtw_phy_set_tx_power_level);
static void
rtw_phy_tx_power_by_rate_config_by_path(struct rtw_hal *hal, u8 path,
- u8 rs, u8 size, u8 *rates)
+ u8 rs, u8 size, const u8 *rates)
{
u8 rate;
u8 base_idx, rate_idx;
s8 base_2g, base_5g;
- if (rs >= RTW_RATE_SECTION_VHT_1S)
+ if (size == 10) /* VHT rates */
base_idx = rates[size - 3];
else
base_idx = rates[size - 1];
@@ -2297,28 +2370,12 @@ rtw_phy_tx_power_by_rate_config_by_path(struct rtw_hal *hal, u8 path,
void rtw_phy_tx_power_by_rate_config(struct rtw_hal *hal)
{
- u8 path;
+ u8 path, rs;
- for (path = 0; path < RTW_RF_PATH_MAX; path++) {
- rtw_phy_tx_power_by_rate_config_by_path(hal, path,
- RTW_RATE_SECTION_CCK,
- rtw_cck_size, rtw_cck_rates);
- rtw_phy_tx_power_by_rate_config_by_path(hal, path,
- RTW_RATE_SECTION_OFDM,
- rtw_ofdm_size, rtw_ofdm_rates);
- rtw_phy_tx_power_by_rate_config_by_path(hal, path,
- RTW_RATE_SECTION_HT_1S,
- rtw_ht_1s_size, rtw_ht_1s_rates);
- rtw_phy_tx_power_by_rate_config_by_path(hal, path,
- RTW_RATE_SECTION_HT_2S,
- rtw_ht_2s_size, rtw_ht_2s_rates);
- rtw_phy_tx_power_by_rate_config_by_path(hal, path,
- RTW_RATE_SECTION_VHT_1S,
- rtw_vht_1s_size, rtw_vht_1s_rates);
- rtw_phy_tx_power_by_rate_config_by_path(hal, path,
- RTW_RATE_SECTION_VHT_2S,
- rtw_vht_2s_size, rtw_vht_2s_rates);
- }
+ for (path = 0; path < RTW_RF_PATH_MAX; path++)
+ for (rs = 0; rs < RTW_RATE_SECTION_NUM; rs++)
+ rtw_phy_tx_power_by_rate_config_by_path(hal, path, rs,
+ rtw_rate_size[rs], rtw_rate_section[rs]);
}
static void
@@ -2347,7 +2404,7 @@ void rtw_phy_tx_power_limit_config(struct rtw_hal *hal)
for (regd = 0; regd < RTW_REGD_MAX; regd++)
for (bw = 0; bw < RTW_CHANNEL_WIDTH_MAX; bw++)
- for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++)
+ for (rs = 0; rs < RTW_RATE_SECTION_NUM; rs++)
__rtw_phy_tx_power_limit_config(hal, regd, bw, rs);
}
@@ -2383,7 +2440,7 @@ void rtw_phy_init_tx_power(struct rtw_dev *rtwdev)
/* init tx power limit */
for (regd = 0; regd < RTW_REGD_MAX; regd++)
for (bw = 0; bw < RTW_CHANNEL_WIDTH_MAX; bw++)
- for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++)
+ for (rs = 0; rs < RTW_RATE_SECTION_NUM; rs++)
rtw_phy_init_tx_power_limit(rtwdev, regd, bw,
rs);
}
@@ -2401,32 +2458,56 @@ void rtw_phy_config_swing_table(struct rtw_dev *rtwdev,
swing_table->n[RF_PATH_A] = tbl->pwrtrk_2g_ccka_n;
swing_table->p[RF_PATH_B] = tbl->pwrtrk_2g_cckb_p;
swing_table->n[RF_PATH_B] = tbl->pwrtrk_2g_cckb_n;
+ swing_table->p[RF_PATH_C] = tbl->pwrtrk_2g_cckc_p;
+ swing_table->n[RF_PATH_C] = tbl->pwrtrk_2g_cckc_n;
+ swing_table->p[RF_PATH_D] = tbl->pwrtrk_2g_cckd_p;
+ swing_table->n[RF_PATH_D] = tbl->pwrtrk_2g_cckd_n;
} else {
swing_table->p[RF_PATH_A] = tbl->pwrtrk_2ga_p;
swing_table->n[RF_PATH_A] = tbl->pwrtrk_2ga_n;
swing_table->p[RF_PATH_B] = tbl->pwrtrk_2gb_p;
swing_table->n[RF_PATH_B] = tbl->pwrtrk_2gb_n;
+ swing_table->p[RF_PATH_C] = tbl->pwrtrk_2gc_p;
+ swing_table->n[RF_PATH_C] = tbl->pwrtrk_2gc_n;
+ swing_table->p[RF_PATH_D] = tbl->pwrtrk_2gd_p;
+ swing_table->n[RF_PATH_D] = tbl->pwrtrk_2gd_n;
}
} else if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel)) {
swing_table->p[RF_PATH_A] = tbl->pwrtrk_5ga_p[RTW_PWR_TRK_5G_1];
swing_table->n[RF_PATH_A] = tbl->pwrtrk_5ga_n[RTW_PWR_TRK_5G_1];
swing_table->p[RF_PATH_B] = tbl->pwrtrk_5gb_p[RTW_PWR_TRK_5G_1];
swing_table->n[RF_PATH_B] = tbl->pwrtrk_5gb_n[RTW_PWR_TRK_5G_1];
+ swing_table->p[RF_PATH_C] = tbl->pwrtrk_5gc_p[RTW_PWR_TRK_5G_1];
+ swing_table->n[RF_PATH_C] = tbl->pwrtrk_5gc_n[RTW_PWR_TRK_5G_1];
+ swing_table->p[RF_PATH_D] = tbl->pwrtrk_5gd_p[RTW_PWR_TRK_5G_1];
+ swing_table->n[RF_PATH_D] = tbl->pwrtrk_5gd_n[RTW_PWR_TRK_5G_1];
} else if (IS_CH_5G_BAND_3(channel)) {
swing_table->p[RF_PATH_A] = tbl->pwrtrk_5ga_p[RTW_PWR_TRK_5G_2];
swing_table->n[RF_PATH_A] = tbl->pwrtrk_5ga_n[RTW_PWR_TRK_5G_2];
swing_table->p[RF_PATH_B] = tbl->pwrtrk_5gb_p[RTW_PWR_TRK_5G_2];
swing_table->n[RF_PATH_B] = tbl->pwrtrk_5gb_n[RTW_PWR_TRK_5G_2];
+ swing_table->p[RF_PATH_C] = tbl->pwrtrk_5gc_p[RTW_PWR_TRK_5G_2];
+ swing_table->n[RF_PATH_C] = tbl->pwrtrk_5gc_n[RTW_PWR_TRK_5G_2];
+ swing_table->p[RF_PATH_D] = tbl->pwrtrk_5gd_p[RTW_PWR_TRK_5G_2];
+ swing_table->n[RF_PATH_D] = tbl->pwrtrk_5gd_n[RTW_PWR_TRK_5G_2];
} else if (IS_CH_5G_BAND_4(channel)) {
swing_table->p[RF_PATH_A] = tbl->pwrtrk_5ga_p[RTW_PWR_TRK_5G_3];
swing_table->n[RF_PATH_A] = tbl->pwrtrk_5ga_n[RTW_PWR_TRK_5G_3];
swing_table->p[RF_PATH_B] = tbl->pwrtrk_5gb_p[RTW_PWR_TRK_5G_3];
swing_table->n[RF_PATH_B] = tbl->pwrtrk_5gb_n[RTW_PWR_TRK_5G_3];
+ swing_table->p[RF_PATH_C] = tbl->pwrtrk_5gc_p[RTW_PWR_TRK_5G_3];
+ swing_table->n[RF_PATH_C] = tbl->pwrtrk_5gc_n[RTW_PWR_TRK_5G_3];
+ swing_table->p[RF_PATH_D] = tbl->pwrtrk_5gd_p[RTW_PWR_TRK_5G_3];
+ swing_table->n[RF_PATH_D] = tbl->pwrtrk_5gd_n[RTW_PWR_TRK_5G_3];
} else {
swing_table->p[RF_PATH_A] = tbl->pwrtrk_2ga_p;
swing_table->n[RF_PATH_A] = tbl->pwrtrk_2ga_n;
swing_table->p[RF_PATH_B] = tbl->pwrtrk_2gb_p;
swing_table->n[RF_PATH_B] = tbl->pwrtrk_2gb_n;
+ swing_table->p[RF_PATH_C] = tbl->pwrtrk_2gc_p;
+ swing_table->n[RF_PATH_C] = tbl->pwrtrk_2gc_n;
+ swing_table->p[RF_PATH_D] = tbl->pwrtrk_2gd_p;
+ swing_table->n[RF_PATH_D] = tbl->pwrtrk_2gd_n;
}
}
EXPORT_SYMBOL(rtw_phy_config_swing_table);
diff --git a/drivers/net/wireless/realtek/rtw88/phy.h b/drivers/net/wireless/realtek/rtw88/phy.h
index ccfcbd3ced03..c9e6b869661d 100644
--- a/drivers/net/wireless/realtek/rtw88/phy.h
+++ b/drivers/net/wireless/realtek/rtw88/phy.h
@@ -7,14 +7,18 @@
#include "debug.h"
-extern u8 rtw_cck_rates[];
-extern u8 rtw_ofdm_rates[];
-extern u8 rtw_ht_1s_rates[];
-extern u8 rtw_ht_2s_rates[];
-extern u8 rtw_vht_1s_rates[];
-extern u8 rtw_vht_2s_rates[];
-extern u8 *rtw_rate_section[];
-extern u8 rtw_rate_size[];
+extern const u8 rtw_cck_rates[];
+extern const u8 rtw_ofdm_rates[];
+extern const u8 rtw_ht_1s_rates[];
+extern const u8 rtw_ht_2s_rates[];
+extern const u8 rtw_vht_1s_rates[];
+extern const u8 rtw_vht_2s_rates[];
+extern const u8 rtw_ht_3s_rates[];
+extern const u8 rtw_ht_4s_rates[];
+extern const u8 rtw_vht_3s_rates[];
+extern const u8 rtw_vht_4s_rates[];
+extern const u8 * const rtw_rate_section[];
+extern const u8 rtw_rate_size[];
void rtw_phy_init(struct rtw_dev *rtwdev);
void rtw_phy_dynamic_mechanism(struct rtw_dev *rtwdev);
diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h
index e438405fba56..08e9494977e0 100644
--- a/drivers/net/wireless/realtek/rtw88/reg.h
+++ b/drivers/net/wireless/realtek/rtw88/reg.h
@@ -8,6 +8,7 @@
#define REG_SYS_FUNC_EN 0x0002
#define BIT_FEN_EN_25_1 BIT(13)
#define BIT_FEN_ELDR BIT(12)
+#define BIT_FEN_PCIEA BIT(6)
#define BIT_FEN_CPUEN BIT(2)
#define BIT_FEN_USBA BIT(2)
#define BIT_FEN_BB_GLB_RST BIT(1)
@@ -39,6 +40,9 @@
#define BIT_RF_RSTB BIT(1)
#define BIT_RF_EN BIT(0)
+#define REG_RF_CTRL1 0x0020
+#define REG_RF_CTRL2 0x0021
+
#define REG_AFE_CTRL1 0x0024
#define BIT_MAC_CLK_SEL (BIT(20) | BIT(21))
#define REG_EFUSE_CTRL 0x0030
@@ -73,6 +77,8 @@
#define BIT_BT_PTA_EN BIT(5)
#define BIT_WLRFE_4_5_EN BIT(2)
+#define REG_GPIO_PIN_CTRL 0x0044
+
#define REG_LED_CFG 0x004C
#define BIT_LNAON_SEL_EN BIT(26)
#define BIT_PAPE_SEL_EN BIT(25)
@@ -110,6 +116,7 @@
#define BIT_SDIO_PAD_E5 BIT(18)
#define REG_RF_B_CTRL 0x76
+#define REG_RF_CTRL3 0x0076
#define REG_AFE_CTRL_4 0x0078
#define BIT_CK320M_AFE_EN BIT(4)
@@ -130,6 +137,7 @@
#define BIT_SHIFT_ROM_PGE 16
#define BIT_FW_INIT_RDY BIT(15)
#define BIT_FW_DW_RDY BIT(14)
+#define BIT_CPU_CLK_SEL (BIT(12) | BIT(13))
#define BIT_RPWM_TOGGLE BIT(7)
#define BIT_RAM_DL_SEL BIT(7) /* legacy only */
#define BIT_DMEM_CHKSUM_OK BIT(6)
@@ -147,7 +155,7 @@
BIT_CHECK_SUM_OK)
#define FW_READY_LEGACY (BIT_MCUFWDL_RDY | BIT_FWDL_CHK_RPT | \
BIT_WINTINI_RDY | BIT_RAM_DL_SEL)
-#define FW_READY_MASK 0xffff
+#define FW_READY_MASK (0xffff & ~BIT_CPU_CLK_SEL)
#define REG_MCU_TST_CFG 0x84
#define VAL_FW_TRIGGER 0x1
@@ -602,15 +610,25 @@
#define REG_CCA2ND 0x0838
#define REG_L1PKTH 0x0848
#define REG_CLKTRK 0x0860
+#define REG_CSI_MASK_SETTING1 0x0874
+#define REG_NBI_SETTING 0x087c
+#define BIT_NBI_ENABLE BIT(13)
+#define REG_CSI_FIX_MASK0 0x0880
+#define REG_CSI_FIX_MASK1 0x0884
+#define REG_CSI_FIX_MASK6 0x0898
+#define REG_CSI_FIX_MASK7 0x089c
#define REG_ADCCLK 0x08AC
#define REG_HSSI_READ 0x08B0
#define REG_FPGA0_XCD_RF_PARA 0x08B4
#define REG_RX_MCS_LIMIT 0x08BC
#define REG_ADC160 0x08C4
+#define REG_DBGSEL 0x08fc
#define REG_ANTSEL_SW 0x0900
#define REG_DAC_RSTB 0x090c
+#define REG_PSD 0x0910
+#define BIT_PSD_INI GENMASK(23, 22)
#define REG_SINGLE_TONE_CONT_TX 0x0914
-
+#define REG_AGC_TABLE 0x0958
#define REG_RFE_CTRL_E 0x0974
#define REG_2ND_CCA_CTRL 0x0976
#define REG_IQK_COM00 0x0978
@@ -620,10 +638,18 @@
#define REG_FAS 0x09a4
#define REG_RXSB 0x0a00
+#define BIT_RXSB_ANA_DIV BIT(15)
#define REG_CCK_RX 0x0a04
#define REG_CCK_PD_TH 0x0a0a
-
-#define REG_CCK0_FAREPORT 0xa2c
+#define REG_PRECTRL 0x0a14
+#define BIT_DIS_CO_PATHSEL BIT(7)
+#define BIT_IQ_WGT GENMASK(9, 8)
+#define REG_CCA_MF 0x0a20
+#define BIT_MBC_WIN GENMASK(5, 4)
+#define REG_CCK0_TX_FILTER1 0x0a20
+#define REG_CCK0_TX_FILTER2 0x0a24
+#define REG_CCK0_DEBUG_PORT 0x0a28
+#define REG_CCK0_FAREPORT 0x0a2c
#define BIT_CCK0_2RX BIT(18)
#define BIT_CCK0_MRC BIT(22)
#define REG_FA_CCK 0x0a5c
@@ -642,10 +668,18 @@
#define DIS_DPD_RATEVHT2SS_MCS1 BIT(9)
#define DIS_DPD_RATEALL GENMASK(9, 0)
+#define REG_CCA 0x0a70
+#define BIT_CCA_CO BIT(7)
+#define REG_ANTSEL 0x0a74
+#define BIT_ANT_BYCO BIT(8)
+#define REG_CCKTX 0x0a84
+#define BIT_CMB_CCA_2R BIT(28)
+
#define REG_CNTRST 0x0b58
#define REG_3WIRE_SWA 0x0c00
#define REG_RX_IQC_AB_A 0x0c10
+#define REG_RX_IQC_CD_A 0x0c14
#define REG_TXSCALE_A 0x0c1c
#define BB_SWING_MASK GENMASK(31, 21)
#define REG_TX_AGC_A_CCK_11_CCK_1 0xc20
@@ -673,7 +707,7 @@
#define REG_LSSI_WRITE_A 0x0c90
#define REG_PREDISTA 0x0c90
#define REG_TXAGCIDX 0x0c94
-
+#define REG_TX_AGC_A 0x0c94
#define REG_RFE_PINMUX_A 0x0cb0
#define REG_RFE_INV_A 0x0cb4
#define REG_RFE_CTRL8 0x0cb4
@@ -682,6 +716,7 @@
#define DPDT_CTRL_PIN 0x77
#define RFE_INV_MASK 0x3ff00000
#define REG_RFECTL_A 0x0cb8
+#define REG_RFE_INV0 0x0cbc
#define REG_RFE_INV8 0x0cbd
#define BIT_MASK_RFE_INV89 GENMASK(1, 0)
#define REG_RFE_INV16 0x0cbe
@@ -702,6 +737,7 @@
#define REG_3WIRE_SWB 0x0e00
#define REG_RX_IQC_AB_B 0x0e10
+#define REG_RX_IQC_CD_B 0x0e14
#define REG_TXSCALE_B 0x0e1c
#define REG_TX_AGC_B_CCK_11_CCK_1 0xe20
#define REG_TX_AGC_B_OFDM18_OFDM6 0xe24
@@ -728,6 +764,7 @@
#define REG_LSSI_WRITE_B 0x0e90
#define REG_PREDISTB 0x0e90
#define REG_INIDLYB 0x0e94
+#define REG_TX_AGC_B 0x0e94
#define REG_RFE_PINMUX_B 0x0eb0
#define REG_RFE_INV_B 0x0eb4
#define REG_RFECTL_B 0x0eb8
@@ -743,8 +780,11 @@
#define REG_CRC_HT 0x0f10
#define REG_CRC_OFDM 0x0f14
#define REG_FA_OFDM 0x0f48
+#define REG_DBGRPT 0x0fa0
#define REG_CCA_CCK 0x0fcc
+#define REG_SYS_CFG3_8814A 0x1000
+
#define REG_ANAPARSW_MAC_0 0x1010
#define BIT_CF_L_V2 GENMASK(29, 28)
@@ -862,9 +902,27 @@
#define LTECOEX_WRITE_DATA REG_WL2LTECOEX_INDIRECT_ACCESS_WRITE_DATA_V1
#define LTECOEX_READ_DATA REG_WL2LTECOEX_INDIRECT_ACCESS_READ_DATA_V1
+#define REG_RX_IQC_AB_C 0x1810
+#define REG_RX_IQC_CD_C 0x1814
+#define REG_TXSCALE_C 0x181c
+#define REG_CK_MONHC 0x185c
+#define REG_AFE_PWR1_C 0x1860
#define REG_IGN_GNT_BT1 0x1860
+#define REG_TX_AGC_C 0x1894
+#define REG_RFE_PINMUX_C 0x18b4
#define REG_RFESEL_CTRL 0x1990
+#define REG_AGC_TBL 0x1998
+
+#define REG_RX_IQC_AB_D 0x1a10
+#define REG_RX_IQC_CD_D 0x1a14
+#define REG_TXSCALE_D 0x1a1c
+#define REG_CK_MONHD 0x1a5c
+#define REG_AFE_PWR1_D 0x1a60
+#define REG_TX_AGC_D 0x1a94
+#define REG_RFE_PINMUX_D 0x1ab4
+#define REG_RFE_INVSEL_D 0x1abc
+#define BIT_RFE_SELSW0_D GENMASK(27, 20)
#define REG_NOMASK_TXBT 0x1ca7
#define REG_ANAPAR 0x1c30
@@ -905,6 +963,7 @@
#define RF18_BAND_MASK (BIT(16) | BIT(9) | BIT(8))
#define RF18_CHANNEL_MASK (MASKBYTE0)
#define RF18_RFSI_MASK (BIT(18) | BIT(17))
+#define RF_RCK1_V1 0x1c
#define RF_RCK 0x1d
#define RF_MODE_TABLE_ADDR 0x30
#define RF_MODE_TABLE_DATA0 0x31
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
index eeca31bf71f1..87715bd54860 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
@@ -444,7 +444,7 @@ static u8 rtw8723d_iqk_check_tx_failed(struct rtw_dev *rtwdev,
rtw_read32(rtwdev, REG_IQK_RES_TX),
rtw_read32(rtwdev, REG_IQK_RES_TY));
rtw_dbg(rtwdev, RTW_DBG_RFK,
- "[IQK] 0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n",
+ "[IQK] 0xe90(before IQK)= 0x%x, 0xe98(after IQK) = 0x%x\n",
rtw_read32(rtwdev, 0xe90),
rtw_read32(rtwdev, 0xe98));
@@ -472,7 +472,7 @@ static u8 rtw8723d_iqk_check_rx_failed(struct rtw_dev *rtwdev,
rtw_read32(rtwdev, REG_IQK_RES_RY));
rtw_dbg(rtwdev, RTW_DBG_RFK,
- "[IQK] 0xea0(before IQK)= 0x%x, 0xea8(afer IQK) = 0x%x\n",
+ "[IQK] 0xea0(before IQK)= 0x%x, 0xea8(after IQK) = 0x%x\n",
rtw_read32(rtwdev, 0xea0),
rtw_read32(rtwdev, 0xea8));
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8814a.c b/drivers/net/wireless/realtek/rtw88/rtw8814a.c
new file mode 100644
index 000000000000..cfd35d40d46e
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/rtw8814a.c
@@ -0,0 +1,2257 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2025 Realtek Corporation
+ */
+
+#include <linux/usb.h>
+#include "main.h"
+#include "coex.h"
+#include "tx.h"
+#include "phy.h"
+#include "rtw8814a.h"
+#include "rtw8814a_table.h"
+#include "rtw88xxa.h"
+#include "reg.h"
+#include "debug.h"
+#include "efuse.h"
+#include "regd.h"
+#include "usb.h"
+
+static void rtw8814a_efuse_grant(struct rtw_dev *rtwdev, bool on)
+{
+ if (on) {
+ rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON);
+
+ rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_ELDR);
+ rtw_write16_set(rtwdev, REG_SYS_CLKR,
+ BIT_LOADER_CLK_EN | BIT_ANA8M);
+ } else {
+ rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF);
+ }
+}
+
+static void rtw8814a_read_rfe_type(struct rtw_dev *rtwdev)
+{
+ struct rtw_efuse *efuse = &rtwdev->efuse;
+
+ if (!(efuse->rfe_option & BIT(7)))
+ return;
+
+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE)
+ efuse->rfe_option = 0;
+ else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB)
+ efuse->rfe_option = 1;
+}
+
+static void rtw8814a_read_amplifier_type(struct rtw_dev *rtwdev)
+{
+ struct rtw_efuse *efuse = &rtwdev->efuse;
+
+ switch (efuse->rfe_option) {
+ case 1:
+ /* Internal 2G */
+ efuse->pa_type_2g = 0;
+ efuse->lna_type_2g = 0;
+ /* External 5G */
+ efuse->pa_type_5g = BIT(0);
+ efuse->lna_type_5g = BIT(3);
+ break;
+ case 2 ... 5:
+ /* External everything */
+ efuse->pa_type_2g = BIT(4);
+ efuse->lna_type_2g = BIT(3);
+ efuse->pa_type_5g = BIT(0);
+ efuse->lna_type_5g = BIT(3);
+ break;
+ case 6:
+ efuse->lna_type_5g = BIT(3);
+ break;
+ default:
+ break;
+ }
+}
+
+static void rtw8814a_read_rf_type(struct rtw_dev *rtwdev,
+ struct rtw8814a_efuse *map)
+{
+ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
+ struct rtw_hal *hal = &rtwdev->hal;
+
+ switch (map->trx_antenna_option) {
+ case 0xff: /* 4T4R */
+ case 0xee: /* 3T3R */
+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB &&
+ rtwusb->udev->speed != USB_SPEED_SUPER)
+ hal->rf_type = RF_2T2R;
+ else
+ hal->rf_type = RF_3T3R;
+
+ break;
+ case 0x66: /* 2T2R */
+ case 0x6f: /* 2T4R */
+ default:
+ hal->rf_type = RF_2T2R;
+ break;
+ }
+
+ hal->rf_path_num = 4;
+ hal->rf_phy_num = 4;
+
+ if (hal->rf_type == RF_3T3R) {
+ hal->antenna_rx = BB_PATH_ABC;
+ hal->antenna_tx = BB_PATH_ABC;
+ } else {
+ hal->antenna_rx = BB_PATH_AB;
+ hal->antenna_tx = BB_PATH_AB;
+ }
+}
+
+static void rtw8814a_init_hwcap(struct rtw_dev *rtwdev)
+{
+ struct rtw_efuse *efuse = &rtwdev->efuse;
+ struct rtw_hal *hal = &rtwdev->hal;
+
+ efuse->hw_cap.bw = BIT(RTW_CHANNEL_WIDTH_20) |
+ BIT(RTW_CHANNEL_WIDTH_40) |
+ BIT(RTW_CHANNEL_WIDTH_80);
+ efuse->hw_cap.ptcl = EFUSE_HW_CAP_PTCL_VHT;
+
+ if (hal->rf_type == RF_3T3R)
+ efuse->hw_cap.nss = 3;
+ else
+ efuse->hw_cap.nss = 2;
+
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE,
+ "hw cap: hci=0x%02x, bw=0x%02x, ptcl=0x%02x, ant_num=%d, nss=%d\n",
+ efuse->hw_cap.hci, efuse->hw_cap.bw, efuse->hw_cap.ptcl,
+ efuse->hw_cap.ant_num, efuse->hw_cap.nss);
+}
+
+static int rtw8814a_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
+{
+ struct rtw_efuse *efuse = &rtwdev->efuse;
+ struct rtw8814a_efuse *map;
+ int i;
+
+ if (rtw_dbg_is_enabled(rtwdev, RTW_DBG_EFUSE))
+ print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1,
+ log_map, rtwdev->chip->log_efuse_size, true);
+
+ map = (struct rtw8814a_efuse *)log_map;
+
+ efuse->usb_mode_switch = u8_get_bits(map->usb_mode, BIT(4));
+ efuse->rfe_option = map->rfe_option;
+ efuse->rf_board_option = map->rf_board_option;
+ efuse->crystal_cap = map->xtal_k;
+ efuse->channel_plan = map->channel_plan;
+ efuse->country_code[0] = map->country_code[0];
+ efuse->country_code[1] = map->country_code[1];
+ efuse->bt_setting = map->rf_bt_setting;
+ efuse->regd = map->rf_board_option & 0x7;
+ efuse->thermal_meter[RF_PATH_A] = map->thermal_meter;
+ efuse->thermal_meter_k = map->thermal_meter;
+ efuse->tx_bb_swing_setting_2g = map->tx_bb_swing_setting_2g;
+ efuse->tx_bb_swing_setting_5g = map->tx_bb_swing_setting_5g;
+
+ rtw8814a_read_rfe_type(rtwdev);
+ rtw8814a_read_amplifier_type(rtwdev);
+
+ /* Override rtw_chip_parameter_setup() */
+ rtw8814a_read_rf_type(rtwdev, map);
+
+ rtw8814a_init_hwcap(rtwdev);
+
+ for (i = 0; i < 4; i++)
+ efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
+
+ switch (rtw_hci_type(rtwdev)) {
+ case RTW_HCI_TYPE_USB:
+ ether_addr_copy(efuse->addr, map->u.mac_addr);
+ break;
+ case RTW_HCI_TYPE_PCIE:
+ ether_addr_copy(efuse->addr, map->e.mac_addr);
+ break;
+ case RTW_HCI_TYPE_SDIO:
+ default:
+ /* unsupported now */
+ return -EOPNOTSUPP;
+ }
+
+ return 0;
+}
+
+static void rtw8814a_init_rfe_reg(struct rtw_dev *rtwdev)
+{
+ u8 rfe_option = rtwdev->efuse.rfe_option;
+
+ if (rfe_option == 2 || rfe_option == 1) {
+ rtw_write32_mask(rtwdev, 0x1994, 0xf, 0xf);
+ rtw_write8_set(rtwdev, REG_GPIO_MUXCFG + 2, 0xf0);
+ } else if (rfe_option == 0) {
+ rtw_write32_mask(rtwdev, 0x1994, 0xf, 0xf);
+ rtw_write8_set(rtwdev, REG_GPIO_MUXCFG + 2, 0xc0);
+ }
+}
+
+#define RTW_TXSCALE_SIZE 37
+static const u32 rtw8814a_txscale_tbl[RTW_TXSCALE_SIZE] = {
+ 0x081, 0x088, 0x090, 0x099, 0x0a2, 0x0ac, 0x0b6, 0x0c0, 0x0cc, 0x0d8,
+ 0x0e5, 0x0f2, 0x101, 0x110, 0x120, 0x131, 0x143, 0x156, 0x16a, 0x180,
+ 0x197, 0x1af, 0x1c8, 0x1e3, 0x200, 0x21e, 0x23e, 0x261, 0x285, 0x2ab,
+ 0x2d3, 0x2fe, 0x32b, 0x35c, 0x38e, 0x3c4, 0x3fe
+};
+
+static u32 rtw8814a_get_bb_swing(struct rtw_dev *rtwdev, u8 band, u8 rf_path)
+{
+ static const u32 swing2setting[4] = {0x200, 0x16a, 0x101, 0x0b6};
+ struct rtw_efuse *efuse = &rtwdev->efuse;
+ u8 tx_bb_swing;
+
+ if (band == RTW_BAND_2G)
+ tx_bb_swing = efuse->tx_bb_swing_setting_2g;
+ else
+ tx_bb_swing = efuse->tx_bb_swing_setting_5g;
+
+ tx_bb_swing >>= 2 * rf_path;
+ tx_bb_swing &= 0x3;
+
+ return swing2setting[tx_bb_swing];
+}
+
+static u8 rtw8814a_get_swing_index(struct rtw_dev *rtwdev)
+{
+ u32 swing, table_value;
+ u8 i;
+
+ swing = rtw8814a_get_bb_swing(rtwdev, rtwdev->hal.current_band_type,
+ RF_PATH_A);
+
+ for (i = 0; i < ARRAY_SIZE(rtw8814a_txscale_tbl); i++) {
+ table_value = rtw8814a_txscale_tbl[i];
+ if (swing == table_value)
+ return i;
+ }
+
+ return 24;
+}
+
+static void rtw8814a_pwrtrack_init(struct rtw_dev *rtwdev)
+{
+ struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+ u8 path;
+
+ dm_info->default_ofdm_index = rtw8814a_get_swing_index(rtwdev);
+
+ for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
+ ewma_thermal_init(&dm_info->avg_thermal[path]);
+ dm_info->delta_power_index[path] = 0;
+ dm_info->delta_power_index_last[path] = 0;
+ }
+ dm_info->pwr_trk_triggered = false;
+ dm_info->pwr_trk_init_trigger = true;
+ dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
+}
+
+static void rtw8814a_config_trx_path(struct rtw_dev *rtwdev)
+{
+ /* RX CCK disable 2R CCA */
+ rtw_write32_clr(rtwdev, REG_CCK0_FAREPORT,
+ BIT_CCK0_2RX | BIT_CCK0_MRC);
+ /* pathB tx on, path A/C/D tx off */
+ rtw_write32_mask(rtwdev, REG_CCK_RX, 0xf0000000, 0x4);
+ /* pathB rx */
+ rtw_write32_mask(rtwdev, REG_CCK_RX, 0x0f000000, 0x5);
+}
+
+static void rtw8814a_config_cck_rx_antenna_init(struct rtw_dev *rtwdev)
+{
+ /* CCK 2R CCA parameters */
+
+ /* Disable Ant diversity */
+ rtw_write32_mask(rtwdev, REG_RXSB, BIT_RXSB_ANA_DIV, 0x0);
+ /* Concurrent CCA at LSB & USB */
+ rtw_write32_mask(rtwdev, REG_CCA, BIT_CCA_CO, 0);
+ /* RX path diversity enable */
+ rtw_write32_mask(rtwdev, REG_ANTSEL, BIT_ANT_BYCO, 0);
+ /* r_en_mrc_antsel */
+ rtw_write32_mask(rtwdev, REG_PRECTRL, BIT_DIS_CO_PATHSEL, 0);
+ /* MBC weighting */
+ rtw_write32_mask(rtwdev, REG_CCA_MF, BIT_MBC_WIN, 1);
+ /* 2R CCA only */
+ rtw_write32_mask(rtwdev, REG_CCKTX, BIT_CMB_CCA_2R, 1);
+}
+
+static void rtw8814a_phy_set_param(struct rtw_dev *rtwdev)
+{
+ u32 crystal_cap, val32;
+ u8 val8, rf_path;
+
+ /* power on BB/RF domain */
+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB)
+ rtw_write8_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_USBA);
+ else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE)
+ rtw_write8_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_PCIEA);
+
+ rtw_write8_set(rtwdev, REG_SYS_CFG3_8814A + 2,
+ BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB);
+
+ /* Power on RF paths A..D */
+ val8 = BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB;
+ rtw_write8(rtwdev, REG_RF_CTRL, val8);
+ rtw_write8(rtwdev, REG_RF_CTRL1, val8);
+ rtw_write8(rtwdev, REG_RF_CTRL2, val8);
+ rtw_write8(rtwdev, REG_RF_CTRL3, val8);
+
+ rtw_load_table(rtwdev, rtwdev->chip->bb_tbl);
+ rtw_load_table(rtwdev, rtwdev->chip->agc_tbl);
+
+ crystal_cap = rtwdev->efuse.crystal_cap & 0x3F;
+ crystal_cap |= crystal_cap << 6;
+ rtw_write32_mask(rtwdev, REG_AFE_CTRL3, 0x07ff8000, crystal_cap);
+
+ rtw8814a_config_trx_path(rtwdev);
+
+ for (rf_path = 0; rf_path < rtwdev->hal.rf_path_num; rf_path++)
+ rtw_load_table(rtwdev, rtwdev->chip->rf_tbl[rf_path]);
+
+ val32 = rtw_read_rf(rtwdev, RF_PATH_A, RF_RCK1_V1, RFREG_MASK);
+ rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK1_V1, RFREG_MASK, val32);
+ rtw_write_rf(rtwdev, RF_PATH_C, RF_RCK1_V1, RFREG_MASK, val32);
+ rtw_write_rf(rtwdev, RF_PATH_D, RF_RCK1_V1, RFREG_MASK, val32);
+
+ rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
+
+ rtw_write8(rtwdev, REG_HWSEQ_CTRL, 0xFF);
+
+ rtw_write32(rtwdev, REG_BAR_MODE_CTRL, 0x0201ffff);
+
+ rtw_write8(rtwdev, REG_MISC_CTRL, BIT_DIS_SECOND_CCA);
+
+ rtw_write8(rtwdev, REG_NAV_CTRL + 2, 0);
+
+ rtw_write8_clr(rtwdev, REG_GPIO_MUXCFG, BIT(5));
+
+ rtw8814a_config_cck_rx_antenna_init(rtwdev);
+
+ rtw_phy_init(rtwdev);
+ rtw8814a_pwrtrack_init(rtwdev);
+
+ rtw8814a_init_rfe_reg(rtwdev);
+
+ rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT(3));
+
+ rtw_write8(rtwdev, REG_NAV_CTRL + 2, 235);
+
+ /* enable Tx report. */
+ rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, 0x1F);
+
+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) {
+ /* Reset USB mode switch setting */
+ rtw_write8(rtwdev, REG_SYS_SDIO_CTRL, 0x0);
+ rtw_write8(rtwdev, REG_ACLK_MON, 0x0);
+ }
+}
+
+static void rtw8814ae_enable_rf_1_2v(struct rtw_dev *rtwdev)
+{
+ /* This is for fullsize card, because GPIO7 there is floating.
+ * We should pull GPIO7 high to enable RF 1.2V Switch Power Supply
+ */
+
+ /* 1. set 0x40[1:0] to 0, BIT_GPIOSEL=0, select pin as GPIO */
+ rtw_write8_clr(rtwdev, REG_GPIO_MUXCFG, BIT(1) | BIT(0));
+
+ /* 2. set 0x44[31] to 0
+ * mode=0: data port;
+ * mode=1 and BIT_GPIO_IO_SEL=0: interrupt mode;
+ */
+ rtw_write8_clr(rtwdev, REG_GPIO_PIN_CTRL + 3, BIT(7));
+
+ /* 3. data mode
+ * 3.1 set 0x44[23] to 1
+ * sel=0: input;
+ * sel=1: output;
+ */
+ rtw_write8_set(rtwdev, REG_GPIO_PIN_CTRL + 2, BIT(7));
+
+ /* 3.2 set 0x44[15] to 1
+ * output high value;
+ */
+ rtw_write8_set(rtwdev, REG_GPIO_PIN_CTRL + 1, BIT(7));
+}
+
+static int rtw8814a_mac_init(struct rtw_dev *rtwdev)
+{
+ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
+
+ rtw_write16(rtwdev, REG_CR,
+ MAC_TRX_ENABLE | BIT_MAC_SEC_EN | BIT_32K_CAL_TMR_EN);
+
+ rtw_load_table(rtwdev, rtwdev->chip->mac_tbl);
+
+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB)
+ rtw_write8(rtwdev, REG_AUTO_LLT_V1 + 3,
+ rtwdev->chip->usb_tx_agg_desc_num << 1);
+
+ rtw_write32(rtwdev, REG_HIMR0, 0);
+ rtw_write32(rtwdev, REG_HIMR1, 0);
+
+ rtw_write32_mask(rtwdev, REG_RRSR, 0xfffff, 0xfffff);
+
+ rtw_write16(rtwdev, REG_RETRY_LIMIT, 0x3030);
+
+ rtw_write16(rtwdev, REG_RXFLTMAP0, 0xffff);
+ rtw_write16(rtwdev, REG_RXFLTMAP1, 0x0400);
+ rtw_write16(rtwdev, REG_RXFLTMAP2, 0xffff);
+
+ rtw_write8(rtwdev, REG_MAX_AGGR_NUM, 0x36);
+ rtw_write8(rtwdev, REG_MAX_AGGR_NUM + 1, 0x36);
+
+ /* Set Spec SIFS (used in NAV) */
+ rtw_write16(rtwdev, REG_SPEC_SIFS, 0x100a);
+ rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, 0x100a);
+
+ /* Set SIFS for CCK */
+ rtw_write16(rtwdev, REG_SIFS, 0x100a);
+
+ /* Set SIFS for OFDM */
+ rtw_write16(rtwdev, REG_SIFS + 2, 0x100a);
+
+ /* TXOP */
+ rtw_write32(rtwdev, REG_EDCA_BE_PARAM, 0x005EA42B);
+ rtw_write32(rtwdev, REG_EDCA_BK_PARAM, 0x0000A44F);
+ rtw_write32(rtwdev, REG_EDCA_VI_PARAM, 0x005EA324);
+ rtw_write32(rtwdev, REG_EDCA_VO_PARAM, 0x002FA226);
+
+ rtw_write8_set(rtwdev, REG_FWHW_TXQ_CTRL, BIT(7));
+
+ rtw_write8(rtwdev, REG_ACKTO, 0x80);
+
+ rtw_write16(rtwdev, REG_BCN_CTRL,
+ BIT_DIS_TSF_UDT | (BIT_DIS_TSF_UDT << 8));
+ rtw_write32_mask(rtwdev, REG_TBTT_PROHIBIT, 0xfffff, WLAN_TBTT_TIME);
+ rtw_write8(rtwdev, REG_DRVERLYINT, 0x05);
+ rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
+ rtw_write16(rtwdev, REG_BCNTCFG, 0x4413);
+ rtw_write8(rtwdev, REG_BCN_MAX_ERR, 0xFF);
+
+ rtw_write32(rtwdev, REG_FAST_EDCA_VOVI_SETTING, 0x08070807);
+ rtw_write32(rtwdev, REG_FAST_EDCA_BEBK_SETTING, 0x08070807);
+
+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB &&
+ rtwusb->udev->speed == USB_SPEED_SUPER) {
+ /* Disable U1/U2 Mode to avoid 2.5G spur in USB3.0. */
+ rtw_write8_clr(rtwdev, REG_USB_MOD, BIT(4) | BIT(3));
+ /* To avoid usb 3.0 H2C fail. */
+ rtw_write16(rtwdev, 0xf002, 0);
+
+ rtw_write8_clr(rtwdev, REG_SW_AMPDU_BURST_MODE_CTRL,
+ BIT_PRE_TX_CMD);
+ } else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE) {
+ rtw8814ae_enable_rf_1_2v(rtwdev);
+
+ /* Force the antenna b to wifi. */
+ rtw_write8_set(rtwdev, REG_PAD_CTRL1, BIT(2));
+ rtw_write8_set(rtwdev, REG_PAD_CTRL1 + 1, BIT(0));
+ rtw_write8_set(rtwdev, REG_LED_CFG + 3,
+ (BIT(27) | BIT_DPDT_WL_SEL) >> 24);
+ }
+
+ return 0;
+}
+
+static void rtw8814a_set_rfe_reg_24g(struct rtw_dev *rtwdev)
+{
+ switch (rtwdev->efuse.rfe_option) {
+ case 2:
+ rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x72707270);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x72707270);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x72707270);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x77707770);
+
+ rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D,
+ BIT_RFE_SELSW0_D, 0x72);
+
+ break;
+ case 1:
+ rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777777);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x77777777);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x77777777);
+
+ rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D,
+ BIT_RFE_SELSW0_D, 0x77);
+
+ break;
+ case 0:
+ default:
+ rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777777);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x77777777);
+ /* Is it not necessary to set REG_RFE_PINMUX_D ? */
+
+ rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D,
+ BIT_RFE_SELSW0_D, 0x77);
+
+ break;
+ }
+}
+
+static void rtw8814a_set_rfe_reg_5g(struct rtw_dev *rtwdev)
+{
+ switch (rtwdev->efuse.rfe_option) {
+ case 2:
+ rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x37173717);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x37173717);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x37173717);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x77177717);
+
+ rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D,
+ BIT_RFE_SELSW0_D, 0x37);
+
+ break;
+ case 1:
+ rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x33173317);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x33173317);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x33173317);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x77177717);
+
+ rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D,
+ BIT_RFE_SELSW0_D, 0x33);
+
+ break;
+ case 0:
+ default:
+ rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x54775477);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x54775477);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x54775477);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x54775477);
+
+ rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D,
+ BIT_RFE_SELSW0_D, 0x54);
+
+ break;
+ }
+}
+
+static void rtw8814a_set_channel_bb_swing(struct rtw_dev *rtwdev, u8 band)
+{
+ rtw_write32_mask(rtwdev, REG_TXSCALE_A, BB_SWING_MASK,
+ rtw8814a_get_bb_swing(rtwdev, band, RF_PATH_A));
+ rtw_write32_mask(rtwdev, REG_TXSCALE_B, BB_SWING_MASK,
+ rtw8814a_get_bb_swing(rtwdev, band, RF_PATH_B));
+ rtw_write32_mask(rtwdev, REG_TXSCALE_C, BB_SWING_MASK,
+ rtw8814a_get_bb_swing(rtwdev, band, RF_PATH_C));
+ rtw_write32_mask(rtwdev, REG_TXSCALE_D, BB_SWING_MASK,
+ rtw8814a_get_bb_swing(rtwdev, band, RF_PATH_D));
+ rtw8814a_pwrtrack_init(rtwdev);
+}
+
+static void rtw8814a_set_bw_reg_adc(struct rtw_dev *rtwdev, u8 bw)
+{
+ u32 adc = 0;
+
+ if (bw == RTW_CHANNEL_WIDTH_20)
+ adc = 0;
+ else if (bw == RTW_CHANNEL_WIDTH_40)
+ adc = 1;
+ else if (bw == RTW_CHANNEL_WIDTH_80)
+ adc = 2;
+
+ rtw_write32_mask(rtwdev, REG_ADCCLK, BIT(1) | BIT(0), adc);
+}
+
+static void rtw8814a_set_bw_reg_agc(struct rtw_dev *rtwdev, u8 new_band, u8 bw)
+{
+ u32 agc = 7;
+
+ if (bw == RTW_CHANNEL_WIDTH_20) {
+ agc = 6;
+ } else if (bw == RTW_CHANNEL_WIDTH_40) {
+ if (new_band == RTW_BAND_5G)
+ agc = 8;
+ else
+ agc = 7;
+ } else if (bw == RTW_CHANNEL_WIDTH_80) {
+ agc = 3;
+ }
+
+ rtw_write32_mask(rtwdev, REG_CCASEL, 0xf000, agc);
+}
+
+static void rtw8814a_switch_band(struct rtw_dev *rtwdev, u8 new_band, u8 bw)
+{
+ /* Clear 0x1000[16], When this bit is set to 0, CCK and OFDM
+ * are disabled, and clock are gated. Otherwise, CCK and OFDM
+ * are enabled.
+ */
+ rtw_write8_clr(rtwdev, REG_SYS_CFG3_8814A + 2, BIT_FEN_BB_RSTB);
+
+ if (new_band == RTW_BAND_2G) {
+ rtw_write32_mask(rtwdev, REG_AGC_TABLE, 0x1f, 0);
+
+ rtw8814a_set_rfe_reg_24g(rtwdev);
+
+ rtw_write32_mask(rtwdev, REG_TXPSEL, 0xf0, 0x2);
+ rtw_write32_mask(rtwdev, REG_CCK_RX, 0x0f000000, 0x5);
+
+ rtw_write32_mask(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST, 0x3);
+
+ rtw_write8(rtwdev, REG_CCK_CHECK, 0);
+
+ rtw_write32_mask(rtwdev, 0xa80, BIT(18), 0);
+ } else {
+ rtw_write8(rtwdev, REG_CCK_CHECK, BIT_CHECK_CCK_EN);
+
+ /* Enable CCK Tx function, even when CCK is off */
+ rtw_write32_mask(rtwdev, 0xa80, BIT(18), 1);
+
+ rtw8814a_set_rfe_reg_5g(rtwdev);
+
+ rtw_write32_mask(rtwdev, REG_TXPSEL, 0xf0, 0x0);
+ rtw_write32_mask(rtwdev, REG_CCK_RX, 0x0f000000, 0xf);
+
+ rtw_write32_mask(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST, 0x2);
+ }
+
+ rtw8814a_set_channel_bb_swing(rtwdev, new_band);
+
+ rtw8814a_set_bw_reg_adc(rtwdev, bw);
+ rtw8814a_set_bw_reg_agc(rtwdev, new_band, bw);
+
+ rtw_write8_set(rtwdev, REG_SYS_CFG3_8814A + 2, BIT_FEN_BB_RSTB);
+}
+
+static void rtw8814a_switch_channel(struct rtw_dev *rtwdev, u8 channel)
+{
+ struct rtw_hal *hal = &rtwdev->hal;
+ u32 fc_area, rf_mod_ag, cfgch;
+ u8 path;
+
+ switch (channel) {
+ case 36 ... 48:
+ fc_area = 0x494;
+ break;
+ case 50 ... 64:
+ fc_area = 0x453;
+ break;
+ case 100 ... 116:
+ fc_area = 0x452;
+ break;
+ default:
+ if (channel >= 118)
+ fc_area = 0x412;
+ else
+ fc_area = 0x96a;
+ break;
+ }
+
+ rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, fc_area);
+
+ for (path = 0; path < hal->rf_path_num; path++) {
+ switch (channel) {
+ case 36 ... 64:
+ rf_mod_ag = 0x101;
+ break;
+ case 100 ... 140:
+ rf_mod_ag = 0x301;
+ break;
+ default:
+ if (channel > 140)
+ rf_mod_ag = 0x501;
+ else
+ rf_mod_ag = 0x000;
+ break;
+ }
+
+ cfgch = (rf_mod_ag << 8) | channel;
+
+ rtw_write_rf(rtwdev, path, RF_CFGCH,
+ RF18_RFSI_MASK | RF18_BAND_MASK | RF18_CHANNEL_MASK, cfgch);
+ }
+
+ switch (channel) {
+ case 36 ... 64:
+ rtw_write32_mask(rtwdev, REG_AGC_TABLE, 0x1f, 1);
+ break;
+ case 100 ... 144:
+ rtw_write32_mask(rtwdev, REG_AGC_TABLE, 0x1f, 2);
+ break;
+ default:
+ if (channel >= 149)
+ rtw_write32_mask(rtwdev, REG_AGC_TABLE, 0x1f, 3);
+
+ break;
+ }
+}
+
+static void rtw8814a_24g_cck_tx_dfir(struct rtw_dev *rtwdev, u8 channel)
+{
+ if (channel >= 1 && channel <= 11) {
+ rtw_write32(rtwdev, REG_CCK0_TX_FILTER1, 0x1a1b0030);
+ rtw_write32(rtwdev, REG_CCK0_TX_FILTER2, 0x090e1317);
+ rtw_write32(rtwdev, REG_CCK0_DEBUG_PORT, 0x00000204);
+ } else if (channel >= 12 && channel <= 13) {
+ rtw_write32(rtwdev, REG_CCK0_TX_FILTER1, 0x1a1b0030);
+ rtw_write32(rtwdev, REG_CCK0_TX_FILTER2, 0x090e1217);
+ rtw_write32(rtwdev, REG_CCK0_DEBUG_PORT, 0x00000305);
+ } else if (channel == 14) {
+ rtw_write32(rtwdev, REG_CCK0_TX_FILTER1, 0x1a1b0030);
+ rtw_write32(rtwdev, REG_CCK0_TX_FILTER2, 0x00000E17);
+ rtw_write32(rtwdev, REG_CCK0_DEBUG_PORT, 0x00000000);
+ }
+}
+
+static void rtw8814a_set_bw_reg_mac(struct rtw_dev *rtwdev, u8 bw)
+{
+ u16 val16 = rtw_read16(rtwdev, REG_WMAC_TRXPTCL_CTL);
+
+ val16 &= ~BIT_RFMOD;
+ if (bw == RTW_CHANNEL_WIDTH_80)
+ val16 |= BIT_RFMOD_80M;
+ else if (bw == RTW_CHANNEL_WIDTH_40)
+ val16 |= BIT_RFMOD_40M;
+
+ rtw_write16(rtwdev, REG_WMAC_TRXPTCL_CTL, val16);
+}
+
+static void rtw8814a_set_bw_rf(struct rtw_dev *rtwdev, u8 bw)
+{
+ u8 path;
+
+ for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
+ switch (bw) {
+ case RTW_CHANNEL_WIDTH_5:
+ case RTW_CHANNEL_WIDTH_10:
+ case RTW_CHANNEL_WIDTH_20:
+ default:
+ rtw_write_rf(rtwdev, path, RF_CFGCH, RF18_BW_MASK, 3);
+ break;
+ case RTW_CHANNEL_WIDTH_40:
+ rtw_write_rf(rtwdev, path, RF_CFGCH, RF18_BW_MASK, 1);
+ break;
+ case RTW_CHANNEL_WIDTH_80:
+ rtw_write_rf(rtwdev, path, RF_CFGCH, RF18_BW_MASK, 0);
+ break;
+ }
+ }
+}
+
+static void rtw8814a_adc_clk(struct rtw_dev *rtwdev)
+{
+ static const u32 rxiqc_reg[2][4] = {
+ { REG_RX_IQC_AB_A, REG_RX_IQC_AB_B,
+ REG_RX_IQC_AB_C, REG_RX_IQC_AB_D },
+ { REG_RX_IQC_CD_A, REG_RX_IQC_CD_B,
+ REG_RX_IQC_CD_C, REG_RX_IQC_CD_D }
+ };
+ u32 bb_reg_8fc, bb_reg_808, rxiqc[4];
+ u32 i = 0, mac_active = 1;
+ u8 mac_reg_522;
+
+ if (rtwdev->hal.cut_version != RTW_CHIP_VER_CUT_A)
+ return;
+
+ /* 1 Step1. MAC TX pause */
+ mac_reg_522 = rtw_read8(rtwdev, REG_TXPAUSE);
+ bb_reg_8fc = rtw_read32(rtwdev, REG_DBGSEL);
+ bb_reg_808 = rtw_read32(rtwdev, REG_RXPSEL);
+ rtw_write8(rtwdev, REG_TXPAUSE, 0x3f);
+
+ /* 1 Step 2. Backup rxiqc & rxiqc = 0 */
+ for (i = 0; i < 4; i++) {
+ rxiqc[i] = rtw_read32(rtwdev, rxiqc_reg[0][i]);
+ rtw_write32(rtwdev, rxiqc_reg[0][i], 0x0);
+ rtw_write32(rtwdev, rxiqc_reg[1][i], 0x0);
+ }
+ rtw_write32_mask(rtwdev, REG_PRECTRL, BIT_IQ_WGT, 0x3);
+ i = 0;
+
+ /* 1 Step 3. Monitor MAC IDLE */
+ rtw_write32(rtwdev, REG_DBGSEL, 0x0);
+ while (mac_active) {
+ mac_active = rtw_read32(rtwdev, REG_DBGRPT) & 0x803e0008;
+ i++;
+ if (i > 1000)
+ break;
+ }
+
+ /* 1 Step 4. ADC clk flow */
+ rtw_write8(rtwdev, REG_RXPSEL, 0x11);
+ rtw_write32_mask(rtwdev, REG_DAC_RSTB, BIT(13), 0x1);
+ rtw_write8_mask(rtwdev, REG_GNT_BT, BIT(2) | BIT(1), 0x3);
+ rtw_write32_mask(rtwdev, REG_CCK_RPT_FORMAT, BIT(2), 0x1);
+
+ /* 0xc1c/0xe1c/0x181c/0x1a1c[4] must=1 to ensure table can be
+ * written when bbrstb=0
+ * 0xc60/0xe60/0x1860/0x1a60[15] always = 1 after this line
+ * 0xc60/0xe60/0x1860/0x1a60[14] always = 0 bcz its error in A-cut
+ */
+
+ /* power_off/clk_off @ anapar_state=idle mode */
+ rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x15800002);
+ rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x01808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x15800002);
+ rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x01808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x15800002);
+ rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x01808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x15800002);
+ rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x01808003);
+
+ rtw_write8_mask(rtwdev, REG_GNT_BT, BIT(2), 0x0);
+ rtw_write32_mask(rtwdev, REG_CCK_RPT_FORMAT, BIT(2), 0x0);
+ /* [19] = 1 to turn off ADC */
+ rtw_write32(rtwdev, REG_CK_MONHA, 0x0D080058);
+ rtw_write32(rtwdev, REG_CK_MONHB, 0x0D080058);
+ rtw_write32(rtwdev, REG_CK_MONHC, 0x0D080058);
+ rtw_write32(rtwdev, REG_CK_MONHD, 0x0D080058);
+
+ /* power_on/clk_off */
+ /* [19] = 0 to turn on ADC */
+ rtw_write32(rtwdev, REG_CK_MONHA, 0x0D000058);
+ rtw_write32(rtwdev, REG_CK_MONHB, 0x0D000058);
+ rtw_write32(rtwdev, REG_CK_MONHC, 0x0D000058);
+ rtw_write32(rtwdev, REG_CK_MONHD, 0x0D000058);
+
+ /* power_on/clk_on @ anapar_state=BT mode */
+ rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x05808032);
+ rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x05808032);
+ rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x05808032);
+ rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x05808032);
+ rtw_write8_mask(rtwdev, REG_GNT_BT, BIT(2), 0x1);
+ rtw_write32_mask(rtwdev, REG_CCK_RPT_FORMAT, BIT(2), 0x1);
+
+ /* recover original setting @ anapar_state=BT mode */
+ rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x05808032);
+ rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x05808032);
+ rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x05808032);
+ rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x05808032);
+
+ rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x05800002);
+ rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x07808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x05800002);
+ rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x07808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x05800002);
+ rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x07808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x05800002);
+ rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x07808003);
+
+ rtw_write8_mask(rtwdev, REG_GNT_BT, BIT(2) | BIT(1), 0x0);
+ rtw_write32_mask(rtwdev, REG_CCK_RPT_FORMAT, BIT(2), 0x0);
+ rtw_write32_mask(rtwdev, REG_DAC_RSTB, BIT(13), 0x0);
+
+ /* 1 Step 5. Recover MAC TX & IQC */
+ rtw_write8(rtwdev, REG_TXPAUSE, mac_reg_522);
+ rtw_write32(rtwdev, REG_DBGSEL, bb_reg_8fc);
+ rtw_write32(rtwdev, REG_RXPSEL, bb_reg_808);
+ for (i = 0; i < 4; i++) {
+ rtw_write32(rtwdev, rxiqc_reg[0][i], rxiqc[i]);
+ rtw_write32(rtwdev, rxiqc_reg[1][i], 0x01000000);
+ }
+ rtw_write32_mask(rtwdev, REG_PRECTRL, BIT_IQ_WGT, 0x0);
+}
+
+static void rtw8814a_spur_calibration_ch140(struct rtw_dev *rtwdev, u8 channel)
+{
+ struct rtw_hal *hal = &rtwdev->hal;
+
+ /* Add for 8814AE module ch140 MP Rx */
+ if (channel == 140) {
+ if (hal->ch_param[0] == 0)
+ hal->ch_param[0] = rtw_read32(rtwdev, REG_CCASEL);
+ if (hal->ch_param[1] == 0)
+ hal->ch_param[1] = rtw_read32(rtwdev, REG_PDMFTH);
+
+ rtw_write32(rtwdev, REG_CCASEL, 0x75438170);
+ rtw_write32(rtwdev, REG_PDMFTH, 0x79a18a0a);
+ } else {
+ if (rtw_read32(rtwdev, REG_CCASEL) == 0x75438170 &&
+ hal->ch_param[0] != 0)
+ rtw_write32(rtwdev, REG_CCASEL, hal->ch_param[0]);
+
+ if (rtw_read32(rtwdev, REG_PDMFTH) == 0x79a18a0a &&
+ hal->ch_param[1] != 0)
+ rtw_write32(rtwdev, REG_PDMFTH, hal->ch_param[1]);
+
+ hal->ch_param[0] = rtw_read32(rtwdev, REG_CCASEL);
+ hal->ch_param[1] = rtw_read32(rtwdev, REG_PDMFTH);
+ }
+}
+
+static void rtw8814a_set_nbi_reg(struct rtw_dev *rtwdev, u32 tone_idx)
+{
+ /* tone_idx X 10 */
+ static const u32 nbi_128[] = {
+ 25, 55, 85, 115, 135,
+ 155, 185, 205, 225, 245,
+ 265, 285, 305, 335, 355,
+ 375, 395, 415, 435, 455,
+ 485, 505, 525, 555, 585, 615, 635
+ };
+ u32 reg_idx = 0;
+ u32 i;
+
+ for (i = 0; i < ARRAY_SIZE(nbi_128); i++) {
+ if (tone_idx < nbi_128[i]) {
+ reg_idx = i + 1;
+ break;
+ }
+ }
+
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING, 0xfc000, reg_idx);
+}
+
+static void rtw8814a_nbi_setting(struct rtw_dev *rtwdev, u32 ch, u32 f_intf)
+{
+ u32 fc, int_distance, tone_idx;
+
+ fc = 2412 + (ch - 1) * 5;
+ int_distance = abs_diff(fc, f_intf);
+
+ /* 10 * (int_distance / 0.3125) */
+ tone_idx = int_distance << 5;
+
+ rtw8814a_set_nbi_reg(rtwdev, tone_idx);
+
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING, BIT_NBI_ENABLE, 1);
+}
+
+static void rtw8814a_spur_nbi_setting(struct rtw_dev *rtwdev)
+{
+ u8 primary_channel = rtwdev->hal.primary_channel;
+ u8 rfe_type = rtwdev->efuse.rfe_option;
+
+ if (rfe_type != 0 && rfe_type != 1 && rfe_type != 6 && rfe_type != 7)
+ return;
+
+ if (primary_channel == 14)
+ rtw8814a_nbi_setting(rtwdev, primary_channel, 2480);
+ else if (primary_channel >= 4 && primary_channel <= 8)
+ rtw8814a_nbi_setting(rtwdev, primary_channel, 2440);
+ else
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING, BIT_NBI_ENABLE, 0);
+}
+
+/* A workaround to eliminate the 5280 MHz & 5600 MHz & 5760 MHz spur of 8814A */
+static void rtw8814a_spur_calibration(struct rtw_dev *rtwdev, u8 channel, u8 bw)
+{
+ u8 rfe_type = rtwdev->efuse.rfe_option;
+ bool reset_nbi_csi = true;
+
+ if (rfe_type == 0) {
+ switch (bw) {
+ case RTW_CHANNEL_WIDTH_40:
+ if (channel == 54 || channel == 118) {
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING,
+ 0x000fe000, 0x3e >> 1);
+ rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1,
+ BIT(0), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0);
+ rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK1,
+ BIT(0), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0);
+
+ reset_nbi_csi = false;
+ } else if (channel == 151) {
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING,
+ 0x000fe000, 0x1e >> 1);
+ rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1,
+ BIT(0), 1);
+ rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK0,
+ BIT(16), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0);
+
+ reset_nbi_csi = false;
+ }
+ break;
+ case RTW_CHANNEL_WIDTH_80:
+ if (channel == 58 || channel == 122) {
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING,
+ 0x000fe000, 0x3a >> 1);
+ rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1,
+ BIT(0), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0);
+ rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK7,
+ BIT(0), 1);
+
+ reset_nbi_csi = false;
+ } else if (channel == 155) {
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING,
+ 0x000fe000, 0x5a >> 1);
+ rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1,
+ BIT(0), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0);
+ rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK6,
+ BIT(16), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0);
+
+ reset_nbi_csi = false;
+ }
+ break;
+ case RTW_CHANNEL_WIDTH_20:
+ if (channel == 153) {
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING,
+ 0x000fe000, 0x1e >> 1);
+ rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1,
+ BIT(0), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0);
+ rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK7,
+ BIT(16), 1);
+
+ reset_nbi_csi = false;
+ }
+
+ rtw8814a_spur_calibration_ch140(rtwdev, channel);
+ break;
+ default:
+ break;
+ }
+ } else if (rfe_type == 1 || rfe_type == 2) {
+ switch (bw) {
+ case RTW_CHANNEL_WIDTH_20:
+ if (channel == 153) {
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING,
+ 0x000fe000, 0x1E >> 1);
+ rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1,
+ BIT(0), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0);
+ rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK7,
+ BIT(16), 1);
+
+ reset_nbi_csi = false;
+ }
+ break;
+ case RTW_CHANNEL_WIDTH_40:
+ if (channel == 151) {
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING,
+ 0x000fe000, 0x1e >> 1);
+ rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1,
+ BIT(0), 1);
+ rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK0,
+ BIT(16), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0);
+
+ reset_nbi_csi = false;
+ }
+ break;
+ case RTW_CHANNEL_WIDTH_80:
+ if (channel == 155) {
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING,
+ 0x000fe000, 0x5a >> 1);
+ rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1,
+ BIT(0), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0);
+ rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK6,
+ BIT(16), 1);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0);
+
+ reset_nbi_csi = false;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (reset_nbi_csi) {
+ rtw_write32_mask(rtwdev, REG_NBI_SETTING,
+ 0x000fe000, 0xfc >> 1);
+ rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1, BIT(0), 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0);
+ rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0);
+ }
+
+ rtw8814a_spur_nbi_setting(rtwdev);
+}
+
+static void rtw8814a_set_bw_mode(struct rtw_dev *rtwdev, u8 new_band,
+ u8 channel, u8 bw, u8 primary_chan_idx)
+{
+ u8 txsc40 = 0, txsc20, txsc;
+
+ rtw8814a_set_bw_reg_mac(rtwdev, bw);
+
+ txsc20 = primary_chan_idx;
+ if (bw == RTW_CHANNEL_WIDTH_80) {
+ if (txsc20 == RTW_SC_20_UPPER || txsc20 == RTW_SC_20_UPMOST)
+ txsc40 = RTW_SC_40_UPPER;
+ else
+ txsc40 = RTW_SC_40_LOWER;
+ }
+
+ txsc = BIT_TXSC_20M(txsc20) | BIT_TXSC_40M(txsc40);
+ rtw_write8(rtwdev, REG_DATA_SC, txsc);
+
+ rtw8814a_set_bw_reg_adc(rtwdev, bw);
+ rtw8814a_set_bw_reg_agc(rtwdev, new_band, bw);
+
+ if (bw == RTW_CHANNEL_WIDTH_80) {
+ rtw_write32_mask(rtwdev, REG_ADCCLK, 0x3c, txsc);
+ } else if (bw == RTW_CHANNEL_WIDTH_40) {
+ rtw_write32_mask(rtwdev, REG_ADCCLK, 0x3c, txsc);
+
+ if (txsc == RTW_SC_20_UPPER)
+ rtw_write32_set(rtwdev, REG_RXSB, BIT(4));
+ else
+ rtw_write32_clr(rtwdev, REG_RXSB, BIT(4));
+ }
+
+ rtw8814a_set_bw_rf(rtwdev, bw);
+
+ rtw8814a_adc_clk(rtwdev);
+
+ rtw8814a_spur_calibration(rtwdev, channel, bw);
+}
+
+static void rtw8814a_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
+ u8 primary_chan_idx)
+{
+ u8 old_band, new_band;
+
+ if (rtw_read8(rtwdev, REG_CCK_CHECK) & BIT_CHECK_CCK_EN)
+ old_band = RTW_BAND_5G;
+ else
+ old_band = RTW_BAND_2G;
+
+ if (channel > 14)
+ new_band = RTW_BAND_5G;
+ else
+ new_band = RTW_BAND_2G;
+
+ if (new_band != old_band)
+ rtw8814a_switch_band(rtwdev, new_band, bw);
+
+ rtw8814a_switch_channel(rtwdev, channel);
+
+ rtw8814a_24g_cck_tx_dfir(rtwdev, channel);
+
+ rtw8814a_set_bw_mode(rtwdev, new_band, channel, bw, primary_chan_idx);
+}
+
+static s8 rtw8814a_cck_rx_pwr(u8 lna_idx, u8 vga_idx)
+{
+ s8 rx_pwr_all = 0;
+
+ switch (lna_idx) {
+ case 7:
+ rx_pwr_all = -38 - 2 * vga_idx;
+ break;
+ case 5:
+ rx_pwr_all = -28 - 2 * vga_idx;
+ break;
+ case 3:
+ rx_pwr_all = -8 - 2 * vga_idx;
+ break;
+ case 2:
+ rx_pwr_all = -1 - 2 * vga_idx;
+ break;
+ default:
+ break;
+ }
+
+ return rx_pwr_all;
+}
+
+static void rtw8814a_query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
+ struct rtw_rx_pkt_stat *pkt_stat)
+{
+ struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+ struct rtw_jaguar_phy_status_rpt *rpt;
+ u8 gain[RTW_RF_PATH_MAX], rssi, i;
+ s8 rx_pwr_db, middle1, middle2;
+ s8 snr[RTW_RF_PATH_MAX];
+ s8 evm[RTW_RF_PATH_MAX];
+ u8 rfmode, subchannel;
+ u8 lna, vga;
+ s8 cfo[2];
+
+ rpt = (struct rtw_jaguar_phy_status_rpt *)phy_status;
+
+ pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
+
+ if (pkt_stat->rate <= DESC_RATE11M) {
+ lna = le32_get_bits(rpt->w1, RTW_JGRPHY_W1_AGC_RPT_LNA_IDX);
+ vga = le32_get_bits(rpt->w1, RTW_JGRPHY_W1_AGC_RPT_VGA_IDX);
+
+ rx_pwr_db = rtw8814a_cck_rx_pwr(lna, vga);
+
+ pkt_stat->rx_power[RF_PATH_A] = rx_pwr_db;
+ pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
+ dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
+ pkt_stat->signal_power = rx_pwr_db;
+ } else { /* OFDM rate */
+ gain[RF_PATH_A] = le32_get_bits(rpt->w0, RTW_JGRPHY_W0_GAIN_A);
+ gain[RF_PATH_B] = le32_get_bits(rpt->w0, RTW_JGRPHY_W0_GAIN_B);
+ gain[RF_PATH_C] = le32_get_bits(rpt->w5, RTW_JGRPHY_W5_GAIN_C);
+ gain[RF_PATH_D] = le32_get_bits(rpt->w6, RTW_JGRPHY_W6_GAIN_D);
+
+ snr[RF_PATH_A] = le32_get_bits(rpt->w3, RTW_JGRPHY_W3_RXSNR_A);
+ snr[RF_PATH_B] = le32_get_bits(rpt->w4, RTW_JGRPHY_W4_RXSNR_B);
+ snr[RF_PATH_C] = le32_get_bits(rpt->w5, RTW_JGRPHY_W5_RXSNR_C);
+ snr[RF_PATH_D] = le32_get_bits(rpt->w5, RTW_JGRPHY_W5_RXSNR_D);
+
+ evm[RF_PATH_A] = le32_get_bits(rpt->w3, RTW_JGRPHY_W3_RXEVM_1);
+ evm[RF_PATH_B] = le32_get_bits(rpt->w3, RTW_JGRPHY_W3_RXEVM_2);
+ evm[RF_PATH_C] = le32_get_bits(rpt->w4, RTW_JGRPHY_W4_RXEVM_3);
+ evm[RF_PATH_D] = le32_get_bits(rpt->w5, RTW_JGRPHY_W5_RXEVM_4);
+
+ if (pkt_stat->rate <= DESC_RATE54M)
+ evm[RF_PATH_A] = le32_get_bits(rpt->w6,
+ RTW_JGRPHY_W6_SIGEVM);
+
+ for (i = RF_PATH_A; i < RTW_RF_PATH_MAX; i++) {
+ pkt_stat->rx_power[i] = gain[i] - 110;
+
+ rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[i], 1);
+ dm_info->rssi[i] = rssi;
+
+ pkt_stat->rx_snr[i] = snr[i];
+ dm_info->rx_snr[i] = snr[i] >> 1;
+
+ pkt_stat->rx_evm[i] = evm[i];
+ evm[i] = max_t(s8, -127, evm[i]);
+ dm_info->rx_evm_dbm[i] = abs(evm[i]) >> 1;
+ }
+
+ rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power,
+ RTW_RF_PATH_MAX);
+ pkt_stat->rssi = rssi;
+
+ /* When power saving is enabled the hardware sometimes
+ * reports unbelievably high gain for paths A and C
+ * (e.g. one frame 64 68 68 72, the next frame 106 66 88 72,
+ * the next 66 66 68 72), so use the second lowest gain
+ * instead of the highest.
+ */
+ middle1 = max(min(gain[RF_PATH_A], gain[RF_PATH_B]),
+ min(gain[RF_PATH_C], gain[RF_PATH_D]));
+ middle2 = min(max(gain[RF_PATH_A], gain[RF_PATH_B]),
+ max(gain[RF_PATH_C], gain[RF_PATH_D]));
+ rx_pwr_db = min(middle1, middle2);
+ rx_pwr_db -= 110;
+ pkt_stat->signal_power = rx_pwr_db;
+
+ rfmode = le32_get_bits(rpt->w0, RTW_JGRPHY_W0_R_RFMOD);
+ subchannel = le32_get_bits(rpt->w0, RTW_JGRPHY_W0_SUB_CHNL);
+
+ if (rfmode == 1 && subchannel == 0) {
+ pkt_stat->bw = RTW_CHANNEL_WIDTH_40;
+ } else if (rfmode == 2) {
+ if (subchannel == 0)
+ pkt_stat->bw = RTW_CHANNEL_WIDTH_80;
+ else if (subchannel == 9 || subchannel == 10)
+ pkt_stat->bw = RTW_CHANNEL_WIDTH_40;
+ }
+
+ cfo[RF_PATH_A] = le32_get_bits(rpt->w2, RTW_JGRPHY_W2_CFO_TAIL_A);
+ cfo[RF_PATH_B] = le32_get_bits(rpt->w2, RTW_JGRPHY_W2_CFO_TAIL_B);
+
+ for (i = RF_PATH_A; i < 2; i++) {
+ pkt_stat->cfo_tail[i] = cfo[i];
+ dm_info->cfo_tail[i] = (cfo[i] * 5) >> 1;
+ }
+ }
+}
+
+static void
+rtw8814a_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
+{
+ struct rtw_hal *hal = &rtwdev->hal;
+ u32 txagc_table_wd;
+ u8 rate, pwr_index;
+ int j;
+
+ for (j = 0; j < rtw_rate_size[rs]; j++) {
+ rate = rtw_rate_section[rs][j];
+
+ pwr_index = hal->tx_pwr_tbl[path][rate] + 2;
+ if (pwr_index > rtwdev->chip->max_power_index)
+ pwr_index = rtwdev->chip->max_power_index;
+
+ txagc_table_wd = 0x00801000;
+ txagc_table_wd |= (pwr_index << 24) | (path << 8) | rate;
+
+ rtw_write32(rtwdev, REG_AGC_TBL, txagc_table_wd);
+
+ /* first time to turn on the txagc table
+ * second to write the addr0
+ */
+ if (rate == DESC_RATE1M)
+ rtw_write32(rtwdev, REG_AGC_TBL, txagc_table_wd);
+ }
+}
+
+static void rtw8814a_set_tx_power_index(struct rtw_dev *rtwdev)
+{
+ struct rtw_hal *hal = &rtwdev->hal;
+ int path;
+
+ for (path = 0; path < hal->rf_path_num; path++) {
+ if (hal->current_band_type == RTW_BAND_2G)
+ rtw8814a_set_tx_power_index_by_rate(rtwdev, path,
+ RTW_RATE_SECTION_CCK);
+
+ rtw8814a_set_tx_power_index_by_rate(rtwdev, path,
+ RTW_RATE_SECTION_OFDM);
+
+ if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
+ continue;
+
+ rtw8814a_set_tx_power_index_by_rate(rtwdev, path,
+ RTW_RATE_SECTION_HT_1S);
+ rtw8814a_set_tx_power_index_by_rate(rtwdev, path,
+ RTW_RATE_SECTION_VHT_1S);
+
+ rtw8814a_set_tx_power_index_by_rate(rtwdev, path,
+ RTW_RATE_SECTION_HT_2S);
+ rtw8814a_set_tx_power_index_by_rate(rtwdev, path,
+ RTW_RATE_SECTION_VHT_2S);
+
+ rtw8814a_set_tx_power_index_by_rate(rtwdev, path,
+ RTW_RATE_SECTION_HT_3S);
+ rtw8814a_set_tx_power_index_by_rate(rtwdev, path,
+ RTW_RATE_SECTION_VHT_3S);
+ }
+}
+
+static void rtw8814a_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
+{
+}
+
+static void rtw8814a_false_alarm_statistics(struct rtw_dev *rtwdev)
+{
+ struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+ u32 cck_fa_cnt, ofdm_fa_cnt;
+ u32 crc32_cnt, cca32_cnt;
+ u32 cck_enable;
+
+ cck_enable = rtw_read32(rtwdev, REG_RXPSEL) & BIT(28);
+ cck_fa_cnt = rtw_read16(rtwdev, REG_FA_CCK);
+ ofdm_fa_cnt = rtw_read16(rtwdev, REG_FA_OFDM);
+
+ dm_info->cck_fa_cnt = cck_fa_cnt;
+ dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
+ dm_info->total_fa_cnt = ofdm_fa_cnt;
+ if (cck_enable)
+ dm_info->total_fa_cnt += cck_fa_cnt;
+
+ crc32_cnt = rtw_read32(rtwdev, REG_CRC_CCK);
+ dm_info->cck_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD);
+ dm_info->cck_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD);
+
+ crc32_cnt = rtw_read32(rtwdev, REG_CRC_OFDM);
+ dm_info->ofdm_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD);
+ dm_info->ofdm_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD);
+
+ crc32_cnt = rtw_read32(rtwdev, REG_CRC_HT);
+ dm_info->ht_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD);
+ dm_info->ht_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD);
+
+ crc32_cnt = rtw_read32(rtwdev, REG_CRC_VHT);
+ dm_info->vht_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD);
+ dm_info->vht_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD);
+
+ cca32_cnt = rtw_read32(rtwdev, REG_CCA_OFDM);
+ dm_info->ofdm_cca_cnt = u32_get_bits(cca32_cnt, MASKHWORD);
+ dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt;
+ if (cck_enable) {
+ cca32_cnt = rtw_read32(rtwdev, REG_CCA_CCK);
+ dm_info->cck_cca_cnt = u32_get_bits(cca32_cnt, MASKLWORD);
+ dm_info->total_cca_cnt += dm_info->cck_cca_cnt;
+ }
+
+ rtw_write32_set(rtwdev, REG_FAS, BIT(17));
+ rtw_write32_clr(rtwdev, REG_FAS, BIT(17));
+ rtw_write32_clr(rtwdev, REG_CCK0_FAREPORT, BIT(15));
+ rtw_write32_set(rtwdev, REG_CCK0_FAREPORT, BIT(15));
+ rtw_write32_set(rtwdev, REG_CNTRST, BIT(0));
+ rtw_write32_clr(rtwdev, REG_CNTRST, BIT(0));
+}
+
+#define MAC_REG_NUM_8814 2
+#define BB_REG_NUM_8814 14
+#define RF_REG_NUM_8814 1
+
+static void rtw8814a_iqk_backup_mac_bb(struct rtw_dev *rtwdev,
+ u32 *mac_backup, u32 *bb_backup,
+ const u32 *mac_regs,
+ const u32 *bb_regs)
+{
+ u32 i;
+
+ /* save MACBB default value */
+ for (i = 0; i < MAC_REG_NUM_8814; i++)
+ mac_backup[i] = rtw_read32(rtwdev, mac_regs[i]);
+
+ for (i = 0; i < BB_REG_NUM_8814; i++)
+ bb_backup[i] = rtw_read32(rtwdev, bb_regs[i]);
+}
+
+static void rtw8814a_iqk_backup_rf(struct rtw_dev *rtwdev,
+ u32 rf_backup[][4], const u32 *rf_regs)
+{
+ u32 i;
+
+ /* Save RF Parameters */
+ for (i = 0; i < RF_REG_NUM_8814; i++) {
+ rf_backup[i][RF_PATH_A] = rtw_read_rf(rtwdev, RF_PATH_A,
+ rf_regs[i], RFREG_MASK);
+ rf_backup[i][RF_PATH_B] = rtw_read_rf(rtwdev, RF_PATH_B,
+ rf_regs[i], RFREG_MASK);
+ rf_backup[i][RF_PATH_C] = rtw_read_rf(rtwdev, RF_PATH_C,
+ rf_regs[i], RFREG_MASK);
+ rf_backup[i][RF_PATH_D] = rtw_read_rf(rtwdev, RF_PATH_D,
+ rf_regs[i], RFREG_MASK);
+ }
+}
+
+static void rtw8814a_iqk_afe_setting(struct rtw_dev *rtwdev, bool do_iqk)
+{
+ if (do_iqk) {
+ /* IQK AFE setting RX_WAIT_CCA mode */
+ rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x0e808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x0e808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x0e808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x0e808003);
+ } else {
+ rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x07808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x07808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x07808003);
+ rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x07808003);
+ }
+
+ rtw_write32_mask(rtwdev, REG_DAC_RSTB, BIT(13), 0x1);
+
+ rtw_write8_set(rtwdev, REG_GNT_BT, BIT(2) | BIT(1));
+ rtw_write8_clr(rtwdev, REG_GNT_BT, BIT(2) | BIT(1));
+
+ rtw_write32_set(rtwdev, REG_CCK_RPT_FORMAT, BIT(2));
+ rtw_write32_clr(rtwdev, REG_CCK_RPT_FORMAT, BIT(2));
+}
+
+static void rtw8814a_iqk_restore_mac_bb(struct rtw_dev *rtwdev,
+ u32 *mac_backup, u32 *bb_backup,
+ const u32 *mac_regs,
+ const u32 *bb_regs)
+{
+ u32 i;
+
+ /* Reload MacBB Parameters */
+ for (i = 0; i < MAC_REG_NUM_8814; i++)
+ rtw_write32(rtwdev, mac_regs[i], mac_backup[i]);
+
+ for (i = 0; i < BB_REG_NUM_8814; i++)
+ rtw_write32(rtwdev, bb_regs[i], bb_backup[i]);
+}
+
+static void rtw8814a_iqk_restore_rf(struct rtw_dev *rtwdev,
+ const u32 rf_backup[][4],
+ const u32 *rf_regs)
+{
+ u32 i;
+
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x0);
+ rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE, RFREG_MASK, 0x0);
+ rtw_write_rf(rtwdev, RF_PATH_C, RF_LUTWE, RFREG_MASK, 0x0);
+ rtw_write_rf(rtwdev, RF_PATH_D, RF_LUTWE, RFREG_MASK, 0x0);
+
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x88001);
+ rtw_write_rf(rtwdev, RF_PATH_B, RF_RXBB2, RFREG_MASK, 0x88001);
+ rtw_write_rf(rtwdev, RF_PATH_C, RF_RXBB2, RFREG_MASK, 0x88001);
+ rtw_write_rf(rtwdev, RF_PATH_D, RF_RXBB2, RFREG_MASK, 0x88001);
+
+ for (i = 0; i < RF_REG_NUM_8814; i++) {
+ rtw_write_rf(rtwdev, RF_PATH_A, rf_regs[i],
+ RFREG_MASK, rf_backup[i][RF_PATH_A]);
+ rtw_write_rf(rtwdev, RF_PATH_B, rf_regs[i],
+ RFREG_MASK, rf_backup[i][RF_PATH_B]);
+ rtw_write_rf(rtwdev, RF_PATH_C, rf_regs[i],
+ RFREG_MASK, rf_backup[i][RF_PATH_C]);
+ rtw_write_rf(rtwdev, RF_PATH_D, rf_regs[i],
+ RFREG_MASK, rf_backup[i][RF_PATH_D]);
+ }
+}
+
+static void rtw8814a_iqk_reset_nctl(struct rtw_dev *rtwdev)
+{
+ rtw_write32(rtwdev, 0x1b00, 0xf8000000);
+ rtw_write32(rtwdev, 0x1b80, 0x00000006);
+
+ rtw_write32(rtwdev, 0x1b00, 0xf8000000);
+ rtw_write32(rtwdev, 0x1b80, 0x00000002);
+}
+
+static void rtw8814a_iqk_configure_mac(struct rtw_dev *rtwdev)
+{
+ rtw_write8(rtwdev, REG_TXPAUSE, 0x3f);
+ rtw_write32_clr(rtwdev, REG_BCN_CTRL,
+ (BIT_EN_BCN_FUNCTION << 8) | BIT_EN_BCN_FUNCTION);
+
+ /* RX ante off */
+ rtw_write8(rtwdev, REG_RXPSEL, 0x00);
+ /* CCA off */
+ rtw_write32_mask(rtwdev, REG_CCA2ND, 0xf, 0xe);
+ /* CCK RX path off */
+ rtw_write32_set(rtwdev, REG_PRECTRL, BIT_IQ_WGT);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777777);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x77777777);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x77777777);
+ rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D, BIT_RFE_SELSW0_D, 0x77);
+ rtw_write32_mask(rtwdev, REG_PSD, BIT_PSD_INI, 0x0);
+
+ rtw_write32_mask(rtwdev, REG_RFE_INV0, 0xf, 0x0);
+}
+
+static void rtw8814a_lok_one_shot(struct rtw_dev *rtwdev, u8 path)
+{
+ u32 lok_temp1, lok_temp2;
+ bool lok_ready;
+ u8 ii;
+
+ /* ADC Clock source */
+ rtw_write32_mask(rtwdev, REG_FAS, BIT(21) | BIT(20), path);
+ /* LOK: CMD ID = 0
+ * {0xf8000011, 0xf8000021, 0xf8000041, 0xf8000081}
+ */
+ rtw_write32(rtwdev, 0x1b00, 0xf8000001 | (BIT(path) << 4));
+
+ usleep_range(1000, 1100);
+
+ if (read_poll_timeout(!rtw_read32_mask, lok_ready, lok_ready,
+ 1000, 10000, false,
+ rtwdev, 0x1b00, BIT(0))) {
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "==>S%d LOK timed out\n", path);
+
+ rtw8814a_iqk_reset_nctl(rtwdev);
+
+ rtw_write_rf(rtwdev, path, RF_DTXLOK, RFREG_MASK, 0x08400);
+
+ return;
+ }
+
+ rtw_write32(rtwdev, 0x1b00, 0xf8000000 | (path << 1));
+ rtw_write32(rtwdev, 0x1bd4, 0x003f0001);
+
+ lok_temp2 = rtw_read32_mask(rtwdev, 0x1bfc, 0x003e0000);
+ lok_temp2 = (lok_temp2 + 0x10) & 0x1f;
+
+ lok_temp1 = rtw_read32_mask(rtwdev, 0x1bfc, 0x0000003e);
+ lok_temp1 = (lok_temp1 + 0x10) & 0x1f;
+
+ for (ii = 1; ii < 5; ii++) {
+ lok_temp1 += (lok_temp1 & BIT(4 - ii)) << (ii * 2);
+ lok_temp2 += (lok_temp2 & BIT(4 - ii)) << (ii * 2);
+ }
+
+ rtw_dbg(rtwdev, RTW_DBG_RFK,
+ "path %d lok_temp1 = %#x, lok_temp2 = %#x\n",
+ path, lok_temp1 >> 4, lok_temp2 >> 4);
+
+ rtw_write_rf(rtwdev, path, RF_DTXLOK, 0x07c00, lok_temp1 >> 4);
+ rtw_write_rf(rtwdev, path, RF_DTXLOK, 0xf8000, lok_temp2 >> 4);
+}
+
+static void rtw8814a_iqk_tx_one_shot(struct rtw_dev *rtwdev, u8 path,
+ u32 *tx_matrix, bool *tx_ok)
+{
+ u8 bw = rtwdev->hal.current_band_width;
+ u8 cal_retry;
+ u32 iqk_cmd;
+
+ for (cal_retry = 0; cal_retry < 4; cal_retry++) {
+ rtw_write32_mask(rtwdev, REG_FAS, BIT(21) | BIT(20), path);
+
+ iqk_cmd = 0xf8000001 | ((bw + 3) << 8) | (BIT(path) << 4);
+
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "TXK_Trigger = %#x\n", iqk_cmd);
+
+ rtw_write32(rtwdev, 0x1b00, iqk_cmd);
+
+ usleep_range(10000, 11000);
+
+ if (read_poll_timeout(!rtw_read32_mask, *tx_ok, *tx_ok,
+ 1000, 20000, false,
+ rtwdev, 0x1b00, BIT(0))) {
+ rtw_dbg(rtwdev, RTW_DBG_RFK,
+ "tx iqk S%d timed out\n", path);
+
+ rtw8814a_iqk_reset_nctl(rtwdev);
+ } else {
+ *tx_ok = !rtw_read32_mask(rtwdev, 0x1b08, BIT(26));
+
+ if (*tx_ok)
+ break;
+ }
+ }
+
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d tx ==> 0x1b00 = 0x%x\n",
+ path, rtw_read32(rtwdev, 0x1b00));
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d tx ==> 0x1b08 = 0x%x\n",
+ path, rtw_read32(rtwdev, 0x1b08));
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d tx ==> cal_retry = %x\n",
+ path, cal_retry);
+
+ rtw_write32(rtwdev, 0x1b00, 0xf8000000 | (path << 1));
+
+ if (*tx_ok) {
+ *tx_matrix = rtw_read32(rtwdev, 0x1b38);
+
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d_IQC = 0x%x\n",
+ path, *tx_matrix);
+ }
+}
+
+static void rtw8814a_iqk_rx_one_shot(struct rtw_dev *rtwdev, u8 path,
+ u32 *tx_matrix, bool *tx_ok)
+{
+ static const u16 iqk_apply[RTW_RF_PATH_MAX] = {
+ REG_TXAGCIDX, REG_TX_AGC_B, REG_TX_AGC_C, REG_TX_AGC_D
+ };
+ u8 band = rtwdev->hal.current_band_type;
+ u8 bw = rtwdev->hal.current_band_width;
+ u32 rx_matrix;
+ u8 cal_retry;
+ u32 iqk_cmd;
+ bool rx_ok;
+
+ for (cal_retry = 0; cal_retry < 4; cal_retry++) {
+ rtw_write32_mask(rtwdev, REG_FAS, BIT(21) | BIT(20), path);
+
+ if (band == RTW_BAND_2G) {
+ rtw_write_rf(rtwdev, path, RF_LUTDBG, BIT(11), 0x1);
+ rtw_write_rf(rtwdev, path, RF_GAINTX, 0xfffff, 0x51ce1);
+
+ switch (path) {
+ case 0:
+ case 1:
+ rtw_write32(rtwdev, REG_RFE_PINMUX_B,
+ 0x54775477);
+ break;
+ case 2:
+ rtw_write32(rtwdev, REG_RFE_PINMUX_C,
+ 0x54775477);
+ break;
+ case 3:
+ rtw_write32(rtwdev, REG_RFE_INVSEL_D, 0x75400000);
+ rtw_write32(rtwdev, REG_RFE_PINMUX_D,
+ 0x77777777);
+ break;
+ }
+ }
+
+ iqk_cmd = 0xf8000001 | ((9 - bw) << 8) | (BIT(path) << 4);
+
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "RXK_Trigger = 0x%x\n", iqk_cmd);
+
+ rtw_write32(rtwdev, 0x1b00, iqk_cmd);
+
+ usleep_range(10000, 11000);
+
+ if (read_poll_timeout(!rtw_read32_mask, rx_ok, rx_ok,
+ 1000, 20000, false,
+ rtwdev, 0x1b00, BIT(0))) {
+ rtw_dbg(rtwdev, RTW_DBG_RFK,
+ "rx iqk S%d timed out\n", path);
+
+ rtw8814a_iqk_reset_nctl(rtwdev);
+ } else {
+ rx_ok = !rtw_read32_mask(rtwdev, 0x1b08, BIT(26));
+
+ if (rx_ok)
+ break;
+ }
+ }
+
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d rx ==> 0x1b00 = 0x%x\n",
+ path, rtw_read32(rtwdev, 0x1b00));
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d rx ==> 0x1b08 = 0x%x\n",
+ path, rtw_read32(rtwdev, 0x1b08));
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d rx ==> cal_retry = %x\n",
+ path, cal_retry);
+
+ rtw_write32(rtwdev, 0x1b00, 0xf8000000 | (path << 1));
+
+ if (rx_ok) {
+ rtw_write32(rtwdev, 0x1b3c, 0x20000000);
+ rx_matrix = rtw_read32(rtwdev, 0x1b3c);
+
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d_IQC = 0x%x\n",
+ path, rx_matrix);
+ }
+
+ if (*tx_ok)
+ rtw_write32(rtwdev, 0x1b38, *tx_matrix);
+ else
+ rtw_write32_mask(rtwdev, iqk_apply[path], BIT(0), 0x0);
+
+ if (!rx_ok)
+ rtw_write32_mask(rtwdev, iqk_apply[path],
+ BIT(11) | BIT(10), 0x0);
+
+ if (band == RTW_BAND_2G)
+ rtw_write_rf(rtwdev, path, RF_LUTDBG, BIT(11), 0x0);
+}
+
+static void rtw8814a_iqk(struct rtw_dev *rtwdev)
+{
+ u8 band = rtwdev->hal.current_band_type;
+ u8 bw = rtwdev->hal.current_band_width;
+ u32 tx_matrix[RTW_RF_PATH_MAX];
+ bool tx_ok[RTW_RF_PATH_MAX];
+ u8 path;
+
+ rtw_dbg(rtwdev, RTW_DBG_RFK, "IQK band = %d GHz bw = %d MHz\n",
+ band == RTW_BAND_2G ? 2 : 5, (1 << (bw + 1)) * 10);
+
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_TXMOD, BIT(19), 0x1);
+ rtw_write_rf(rtwdev, RF_PATH_B, RF_TXMOD, BIT(19), 0x1);
+ rtw_write_rf(rtwdev, RF_PATH_C, RF_TXMOD, BIT(19), 0x1);
+ rtw_write_rf(rtwdev, RF_PATH_D, RF_TXMOD, BIT(19), 0x1);
+
+ rtw_write32_mask(rtwdev, REG_TXAGCIDX,
+ (BIT(11) | BIT(10) | BIT(0)), 0x401);
+ rtw_write32_mask(rtwdev, REG_TX_AGC_B,
+ (BIT(11) | BIT(10) | BIT(0)), 0x401);
+ rtw_write32_mask(rtwdev, REG_TX_AGC_C,
+ (BIT(11) | BIT(10) | BIT(0)), 0x401);
+ rtw_write32_mask(rtwdev, REG_TX_AGC_D,
+ (BIT(11) | BIT(10) | BIT(0)), 0x401);
+
+ if (band == RTW_BAND_5G)
+ rtw_write32(rtwdev, 0x1b00, 0xf8000ff1);
+ else
+ rtw_write32(rtwdev, 0x1b00, 0xf8000ef1);
+
+ usleep_range(1000, 1100);
+
+ rtw_write32(rtwdev, 0x810, 0x20101063);
+ rtw_write32(rtwdev, REG_DAC_RSTB, 0x0B00C000);
+
+ for (path = RF_PATH_A; path < RTW_RF_PATH_MAX; path++)
+ rtw8814a_lok_one_shot(rtwdev, path);
+
+ for (path = RF_PATH_A; path < RTW_RF_PATH_MAX; path++)
+ rtw8814a_iqk_tx_one_shot(rtwdev, path,
+ &tx_matrix[path], &tx_ok[path]);
+
+ for (path = RF_PATH_A; path < RTW_RF_PATH_MAX; path++)
+ rtw8814a_iqk_rx_one_shot(rtwdev, path,
+ &tx_matrix[path], &tx_ok[path]);
+}
+
+static void rtw8814a_do_iqk(struct rtw_dev *rtwdev)
+{
+ static const u32 backup_mac_reg[MAC_REG_NUM_8814] = {0x520, 0x550};
+ static const u32 backup_bb_reg[BB_REG_NUM_8814] = {
+ 0xa14, 0x808, 0x838, 0x90c, 0x810, 0xcb0, 0xeb0,
+ 0x18b4, 0x1ab4, 0x1abc, 0x9a4, 0x764, 0xcbc, 0x910
+ };
+ static const u32 backup_rf_reg[RF_REG_NUM_8814] = {0x0};
+ u32 rf_backup[RF_REG_NUM_8814][RTW_RF_PATH_MAX];
+ u32 mac_backup[MAC_REG_NUM_8814];
+ u32 bb_backup[BB_REG_NUM_8814];
+
+ rtw8814a_iqk_backup_mac_bb(rtwdev, mac_backup, bb_backup,
+ backup_mac_reg, backup_bb_reg);
+ rtw8814a_iqk_afe_setting(rtwdev, true);
+ rtw8814a_iqk_backup_rf(rtwdev, rf_backup, backup_rf_reg);
+ rtw8814a_iqk_configure_mac(rtwdev);
+ rtw8814a_iqk(rtwdev);
+ rtw8814a_iqk_reset_nctl(rtwdev); /* for 3-wire to BB use */
+ rtw8814a_iqk_afe_setting(rtwdev, false);
+ rtw8814a_iqk_restore_mac_bb(rtwdev, mac_backup, bb_backup,
+ backup_mac_reg, backup_bb_reg);
+ rtw8814a_iqk_restore_rf(rtwdev, rf_backup, backup_rf_reg);
+}
+
+static void rtw8814a_phy_calibration(struct rtw_dev *rtwdev)
+{
+ rtw8814a_do_iqk(rtwdev);
+}
+
+static void rtw8814a_coex_cfg_init(struct rtw_dev *rtwdev)
+{
+}
+
+static void rtw8814a_coex_cfg_ant_switch(struct rtw_dev *rtwdev, u8 ctrl_type,
+ u8 pos_type)
+{
+ /* Override rtw_coex_coex_ctrl_owner(). RF path C does not
+ * function when BIT_LTE_MUX_CTRL_PATH is set.
+ */
+ rtw_write8_clr(rtwdev, REG_SYS_SDIO_CTRL + 3,
+ BIT_LTE_MUX_CTRL_PATH >> 24);
+}
+
+static void rtw8814a_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
+{
+}
+
+static void rtw8814a_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
+{
+}
+
+static void rtw8814a_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
+{
+ struct rtw_coex *coex = &rtwdev->coex;
+ struct rtw_coex_rfe *coex_rfe = &coex->rfe;
+
+ /* Only needed to make rtw8814a_coex_cfg_ant_switch() run. */
+ coex_rfe->ant_switch_exist = true;
+}
+
+static void rtw8814a_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
+{
+}
+
+static void rtw8814a_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
+{
+}
+
+static void rtw8814a_txagc_swing_offset(struct rtw_dev *rtwdev, u8 path,
+ u8 tx_pwr_idx_offset,
+ s8 *txagc_idx, u8 *swing_idx)
+{
+ struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+ u8 swing_upper_bound = dm_info->default_ofdm_index + 10;
+ s8 delta_pwr_idx = dm_info->delta_power_index[path];
+ u8 swing_index = dm_info->default_ofdm_index;
+ u8 max_tx_pwr_idx_offset = 0xf;
+ u8 swing_lower_bound = 0;
+ s8 agc_index = 0;
+
+ tx_pwr_idx_offset = min_t(u8, tx_pwr_idx_offset, max_tx_pwr_idx_offset);
+
+ if (delta_pwr_idx >= 0) {
+ if (delta_pwr_idx <= tx_pwr_idx_offset) {
+ agc_index = delta_pwr_idx;
+ swing_index = dm_info->default_ofdm_index;
+ } else if (delta_pwr_idx > tx_pwr_idx_offset) {
+ agc_index = tx_pwr_idx_offset;
+ swing_index = dm_info->default_ofdm_index +
+ delta_pwr_idx - tx_pwr_idx_offset;
+ swing_index = min_t(u8, swing_index, swing_upper_bound);
+ }
+ } else {
+ if (dm_info->default_ofdm_index > abs(delta_pwr_idx))
+ swing_index =
+ dm_info->default_ofdm_index + delta_pwr_idx;
+ else
+ swing_index = swing_lower_bound;
+ swing_index = max_t(u8, swing_index, swing_lower_bound);
+
+ agc_index = 0;
+ }
+
+ if (swing_index >= RTW_TXSCALE_SIZE) {
+ rtw_warn(rtwdev, "swing index overflow\n");
+ swing_index = RTW_TXSCALE_SIZE - 1;
+ }
+ *txagc_idx = agc_index;
+ *swing_idx = swing_index;
+}
+
+static void rtw8814a_pwrtrack_set_pwr(struct rtw_dev *rtwdev, u8 path,
+ u8 pwr_idx_offset)
+{
+ static const u32 txagc_reg[RTW_RF_PATH_MAX] = {
+ REG_TX_AGC_A, REG_TX_AGC_B, REG_TX_AGC_C, REG_TX_AGC_D
+ };
+ static const u32 txscale_reg[RTW_RF_PATH_MAX] = {
+ REG_TXSCALE_A, REG_TXSCALE_B, REG_TXSCALE_C, REG_TXSCALE_D
+ };
+ s8 txagc_idx;
+ u8 swing_idx;
+
+ rtw8814a_txagc_swing_offset(rtwdev, path, pwr_idx_offset,
+ &txagc_idx, &swing_idx);
+ rtw_write32_mask(rtwdev, txagc_reg[path], GENMASK(29, 25),
+ txagc_idx);
+ rtw_write32_mask(rtwdev, txscale_reg[path], BB_SWING_MASK,
+ rtw8814a_txscale_tbl[swing_idx]);
+}
+
+static void rtw8814a_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)
+{
+ u8 max_pwr_idx = rtwdev->chip->max_power_index;
+ u8 band_width = rtwdev->hal.current_band_width;
+ u8 channel = rtwdev->hal.current_channel;
+ u8 tx_rate = rtwdev->dm_info.tx_rate;
+ u8 regd = rtw_regd_get(rtwdev);
+ u8 pwr_idx_offset, tx_pwr_idx;
+
+ tx_pwr_idx = rtw_phy_get_tx_power_index(rtwdev, path, tx_rate,
+ band_width, channel, regd);
+
+ tx_pwr_idx = min_t(u8, tx_pwr_idx, max_pwr_idx);
+
+ pwr_idx_offset = max_pwr_idx - tx_pwr_idx;
+
+ rtw8814a_pwrtrack_set_pwr(rtwdev, path, pwr_idx_offset);
+}
+
+static void rtw8814a_phy_pwrtrack_path(struct rtw_dev *rtwdev,
+ struct rtw_swing_table *swing_table,
+ u8 path)
+{
+ struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+ u8 power_idx_cur, power_idx_last;
+ u8 delta;
+
+ /* 8814A only has one thermal meter at PATH A */
+ delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
+
+ power_idx_last = dm_info->delta_power_index[path];
+ power_idx_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table,
+ path, RF_PATH_A, delta);
+
+ /* if delta of power indexes are the same, just skip */
+ if (power_idx_cur == power_idx_last)
+ return;
+
+ dm_info->delta_power_index[path] = power_idx_cur;
+ rtw8814a_pwrtrack_set(rtwdev, path);
+}
+
+static void rtw8814a_phy_pwrtrack(struct rtw_dev *rtwdev)
+{
+ struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+ struct rtw_swing_table swing_table;
+ u8 thermal_value, path;
+
+ rtw_phy_config_swing_table(rtwdev, &swing_table);
+
+ if (rtwdev->efuse.thermal_meter[RF_PATH_A] == 0xff)
+ return;
+
+ thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
+
+ rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
+
+ if (dm_info->pwr_trk_init_trigger)
+ dm_info->pwr_trk_init_trigger = false;
+ else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
+ RF_PATH_A))
+ goto iqk;
+
+ for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++)
+ rtw8814a_phy_pwrtrack_path(rtwdev, &swing_table, path);
+
+iqk:
+ if (rtw_phy_pwrtrack_need_iqk(rtwdev))
+ rtw8814a_do_iqk(rtwdev);
+}
+
+static void rtw8814a_pwr_track(struct rtw_dev *rtwdev)
+{
+ struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+
+ if (!dm_info->pwr_trk_triggered) {
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
+ GENMASK(17, 16), 0x03);
+ dm_info->pwr_trk_triggered = true;
+ return;
+ }
+
+ rtw8814a_phy_pwrtrack(rtwdev);
+ dm_info->pwr_trk_triggered = false;
+}
+
+static void rtw8814a_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
+{
+ static const u8 pd[CCK_PD_LV_MAX] = {0x40, 0x83, 0xcd, 0xdd, 0xed};
+ struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+
+ /* Override rtw_phy_cck_pd_lv_link(). It implements something
+ * like type 2/3/4. We need type 1 here.
+ */
+ if (rtw_is_assoc(rtwdev)) {
+ if (dm_info->min_rssi > 60) {
+ new_lvl = CCK_PD_LV3;
+ } else if (dm_info->min_rssi > 35) {
+ new_lvl = CCK_PD_LV2;
+ } else if (dm_info->min_rssi > 20) {
+ if (dm_info->cck_fa_avg > 500)
+ new_lvl = CCK_PD_LV2;
+ else if (dm_info->cck_fa_avg < 250)
+ new_lvl = CCK_PD_LV1;
+ else
+ return;
+ } else {
+ new_lvl = CCK_PD_LV1;
+ }
+ }
+
+ rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n",
+ dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl);
+
+ if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl)
+ return;
+
+ dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
+ dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl;
+
+ rtw_write8(rtwdev, REG_CCK_PD_TH, pd[new_lvl]);
+}
+
+static void rtw8814a_led_set(struct led_classdev *led,
+ enum led_brightness brightness)
+{
+ struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
+ u32 led_gpio_cfg;
+
+ led_gpio_cfg = rtw_read32(rtwdev, REG_GPIO_PIN_CTRL_2);
+ led_gpio_cfg |= BIT(16) | BIT(17) | BIT(21) | BIT(22);
+
+ if (brightness == LED_OFF) {
+ led_gpio_cfg |= BIT(8) | BIT(9) | BIT(13) | BIT(14);
+ } else {
+ led_gpio_cfg &= ~(BIT(8) | BIT(9) | BIT(13) | BIT(14));
+ led_gpio_cfg &= ~(BIT(0) | BIT(1) | BIT(5) | BIT(6));
+ }
+
+ rtw_write32(rtwdev, REG_GPIO_PIN_CTRL_2, led_gpio_cfg);
+}
+
+static void rtw8814a_fill_txdesc_checksum(struct rtw_dev *rtwdev,
+ struct rtw_tx_pkt_info *pkt_info,
+ u8 *txdesc)
+{
+ size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */
+
+ fill_txdesc_checksum_common(txdesc, words);
+}
+
+static const struct rtw_chip_ops rtw8814a_ops = {
+ .power_on = rtw_power_on,
+ .power_off = rtw_power_off,
+ .phy_set_param = rtw8814a_phy_set_param,
+ .read_efuse = rtw8814a_read_efuse,
+ .query_phy_status = rtw8814a_query_phy_status,
+ .set_channel = rtw8814a_set_channel,
+ .mac_init = rtw8814a_mac_init,
+ .read_rf = rtw_phy_read_rf,
+ .write_rf = rtw_phy_write_rf_reg_sipi,
+ .set_tx_power_index = rtw8814a_set_tx_power_index,
+ .set_antenna = NULL,
+ .cfg_ldo25 = rtw8814a_cfg_ldo25,
+ .efuse_grant = rtw8814a_efuse_grant,
+ .false_alarm_statistics = rtw8814a_false_alarm_statistics,
+ .phy_calibration = rtw8814a_phy_calibration,
+ .cck_pd_set = rtw8814a_phy_cck_pd_set,
+ .pwr_track = rtw8814a_pwr_track,
+ .config_bfee = NULL,
+ .set_gid_table = NULL,
+ .cfg_csi_rate = NULL,
+ .led_set = rtw8814a_led_set,
+ .fill_txdesc_checksum = rtw8814a_fill_txdesc_checksum,
+
+ .coex_set_init = rtw8814a_coex_cfg_init,
+ .coex_set_ant_switch = rtw8814a_coex_cfg_ant_switch,
+ .coex_set_gnt_fix = rtw8814a_coex_cfg_gnt_fix,
+ .coex_set_gnt_debug = rtw8814a_coex_cfg_gnt_debug,
+ .coex_set_rfe_type = rtw8814a_coex_cfg_rfe_type,
+ .coex_set_wl_tx_power = rtw8814a_coex_cfg_wl_tx_power,
+ .coex_set_wl_rx_gain = rtw8814a_coex_cfg_wl_rx_gain,
+};
+
+static const struct rtw_rqpn rqpn_table_8814a[] = {
+ /* SDIO */
+ {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, /* vo vi */
+ RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, /* be bk */
+ RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, /* mg hi */
+ /* PCIE */
+ {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_NORMAL,
+ RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
+ RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
+ /* USB, 2 bulk out */
+ {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH,
+ RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
+ RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
+ /* USB, 3 bulk out */
+ {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_NORMAL,
+ RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
+ RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
+ /* USB, 4 bulk out */
+ {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_NORMAL,
+ RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
+ RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
+};
+
+static const struct rtw_prioq_addrs prioq_addrs_8814a = {
+ .prio[RTW_DMA_MAPPING_EXTRA] = {
+ .rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
+ },
+ .prio[RTW_DMA_MAPPING_LOW] = {
+ .rsvd = REG_FIFOPAGE_INFO_2, .avail = REG_FIFOPAGE_INFO_2 + 2,
+ },
+ .prio[RTW_DMA_MAPPING_NORMAL] = {
+ .rsvd = REG_FIFOPAGE_INFO_3, .avail = REG_FIFOPAGE_INFO_3 + 2,
+ },
+ .prio[RTW_DMA_MAPPING_HIGH] = {
+ .rsvd = REG_FIFOPAGE_INFO_1, .avail = REG_FIFOPAGE_INFO_1 + 2,
+ },
+ .wsize = true,
+};
+
+static const struct rtw_page_table page_table_8814a[] = {
+ /* SDIO */
+ {0, 0, 0, 0, 0}, /* hq nq lq exq gapq */
+ /* PCIE */
+ {32, 32, 32, 32, 0},
+ /* USB, 2 bulk out */
+ {32, 32, 32, 32, 0},
+ /* USB, 3 bulk out */
+ {32, 32, 32, 32, 0},
+ /* USB, 4 bulk out */
+ {32, 32, 32, 32, 0},
+};
+
+static const struct rtw_intf_phy_para_table phy_para_table_8814a = {};
+
+static const struct rtw_hw_reg rtw8814a_dig[] = {
+ [0] = { .addr = 0xc50, .mask = 0x7f },
+ [1] = { .addr = 0xe50, .mask = 0x7f },
+ [2] = { .addr = 0x1850, .mask = 0x7f },
+ [3] = { .addr = 0x1a50, .mask = 0x7f },
+};
+
+static const struct rtw_rfe_def rtw8814a_rfe_defs[] = {
+ [0] = { .phy_pg_tbl = &rtw8814a_bb_pg_type0_tbl,
+ .txpwr_lmt_tbl = &rtw8814a_txpwr_lmt_type0_tbl,
+ .pwr_track_tbl = &rtw8814a_rtw_pwrtrk_type0_tbl },
+ [1] = { .phy_pg_tbl = &rtw8814a_bb_pg_tbl,
+ .txpwr_lmt_tbl = &rtw8814a_txpwr_lmt_type1_tbl,
+ .pwr_track_tbl = &rtw8814a_rtw_pwrtrk_tbl },
+};
+
+/* rssi in percentage % (dbm = % - 100) */
+static const u8 wl_rssi_step_8814a[] = {60, 50, 44, 30};
+static const u8 bt_rssi_step_8814a[] = {30, 30, 30, 30};
+
+/* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
+static const struct coex_rf_para rf_para_tx_8814a[] = {
+ {0, 0, false, 7}, /* for normal */
+ {0, 16, false, 7}, /* for WL-CPT */
+ {4, 0, true, 1},
+ {3, 6, true, 1},
+ {2, 9, true, 1},
+ {1, 13, true, 1}
+};
+
+static const struct coex_rf_para rf_para_rx_8814a[] = {
+ {0, 0, false, 7}, /* for normal */
+ {0, 16, false, 7}, /* for WL-CPT */
+ {4, 0, true, 1},
+ {3, 6, true, 1},
+ {2, 9, true, 1},
+ {1, 13, true, 1}
+};
+
+static_assert(ARRAY_SIZE(rf_para_tx_8814a) == ARRAY_SIZE(rf_para_rx_8814a));
+
+const struct rtw_chip_info rtw8814a_hw_spec = {
+ .ops = &rtw8814a_ops,
+ .id = RTW_CHIP_TYPE_8814A,
+ .fw_name = "rtw88/rtw8814a_fw.bin",
+ .wlan_cpu = RTW_WCPU_11AC,
+ .tx_pkt_desc_sz = 40,
+ .tx_buf_desc_sz = 16,
+ .rx_pkt_desc_sz = 24,
+ .rx_buf_desc_sz = 8,
+ .phy_efuse_size = 1024,
+ .log_efuse_size = 512,
+ .ptct_efuse_size = 0,
+ .txff_size = (2048 - 10) * TX_PAGE_SIZE,
+ .rxff_size = 23552,
+ .rsvd_drv_pg_num = 8,
+ .band = RTW_BAND_2G | RTW_BAND_5G,
+ .page_size = TX_PAGE_SIZE,
+ .csi_buf_pg_num = 0,
+ .dig_min = 0x1c,
+ .txgi_factor = 1,
+ .is_pwr_by_rate_dec = true,
+ .rx_ldpc = true,
+ .max_power_index = 0x3f,
+ .ampdu_density = IEEE80211_HT_MPDU_DENSITY_2,
+ .usb_tx_agg_desc_num = 3,
+ .hw_feature_report = false,
+ .c2h_ra_report_size = 6,
+ .old_datarate_fb_limit = false,
+ .ht_supported = true,
+ .vht_supported = true,
+ .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
+ .sys_func_en = 0xDC,
+ .pwr_on_seq = card_enable_flow_8814a,
+ .pwr_off_seq = card_disable_flow_8814a,
+ .rqpn_table = rqpn_table_8814a,
+ .prioq_addrs = &prioq_addrs_8814a,
+ .page_table = page_table_8814a,
+ .intf_table = &phy_para_table_8814a,
+ .dig = rtw8814a_dig,
+ .dig_cck = NULL,
+ .rf_base_addr = {0x2800, 0x2c00, 0x3800, 0x3c00},
+ .rf_sipi_addr = {0xc90, 0xe90, 0x1890, 0x1a90},
+ .ltecoex_addr = NULL,
+ .mac_tbl = &rtw8814a_mac_tbl,
+ .agc_tbl = &rtw8814a_agc_tbl,
+ .bb_tbl = &rtw8814a_bb_tbl,
+ .rf_tbl = {&rtw8814a_rf_a_tbl, &rtw8814a_rf_b_tbl,
+ &rtw8814a_rf_c_tbl, &rtw8814a_rf_d_tbl},
+ .rfe_defs = rtw8814a_rfe_defs,
+ .rfe_defs_size = ARRAY_SIZE(rtw8814a_rfe_defs),
+ .iqk_threshold = 8,
+ .max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
+
+ .coex_para_ver = 0,
+ .bt_desired_ver = 0,
+ .scbd_support = false,
+ .new_scbd10_def = false,
+ .ble_hid_profile_support = false,
+ .wl_mimo_ps_support = false,
+ .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
+ .bt_rssi_type = COEX_BTRSSI_RATIO,
+ .ant_isolation = 15,
+ .rssi_tolerance = 2,
+ .wl_rssi_step = wl_rssi_step_8814a,
+ .bt_rssi_step = bt_rssi_step_8814a,
+ .table_sant_num = 0,
+ .table_sant = NULL,
+ .table_nsant_num = 0,
+ .table_nsant = NULL,
+ .tdma_sant_num = 0,
+ .tdma_sant = NULL,
+ .tdma_nsant_num = 0,
+ .tdma_nsant = NULL,
+ .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8814a),
+ .wl_rf_para_tx = rf_para_tx_8814a,
+ .wl_rf_para_rx = rf_para_rx_8814a,
+ .bt_afh_span_bw20 = 0x24,
+ .bt_afh_span_bw40 = 0x36,
+ .afh_5g_num = 0,
+ .afh_5g = NULL,
+ .coex_info_hw_regs_num = 0,
+ .coex_info_hw_regs = NULL,
+};
+EXPORT_SYMBOL(rtw8814a_hw_spec);
+
+MODULE_FIRMWARE("rtw88/rtw8814a_fw.bin");
+
+MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>");
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8814a driver");
+MODULE_LICENSE("Dual BSD/GPL");
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8814a.h b/drivers/net/wireless/realtek/rtw88/rtw8814a.h
new file mode 100644
index 000000000000..c57c7c8f915e
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/rtw8814a.h
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/* Copyright(c) 2025 Realtek Corporation
+ */
+
+#ifndef __RTW8814A_H__
+#define __RTW8814A_H__
+
+struct rtw8814au_efuse {
+ u8 vid[2]; /* 0xd0 */
+ u8 pid[2]; /* 0xd2 */
+ u8 res[4]; /* 0xd4 */
+ u8 mac_addr[ETH_ALEN]; /* 0xd8 */
+} __packed;
+
+struct rtw8814ae_efuse {
+ u8 mac_addr[ETH_ALEN]; /* 0xd0 */
+ u8 vid[2]; /* 0xd6 */
+ u8 did[2]; /* 0xd8 */
+ u8 svid[2]; /* 0xda */
+ u8 smid[2]; /* 0xdc */
+} __packed;
+
+struct rtw8814a_efuse {
+ __le16 rtl_id;
+ u8 res0[0x0c];
+ u8 usb_mode; /* 0x0e */
+ u8 res1;
+
+ /* power index for four RF paths */
+ struct rtw_txpwr_idx txpwr_idx_table[4];
+
+ u8 channel_plan; /* 0xb8 */
+ u8 xtal_k; /* 0xb9 */
+ u8 thermal_meter; /* 0xba */
+ u8 iqk_lck; /* 0xbb */
+ u8 pa_type; /* 0xbc */
+ u8 lna_type_2g[2]; /* 0xbd */
+ u8 lna_type_5g[2]; /* 0xbf */
+ u8 rf_board_option; /* 0xc1 */
+ u8 res2;
+ u8 rf_bt_setting; /* 0xc3 */
+ u8 eeprom_version; /* 0xc4 */
+ u8 eeprom_customer_id; /* 0xc5 */
+ u8 tx_bb_swing_setting_2g; /* 0xc6 */
+ u8 tx_bb_swing_setting_5g; /* 0xc7 */
+ u8 res3;
+ u8 trx_antenna_option; /* 0xc9 */
+ u8 rfe_option; /* 0xca */
+ u8 country_code[2]; /* 0xcb */
+ u8 res4[3];
+ union {
+ struct rtw8814au_efuse u;
+ struct rtw8814ae_efuse e;
+ };
+ u8 res5[0x122]; /* 0xde */
+} __packed;
+
+static_assert(sizeof(struct rtw8814a_efuse) == 512);
+
+extern const struct rtw_chip_info rtw8814a_hw_spec;
+
+#endif
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8814a_table.c b/drivers/net/wireless/realtek/rtw88/rtw8814a_table.c
new file mode 100644
index 000000000000..b9ce51a09fc8
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/rtw8814a_table.c
@@ -0,0 +1,23930 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2025 Realtek Corporation
+ */
+
+#include "main.h"
+#include "phy.h"
+#include "rtw8814a_table.h"
+
+static const u32 rtw8814a_mac[] = {
+ 0x010, 0x0000007C,
+ 0x014, 0x000000DB,
+ 0x016, 0x00000002,
+ 0x073, 0x00000010,
+ 0x420, 0x00000080,
+ 0x421, 0x0000000F,
+ 0x428, 0x0000000A,
+ 0x429, 0x00000010,
+ 0x430, 0x00000000,
+ 0x431, 0x00000000,
+ 0x432, 0x00000000,
+ 0x433, 0x00000001,
+ 0x434, 0x00000004,
+ 0x435, 0x00000005,
+ 0x436, 0x00000007,
+ 0x437, 0x00000008,
+ 0x43C, 0x00000004,
+ 0x43D, 0x00000005,
+ 0x43E, 0x00000007,
+ 0x43F, 0x00000008,
+ 0x440, 0x0000005D,
+ 0x441, 0x00000001,
+ 0x442, 0x00000000,
+ 0x444, 0x00000010,
+ 0x445, 0x000000F0,
+ 0x446, 0x00000001,
+ 0x447, 0x000000FE,
+ 0x448, 0x00000000,
+ 0x449, 0x00000000,
+ 0x44A, 0x00000000,
+ 0x44B, 0x00000040,
+ 0x44C, 0x00000010,
+ 0x44D, 0x000000F0,
+ 0x44E, 0x0000003F,
+ 0x44F, 0x00000000,
+ 0x450, 0x00000000,
+ 0x451, 0x00000000,
+ 0x452, 0x00000000,
+ 0x453, 0x00000040,
+ 0x45E, 0x00000004,
+ 0x49C, 0x00000010,
+ 0x49D, 0x000000F0,
+ 0x49E, 0x00000000,
+ 0x49F, 0x00000006,
+ 0x4A0, 0x000000E0,
+ 0x4A1, 0x00000003,
+ 0x4A2, 0x00000000,
+ 0x4A3, 0x00000040,
+ 0x4A4, 0x00000015,
+ 0x4A5, 0x000000F0,
+ 0x4A6, 0x00000000,
+ 0x4A7, 0x00000006,
+ 0x4A8, 0x000000E0,
+ 0x4A9, 0x00000000,
+ 0x4AA, 0x00000000,
+ 0x4AB, 0x00000000,
+ 0x7DA, 0x00000008,
+ 0x1448, 0x00000006,
+ 0x144A, 0x00000006,
+ 0x144C, 0x00000006,
+ 0x144E, 0x00000006,
+ 0x4C8, 0x000000FF,
+ 0x4C9, 0x00000008,
+ 0x4CA, 0x0000003C,
+ 0x4CB, 0x0000003C,
+ 0x4CC, 0x000000FF,
+ 0x4CD, 0x000000FF,
+ 0x4CE, 0x00000001,
+ 0x4CF, 0x00000008,
+ 0x500, 0x00000026,
+ 0x501, 0x000000A2,
+ 0x502, 0x0000002F,
+ 0x503, 0x00000000,
+ 0x504, 0x00000028,
+ 0x505, 0x000000A3,
+ 0x506, 0x0000005E,
+ 0x507, 0x00000000,
+ 0x508, 0x0000002B,
+ 0x509, 0x000000A4,
+ 0x50A, 0x0000005E,
+ 0x50B, 0x00000000,
+ 0x50C, 0x0000004F,
+ 0x50D, 0x000000A4,
+ 0x50E, 0x00000000,
+ 0x50F, 0x00000000,
+ 0x512, 0x0000001C,
+ 0x514, 0x0000000A,
+ 0x516, 0x0000000A,
+ 0x521, 0x0000002F,
+ 0x525, 0x00000047,
+ 0x550, 0x00000010,
+ 0x551, 0x00000010,
+ 0x559, 0x00000002,
+ 0x55C, 0x00000064,
+ 0x55D, 0x000000FF,
+ 0x577, 0x00000003,
+ 0x5BE, 0x00000064,
+ 0x604, 0x00000001,
+ 0x605, 0x00000030,
+ 0x607, 0x00000001,
+ 0x608, 0x0000000E,
+ 0x609, 0x0000002A,
+ 0x60A, 0x00000000,
+ 0x60C, 0x00000018,
+ 0x60D, 0x00000050,
+ 0x6A0, 0x000000FF,
+ 0x6A1, 0x000000FF,
+ 0x6A2, 0x000000FF,
+ 0x6A3, 0x000000FF,
+ 0x6A4, 0x000000FF,
+ 0x6A5, 0x000000FF,
+ 0x6DE, 0x00000084,
+ 0x620, 0x000000FF,
+ 0x621, 0x000000FF,
+ 0x622, 0x000000FF,
+ 0x623, 0x000000FF,
+ 0x624, 0x000000FF,
+ 0x625, 0x000000FF,
+ 0x626, 0x000000FF,
+ 0x627, 0x000000FF,
+ 0x638, 0x00000064,
+ 0x63C, 0x0000000A,
+ 0x63D, 0x0000000A,
+ 0x63E, 0x0000000E,
+ 0x63F, 0x0000000E,
+ 0x640, 0x00000040,
+ 0x642, 0x00000040,
+ 0x643, 0x00000000,
+ 0x652, 0x000000C8,
+ 0x66E, 0x00000005,
+ 0x700, 0x00000021,
+ 0x701, 0x00000043,
+ 0x702, 0x00000065,
+ 0x703, 0x00000087,
+ 0x708, 0x00000021,
+ 0x709, 0x00000043,
+ 0x70A, 0x00000065,
+ 0x70B, 0x00000087,
+ 0x718, 0x00000040,
+ 0x7D5, 0x000000BC,
+ 0x7D8, 0x00000028,
+ 0x7D9, 0x00000000,
+ 0x7DA, 0x0000000B,
+};
+
+RTW_DECL_TABLE_PHY_COND(rtw8814a_mac, rtw_phy_cfg_mac);
+
+static const u32 rtw8814a_agc[] = {
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFF000003,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFF000003,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0xA0000000, 0x00000000,
+ 0x81C, 0xFF000003,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x81C, 0xFD020003,
+ 0x81C, 0xFC040003,
+ 0x81C, 0xFB060003,
+ 0x81C, 0xFA080003,
+ 0x81C, 0xF90A0003,
+ 0x81C, 0xF80C0003,
+ 0x81C, 0xF70E0003,
+ 0x81C, 0xF6100003,
+ 0x81C, 0xF5120003,
+ 0x81C, 0xF4140003,
+ 0x81C, 0xF3160003,
+ 0x81C, 0xF2180003,
+ 0x81C, 0xF11A0003,
+ 0x81C, 0xF01C0003,
+ 0x81C, 0xEF1E0003,
+ 0x81C, 0xEE200003,
+ 0x81C, 0xED220003,
+ 0x81C, 0xCF240003,
+ 0x81C, 0xCE260003,
+ 0x81C, 0xCD280003,
+ 0x81C, 0xCC2A0003,
+ 0x81C, 0xCB2C0003,
+ 0x81C, 0xCA2E0003,
+ 0x81C, 0xC9300003,
+ 0x81C, 0xC8320003,
+ 0x81C, 0xC7340003,
+ 0x81C, 0xC6360003,
+ 0x81C, 0xC5380003,
+ 0x81C, 0xC43A0003,
+ 0x81C, 0xA63C0003,
+ 0x81C, 0xA53E0003,
+ 0x81C, 0xA4400003,
+ 0x81C, 0xA3420003,
+ 0x81C, 0xA2440003,
+ 0x81C, 0xA1460003,
+ 0x81C, 0x86480003,
+ 0x81C, 0x854A0003,
+ 0x81C, 0x844C0003,
+ 0x81C, 0x834E0003,
+ 0x81C, 0x66500003,
+ 0x81C, 0x65520003,
+ 0x81C, 0x64540003,
+ 0x81C, 0x63560003,
+ 0x81C, 0x62580003,
+ 0x81C, 0x615A0003,
+ 0x81C, 0x435C0003,
+ 0x81C, 0x425E0003,
+ 0x81C, 0x41600003,
+ 0x81C, 0x27620003,
+ 0x81C, 0x26640003,
+ 0x81C, 0x25660003,
+ 0x81C, 0x24680003,
+ 0x81C, 0x236A0003,
+ 0x81C, 0x226C0003,
+ 0x81C, 0x216E0003,
+ 0x81C, 0x21700003,
+ 0x81C, 0x21720003,
+ 0x81C, 0x21740003,
+ 0x81C, 0x21760003,
+ 0x81C, 0x21780003,
+ 0x81C, 0x217A0003,
+ 0x81C, 0x217C0003,
+ 0x81C, 0x217E0003,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFF000003,
+ 0x81C, 0xFE020003,
+ 0x81C, 0xFD040003,
+ 0x81C, 0xFC060003,
+ 0x81C, 0xFB080003,
+ 0x81C, 0xFA0A0003,
+ 0x81C, 0xF90C0003,
+ 0x81C, 0xF80E0003,
+ 0x81C, 0xF7100003,
+ 0x81C, 0xF6120003,
+ 0x81C, 0xF5140003,
+ 0x81C, 0xF4160003,
+ 0x81C, 0xF3180003,
+ 0x81C, 0xF21A0003,
+ 0x81C, 0xF11C0003,
+ 0x81C, 0xF01E0003,
+ 0x81C, 0xEF200003,
+ 0x81C, 0xEE220003,
+ 0x81C, 0xED240003,
+ 0x81C, 0xEC260003,
+ 0x81C, 0xEB280003,
+ 0x81C, 0xEA2A0003,
+ 0x81C, 0xE92C0003,
+ 0x81C, 0xE82E0003,
+ 0x81C, 0xE7300003,
+ 0x81C, 0xE6320003,
+ 0x81C, 0xE5340003,
+ 0x81C, 0xE4360003,
+ 0x81C, 0xE3380003,
+ 0x81C, 0xC53A0003,
+ 0x81C, 0xC43C0003,
+ 0x81C, 0xC33E0003,
+ 0x81C, 0xC2400003,
+ 0x81C, 0xC1420003,
+ 0x81C, 0xA8440003,
+ 0x81C, 0xA7460003,
+ 0x81C, 0xA6480003,
+ 0x81C, 0xA54A0003,
+ 0x81C, 0xA44C0003,
+ 0x81C, 0xA34E0003,
+ 0x81C, 0xA2500003,
+ 0x81C, 0x65520003,
+ 0x81C, 0x64540003,
+ 0x81C, 0x63560003,
+ 0x81C, 0x62580003,
+ 0x81C, 0x615A0003,
+ 0x81C, 0x475C0003,
+ 0x81C, 0x465E0003,
+ 0x81C, 0x45600003,
+ 0x81C, 0x44620003,
+ 0x81C, 0x43640003,
+ 0x81C, 0x42660003,
+ 0x81C, 0x41680003,
+ 0x81C, 0x416A0003,
+ 0x81C, 0x416C0003,
+ 0x81C, 0x416E0003,
+ 0x81C, 0x41700003,
+ 0x81C, 0x41720003,
+ 0x81C, 0x41740003,
+ 0x81C, 0x41760003,
+ 0x81C, 0x41780003,
+ 0x81C, 0x417A0003,
+ 0x81C, 0x417C0003,
+ 0x81C, 0x417E0003,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x81C, 0xFD020003,
+ 0x81C, 0xFC040003,
+ 0x81C, 0xFB060003,
+ 0x81C, 0xFA080003,
+ 0x81C, 0xF90A0003,
+ 0x81C, 0xF80C0003,
+ 0x81C, 0xF70E0003,
+ 0x81C, 0xF6100003,
+ 0x81C, 0xF5120003,
+ 0x81C, 0xF4140003,
+ 0x81C, 0xF3160003,
+ 0x81C, 0xF2180003,
+ 0x81C, 0xF11A0003,
+ 0x81C, 0xF01C0003,
+ 0x81C, 0xEF1E0003,
+ 0x81C, 0xEE200003,
+ 0x81C, 0xED220003,
+ 0x81C, 0xEC240003,
+ 0x81C, 0xEB260003,
+ 0x81C, 0xEA280003,
+ 0x81C, 0xE92A0003,
+ 0x81C, 0xE82C0003,
+ 0x81C, 0xE72E0003,
+ 0x81C, 0xE6300003,
+ 0x81C, 0xE5320003,
+ 0x81C, 0xE4340003,
+ 0x81C, 0xE3360003,
+ 0x81C, 0xC6380003,
+ 0x81C, 0xC53A0003,
+ 0x81C, 0xC43C0003,
+ 0x81C, 0xC33E0003,
+ 0x81C, 0xC2400003,
+ 0x81C, 0xA9420003,
+ 0x81C, 0xA8440003,
+ 0x81C, 0xA7460003,
+ 0x81C, 0xA6480003,
+ 0x81C, 0xA54A0003,
+ 0x81C, 0xA44C0003,
+ 0x81C, 0xA34E0003,
+ 0x81C, 0x66500003,
+ 0x81C, 0x65520003,
+ 0x81C, 0x64540003,
+ 0x81C, 0x63560003,
+ 0x81C, 0x49580003,
+ 0x81C, 0x485A0003,
+ 0x81C, 0x475C0003,
+ 0x81C, 0x465E0003,
+ 0x81C, 0x45600003,
+ 0x81C, 0x44620003,
+ 0x81C, 0x43640003,
+ 0x81C, 0x42660003,
+ 0x81C, 0x41680003,
+ 0x81C, 0x416A0003,
+ 0x81C, 0x416C0003,
+ 0x81C, 0x416E0003,
+ 0x81C, 0x41700003,
+ 0x81C, 0x41720003,
+ 0x81C, 0x41740003,
+ 0x81C, 0x41760003,
+ 0x81C, 0x41780003,
+ 0x81C, 0x417A0003,
+ 0x81C, 0x417C0003,
+ 0x81C, 0x417E0003,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFF000003,
+ 0x81C, 0xFE020003,
+ 0x81C, 0xFD040003,
+ 0x81C, 0xFC060003,
+ 0x81C, 0xFB080003,
+ 0x81C, 0xFA0A0003,
+ 0x81C, 0xF90C0003,
+ 0x81C, 0xF80E0003,
+ 0x81C, 0xF7100003,
+ 0x81C, 0xF6120003,
+ 0x81C, 0xF5140003,
+ 0x81C, 0xF4160003,
+ 0x81C, 0xF3180003,
+ 0x81C, 0xF21A0003,
+ 0x81C, 0xF11C0003,
+ 0x81C, 0xF01E0003,
+ 0x81C, 0xEF200003,
+ 0x81C, 0xEE220003,
+ 0x81C, 0xED240003,
+ 0x81C, 0xEC260003,
+ 0x81C, 0xEB280003,
+ 0x81C, 0xEA2A0003,
+ 0x81C, 0xE92C0003,
+ 0x81C, 0xE82E0003,
+ 0x81C, 0xE7300003,
+ 0x81C, 0xE6320003,
+ 0x81C, 0xE5340003,
+ 0x81C, 0xE4360003,
+ 0x81C, 0xE3380003,
+ 0x81C, 0xC53A0003,
+ 0x81C, 0xC43C0003,
+ 0x81C, 0xC33E0003,
+ 0x81C, 0xC2400003,
+ 0x81C, 0xC1420003,
+ 0x81C, 0xA8440003,
+ 0x81C, 0xA7460003,
+ 0x81C, 0xA6480003,
+ 0x81C, 0xA54A0003,
+ 0x81C, 0xA44C0003,
+ 0x81C, 0xA34E0003,
+ 0x81C, 0xA2500003,
+ 0x81C, 0x65520003,
+ 0x81C, 0x64540003,
+ 0x81C, 0x63560003,
+ 0x81C, 0x62580003,
+ 0x81C, 0x615A0003,
+ 0x81C, 0x475C0003,
+ 0x81C, 0x465E0003,
+ 0x81C, 0x45600003,
+ 0x81C, 0x44620003,
+ 0x81C, 0x43640003,
+ 0x81C, 0x42660003,
+ 0x81C, 0x41680003,
+ 0x81C, 0x416A0003,
+ 0x81C, 0x416C0003,
+ 0x81C, 0x416E0003,
+ 0x81C, 0x41700003,
+ 0x81C, 0x41720003,
+ 0x81C, 0x41740003,
+ 0x81C, 0x41760003,
+ 0x81C, 0x41780003,
+ 0x81C, 0x417A0003,
+ 0x81C, 0x417C0003,
+ 0x81C, 0x417E0003,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x81C, 0xFD020003,
+ 0x81C, 0xFC040003,
+ 0x81C, 0xFB060003,
+ 0x81C, 0xFA080003,
+ 0x81C, 0xF90A0003,
+ 0x81C, 0xF80C0003,
+ 0x81C, 0xF70E0003,
+ 0x81C, 0xF6100003,
+ 0x81C, 0xF5120003,
+ 0x81C, 0xF4140003,
+ 0x81C, 0xF3160003,
+ 0x81C, 0xF2180003,
+ 0x81C, 0xF11A0003,
+ 0x81C, 0xF01C0003,
+ 0x81C, 0xEF1E0003,
+ 0x81C, 0xEE200003,
+ 0x81C, 0xED220003,
+ 0x81C, 0xEC240003,
+ 0x81C, 0xEB260003,
+ 0x81C, 0xEA280003,
+ 0x81C, 0xE92A0003,
+ 0x81C, 0xE82C0003,
+ 0x81C, 0xE72E0003,
+ 0x81C, 0xE6300003,
+ 0x81C, 0xE5320003,
+ 0x81C, 0xE4340003,
+ 0x81C, 0xE3360003,
+ 0x81C, 0xC6380003,
+ 0x81C, 0xC53A0003,
+ 0x81C, 0xC43C0003,
+ 0x81C, 0xC33E0003,
+ 0x81C, 0xC2400003,
+ 0x81C, 0xA9420003,
+ 0x81C, 0xA8440003,
+ 0x81C, 0xA7460003,
+ 0x81C, 0xA6480003,
+ 0x81C, 0xA54A0003,
+ 0x81C, 0xA44C0003,
+ 0x81C, 0xA34E0003,
+ 0x81C, 0x66500003,
+ 0x81C, 0x65520003,
+ 0x81C, 0x64540003,
+ 0x81C, 0x63560003,
+ 0x81C, 0x49580003,
+ 0x81C, 0x485A0003,
+ 0x81C, 0x475C0003,
+ 0x81C, 0x465E0003,
+ 0x81C, 0x45600003,
+ 0x81C, 0x44620003,
+ 0x81C, 0x43640003,
+ 0x81C, 0x42660003,
+ 0x81C, 0x41680003,
+ 0x81C, 0x416A0003,
+ 0x81C, 0x416C0003,
+ 0x81C, 0x416E0003,
+ 0x81C, 0x41700003,
+ 0x81C, 0x41720003,
+ 0x81C, 0x41740003,
+ 0x81C, 0x41760003,
+ 0x81C, 0x41780003,
+ 0x81C, 0x417A0003,
+ 0x81C, 0x417C0003,
+ 0x81C, 0x417E0003,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xDF000003,
+ 0x81C, 0xDF020003,
+ 0x81C, 0xDF040003,
+ 0x81C, 0xDE060003,
+ 0x81C, 0xDD080003,
+ 0x81C, 0xDC0A0003,
+ 0x81C, 0xDB0C0003,
+ 0x81C, 0xDA0E0003,
+ 0x81C, 0xD9100003,
+ 0x81C, 0xD8120003,
+ 0x81C, 0xD7140003,
+ 0x81C, 0xD6160003,
+ 0x81C, 0xD5180003,
+ 0x81C, 0xD41A0003,
+ 0x81C, 0xD31C0003,
+ 0x81C, 0xD21E0003,
+ 0x81C, 0xD1200003,
+ 0x81C, 0xD0220003,
+ 0x81C, 0xCF240003,
+ 0x81C, 0xCE260003,
+ 0x81C, 0xCD280003,
+ 0x81C, 0xCC2A0003,
+ 0x81C, 0xCB2C0003,
+ 0x81C, 0xCA2E0003,
+ 0x81C, 0xC9300003,
+ 0x81C, 0xC8320003,
+ 0x81C, 0xC7340003,
+ 0x81C, 0xC6360003,
+ 0x81C, 0xC5380003,
+ 0x81C, 0xA73A0003,
+ 0x81C, 0xA63C0003,
+ 0x81C, 0xA53E0003,
+ 0x81C, 0xA4400003,
+ 0x81C, 0xA3420003,
+ 0x81C, 0xA2440003,
+ 0x81C, 0x87460003,
+ 0x81C, 0x86480003,
+ 0x81C, 0x854A0003,
+ 0x81C, 0x844C0003,
+ 0x81C, 0x834E0003,
+ 0x81C, 0x82500003,
+ 0x81C, 0x81520003,
+ 0x81C, 0x64540003,
+ 0x81C, 0x63560003,
+ 0x81C, 0x62580003,
+ 0x81C, 0x615A0003,
+ 0x81C, 0x445C0003,
+ 0x81C, 0x435E0003,
+ 0x81C, 0x42600003,
+ 0x81C, 0x41620003,
+ 0x81C, 0x27640003,
+ 0x81C, 0x26660003,
+ 0x81C, 0x25680003,
+ 0x81C, 0x246A0003,
+ 0x81C, 0x236C0003,
+ 0x81C, 0x226E0003,
+ 0x81C, 0x21700003,
+ 0x81C, 0x21720003,
+ 0x81C, 0x21740003,
+ 0x81C, 0x21760003,
+ 0x81C, 0x21780003,
+ 0x81C, 0x217A0003,
+ 0x81C, 0x217C0003,
+ 0x81C, 0x217E0003,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFF000003,
+ 0x81C, 0xFE020003,
+ 0x81C, 0xFD040003,
+ 0x81C, 0xFC060003,
+ 0x81C, 0xFB080003,
+ 0x81C, 0xFA0A0003,
+ 0x81C, 0xF90C0003,
+ 0x81C, 0xF80E0003,
+ 0x81C, 0xF7100003,
+ 0x81C, 0xF6120003,
+ 0x81C, 0xF5140003,
+ 0x81C, 0xF4160003,
+ 0x81C, 0xF3180003,
+ 0x81C, 0xF21A0003,
+ 0x81C, 0xF11C0003,
+ 0x81C, 0xF01E0003,
+ 0x81C, 0xEF200003,
+ 0x81C, 0xEE220003,
+ 0x81C, 0xED240003,
+ 0x81C, 0xEC260003,
+ 0x81C, 0xEB280003,
+ 0x81C, 0xEA2A0003,
+ 0x81C, 0xE92C0003,
+ 0x81C, 0xE82E0003,
+ 0x81C, 0xE7300003,
+ 0x81C, 0xE6320003,
+ 0x81C, 0xE5340003,
+ 0x81C, 0xE4360003,
+ 0x81C, 0xE3380003,
+ 0x81C, 0xC53A0003,
+ 0x81C, 0xC43C0003,
+ 0x81C, 0xC33E0003,
+ 0x81C, 0xC2400003,
+ 0x81C, 0xC1420003,
+ 0x81C, 0xA8440003,
+ 0x81C, 0xA7460003,
+ 0x81C, 0xA6480003,
+ 0x81C, 0xA54A0003,
+ 0x81C, 0xA44C0003,
+ 0x81C, 0xA34E0003,
+ 0x81C, 0xA2500003,
+ 0x81C, 0x65520003,
+ 0x81C, 0x64540003,
+ 0x81C, 0x63560003,
+ 0x81C, 0x62580003,
+ 0x81C, 0x615A0003,
+ 0x81C, 0x475C0003,
+ 0x81C, 0x465E0003,
+ 0x81C, 0x45600003,
+ 0x81C, 0x44620003,
+ 0x81C, 0x43640003,
+ 0x81C, 0x42660003,
+ 0x81C, 0x41680003,
+ 0x81C, 0x416A0003,
+ 0x81C, 0x416C0003,
+ 0x81C, 0x416E0003,
+ 0x81C, 0x41700003,
+ 0x81C, 0x41720003,
+ 0x81C, 0x41740003,
+ 0x81C, 0x41760003,
+ 0x81C, 0x41780003,
+ 0x81C, 0x417A0003,
+ 0x81C, 0x417C0003,
+ 0x81C, 0x417E0003,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xDF000003,
+ 0x81C, 0xDF020003,
+ 0x81C, 0xDF040003,
+ 0x81C, 0xDE060003,
+ 0x81C, 0xDD080003,
+ 0x81C, 0xDC0A0003,
+ 0x81C, 0xDB0C0003,
+ 0x81C, 0xDA0E0003,
+ 0x81C, 0xD9100003,
+ 0x81C, 0xD8120003,
+ 0x81C, 0xD7140003,
+ 0x81C, 0xD6160003,
+ 0x81C, 0xD5180003,
+ 0x81C, 0xD41A0003,
+ 0x81C, 0xD31C0003,
+ 0x81C, 0xD21E0003,
+ 0x81C, 0xD1200003,
+ 0x81C, 0xD0220003,
+ 0x81C, 0xCF240003,
+ 0x81C, 0xCE260003,
+ 0x81C, 0xCD280003,
+ 0x81C, 0xCC2A0003,
+ 0x81C, 0xCB2C0003,
+ 0x81C, 0xCA2E0003,
+ 0x81C, 0xC9300003,
+ 0x81C, 0xC8320003,
+ 0x81C, 0xC7340003,
+ 0x81C, 0xC6360003,
+ 0x81C, 0xC5380003,
+ 0x81C, 0xA73A0003,
+ 0x81C, 0xA63C0003,
+ 0x81C, 0xA53E0003,
+ 0x81C, 0xA4400003,
+ 0x81C, 0xA3420003,
+ 0x81C, 0xA2440003,
+ 0x81C, 0x87460003,
+ 0x81C, 0x86480003,
+ 0x81C, 0x854A0003,
+ 0x81C, 0x844C0003,
+ 0x81C, 0x834E0003,
+ 0x81C, 0x82500003,
+ 0x81C, 0x81520003,
+ 0x81C, 0x64540003,
+ 0x81C, 0x63560003,
+ 0x81C, 0x62580003,
+ 0x81C, 0x615A0003,
+ 0x81C, 0x445C0003,
+ 0x81C, 0x435E0003,
+ 0x81C, 0x42600003,
+ 0x81C, 0x41620003,
+ 0x81C, 0x27640003,
+ 0x81C, 0x26660003,
+ 0x81C, 0x25680003,
+ 0x81C, 0x246A0003,
+ 0x81C, 0x236C0003,
+ 0x81C, 0x226E0003,
+ 0x81C, 0x21700003,
+ 0x81C, 0x21720003,
+ 0x81C, 0x21740003,
+ 0x81C, 0x21760003,
+ 0x81C, 0x21780003,
+ 0x81C, 0x217A0003,
+ 0x81C, 0x217C0003,
+ 0x81C, 0x217E0003,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x81C, 0xFE020003,
+ 0x81C, 0xFD040003,
+ 0x81C, 0xFC060003,
+ 0x81C, 0xFB080003,
+ 0x81C, 0xFA0A0003,
+ 0x81C, 0xF90C0003,
+ 0x81C, 0xF80E0003,
+ 0x81C, 0xF7100003,
+ 0x81C, 0xF6120003,
+ 0x81C, 0xF5140003,
+ 0x81C, 0xF4160003,
+ 0x81C, 0xF3180003,
+ 0x81C, 0xF21A0003,
+ 0x81C, 0xF11C0003,
+ 0x81C, 0xF01E0003,
+ 0x81C, 0xEF200003,
+ 0x81C, 0xEE220003,
+ 0x81C, 0xED240003,
+ 0x81C, 0x0F260003,
+ 0x81C, 0x0E280003,
+ 0x81C, 0x0D2A0003,
+ 0x81C, 0x0C2C0003,
+ 0x81C, 0x0B2E0003,
+ 0x81C, 0x0A300003,
+ 0x81C, 0x09320003,
+ 0x81C, 0x08340003,
+ 0x81C, 0x07360003,
+ 0x81C, 0x06380003,
+ 0x81C, 0x053A0003,
+ 0x81C, 0x043C0003,
+ 0x81C, 0x033E0003,
+ 0x81C, 0x23400003,
+ 0x81C, 0x22420003,
+ 0x81C, 0xA8440003,
+ 0x81C, 0xA7460003,
+ 0x81C, 0xA6480003,
+ 0x81C, 0xA54A0003,
+ 0x81C, 0xA44C0003,
+ 0x81C, 0x684E0003,
+ 0x81C, 0x67500003,
+ 0x81C, 0x66520003,
+ 0x81C, 0x65540003,
+ 0x81C, 0x64560003,
+ 0x81C, 0x63580003,
+ 0x81C, 0x625A0003,
+ 0x81C, 0x615C0003,
+ 0x81C, 0x475E0003,
+ 0x81C, 0x46600003,
+ 0x81C, 0x45620003,
+ 0x81C, 0x44640003,
+ 0x81C, 0x43660003,
+ 0x81C, 0x42680003,
+ 0x81C, 0x416A0003,
+ 0x81C, 0x416C0003,
+ 0x81C, 0x416E0003,
+ 0x81C, 0x41700003,
+ 0x81C, 0x41720003,
+ 0x81C, 0x41740003,
+ 0x81C, 0x41760003,
+ 0x81C, 0x41780003,
+ 0x81C, 0x417A0003,
+ 0x81C, 0x417C0003,
+ 0x81C, 0x417E0003,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x81C, 0xFE020003,
+ 0x81C, 0xFD040003,
+ 0x81C, 0xFC060003,
+ 0x81C, 0xFB080003,
+ 0x81C, 0xFA0A0003,
+ 0x81C, 0xF90C0003,
+ 0x81C, 0xF80E0003,
+ 0x81C, 0xF7100003,
+ 0x81C, 0xF6120003,
+ 0x81C, 0xF5140003,
+ 0x81C, 0xF4160003,
+ 0x81C, 0xF3180003,
+ 0x81C, 0xF21A0003,
+ 0x81C, 0xF11C0003,
+ 0x81C, 0xF01E0003,
+ 0x81C, 0xEF200003,
+ 0x81C, 0xEE220003,
+ 0x81C, 0xED240003,
+ 0x81C, 0xEC260003,
+ 0x81C, 0xEB280003,
+ 0x81C, 0xEA2A0003,
+ 0x81C, 0xE92C0003,
+ 0x81C, 0xE72E0003,
+ 0x81C, 0xE6300003,
+ 0x81C, 0xE5320003,
+ 0x81C, 0x08340003,
+ 0x81C, 0x07360003,
+ 0x81C, 0x06380003,
+ 0x81C, 0x053A0003,
+ 0x81C, 0x043C0003,
+ 0x81C, 0x033E0003,
+ 0x81C, 0x02400003,
+ 0x81C, 0xA9420003,
+ 0x81C, 0xA8440003,
+ 0x81C, 0xA7460003,
+ 0x81C, 0xA6480003,
+ 0x81C, 0xA54A0003,
+ 0x81C, 0x684C0003,
+ 0x81C, 0x674E0003,
+ 0x81C, 0x66500003,
+ 0x81C, 0x65520003,
+ 0x81C, 0x64540003,
+ 0x81C, 0x63560003,
+ 0x81C, 0x62580003,
+ 0x81C, 0x615A0003,
+ 0x81C, 0x475C0003,
+ 0x81C, 0x465E0003,
+ 0x81C, 0x45600003,
+ 0x81C, 0x44620003,
+ 0x81C, 0x43640003,
+ 0x81C, 0x42660003,
+ 0x81C, 0x41680003,
+ 0x81C, 0x416A0003,
+ 0x81C, 0x416C0003,
+ 0x81C, 0x416E0003,
+ 0x81C, 0x41700003,
+ 0x81C, 0x41720003,
+ 0x81C, 0x41740003,
+ 0x81C, 0x41760003,
+ 0x81C, 0x41780003,
+ 0x81C, 0x417A0003,
+ 0x81C, 0x417C0003,
+ 0x81C, 0x417E0003,
+ 0xA0000000, 0x00000000,
+ 0x81C, 0xFE000003,
+ 0x81C, 0xFD020003,
+ 0x81C, 0xFC040003,
+ 0x81C, 0xFB060003,
+ 0x81C, 0xFA080003,
+ 0x81C, 0xF90A0003,
+ 0x81C, 0xF80C0003,
+ 0x81C, 0xF70E0003,
+ 0x81C, 0xF6100003,
+ 0x81C, 0xF5120003,
+ 0x81C, 0xF4140003,
+ 0x81C, 0xF3160003,
+ 0x81C, 0xF2180003,
+ 0x81C, 0xF11A0003,
+ 0x81C, 0xF01C0003,
+ 0x81C, 0xEF1E0003,
+ 0x81C, 0xEE200003,
+ 0x81C, 0xED220003,
+ 0x81C, 0xCF240003,
+ 0x81C, 0xCE260003,
+ 0x81C, 0xCD280003,
+ 0x81C, 0xCC2A0003,
+ 0x81C, 0xCB2C0003,
+ 0x81C, 0xCA2E0003,
+ 0x81C, 0xC9300003,
+ 0x81C, 0xC8320003,
+ 0x81C, 0xC7340003,
+ 0x81C, 0xC6360003,
+ 0x81C, 0xC5380003,
+ 0x81C, 0xC43A0003,
+ 0x81C, 0xA63C0003,
+ 0x81C, 0xA53E0003,
+ 0x81C, 0xA4400003,
+ 0x81C, 0xA3420003,
+ 0x81C, 0xA2440003,
+ 0x81C, 0xA1460003,
+ 0x81C, 0x86480003,
+ 0x81C, 0x854A0003,
+ 0x81C, 0x844C0003,
+ 0x81C, 0x834E0003,
+ 0x81C, 0x66500003,
+ 0x81C, 0x65520003,
+ 0x81C, 0x64540003,
+ 0x81C, 0x63560003,
+ 0x81C, 0x62580003,
+ 0x81C, 0x615A0003,
+ 0x81C, 0x435C0003,
+ 0x81C, 0x425E0003,
+ 0x81C, 0x41600003,
+ 0x81C, 0x27620003,
+ 0x81C, 0x26640003,
+ 0x81C, 0x25660003,
+ 0x81C, 0x24680003,
+ 0x81C, 0x236A0003,
+ 0x81C, 0x226C0003,
+ 0x81C, 0x216E0003,
+ 0x81C, 0x21700003,
+ 0x81C, 0x21720003,
+ 0x81C, 0x21740003,
+ 0x81C, 0x21760003,
+ 0x81C, 0x21780003,
+ 0x81C, 0x217A0003,
+ 0x81C, 0x217C0003,
+ 0x81C, 0x217E0003,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF9000103,
+ 0x81C, 0xF8020103,
+ 0x81C, 0xF7040103,
+ 0x81C, 0xF6060103,
+ 0x81C, 0xF5080103,
+ 0x81C, 0xF40A0103,
+ 0x81C, 0xF30C0103,
+ 0x81C, 0xF20E0103,
+ 0x81C, 0xF1100103,
+ 0x81C, 0xF0120103,
+ 0x81C, 0xEF140103,
+ 0x81C, 0xEE160103,
+ 0x81C, 0xED180103,
+ 0x81C, 0xEC1A0103,
+ 0x81C, 0xEB1C0103,
+ 0x81C, 0xEA1E0103,
+ 0x81C, 0xE9200103,
+ 0x81C, 0xE8220103,
+ 0x81C, 0xE7240103,
+ 0x81C, 0xE6260103,
+ 0x81C, 0xE5280103,
+ 0x81C, 0xE42A0103,
+ 0x81C, 0xE32C0103,
+ 0x81C, 0xC32E0103,
+ 0x81C, 0xC2300103,
+ 0x81C, 0xC1320103,
+ 0x81C, 0xA5340103,
+ 0x81C, 0xA4360103,
+ 0x81C, 0xA3380103,
+ 0x81C, 0xA23A0103,
+ 0x81C, 0xA13C0103,
+ 0x81C, 0x843E0103,
+ 0x81C, 0x83400103,
+ 0x81C, 0x82420103,
+ 0x81C, 0x81440103,
+ 0x81C, 0x64460103,
+ 0x81C, 0x63480103,
+ 0x81C, 0x624A0103,
+ 0x81C, 0x614C0103,
+ 0x81C, 0x444E0103,
+ 0x81C, 0x43500103,
+ 0x81C, 0x42520103,
+ 0x81C, 0x41540103,
+ 0x81C, 0x25560103,
+ 0x81C, 0x24580103,
+ 0x81C, 0x235A0103,
+ 0x81C, 0x065C0103,
+ 0x81C, 0x055E0103,
+ 0x81C, 0x04600103,
+ 0x81C, 0x03620103,
+ 0x81C, 0x02640103,
+ 0x81C, 0x01660103,
+ 0x81C, 0x01680103,
+ 0x81C, 0x016A0103,
+ 0x81C, 0x016C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF8000103,
+ 0x81C, 0xF7020103,
+ 0x81C, 0xF6040103,
+ 0x81C, 0xF5060103,
+ 0x81C, 0xF4080103,
+ 0x81C, 0xF30A0103,
+ 0x81C, 0xF20C0103,
+ 0x81C, 0xF10E0103,
+ 0x81C, 0xF0100103,
+ 0x81C, 0xEF120103,
+ 0x81C, 0xEE140103,
+ 0x81C, 0xED160103,
+ 0x81C, 0xEC180103,
+ 0x81C, 0xEB1A0103,
+ 0x81C, 0xEA1C0103,
+ 0x81C, 0xE91E0103,
+ 0x81C, 0xE8200103,
+ 0x81C, 0xE7220103,
+ 0x81C, 0xE6240103,
+ 0x81C, 0xE5260103,
+ 0x81C, 0xE4280103,
+ 0x81C, 0xE32A0103,
+ 0x81C, 0xE22C0103,
+ 0x81C, 0xE12E0103,
+ 0x81C, 0xA5300103,
+ 0x81C, 0xA4320103,
+ 0x81C, 0xA3340103,
+ 0x81C, 0xA2360103,
+ 0x81C, 0xA1380103,
+ 0x81C, 0x843A0103,
+ 0x81C, 0x833C0103,
+ 0x81C, 0x823E0103,
+ 0x81C, 0x81400103,
+ 0x81C, 0x64420103,
+ 0x81C, 0x63440103,
+ 0x81C, 0x62460103,
+ 0x81C, 0x61480103,
+ 0x81C, 0x454A0103,
+ 0x81C, 0x444C0103,
+ 0x81C, 0x434E0103,
+ 0x81C, 0x42500103,
+ 0x81C, 0x25520103,
+ 0x81C, 0x24540103,
+ 0x81C, 0x23560103,
+ 0x81C, 0x06580103,
+ 0x81C, 0x055A0103,
+ 0x81C, 0x045C0103,
+ 0x81C, 0x035E0103,
+ 0x81C, 0x02600103,
+ 0x81C, 0x01620103,
+ 0x81C, 0x01640103,
+ 0x81C, 0x01660103,
+ 0x81C, 0x01680103,
+ 0x81C, 0x016A0103,
+ 0x81C, 0x016C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFC000103,
+ 0x81C, 0xFB020103,
+ 0x81C, 0xFA040103,
+ 0x81C, 0xF9060103,
+ 0x81C, 0xF8080103,
+ 0x81C, 0xF70A0103,
+ 0x81C, 0xF60C0103,
+ 0x81C, 0xF50E0103,
+ 0x81C, 0xF4100103,
+ 0x81C, 0xF3120103,
+ 0x81C, 0xF2140103,
+ 0x81C, 0xF1160103,
+ 0x81C, 0xF0180103,
+ 0x81C, 0xEF1A0103,
+ 0x81C, 0xEE1C0103,
+ 0x81C, 0xED1E0103,
+ 0x81C, 0xEC200103,
+ 0x81C, 0xEB220103,
+ 0x81C, 0xEA240103,
+ 0x81C, 0xE9260103,
+ 0x81C, 0xE8280103,
+ 0x81C, 0xE72A0103,
+ 0x81C, 0xE62C0103,
+ 0x81C, 0xE52E0103,
+ 0x81C, 0xE4300103,
+ 0x81C, 0xE3320103,
+ 0x81C, 0xE2340103,
+ 0x81C, 0xE1360103,
+ 0x81C, 0x87380103,
+ 0x81C, 0x863A0103,
+ 0x81C, 0x853C0103,
+ 0x81C, 0x843E0103,
+ 0x81C, 0x83400103,
+ 0x81C, 0x82420103,
+ 0x81C, 0x81440103,
+ 0x81C, 0x64460103,
+ 0x81C, 0x63480103,
+ 0x81C, 0x624A0103,
+ 0x81C, 0x464C0103,
+ 0x81C, 0x454E0103,
+ 0x81C, 0x44500103,
+ 0x81C, 0x43520103,
+ 0x81C, 0x26540103,
+ 0x81C, 0x25560103,
+ 0x81C, 0x24580103,
+ 0x81C, 0x075A0103,
+ 0x81C, 0x065C0103,
+ 0x81C, 0x055E0103,
+ 0x81C, 0x04600103,
+ 0x81C, 0x03620103,
+ 0x81C, 0x02640103,
+ 0x81C, 0x01660103,
+ 0x81C, 0x01680103,
+ 0x81C, 0x016A0103,
+ 0x81C, 0x016C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF9000103,
+ 0x81C, 0xF8020103,
+ 0x81C, 0xF7040103,
+ 0x81C, 0xF6060103,
+ 0x81C, 0xF5080103,
+ 0x81C, 0xF40A0103,
+ 0x81C, 0xF30C0103,
+ 0x81C, 0xF20E0103,
+ 0x81C, 0xF1100103,
+ 0x81C, 0xF0120103,
+ 0x81C, 0xEF140103,
+ 0x81C, 0xEE160103,
+ 0x81C, 0xED180103,
+ 0x81C, 0xEC1A0103,
+ 0x81C, 0xEB1C0103,
+ 0x81C, 0xEA1E0103,
+ 0x81C, 0xE9200103,
+ 0x81C, 0xE8220103,
+ 0x81C, 0xE7240103,
+ 0x81C, 0xE6260103,
+ 0x81C, 0xE5280103,
+ 0x81C, 0xE42A0103,
+ 0x81C, 0xE32C0103,
+ 0x81C, 0xE22E0103,
+ 0x81C, 0xA6300103,
+ 0x81C, 0xA5320103,
+ 0x81C, 0xA4340103,
+ 0x81C, 0xA3360103,
+ 0x81C, 0xA2380103,
+ 0x81C, 0xA13A0103,
+ 0x81C, 0x843C0103,
+ 0x81C, 0x833E0103,
+ 0x81C, 0x82400103,
+ 0x81C, 0x81420103,
+ 0x81C, 0x64440103,
+ 0x81C, 0x63460103,
+ 0x81C, 0x62480103,
+ 0x81C, 0x614A0103,
+ 0x81C, 0x444C0103,
+ 0x81C, 0x434E0103,
+ 0x81C, 0x42500103,
+ 0x81C, 0x41520103,
+ 0x81C, 0x25540103,
+ 0x81C, 0x24560103,
+ 0x81C, 0x23580103,
+ 0x81C, 0x225A0103,
+ 0x81C, 0x055C0103,
+ 0x81C, 0x045E0103,
+ 0x81C, 0x03600103,
+ 0x81C, 0x02620103,
+ 0x81C, 0x01640103,
+ 0x81C, 0x01660103,
+ 0x81C, 0x01680103,
+ 0x81C, 0x016A0103,
+ 0x81C, 0x016C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFD000103,
+ 0x81C, 0xFC020103,
+ 0x81C, 0xFB040103,
+ 0x81C, 0xFA060103,
+ 0x81C, 0xF9080103,
+ 0x81C, 0xF80A0103,
+ 0x81C, 0xF70C0103,
+ 0x81C, 0xF60E0103,
+ 0x81C, 0xF5100103,
+ 0x81C, 0xF4120103,
+ 0x81C, 0xF3140103,
+ 0x81C, 0xF2160103,
+ 0x81C, 0xF1180103,
+ 0x81C, 0xF01A0103,
+ 0x81C, 0xEF1C0103,
+ 0x81C, 0xEE1E0103,
+ 0x81C, 0xED200103,
+ 0x81C, 0xEC220103,
+ 0x81C, 0xEB240103,
+ 0x81C, 0xEA260103,
+ 0x81C, 0xE9280103,
+ 0x81C, 0xE82A0103,
+ 0x81C, 0xE72C0103,
+ 0x81C, 0xE62E0103,
+ 0x81C, 0xE5300103,
+ 0x81C, 0xE4320103,
+ 0x81C, 0xE3340103,
+ 0x81C, 0xE2360103,
+ 0x81C, 0xE1380103,
+ 0x81C, 0xA33A0103,
+ 0x81C, 0xA23C0103,
+ 0x81C, 0xA13E0103,
+ 0x81C, 0x84400103,
+ 0x81C, 0x83420103,
+ 0x81C, 0x82440103,
+ 0x81C, 0x81460103,
+ 0x81C, 0x64480103,
+ 0x81C, 0x634A0103,
+ 0x81C, 0x624C0103,
+ 0x81C, 0x614E0103,
+ 0x81C, 0x45500103,
+ 0x81C, 0x44520103,
+ 0x81C, 0x43540103,
+ 0x81C, 0x42560103,
+ 0x81C, 0x25580103,
+ 0x81C, 0x245A0103,
+ 0x81C, 0x235C0103,
+ 0x81C, 0x065E0103,
+ 0x81C, 0x05600103,
+ 0x81C, 0x04620103,
+ 0x81C, 0x03640103,
+ 0x81C, 0x02660103,
+ 0x81C, 0x01680103,
+ 0x81C, 0x016A0103,
+ 0x81C, 0x016C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFA000103,
+ 0x81C, 0xF9020103,
+ 0x81C, 0xF8040103,
+ 0x81C, 0xF7060103,
+ 0x81C, 0xF6080103,
+ 0x81C, 0xF50A0103,
+ 0x81C, 0xF40C0103,
+ 0x81C, 0xF30E0103,
+ 0x81C, 0xF2100103,
+ 0x81C, 0xF1120103,
+ 0x81C, 0xF0140103,
+ 0x81C, 0xEF160103,
+ 0x81C, 0xEE180103,
+ 0x81C, 0xED1A0103,
+ 0x81C, 0xEC1C0103,
+ 0x81C, 0xEB1E0103,
+ 0x81C, 0xEA200103,
+ 0x81C, 0xE9220103,
+ 0x81C, 0xE8240103,
+ 0x81C, 0xE7260103,
+ 0x81C, 0xE6280103,
+ 0x81C, 0xE52A0103,
+ 0x81C, 0xE42C0103,
+ 0x81C, 0xE32E0103,
+ 0x81C, 0xE2300103,
+ 0x81C, 0xE1320103,
+ 0x81C, 0xA5340103,
+ 0x81C, 0xA4360103,
+ 0x81C, 0xA3380103,
+ 0x81C, 0xA23A0103,
+ 0x81C, 0xA13C0103,
+ 0x81C, 0x843E0103,
+ 0x81C, 0x83400103,
+ 0x81C, 0x82420103,
+ 0x81C, 0x81440103,
+ 0x81C, 0x64460103,
+ 0x81C, 0x63480103,
+ 0x81C, 0x624A0103,
+ 0x81C, 0x614C0103,
+ 0x81C, 0x454E0103,
+ 0x81C, 0x44500103,
+ 0x81C, 0x43520103,
+ 0x81C, 0x42540103,
+ 0x81C, 0x41560103,
+ 0x81C, 0x24580103,
+ 0x81C, 0x235A0103,
+ 0x81C, 0x225C0103,
+ 0x81C, 0x055E0103,
+ 0x81C, 0x04600103,
+ 0x81C, 0x03620103,
+ 0x81C, 0x02640103,
+ 0x81C, 0x01660103,
+ 0x81C, 0x01680103,
+ 0x81C, 0x016A0103,
+ 0x81C, 0x016C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFF000103,
+ 0x81C, 0xFF020103,
+ 0x81C, 0xFE040103,
+ 0x81C, 0xFD060103,
+ 0x81C, 0xFC080103,
+ 0x81C, 0xFB0A0103,
+ 0x81C, 0xFA0C0103,
+ 0x81C, 0xF90E0103,
+ 0x81C, 0xF8100103,
+ 0x81C, 0xF7120103,
+ 0x81C, 0xF6140103,
+ 0x81C, 0xF5160103,
+ 0x81C, 0xF4180103,
+ 0x81C, 0xF31A0103,
+ 0x81C, 0xF21C0103,
+ 0x81C, 0xF11E0103,
+ 0x81C, 0xF0200103,
+ 0x81C, 0xEF220103,
+ 0x81C, 0xEE240103,
+ 0x81C, 0xED260103,
+ 0x81C, 0xEC280103,
+ 0x81C, 0xEB2A0103,
+ 0x81C, 0xEA2C0103,
+ 0x81C, 0xE92E0103,
+ 0x81C, 0xE8300103,
+ 0x81C, 0xE7320103,
+ 0x81C, 0xE6340103,
+ 0x81C, 0xE5360103,
+ 0x81C, 0xE4380103,
+ 0x81C, 0xE33A0103,
+ 0x81C, 0xA53C0103,
+ 0x81C, 0xA43E0103,
+ 0x81C, 0xA3400103,
+ 0x81C, 0xA2420103,
+ 0x81C, 0xA1440103,
+ 0x81C, 0x85460103,
+ 0x81C, 0x84480103,
+ 0x81C, 0x834A0103,
+ 0x81C, 0x824C0103,
+ 0x81C, 0x814E0103,
+ 0x81C, 0x64500103,
+ 0x81C, 0x63520103,
+ 0x81C, 0x62540103,
+ 0x81C, 0x44560103,
+ 0x81C, 0x43580103,
+ 0x81C, 0x425A0103,
+ 0x81C, 0x265C0103,
+ 0x81C, 0x255E0103,
+ 0x81C, 0x24600103,
+ 0x81C, 0x07620103,
+ 0x81C, 0x06640103,
+ 0x81C, 0x05660103,
+ 0x81C, 0x04680103,
+ 0x81C, 0x036A0103,
+ 0x81C, 0x026C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF8000103,
+ 0x81C, 0xF7020103,
+ 0x81C, 0xF6040103,
+ 0x81C, 0xF5060103,
+ 0x81C, 0xF4080103,
+ 0x81C, 0xF30A0103,
+ 0x81C, 0xF20C0103,
+ 0x81C, 0xF10E0103,
+ 0x81C, 0xF0100103,
+ 0x81C, 0xEF120103,
+ 0x81C, 0xEE140103,
+ 0x81C, 0xED160103,
+ 0x81C, 0xEC180103,
+ 0x81C, 0xEB1A0103,
+ 0x81C, 0xEA1C0103,
+ 0x81C, 0xE91E0103,
+ 0x81C, 0xE8200103,
+ 0x81C, 0xE7220103,
+ 0x81C, 0xE6240103,
+ 0x81C, 0xE5260103,
+ 0x81C, 0xE4280103,
+ 0x81C, 0xE32A0103,
+ 0x81C, 0xE22C0103,
+ 0x81C, 0xE12E0103,
+ 0x81C, 0xA4300103,
+ 0x81C, 0xA3320103,
+ 0x81C, 0xA2340103,
+ 0x81C, 0xA1360103,
+ 0x81C, 0x85380103,
+ 0x81C, 0x843A0103,
+ 0x81C, 0x833C0103,
+ 0x81C, 0x823E0103,
+ 0x81C, 0x65400103,
+ 0x81C, 0x64420103,
+ 0x81C, 0x63440103,
+ 0x81C, 0x62460103,
+ 0x81C, 0x45480103,
+ 0x81C, 0x444A0103,
+ 0x81C, 0x434C0103,
+ 0x81C, 0x264E0103,
+ 0x81C, 0x25500103,
+ 0x81C, 0x24520103,
+ 0x81C, 0x08540103,
+ 0x81C, 0x07560103,
+ 0x81C, 0x06580103,
+ 0x81C, 0x055A0103,
+ 0x81C, 0x045C0103,
+ 0x81C, 0x035E0103,
+ 0x81C, 0x02600103,
+ 0x81C, 0x01620103,
+ 0x81C, 0x01640103,
+ 0x81C, 0x01660103,
+ 0x81C, 0x01680103,
+ 0x81C, 0x016A0103,
+ 0x81C, 0x016C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFF000103,
+ 0x81C, 0xFF020103,
+ 0x81C, 0xFE040103,
+ 0x81C, 0xFD060103,
+ 0x81C, 0xFC080103,
+ 0x81C, 0xFB0A0103,
+ 0x81C, 0xFA0C0103,
+ 0x81C, 0xF90E0103,
+ 0x81C, 0xF8100103,
+ 0x81C, 0xF7120103,
+ 0x81C, 0xF6140103,
+ 0x81C, 0xF5160103,
+ 0x81C, 0xF4180103,
+ 0x81C, 0xF31A0103,
+ 0x81C, 0xF21C0103,
+ 0x81C, 0xF11E0103,
+ 0x81C, 0xF0200103,
+ 0x81C, 0xEF220103,
+ 0x81C, 0xEE240103,
+ 0x81C, 0xED260103,
+ 0x81C, 0xEC280103,
+ 0x81C, 0xEB2A0103,
+ 0x81C, 0xEA2C0103,
+ 0x81C, 0xE92E0103,
+ 0x81C, 0xE8300103,
+ 0x81C, 0xE7320103,
+ 0x81C, 0xE6340103,
+ 0x81C, 0xE5360103,
+ 0x81C, 0xE4380103,
+ 0x81C, 0xE33A0103,
+ 0x81C, 0xA53C0103,
+ 0x81C, 0xA43E0103,
+ 0x81C, 0xA3400103,
+ 0x81C, 0xA2420103,
+ 0x81C, 0xA1440103,
+ 0x81C, 0x85460103,
+ 0x81C, 0x84480103,
+ 0x81C, 0x834A0103,
+ 0x81C, 0x824C0103,
+ 0x81C, 0x814E0103,
+ 0x81C, 0x64500103,
+ 0x81C, 0x63520103,
+ 0x81C, 0x62540103,
+ 0x81C, 0x44560103,
+ 0x81C, 0x43580103,
+ 0x81C, 0x425A0103,
+ 0x81C, 0x265C0103,
+ 0x81C, 0x255E0103,
+ 0x81C, 0x24600103,
+ 0x81C, 0x07620103,
+ 0x81C, 0x06640103,
+ 0x81C, 0x05660103,
+ 0x81C, 0x04680103,
+ 0x81C, 0x036A0103,
+ 0x81C, 0x026C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF9000103,
+ 0x81C, 0xF8020103,
+ 0x81C, 0xF7040103,
+ 0x81C, 0xF6060103,
+ 0x81C, 0xF5080103,
+ 0x81C, 0xF40A0103,
+ 0x81C, 0xF30C0103,
+ 0x81C, 0xF20E0103,
+ 0x81C, 0xF1100103,
+ 0x81C, 0xF0120103,
+ 0x81C, 0xEF140103,
+ 0x81C, 0xEE160103,
+ 0x81C, 0xED180103,
+ 0x81C, 0xEC1A0103,
+ 0x81C, 0xEB1C0103,
+ 0x81C, 0xEA1E0103,
+ 0x81C, 0xE9200103,
+ 0x81C, 0xE8220103,
+ 0x81C, 0xE7240103,
+ 0x81C, 0xE6260103,
+ 0x81C, 0xE5280103,
+ 0x81C, 0xE42A0103,
+ 0x81C, 0xE32C0103,
+ 0x81C, 0xE22E0103,
+ 0x81C, 0xA6300103,
+ 0x81C, 0xA5320103,
+ 0x81C, 0xA4340103,
+ 0x81C, 0xA3360103,
+ 0x81C, 0xA2380103,
+ 0x81C, 0xA13A0103,
+ 0x81C, 0x843C0103,
+ 0x81C, 0x833E0103,
+ 0x81C, 0x82400103,
+ 0x81C, 0x81420103,
+ 0x81C, 0x64440103,
+ 0x81C, 0x63460103,
+ 0x81C, 0x62480103,
+ 0x81C, 0x614A0103,
+ 0x81C, 0x444C0103,
+ 0x81C, 0x434E0103,
+ 0x81C, 0x42500103,
+ 0x81C, 0x41520103,
+ 0x81C, 0x25540103,
+ 0x81C, 0x24560103,
+ 0x81C, 0x23580103,
+ 0x81C, 0x225A0103,
+ 0x81C, 0x055C0103,
+ 0x81C, 0x045E0103,
+ 0x81C, 0x03600103,
+ 0x81C, 0x02620103,
+ 0x81C, 0x01640103,
+ 0x81C, 0x01660103,
+ 0x81C, 0x01680103,
+ 0x81C, 0x016A0103,
+ 0x81C, 0x016C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFA000103,
+ 0x81C, 0xF9020103,
+ 0x81C, 0xF8040103,
+ 0x81C, 0xF7060103,
+ 0x81C, 0xF6080103,
+ 0x81C, 0xF50A0103,
+ 0x81C, 0xF40C0103,
+ 0x81C, 0xF30E0103,
+ 0x81C, 0xF2100103,
+ 0x81C, 0xF1120103,
+ 0x81C, 0xF0140103,
+ 0x81C, 0xEF160103,
+ 0x81C, 0xEE180103,
+ 0x81C, 0xED1A0103,
+ 0x81C, 0xCC1C0103,
+ 0x81C, 0xCB1E0103,
+ 0x81C, 0xCA200103,
+ 0x81C, 0xE9220103,
+ 0x81C, 0xE8240103,
+ 0x81C, 0xE7260103,
+ 0x81C, 0xE6280103,
+ 0x81C, 0xE42A0103,
+ 0x81C, 0xE32C0103,
+ 0x81C, 0xE22E0103,
+ 0x81C, 0xA7300103,
+ 0x81C, 0xA6320103,
+ 0x81C, 0xA5340103,
+ 0x81C, 0xA4360103,
+ 0x81C, 0xA3380103,
+ 0x81C, 0xA23A0103,
+ 0x81C, 0xA13C0103,
+ 0x81C, 0x843E0103,
+ 0x81C, 0x83400103,
+ 0x81C, 0x82420103,
+ 0x81C, 0x65440103,
+ 0x81C, 0x64460103,
+ 0x81C, 0x63480103,
+ 0x81C, 0x624A0103,
+ 0x81C, 0x614C0103,
+ 0x81C, 0x444E0103,
+ 0x81C, 0x43500103,
+ 0x81C, 0x42520103,
+ 0x81C, 0x41540103,
+ 0x81C, 0x24560103,
+ 0x81C, 0x23580103,
+ 0x81C, 0x055A0103,
+ 0x81C, 0x045C0103,
+ 0x81C, 0x035E0103,
+ 0x81C, 0x02600103,
+ 0x81C, 0x01620103,
+ 0x81C, 0x01640103,
+ 0x81C, 0x01660103,
+ 0x81C, 0x01680103,
+ 0x81C, 0x016A0103,
+ 0x81C, 0x016C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0xA0000000, 0x00000000,
+ 0x81C, 0xFF000103,
+ 0x81C, 0xFE020103,
+ 0x81C, 0xFD040103,
+ 0x81C, 0xFC060103,
+ 0x81C, 0xFB080103,
+ 0x81C, 0xFA0A0103,
+ 0x81C, 0xF90C0103,
+ 0x81C, 0xF80E0103,
+ 0x81C, 0xF7100103,
+ 0x81C, 0xF6120103,
+ 0x81C, 0xF5140103,
+ 0x81C, 0xF4160103,
+ 0x81C, 0xF3180103,
+ 0x81C, 0xF21A0103,
+ 0x81C, 0xF11C0103,
+ 0x81C, 0xF01E0103,
+ 0x81C, 0xEF200103,
+ 0x81C, 0xEE220103,
+ 0x81C, 0xED240103,
+ 0x81C, 0xEC260103,
+ 0x81C, 0xEB280103,
+ 0x81C, 0xEA2A0103,
+ 0x81C, 0xE92C0103,
+ 0x81C, 0xE82E0103,
+ 0x81C, 0xE7300103,
+ 0x81C, 0xE6320103,
+ 0x81C, 0xE5340103,
+ 0x81C, 0xE4360103,
+ 0x81C, 0xE3380103,
+ 0x81C, 0xE23A0103,
+ 0x81C, 0xE13C0103,
+ 0x81C, 0xA43E0103,
+ 0x81C, 0xA3400103,
+ 0x81C, 0xA2420103,
+ 0x81C, 0xA1440103,
+ 0x81C, 0x86460103,
+ 0x81C, 0x85480103,
+ 0x81C, 0x844A0103,
+ 0x81C, 0x834C0103,
+ 0x81C, 0x824E0103,
+ 0x81C, 0x81500103,
+ 0x81C, 0x64520103,
+ 0x81C, 0x63540103,
+ 0x81C, 0x62560103,
+ 0x81C, 0x61580103,
+ 0x81C, 0x435A0103,
+ 0x81C, 0x425C0103,
+ 0x81C, 0x415E0103,
+ 0x81C, 0x25600103,
+ 0x81C, 0x24620103,
+ 0x81C, 0x06640103,
+ 0x81C, 0x05660103,
+ 0x81C, 0x04680103,
+ 0x81C, 0x036A0103,
+ 0x81C, 0x026C0103,
+ 0x81C, 0x016E0103,
+ 0x81C, 0x01700103,
+ 0x81C, 0x01720103,
+ 0x81C, 0x01740103,
+ 0x81C, 0x01760103,
+ 0x81C, 0x01780103,
+ 0x81C, 0x017A0103,
+ 0x81C, 0x017C0103,
+ 0x81C, 0x017E0103,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFA000203,
+ 0x81C, 0xF9020203,
+ 0x81C, 0xF8040203,
+ 0x81C, 0xF7060203,
+ 0x81C, 0xF6080203,
+ 0x81C, 0xF50A0203,
+ 0x81C, 0xF40C0203,
+ 0x81C, 0xF30E0203,
+ 0x81C, 0xF2100203,
+ 0x81C, 0xF1120203,
+ 0x81C, 0xF0140203,
+ 0x81C, 0xEF160203,
+ 0x81C, 0xEE180203,
+ 0x81C, 0xED1A0203,
+ 0x81C, 0xEC1C0203,
+ 0x81C, 0xEB1E0203,
+ 0x81C, 0xEA200203,
+ 0x81C, 0xE9220203,
+ 0x81C, 0xE8240203,
+ 0x81C, 0xE7260203,
+ 0x81C, 0xE6280203,
+ 0x81C, 0xE52A0203,
+ 0x81C, 0xE42C0203,
+ 0x81C, 0xE32E0203,
+ 0x81C, 0xE2300203,
+ 0x81C, 0xE1320203,
+ 0x81C, 0xA5340203,
+ 0x81C, 0xA4360203,
+ 0x81C, 0xA3380203,
+ 0x81C, 0xA23A0203,
+ 0x81C, 0xA13C0203,
+ 0x81C, 0x843E0203,
+ 0x81C, 0x83400203,
+ 0x81C, 0x82420203,
+ 0x81C, 0x81440203,
+ 0x81C, 0x63460203,
+ 0x81C, 0x62480203,
+ 0x81C, 0x614A0203,
+ 0x81C, 0x464C0203,
+ 0x81C, 0x454E0203,
+ 0x81C, 0x44500203,
+ 0x81C, 0x43520203,
+ 0x81C, 0x42540203,
+ 0x81C, 0x41560203,
+ 0x81C, 0x24580203,
+ 0x81C, 0x235A0203,
+ 0x81C, 0x065C0203,
+ 0x81C, 0x055E0203,
+ 0x81C, 0x04600203,
+ 0x81C, 0x03620203,
+ 0x81C, 0x02640203,
+ 0x81C, 0x01660203,
+ 0x81C, 0x01680203,
+ 0x81C, 0x016A0203,
+ 0x81C, 0x016C0203,
+ 0x81C, 0x016E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF8000203,
+ 0x81C, 0xF7020203,
+ 0x81C, 0xF6040203,
+ 0x81C, 0xF5060203,
+ 0x81C, 0xF4080203,
+ 0x81C, 0xF30A0203,
+ 0x81C, 0xF20C0203,
+ 0x81C, 0xF10E0203,
+ 0x81C, 0xF0100203,
+ 0x81C, 0xEF120203,
+ 0x81C, 0xEE140203,
+ 0x81C, 0xED160203,
+ 0x81C, 0xEC180203,
+ 0x81C, 0xEB1A0203,
+ 0x81C, 0xEA1C0203,
+ 0x81C, 0xE91E0203,
+ 0x81C, 0xE8200203,
+ 0x81C, 0xE7220203,
+ 0x81C, 0xE6240203,
+ 0x81C, 0xE5260203,
+ 0x81C, 0xE4280203,
+ 0x81C, 0xE32A0203,
+ 0x81C, 0xE22C0203,
+ 0x81C, 0xE12E0203,
+ 0x81C, 0xA6300203,
+ 0x81C, 0xA5320203,
+ 0x81C, 0xA4340203,
+ 0x81C, 0xA3360203,
+ 0x81C, 0xA2380203,
+ 0x81C, 0x853A0203,
+ 0x81C, 0x843C0203,
+ 0x81C, 0x833E0203,
+ 0x81C, 0x82400203,
+ 0x81C, 0x81420203,
+ 0x81C, 0x64440203,
+ 0x81C, 0x63460203,
+ 0x81C, 0x62480203,
+ 0x81C, 0x614A0203,
+ 0x81C, 0x444C0203,
+ 0x81C, 0x434E0203,
+ 0x81C, 0x42500203,
+ 0x81C, 0x25520203,
+ 0x81C, 0x24540203,
+ 0x81C, 0x23560203,
+ 0x81C, 0x06580203,
+ 0x81C, 0x055A0203,
+ 0x81C, 0x045C0203,
+ 0x81C, 0x035E0203,
+ 0x81C, 0x02600203,
+ 0x81C, 0x01620203,
+ 0x81C, 0x01640203,
+ 0x81C, 0x01660203,
+ 0x81C, 0x01680203,
+ 0x81C, 0x016A0203,
+ 0x81C, 0x016C0203,
+ 0x81C, 0x016E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFC000203,
+ 0x81C, 0xFB020203,
+ 0x81C, 0xFA040203,
+ 0x81C, 0xF9060203,
+ 0x81C, 0xF8080203,
+ 0x81C, 0xF70A0203,
+ 0x81C, 0xF60C0203,
+ 0x81C, 0xF50E0203,
+ 0x81C, 0xF4100203,
+ 0x81C, 0xF3120203,
+ 0x81C, 0xF2140203,
+ 0x81C, 0xF1160203,
+ 0x81C, 0xF0180203,
+ 0x81C, 0xEF1A0203,
+ 0x81C, 0xEE1C0203,
+ 0x81C, 0xED1E0203,
+ 0x81C, 0xEC200203,
+ 0x81C, 0xEB220203,
+ 0x81C, 0xEA240203,
+ 0x81C, 0xE9260203,
+ 0x81C, 0xE8280203,
+ 0x81C, 0xE72A0203,
+ 0x81C, 0xE62C0203,
+ 0x81C, 0xE52E0203,
+ 0x81C, 0xE4300203,
+ 0x81C, 0xE3320203,
+ 0x81C, 0xE2340203,
+ 0x81C, 0xE1360203,
+ 0x81C, 0x87380203,
+ 0x81C, 0x863A0203,
+ 0x81C, 0x853C0203,
+ 0x81C, 0x843E0203,
+ 0x81C, 0x83400203,
+ 0x81C, 0x82420203,
+ 0x81C, 0x81440203,
+ 0x81C, 0x64460203,
+ 0x81C, 0x63480203,
+ 0x81C, 0x624A0203,
+ 0x81C, 0x474C0203,
+ 0x81C, 0x464E0203,
+ 0x81C, 0x45500203,
+ 0x81C, 0x44520203,
+ 0x81C, 0x43540203,
+ 0x81C, 0x42560203,
+ 0x81C, 0x24580203,
+ 0x81C, 0x235A0203,
+ 0x81C, 0x075C0203,
+ 0x81C, 0x065E0203,
+ 0x81C, 0x05600203,
+ 0x81C, 0x04620203,
+ 0x81C, 0x03640203,
+ 0x81C, 0x02660203,
+ 0x81C, 0x01680203,
+ 0x81C, 0x016A0203,
+ 0x81C, 0x016C0203,
+ 0x81C, 0x016E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF8000203,
+ 0x81C, 0xF7020203,
+ 0x81C, 0xF6040203,
+ 0x81C, 0xF5060203,
+ 0x81C, 0xF4080203,
+ 0x81C, 0xF30A0203,
+ 0x81C, 0xF20C0203,
+ 0x81C, 0xF10E0203,
+ 0x81C, 0xF0100203,
+ 0x81C, 0xEF120203,
+ 0x81C, 0xEE140203,
+ 0x81C, 0xED160203,
+ 0x81C, 0xEC180203,
+ 0x81C, 0xEB1A0203,
+ 0x81C, 0xEA1C0203,
+ 0x81C, 0xE91E0203,
+ 0x81C, 0xE8200203,
+ 0x81C, 0xE7220203,
+ 0x81C, 0xE6240203,
+ 0x81C, 0xE5260203,
+ 0x81C, 0xE4280203,
+ 0x81C, 0xE32A0203,
+ 0x81C, 0xE22C0203,
+ 0x81C, 0xE12E0203,
+ 0x81C, 0xA6300203,
+ 0x81C, 0xA5320203,
+ 0x81C, 0xA4340203,
+ 0x81C, 0xA3360203,
+ 0x81C, 0xA2380203,
+ 0x81C, 0xA13A0203,
+ 0x81C, 0x843C0203,
+ 0x81C, 0x833E0203,
+ 0x81C, 0x82400203,
+ 0x81C, 0x81420203,
+ 0x81C, 0x64440203,
+ 0x81C, 0x63460203,
+ 0x81C, 0x62480203,
+ 0x81C, 0x614A0203,
+ 0x81C, 0x444C0203,
+ 0x81C, 0x434E0203,
+ 0x81C, 0x42500203,
+ 0x81C, 0x41520203,
+ 0x81C, 0x25540203,
+ 0x81C, 0x24560203,
+ 0x81C, 0x23580203,
+ 0x81C, 0x065A0203,
+ 0x81C, 0x055C0203,
+ 0x81C, 0x045E0203,
+ 0x81C, 0x03600203,
+ 0x81C, 0x02620203,
+ 0x81C, 0x01640203,
+ 0x81C, 0x01660203,
+ 0x81C, 0x01680203,
+ 0x81C, 0x016A0203,
+ 0x81C, 0x016C0203,
+ 0x81C, 0x016E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFB000203,
+ 0x81C, 0xFA020203,
+ 0x81C, 0xF9040203,
+ 0x81C, 0xF8060203,
+ 0x81C, 0xF7080203,
+ 0x81C, 0xF60A0203,
+ 0x81C, 0xF50C0203,
+ 0x81C, 0xF40E0203,
+ 0x81C, 0xF3100203,
+ 0x81C, 0xF2120203,
+ 0x81C, 0xF1140203,
+ 0x81C, 0xF0160203,
+ 0x81C, 0xEF180203,
+ 0x81C, 0xEE1A0203,
+ 0x81C, 0xED1C0203,
+ 0x81C, 0xEC1E0203,
+ 0x81C, 0xEB200203,
+ 0x81C, 0xEA220203,
+ 0x81C, 0xE9240203,
+ 0x81C, 0xE8260203,
+ 0x81C, 0xE7280203,
+ 0x81C, 0xE62A0203,
+ 0x81C, 0xE52C0203,
+ 0x81C, 0xE42E0203,
+ 0x81C, 0xE3300203,
+ 0x81C, 0xE2320203,
+ 0x81C, 0xE1340203,
+ 0x81C, 0xA5360203,
+ 0x81C, 0xA4380203,
+ 0x81C, 0xA33A0203,
+ 0x81C, 0xA23C0203,
+ 0x81C, 0x843E0203,
+ 0x81C, 0x83400203,
+ 0x81C, 0x82420203,
+ 0x81C, 0x81440203,
+ 0x81C, 0x64460203,
+ 0x81C, 0x63480203,
+ 0x81C, 0x624A0203,
+ 0x81C, 0x614C0203,
+ 0x81C, 0x474E0203,
+ 0x81C, 0x46500203,
+ 0x81C, 0x45520203,
+ 0x81C, 0x44540203,
+ 0x81C, 0x43560203,
+ 0x81C, 0x25580203,
+ 0x81C, 0x245A0203,
+ 0x81C, 0x235C0203,
+ 0x81C, 0x075E0203,
+ 0x81C, 0x06600203,
+ 0x81C, 0x05620203,
+ 0x81C, 0x04640203,
+ 0x81C, 0x03660203,
+ 0x81C, 0x02680203,
+ 0x81C, 0x016A0203,
+ 0x81C, 0x016C0203,
+ 0x81C, 0x016E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFC000203,
+ 0x81C, 0xFB020203,
+ 0x81C, 0xFA040203,
+ 0x81C, 0xF9060203,
+ 0x81C, 0xF8080203,
+ 0x81C, 0xF70A0203,
+ 0x81C, 0xF60C0203,
+ 0x81C, 0xF50E0203,
+ 0x81C, 0xF4100203,
+ 0x81C, 0xF3120203,
+ 0x81C, 0xF2140203,
+ 0x81C, 0xF1160203,
+ 0x81C, 0xF0180203,
+ 0x81C, 0xEF1A0203,
+ 0x81C, 0xEE1C0203,
+ 0x81C, 0xED1E0203,
+ 0x81C, 0xEC200203,
+ 0x81C, 0xEB220203,
+ 0x81C, 0xEA240203,
+ 0x81C, 0xE9260203,
+ 0x81C, 0xE8280203,
+ 0x81C, 0xE72A0203,
+ 0x81C, 0xE62C0203,
+ 0x81C, 0xE52E0203,
+ 0x81C, 0xE4300203,
+ 0x81C, 0xE3320203,
+ 0x81C, 0xE2340203,
+ 0x81C, 0xE1360203,
+ 0x81C, 0xA5380203,
+ 0x81C, 0xA43A0203,
+ 0x81C, 0xA33C0203,
+ 0x81C, 0x853E0203,
+ 0x81C, 0x84400203,
+ 0x81C, 0x83420203,
+ 0x81C, 0x82440203,
+ 0x81C, 0x81460203,
+ 0x81C, 0x64480203,
+ 0x81C, 0x634A0203,
+ 0x81C, 0x624C0203,
+ 0x81C, 0x614E0203,
+ 0x81C, 0x46500203,
+ 0x81C, 0x45520203,
+ 0x81C, 0x44540203,
+ 0x81C, 0x43560203,
+ 0x81C, 0x25580203,
+ 0x81C, 0x245A0203,
+ 0x81C, 0x235C0203,
+ 0x81C, 0x075E0203,
+ 0x81C, 0x06600203,
+ 0x81C, 0x05620203,
+ 0x81C, 0x04640203,
+ 0x81C, 0x03660203,
+ 0x81C, 0x02680203,
+ 0x81C, 0x016A0203,
+ 0x81C, 0x016C0203,
+ 0x81C, 0x016E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFF000203,
+ 0x81C, 0xFF020203,
+ 0x81C, 0xFE040203,
+ 0x81C, 0xFD060203,
+ 0x81C, 0xFC080203,
+ 0x81C, 0xFB0A0203,
+ 0x81C, 0xFA0C0203,
+ 0x81C, 0xF90E0203,
+ 0x81C, 0xF8100203,
+ 0x81C, 0xF7120203,
+ 0x81C, 0xF6140203,
+ 0x81C, 0xF5160203,
+ 0x81C, 0xF4180203,
+ 0x81C, 0xF31A0203,
+ 0x81C, 0xF21C0203,
+ 0x81C, 0xF11E0203,
+ 0x81C, 0xF0200203,
+ 0x81C, 0xEF220203,
+ 0x81C, 0xEE240203,
+ 0x81C, 0xED260203,
+ 0x81C, 0xEC280203,
+ 0x81C, 0xEB2A0203,
+ 0x81C, 0xEA2C0203,
+ 0x81C, 0xE92E0203,
+ 0x81C, 0xE8300203,
+ 0x81C, 0xE7320203,
+ 0x81C, 0xE6340203,
+ 0x81C, 0xE5360203,
+ 0x81C, 0xE4380203,
+ 0x81C, 0xE33A0203,
+ 0x81C, 0xE23C0203,
+ 0x81C, 0xE13E0203,
+ 0x81C, 0xA4400203,
+ 0x81C, 0xA3420203,
+ 0x81C, 0xA2440203,
+ 0x81C, 0xA1460203,
+ 0x81C, 0x84480203,
+ 0x81C, 0x834A0203,
+ 0x81C, 0x824C0203,
+ 0x81C, 0x814E0203,
+ 0x81C, 0x64500203,
+ 0x81C, 0x63520203,
+ 0x81C, 0x62540203,
+ 0x81C, 0x61560203,
+ 0x81C, 0x45580203,
+ 0x81C, 0x445A0203,
+ 0x81C, 0x435C0203,
+ 0x81C, 0x425E0203,
+ 0x81C, 0x24600203,
+ 0x81C, 0x23620203,
+ 0x81C, 0x07640203,
+ 0x81C, 0x06660203,
+ 0x81C, 0x05680203,
+ 0x81C, 0x046A0203,
+ 0x81C, 0x036C0203,
+ 0x81C, 0x026E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF7000203,
+ 0x81C, 0xF6020203,
+ 0x81C, 0xF5040203,
+ 0x81C, 0xF4060203,
+ 0x81C, 0xF3080203,
+ 0x81C, 0xF20A0203,
+ 0x81C, 0xF10C0203,
+ 0x81C, 0xF00E0203,
+ 0x81C, 0xEF100203,
+ 0x81C, 0xEE120203,
+ 0x81C, 0xED140203,
+ 0x81C, 0xEC160203,
+ 0x81C, 0xEB180203,
+ 0x81C, 0xEA1A0203,
+ 0x81C, 0xE91C0203,
+ 0x81C, 0xE81E0203,
+ 0x81C, 0xE7200203,
+ 0x81C, 0xE6220203,
+ 0x81C, 0xE5240203,
+ 0x81C, 0xE4260203,
+ 0x81C, 0xE3280203,
+ 0x81C, 0xE22A0203,
+ 0x81C, 0xA62C0203,
+ 0x81C, 0xA52E0203,
+ 0x81C, 0xA4300203,
+ 0x81C, 0xA3320203,
+ 0x81C, 0xA2340203,
+ 0x81C, 0xA1360203,
+ 0x81C, 0x86380203,
+ 0x81C, 0x853A0203,
+ 0x81C, 0x843C0203,
+ 0x81C, 0x833E0203,
+ 0x81C, 0x65400203,
+ 0x81C, 0x64420203,
+ 0x81C, 0x63440203,
+ 0x81C, 0x46460203,
+ 0x81C, 0x45480203,
+ 0x81C, 0x444A0203,
+ 0x81C, 0x434C0203,
+ 0x81C, 0x264E0203,
+ 0x81C, 0x25500203,
+ 0x81C, 0x24520203,
+ 0x81C, 0x08540203,
+ 0x81C, 0x07560203,
+ 0x81C, 0x06580203,
+ 0x81C, 0x055A0203,
+ 0x81C, 0x045C0203,
+ 0x81C, 0x035E0203,
+ 0x81C, 0x02600203,
+ 0x81C, 0x01620203,
+ 0x81C, 0x01640203,
+ 0x81C, 0x01660203,
+ 0x81C, 0x01680203,
+ 0x81C, 0x016A0203,
+ 0x81C, 0x016C0203,
+ 0x81C, 0x016E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFF000203,
+ 0x81C, 0xFF020203,
+ 0x81C, 0xFE040203,
+ 0x81C, 0xFD060203,
+ 0x81C, 0xFC080203,
+ 0x81C, 0xFB0A0203,
+ 0x81C, 0xFA0C0203,
+ 0x81C, 0xF90E0203,
+ 0x81C, 0xF8100203,
+ 0x81C, 0xF7120203,
+ 0x81C, 0xF6140203,
+ 0x81C, 0xF5160203,
+ 0x81C, 0xF4180203,
+ 0x81C, 0xF31A0203,
+ 0x81C, 0xF21C0203,
+ 0x81C, 0xF11E0203,
+ 0x81C, 0xF0200203,
+ 0x81C, 0xEF220203,
+ 0x81C, 0xEE240203,
+ 0x81C, 0xED260203,
+ 0x81C, 0xEC280203,
+ 0x81C, 0xEB2A0203,
+ 0x81C, 0xEA2C0203,
+ 0x81C, 0xE92E0203,
+ 0x81C, 0xE8300203,
+ 0x81C, 0xE7320203,
+ 0x81C, 0xE6340203,
+ 0x81C, 0xE5360203,
+ 0x81C, 0xE4380203,
+ 0x81C, 0xE33A0203,
+ 0x81C, 0xE23C0203,
+ 0x81C, 0xE13E0203,
+ 0x81C, 0xA4400203,
+ 0x81C, 0xA3420203,
+ 0x81C, 0xA2440203,
+ 0x81C, 0xA1460203,
+ 0x81C, 0x84480203,
+ 0x81C, 0x834A0203,
+ 0x81C, 0x824C0203,
+ 0x81C, 0x814E0203,
+ 0x81C, 0x64500203,
+ 0x81C, 0x63520203,
+ 0x81C, 0x62540203,
+ 0x81C, 0x61560203,
+ 0x81C, 0x45580203,
+ 0x81C, 0x445A0203,
+ 0x81C, 0x435C0203,
+ 0x81C, 0x425E0203,
+ 0x81C, 0x24600203,
+ 0x81C, 0x23620203,
+ 0x81C, 0x07640203,
+ 0x81C, 0x06660203,
+ 0x81C, 0x05680203,
+ 0x81C, 0x046A0203,
+ 0x81C, 0x036C0203,
+ 0x81C, 0x026E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF8000203,
+ 0x81C, 0xF7020203,
+ 0x81C, 0xF6040203,
+ 0x81C, 0xF5060203,
+ 0x81C, 0xF4080203,
+ 0x81C, 0xF30A0203,
+ 0x81C, 0xF20C0203,
+ 0x81C, 0xF10E0203,
+ 0x81C, 0xF0100203,
+ 0x81C, 0xEF120203,
+ 0x81C, 0xEE140203,
+ 0x81C, 0xED160203,
+ 0x81C, 0xEC180203,
+ 0x81C, 0xEB1A0203,
+ 0x81C, 0xEA1C0203,
+ 0x81C, 0xE91E0203,
+ 0x81C, 0xE8200203,
+ 0x81C, 0xE7220203,
+ 0x81C, 0xE6240203,
+ 0x81C, 0xE5260203,
+ 0x81C, 0xE4280203,
+ 0x81C, 0xE32A0203,
+ 0x81C, 0xE22C0203,
+ 0x81C, 0xE12E0203,
+ 0x81C, 0xA6300203,
+ 0x81C, 0xA5320203,
+ 0x81C, 0xA4340203,
+ 0x81C, 0xA3360203,
+ 0x81C, 0xA2380203,
+ 0x81C, 0xA13A0203,
+ 0x81C, 0x843C0203,
+ 0x81C, 0x833E0203,
+ 0x81C, 0x82400203,
+ 0x81C, 0x81420203,
+ 0x81C, 0x64440203,
+ 0x81C, 0x63460203,
+ 0x81C, 0x62480203,
+ 0x81C, 0x614A0203,
+ 0x81C, 0x444C0203,
+ 0x81C, 0x434E0203,
+ 0x81C, 0x42500203,
+ 0x81C, 0x41520203,
+ 0x81C, 0x25540203,
+ 0x81C, 0x24560203,
+ 0x81C, 0x23580203,
+ 0x81C, 0x065A0203,
+ 0x81C, 0x055C0203,
+ 0x81C, 0x045E0203,
+ 0x81C, 0x03600203,
+ 0x81C, 0x02620203,
+ 0x81C, 0x01640203,
+ 0x81C, 0x01660203,
+ 0x81C, 0x01680203,
+ 0x81C, 0x016A0203,
+ 0x81C, 0x016C0203,
+ 0x81C, 0x016E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF9000203,
+ 0x81C, 0xF8020203,
+ 0x81C, 0xF7040203,
+ 0x81C, 0xF6060203,
+ 0x81C, 0xF5080203,
+ 0x81C, 0xF40A0203,
+ 0x81C, 0xF30C0203,
+ 0x81C, 0xF20E0203,
+ 0x81C, 0xF1100203,
+ 0x81C, 0xF0120203,
+ 0x81C, 0xEF140203,
+ 0x81C, 0xCE160203,
+ 0x81C, 0xCD180203,
+ 0x81C, 0xCC1A0203,
+ 0x81C, 0xCB1C0203,
+ 0x81C, 0xCA1E0203,
+ 0x81C, 0xC9200203,
+ 0x81C, 0xC8220203,
+ 0x81C, 0xC7240203,
+ 0x81C, 0xC6260203,
+ 0x81C, 0xC5280203,
+ 0x81C, 0xC42A0203,
+ 0x81C, 0xC32C0203,
+ 0x81C, 0xC22E0203,
+ 0x81C, 0xC1300203,
+ 0x81C, 0xA5320203,
+ 0x81C, 0xA4340203,
+ 0x81C, 0xA3360203,
+ 0x81C, 0xA2380203,
+ 0x81C, 0xA13A0203,
+ 0x81C, 0x853C0203,
+ 0x81C, 0x843E0203,
+ 0x81C, 0x83400203,
+ 0x81C, 0x82420203,
+ 0x81C, 0x81440203,
+ 0x81C, 0x64460203,
+ 0x81C, 0x63480203,
+ 0x81C, 0x624A0203,
+ 0x81C, 0x614C0203,
+ 0x81C, 0x444E0203,
+ 0x81C, 0x43500203,
+ 0x81C, 0x42520203,
+ 0x81C, 0x41540203,
+ 0x81C, 0x24560203,
+ 0x81C, 0x23580203,
+ 0x81C, 0x075A0203,
+ 0x81C, 0x065C0203,
+ 0x81C, 0x055E0203,
+ 0x81C, 0x04600203,
+ 0x81C, 0x03620203,
+ 0x81C, 0x02640203,
+ 0x81C, 0x01660203,
+ 0x81C, 0x01680203,
+ 0x81C, 0x016A0203,
+ 0x81C, 0x016C0203,
+ 0x81C, 0x016E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0xA0000000, 0x00000000,
+ 0x81C, 0xFF000203,
+ 0x81C, 0xFF020203,
+ 0x81C, 0xFE040203,
+ 0x81C, 0xFD060203,
+ 0x81C, 0xFC080203,
+ 0x81C, 0xFB0A0203,
+ 0x81C, 0xFA0C0203,
+ 0x81C, 0xF90E0203,
+ 0x81C, 0xF8100203,
+ 0x81C, 0xF7120203,
+ 0x81C, 0xF6140203,
+ 0x81C, 0xF5160203,
+ 0x81C, 0xF4180203,
+ 0x81C, 0xF31A0203,
+ 0x81C, 0xF21C0203,
+ 0x81C, 0xF11E0203,
+ 0x81C, 0xF0200203,
+ 0x81C, 0xEF220203,
+ 0x81C, 0xEE240203,
+ 0x81C, 0xED260203,
+ 0x81C, 0xEC280203,
+ 0x81C, 0xEB2A0203,
+ 0x81C, 0xEA2C0203,
+ 0x81C, 0xE92E0203,
+ 0x81C, 0xE8300203,
+ 0x81C, 0xE7320203,
+ 0x81C, 0xE6340203,
+ 0x81C, 0xE5360203,
+ 0x81C, 0xE4380203,
+ 0x81C, 0xE33A0203,
+ 0x81C, 0xE23C0203,
+ 0x81C, 0xE13E0203,
+ 0x81C, 0xA4400203,
+ 0x81C, 0xA3420203,
+ 0x81C, 0xA2440203,
+ 0x81C, 0xA1460203,
+ 0x81C, 0x85480203,
+ 0x81C, 0x844A0203,
+ 0x81C, 0x834C0203,
+ 0x81C, 0x824E0203,
+ 0x81C, 0x81500203,
+ 0x81C, 0x64520203,
+ 0x81C, 0x63540203,
+ 0x81C, 0x62560203,
+ 0x81C, 0x61580203,
+ 0x81C, 0x445A0203,
+ 0x81C, 0x435C0203,
+ 0x81C, 0x425E0203,
+ 0x81C, 0x25600203,
+ 0x81C, 0x24620203,
+ 0x81C, 0x06640203,
+ 0x81C, 0x05660203,
+ 0x81C, 0x04680203,
+ 0x81C, 0x036A0203,
+ 0x81C, 0x026C0203,
+ 0x81C, 0x016E0203,
+ 0x81C, 0x01700203,
+ 0x81C, 0x01720203,
+ 0x81C, 0x01740203,
+ 0x81C, 0x01760203,
+ 0x81C, 0x01780203,
+ 0x81C, 0x017A0203,
+ 0x81C, 0x017C0203,
+ 0x81C, 0x017E0203,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF8000303,
+ 0x81C, 0xF7020303,
+ 0x81C, 0xF6040303,
+ 0x81C, 0xF5060303,
+ 0x81C, 0xF4080303,
+ 0x81C, 0xF30A0303,
+ 0x81C, 0xF20C0303,
+ 0x81C, 0xF10E0303,
+ 0x81C, 0xF0100303,
+ 0x81C, 0xEF120303,
+ 0x81C, 0xEE140303,
+ 0x81C, 0xED160303,
+ 0x81C, 0xEC180303,
+ 0x81C, 0xEB1A0303,
+ 0x81C, 0xEA1C0303,
+ 0x81C, 0xE91E0303,
+ 0x81C, 0xE8200303,
+ 0x81C, 0xE7220303,
+ 0x81C, 0xE6240303,
+ 0x81C, 0xE5260303,
+ 0x81C, 0xE4280303,
+ 0x81C, 0xE32A0303,
+ 0x81C, 0xE22C0303,
+ 0x81C, 0xE12E0303,
+ 0x81C, 0xA6300303,
+ 0x81C, 0xA5320303,
+ 0x81C, 0xA4340303,
+ 0x81C, 0xA3360303,
+ 0x81C, 0xA2380303,
+ 0x81C, 0xA13A0303,
+ 0x81C, 0x843C0303,
+ 0x81C, 0x833E0303,
+ 0x81C, 0x82400303,
+ 0x81C, 0x81420303,
+ 0x81C, 0x64440303,
+ 0x81C, 0x63460303,
+ 0x81C, 0x62480303,
+ 0x81C, 0x614A0303,
+ 0x81C, 0x454C0303,
+ 0x81C, 0x444E0303,
+ 0x81C, 0x43500303,
+ 0x81C, 0x42520303,
+ 0x81C, 0x41540303,
+ 0x81C, 0x24560303,
+ 0x81C, 0x23580303,
+ 0x81C, 0x065A0303,
+ 0x81C, 0x055C0303,
+ 0x81C, 0x045E0303,
+ 0x81C, 0x03600303,
+ 0x81C, 0x02620303,
+ 0x81C, 0x01640303,
+ 0x81C, 0x01660303,
+ 0x81C, 0x01680303,
+ 0x81C, 0x016A0303,
+ 0x81C, 0x016C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF7000303,
+ 0x81C, 0xF6020303,
+ 0x81C, 0xF5040303,
+ 0x81C, 0xF4060303,
+ 0x81C, 0xF3080303,
+ 0x81C, 0xF20A0303,
+ 0x81C, 0xF10C0303,
+ 0x81C, 0xF00E0303,
+ 0x81C, 0xEF100303,
+ 0x81C, 0xEE120303,
+ 0x81C, 0xED140303,
+ 0x81C, 0xEC160303,
+ 0x81C, 0xEB180303,
+ 0x81C, 0xEA1A0303,
+ 0x81C, 0xE91C0303,
+ 0x81C, 0xE81E0303,
+ 0x81C, 0xE7200303,
+ 0x81C, 0xE6220303,
+ 0x81C, 0xE5240303,
+ 0x81C, 0xE4260303,
+ 0x81C, 0xE3280303,
+ 0x81C, 0xC32A0303,
+ 0x81C, 0xC22C0303,
+ 0x81C, 0xC12E0303,
+ 0x81C, 0xA5300303,
+ 0x81C, 0xA4320303,
+ 0x81C, 0xA3340303,
+ 0x81C, 0xA2360303,
+ 0x81C, 0xA1380303,
+ 0x81C, 0x853A0303,
+ 0x81C, 0x843C0303,
+ 0x81C, 0x833E0303,
+ 0x81C, 0x82400303,
+ 0x81C, 0x81420303,
+ 0x81C, 0x64440303,
+ 0x81C, 0x63460303,
+ 0x81C, 0x62480303,
+ 0x81C, 0x614A0303,
+ 0x81C, 0x454C0303,
+ 0x81C, 0x444E0303,
+ 0x81C, 0x43500303,
+ 0x81C, 0x25520303,
+ 0x81C, 0x24540303,
+ 0x81C, 0x23560303,
+ 0x81C, 0x06580303,
+ 0x81C, 0x055A0303,
+ 0x81C, 0x045C0303,
+ 0x81C, 0x035E0303,
+ 0x81C, 0x02600303,
+ 0x81C, 0x01620303,
+ 0x81C, 0x01640303,
+ 0x81C, 0x01660303,
+ 0x81C, 0x01680303,
+ 0x81C, 0x016A0303,
+ 0x81C, 0x016C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF9000303,
+ 0x81C, 0xF8020303,
+ 0x81C, 0xF7040303,
+ 0x81C, 0xF6060303,
+ 0x81C, 0xF5080303,
+ 0x81C, 0xF40A0303,
+ 0x81C, 0xF30C0303,
+ 0x81C, 0xF20E0303,
+ 0x81C, 0xF1100303,
+ 0x81C, 0xF0120303,
+ 0x81C, 0xEF140303,
+ 0x81C, 0xEE160303,
+ 0x81C, 0xED180303,
+ 0x81C, 0xEC1A0303,
+ 0x81C, 0xEB1C0303,
+ 0x81C, 0xEA1E0303,
+ 0x81C, 0xE9200303,
+ 0x81C, 0xE8220303,
+ 0x81C, 0xE7240303,
+ 0x81C, 0xE6260303,
+ 0x81C, 0xE5280303,
+ 0x81C, 0xE42A0303,
+ 0x81C, 0xE32C0303,
+ 0x81C, 0xE22E0303,
+ 0x81C, 0xE1300303,
+ 0x81C, 0xA4320303,
+ 0x81C, 0xA3340303,
+ 0x81C, 0xA2360303,
+ 0x81C, 0xA1380303,
+ 0x81C, 0x853A0303,
+ 0x81C, 0x843C0303,
+ 0x81C, 0x833E0303,
+ 0x81C, 0x82400303,
+ 0x81C, 0x81420303,
+ 0x81C, 0x64440303,
+ 0x81C, 0x63460303,
+ 0x81C, 0x62480303,
+ 0x81C, 0x614A0303,
+ 0x81C, 0x444C0303,
+ 0x81C, 0x434E0303,
+ 0x81C, 0x42500303,
+ 0x81C, 0x25520303,
+ 0x81C, 0x24540303,
+ 0x81C, 0x23560303,
+ 0x81C, 0x07580303,
+ 0x81C, 0x065A0303,
+ 0x81C, 0x055C0303,
+ 0x81C, 0x045E0303,
+ 0x81C, 0x03600303,
+ 0x81C, 0x02620303,
+ 0x81C, 0x01640303,
+ 0x81C, 0x01660303,
+ 0x81C, 0x01680303,
+ 0x81C, 0x016A0303,
+ 0x81C, 0x016C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF7000303,
+ 0x81C, 0xF6020303,
+ 0x81C, 0xF5040303,
+ 0x81C, 0xF4060303,
+ 0x81C, 0xF3080303,
+ 0x81C, 0xF20A0303,
+ 0x81C, 0xF10C0303,
+ 0x81C, 0xF00E0303,
+ 0x81C, 0xEF100303,
+ 0x81C, 0xEE120303,
+ 0x81C, 0xED140303,
+ 0x81C, 0xEC160303,
+ 0x81C, 0xEB180303,
+ 0x81C, 0xEA1A0303,
+ 0x81C, 0xE91C0303,
+ 0x81C, 0xE81E0303,
+ 0x81C, 0xE7200303,
+ 0x81C, 0xE6220303,
+ 0x81C, 0xE5240303,
+ 0x81C, 0xE4260303,
+ 0x81C, 0xE3280303,
+ 0x81C, 0xE22A0303,
+ 0x81C, 0xE12C0303,
+ 0x81C, 0xA72E0303,
+ 0x81C, 0xA6300303,
+ 0x81C, 0xA5320303,
+ 0x81C, 0xA4340303,
+ 0x81C, 0xA3360303,
+ 0x81C, 0xA2380303,
+ 0x81C, 0xA13A0303,
+ 0x81C, 0x843C0303,
+ 0x81C, 0x833E0303,
+ 0x81C, 0x82400303,
+ 0x81C, 0x81420303,
+ 0x81C, 0x64440303,
+ 0x81C, 0x63460303,
+ 0x81C, 0x62480303,
+ 0x81C, 0x614A0303,
+ 0x81C, 0x454C0303,
+ 0x81C, 0x444E0303,
+ 0x81C, 0x43500303,
+ 0x81C, 0x42520303,
+ 0x81C, 0x41540303,
+ 0x81C, 0x24560303,
+ 0x81C, 0x23580303,
+ 0x81C, 0x065A0303,
+ 0x81C, 0x055C0303,
+ 0x81C, 0x045E0303,
+ 0x81C, 0x03600303,
+ 0x81C, 0x02620303,
+ 0x81C, 0x01640303,
+ 0x81C, 0x01660303,
+ 0x81C, 0x01680303,
+ 0x81C, 0x016A0303,
+ 0x81C, 0x016C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFB000303,
+ 0x81C, 0xFA020303,
+ 0x81C, 0xF9040303,
+ 0x81C, 0xF8060303,
+ 0x81C, 0xF7080303,
+ 0x81C, 0xF60A0303,
+ 0x81C, 0xF50C0303,
+ 0x81C, 0xF40E0303,
+ 0x81C, 0xF3100303,
+ 0x81C, 0xF2120303,
+ 0x81C, 0xF1140303,
+ 0x81C, 0xF0160303,
+ 0x81C, 0xEF180303,
+ 0x81C, 0xEE1A0303,
+ 0x81C, 0xED1C0303,
+ 0x81C, 0xEC1E0303,
+ 0x81C, 0xEB200303,
+ 0x81C, 0xEA220303,
+ 0x81C, 0xE9240303,
+ 0x81C, 0xE8260303,
+ 0x81C, 0xE7280303,
+ 0x81C, 0xE62A0303,
+ 0x81C, 0xE52C0303,
+ 0x81C, 0xE42E0303,
+ 0x81C, 0xE3300303,
+ 0x81C, 0xE2320303,
+ 0x81C, 0xE1340303,
+ 0x81C, 0xC2360303,
+ 0x81C, 0xC1380303,
+ 0x81C, 0xA33A0303,
+ 0x81C, 0xA23C0303,
+ 0x81C, 0x853E0303,
+ 0x81C, 0x84400303,
+ 0x81C, 0x83420303,
+ 0x81C, 0x66440303,
+ 0x81C, 0x65460303,
+ 0x81C, 0x64480303,
+ 0x81C, 0x634A0303,
+ 0x81C, 0x624C0303,
+ 0x81C, 0x614E0303,
+ 0x81C, 0x45500303,
+ 0x81C, 0x44520303,
+ 0x81C, 0x43540303,
+ 0x81C, 0x42560303,
+ 0x81C, 0x25580303,
+ 0x81C, 0x245A0303,
+ 0x81C, 0x235C0303,
+ 0x81C, 0x065E0303,
+ 0x81C, 0x05600303,
+ 0x81C, 0x04620303,
+ 0x81C, 0x03640303,
+ 0x81C, 0x02660303,
+ 0x81C, 0x01680303,
+ 0x81C, 0x016A0303,
+ 0x81C, 0x016C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF9000303,
+ 0x81C, 0xF8020303,
+ 0x81C, 0xF7040303,
+ 0x81C, 0xF6060303,
+ 0x81C, 0xF5080303,
+ 0x81C, 0xF40A0303,
+ 0x81C, 0xF30C0303,
+ 0x81C, 0xF20E0303,
+ 0x81C, 0xF1100303,
+ 0x81C, 0xF0120303,
+ 0x81C, 0xEF140303,
+ 0x81C, 0xEE160303,
+ 0x81C, 0xED180303,
+ 0x81C, 0xEC1A0303,
+ 0x81C, 0xEB1C0303,
+ 0x81C, 0xEA1E0303,
+ 0x81C, 0xE9200303,
+ 0x81C, 0xE8220303,
+ 0x81C, 0xE7240303,
+ 0x81C, 0xE6260303,
+ 0x81C, 0xE5280303,
+ 0x81C, 0xE42A0303,
+ 0x81C, 0xE32C0303,
+ 0x81C, 0xE22E0303,
+ 0x81C, 0xE1300303,
+ 0x81C, 0xA6320303,
+ 0x81C, 0xA5340303,
+ 0x81C, 0xA4360303,
+ 0x81C, 0xA3380303,
+ 0x81C, 0xA23A0303,
+ 0x81C, 0xA13C0303,
+ 0x81C, 0x853E0303,
+ 0x81C, 0x84400303,
+ 0x81C, 0x83420303,
+ 0x81C, 0x82440303,
+ 0x81C, 0x81460303,
+ 0x81C, 0x64480303,
+ 0x81C, 0x634A0303,
+ 0x81C, 0x624C0303,
+ 0x81C, 0x614E0303,
+ 0x81C, 0x44500303,
+ 0x81C, 0x43520303,
+ 0x81C, 0x42540303,
+ 0x81C, 0x41560303,
+ 0x81C, 0x25580303,
+ 0x81C, 0x245A0303,
+ 0x81C, 0x235C0303,
+ 0x81C, 0x055E0303,
+ 0x81C, 0x04600303,
+ 0x81C, 0x03620303,
+ 0x81C, 0x02640303,
+ 0x81C, 0x01660303,
+ 0x81C, 0x01680303,
+ 0x81C, 0x016A0303,
+ 0x81C, 0x016C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000303,
+ 0x81C, 0xFD020303,
+ 0x81C, 0xFC040303,
+ 0x81C, 0xFB060303,
+ 0x81C, 0xFA080303,
+ 0x81C, 0xF90A0303,
+ 0x81C, 0xF80C0303,
+ 0x81C, 0xF70E0303,
+ 0x81C, 0xF6100303,
+ 0x81C, 0xF5120303,
+ 0x81C, 0xF4140303,
+ 0x81C, 0xF3160303,
+ 0x81C, 0xF2180303,
+ 0x81C, 0xF11A0303,
+ 0x81C, 0xF01C0303,
+ 0x81C, 0xEF1E0303,
+ 0x81C, 0xEE200303,
+ 0x81C, 0xED220303,
+ 0x81C, 0xEC240303,
+ 0x81C, 0xEB260303,
+ 0x81C, 0xEA280303,
+ 0x81C, 0xE92A0303,
+ 0x81C, 0xE82C0303,
+ 0x81C, 0xE72E0303,
+ 0x81C, 0xE6300303,
+ 0x81C, 0xE5320303,
+ 0x81C, 0xE4340303,
+ 0x81C, 0xE3360303,
+ 0x81C, 0xC3380303,
+ 0x81C, 0xC23A0303,
+ 0x81C, 0xC13C0303,
+ 0x81C, 0xA43E0303,
+ 0x81C, 0xA3400303,
+ 0x81C, 0xA2420303,
+ 0x81C, 0xA1440303,
+ 0x81C, 0x85460303,
+ 0x81C, 0x84480303,
+ 0x81C, 0x834A0303,
+ 0x81C, 0x824C0303,
+ 0x81C, 0x814E0303,
+ 0x81C, 0x64500303,
+ 0x81C, 0x63520303,
+ 0x81C, 0x62540303,
+ 0x81C, 0x61560303,
+ 0x81C, 0x44580303,
+ 0x81C, 0x435A0303,
+ 0x81C, 0x425C0303,
+ 0x81C, 0x265E0303,
+ 0x81C, 0x25600303,
+ 0x81C, 0x24620303,
+ 0x81C, 0x06640303,
+ 0x81C, 0x05660303,
+ 0x81C, 0x04680303,
+ 0x81C, 0x036A0303,
+ 0x81C, 0x026C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF7000303,
+ 0x81C, 0xF6020303,
+ 0x81C, 0xF5040303,
+ 0x81C, 0xF4060303,
+ 0x81C, 0xF3080303,
+ 0x81C, 0xF20A0303,
+ 0x81C, 0xF10C0303,
+ 0x81C, 0xF00E0303,
+ 0x81C, 0xEF100303,
+ 0x81C, 0xEE120303,
+ 0x81C, 0xED140303,
+ 0x81C, 0xEC160303,
+ 0x81C, 0xEB180303,
+ 0x81C, 0xEA1A0303,
+ 0x81C, 0xE91C0303,
+ 0x81C, 0xE81E0303,
+ 0x81C, 0xE7200303,
+ 0x81C, 0xE6220303,
+ 0x81C, 0xE5240303,
+ 0x81C, 0xE4260303,
+ 0x81C, 0xE3280303,
+ 0x81C, 0xE22A0303,
+ 0x81C, 0xA62C0303,
+ 0x81C, 0xA52E0303,
+ 0x81C, 0xA4300303,
+ 0x81C, 0xA3320303,
+ 0x81C, 0xA2340303,
+ 0x81C, 0x87360303,
+ 0x81C, 0x86380303,
+ 0x81C, 0x853A0303,
+ 0x81C, 0x843C0303,
+ 0x81C, 0x833E0303,
+ 0x81C, 0x66400303,
+ 0x81C, 0x65420303,
+ 0x81C, 0x64440303,
+ 0x81C, 0x45460303,
+ 0x81C, 0x44480303,
+ 0x81C, 0x434A0303,
+ 0x81C, 0x274C0303,
+ 0x81C, 0x264E0303,
+ 0x81C, 0x25500303,
+ 0x81C, 0x24520303,
+ 0x81C, 0x23540303,
+ 0x81C, 0x08560303,
+ 0x81C, 0x07580303,
+ 0x81C, 0x065A0303,
+ 0x81C, 0x055C0303,
+ 0x81C, 0x045E0303,
+ 0x81C, 0x03600303,
+ 0x81C, 0x02620303,
+ 0x81C, 0x01640303,
+ 0x81C, 0x01660303,
+ 0x81C, 0x01680303,
+ 0x81C, 0x016A0303,
+ 0x81C, 0x016C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xFE000303,
+ 0x81C, 0xFD020303,
+ 0x81C, 0xFC040303,
+ 0x81C, 0xFB060303,
+ 0x81C, 0xFA080303,
+ 0x81C, 0xF90A0303,
+ 0x81C, 0xF80C0303,
+ 0x81C, 0xF70E0303,
+ 0x81C, 0xF6100303,
+ 0x81C, 0xF5120303,
+ 0x81C, 0xF4140303,
+ 0x81C, 0xF3160303,
+ 0x81C, 0xF2180303,
+ 0x81C, 0xF11A0303,
+ 0x81C, 0xF01C0303,
+ 0x81C, 0xEF1E0303,
+ 0x81C, 0xEE200303,
+ 0x81C, 0xED220303,
+ 0x81C, 0xEC240303,
+ 0x81C, 0xEB260303,
+ 0x81C, 0xEA280303,
+ 0x81C, 0xE92A0303,
+ 0x81C, 0xE82C0303,
+ 0x81C, 0xE72E0303,
+ 0x81C, 0xE6300303,
+ 0x81C, 0xE5320303,
+ 0x81C, 0xE4340303,
+ 0x81C, 0xE3360303,
+ 0x81C, 0xC3380303,
+ 0x81C, 0xC23A0303,
+ 0x81C, 0xC13C0303,
+ 0x81C, 0xA43E0303,
+ 0x81C, 0xA3400303,
+ 0x81C, 0xA2420303,
+ 0x81C, 0xA1440303,
+ 0x81C, 0x85460303,
+ 0x81C, 0x84480303,
+ 0x81C, 0x834A0303,
+ 0x81C, 0x824C0303,
+ 0x81C, 0x814E0303,
+ 0x81C, 0x64500303,
+ 0x81C, 0x63520303,
+ 0x81C, 0x62540303,
+ 0x81C, 0x61560303,
+ 0x81C, 0x44580303,
+ 0x81C, 0x435A0303,
+ 0x81C, 0x425C0303,
+ 0x81C, 0x265E0303,
+ 0x81C, 0x25600303,
+ 0x81C, 0x24620303,
+ 0x81C, 0x06640303,
+ 0x81C, 0x05660303,
+ 0x81C, 0x04680303,
+ 0x81C, 0x036A0303,
+ 0x81C, 0x026C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF7000303,
+ 0x81C, 0xF6020303,
+ 0x81C, 0xF5040303,
+ 0x81C, 0xF4060303,
+ 0x81C, 0xF3080303,
+ 0x81C, 0xF20A0303,
+ 0x81C, 0xF10C0303,
+ 0x81C, 0xF00E0303,
+ 0x81C, 0xEF100303,
+ 0x81C, 0xEE120303,
+ 0x81C, 0xED140303,
+ 0x81C, 0xEC160303,
+ 0x81C, 0xEB180303,
+ 0x81C, 0xEA1A0303,
+ 0x81C, 0xE91C0303,
+ 0x81C, 0xE81E0303,
+ 0x81C, 0xE7200303,
+ 0x81C, 0xE6220303,
+ 0x81C, 0xE5240303,
+ 0x81C, 0xE4260303,
+ 0x81C, 0xE3280303,
+ 0x81C, 0xE22A0303,
+ 0x81C, 0xE12C0303,
+ 0x81C, 0xA72E0303,
+ 0x81C, 0xA6300303,
+ 0x81C, 0xA5320303,
+ 0x81C, 0xA4340303,
+ 0x81C, 0xA3360303,
+ 0x81C, 0xA2380303,
+ 0x81C, 0xA13A0303,
+ 0x81C, 0x843C0303,
+ 0x81C, 0x833E0303,
+ 0x81C, 0x82400303,
+ 0x81C, 0x81420303,
+ 0x81C, 0x64440303,
+ 0x81C, 0x63460303,
+ 0x81C, 0x62480303,
+ 0x81C, 0x614A0303,
+ 0x81C, 0x454C0303,
+ 0x81C, 0x444E0303,
+ 0x81C, 0x43500303,
+ 0x81C, 0x42520303,
+ 0x81C, 0x41540303,
+ 0x81C, 0x24560303,
+ 0x81C, 0x23580303,
+ 0x81C, 0x065A0303,
+ 0x81C, 0x055C0303,
+ 0x81C, 0x045E0303,
+ 0x81C, 0x03600303,
+ 0x81C, 0x02620303,
+ 0x81C, 0x01640303,
+ 0x81C, 0x01660303,
+ 0x81C, 0x01680303,
+ 0x81C, 0x016A0303,
+ 0x81C, 0x016C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x81C, 0xF7000303,
+ 0x81C, 0xF6020303,
+ 0x81C, 0xF5040303,
+ 0x81C, 0xF4060303,
+ 0x81C, 0xF3080303,
+ 0x81C, 0xF20A0303,
+ 0x81C, 0xF10C0303,
+ 0x81C, 0xF00E0303,
+ 0x81C, 0xEF100303,
+ 0x81C, 0xEE120303,
+ 0x81C, 0xED140303,
+ 0x81C, 0xEC160303,
+ 0x81C, 0xEB180303,
+ 0x81C, 0xEA1A0303,
+ 0x81C, 0xAF1C0303,
+ 0x81C, 0xAE1E0303,
+ 0x81C, 0xAD200303,
+ 0x81C, 0xAC220303,
+ 0x81C, 0xAB240303,
+ 0x81C, 0xAA260303,
+ 0x81C, 0xC5280303,
+ 0x81C, 0xC42A0303,
+ 0x81C, 0xC32C0303,
+ 0x81C, 0xC22E0303,
+ 0x81C, 0xA5300303,
+ 0x81C, 0xA4320303,
+ 0x81C, 0xA3340303,
+ 0x81C, 0xA2360303,
+ 0x81C, 0xA1380303,
+ 0x81C, 0x853A0303,
+ 0x81C, 0x843C0303,
+ 0x81C, 0x833E0303,
+ 0x81C, 0x82400303,
+ 0x81C, 0x81420303,
+ 0x81C, 0x64440303,
+ 0x81C, 0x63460303,
+ 0x81C, 0x62480303,
+ 0x81C, 0x614A0303,
+ 0x81C, 0x444C0303,
+ 0x81C, 0x434E0303,
+ 0x81C, 0x42500303,
+ 0x81C, 0x41520303,
+ 0x81C, 0x25540303,
+ 0x81C, 0x24560303,
+ 0x81C, 0x06580303,
+ 0x81C, 0x055A0303,
+ 0x81C, 0x045C0303,
+ 0x81C, 0x035E0303,
+ 0x81C, 0x02600303,
+ 0x81C, 0x01620303,
+ 0x81C, 0x01640303,
+ 0x81C, 0x01660303,
+ 0x81C, 0x01680303,
+ 0x81C, 0x016A0303,
+ 0x81C, 0x016C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0xA0000000, 0x00000000,
+ 0x81C, 0xFD000303,
+ 0x81C, 0xFC020303,
+ 0x81C, 0xFB040303,
+ 0x81C, 0xFA060303,
+ 0x81C, 0xF9080303,
+ 0x81C, 0xF80A0303,
+ 0x81C, 0xF70C0303,
+ 0x81C, 0xF60E0303,
+ 0x81C, 0xF5100303,
+ 0x81C, 0xF4120303,
+ 0x81C, 0xF3140303,
+ 0x81C, 0xF2160303,
+ 0x81C, 0xF1180303,
+ 0x81C, 0xF01A0303,
+ 0x81C, 0xEF1C0303,
+ 0x81C, 0xEE1E0303,
+ 0x81C, 0xED200303,
+ 0x81C, 0xEC220303,
+ 0x81C, 0xEB240303,
+ 0x81C, 0xEA260303,
+ 0x81C, 0xE9280303,
+ 0x81C, 0xE82A0303,
+ 0x81C, 0xE72C0303,
+ 0x81C, 0xE62E0303,
+ 0x81C, 0xE5300303,
+ 0x81C, 0xE4320303,
+ 0x81C, 0xE3340303,
+ 0x81C, 0xE2360303,
+ 0x81C, 0xE1380303,
+ 0x81C, 0xA53A0303,
+ 0x81C, 0xA43C0303,
+ 0x81C, 0xA33E0303,
+ 0x81C, 0xA2400303,
+ 0x81C, 0xA1420303,
+ 0x81C, 0x87440303,
+ 0x81C, 0x86460303,
+ 0x81C, 0x85480303,
+ 0x81C, 0x844A0303,
+ 0x81C, 0x834C0303,
+ 0x81C, 0x824E0303,
+ 0x81C, 0x81500303,
+ 0x81C, 0x64520303,
+ 0x81C, 0x63540303,
+ 0x81C, 0x62560303,
+ 0x81C, 0x61580303,
+ 0x81C, 0x435A0303,
+ 0x81C, 0x425C0303,
+ 0x81C, 0x415E0303,
+ 0x81C, 0x07600303,
+ 0x81C, 0x06620303,
+ 0x81C, 0x05640303,
+ 0x81C, 0x04660303,
+ 0x81C, 0x03680303,
+ 0x81C, 0x026A0303,
+ 0x81C, 0x016C0303,
+ 0x81C, 0x016E0303,
+ 0x81C, 0x01700303,
+ 0x81C, 0x01720303,
+ 0x81C, 0x01740303,
+ 0x81C, 0x01760303,
+ 0x81C, 0x01780303,
+ 0x81C, 0x017A0303,
+ 0x81C, 0x017C0303,
+ 0x81C, 0x017E0303,
+ 0xB0000000, 0x00000000,
+ 0xC50, 0x00000022,
+ 0xC50, 0x00000020,
+ 0xE50, 0x00000022,
+ 0xE50, 0x00000020,
+ 0x1850, 0x00000022,
+ 0x1850, 0x00000020,
+ 0x1A50, 0x00000022,
+ 0x1A50, 0x00000020,
+};
+
+RTW_DECL_TABLE_PHY_COND(rtw8814a_agc, rtw_phy_cfg_agc);
+
+static const u32 rtw8814a_bb[] = {
+ 0x800, 0x9020D010,
+ 0x804, 0x08011280,
+ 0x808, 0x0E0282FF,
+ 0x80C, 0x1000002F,
+ 0x80000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x810, 0x33303265,
+ 0xA0000000, 0x00000000,
+ 0x810, 0x33303265,
+ 0xB0000000, 0x00000000,
+ 0x814, 0x020C3D10,
+ 0x818, 0x04A10385,
+ 0x820, 0x00000000,
+ 0x824, 0x00033E40,
+ 0x828, 0x00000000,
+ 0x82C, 0x73985170,
+ 0x830, 0x79A0EA08,
+ 0x834, 0x042E708A,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x838, 0x86667640,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x838, 0x86667641,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x838, 0x86667641,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x838, 0x86667641,
+ 0xA0000000, 0x00000000,
+ 0x838, 0x86667640,
+ 0xB0000000, 0x00000000,
+ 0x83C, 0x9798B9B9,
+ 0x840, 0x17578F60,
+ 0x844, 0x4BBDFCDE,
+ 0x848, 0x5CD07F8B,
+ 0x84C, 0x6CFBF7B5,
+ 0x850, 0x28834706,
+ 0x854, 0x0001520C,
+ 0x858, 0x4060C000,
+ 0x85C, 0x74210368,
+ 0x860, 0x6929C321,
+ 0x864, 0x79727432,
+ 0x868, 0x8CA7A314,
+ 0x86C, 0x438C2878,
+ 0x870, 0x44444444,
+ 0x874, 0x21612C2E,
+ 0x878, 0x00003152,
+ 0x87C, 0x000FC000,
+ 0x8A0, 0x00000013,
+ 0x8A4, 0x7F7F7F7F,
+ 0x8A8, 0xA202033E,
+ 0x8AC, 0xF40F550A,
+ 0x8B0, 0x00000600,
+ 0x8B4, 0x000FC080,
+ 0x8B8, 0xEC0057FF,
+ 0x8BC, 0x8CA520C3,
+ 0x8C0, 0x3FF00020,
+ 0x8C4, 0x44C00000,
+ 0x80000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x8C8, 0x80025969,
+ 0xA0000000, 0x00000000,
+ 0x8C8, 0x80025167,
+ 0xB0000000, 0x00000000,
+ 0x8CC, 0x08250492,
+ 0x8D0, 0x0000B800,
+ 0x8D4, 0x940008A0,
+ 0x8D8, 0x290B5612,
+ 0x8DC, 0x00000000,
+ 0x8E0, 0x32316407,
+ 0x8E4, 0x4A092925,
+ 0x8E8, 0xFFFFC42C,
+ 0x8EC, 0x99999999,
+ 0x8F0, 0x00009999,
+ 0x8F4, 0x00F80FA1,
+ 0x8F8, 0x400082C0,
+ 0x8FC, 0x00000000,
+ 0x900, 0x00400700,
+ 0x90C, 0x09004000,
+ 0x910, 0x0000FC00,
+ 0x914, 0xD6400404,
+ 0x918, 0x1C1028C0,
+ 0x91C, 0x64B11A1C,
+ 0x920, 0xE0767233,
+ 0x924, 0x055AA500,
+ 0x928, 0x4AB0E4E4,
+ 0x92C, 0xFFFE0000,
+ 0x930, 0xFFFFFFFE,
+ 0x934, 0x001FFFFF,
+ 0x938, 0x00008400,
+ 0x93C, 0x932C0642,
+ 0x940, 0x093E9360,
+ 0x944, 0x08000000,
+ 0x948, 0x04000000,
+ 0x950, 0x02010080,
+ 0x954, 0x86510080,
+ 0x960, 0x00000000,
+ 0x964, 0x00000000,
+ 0x968, 0x00000000,
+ 0x96C, 0x00000000,
+ 0x970, 0x801FFFFF,
+ 0x978, 0x00000000,
+ 0x97C, 0x00000000,
+ 0x980, 0x00000000,
+ 0x984, 0x00000000,
+ 0x988, 0x00000000,
+ 0x98C, 0x03440000,
+ 0x990, 0x27100000,
+ 0x994, 0xFFFF0100,
+ 0x998, 0xFFFFFF5C,
+ 0x99C, 0xFFFFFFFF,
+ 0x9A0, 0x000000FF,
+ 0x9A4, 0x00080080,
+ 0x9A8, 0x0C2F0000,
+ 0x9AC, 0x00560000,
+ 0x9B0, 0x81081008,
+ 0x9B4, 0x00000000,
+ 0x9B8, 0x01081008,
+ 0x9BC, 0x01081008,
+ 0x9D0, 0x00000000,
+ 0x9D4, 0x00000000,
+ 0x9D8, 0x00000000,
+ 0x9DC, 0x00000000,
+ 0x9E4, 0x00000002,
+ 0x9E8, 0x000022D5,
+ 0x9FC, 0xEFFFF7FF,
+ 0xB00, 0xE3100000,
+ 0xB04, 0x0000B000,
+ 0xB0C, 0x31EAA006,
+ 0xB5C, 0x41CFFFFF,
+ 0xC00, 0x00000007,
+ 0xC04, 0x00042020,
+ 0xC08, 0x80410231,
+ 0xC0C, 0x00000000,
+ 0xC10, 0x00000100,
+ 0xC14, 0x01000000,
+ 0xC1C, 0x40000053,
+ 0xC50, 0x00000020,
+ 0xC54, 0x00000000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0xC58, 0x3C0A0C14,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0xC58, 0x3C0A0C14,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0xC58, 0x3C0A0C14,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xC58, 0x3C0A0C14,
+ 0xA0000000, 0x00000000,
+ 0xC58, 0x3C020C14,
+ 0xB0000000, 0x00000000,
+ 0xC5C, 0x0D000058,
+ 0xC60, 0x1B800000,
+ 0xC60, 0x0B800001,
+ 0xC60, 0x05800002,
+ 0xC60, 0x07800003,
+ 0xC60, 0x1A800004,
+ 0xC60, 0x0B800005,
+ 0xC60, 0x05800006,
+ 0xC60, 0x0E800007,
+ 0xC60, 0x1A800008,
+ 0xC60, 0x0B800009,
+ 0xC60, 0x1580000A,
+ 0xC60, 0x0880000B,
+ 0xC60, 0x1A80000C,
+ 0xC60, 0x0B80000D,
+ 0xC60, 0x0580000E,
+ 0xC60, 0x0E80000F,
+ 0xC60, 0x1A800010,
+ 0xC60, 0x0B800011,
+ 0xC60, 0x15800012,
+ 0xC60, 0x08800013,
+ 0xC60, 0x1A800014,
+ 0xC60, 0x0B800015,
+ 0xC60, 0x05800016,
+ 0xC60, 0x07800017,
+ 0xC60, 0x1A800018,
+ 0xC60, 0x0B800019,
+ 0xC60, 0x1580001A,
+ 0xC60, 0x0880001B,
+ 0xC60, 0x1B80001C,
+ 0xC60, 0x0B80001D,
+ 0xC60, 0x0580001E,
+ 0xC60, 0x0780001F,
+ 0xC60, 0x1B800020,
+ 0xC60, 0x0B800021,
+ 0xC60, 0x05800022,
+ 0xC60, 0x07800023,
+ 0xC60, 0x1B800024,
+ 0xC60, 0x0B800025,
+ 0xC60, 0x05800026,
+ 0xC60, 0x07800027,
+ 0xC60, 0x1B800028,
+ 0xC60, 0x0B800029,
+ 0xC60, 0x0580002A,
+ 0xC60, 0x0780002B,
+ 0xC60, 0x1B800030,
+ 0xC60, 0x0B800031,
+ 0xC60, 0x05800032,
+ 0xC60, 0x00800033,
+ 0xC60, 0x1B800034,
+ 0xC60, 0x0B800035,
+ 0xC60, 0x05800036,
+ 0xC60, 0x00800037,
+ 0xC60, 0x1B800038,
+ 0xC60, 0x0B800039,
+ 0xC60, 0x0580003A,
+ 0xC60, 0x0E80803B,
+ 0xC94, 0x01000401,
+ 0xC98, 0x00188000,
+ 0xCA0, 0x00002929,
+ 0xCA4, 0x08040201,
+ 0xCA8, 0x80402010,
+ 0xCAC, 0x77777000,
+ 0xCB0, 0x54775477,
+ 0xCB4, 0x54775477,
+ 0xCB8, 0x00500000,
+ 0xCBC, 0x77700000,
+ 0xCC0, 0x00000010,
+ 0xCC8, 0x00000010,
+ 0xE00, 0x00000007,
+ 0xE04, 0x00042020,
+ 0xE08, 0x80410231,
+ 0xE0C, 0x00000000,
+ 0xE10, 0x00000100,
+ 0xE14, 0x01000000,
+ 0xE1C, 0x40000053,
+ 0xE50, 0x00000020,
+ 0xE54, 0x00000000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0xE58, 0x3C0A0C14,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0xE58, 0x3C0A0C14,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0xE58, 0x3C0A0C14,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xE58, 0x3C0A0C14,
+ 0xA0000000, 0x00000000,
+ 0xE58, 0x3C020C14,
+ 0xB0000000, 0x00000000,
+ 0xE5C, 0x0D000058,
+ 0xE60, 0x1B800000,
+ 0xE60, 0x0B800001,
+ 0xE60, 0x05800002,
+ 0xE60, 0x07800003,
+ 0xE60, 0x1A800004,
+ 0xE60, 0x0B800005,
+ 0xE60, 0x05800006,
+ 0xE60, 0x0E800007,
+ 0xE60, 0x1A800008,
+ 0xE60, 0x0B800009,
+ 0xE60, 0x1580000A,
+ 0xE60, 0x0880000B,
+ 0xE60, 0x1A80000C,
+ 0xE60, 0x0B80000D,
+ 0xE60, 0x0580000E,
+ 0xE60, 0x0E80000F,
+ 0xE60, 0x1A800010,
+ 0xE60, 0x0B800011,
+ 0xE60, 0x15800012,
+ 0xE60, 0x08800013,
+ 0xE60, 0x1A800014,
+ 0xE60, 0x0B800015,
+ 0xE60, 0x05800016,
+ 0xE60, 0x07800017,
+ 0xE60, 0x1A800018,
+ 0xE60, 0x0B800019,
+ 0xE60, 0x1580001A,
+ 0xE60, 0x0880001B,
+ 0xE60, 0x1B80001C,
+ 0xE60, 0x0B80001D,
+ 0xE60, 0x0580001E,
+ 0xE60, 0x0780001F,
+ 0xE60, 0x1B800020,
+ 0xE60, 0x0B800021,
+ 0xE60, 0x05800022,
+ 0xE60, 0x07800023,
+ 0xE60, 0x1B800024,
+ 0xE60, 0x0B800025,
+ 0xE60, 0x05800026,
+ 0xE60, 0x07800027,
+ 0xE60, 0x1B800028,
+ 0xE60, 0x0B800029,
+ 0xE60, 0x0580002A,
+ 0xE60, 0x0780002B,
+ 0xE60, 0x1B800030,
+ 0xE60, 0x0B800031,
+ 0xE60, 0x05800032,
+ 0xE60, 0x00800033,
+ 0xE60, 0x1B800034,
+ 0xE60, 0x0B800035,
+ 0xE60, 0x05800036,
+ 0xE60, 0x00800037,
+ 0xE60, 0x1B800038,
+ 0xE60, 0x0B800039,
+ 0xE60, 0x0580003A,
+ 0xE60, 0x0E80803B,
+ 0xE94, 0x01000401,
+ 0xE98, 0x00188000,
+ 0xEA0, 0x00002929,
+ 0xEA4, 0x08040201,
+ 0xEA8, 0x80402010,
+ 0xEAC, 0x77777000,
+ 0xEB0, 0x54775477,
+ 0xEB4, 0x54775477,
+ 0xEB8, 0x00500000,
+ 0xEBC, 0x77700000,
+ 0x1800, 0x00000007,
+ 0x1804, 0x00042020,
+ 0x1808, 0x80410231,
+ 0x180C, 0x00000000,
+ 0x1810, 0x00000100,
+ 0x1814, 0x01000000,
+ 0x181C, 0x40000053,
+ 0x1850, 0x00000020,
+ 0x1854, 0x00000000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1858, 0x3C0A0C14,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1858, 0x3C0A0C14,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1858, 0x3C0A0C14,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1858, 0x3C0A0C14,
+ 0xA0000000, 0x00000000,
+ 0x1858, 0x3C020C14,
+ 0xB0000000, 0x00000000,
+ 0x185C, 0x0D000058,
+ 0x1860, 0x1B800000,
+ 0x1860, 0x0B800001,
+ 0x1860, 0x05800002,
+ 0x1860, 0x07800003,
+ 0x1860, 0x1A800004,
+ 0x1860, 0x0B800005,
+ 0x1860, 0x05800006,
+ 0x1860, 0x0E800007,
+ 0x1860, 0x1A800008,
+ 0x1860, 0x0B800009,
+ 0x1860, 0x1580000A,
+ 0x1860, 0x0880000B,
+ 0x1860, 0x1A80000C,
+ 0x1860, 0x0B80000D,
+ 0x1860, 0x0580000E,
+ 0x1860, 0x0E80000F,
+ 0x1860, 0x1A800010,
+ 0x1860, 0x0B800011,
+ 0x1860, 0x15800012,
+ 0x1860, 0x08800013,
+ 0x1860, 0x1A800014,
+ 0x1860, 0x0B800015,
+ 0x1860, 0x05800016,
+ 0x1860, 0x07800017,
+ 0x1860, 0x1A800018,
+ 0x1860, 0x0B800019,
+ 0x1860, 0x1580001A,
+ 0x1860, 0x0880001B,
+ 0x1860, 0x1B80001C,
+ 0x1860, 0x0B80001D,
+ 0x1860, 0x0580001E,
+ 0x1860, 0x0780001F,
+ 0x1860, 0x1B800020,
+ 0x1860, 0x0B800021,
+ 0x1860, 0x05800022,
+ 0x1860, 0x07800023,
+ 0x1860, 0x1B800024,
+ 0x1860, 0x0B800025,
+ 0x1860, 0x05800026,
+ 0x1860, 0x07800027,
+ 0x1860, 0x1B800028,
+ 0x1860, 0x0B800029,
+ 0x1860, 0x0580002A,
+ 0x1860, 0x0780002B,
+ 0x1860, 0x1B800030,
+ 0x1860, 0x0B800031,
+ 0x1860, 0x05800032,
+ 0x1860, 0x00800033,
+ 0x1860, 0x1B800034,
+ 0x1860, 0x0B800035,
+ 0x1860, 0x05800036,
+ 0x1860, 0x00800037,
+ 0x1860, 0x1B800038,
+ 0x1860, 0x0B800039,
+ 0x1860, 0x0580003A,
+ 0x1860, 0x0E80803B,
+ 0x1894, 0x01000401,
+ 0x1898, 0x00188000,
+ 0x18A0, 0x00002929,
+ 0x18A4, 0x08040201,
+ 0x18A8, 0x80402010,
+ 0x18AC, 0x77777000,
+ 0x18B0, 0x54775477,
+ 0x18B4, 0x54775477,
+ 0x18B8, 0x00500000,
+ 0x18BC, 0x77700000,
+ 0x1A00, 0x00000007,
+ 0x1A04, 0x00042020,
+ 0x1A08, 0x80410231,
+ 0x1A0C, 0x00000000,
+ 0x1A10, 0x00000100,
+ 0x1A14, 0x01000000,
+ 0x1A1C, 0x40000053,
+ 0x1A50, 0x00000020,
+ 0x1A54, 0x00000000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1A58, 0x3C0A0C14,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1A58, 0x3C0A0C14,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1A58, 0x3C0A0C14,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1A58, 0x3C0A0C14,
+ 0xA0000000, 0x00000000,
+ 0x1A58, 0x3C020C14,
+ 0xB0000000, 0x00000000,
+ 0x1A5C, 0x0D000058,
+ 0x1A60, 0x1B800000,
+ 0x1A60, 0x0B800001,
+ 0x1A60, 0x05800002,
+ 0x1A60, 0x07800003,
+ 0x1A60, 0x1A800004,
+ 0x1A60, 0x0B800005,
+ 0x1A60, 0x05800006,
+ 0x1A60, 0x0E800007,
+ 0x1A60, 0x1A800008,
+ 0x1A60, 0x0B800009,
+ 0x1A60, 0x1580000A,
+ 0x1A60, 0x0880000B,
+ 0x1A60, 0x1A80000C,
+ 0x1A60, 0x0B80000D,
+ 0x1A60, 0x0580000E,
+ 0x1A60, 0x0E80000F,
+ 0x1A60, 0x1A800010,
+ 0x1A60, 0x0B800011,
+ 0x1A60, 0x15800012,
+ 0x1A60, 0x08800013,
+ 0x1A60, 0x1A800014,
+ 0x1A60, 0x0B800015,
+ 0x1A60, 0x05800016,
+ 0x1A60, 0x07800017,
+ 0x1A60, 0x1A800018,
+ 0x1A60, 0x0B800019,
+ 0x1A60, 0x1580001A,
+ 0x1A60, 0x0880001B,
+ 0x1A60, 0x1B80001C,
+ 0x1A60, 0x0B80001D,
+ 0x1A60, 0x0580001E,
+ 0x1A60, 0x0780001F,
+ 0x1A60, 0x1B800020,
+ 0x1A60, 0x0B800021,
+ 0x1A60, 0x05800022,
+ 0x1A60, 0x07800023,
+ 0x1A60, 0x1B800024,
+ 0x1A60, 0x0B800025,
+ 0x1A60, 0x05800026,
+ 0x1A60, 0x07800027,
+ 0x1A60, 0x1B800028,
+ 0x1A60, 0x0B800029,
+ 0x1A60, 0x0580002A,
+ 0x1A60, 0x0780002B,
+ 0x1A60, 0x1B800030,
+ 0x1A60, 0x0B800031,
+ 0x1A60, 0x05800032,
+ 0x1A60, 0x00800033,
+ 0x1A60, 0x1B800034,
+ 0x1A60, 0x0B800035,
+ 0x1A60, 0x05800036,
+ 0x1A60, 0x00800037,
+ 0x1A60, 0x1B800038,
+ 0x1A60, 0x0B800039,
+ 0x1A60, 0x0580003A,
+ 0x1A60, 0x0E80803B,
+ 0x1A94, 0x01000401,
+ 0x1A98, 0x00188000,
+ 0x1AA0, 0x00002929,
+ 0x1AA4, 0x08040201,
+ 0x1AA8, 0x80402010,
+ 0x1AAC, 0x77777000,
+ 0x1AB0, 0x54775477,
+ 0x1AB4, 0x54775477,
+ 0x1AB8, 0x00500000,
+ 0x1ABC, 0x77700000,
+ 0x1904, 0x00030000,
+ 0x1914, 0x00030000,
+ 0x1984, 0x03000000,
+ 0x1988, 0x00000087,
+ 0x198C, 0x00000007,
+ 0x1990, 0xFFAA5500,
+ 0x1994, 0x00000077,
+ 0x1998, 0x12801000,
+ 0x1998, 0x12801000,
+ 0x1998, 0x12801001,
+ 0x1998, 0x12801002,
+ 0x1998, 0x12801003,
+ 0x1998, 0x12801004,
+ 0x1998, 0x12801005,
+ 0x1998, 0x12801006,
+ 0x1998, 0x12801007,
+ 0x1998, 0x12801008,
+ 0x1998, 0x12801009,
+ 0x1998, 0x1280100A,
+ 0x1998, 0x1280100B,
+ 0x1998, 0x1280100C,
+ 0x1998, 0x1280100D,
+ 0x1998, 0x1280100E,
+ 0x1998, 0x1280100F,
+ 0x1998, 0x12801010,
+ 0x1998, 0x12801011,
+ 0x1998, 0x12801012,
+ 0x1998, 0x12801013,
+ 0x1998, 0x12801014,
+ 0x1998, 0x12801015,
+ 0x1998, 0x12801016,
+ 0x1998, 0x12801017,
+ 0x1998, 0x12801018,
+ 0x1998, 0x12801019,
+ 0x1998, 0x1280101A,
+ 0x1998, 0x1280101B,
+ 0x1998, 0x1280101C,
+ 0x1998, 0x1280101D,
+ 0x1998, 0x1280101E,
+ 0x1998, 0x1280101F,
+ 0x1998, 0x12801020,
+ 0x1998, 0x12801021,
+ 0x1998, 0x12801022,
+ 0x1998, 0x12801023,
+ 0x1998, 0x1280102C,
+ 0x1998, 0x1280102D,
+ 0x1998, 0x1280102E,
+ 0x1998, 0x1280102F,
+ 0x1998, 0x12801030,
+ 0x1998, 0x12801031,
+ 0x1998, 0x12801032,
+ 0x1998, 0x12801033,
+ 0x1998, 0x12801034,
+ 0x1998, 0x12801035,
+ 0x1998, 0x12801036,
+ 0x1998, 0x12801037,
+ 0x1998, 0x12801038,
+ 0x1998, 0x12801039,
+ 0x1998, 0x1280103A,
+ 0x1998, 0x1280103B,
+ 0x1998, 0x1280103C,
+ 0x1998, 0x1280103D,
+ 0x1998, 0x1280103E,
+ 0x1998, 0x1280103F,
+ 0x1998, 0x12801040,
+ 0x1998, 0x12801041,
+ 0x1998, 0x12801042,
+ 0x1998, 0x12801043,
+ 0x1998, 0x12801044,
+ 0x1998, 0x12801045,
+ 0x1998, 0x12801046,
+ 0x1998, 0x12801047,
+ 0x1998, 0x12801048,
+ 0x1998, 0x12801049,
+ 0x1998, 0x12801100,
+ 0x1998, 0x12801101,
+ 0x1998, 0x12801102,
+ 0x1998, 0x12801103,
+ 0x1998, 0x12801104,
+ 0x1998, 0x12801105,
+ 0x1998, 0x12801106,
+ 0x1998, 0x12801107,
+ 0x1998, 0x12801108,
+ 0x1998, 0x12801109,
+ 0x1998, 0x1280110A,
+ 0x1998, 0x1280110B,
+ 0x1998, 0x1280110C,
+ 0x1998, 0x1280110D,
+ 0x1998, 0x1280110E,
+ 0x1998, 0x1280110F,
+ 0x1998, 0x12801110,
+ 0x1998, 0x12801111,
+ 0x1998, 0x12801112,
+ 0x1998, 0x12801113,
+ 0x1998, 0x12801114,
+ 0x1998, 0x12801115,
+ 0x1998, 0x12801116,
+ 0x1998, 0x12801117,
+ 0x1998, 0x12801118,
+ 0x1998, 0x12801119,
+ 0x1998, 0x1280111A,
+ 0x1998, 0x1280111B,
+ 0x1998, 0x1280111C,
+ 0x1998, 0x1280111D,
+ 0x1998, 0x1280111E,
+ 0x1998, 0x1280111F,
+ 0x1998, 0x12801120,
+ 0x1998, 0x12801121,
+ 0x1998, 0x12801122,
+ 0x1998, 0x12801123,
+ 0x1998, 0x1280112C,
+ 0x1998, 0x1280112D,
+ 0x1998, 0x1280112E,
+ 0x1998, 0x1280112F,
+ 0x1998, 0x12801130,
+ 0x1998, 0x12801131,
+ 0x1998, 0x12801132,
+ 0x1998, 0x12801133,
+ 0x1998, 0x12801134,
+ 0x1998, 0x12801135,
+ 0x1998, 0x12801136,
+ 0x1998, 0x12801137,
+ 0x1998, 0x12801138,
+ 0x1998, 0x12801139,
+ 0x1998, 0x1280113A,
+ 0x1998, 0x1280113B,
+ 0x1998, 0x1280113C,
+ 0x1998, 0x1280113D,
+ 0x1998, 0x1280113E,
+ 0x1998, 0x1280113F,
+ 0x1998, 0x12801140,
+ 0x1998, 0x12801141,
+ 0x1998, 0x12801142,
+ 0x1998, 0x12801143,
+ 0x1998, 0x12801144,
+ 0x1998, 0x12801145,
+ 0x1998, 0x12801146,
+ 0x1998, 0x12801147,
+ 0x1998, 0x12801148,
+ 0x1998, 0x12801149,
+ 0x1998, 0x12801200,
+ 0x1998, 0x12801201,
+ 0x1998, 0x12801202,
+ 0x1998, 0x12801203,
+ 0x1998, 0x12801204,
+ 0x1998, 0x12801205,
+ 0x1998, 0x12801206,
+ 0x1998, 0x12801207,
+ 0x1998, 0x12801208,
+ 0x1998, 0x12801209,
+ 0x1998, 0x1280120A,
+ 0x1998, 0x1280120B,
+ 0x1998, 0x1280120C,
+ 0x1998, 0x1280120D,
+ 0x1998, 0x1280120E,
+ 0x1998, 0x1280120F,
+ 0x1998, 0x12801210,
+ 0x1998, 0x12801211,
+ 0x1998, 0x12801212,
+ 0x1998, 0x12801213,
+ 0x1998, 0x12801214,
+ 0x1998, 0x12801215,
+ 0x1998, 0x12801216,
+ 0x1998, 0x12801217,
+ 0x1998, 0x12801218,
+ 0x1998, 0x12801219,
+ 0x1998, 0x1280121A,
+ 0x1998, 0x1280121B,
+ 0x1998, 0x1280121C,
+ 0x1998, 0x1280121D,
+ 0x1998, 0x1280121E,
+ 0x1998, 0x1280121F,
+ 0x1998, 0x12801220,
+ 0x1998, 0x12801221,
+ 0x1998, 0x12801222,
+ 0x1998, 0x12801223,
+ 0x1998, 0x1280122C,
+ 0x1998, 0x1280122D,
+ 0x1998, 0x1280122E,
+ 0x1998, 0x1280122F,
+ 0x1998, 0x12801230,
+ 0x1998, 0x12801231,
+ 0x1998, 0x12801232,
+ 0x1998, 0x12801233,
+ 0x1998, 0x12801234,
+ 0x1998, 0x12801235,
+ 0x1998, 0x12801236,
+ 0x1998, 0x12801237,
+ 0x1998, 0x12801238,
+ 0x1998, 0x12801239,
+ 0x1998, 0x1280123A,
+ 0x1998, 0x1280123B,
+ 0x1998, 0x1280123C,
+ 0x1998, 0x1280123D,
+ 0x1998, 0x1280123E,
+ 0x1998, 0x1280123F,
+ 0x1998, 0x12801240,
+ 0x1998, 0x12801241,
+ 0x1998, 0x12801242,
+ 0x1998, 0x12801243,
+ 0x1998, 0x12801244,
+ 0x1998, 0x12801245,
+ 0x1998, 0x12801246,
+ 0x1998, 0x12801247,
+ 0x1998, 0x12801248,
+ 0x1998, 0x12801249,
+ 0x1998, 0x12801300,
+ 0x1998, 0x12801301,
+ 0x1998, 0x12801302,
+ 0x1998, 0x12801303,
+ 0x1998, 0x12801304,
+ 0x1998, 0x12801305,
+ 0x1998, 0x12801306,
+ 0x1998, 0x12801307,
+ 0x1998, 0x12801308,
+ 0x1998, 0x12801309,
+ 0x1998, 0x1280130A,
+ 0x1998, 0x1280130B,
+ 0x1998, 0x1280130C,
+ 0x1998, 0x1280130D,
+ 0x1998, 0x1280130E,
+ 0x1998, 0x1280130F,
+ 0x1998, 0x12801310,
+ 0x1998, 0x12801311,
+ 0x1998, 0x12801312,
+ 0x1998, 0x12801313,
+ 0x1998, 0x12801314,
+ 0x1998, 0x12801315,
+ 0x1998, 0x12801316,
+ 0x1998, 0x12801317,
+ 0x1998, 0x12801318,
+ 0x1998, 0x12801319,
+ 0x1998, 0x1280131A,
+ 0x1998, 0x1280131B,
+ 0x1998, 0x1280131C,
+ 0x1998, 0x1280131D,
+ 0x1998, 0x1280131E,
+ 0x1998, 0x1280131F,
+ 0x1998, 0x12801320,
+ 0x1998, 0x12801321,
+ 0x1998, 0x12801322,
+ 0x1998, 0x12801323,
+ 0x1998, 0x1280132C,
+ 0x1998, 0x1280132D,
+ 0x1998, 0x1280132E,
+ 0x1998, 0x1280132F,
+ 0x1998, 0x12801330,
+ 0x1998, 0x12801331,
+ 0x1998, 0x12801332,
+ 0x1998, 0x12801333,
+ 0x1998, 0x12801334,
+ 0x1998, 0x12801335,
+ 0x1998, 0x12801336,
+ 0x1998, 0x12801337,
+ 0x1998, 0x12801338,
+ 0x1998, 0x12801339,
+ 0x1998, 0x1280133A,
+ 0x1998, 0x1280133B,
+ 0x1998, 0x1280133C,
+ 0x1998, 0x1280133D,
+ 0x1998, 0x1280133E,
+ 0x1998, 0x1280133F,
+ 0x1998, 0x12801340,
+ 0x1998, 0x12801341,
+ 0x1998, 0x12801342,
+ 0x1998, 0x12801343,
+ 0x1998, 0x12801344,
+ 0x1998, 0x12801345,
+ 0x1998, 0x12801346,
+ 0x1998, 0x12801347,
+ 0x1998, 0x12801348,
+ 0x1998, 0x12801349,
+ 0x19D4, 0x88888888,
+ 0x19D8, 0x00000888,
+ 0xB00, 0xE3100100,
+ 0xB00, 0xE7100100,
+ 0xC60, 0x15808002,
+ 0xC60, 0x01808003,
+ 0xE60, 0x15808002,
+ 0xE60, 0x01808003,
+ 0x1860, 0x15808002,
+ 0x1860, 0x01808003,
+ 0x1A60, 0x15808002,
+ 0x1A60, 0x01808003,
+ 0xB00, 0xE3100100,
+ 0xC5C, 0x0D080058,
+ 0xE5C, 0x0D080058,
+ 0x185C, 0x0D080058,
+ 0x1A5C, 0x0D080058,
+ 0xC5C, 0x0D000058,
+ 0xE5C, 0x0D000058,
+ 0x185C, 0x0D000058,
+ 0x1A5C, 0x0D000058,
+ 0xC60, 0x05808002,
+ 0xC60, 0x0E808003,
+ 0xE60, 0x05808002,
+ 0xE60, 0x0E808003,
+ 0x1860, 0x05808002,
+ 0x1860, 0x0E808003,
+ 0x1A60, 0x05808002,
+ 0x1A60, 0x0E808003,
+ 0xB00, 0xE7100100,
+ 0xB00, 0xE3100100,
+ 0xB00, 0xE3100000,
+ 0x1C38, 0x00000002,
+ 0xA00, 0x00D047C8,
+ 0xA04, 0x46FF800C,
+ 0xA08, 0x8C838300,
+ 0xA0C, 0x2E7E000F,
+ 0xA10, 0x9500BB78,
+ 0xA14, 0x11144028,
+ 0xA18, 0x00881117,
+ 0xA1C, 0x89140F00,
+ 0xA20, 0x1A1B0030,
+ 0xA24, 0x090E1317,
+ 0xA28, 0x00000204,
+ 0xA2C, 0x00900000,
+ 0xA70, 0x101FFF00,
+ 0xA74, 0x00000128,
+ 0xA78, 0x00000900,
+ 0xA7C, 0x225B0606,
+ 0xA80, 0x218075B2,
+ 0xA84, 0x9C1F8C00,
+ 0x1B04, 0xE24628D2,
+ 0x1B10, 0x88010D46,
+ 0x1B14, 0x00000000,
+ 0x1B18, 0x00292903,
+ 0x1B00, 0xF8000000,
+ 0x1B00, 0xF800D000,
+ 0x1B00, 0xF801F000,
+ 0x1B1C, 0xA2123DB2,
+ 0x1B20, 0x07040001,
+ 0x1B24, 0x07060807,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0xA0000000, 0x00000000,
+ 0x1B28, 0xC0060348,
+ 0xB0000000, 0x00000000,
+ 0x1B2C, 0x20000003,
+ 0x1B30, 0x20000000,
+ 0x1B38, 0x20000000,
+ 0x1B3C, 0x20000000,
+ 0x1BD4, 0x00000001,
+ 0x1B94, 0x80000000,
+ 0x1B34, 0x00000000,
+ 0x1B34, 0x00000002,
+ 0x1B34, 0x00000000,
+ 0x1B00, 0xF8000002,
+ 0x1B00, 0xF800D002,
+ 0x1B00, 0xF801F002,
+ 0x1B1C, 0xA2123DB2,
+ 0x1B20, 0x07040001,
+ 0x1B24, 0x07060807,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0xA0000000, 0x00000000,
+ 0x1B28, 0xC0060348,
+ 0xB0000000, 0x00000000,
+ 0x1B2C, 0x20000003,
+ 0x1B30, 0x20000000,
+ 0x1B38, 0x20000000,
+ 0x1B3C, 0x20000000,
+ 0x1BD4, 0x00000001,
+ 0x1B94, 0x80000000,
+ 0x1B34, 0x00000000,
+ 0x1B34, 0x00000002,
+ 0x1B34, 0x00000000,
+ 0x1B00, 0xF8000004,
+ 0x1B00, 0xF800D004,
+ 0x1B00, 0xF801F004,
+ 0x1B1C, 0xA2123DB2,
+ 0x1B20, 0x07040001,
+ 0x1B24, 0x07060807,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0xA0000000, 0x00000000,
+ 0x1B28, 0xC0060348,
+ 0xB0000000, 0x00000000,
+ 0x1B2C, 0x20000003,
+ 0x1B30, 0x20000000,
+ 0x1B38, 0x20000000,
+ 0x1B3C, 0x20000000,
+ 0x1BD4, 0x00000001,
+ 0x1B94, 0x80000000,
+ 0x1B34, 0x00000000,
+ 0x1B34, 0x00000002,
+ 0x1B34, 0x00000000,
+ 0x1B00, 0xF8000006,
+ 0x1B00, 0xF800D006,
+ 0x1B00, 0xF801F006,
+ 0x1B1C, 0xA2123DB2,
+ 0x1B20, 0x07040001,
+ 0x1B24, 0x07060807,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B28, 0xC0060324,
+ 0xA0000000, 0x00000000,
+ 0x1B28, 0xC0060348,
+ 0xB0000000, 0x00000000,
+ 0x1B2C, 0x20000003,
+ 0x1B30, 0x20000000,
+ 0x1B38, 0x20000000,
+ 0x1B3C, 0x20000000,
+ 0x1BD4, 0x00000001,
+ 0x1B94, 0x80000000,
+ 0x1B34, 0x00000000,
+ 0x1B34, 0x00000002,
+ 0x1B34, 0x00000000,
+ 0x1B00, 0xF8000000,
+ 0x1B80, 0x00000007,
+ 0x1B80, 0x09060005,
+ 0x1B80, 0x09060007,
+ 0x1B80, 0x0FFE0015,
+ 0x1B80, 0x0FFE0017,
+ 0x1B80, 0x00240025,
+ 0x1B80, 0x00240027,
+ 0x1B80, 0x00040035,
+ 0x1B80, 0x00040037,
+ 0x1B80, 0x05C00045,
+ 0x1B80, 0x05C00047,
+ 0x1B80, 0x00070055,
+ 0x1B80, 0x00070057,
+ 0x1B80, 0x64000065,
+ 0x1B80, 0x64000067,
+ 0x1B80, 0x00020075,
+ 0x1B80, 0x00020077,
+ 0x1B80, 0x00080085,
+ 0x1B80, 0x00080087,
+ 0x1B80, 0x80000095,
+ 0x1B80, 0x80000097,
+ 0x1B80, 0x090100A5,
+ 0x1B80, 0x090100A7,
+ 0x1B80, 0x0F0200B5,
+ 0x1B80, 0x0F0200B7,
+ 0x1B80, 0x002400C5,
+ 0x1B80, 0x002400C7,
+ 0x1B80, 0x000400D5,
+ 0x1B80, 0x000400D7,
+ 0x1B80, 0x05C000E5,
+ 0x1B80, 0x05C000E7,
+ 0x1B80, 0x000700F5,
+ 0x1B80, 0x000700F7,
+ 0x1B80, 0x64020105,
+ 0x1B80, 0x64020107,
+ 0x1B80, 0x00020115,
+ 0x1B80, 0x00020117,
+ 0x1B80, 0x00040125,
+ 0x1B80, 0x00040127,
+ 0x1B80, 0x4A000135,
+ 0x1B80, 0x4A000137,
+ 0x1B80, 0x4B040145,
+ 0x1B80, 0x4B040147,
+ 0x1B80, 0x85030155,
+ 0x1B80, 0x85030157,
+ 0x1B80, 0x40010165,
+ 0x1B80, 0x40010167,
+ 0x1B80, 0xE0290175,
+ 0x1B80, 0xE0290177,
+ 0x1B80, 0x00040185,
+ 0x1B80, 0x00040187,
+ 0x1B80, 0x4B050195,
+ 0x1B80, 0x4B050197,
+ 0x1B80, 0x860301A5,
+ 0x1B80, 0x860301A7,
+ 0x1B80, 0x400301B5,
+ 0x1B80, 0x400301B7,
+ 0x1B80, 0xE02901C5,
+ 0x1B80, 0xE02901C7,
+ 0x1B80, 0x000401D5,
+ 0x1B80, 0x000401D7,
+ 0x1B80, 0x4B0601E5,
+ 0x1B80, 0x4B0601E7,
+ 0x1B80, 0x870301F5,
+ 0x1B80, 0x870301F7,
+ 0x1B80, 0x40050205,
+ 0x1B80, 0x40050207,
+ 0x1B80, 0xE0290215,
+ 0x1B80, 0xE0290217,
+ 0x1B80, 0x00040225,
+ 0x1B80, 0x00040227,
+ 0x1B80, 0x4B070235,
+ 0x1B80, 0x4B070237,
+ 0x1B80, 0x88030245,
+ 0x1B80, 0x88030247,
+ 0x1B80, 0x40070255,
+ 0x1B80, 0x40070257,
+ 0x1B80, 0xE0290265,
+ 0x1B80, 0xE0290267,
+ 0x1B80, 0x4B000275,
+ 0x1B80, 0x4B000277,
+ 0x1B80, 0x30000285,
+ 0x1B80, 0x30000287,
+ 0x1B80, 0xFE100295,
+ 0x1B80, 0xFE100297,
+ 0x1B80, 0xFF1002A5,
+ 0x1B80, 0xFF1002A7,
+ 0x1B80, 0xE18602B5,
+ 0x1B80, 0xE18602B7,
+ 0x1B80, 0xF00A02C5,
+ 0x1B80, 0xF00A02C7,
+ 0x1B80, 0xF10A02D5,
+ 0x1B80, 0xF10A02D7,
+ 0x1B80, 0xF20A02E5,
+ 0x1B80, 0xF20A02E7,
+ 0x1B80, 0xF30802F5,
+ 0x1B80, 0xF30802F7,
+ 0x1B80, 0xF4070305,
+ 0x1B80, 0xF4070307,
+ 0x1B80, 0xF5060315,
+ 0x1B80, 0xF5060317,
+ 0x1B80, 0xF7060325,
+ 0x1B80, 0xF7060327,
+ 0x1B80, 0xF8050335,
+ 0x1B80, 0xF8050337,
+ 0x1B80, 0xF9040345,
+ 0x1B80, 0xF9040347,
+ 0x1B80, 0x00010355,
+ 0x1B80, 0x00010357,
+ 0x1B80, 0x303B0365,
+ 0x1B80, 0x303B0367,
+ 0x1B80, 0x30500375,
+ 0x1B80, 0x30500377,
+ 0x1B80, 0x305C0385,
+ 0x1B80, 0x305C0387,
+ 0x1B80, 0x31D50395,
+ 0x1B80, 0x31D50397,
+ 0x1B80, 0x31C503A5,
+ 0x1B80, 0x31C503A7,
+ 0x1B80, 0x4D0403B5,
+ 0x1B80, 0x4D0403B7,
+ 0x1B80, 0x2EF003C5,
+ 0x1B80, 0x2EF003C7,
+ 0x1B80, 0x000203D5,
+ 0x1B80, 0x000203D7,
+ 0x1B80, 0x208003E5,
+ 0x1B80, 0x208003E7,
+ 0x1B80, 0x000003F5,
+ 0x1B80, 0x000003F7,
+ 0x1B80, 0x4D000405,
+ 0x1B80, 0x4D000407,
+ 0x1B80, 0x55070415,
+ 0x1B80, 0x55070417,
+ 0x1B80, 0xE1230425,
+ 0x1B80, 0xE1230427,
+ 0x1B80, 0xE1230435,
+ 0x1B80, 0xE1230437,
+ 0x1B80, 0x4D040445,
+ 0x1B80, 0x4D040447,
+ 0x1B80, 0x20800455,
+ 0x1B80, 0x20800457,
+ 0x1B80, 0x84000465,
+ 0x1B80, 0x84000467,
+ 0x1B80, 0x4D000475,
+ 0x1B80, 0x4D000477,
+ 0x1B80, 0x550F0485,
+ 0x1B80, 0x550F0487,
+ 0x1B80, 0xE1230495,
+ 0x1B80, 0xE1230497,
+ 0x1B80, 0x4F0204A5,
+ 0x1B80, 0x4F0204A7,
+ 0x1B80, 0x4E0004B5,
+ 0x1B80, 0x4E0004B7,
+ 0x1B80, 0x530204C5,
+ 0x1B80, 0x530204C7,
+ 0x1B80, 0x520104D5,
+ 0x1B80, 0x520104D7,
+ 0x1B80, 0xE12704E5,
+ 0x1B80, 0xE12704E7,
+ 0x1B80, 0x000104F5,
+ 0x1B80, 0x000104F7,
+ 0x1B80, 0x5C720505,
+ 0x1B80, 0x5C720507,
+ 0x1B80, 0xE1320515,
+ 0x1B80, 0xE1320517,
+ 0x1B80, 0x54E50525,
+ 0x1B80, 0x54E50527,
+ 0x1B80, 0x54BF0535,
+ 0x1B80, 0x54BF0537,
+ 0x1B80, 0x54C50545,
+ 0x1B80, 0x54C50547,
+ 0x1B80, 0x54BE0555,
+ 0x1B80, 0x54BE0557,
+ 0x1B80, 0x54DF0565,
+ 0x1B80, 0x54DF0567,
+ 0x1B80, 0x0BA60575,
+ 0x1B80, 0x0BA60577,
+ 0x1B80, 0xF3130585,
+ 0x1B80, 0xF3130587,
+ 0x1B80, 0xF41E0595,
+ 0x1B80, 0xF41E0597,
+ 0x1B80, 0xF53C05A5,
+ 0x1B80, 0xF53C05A7,
+ 0x1B80, 0x000105B5,
+ 0x1B80, 0x000105B7,
+ 0x1B80, 0x620605C5,
+ 0x1B80, 0x620605C7,
+ 0x1B80, 0x600605D5,
+ 0x1B80, 0x600605D7,
+ 0x1B80, 0xE1A905E5,
+ 0x1B80, 0xE1A905E7,
+ 0x1B80, 0x0C0005F5,
+ 0x1B80, 0x0C0005F7,
+ 0x1B80, 0x5C720605,
+ 0x1B80, 0x5C720607,
+ 0x1B80, 0xE1320615,
+ 0x1B80, 0xE1320617,
+ 0x1B80, 0x5CF10625,
+ 0x1B80, 0x5CF10627,
+ 0x1B80, 0x0C010635,
+ 0x1B80, 0x0C010637,
+ 0x1B80, 0xF2020645,
+ 0x1B80, 0xF2020647,
+ 0x1B80, 0x30D60655,
+ 0x1B80, 0x30D60657,
+ 0x1B80, 0x0AC60665,
+ 0x1B80, 0x0AC60667,
+ 0x1B80, 0xE1B60675,
+ 0x1B80, 0xE1B60677,
+ 0x1B80, 0xE1580685,
+ 0x1B80, 0xE1580687,
+ 0x1B80, 0x54E50695,
+ 0x1B80, 0x54E50697,
+ 0x1B80, 0x000106A5,
+ 0x1B80, 0x000106A7,
+ 0x1B80, 0x560106B5,
+ 0x1B80, 0x560106B7,
+ 0x1B80, 0x5CE206C5,
+ 0x1B80, 0x5CE206C7,
+ 0x1B80, 0x0AE106D5,
+ 0x1B80, 0x0AE106D7,
+ 0x1B80, 0x630C06E5,
+ 0x1B80, 0x630C06E7,
+ 0x1B80, 0xE13F06F5,
+ 0x1B80, 0xE13F06F7,
+ 0x1B80, 0x00270705,
+ 0x1B80, 0x00270707,
+ 0x1B80, 0xE16C0715,
+ 0x1B80, 0xE16C0717,
+ 0x1B80, 0x00020725,
+ 0x1B80, 0x00020727,
+ 0x1B80, 0x002A0735,
+ 0x1B80, 0x002A0737,
+ 0x1B80, 0x07140745,
+ 0x1B80, 0x07140747,
+ 0x1B80, 0x00020755,
+ 0x1B80, 0x00020757,
+ 0x1B80, 0x30C30765,
+ 0x1B80, 0x30C30767,
+ 0x1B80, 0x56010775,
+ 0x1B80, 0x56010777,
+ 0x1B80, 0x5CE20785,
+ 0x1B80, 0x5CE20787,
+ 0x1B80, 0x0AE10795,
+ 0x1B80, 0x0AE10797,
+ 0x1B80, 0x631707A5,
+ 0x1B80, 0x631707A7,
+ 0x1B80, 0xE13F07B5,
+ 0x1B80, 0xE13F07B7,
+ 0x1B80, 0x002507C5,
+ 0x1B80, 0x002507C7,
+ 0x1B80, 0xE16C07D5,
+ 0x1B80, 0xE16C07D7,
+ 0x1B80, 0x000207E5,
+ 0x1B80, 0x000207E7,
+ 0x1B80, 0x630F07F5,
+ 0x1B80, 0x630F07F7,
+ 0x1B80, 0xE13F0805,
+ 0x1B80, 0xE13F0807,
+ 0x1B80, 0x63070815,
+ 0x1B80, 0x63070817,
+ 0x1B80, 0xE13F0825,
+ 0x1B80, 0xE13F0827,
+ 0x1B80, 0x07140835,
+ 0x1B80, 0x07140837,
+ 0x1B80, 0x56000845,
+ 0x1B80, 0x56000847,
+ 0x1B80, 0x5CF20855,
+ 0x1B80, 0x5CF20857,
+ 0x1B80, 0x0AF10865,
+ 0x1B80, 0x0AF10867,
+ 0x1B80, 0x07140875,
+ 0x1B80, 0x07140877,
+ 0x1B80, 0x07140885,
+ 0x1B80, 0x07140887,
+ 0x1B80, 0x630F0895,
+ 0x1B80, 0x630F0897,
+ 0x1B80, 0xE13F08A5,
+ 0x1B80, 0xE13F08A7,
+ 0x1B80, 0x631708B5,
+ 0x1B80, 0x631708B7,
+ 0x1B80, 0xE13F08C5,
+ 0x1B80, 0xE13F08C7,
+ 0x1B80, 0x002508D5,
+ 0x1B80, 0x002508D7,
+ 0x1B80, 0xE16C08E5,
+ 0x1B80, 0xE16C08E7,
+ 0x1B80, 0x000208F5,
+ 0x1B80, 0x000208F7,
+ 0x1B80, 0x30C30905,
+ 0x1B80, 0x30C30907,
+ 0x1B80, 0xE1A90915,
+ 0x1B80, 0xE1A90917,
+ 0x1B80, 0x62060925,
+ 0x1B80, 0x62060927,
+ 0x1B80, 0x60060935,
+ 0x1B80, 0x60060937,
+ 0x1B80, 0xE1160945,
+ 0x1B80, 0xE1160947,
+ 0x1B80, 0x54BE0955,
+ 0x1B80, 0x54BE0957,
+ 0x1B80, 0x56010965,
+ 0x1B80, 0x56010967,
+ 0x1B80, 0x5CE20975,
+ 0x1B80, 0x5CE20977,
+ 0x1B80, 0x0AE10985,
+ 0x1B80, 0x0AE10987,
+ 0x1B80, 0x633A0995,
+ 0x1B80, 0x633A0997,
+ 0x1B80, 0xE13F09A5,
+ 0x1B80, 0xE13F09A7,
+ 0x1B80, 0x633709B5,
+ 0x1B80, 0x633709B7,
+ 0x1B80, 0xE13F09C5,
+ 0x1B80, 0xE13F09C7,
+ 0x1B80, 0x632F09D5,
+ 0x1B80, 0x632F09D7,
+ 0x1B80, 0xE13F09E5,
+ 0x1B80, 0xE13F09E7,
+ 0x1B80, 0x632709F5,
+ 0x1B80, 0x632709F7,
+ 0x1B80, 0xE13F0A05,
+ 0x1B80, 0xE13F0A07,
+ 0x1B80, 0x631F0A15,
+ 0x1B80, 0x631F0A17,
+ 0x1B80, 0xE13F0A25,
+ 0x1B80, 0xE13F0A27,
+ 0x1B80, 0x63170A35,
+ 0x1B80, 0x63170A37,
+ 0x1B80, 0xE13F0A45,
+ 0x1B80, 0xE13F0A47,
+ 0x1B80, 0x630F0A55,
+ 0x1B80, 0x630F0A57,
+ 0x1B80, 0xE13F0A65,
+ 0x1B80, 0xE13F0A67,
+ 0x1B80, 0x63070A75,
+ 0x1B80, 0x63070A77,
+ 0x1B80, 0xE13F0A85,
+ 0x1B80, 0xE13F0A87,
+ 0x1B80, 0xE16C0A95,
+ 0x1B80, 0xE16C0A97,
+ 0x1B80, 0x56000AA5,
+ 0x1B80, 0x56000AA7,
+ 0x1B80, 0x5CF20AB5,
+ 0x1B80, 0x5CF20AB7,
+ 0x1B80, 0x0AF10AC5,
+ 0x1B80, 0x0AF10AC7,
+ 0x1B80, 0xF5040AD5,
+ 0x1B80, 0xF5040AD7,
+ 0x1B80, 0xE13F0AE5,
+ 0x1B80, 0xE13F0AE7,
+ 0x1B80, 0xE16C0AF5,
+ 0x1B80, 0xE16C0AF7,
+ 0x1B80, 0x30B30B05,
+ 0x1B80, 0x30B30B07,
+ 0x1B80, 0x07140B15,
+ 0x1B80, 0x07140B17,
+ 0x1B80, 0x07140B25,
+ 0x1B80, 0x07140B27,
+ 0x1B80, 0x630F0B35,
+ 0x1B80, 0x630F0B37,
+ 0x1B80, 0xE13F0B45,
+ 0x1B80, 0xE13F0B47,
+ 0x1B80, 0x63170B55,
+ 0x1B80, 0x63170B57,
+ 0x1B80, 0xE13F0B65,
+ 0x1B80, 0xE13F0B67,
+ 0x1B80, 0x631F0B75,
+ 0x1B80, 0x631F0B77,
+ 0x1B80, 0xE13F0B85,
+ 0x1B80, 0xE13F0B87,
+ 0x1B80, 0x63270B95,
+ 0x1B80, 0x63270B97,
+ 0x1B80, 0xE13F0BA5,
+ 0x1B80, 0xE13F0BA7,
+ 0x1B80, 0x632F0BB5,
+ 0x1B80, 0x632F0BB7,
+ 0x1B80, 0xE13F0BC5,
+ 0x1B80, 0xE13F0BC7,
+ 0x1B80, 0x63370BD5,
+ 0x1B80, 0x63370BD7,
+ 0x1B80, 0xE13F0BE5,
+ 0x1B80, 0xE13F0BE7,
+ 0x1B80, 0x633A0BF5,
+ 0x1B80, 0x633A0BF7,
+ 0x1B80, 0xE13F0C05,
+ 0x1B80, 0xE13F0C07,
+ 0x1B80, 0xF60B0C15,
+ 0x1B80, 0xF60B0C17,
+ 0x1B80, 0xF7170C25,
+ 0x1B80, 0xF7170C27,
+ 0x1B80, 0x4D300C35,
+ 0x1B80, 0x4D300C37,
+ 0x1B80, 0x57040C45,
+ 0x1B80, 0x57040C47,
+ 0x1B80, 0x57000C55,
+ 0x1B80, 0x57000C57,
+ 0x1B80, 0x96000C65,
+ 0x1B80, 0x96000C67,
+ 0x1B80, 0x57080C75,
+ 0x1B80, 0x57080C77,
+ 0x1B80, 0x57000C85,
+ 0x1B80, 0x57000C87,
+ 0x1B80, 0x95000C95,
+ 0x1B80, 0x95000C97,
+ 0x1B80, 0x4D000CA5,
+ 0x1B80, 0x4D000CA7,
+ 0x1B80, 0x6C070CB5,
+ 0x1B80, 0x6C070CB7,
+ 0x1B80, 0x00010CC5,
+ 0x1B80, 0x00010CC7,
+ 0x1B80, 0x00220CD5,
+ 0x1B80, 0x00220CD7,
+ 0x1B80, 0x06140CE5,
+ 0x1B80, 0x06140CE7,
+ 0x1B80, 0xE16C0CF5,
+ 0x1B80, 0xE16C0CF7,
+ 0x1B80, 0x00020D05,
+ 0x1B80, 0x00020D07,
+ 0x1B80, 0x00250D15,
+ 0x1B80, 0x00250D17,
+ 0x1B80, 0x06140D25,
+ 0x1B80, 0x06140D27,
+ 0x1B80, 0xE16C0D35,
+ 0x1B80, 0xE16C0D37,
+ 0x1B80, 0x00020D45,
+ 0x1B80, 0x00020D47,
+ 0x1B80, 0x00010D55,
+ 0x1B80, 0x00010D57,
+ 0x1B80, 0x00320D65,
+ 0x1B80, 0x00320D67,
+ 0x1B80, 0xE16C0D75,
+ 0x1B80, 0xE16C0D77,
+ 0x1B80, 0x00020D85,
+ 0x1B80, 0x00020D87,
+ 0x1B80, 0xE1860D95,
+ 0x1B80, 0xE1860D97,
+ 0x1B80, 0xE1B60DA5,
+ 0x1B80, 0xE1B60DA7,
+ 0x1B80, 0x5CD10DB5,
+ 0x1B80, 0x5CD10DB7,
+ 0x1B80, 0x673A0DC5,
+ 0x1B80, 0x673A0DC7,
+ 0x1B80, 0xE1230DD5,
+ 0x1B80, 0xE1230DD7,
+ 0x1B80, 0xF80B0DE5,
+ 0x1B80, 0xF80B0DE7,
+ 0x1B80, 0xF9110DF5,
+ 0x1B80, 0xF9110DF7,
+ 0x1B80, 0xE1580E05,
+ 0x1B80, 0xE1580E07,
+ 0x1B80, 0x67370E15,
+ 0x1B80, 0x67370E17,
+ 0x1B80, 0xE1580E25,
+ 0x1B80, 0xE1580E27,
+ 0x1B80, 0x672F0E35,
+ 0x1B80, 0x672F0E37,
+ 0x1B80, 0xE1580E45,
+ 0x1B80, 0xE1580E47,
+ 0x1B80, 0x67270E55,
+ 0x1B80, 0x67270E57,
+ 0x1B80, 0xE1580E65,
+ 0x1B80, 0xE1580E67,
+ 0x1B80, 0x671F0E75,
+ 0x1B80, 0x671F0E77,
+ 0x1B80, 0xE1580E85,
+ 0x1B80, 0xE1580E87,
+ 0x1B80, 0x67170E95,
+ 0x1B80, 0x67170E97,
+ 0x1B80, 0xE1580EA5,
+ 0x1B80, 0xE1580EA7,
+ 0x1B80, 0xF8020EB5,
+ 0x1B80, 0xF8020EB7,
+ 0x1B80, 0x30EE0EC5,
+ 0x1B80, 0x30EE0EC7,
+ 0x1B80, 0xE0D10ED5,
+ 0x1B80, 0xE0D10ED7,
+ 0x1B80, 0x670F0EE5,
+ 0x1B80, 0x670F0EE7,
+ 0x1B80, 0xE1580EF5,
+ 0x1B80, 0xE1580EF7,
+ 0x1B80, 0x67070F05,
+ 0x1B80, 0x67070F07,
+ 0x1B80, 0xE1580F15,
+ 0x1B80, 0xE1580F17,
+ 0x1B80, 0xF9020F25,
+ 0x1B80, 0xF9020F27,
+ 0x1B80, 0x30F50F35,
+ 0x1B80, 0x30F50F37,
+ 0x1B80, 0xE0CD0F45,
+ 0x1B80, 0xE0CD0F47,
+ 0x1B80, 0x06140F55,
+ 0x1B80, 0x06140F57,
+ 0x1B80, 0xE16C0F65,
+ 0x1B80, 0xE16C0F67,
+ 0x1B80, 0x5CF10F75,
+ 0x1B80, 0x5CF10F77,
+ 0x1B80, 0xE1580F85,
+ 0x1B80, 0xE1580F87,
+ 0x1B80, 0x06140F95,
+ 0x1B80, 0x06140F97,
+ 0x1B80, 0xE16C0FA5,
+ 0x1B80, 0xE16C0FA7,
+ 0x1B80, 0xF9020FB5,
+ 0x1B80, 0xF9020FB7,
+ 0x1B80, 0x30FF0FC5,
+ 0x1B80, 0x30FF0FC7,
+ 0x1B80, 0xE0CD0FD5,
+ 0x1B80, 0xE0CD0FD7,
+ 0x1B80, 0x31130FE5,
+ 0x1B80, 0x31130FE7,
+ 0x1B80, 0x670F0FF5,
+ 0x1B80, 0x670F0FF7,
+ 0x1B80, 0xE1581005,
+ 0x1B80, 0xE1581007,
+ 0x1B80, 0x67171015,
+ 0x1B80, 0x67171017,
+ 0x1B80, 0xE1581025,
+ 0x1B80, 0xE1581027,
+ 0x1B80, 0xF8021035,
+ 0x1B80, 0xF8021037,
+ 0x1B80, 0x31071045,
+ 0x1B80, 0x31071047,
+ 0x1B80, 0xE0D11055,
+ 0x1B80, 0xE0D11057,
+ 0x1B80, 0x31131065,
+ 0x1B80, 0x31131067,
+ 0x1B80, 0x670F1075,
+ 0x1B80, 0x670F1077,
+ 0x1B80, 0xE1581085,
+ 0x1B80, 0xE1581087,
+ 0x1B80, 0x671F1095,
+ 0x1B80, 0x671F1097,
+ 0x1B80, 0xE15810A5,
+ 0x1B80, 0xE15810A7,
+ 0x1B80, 0x672710B5,
+ 0x1B80, 0x672710B7,
+ 0x1B80, 0xE15810C5,
+ 0x1B80, 0xE15810C7,
+ 0x1B80, 0x672F10D5,
+ 0x1B80, 0x672F10D7,
+ 0x1B80, 0xE15810E5,
+ 0x1B80, 0xE15810E7,
+ 0x1B80, 0x673710F5,
+ 0x1B80, 0x673710F7,
+ 0x1B80, 0xE1581105,
+ 0x1B80, 0xE1581107,
+ 0x1B80, 0x673A1115,
+ 0x1B80, 0x673A1117,
+ 0x1B80, 0xE1581125,
+ 0x1B80, 0xE1581127,
+ 0x1B80, 0x4D101135,
+ 0x1B80, 0x4D101137,
+ 0x1B80, 0x30C41145,
+ 0x1B80, 0x30C41147,
+ 0x1B80, 0x00011155,
+ 0x1B80, 0x00011157,
+ 0x1B80, 0x6F241165,
+ 0x1B80, 0x6F241167,
+ 0x1B80, 0x6E401175,
+ 0x1B80, 0x6E401177,
+ 0x1B80, 0x6D001185,
+ 0x1B80, 0x6D001187,
+ 0x1B80, 0x55031195,
+ 0x1B80, 0x55031197,
+ 0x1B80, 0x312311A5,
+ 0x1B80, 0x312311A7,
+ 0x1B80, 0x6F1C11B5,
+ 0x1B80, 0x6F1C11B7,
+ 0x1B80, 0x6E4011C5,
+ 0x1B80, 0x6E4011C7,
+ 0x1B80, 0x550B11D5,
+ 0x1B80, 0x550B11D7,
+ 0x1B80, 0x312311E5,
+ 0x1B80, 0x312311E7,
+ 0x1B80, 0x061C11F5,
+ 0x1B80, 0x061C11F7,
+ 0x1B80, 0x54DE1205,
+ 0x1B80, 0x54DE1207,
+ 0x1B80, 0x06DC1215,
+ 0x1B80, 0x06DC1217,
+ 0x1B80, 0x55131225,
+ 0x1B80, 0x55131227,
+ 0x1B80, 0x74011235,
+ 0x1B80, 0x74011237,
+ 0x1B80, 0x74001245,
+ 0x1B80, 0x74001247,
+ 0x1B80, 0x8E001255,
+ 0x1B80, 0x8E001257,
+ 0x1B80, 0x00011265,
+ 0x1B80, 0x00011267,
+ 0x1B80, 0x57021275,
+ 0x1B80, 0x57021277,
+ 0x1B80, 0x57001285,
+ 0x1B80, 0x57001287,
+ 0x1B80, 0x97001295,
+ 0x1B80, 0x97001297,
+ 0x1B80, 0x000112A5,
+ 0x1B80, 0x000112A7,
+ 0x1B80, 0x54BF12B5,
+ 0x1B80, 0x54BF12B7,
+ 0x1B80, 0x54C112C5,
+ 0x1B80, 0x54C112C7,
+ 0x1B80, 0x54A212D5,
+ 0x1B80, 0x54A212D7,
+ 0x1B80, 0x54C012E5,
+ 0x1B80, 0x54C012E7,
+ 0x1B80, 0x54A112F5,
+ 0x1B80, 0x54A112F7,
+ 0x1B80, 0x54DF1305,
+ 0x1B80, 0x54DF1307,
+ 0x1B80, 0x00011315,
+ 0x1B80, 0x00011317,
+ 0x1B80, 0x55001325,
+ 0x1B80, 0x55001327,
+ 0x1B80, 0xE1231335,
+ 0x1B80, 0xE1231337,
+ 0x1B80, 0x54811345,
+ 0x1B80, 0x54811347,
+ 0x1B80, 0xE1231355,
+ 0x1B80, 0xE1231357,
+ 0x1B80, 0x54801365,
+ 0x1B80, 0x54801367,
+ 0x1B80, 0x002A1375,
+ 0x1B80, 0x002A1377,
+ 0x1B80, 0xE12B1385,
+ 0x1B80, 0xE12B1387,
+ 0x1B80, 0xE1231395,
+ 0x1B80, 0xE1231397,
+ 0x1B80, 0x548013A5,
+ 0x1B80, 0x548013A7,
+ 0x1B80, 0xE17213B5,
+ 0x1B80, 0xE17213B7,
+ 0x1B80, 0xBF3013C5,
+ 0x1B80, 0xBF3013C7,
+ 0x1B80, 0x000213D5,
+ 0x1B80, 0x000213D7,
+ 0x1B80, 0x302813E5,
+ 0x1B80, 0x302813E7,
+ 0x1B80, 0x4F7813F5,
+ 0x1B80, 0x4F7813F7,
+ 0x1B80, 0x4E001405,
+ 0x1B80, 0x4E001407,
+ 0x1B80, 0x53871415,
+ 0x1B80, 0x53871417,
+ 0x1B80, 0x52F11425,
+ 0x1B80, 0x52F11427,
+ 0x1B80, 0xE1161435,
+ 0x1B80, 0xE1161437,
+ 0x1B80, 0xE11B1445,
+ 0x1B80, 0xE11B1447,
+ 0x1B80, 0xE11F1455,
+ 0x1B80, 0xE11F1457,
+ 0x1B80, 0xE1271465,
+ 0x1B80, 0xE1271467,
+ 0x1B80, 0x54811475,
+ 0x1B80, 0x54811477,
+ 0x1B80, 0xE1161485,
+ 0x1B80, 0xE1161487,
+ 0x1B80, 0xE11B1495,
+ 0x1B80, 0xE11B1497,
+ 0x1B80, 0xE11F14A5,
+ 0x1B80, 0xE11F14A7,
+ 0x1B80, 0xE12714B5,
+ 0x1B80, 0xE12714B7,
+ 0x1B80, 0x548014C5,
+ 0x1B80, 0x548014C7,
+ 0x1B80, 0x002A14D5,
+ 0x1B80, 0x002A14D7,
+ 0x1B80, 0xE12B14E5,
+ 0x1B80, 0xE12B14E7,
+ 0x1B80, 0xE11614F5,
+ 0x1B80, 0xE11614F7,
+ 0x1B80, 0xE11B1505,
+ 0x1B80, 0xE11B1507,
+ 0x1B80, 0xE11F1515,
+ 0x1B80, 0xE11F1517,
+ 0x1B80, 0xE1271525,
+ 0x1B80, 0xE1271527,
+ 0x1B80, 0x54801535,
+ 0x1B80, 0x54801537,
+ 0x1B80, 0xE1721545,
+ 0x1B80, 0xE1721547,
+ 0x1B80, 0xBF171555,
+ 0x1B80, 0xBF171557,
+ 0x1B80, 0x00021565,
+ 0x1B80, 0x00021567,
+ 0x1B80, 0x30281575,
+ 0x1B80, 0x30281577,
+ 0x1B80, 0x06141585,
+ 0x1B80, 0x06141587,
+ 0x1B80, 0x73201595,
+ 0x1B80, 0x73201597,
+ 0x1B80, 0x720015A5,
+ 0x1B80, 0x720015A7,
+ 0x1B80, 0x710015B5,
+ 0x1B80, 0x710015B7,
+ 0x1B80, 0x550115C5,
+ 0x1B80, 0x550115C7,
+ 0x1B80, 0xE12315D5,
+ 0x1B80, 0xE12315D7,
+ 0x1B80, 0xE12715E5,
+ 0x1B80, 0xE12715E7,
+ 0x1B80, 0x548115F5,
+ 0x1B80, 0x548115F7,
+ 0x1B80, 0xE1231605,
+ 0x1B80, 0xE1231607,
+ 0x1B80, 0xE1271615,
+ 0x1B80, 0xE1271617,
+ 0x1B80, 0x54801625,
+ 0x1B80, 0x54801627,
+ 0x1B80, 0x002A1635,
+ 0x1B80, 0x002A1637,
+ 0x1B80, 0xE12B1645,
+ 0x1B80, 0xE12B1647,
+ 0x1B80, 0xE1231655,
+ 0x1B80, 0xE1231657,
+ 0x1B80, 0xE1271665,
+ 0x1B80, 0xE1271667,
+ 0x1B80, 0x54801675,
+ 0x1B80, 0x54801677,
+ 0x1B80, 0xE1721685,
+ 0x1B80, 0xE1721687,
+ 0x1B80, 0xBF031695,
+ 0x1B80, 0xBF031697,
+ 0x1B80, 0x000216A5,
+ 0x1B80, 0x000216A7,
+ 0x1B80, 0x302816B5,
+ 0x1B80, 0x302816B7,
+ 0x1B80, 0x54BF16C5,
+ 0x1B80, 0x54BF16C7,
+ 0x1B80, 0x54C516D5,
+ 0x1B80, 0x54C516D7,
+ 0x1B80, 0x050A16E5,
+ 0x1B80, 0x050A16E7,
+ 0x1B80, 0x071416F5,
+ 0x1B80, 0x071416F7,
+ 0x1B80, 0x54DF1705,
+ 0x1B80, 0x54DF1707,
+ 0x1B80, 0x00011715,
+ 0x1B80, 0x00011717,
+ 0x1B80, 0x54BF1725,
+ 0x1B80, 0x54BF1727,
+ 0x1B80, 0x54C01735,
+ 0x1B80, 0x54C01737,
+ 0x1B80, 0x54A31745,
+ 0x1B80, 0x54A31747,
+ 0x1B80, 0x54C11755,
+ 0x1B80, 0x54C11757,
+ 0x1B80, 0x54A41765,
+ 0x1B80, 0x54A41767,
+ 0x1B80, 0x4C831775,
+ 0x1B80, 0x4C831777,
+ 0x1B80, 0x4C031785,
+ 0x1B80, 0x4C031787,
+ 0x1B80, 0xBF0B1795,
+ 0x1B80, 0xBF0B1797,
+ 0x1B80, 0x54C217A5,
+ 0x1B80, 0x54C217A7,
+ 0x1B80, 0x54A417B5,
+ 0x1B80, 0x54A417B7,
+ 0x1B80, 0x4C8517C5,
+ 0x1B80, 0x4C8517C7,
+ 0x1B80, 0x4C0517D5,
+ 0x1B80, 0x4C0517D7,
+ 0x1B80, 0xBF0617E5,
+ 0x1B80, 0xBF0617E7,
+ 0x1B80, 0x54C117F5,
+ 0x1B80, 0x54C117F7,
+ 0x1B80, 0x54A31805,
+ 0x1B80, 0x54A31807,
+ 0x1B80, 0x4C861815,
+ 0x1B80, 0x4C861817,
+ 0x1B80, 0x4C061825,
+ 0x1B80, 0x4C061827,
+ 0x1B80, 0xBF011835,
+ 0x1B80, 0xBF011837,
+ 0x1B80, 0x54DF1845,
+ 0x1B80, 0x54DF1847,
+ 0x1B80, 0x00011855,
+ 0x1B80, 0x00011857,
+ 0x1B80, 0x00071865,
+ 0x1B80, 0x00071867,
+ 0x1B80, 0x54011875,
+ 0x1B80, 0x54011877,
+ 0x1B80, 0x00041885,
+ 0x1B80, 0x00041887,
+ 0x1B80, 0x56001895,
+ 0x1B80, 0x56001897,
+ 0x1B80, 0x5CF218A5,
+ 0x1B80, 0x5CF218A7,
+ 0x1B80, 0x630718B5,
+ 0x1B80, 0x630718B7,
+ 0x1B80, 0x620418C5,
+ 0x1B80, 0x620418C7,
+ 0x1B80, 0x610018D5,
+ 0x1B80, 0x610018D7,
+ 0x1B80, 0x670718E5,
+ 0x1B80, 0x670718E7,
+ 0x1B80, 0x660618F5,
+ 0x1B80, 0x660618F7,
+ 0x1B80, 0x6F201905,
+ 0x1B80, 0x6F201907,
+ 0x1B80, 0x6E001915,
+ 0x1B80, 0x6E001917,
+ 0x1B80, 0x6D001925,
+ 0x1B80, 0x6D001927,
+ 0x1B80, 0x6C031935,
+ 0x1B80, 0x6C031937,
+ 0x1B80, 0x73201945,
+ 0x1B80, 0x73201947,
+ 0x1B80, 0x72001955,
+ 0x1B80, 0x72001957,
+ 0x1B80, 0x71001965,
+ 0x1B80, 0x71001967,
+ 0x1B80, 0x7B201975,
+ 0x1B80, 0x7B201977,
+ 0x1B80, 0x7A001985,
+ 0x1B80, 0x7A001987,
+ 0x1B80, 0x79001995,
+ 0x1B80, 0x79001997,
+ 0x1B80, 0x7F2019A5,
+ 0x1B80, 0x7F2019A7,
+ 0x1B80, 0x7E0019B5,
+ 0x1B80, 0x7E0019B7,
+ 0x1B80, 0x7D0019C5,
+ 0x1B80, 0x7D0019C7,
+ 0x1B80, 0x090119D5,
+ 0x1B80, 0x090119D7,
+ 0x1B80, 0x0AC619E5,
+ 0x1B80, 0x0AC619E7,
+ 0x1B80, 0x0BA619F5,
+ 0x1B80, 0x0BA619F7,
+ 0x1B80, 0x0C011A05,
+ 0x1B80, 0x0C011A07,
+ 0x1B80, 0x0D021A15,
+ 0x1B80, 0x0D021A17,
+ 0x1B80, 0x0E041A25,
+ 0x1B80, 0x0E041A27,
+ 0x1B80, 0x0FFF1A35,
+ 0x1B80, 0x0FFF1A37,
+ 0x1B80, 0x4D041A45,
+ 0x1B80, 0x4D041A47,
+ 0x1B80, 0x28F81A55,
+ 0x1B80, 0x28F81A57,
+ 0x1B80, 0xE0001A65,
+ 0x1B80, 0xE0001A67,
+ 0x1B80, 0x4D001A75,
+ 0x1B80, 0x4D001A77,
+ 0x1B80, 0x00011A85,
+ 0x1B80, 0x00011A87,
+ 0x1B80, 0x4D041A95,
+ 0x1B80, 0x4D041A97,
+ 0x1B80, 0x2EF81AA5,
+ 0x1B80, 0x2EF81AA7,
+ 0x1B80, 0x00021AB5,
+ 0x1B80, 0x00021AB7,
+ 0x1B80, 0x23031AC5,
+ 0x1B80, 0x23031AC7,
+ 0x1B80, 0x00001AD5,
+ 0x1B80, 0x00001AD7,
+ 0x1B80, 0x23131AE5,
+ 0x1B80, 0x23131AE7,
+ 0x1B80, 0xE77F1AF5,
+ 0x1B80, 0xE77F1AF7,
+ 0x1B80, 0x232F1B05,
+ 0x1B80, 0x232F1B07,
+ 0x1B80, 0xEFBF1B15,
+ 0x1B80, 0xEFBF1B17,
+ 0x1B80, 0x2EF01B25,
+ 0x1B80, 0x2EF01B27,
+ 0x1B80, 0x00021B35,
+ 0x1B80, 0x00021B37,
+ 0x1B80, 0x4D001B45,
+ 0x1B80, 0x4D001B47,
+ 0x1B80, 0x00011B55,
+ 0x1B80, 0x00011B57,
+ 0x1B80, 0x4D041B65,
+ 0x1B80, 0x4D041B67,
+ 0x1B80, 0x2EF81B75,
+ 0x1B80, 0x2EF81B77,
+ 0x1B80, 0x00021B85,
+ 0x1B80, 0x00021B87,
+ 0x1B80, 0x23031B95,
+ 0x1B80, 0x23031B97,
+ 0x1B80, 0x00001BA5,
+ 0x1B80, 0x00001BA7,
+ 0x1B80, 0x23131BB5,
+ 0x1B80, 0x23131BB7,
+ 0x1B80, 0xE77F1BC5,
+ 0x1B80, 0xE77F1BC7,
+ 0x1B80, 0x232F1BD5,
+ 0x1B80, 0x232F1BD7,
+ 0x1B80, 0xE79F1BE5,
+ 0x1B80, 0xE79F1BE7,
+ 0x1B80, 0x2EF01BF5,
+ 0x1B80, 0x2EF01BF7,
+ 0x1B80, 0x00021C05,
+ 0x1B80, 0x00021C07,
+ 0x1B80, 0x28F81C15,
+ 0x1B80, 0x28F81C17,
+ 0x1B80, 0x80001C25,
+ 0x1B80, 0x80001C27,
+ 0x1B80, 0x4D001C35,
+ 0x1B80, 0x4D001C37,
+ 0x1B80, 0x00011C45,
+ 0x1B80, 0x00011C47,
+ 0x1B80, 0x00041C55,
+ 0x1B80, 0x00041C57,
+ 0x1B80, 0x6BC01C65,
+ 0x1B80, 0x6BC01C67,
+ 0x1B80, 0x4D041C75,
+ 0x1B80, 0x4D041C77,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241C85,
+ 0x1B80, 0x68241C87,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241C85,
+ 0x1B80, 0x68241C87,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241C85,
+ 0x1B80, 0x68241C87,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241C85,
+ 0x1B80, 0x68241C87,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241C85,
+ 0x1B80, 0x68241C87,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241C85,
+ 0x1B80, 0x68241C87,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241C85,
+ 0x1B80, 0x68241C87,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241C85,
+ 0x1B80, 0x68241C87,
+ 0xA0000000, 0x00000000,
+ 0x1B80, 0x68481C85,
+ 0x1B80, 0x68481C87,
+ 0xB0000000, 0x00000000,
+ 0x1B80, 0x66061C95,
+ 0x1B80, 0x66061C97,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x650C1CA5,
+ 0x1B80, 0x650C1CA7,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x650C1CA5,
+ 0x1B80, 0x650C1CA7,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x650C1CA5,
+ 0x1B80, 0x650C1CA7,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x650C1CA5,
+ 0x1B80, 0x650C1CA7,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x650C1CA5,
+ 0x1B80, 0x650C1CA7,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x650C1CA5,
+ 0x1B80, 0x650C1CA7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x650C1CA5,
+ 0x1B80, 0x650C1CA7,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x650C1CA5,
+ 0x1B80, 0x650C1CA7,
+ 0xA0000000, 0x00000000,
+ 0x1B80, 0x65041CA5,
+ 0x1B80, 0x65041CA7,
+ 0xB0000000, 0x00000000,
+ 0x1B80, 0x64471CB5,
+ 0x1B80, 0x64471CB7,
+ 0x1B80, 0x23411CC5,
+ 0x1B80, 0x23411CC7,
+ 0x1B80, 0x100E1CD5,
+ 0x1B80, 0x100E1CD7,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60101CE5,
+ 0x1B80, 0x60101CE7,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60101CE5,
+ 0x1B80, 0x60101CE7,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60101CE5,
+ 0x1B80, 0x60101CE7,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60101CE5,
+ 0x1B80, 0x60101CE7,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60101CE5,
+ 0x1B80, 0x60101CE7,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60101CE5,
+ 0x1B80, 0x60101CE7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60101CE5,
+ 0x1B80, 0x60101CE7,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60101CE5,
+ 0x1B80, 0x60101CE7,
+ 0xA0000000, 0x00000000,
+ 0x1B80, 0x60011CE5,
+ 0x1B80, 0x60011CE7,
+ 0xB0000000, 0x00000000,
+ 0x1B80, 0x23411CF5,
+ 0x1B80, 0x23411CF7,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60811D05,
+ 0x1B80, 0x60811D07,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60811D05,
+ 0x1B80, 0x60811D07,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60811D05,
+ 0x1B80, 0x60811D07,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60811D05,
+ 0x1B80, 0x60811D07,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60811D05,
+ 0x1B80, 0x60811D07,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60811D05,
+ 0x1B80, 0x60811D07,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60811D05,
+ 0x1B80, 0x60811D07,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60811D05,
+ 0x1B80, 0x60811D07,
+ 0xA0000000, 0x00000000,
+ 0x1B80, 0x60611D05,
+ 0x1B80, 0x60611D07,
+ 0xB0000000, 0x00000000,
+ 0x1B80, 0x23411D15,
+ 0x1B80, 0x23411D17,
+ 0x1B80, 0x70E11D25,
+ 0x1B80, 0x70E11D27,
+ 0x1B80, 0x4D001D35,
+ 0x1B80, 0x4D001D37,
+ 0x1B80, 0x00011D45,
+ 0x1B80, 0x00011D47,
+ 0x1B80, 0x00041D55,
+ 0x1B80, 0x00041D57,
+ 0x1B80, 0x6B401D65,
+ 0x1B80, 0x6B401D67,
+ 0x1B80, 0x4D041D75,
+ 0x1B80, 0x4D041D77,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241D85,
+ 0x1B80, 0x68241D87,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241D85,
+ 0x1B80, 0x68241D87,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241D85,
+ 0x1B80, 0x68241D87,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241D85,
+ 0x1B80, 0x68241D87,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241D85,
+ 0x1B80, 0x68241D87,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x68241D85,
+ 0x1B80, 0x68241D87,
+ 0xA0000000, 0x00000000,
+ 0x1B80, 0x68481D85,
+ 0x1B80, 0x68481D87,
+ 0xB0000000, 0x00000000,
+ 0x1B80, 0x66061D95,
+ 0x1B80, 0x66061D97,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x65081DA5,
+ 0x1B80, 0x65081DA7,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x65181DA5,
+ 0x1B80, 0x65181DA7,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x65181DA5,
+ 0x1B80, 0x65181DA7,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x65181DA5,
+ 0x1B80, 0x65181DA7,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x65181DA5,
+ 0x1B80, 0x65181DA7,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x65081DA5,
+ 0x1B80, 0x65081DA7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x65181DA5,
+ 0x1B80, 0x65181DA7,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x65181DA5,
+ 0x1B80, 0x65181DA7,
+ 0xA0000000, 0x00000000,
+ 0x1B80, 0x65081DA5,
+ 0x1B80, 0x65081DA7,
+ 0xB0000000, 0x00000000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x64481DB5,
+ 0x1B80, 0x64481DB7,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x64481DB5,
+ 0x1B80, 0x64481DB7,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x64481DB5,
+ 0x1B80, 0x64481DB7,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x64481DB5,
+ 0x1B80, 0x64481DB7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x64481DB5,
+ 0x1B80, 0x64481DB7,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x64481DB5,
+ 0x1B80, 0x64481DB7,
+ 0xA0000000, 0x00000000,
+ 0x1B80, 0x64471DB5,
+ 0x1B80, 0x64471DB7,
+ 0xB0000000, 0x00000000,
+ 0x1B80, 0x23411DC5,
+ 0x1B80, 0x23411DC7,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x11E41DD5,
+ 0x1B80, 0x11E41DD7,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x11E81DD5,
+ 0x1B80, 0x11E81DD7,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x11E81DD5,
+ 0x1B80, 0x11E81DD7,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x11E81DD5,
+ 0x1B80, 0x11E81DD7,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x11E81DD5,
+ 0x1B80, 0x11E81DD7,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x11E41DD5,
+ 0x1B80, 0x11E41DD7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x11E81DD5,
+ 0x1B80, 0x11E81DD7,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x11E81DD5,
+ 0x1B80, 0x11E81DD7,
+ 0xA0000000, 0x00000000,
+ 0x1B80, 0x11E41DD5,
+ 0x1B80, 0x11E41DD7,
+ 0xB0000000, 0x00000000,
+ 0x1B80, 0x60011DE5,
+ 0x1B80, 0x60011DE7,
+ 0x1B80, 0x23411DF5,
+ 0x1B80, 0x23411DF7,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60E11E05,
+ 0x1B80, 0x60E11E07,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x61E11E05,
+ 0x1B80, 0x61E11E07,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x61E11E05,
+ 0x1B80, 0x61E11E07,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x61E11E05,
+ 0x1B80, 0x61E11E07,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x61E11E05,
+ 0x1B80, 0x61E11E07,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x60E11E05,
+ 0x1B80, 0x60E11E07,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x61E11E05,
+ 0x1B80, 0x61E11E07,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x1B80, 0x61E11E05,
+ 0x1B80, 0x61E11E07,
+ 0xA0000000, 0x00000000,
+ 0x1B80, 0x60E11E05,
+ 0x1B80, 0x60E11E07,
+ 0xB0000000, 0x00000000,
+ 0x1B80, 0x23411E15,
+ 0x1B80, 0x23411E17,
+ 0x1B80, 0x70611E25,
+ 0x1B80, 0x70611E27,
+ 0x1B80, 0x4D001E35,
+ 0x1B80, 0x4D001E37,
+ 0x1B80, 0x00011E45,
+ 0x1B80, 0x00011E47,
+ 0x1B80, 0x00001E55,
+ 0x1B80, 0x00001E57,
+ 0x1B80, 0x00001E65,
+ 0x1B80, 0x00001E67,
+ 0x1B80, 0x00001E75,
+ 0x1B80, 0x00001E77,
+ 0x1B80, 0x00001E85,
+ 0x1B80, 0x00001E87,
+ 0x1B80, 0x00001E95,
+ 0x1B80, 0x00001E97,
+ 0x1B80, 0x00001EA5,
+ 0x1B80, 0x00001EA7,
+ 0x1B80, 0x00001EB5,
+ 0x1B80, 0x00001EB7,
+ 0x1B80, 0x00001EC5,
+ 0x1B80, 0x00001EC7,
+ 0x1B80, 0x00001ED5,
+ 0x1B80, 0x00001ED7,
+ 0x1B80, 0x00001EE5,
+ 0x1B80, 0x00001EE7,
+ 0x1B80, 0x00001EF5,
+ 0x1B80, 0x00001EF7,
+ 0x1B80, 0x00001F05,
+ 0x1B80, 0x00001F07,
+ 0x1B80, 0x00001F15,
+ 0x1B80, 0x00001F17,
+ 0x1B80, 0x00001F25,
+ 0x1B80, 0x00001F27,
+ 0x1B80, 0x00001F35,
+ 0x1B80, 0x00001F37,
+ 0x1B80, 0x00001F45,
+ 0x1B80, 0x00001F47,
+ 0x1B80, 0x00001F55,
+ 0x1B80, 0x00001F57,
+ 0x1B80, 0x00001F65,
+ 0x1B80, 0x00001F67,
+ 0x1B80, 0x00001F75,
+ 0x1B80, 0x00001F77,
+ 0x1B80, 0x00001F85,
+ 0x1B80, 0x00001F87,
+ 0x1B80, 0x00001F95,
+ 0x1B80, 0x00001F97,
+ 0x1B80, 0x00001FA5,
+ 0x1B80, 0x00001FA7,
+ 0x1B80, 0x00001FB5,
+ 0x1B80, 0x00001FB7,
+ 0x1B80, 0x00001FC5,
+ 0x1B80, 0x00001FC7,
+ 0x1B80, 0x00001FD5,
+ 0x1B80, 0x00001FD7,
+ 0x1B80, 0x00001FE5,
+ 0x1B80, 0x00001FE7,
+ 0x1B80, 0x00001FF5,
+ 0x1B80, 0x00001FF7,
+ 0x1B80, 0x00000006,
+ 0x1B80, 0x00000002,
+};
+
+RTW_DECL_TABLE_PHY_COND(rtw8814a_bb, rtw_phy_cfg_bb);
+
+static const struct rtw_phy_pg_cfg_pair rtw8814a_bb_pg[] = {
+ { 0, 0, 0, 0x00000c20, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c24, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c28, 0xffffffff, 0x30323434, },
+ { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303234, },
+ { 0, 0, 1, 0x00000c34, 0xffffffff, 0x32323232, },
+ { 0, 0, 1, 0x00000c38, 0xffffffff, 0x26283032, },
+ { 0, 0, 2, 0x00000cd8, 0xffffffff, 0x30303030, },
+ { 0, 0, 2, 0x00000cdc, 0xffffffff, 0x24262830, },
+ { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, },
+ { 0, 0, 0, 0x00000c44, 0xffffffff, 0x32322426, },
+ { 0, 0, 1, 0x00000c48, 0xffffffff, 0x30323232, },
+ { 0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, },
+ { 0, 0, 2, 0x00000ce0, 0xffffffff, 0x30303030, },
+ { 0, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830, },
+ { 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20222222, },
+ { 0, 1, 0, 0x00000e20, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e24, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e28, 0xffffffff, 0x30323434, },
+ { 0, 1, 0, 0x00000e2c, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303234, },
+ { 0, 1, 1, 0x00000e34, 0xffffffff, 0x32323232, },
+ { 0, 1, 1, 0x00000e38, 0xffffffff, 0x26283032, },
+ { 0, 1, 2, 0x00000ed8, 0xffffffff, 0x30303030, },
+ { 0, 1, 2, 0x00000edc, 0xffffffff, 0x24262830, },
+ { 0, 1, 0, 0x00000e3c, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, },
+ { 0, 1, 0, 0x00000e44, 0xffffffff, 0x32322426, },
+ { 0, 1, 1, 0x00000e48, 0xffffffff, 0x30323232, },
+ { 0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, },
+ { 0, 1, 2, 0x00000ee0, 0xffffffff, 0x30303030, },
+ { 0, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830, },
+ { 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20222222, },
+ { 0, 2, 0, 0x00001820, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001824, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001828, 0xffffffff, 0x30323434, },
+ { 0, 2, 0, 0x0000182c, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001830, 0xffffffff, 0x28303234, },
+ { 0, 2, 1, 0x00001834, 0xffffffff, 0x32323232, },
+ { 0, 2, 1, 0x00001838, 0xffffffff, 0x26283032, },
+ { 0, 2, 2, 0x000018d8, 0xffffffff, 0x30303030, },
+ { 0, 2, 2, 0x000018dc, 0xffffffff, 0x24262830, },
+ { 0, 2, 0, 0x0000183c, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001840, 0xffffffff, 0x28303234, },
+ { 0, 2, 0, 0x00001844, 0xffffffff, 0x32322426, },
+ { 0, 2, 1, 0x00001848, 0xffffffff, 0x30323232, },
+ { 0, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, },
+ { 0, 2, 2, 0x000018e0, 0xffffffff, 0x30303030, },
+ { 0, 2, 2, 0x000018e4, 0xffffffff, 0x24262830, },
+ { 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20222222, },
+ { 0, 3, 0, 0x00001a20, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a24, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a28, 0xffffffff, 0x30323434, },
+ { 0, 3, 0, 0x00001a2c, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a30, 0xffffffff, 0x28303234, },
+ { 0, 3, 1, 0x00001a34, 0xffffffff, 0x32323232, },
+ { 0, 3, 1, 0x00001a38, 0xffffffff, 0x26283032, },
+ { 0, 3, 2, 0x00001ad8, 0xffffffff, 0x30303030, },
+ { 0, 3, 2, 0x00001adc, 0xffffffff, 0x24262830, },
+ { 0, 3, 0, 0x00001a3c, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, },
+ { 0, 3, 0, 0x00001a44, 0xffffffff, 0x32322426, },
+ { 0, 3, 1, 0x00001a48, 0xffffffff, 0x30323232, },
+ { 0, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, },
+ { 0, 3, 2, 0x00001ae0, 0xffffffff, 0x30303030, },
+ { 0, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830, },
+ { 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20222222, },
+ { 1, 0, 0, 0x00000c24, 0xffffffff, 0x34343434, },
+ { 1, 0, 0, 0x00000c28, 0xffffffff, 0x30323434, },
+ { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x34343434, },
+ { 1, 0, 0, 0x00000c30, 0xffffffff, 0x28303234, },
+ { 1, 0, 1, 0x00000c34, 0xffffffff, 0x32323232, },
+ { 1, 0, 1, 0x00000c38, 0xffffffff, 0x26283032, },
+ { 1, 0, 2, 0x00000cd8, 0xffffffff, 0x30303030, },
+ { 1, 0, 2, 0x00000cdc, 0xffffffff, 0x24262830, },
+ { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x34343434, },
+ { 1, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, },
+ { 1, 0, 0, 0x00000c44, 0xffffffff, 0x32322426, },
+ { 1, 0, 1, 0x00000c48, 0xffffffff, 0x30323232, },
+ { 1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, },
+ { 1, 0, 2, 0x00000ce0, 0xffffffff, 0x30303030, },
+ { 1, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830, },
+ { 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20222222, },
+ { 1, 1, 0, 0x00000e24, 0xffffffff, 0x34343434, },
+ { 1, 1, 0, 0x00000e28, 0xffffffff, 0x30323434, },
+ { 1, 1, 0, 0x00000e2c, 0xffffffff, 0x34343434, },
+ { 1, 1, 0, 0x00000e30, 0xffffffff, 0x28303234, },
+ { 1, 1, 1, 0x00000e34, 0xffffffff, 0x32323232, },
+ { 1, 1, 1, 0x00000e38, 0xffffffff, 0x26283032, },
+ { 1, 1, 2, 0x00000ed8, 0xffffffff, 0x30303030, },
+ { 1, 1, 2, 0x00000edc, 0xffffffff, 0x24262830, },
+ { 1, 1, 0, 0x00000e3c, 0xffffffff, 0x34343434, },
+ { 1, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, },
+ { 1, 1, 0, 0x00000e44, 0xffffffff, 0x32322426, },
+ { 1, 1, 1, 0x00000e48, 0xffffffff, 0x30323232, },
+ { 1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, },
+ { 1, 1, 2, 0x00000ee0, 0xffffffff, 0x30303030, },
+ { 1, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830, },
+ { 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20222222, },
+ { 1, 2, 0, 0x00001824, 0xffffffff, 0x34343434, },
+ { 1, 2, 0, 0x00001828, 0xffffffff, 0x30323434, },
+ { 1, 2, 0, 0x0000182c, 0xffffffff, 0x34343434, },
+ { 1, 2, 0, 0x00001830, 0xffffffff, 0x28303234, },
+ { 1, 2, 1, 0x00001834, 0xffffffff, 0x32323232, },
+ { 1, 2, 1, 0x00001838, 0xffffffff, 0x26283032, },
+ { 1, 2, 2, 0x000018d8, 0xffffffff, 0x30303030, },
+ { 1, 2, 2, 0x000018dc, 0xffffffff, 0x24262830, },
+ { 1, 2, 0, 0x0000183c, 0xffffffff, 0x34343434, },
+ { 1, 2, 0, 0x00001840, 0xffffffff, 0x28303234, },
+ { 1, 2, 0, 0x00001844, 0xffffffff, 0x32322426, },
+ { 1, 2, 1, 0x00001848, 0xffffffff, 0x30323232, },
+ { 1, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, },
+ { 1, 2, 2, 0x000018e0, 0xffffffff, 0x30303030, },
+ { 1, 2, 2, 0x000018e4, 0xffffffff, 0x24262830, },
+ { 1, 2, 2, 0x000018e8, 0x0000ffff, 0x20222222, },
+ { 1, 3, 0, 0x00001a24, 0xffffffff, 0x34343434, },
+ { 1, 3, 0, 0x00001a28, 0xffffffff, 0x30323434, },
+ { 1, 3, 0, 0x00001a2c, 0xffffffff, 0x34343434, },
+ { 1, 3, 0, 0x00001a30, 0xffffffff, 0x28303234, },
+ { 1, 3, 1, 0x00001a34, 0xffffffff, 0x32323232, },
+ { 1, 3, 1, 0x00001a38, 0xffffffff, 0x26283032, },
+ { 1, 3, 2, 0x00001ad8, 0xffffffff, 0x30303030, },
+ { 1, 3, 2, 0x00001adc, 0xffffffff, 0x24262830, },
+ { 1, 3, 0, 0x00001a3c, 0xffffffff, 0x34343434, },
+ { 1, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, },
+ { 1, 3, 0, 0x00001a44, 0xffffffff, 0x32322426, },
+ { 1, 3, 1, 0x00001a48, 0xffffffff, 0x30323232, },
+ { 1, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, },
+ { 1, 3, 2, 0x00001ae0, 0xffffffff, 0x30303030, },
+ { 1, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830, },
+ { 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20222222, },
+};
+
+RTW_DECL_TABLE_BB_PG(rtw8814a_bb_pg);
+
+static const struct rtw_phy_pg_cfg_pair rtw8814a_bb_pg_type0[] = {
+ { 0, 0, 0, 0x00000c20, 0xffffffff, 0x32323232, },
+ { 0, 0, 0, 0x00000c24, 0xffffffff, 0x32323232, },
+ { 0, 0, 0, 0x00000c28, 0xffffffff, 0x28303232, },
+ { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x32323232, },
+ { 0, 0, 0, 0x00000c30, 0xffffffff, 0x26283032, },
+ { 0, 0, 1, 0x00000c34, 0xffffffff, 0x30303030, },
+ { 0, 0, 1, 0x00000c38, 0xffffffff, 0x24262830, },
+ { 0, 0, 2, 0x00000cd8, 0xffffffff, 0x28282828, },
+ { 0, 0, 2, 0x00000cdc, 0xffffffff, 0x22242628, },
+ { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x32323232, },
+ { 0, 0, 0, 0x00000c40, 0xffffffff, 0x26283032, },
+ { 0, 0, 0, 0x00000c44, 0xffffffff, 0x30302224, },
+ { 0, 0, 1, 0x00000c48, 0xffffffff, 0x28303030, },
+ { 0, 0, 1, 0x00000c4c, 0xffffffff, 0x20222426, },
+ { 0, 0, 2, 0x00000ce0, 0xffffffff, 0x28282828, },
+ { 0, 0, 2, 0x00000ce4, 0xffffffff, 0x22242628, },
+ { 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x18202020, },
+ { 0, 1, 0, 0x00000e20, 0xffffffff, 0x32323232, },
+ { 0, 1, 0, 0x00000e24, 0xffffffff, 0x32323232, },
+ { 0, 1, 0, 0x00000e28, 0xffffffff, 0x28303232, },
+ { 0, 1, 0, 0x00000e2c, 0xffffffff, 0x32323232, },
+ { 0, 1, 0, 0x00000e30, 0xffffffff, 0x26283032, },
+ { 0, 1, 1, 0x00000e34, 0xffffffff, 0x30303030, },
+ { 0, 1, 1, 0x00000e38, 0xffffffff, 0x24262830, },
+ { 0, 1, 2, 0x00000ed8, 0xffffffff, 0x28282828, },
+ { 0, 1, 2, 0x00000edc, 0xffffffff, 0x22242628, },
+ { 0, 1, 0, 0x00000e3c, 0xffffffff, 0x32323232, },
+ { 0, 1, 0, 0x00000e40, 0xffffffff, 0x26283032, },
+ { 0, 1, 0, 0x00000e44, 0xffffffff, 0x30302224, },
+ { 0, 1, 1, 0x00000e48, 0xffffffff, 0x28303030, },
+ { 0, 1, 1, 0x00000e4c, 0xffffffff, 0x20222426, },
+ { 0, 1, 2, 0x00000ee0, 0xffffffff, 0x28282828, },
+ { 0, 1, 2, 0x00000ee4, 0xffffffff, 0x22242628, },
+ { 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x18202020, },
+ { 0, 2, 0, 0x00001820, 0xffffffff, 0x32323232, },
+ { 0, 2, 0, 0x00001824, 0xffffffff, 0x32323232, },
+ { 0, 2, 0, 0x00001828, 0xffffffff, 0x28303232, },
+ { 0, 2, 0, 0x0000182c, 0xffffffff, 0x32323232, },
+ { 0, 2, 0, 0x00001830, 0xffffffff, 0x26283032, },
+ { 0, 2, 1, 0x00001834, 0xffffffff, 0x30303030, },
+ { 0, 2, 1, 0x00001838, 0xffffffff, 0x24262830, },
+ { 0, 2, 2, 0x000018d8, 0xffffffff, 0x28282828, },
+ { 0, 2, 2, 0x000018dc, 0xffffffff, 0x22242628, },
+ { 0, 2, 0, 0x0000183c, 0xffffffff, 0x32323232, },
+ { 0, 2, 0, 0x00001840, 0xffffffff, 0x26283032, },
+ { 0, 2, 0, 0x00001844, 0xffffffff, 0x30302224, },
+ { 0, 2, 1, 0x00001848, 0xffffffff, 0x28303030, },
+ { 0, 2, 1, 0x0000184c, 0xffffffff, 0x20222426, },
+ { 0, 2, 2, 0x000018e0, 0xffffffff, 0x28282828, },
+ { 0, 2, 2, 0x000018e4, 0xffffffff, 0x22242628, },
+ { 0, 2, 2, 0x000018e8, 0x0000ffff, 0x18202020, },
+ { 0, 3, 0, 0x00001a20, 0xffffffff, 0x32323232, },
+ { 0, 3, 0, 0x00001a24, 0xffffffff, 0x32323232, },
+ { 0, 3, 0, 0x00001a28, 0xffffffff, 0x28303232, },
+ { 0, 3, 0, 0x00001a2c, 0xffffffff, 0x32323232, },
+ { 0, 3, 0, 0x00001a30, 0xffffffff, 0x26283032, },
+ { 0, 3, 1, 0x00001a34, 0xffffffff, 0x30303030, },
+ { 0, 3, 1, 0x00001a38, 0xffffffff, 0x24262830, },
+ { 0, 3, 2, 0x00001ad8, 0xffffffff, 0x28282828, },
+ { 0, 3, 2, 0x00001adc, 0xffffffff, 0x22242628, },
+ { 0, 3, 0, 0x00001a3c, 0xffffffff, 0x32323232, },
+ { 0, 3, 0, 0x00001a40, 0xffffffff, 0x26283032, },
+ { 0, 3, 0, 0x00001a44, 0xffffffff, 0x30302224, },
+ { 0, 3, 1, 0x00001a48, 0xffffffff, 0x28303030, },
+ { 0, 3, 1, 0x00001a4c, 0xffffffff, 0x20222426, },
+ { 0, 3, 2, 0x00001ae0, 0xffffffff, 0x28282828, },
+ { 0, 3, 2, 0x00001ae4, 0xffffffff, 0x22242628, },
+ { 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x18202020, },
+ { 1, 0, 0, 0x00000c24, 0xffffffff, 0x32323232, },
+ { 1, 0, 0, 0x00000c28, 0xffffffff, 0x28303232, },
+ { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x32323232, },
+ { 1, 0, 0, 0x00000c30, 0xffffffff, 0x26283032, },
+ { 1, 0, 1, 0x00000c34, 0xffffffff, 0x30303030, },
+ { 1, 0, 1, 0x00000c38, 0xffffffff, 0x24262830, },
+ { 1, 0, 2, 0x00000cd8, 0xffffffff, 0x28282828, },
+ { 1, 0, 2, 0x00000cdc, 0xffffffff, 0x22242628, },
+ { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x32323232, },
+ { 1, 0, 0, 0x00000c40, 0xffffffff, 0x26283032, },
+ { 1, 0, 0, 0x00000c44, 0xffffffff, 0x30302224, },
+ { 1, 0, 1, 0x00000c48, 0xffffffff, 0x28303030, },
+ { 1, 0, 1, 0x00000c4c, 0xffffffff, 0x20222426, },
+ { 1, 0, 2, 0x00000ce0, 0xffffffff, 0x28282828, },
+ { 1, 0, 2, 0x00000ce4, 0xffffffff, 0x22242628, },
+ { 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x18202020, },
+ { 1, 1, 0, 0x00000e24, 0xffffffff, 0x32323232, },
+ { 1, 1, 0, 0x00000e28, 0xffffffff, 0x28303232, },
+ { 1, 1, 0, 0x00000e2c, 0xffffffff, 0x32323232, },
+ { 1, 1, 0, 0x00000e30, 0xffffffff, 0x26283032, },
+ { 1, 1, 1, 0x00000e34, 0xffffffff, 0x30303030, },
+ { 1, 1, 1, 0x00000e38, 0xffffffff, 0x24262830, },
+ { 1, 1, 2, 0x00000ed8, 0xffffffff, 0x28282828, },
+ { 1, 1, 2, 0x00000edc, 0xffffffff, 0x22242628, },
+ { 1, 1, 0, 0x00000e3c, 0xffffffff, 0x32323232, },
+ { 1, 1, 0, 0x00000e40, 0xffffffff, 0x26283032, },
+ { 1, 1, 0, 0x00000e44, 0xffffffff, 0x30302224, },
+ { 1, 1, 1, 0x00000e48, 0xffffffff, 0x28303030, },
+ { 1, 1, 1, 0x00000e4c, 0xffffffff, 0x20222426, },
+ { 1, 1, 2, 0x00000ee0, 0xffffffff, 0x28282828, },
+ { 1, 1, 2, 0x00000ee4, 0xffffffff, 0x22242628, },
+ { 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x18202020, },
+ { 1, 2, 0, 0x00001824, 0xffffffff, 0x32323232, },
+ { 1, 2, 0, 0x00001828, 0xffffffff, 0x28303232, },
+ { 1, 2, 0, 0x0000182c, 0xffffffff, 0x32323232, },
+ { 1, 2, 0, 0x00001830, 0xffffffff, 0x26283032, },
+ { 1, 2, 1, 0x00001834, 0xffffffff, 0x30303030, },
+ { 1, 2, 1, 0x00001838, 0xffffffff, 0x24262830, },
+ { 1, 2, 2, 0x000018d8, 0xffffffff, 0x28282828, },
+ { 1, 2, 2, 0x000018dc, 0xffffffff, 0x22242628, },
+ { 1, 2, 0, 0x0000183c, 0xffffffff, 0x32323232, },
+ { 1, 2, 0, 0x00001840, 0xffffffff, 0x26283032, },
+ { 1, 2, 0, 0x00001844, 0xffffffff, 0x30302224, },
+ { 1, 2, 1, 0x00001848, 0xffffffff, 0x28303030, },
+ { 1, 2, 1, 0x0000184c, 0xffffffff, 0x20222426, },
+ { 1, 2, 2, 0x000018e0, 0xffffffff, 0x28282828, },
+ { 1, 2, 2, 0x000018e4, 0xffffffff, 0x22242628, },
+ { 1, 2, 2, 0x000018e8, 0x0000ffff, 0x18202020, },
+ { 1, 3, 0, 0x00001a24, 0xffffffff, 0x32323232, },
+ { 1, 3, 0, 0x00001a28, 0xffffffff, 0x28303232, },
+ { 1, 3, 0, 0x00001a2c, 0xffffffff, 0x32323232, },
+ { 1, 3, 0, 0x00001a30, 0xffffffff, 0x26283032, },
+ { 1, 3, 1, 0x00001a34, 0xffffffff, 0x30303030, },
+ { 1, 3, 1, 0x00001a38, 0xffffffff, 0x24262830, },
+ { 1, 3, 2, 0x00001ad8, 0xffffffff, 0x28282828, },
+ { 1, 3, 2, 0x00001adc, 0xffffffff, 0x22242628, },
+ { 1, 3, 0, 0x00001a3c, 0xffffffff, 0x32323232, },
+ { 1, 3, 0, 0x00001a40, 0xffffffff, 0x26283032, },
+ { 1, 3, 0, 0x00001a44, 0xffffffff, 0x30302224, },
+ { 1, 3, 1, 0x00001a48, 0xffffffff, 0x28303030, },
+ { 1, 3, 1, 0x00001a4c, 0xffffffff, 0x20222426, },
+ { 1, 3, 2, 0x00001ae0, 0xffffffff, 0x28282828, },
+ { 1, 3, 2, 0x00001ae4, 0xffffffff, 0x22242628, },
+ { 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x18202020, },
+};
+
+RTW_DECL_TABLE_BB_PG(rtw8814a_bb_pg_type0);
+
+static const struct rtw_phy_pg_cfg_pair rtw8814a_bb_pg_type2[] = {
+ { 0, 0, 0, 0x00000c20, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c24, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c28, 0xffffffff, 0x30323434, },
+ { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303234, },
+ { 0, 0, 1, 0x00000c34, 0xffffffff, 0x32323232, },
+ { 0, 0, 1, 0x00000c38, 0xffffffff, 0x26283032, },
+ { 0, 0, 2, 0x00000cd8, 0xffffffff, 0x30303030, },
+ { 0, 0, 2, 0x00000cdc, 0xffffffff, 0x24262830, },
+ { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, },
+ { 0, 0, 0, 0x00000c44, 0xffffffff, 0x32322426, },
+ { 0, 0, 1, 0x00000c48, 0xffffffff, 0x30323232, },
+ { 0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, },
+ { 0, 0, 2, 0x00000ce0, 0xffffffff, 0x30303030, },
+ { 0, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830, },
+ { 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20222222, },
+ { 0, 1, 0, 0x00000e20, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e24, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e28, 0xffffffff, 0x30323434, },
+ { 0, 1, 0, 0x00000e2c, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303234, },
+ { 0, 1, 1, 0x00000e34, 0xffffffff, 0x32323232, },
+ { 0, 1, 1, 0x00000e38, 0xffffffff, 0x26283032, },
+ { 0, 1, 2, 0x00000ed8, 0xffffffff, 0x30303030, },
+ { 0, 1, 2, 0x00000edc, 0xffffffff, 0x24262830, },
+ { 0, 1, 0, 0x00000e3c, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, },
+ { 0, 1, 0, 0x00000e44, 0xffffffff, 0x32322426, },
+ { 0, 1, 1, 0x00000e48, 0xffffffff, 0x30323232, },
+ { 0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, },
+ { 0, 1, 2, 0x00000ee0, 0xffffffff, 0x30303030, },
+ { 0, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830, },
+ { 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20222222, },
+ { 0, 2, 0, 0x00001820, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001824, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001828, 0xffffffff, 0x30323434, },
+ { 0, 2, 0, 0x0000182c, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001830, 0xffffffff, 0x28303234, },
+ { 0, 2, 1, 0x00001834, 0xffffffff, 0x32323232, },
+ { 0, 2, 1, 0x00001838, 0xffffffff, 0x26283032, },
+ { 0, 2, 2, 0x000018d8, 0xffffffff, 0x30303030, },
+ { 0, 2, 2, 0x000018dc, 0xffffffff, 0x24262830, },
+ { 0, 2, 0, 0x0000183c, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001840, 0xffffffff, 0x28303234, },
+ { 0, 2, 0, 0x00001844, 0xffffffff, 0x32322426, },
+ { 0, 2, 1, 0x00001848, 0xffffffff, 0x30323232, },
+ { 0, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, },
+ { 0, 2, 2, 0x000018e0, 0xffffffff, 0x30303030, },
+ { 0, 2, 2, 0x000018e4, 0xffffffff, 0x24262830, },
+ { 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20222222, },
+ { 0, 3, 0, 0x00001a20, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a24, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a28, 0xffffffff, 0x30323434, },
+ { 0, 3, 0, 0x00001a2c, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a30, 0xffffffff, 0x28303234, },
+ { 0, 3, 1, 0x00001a34, 0xffffffff, 0x32323232, },
+ { 0, 3, 1, 0x00001a38, 0xffffffff, 0x26283032, },
+ { 0, 3, 2, 0x00001ad8, 0xffffffff, 0x30303030, },
+ { 0, 3, 2, 0x00001adc, 0xffffffff, 0x24262830, },
+ { 0, 3, 0, 0x00001a3c, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, },
+ { 0, 3, 0, 0x00001a44, 0xffffffff, 0x32322426, },
+ { 0, 3, 1, 0x00001a48, 0xffffffff, 0x30323232, },
+ { 0, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, },
+ { 0, 3, 2, 0x00001ae0, 0xffffffff, 0x30303030, },
+ { 0, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830, },
+ { 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20222222, },
+ { 1, 0, 0, 0x00000c24, 0xffffffff, 0x34343434, },
+ { 1, 0, 0, 0x00000c28, 0xffffffff, 0x30323434, },
+ { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x34343434, },
+ { 1, 0, 0, 0x00000c30, 0xffffffff, 0x28303234, },
+ { 1, 0, 1, 0x00000c34, 0xffffffff, 0x32323232, },
+ { 1, 0, 1, 0x00000c38, 0xffffffff, 0x26283032, },
+ { 1, 0, 2, 0x00000cd8, 0xffffffff, 0x30303030, },
+ { 1, 0, 2, 0x00000cdc, 0xffffffff, 0x24262830, },
+ { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x34343434, },
+ { 1, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, },
+ { 1, 0, 0, 0x00000c44, 0xffffffff, 0x32322426, },
+ { 1, 0, 1, 0x00000c48, 0xffffffff, 0x30323232, },
+ { 1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, },
+ { 1, 0, 2, 0x00000ce0, 0xffffffff, 0x30303030, },
+ { 1, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830, },
+ { 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20222222, },
+ { 1, 1, 0, 0x00000e24, 0xffffffff, 0x34343434, },
+ { 1, 1, 0, 0x00000e28, 0xffffffff, 0x30323434, },
+ { 1, 1, 0, 0x00000e2c, 0xffffffff, 0x34343434, },
+ { 1, 1, 0, 0x00000e30, 0xffffffff, 0x28303234, },
+ { 1, 1, 1, 0x00000e34, 0xffffffff, 0x32323232, },
+ { 1, 1, 1, 0x00000e38, 0xffffffff, 0x26283032, },
+ { 1, 1, 2, 0x00000ed8, 0xffffffff, 0x30303030, },
+ { 1, 1, 2, 0x00000edc, 0xffffffff, 0x24262830, },
+ { 1, 1, 0, 0x00000e3c, 0xffffffff, 0x34343434, },
+ { 1, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, },
+ { 1, 1, 0, 0x00000e44, 0xffffffff, 0x32322426, },
+ { 1, 1, 1, 0x00000e48, 0xffffffff, 0x30323232, },
+ { 1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, },
+ { 1, 1, 2, 0x00000ee0, 0xffffffff, 0x30303030, },
+ { 1, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830, },
+ { 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20222222, },
+ { 1, 2, 0, 0x00001824, 0xffffffff, 0x34343434, },
+ { 1, 2, 0, 0x00001828, 0xffffffff, 0x30323434, },
+ { 1, 2, 0, 0x0000182c, 0xffffffff, 0x34343434, },
+ { 1, 2, 0, 0x00001830, 0xffffffff, 0x28303234, },
+ { 1, 2, 1, 0x00001834, 0xffffffff, 0x32323232, },
+ { 1, 2, 1, 0x00001838, 0xffffffff, 0x26283032, },
+ { 1, 2, 2, 0x000018d8, 0xffffffff, 0x30303030, },
+ { 1, 2, 2, 0x000018dc, 0xffffffff, 0x24262830, },
+ { 1, 2, 0, 0x0000183c, 0xffffffff, 0x34343434, },
+ { 1, 2, 0, 0x00001840, 0xffffffff, 0x28303234, },
+ { 1, 2, 0, 0x00001844, 0xffffffff, 0x32322426, },
+ { 1, 2, 1, 0x00001848, 0xffffffff, 0x30323232, },
+ { 1, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, },
+ { 1, 2, 2, 0x000018e0, 0xffffffff, 0x30303030, },
+ { 1, 2, 2, 0x000018e4, 0xffffffff, 0x24262830, },
+ { 1, 2, 2, 0x000018e8, 0x0000ffff, 0x20222222, },
+ { 1, 3, 0, 0x00001a24, 0xffffffff, 0x34343434, },
+ { 1, 3, 0, 0x00001a28, 0xffffffff, 0x30323434, },
+ { 1, 3, 0, 0x00001a2c, 0xffffffff, 0x34343434, },
+ { 1, 3, 0, 0x00001a30, 0xffffffff, 0x28303234, },
+ { 1, 3, 1, 0x00001a34, 0xffffffff, 0x32323232, },
+ { 1, 3, 1, 0x00001a38, 0xffffffff, 0x26283032, },
+ { 1, 3, 2, 0x00001ad8, 0xffffffff, 0x30303030, },
+ { 1, 3, 2, 0x00001adc, 0xffffffff, 0x24262830, },
+ { 1, 3, 0, 0x00001a3c, 0xffffffff, 0x34343434, },
+ { 1, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, },
+ { 1, 3, 0, 0x00001a44, 0xffffffff, 0x32322426, },
+ { 1, 3, 1, 0x00001a48, 0xffffffff, 0x30323232, },
+ { 1, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, },
+ { 1, 3, 2, 0x00001ae0, 0xffffffff, 0x30303030, },
+ { 1, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830, },
+ { 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20222222, },
+};
+
+RTW_DECL_TABLE_BB_PG(rtw8814a_bb_pg_type2);
+
+static const struct rtw_phy_pg_cfg_pair rtw8814a_bb_pg_type3[] = {
+ { 0, 0, 0, 0x00000c20, 0xffffffff, 0x48484848, },
+ { 0, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, },
+ { 0, 0, 0, 0x00000c28, 0xffffffff, 0x44464646, },
+ { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, },
+ { 0, 0, 0, 0x00000c30, 0xffffffff, 0x42444646, },
+ { 0, 0, 1, 0x00000c34, 0xffffffff, 0x46464646, },
+ { 0, 0, 1, 0x00000c38, 0xffffffff, 0x42444646, },
+ { 0, 0, 2, 0x00000cd8, 0xffffffff, 0x46464646, },
+ { 0, 0, 2, 0x00000cdc, 0xffffffff, 0x42444646, },
+ { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, },
+ { 0, 0, 0, 0x00000c40, 0xffffffff, 0x42444646, },
+ { 0, 0, 0, 0x00000c44, 0xffffffff, 0x46463840, },
+ { 0, 0, 1, 0x00000c48, 0xffffffff, 0x46464646, },
+ { 0, 0, 1, 0x00000c4c, 0xffffffff, 0x38404244, },
+ { 0, 0, 2, 0x00000ce0, 0xffffffff, 0x46464646, },
+ { 0, 0, 2, 0x00000ce4, 0xffffffff, 0x42444646, },
+ { 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x38383840, },
+ { 0, 1, 0, 0x00000e20, 0xffffffff, 0x48484848, },
+ { 0, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, },
+ { 0, 1, 0, 0x00000e28, 0xffffffff, 0x44464646, },
+ { 0, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, },
+ { 0, 1, 0, 0x00000e30, 0xffffffff, 0x42444646, },
+ { 0, 1, 1, 0x00000e34, 0xffffffff, 0x46464646, },
+ { 0, 1, 1, 0x00000e38, 0xffffffff, 0x42444646, },
+ { 0, 1, 2, 0x00000ed8, 0xffffffff, 0x46464646, },
+ { 0, 1, 2, 0x00000edc, 0xffffffff, 0x42444646, },
+ { 0, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, },
+ { 0, 1, 0, 0x00000e40, 0xffffffff, 0x42444646, },
+ { 0, 1, 0, 0x00000e44, 0xffffffff, 0x46463840, },
+ { 0, 1, 1, 0x00000e48, 0xffffffff, 0x46464646, },
+ { 0, 1, 1, 0x00000e4c, 0xffffffff, 0x38404244, },
+ { 0, 1, 2, 0x00000ee0, 0xffffffff, 0x46464646, },
+ { 0, 1, 2, 0x00000ee4, 0xffffffff, 0x42444646, },
+ { 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x38383840, },
+ { 0, 2, 0, 0x00001820, 0xffffffff, 0x48484848, },
+ { 0, 2, 0, 0x00001824, 0xffffffff, 0x46464646, },
+ { 0, 2, 0, 0x00001828, 0xffffffff, 0x44464646, },
+ { 0, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, },
+ { 0, 2, 0, 0x00001830, 0xffffffff, 0x42444646, },
+ { 0, 2, 1, 0x00001834, 0xffffffff, 0x46464646, },
+ { 0, 2, 1, 0x00001838, 0xffffffff, 0x42444646, },
+ { 0, 2, 2, 0x000018d8, 0xffffffff, 0x46464646, },
+ { 0, 2, 2, 0x000018dc, 0xffffffff, 0x42444646, },
+ { 0, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, },
+ { 0, 2, 0, 0x00001840, 0xffffffff, 0x42444646, },
+ { 0, 2, 0, 0x00001844, 0xffffffff, 0x46463840, },
+ { 0, 2, 1, 0x00001848, 0xffffffff, 0x46464646, },
+ { 0, 2, 1, 0x0000184c, 0xffffffff, 0x38404244, },
+ { 0, 2, 2, 0x000018e0, 0xffffffff, 0x46464646, },
+ { 0, 2, 2, 0x000018e4, 0xffffffff, 0x42444646, },
+ { 0, 2, 2, 0x000018e8, 0x0000ffff, 0x38383840, },
+ { 0, 3, 0, 0x00001a20, 0xffffffff, 0x48484848, },
+ { 0, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, },
+ { 0, 3, 0, 0x00001a28, 0xffffffff, 0x44464646, },
+ { 0, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, },
+ { 0, 3, 0, 0x00001a30, 0xffffffff, 0x42444646, },
+ { 0, 3, 1, 0x00001a34, 0xffffffff, 0x46464646, },
+ { 0, 3, 1, 0x00001a38, 0xffffffff, 0x42444646, },
+ { 0, 3, 2, 0x00001ad8, 0xffffffff, 0x46464646, },
+ { 0, 3, 2, 0x00001adc, 0xffffffff, 0x42444646, },
+ { 0, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, },
+ { 0, 3, 0, 0x00001a40, 0xffffffff, 0x42444646, },
+ { 0, 3, 0, 0x00001a44, 0xffffffff, 0x46463840, },
+ { 0, 3, 1, 0x00001a48, 0xffffffff, 0x46464646, },
+ { 0, 3, 1, 0x00001a4c, 0xffffffff, 0x38404244, },
+ { 0, 3, 2, 0x00001ae0, 0xffffffff, 0x46464646, },
+ { 0, 3, 2, 0x00001ae4, 0xffffffff, 0x42444646, },
+ { 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x38383840, },
+ { 1, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, },
+ { 1, 0, 0, 0x00000c28, 0xffffffff, 0x44464646, },
+ { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, },
+ { 1, 0, 0, 0x00000c30, 0xffffffff, 0x42444646, },
+ { 1, 0, 1, 0x00000c34, 0xffffffff, 0x46464646, },
+ { 1, 0, 1, 0x00000c38, 0xffffffff, 0x42444646, },
+ { 1, 0, 2, 0x00000cd8, 0xffffffff, 0x46464646, },
+ { 1, 0, 2, 0x00000cdc, 0xffffffff, 0x42444646, },
+ { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, },
+ { 1, 0, 0, 0x00000c40, 0xffffffff, 0x42444646, },
+ { 1, 0, 0, 0x00000c44, 0xffffffff, 0x46463840, },
+ { 1, 0, 1, 0x00000c48, 0xffffffff, 0x46464646, },
+ { 1, 0, 1, 0x00000c4c, 0xffffffff, 0x38404244, },
+ { 1, 0, 2, 0x00000ce0, 0xffffffff, 0x46464646, },
+ { 1, 0, 2, 0x00000ce4, 0xffffffff, 0x42444646, },
+ { 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x38383840, },
+ { 1, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, },
+ { 1, 1, 0, 0x00000e28, 0xffffffff, 0x44464646, },
+ { 1, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, },
+ { 1, 1, 0, 0x00000e30, 0xffffffff, 0x42444646, },
+ { 1, 1, 1, 0x00000e34, 0xffffffff, 0x46464646, },
+ { 1, 1, 1, 0x00000e38, 0xffffffff, 0x42444646, },
+ { 1, 1, 2, 0x00000ed8, 0xffffffff, 0x46464646, },
+ { 1, 1, 2, 0x00000edc, 0xffffffff, 0x42444646, },
+ { 1, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, },
+ { 1, 1, 0, 0x00000e40, 0xffffffff, 0x42444646, },
+ { 1, 1, 0, 0x00000e44, 0xffffffff, 0x46463840, },
+ { 1, 1, 1, 0x00000e48, 0xffffffff, 0x46464646, },
+ { 1, 1, 1, 0x00000e4c, 0xffffffff, 0x38404244, },
+ { 1, 1, 2, 0x00000ee0, 0xffffffff, 0x46464646, },
+ { 1, 1, 2, 0x00000ee4, 0xffffffff, 0x42444646, },
+ { 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x38383840, },
+ { 1, 2, 0, 0x00001824, 0xffffffff, 0x46464646, },
+ { 1, 2, 0, 0x00001828, 0xffffffff, 0x44464646, },
+ { 1, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, },
+ { 1, 2, 0, 0x00001830, 0xffffffff, 0x42444646, },
+ { 1, 2, 1, 0x00001834, 0xffffffff, 0x46464646, },
+ { 1, 2, 1, 0x00001838, 0xffffffff, 0x42444646, },
+ { 1, 2, 2, 0x000018d8, 0xffffffff, 0x46464646, },
+ { 1, 2, 2, 0x000018dc, 0xffffffff, 0x42444646, },
+ { 1, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, },
+ { 1, 2, 0, 0x00001840, 0xffffffff, 0x42444646, },
+ { 1, 2, 0, 0x00001844, 0xffffffff, 0x46463840, },
+ { 1, 2, 1, 0x00001848, 0xffffffff, 0x46464646, },
+ { 1, 2, 1, 0x0000184c, 0xffffffff, 0x38404244, },
+ { 1, 2, 2, 0x000018e0, 0xffffffff, 0x46464646, },
+ { 1, 2, 2, 0x000018e4, 0xffffffff, 0x42444646, },
+ { 1, 2, 2, 0x000018e8, 0x0000ffff, 0x38383840, },
+ { 1, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, },
+ { 1, 3, 0, 0x00001a28, 0xffffffff, 0x44464646, },
+ { 1, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, },
+ { 1, 3, 0, 0x00001a30, 0xffffffff, 0x42444646, },
+ { 1, 3, 1, 0x00001a34, 0xffffffff, 0x46464646, },
+ { 1, 3, 1, 0x00001a38, 0xffffffff, 0x42444646, },
+ { 1, 3, 2, 0x00001ad8, 0xffffffff, 0x46464646, },
+ { 1, 3, 2, 0x00001adc, 0xffffffff, 0x42444646, },
+ { 1, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, },
+ { 1, 3, 0, 0x00001a40, 0xffffffff, 0x42444646, },
+ { 1, 3, 0, 0x00001a44, 0xffffffff, 0x46463840, },
+ { 1, 3, 1, 0x00001a48, 0xffffffff, 0x46464646, },
+ { 1, 3, 1, 0x00001a4c, 0xffffffff, 0x38404244, },
+ { 1, 3, 2, 0x00001ae0, 0xffffffff, 0x46464646, },
+ { 1, 3, 2, 0x00001ae4, 0xffffffff, 0x42444646, },
+ { 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x38383840, },
+};
+
+RTW_DECL_TABLE_BB_PG(rtw8814a_bb_pg_type3);
+
+static const struct rtw_phy_pg_cfg_pair rtw8814a_bb_pg_type4[] = {
+ { 0, 0, 0, 0x00000c20, 0xffffffff, 0x42424242, },
+ { 0, 0, 0, 0x00000c24, 0xffffffff, 0x42424242, },
+ { 0, 0, 0, 0x00000c28, 0xffffffff, 0x36384042, },
+ { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x42424242, },
+ { 0, 0, 0, 0x00000c30, 0xffffffff, 0x34363840, },
+ { 0, 0, 1, 0x00000c34, 0xffffffff, 0x42424242, },
+ { 0, 0, 1, 0x00000c38, 0xffffffff, 0x34363840, },
+ { 0, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242, },
+ { 0, 0, 2, 0x00000cdc, 0xffffffff, 0x34363840, },
+ { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x42424242, },
+ { 0, 0, 0, 0x00000c40, 0xffffffff, 0x34363840, },
+ { 0, 0, 0, 0x00000c44, 0xffffffff, 0x42423032, },
+ { 0, 0, 1, 0x00000c48, 0xffffffff, 0x38404242, },
+ { 0, 0, 1, 0x00000c4c, 0xffffffff, 0x30323436, },
+ { 0, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242, },
+ { 0, 0, 2, 0x00000ce4, 0xffffffff, 0x34363840, },
+ { 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x30303032, },
+ { 0, 1, 0, 0x00000e20, 0xffffffff, 0x42424242, },
+ { 0, 1, 0, 0x00000e24, 0xffffffff, 0x42424242, },
+ { 0, 1, 0, 0x00000e28, 0xffffffff, 0x36384042, },
+ { 0, 1, 0, 0x00000e2c, 0xffffffff, 0x42424242, },
+ { 0, 1, 0, 0x00000e30, 0xffffffff, 0x34363840, },
+ { 0, 1, 1, 0x00000e34, 0xffffffff, 0x42424242, },
+ { 0, 1, 1, 0x00000e38, 0xffffffff, 0x34363840, },
+ { 0, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242, },
+ { 0, 1, 2, 0x00000edc, 0xffffffff, 0x34363840, },
+ { 0, 1, 0, 0x00000e3c, 0xffffffff, 0x42424242, },
+ { 0, 1, 0, 0x00000e40, 0xffffffff, 0x34363840, },
+ { 0, 1, 0, 0x00000e44, 0xffffffff, 0x42423032, },
+ { 0, 1, 1, 0x00000e48, 0xffffffff, 0x38404242, },
+ { 0, 1, 1, 0x00000e4c, 0xffffffff, 0x30323436, },
+ { 0, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242, },
+ { 0, 1, 2, 0x00000ee4, 0xffffffff, 0x34363840, },
+ { 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x30303032, },
+ { 0, 2, 0, 0x00001820, 0xffffffff, 0x42424242, },
+ { 0, 2, 0, 0x00001824, 0xffffffff, 0x42424242, },
+ { 0, 2, 0, 0x00001828, 0xffffffff, 0x36384042, },
+ { 0, 2, 0, 0x0000182c, 0xffffffff, 0x42424242, },
+ { 0, 2, 0, 0x00001830, 0xffffffff, 0x34363840, },
+ { 0, 2, 1, 0x00001834, 0xffffffff, 0x42424242, },
+ { 0, 2, 1, 0x00001838, 0xffffffff, 0x34363840, },
+ { 0, 2, 2, 0x000018d8, 0xffffffff, 0x42424242, },
+ { 0, 2, 2, 0x000018dc, 0xffffffff, 0x34363840, },
+ { 0, 2, 0, 0x0000183c, 0xffffffff, 0x42424242, },
+ { 0, 2, 0, 0x00001840, 0xffffffff, 0x34363840, },
+ { 0, 2, 0, 0x00001844, 0xffffffff, 0x42423032, },
+ { 0, 2, 1, 0x00001848, 0xffffffff, 0x38404242, },
+ { 0, 2, 1, 0x0000184c, 0xffffffff, 0x30323436, },
+ { 0, 2, 2, 0x000018e0, 0xffffffff, 0x42424242, },
+ { 0, 2, 2, 0x000018e4, 0xffffffff, 0x34363840, },
+ { 0, 2, 2, 0x000018e8, 0x0000ffff, 0x30303032, },
+ { 0, 3, 0, 0x00001a20, 0xffffffff, 0x42424242, },
+ { 0, 3, 0, 0x00001a24, 0xffffffff, 0x42424242, },
+ { 0, 3, 0, 0x00001a28, 0xffffffff, 0x36384042, },
+ { 0, 3, 0, 0x00001a2c, 0xffffffff, 0x42424242, },
+ { 0, 3, 0, 0x00001a30, 0xffffffff, 0x34363840, },
+ { 0, 3, 1, 0x00001a34, 0xffffffff, 0x42424242, },
+ { 0, 3, 1, 0x00001a38, 0xffffffff, 0x34363840, },
+ { 0, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242, },
+ { 0, 3, 2, 0x00001adc, 0xffffffff, 0x34363840, },
+ { 0, 3, 0, 0x00001a3c, 0xffffffff, 0x42424242, },
+ { 0, 3, 0, 0x00001a40, 0xffffffff, 0x34363840, },
+ { 0, 3, 0, 0x00001a44, 0xffffffff, 0x42423032, },
+ { 0, 3, 1, 0x00001a48, 0xffffffff, 0x38404242, },
+ { 0, 3, 1, 0x00001a4c, 0xffffffff, 0x30323436, },
+ { 0, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242, },
+ { 0, 3, 2, 0x00001ae4, 0xffffffff, 0x34363840, },
+ { 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x30303032, },
+ { 1, 0, 0, 0x00000c24, 0xffffffff, 0x42424242, },
+ { 1, 0, 0, 0x00000c28, 0xffffffff, 0x36384042, },
+ { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x42424242, },
+ { 1, 0, 0, 0x00000c30, 0xffffffff, 0x34363840, },
+ { 1, 0, 1, 0x00000c34, 0xffffffff, 0x42424242, },
+ { 1, 0, 1, 0x00000c38, 0xffffffff, 0x34363840, },
+ { 1, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242, },
+ { 1, 0, 2, 0x00000cdc, 0xffffffff, 0x34363840, },
+ { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x42424242, },
+ { 1, 0, 0, 0x00000c40, 0xffffffff, 0x34363840, },
+ { 1, 0, 0, 0x00000c44, 0xffffffff, 0x42423032, },
+ { 1, 0, 1, 0x00000c48, 0xffffffff, 0x38404242, },
+ { 1, 0, 1, 0x00000c4c, 0xffffffff, 0x30323436, },
+ { 1, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242, },
+ { 1, 0, 2, 0x00000ce4, 0xffffffff, 0x34363840, },
+ { 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x30303032, },
+ { 1, 1, 0, 0x00000e24, 0xffffffff, 0x42424242, },
+ { 1, 1, 0, 0x00000e28, 0xffffffff, 0x36384042, },
+ { 1, 1, 0, 0x00000e2c, 0xffffffff, 0x42424242, },
+ { 1, 1, 0, 0x00000e30, 0xffffffff, 0x34363840, },
+ { 1, 1, 1, 0x00000e34, 0xffffffff, 0x42424242, },
+ { 1, 1, 1, 0x00000e38, 0xffffffff, 0x34363840, },
+ { 1, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242, },
+ { 1, 1, 2, 0x00000edc, 0xffffffff, 0x34363840, },
+ { 1, 1, 0, 0x00000e3c, 0xffffffff, 0x42424242, },
+ { 1, 1, 0, 0x00000e40, 0xffffffff, 0x34363840, },
+ { 1, 1, 0, 0x00000e44, 0xffffffff, 0x42423032, },
+ { 1, 1, 1, 0x00000e48, 0xffffffff, 0x38404242, },
+ { 1, 1, 1, 0x00000e4c, 0xffffffff, 0x30323436, },
+ { 1, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242, },
+ { 1, 1, 2, 0x00000ee4, 0xffffffff, 0x34363840, },
+ { 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x30303032, },
+ { 1, 2, 0, 0x00001824, 0xffffffff, 0x42424242, },
+ { 1, 2, 0, 0x00001828, 0xffffffff, 0x36384042, },
+ { 1, 2, 0, 0x0000182c, 0xffffffff, 0x42424242, },
+ { 1, 2, 0, 0x00001830, 0xffffffff, 0x34363840, },
+ { 1, 2, 1, 0x00001834, 0xffffffff, 0x42424242, },
+ { 1, 2, 1, 0x00001838, 0xffffffff, 0x34363840, },
+ { 1, 2, 2, 0x000018d8, 0xffffffff, 0x42424242, },
+ { 1, 2, 2, 0x000018dc, 0xffffffff, 0x34363840, },
+ { 1, 2, 0, 0x0000183c, 0xffffffff, 0x42424242, },
+ { 1, 2, 0, 0x00001840, 0xffffffff, 0x34363840, },
+ { 1, 2, 0, 0x00001844, 0xffffffff, 0x42423032, },
+ { 1, 2, 1, 0x00001848, 0xffffffff, 0x38404242, },
+ { 1, 2, 1, 0x0000184c, 0xffffffff, 0x30323436, },
+ { 1, 2, 2, 0x000018e0, 0xffffffff, 0x42424242, },
+ { 1, 2, 2, 0x000018e4, 0xffffffff, 0x34363840, },
+ { 1, 2, 2, 0x000018e8, 0x0000ffff, 0x30303032, },
+ { 1, 3, 0, 0x00001a24, 0xffffffff, 0x42424242, },
+ { 1, 3, 0, 0x00001a28, 0xffffffff, 0x36384042, },
+ { 1, 3, 0, 0x00001a2c, 0xffffffff, 0x42424242, },
+ { 1, 3, 0, 0x00001a30, 0xffffffff, 0x34363840, },
+ { 1, 3, 1, 0x00001a34, 0xffffffff, 0x42424242, },
+ { 1, 3, 1, 0x00001a38, 0xffffffff, 0x34363840, },
+ { 1, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242, },
+ { 1, 3, 2, 0x00001adc, 0xffffffff, 0x34363840, },
+ { 1, 3, 0, 0x00001a3c, 0xffffffff, 0x42424242, },
+ { 1, 3, 0, 0x00001a40, 0xffffffff, 0x34363840, },
+ { 1, 3, 0, 0x00001a44, 0xffffffff, 0x42423032, },
+ { 1, 3, 1, 0x00001a48, 0xffffffff, 0x38404242, },
+ { 1, 3, 1, 0x00001a4c, 0xffffffff, 0x30323436, },
+ { 1, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242, },
+ { 1, 3, 2, 0x00001ae4, 0xffffffff, 0x34363840, },
+ { 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x30303032, },
+};
+
+RTW_DECL_TABLE_BB_PG(rtw8814a_bb_pg_type4);
+
+static const struct rtw_phy_pg_cfg_pair rtw8814a_bb_pg_type5[] = {
+ { 0, 0, 0, 0x00000c20, 0xffffffff, 0x48484848, },
+ { 0, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, },
+ { 0, 0, 0, 0x00000c28, 0xffffffff, 0x44464646, },
+ { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, },
+ { 0, 0, 0, 0x00000c30, 0xffffffff, 0x42444646, },
+ { 0, 0, 1, 0x00000c34, 0xffffffff, 0x44444444, },
+ { 0, 0, 1, 0x00000c38, 0xffffffff, 0x40424444, },
+ { 0, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242, },
+ { 0, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242, },
+ { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, },
+ { 0, 0, 0, 0x00000c40, 0xffffffff, 0x42444646, },
+ { 0, 0, 0, 0x00000c44, 0xffffffff, 0x44444040, },
+ { 0, 0, 1, 0x00000c48, 0xffffffff, 0x44444444, },
+ { 0, 0, 1, 0x00000c4c, 0xffffffff, 0x38384042, },
+ { 0, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242, },
+ { 0, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242, },
+ { 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203636, },
+ { 0, 1, 0, 0x00000e20, 0xffffffff, 0x48484848, },
+ { 0, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, },
+ { 0, 1, 0, 0x00000e28, 0xffffffff, 0x44464646, },
+ { 0, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, },
+ { 0, 1, 0, 0x00000e30, 0xffffffff, 0x42444646, },
+ { 0, 1, 1, 0x00000e34, 0xffffffff, 0x44444444, },
+ { 0, 1, 1, 0x00000e38, 0xffffffff, 0x40424444, },
+ { 0, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242, },
+ { 0, 1, 2, 0x00000edc, 0xffffffff, 0x38404242, },
+ { 0, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, },
+ { 0, 1, 0, 0x00000e40, 0xffffffff, 0x42444646, },
+ { 0, 1, 0, 0x00000e44, 0xffffffff, 0x44444040, },
+ { 0, 1, 1, 0x00000e48, 0xffffffff, 0x44444444, },
+ { 0, 1, 1, 0x00000e4c, 0xffffffff, 0x38384042, },
+ { 0, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242, },
+ { 0, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242, },
+ { 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203636, },
+ { 0, 2, 0, 0x00001820, 0xffffffff, 0x48484848, },
+ { 0, 2, 0, 0x00001824, 0xffffffff, 0x46464646, },
+ { 0, 2, 0, 0x00001828, 0xffffffff, 0x44464646, },
+ { 0, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, },
+ { 0, 2, 0, 0x00001830, 0xffffffff, 0x42444646, },
+ { 0, 2, 1, 0x00001834, 0xffffffff, 0x44444444, },
+ { 0, 2, 1, 0x00001838, 0xffffffff, 0x40424444, },
+ { 0, 2, 2, 0x000018d8, 0xffffffff, 0x42424242, },
+ { 0, 2, 2, 0x000018dc, 0xffffffff, 0x38404242, },
+ { 0, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, },
+ { 0, 2, 0, 0x00001840, 0xffffffff, 0x42444646, },
+ { 0, 2, 0, 0x00001844, 0xffffffff, 0x44444040, },
+ { 0, 2, 1, 0x00001848, 0xffffffff, 0x44444444, },
+ { 0, 2, 1, 0x0000184c, 0xffffffff, 0x38384042, },
+ { 0, 2, 2, 0x000018e0, 0xffffffff, 0x42424242, },
+ { 0, 2, 2, 0x000018e4, 0xffffffff, 0x38404242, },
+ { 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20203636, },
+ { 0, 3, 0, 0x00001a20, 0xffffffff, 0x48484848, },
+ { 0, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, },
+ { 0, 3, 0, 0x00001a28, 0xffffffff, 0x44464646, },
+ { 0, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, },
+ { 0, 3, 0, 0x00001a30, 0xffffffff, 0x42444646, },
+ { 0, 3, 1, 0x00001a34, 0xffffffff, 0x44444444, },
+ { 0, 3, 1, 0x00001a38, 0xffffffff, 0x40424444, },
+ { 0, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242, },
+ { 0, 3, 2, 0x00001adc, 0xffffffff, 0x38404242, },
+ { 0, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, },
+ { 0, 3, 0, 0x00001a40, 0xffffffff, 0x42444646, },
+ { 0, 3, 0, 0x00001a44, 0xffffffff, 0x44444040, },
+ { 0, 3, 1, 0x00001a48, 0xffffffff, 0x44444444, },
+ { 0, 3, 1, 0x00001a4c, 0xffffffff, 0x38384042, },
+ { 0, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242, },
+ { 0, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242, },
+ { 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203636, },
+ { 1, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, },
+ { 1, 0, 0, 0x00000c28, 0xffffffff, 0x44464646, },
+ { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, },
+ { 1, 0, 0, 0x00000c30, 0xffffffff, 0x42444646, },
+ { 1, 0, 1, 0x00000c34, 0xffffffff, 0x44444444, },
+ { 1, 0, 1, 0x00000c38, 0xffffffff, 0x40424444, },
+ { 1, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242, },
+ { 1, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242, },
+ { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, },
+ { 1, 0, 0, 0x00000c40, 0xffffffff, 0x42444646, },
+ { 1, 0, 0, 0x00000c44, 0xffffffff, 0x44443840, },
+ { 1, 0, 1, 0x00000c48, 0xffffffff, 0x44444444, },
+ { 1, 0, 1, 0x00000c4c, 0xffffffff, 0x36384042, },
+ { 1, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242, },
+ { 1, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242, },
+ { 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203436, },
+ { 1, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, },
+ { 1, 1, 0, 0x00000e28, 0xffffffff, 0x44464646, },
+ { 1, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, },
+ { 1, 1, 0, 0x00000e30, 0xffffffff, 0x42444646, },
+ { 1, 1, 1, 0x00000e34, 0xffffffff, 0x44444444, },
+ { 1, 1, 1, 0x00000e38, 0xffffffff, 0x40424444, },
+ { 1, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242, },
+ { 1, 1, 2, 0x00000edc, 0xffffffff, 0x38404242, },
+ { 1, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, },
+ { 1, 1, 0, 0x00000e40, 0xffffffff, 0x42444646, },
+ { 1, 1, 0, 0x00000e44, 0xffffffff, 0x44443840, },
+ { 1, 1, 1, 0x00000e48, 0xffffffff, 0x44444444, },
+ { 1, 1, 1, 0x00000e4c, 0xffffffff, 0x36384042, },
+ { 1, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242, },
+ { 1, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242, },
+ { 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203436, },
+ { 1, 2, 0, 0x00001824, 0xffffffff, 0x46464646, },
+ { 1, 2, 0, 0x00001828, 0xffffffff, 0x44464646, },
+ { 1, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, },
+ { 1, 2, 0, 0x00001830, 0xffffffff, 0x42444646, },
+ { 1, 2, 1, 0x00001834, 0xffffffff, 0x44444444, },
+ { 1, 2, 1, 0x00001838, 0xffffffff, 0x40424444, },
+ { 1, 2, 2, 0x000018d8, 0xffffffff, 0x42424242, },
+ { 1, 2, 2, 0x000018dc, 0xffffffff, 0x38404242, },
+ { 1, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, },
+ { 1, 2, 0, 0x00001840, 0xffffffff, 0x42444646, },
+ { 1, 2, 0, 0x00001844, 0xffffffff, 0x44443840, },
+ { 1, 2, 1, 0x00001848, 0xffffffff, 0x44444444, },
+ { 1, 2, 1, 0x0000184c, 0xffffffff, 0x36384042, },
+ { 1, 2, 2, 0x000018e0, 0xffffffff, 0x42424242, },
+ { 1, 2, 2, 0x000018e4, 0xffffffff, 0x38404242, },
+ { 1, 2, 2, 0x000018e8, 0x0000ffff, 0x20203436, },
+ { 1, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, },
+ { 1, 3, 0, 0x00001a28, 0xffffffff, 0x44464646, },
+ { 1, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, },
+ { 1, 3, 0, 0x00001a30, 0xffffffff, 0x42444646, },
+ { 1, 3, 1, 0x00001a34, 0xffffffff, 0x44444444, },
+ { 1, 3, 1, 0x00001a38, 0xffffffff, 0x40424444, },
+ { 1, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242, },
+ { 1, 3, 2, 0x00001adc, 0xffffffff, 0x38404242, },
+ { 1, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, },
+ { 1, 3, 0, 0x00001a40, 0xffffffff, 0x42444646, },
+ { 1, 3, 0, 0x00001a44, 0xffffffff, 0x44443840, },
+ { 1, 3, 1, 0x00001a48, 0xffffffff, 0x44444444, },
+ { 1, 3, 1, 0x00001a4c, 0xffffffff, 0x36384042, },
+ { 1, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242, },
+ { 1, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242, },
+ { 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203436, },
+};
+
+RTW_DECL_TABLE_BB_PG(rtw8814a_bb_pg_type5);
+
+static const struct rtw_phy_pg_cfg_pair rtw8814a_bb_pg_type7[] = {
+ { 0, 0, 0, 0x00000c20, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c24, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c28, 0xffffffff, 0x30323434, },
+ { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303234, },
+ { 0, 0, 1, 0x00000c34, 0xffffffff, 0x34343434, },
+ { 0, 0, 1, 0x00000c38, 0xffffffff, 0x28303234, },
+ { 0, 0, 2, 0x00000cd8, 0xffffffff, 0x34343434, },
+ { 0, 0, 2, 0x00000cdc, 0xffffffff, 0x28303234, },
+ { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, },
+ { 0, 0, 0, 0x00000c44, 0xffffffff, 0x34342426, },
+ { 0, 0, 1, 0x00000c48, 0xffffffff, 0x32343434, },
+ { 0, 0, 1, 0x00000c4c, 0xffffffff, 0x24262830, },
+ { 0, 0, 2, 0x00000ce0, 0xffffffff, 0x34343434, },
+ { 0, 0, 2, 0x00000ce4, 0xffffffff, 0x28303234, },
+ { 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x24263434, },
+ { 0, 1, 0, 0x00000e20, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e24, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e28, 0xffffffff, 0x30323434, },
+ { 0, 1, 0, 0x00000e2c, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303234, },
+ { 0, 1, 1, 0x00000e34, 0xffffffff, 0x34343434, },
+ { 0, 1, 1, 0x00000e38, 0xffffffff, 0x28303234, },
+ { 0, 1, 2, 0x00000ed8, 0xffffffff, 0x34343434, },
+ { 0, 1, 2, 0x00000edc, 0xffffffff, 0x28303234, },
+ { 0, 1, 0, 0x00000e3c, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, },
+ { 0, 1, 0, 0x00000e44, 0xffffffff, 0x34342426, },
+ { 0, 1, 1, 0x00000e48, 0xffffffff, 0x32343434, },
+ { 0, 1, 1, 0x00000e4c, 0xffffffff, 0x24262830, },
+ { 0, 1, 2, 0x00000ee0, 0xffffffff, 0x34343434, },
+ { 0, 1, 2, 0x00000ee4, 0xffffffff, 0x28303234, },
+ { 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x24263434, },
+ { 0, 2, 0, 0x00001820, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001824, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001828, 0xffffffff, 0x30323434, },
+ { 0, 2, 0, 0x0000182c, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001830, 0xffffffff, 0x28303234, },
+ { 0, 2, 1, 0x00001834, 0xffffffff, 0x34343434, },
+ { 0, 2, 1, 0x00001838, 0xffffffff, 0x28303234, },
+ { 0, 2, 2, 0x000018d8, 0xffffffff, 0x34343434, },
+ { 0, 2, 2, 0x000018dc, 0xffffffff, 0x28303234, },
+ { 0, 2, 0, 0x0000183c, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001840, 0xffffffff, 0x28303234, },
+ { 0, 2, 0, 0x00001844, 0xffffffff, 0x34342426, },
+ { 0, 2, 1, 0x00001848, 0xffffffff, 0x32343434, },
+ { 0, 2, 1, 0x0000184c, 0xffffffff, 0x24262830, },
+ { 0, 2, 2, 0x000018e0, 0xffffffff, 0x34343434, },
+ { 0, 2, 2, 0x000018e4, 0xffffffff, 0x28303234, },
+ { 0, 2, 2, 0x000018e8, 0x0000ffff, 0x24263434, },
+ { 0, 3, 0, 0x00001a20, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a24, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a28, 0xffffffff, 0x30323434, },
+ { 0, 3, 0, 0x00001a2c, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a30, 0xffffffff, 0x28303234, },
+ { 0, 3, 1, 0x00001a34, 0xffffffff, 0x34343434, },
+ { 0, 3, 1, 0x00001a38, 0xffffffff, 0x28303234, },
+ { 0, 3, 2, 0x00001ad8, 0xffffffff, 0x34343434, },
+ { 0, 3, 2, 0x00001adc, 0xffffffff, 0x28303234, },
+ { 0, 3, 0, 0x00001a3c, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, },
+ { 0, 3, 0, 0x00001a44, 0xffffffff, 0x34342426, },
+ { 0, 3, 1, 0x00001a48, 0xffffffff, 0x32343434, },
+ { 0, 3, 1, 0x00001a4c, 0xffffffff, 0x24262830, },
+ { 0, 3, 2, 0x00001ae0, 0xffffffff, 0x34343434, },
+ { 0, 3, 2, 0x00001ae4, 0xffffffff, 0x28303234, },
+ { 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x24263434, },
+ { 1, 0, 0, 0x00000c24, 0xffffffff, 0x34343434, },
+ { 1, 0, 0, 0x00000c28, 0xffffffff, 0x30323434, },
+ { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x34343434, },
+ { 1, 0, 0, 0x00000c30, 0xffffffff, 0x28303234, },
+ { 1, 0, 1, 0x00000c34, 0xffffffff, 0x34343434, },
+ { 1, 0, 1, 0x00000c38, 0xffffffff, 0x28303234, },
+ { 1, 0, 2, 0x00000cd8, 0xffffffff, 0x34343434, },
+ { 1, 0, 2, 0x00000cdc, 0xffffffff, 0x28303234, },
+ { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x34343434, },
+ { 1, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, },
+ { 1, 0, 0, 0x00000c44, 0xffffffff, 0x34342426, },
+ { 1, 0, 1, 0x00000c48, 0xffffffff, 0x32343434, },
+ { 1, 0, 1, 0x00000c4c, 0xffffffff, 0x24262830, },
+ { 1, 0, 2, 0x00000ce0, 0xffffffff, 0x34343434, },
+ { 1, 0, 2, 0x00000ce4, 0xffffffff, 0x28303234, },
+ { 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x24263434, },
+ { 1, 1, 0, 0x00000e24, 0xffffffff, 0x34343434, },
+ { 1, 1, 0, 0x00000e28, 0xffffffff, 0x30323434, },
+ { 1, 1, 0, 0x00000e2c, 0xffffffff, 0x34343434, },
+ { 1, 1, 0, 0x00000e30, 0xffffffff, 0x28303234, },
+ { 1, 1, 1, 0x00000e34, 0xffffffff, 0x34343434, },
+ { 1, 1, 1, 0x00000e38, 0xffffffff, 0x28303234, },
+ { 1, 1, 2, 0x00000ed8, 0xffffffff, 0x34343434, },
+ { 1, 1, 2, 0x00000edc, 0xffffffff, 0x28303234, },
+ { 1, 1, 0, 0x00000e3c, 0xffffffff, 0x34343434, },
+ { 1, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, },
+ { 1, 1, 0, 0x00000e44, 0xffffffff, 0x34342426, },
+ { 1, 1, 1, 0x00000e48, 0xffffffff, 0x32343434, },
+ { 1, 1, 1, 0x00000e4c, 0xffffffff, 0x24262830, },
+ { 1, 1, 2, 0x00000ee0, 0xffffffff, 0x34343434, },
+ { 1, 1, 2, 0x00000ee4, 0xffffffff, 0x28303234, },
+ { 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x24263434, },
+ { 1, 2, 0, 0x00001824, 0xffffffff, 0x34343434, },
+ { 1, 2, 0, 0x00001828, 0xffffffff, 0x30323434, },
+ { 1, 2, 0, 0x0000182c, 0xffffffff, 0x34343434, },
+ { 1, 2, 0, 0x00001830, 0xffffffff, 0x28303234, },
+ { 1, 2, 1, 0x00001834, 0xffffffff, 0x34343434, },
+ { 1, 2, 1, 0x00001838, 0xffffffff, 0x28303234, },
+ { 1, 2, 2, 0x000018d8, 0xffffffff, 0x34343434, },
+ { 1, 2, 2, 0x000018dc, 0xffffffff, 0x28303234, },
+ { 1, 2, 0, 0x0000183c, 0xffffffff, 0x34343434, },
+ { 1, 2, 0, 0x00001840, 0xffffffff, 0x28303234, },
+ { 1, 2, 0, 0x00001844, 0xffffffff, 0x34342426, },
+ { 1, 2, 1, 0x00001848, 0xffffffff, 0x32343434, },
+ { 1, 2, 1, 0x0000184c, 0xffffffff, 0x24262830, },
+ { 1, 2, 2, 0x000018e0, 0xffffffff, 0x34343434, },
+ { 1, 2, 2, 0x000018e4, 0xffffffff, 0x28303234, },
+ { 1, 2, 2, 0x000018e8, 0x0000ffff, 0x24263434, },
+ { 1, 3, 0, 0x00001a24, 0xffffffff, 0x34343434, },
+ { 1, 3, 0, 0x00001a28, 0xffffffff, 0x30323434, },
+ { 1, 3, 0, 0x00001a2c, 0xffffffff, 0x34343434, },
+ { 1, 3, 0, 0x00001a30, 0xffffffff, 0x28303234, },
+ { 1, 3, 1, 0x00001a34, 0xffffffff, 0x34343434, },
+ { 1, 3, 1, 0x00001a38, 0xffffffff, 0x28303234, },
+ { 1, 3, 2, 0x00001ad8, 0xffffffff, 0x34343434, },
+ { 1, 3, 2, 0x00001adc, 0xffffffff, 0x28303234, },
+ { 1, 3, 0, 0x00001a3c, 0xffffffff, 0x34343434, },
+ { 1, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, },
+ { 1, 3, 0, 0x00001a44, 0xffffffff, 0x34342426, },
+ { 1, 3, 1, 0x00001a48, 0xffffffff, 0x32343434, },
+ { 1, 3, 1, 0x00001a4c, 0xffffffff, 0x24262830, },
+ { 1, 3, 2, 0x00001ae0, 0xffffffff, 0x34343434, },
+ { 1, 3, 2, 0x00001ae4, 0xffffffff, 0x28303234, },
+ { 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x24263434, },
+};
+
+RTW_DECL_TABLE_BB_PG(rtw8814a_bb_pg_type7);
+
+static const struct rtw_phy_pg_cfg_pair rtw8814a_bb_pg_type8[] = {
+ { 0, 0, 0, 0x00000c20, 0xffffffff, 0x43434343, },
+ { 0, 0, 0, 0x00000c24, 0xffffffff, 0x43434343, },
+ { 0, 0, 0, 0x00000c28, 0xffffffff, 0x35373941, },
+ { 0, 0, 0, 0x00000c2c, 0xffffffff, 0x43434343, },
+ { 0, 0, 0, 0x00000c30, 0xffffffff, 0x33353739, },
+ { 0, 0, 1, 0x00000c34, 0xffffffff, 0x43434343, },
+ { 0, 0, 1, 0x00000c38, 0xffffffff, 0x31333537, },
+ { 0, 0, 2, 0x00000cd8, 0xffffffff, 0x43434343, },
+ { 0, 0, 2, 0x00000cdc, 0xffffffff, 0x29313335, },
+ { 0, 0, 0, 0x00000c3c, 0xffffffff, 0x34343434, },
+ { 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, },
+ { 0, 0, 0, 0x00000c44, 0xffffffff, 0x32322426, },
+ { 0, 0, 1, 0x00000c48, 0xffffffff, 0x30323232, },
+ { 0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, },
+ { 0, 0, 2, 0x00000ce0, 0xffffffff, 0x30303030, },
+ { 0, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830, },
+ { 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20222222, },
+ { 0, 1, 0, 0x00000e20, 0xffffffff, 0x43434343, },
+ { 0, 1, 0, 0x00000e24, 0xffffffff, 0x43434343, },
+ { 0, 1, 0, 0x00000e28, 0xffffffff, 0x35373941, },
+ { 0, 1, 0, 0x00000e2c, 0xffffffff, 0x41434343, },
+ { 0, 1, 0, 0x00000e30, 0xffffffff, 0x33353739, },
+ { 0, 1, 1, 0x00000e34, 0xffffffff, 0x39414141, },
+ { 0, 1, 1, 0x00000e38, 0xffffffff, 0x31333537, },
+ { 0, 1, 2, 0x00000ed8, 0xffffffff, 0x37393939, },
+ { 0, 1, 2, 0x00000edc, 0xffffffff, 0x29313335, },
+ { 0, 1, 0, 0x00000e3c, 0xffffffff, 0x34343434, },
+ { 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, },
+ { 0, 1, 0, 0x00000e44, 0xffffffff, 0x32322426, },
+ { 0, 1, 1, 0x00000e48, 0xffffffff, 0x30323232, },
+ { 0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, },
+ { 0, 1, 2, 0x00000ee0, 0xffffffff, 0x30303030, },
+ { 0, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830, },
+ { 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20222222, },
+ { 0, 2, 0, 0x00001820, 0xffffffff, 0x43434343, },
+ { 0, 2, 0, 0x00001824, 0xffffffff, 0x43434343, },
+ { 0, 2, 0, 0x00001828, 0xffffffff, 0x35373941, },
+ { 0, 2, 0, 0x0000182c, 0xffffffff, 0x41434343, },
+ { 0, 2, 0, 0x00001830, 0xffffffff, 0x33353739, },
+ { 0, 2, 1, 0x00001834, 0xffffffff, 0x39414141, },
+ { 0, 2, 1, 0x00001838, 0xffffffff, 0x31333537, },
+ { 0, 2, 2, 0x000018d8, 0xffffffff, 0x37393939, },
+ { 0, 2, 2, 0x000018dc, 0xffffffff, 0x29313335, },
+ { 0, 2, 0, 0x0000183c, 0xffffffff, 0x34343434, },
+ { 0, 2, 0, 0x00001840, 0xffffffff, 0x28303234, },
+ { 0, 2, 0, 0x00001844, 0xffffffff, 0x32322426, },
+ { 0, 2, 1, 0x00001848, 0xffffffff, 0x30323232, },
+ { 0, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, },
+ { 0, 2, 2, 0x000018e0, 0xffffffff, 0x30303030, },
+ { 0, 2, 2, 0x000018e4, 0xffffffff, 0x24262830, },
+ { 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20222222, },
+ { 0, 3, 0, 0x00001a20, 0xffffffff, 0x43434343, },
+ { 0, 3, 0, 0x00001a24, 0xffffffff, 0x43434343, },
+ { 0, 3, 0, 0x00001a28, 0xffffffff, 0x35373941, },
+ { 0, 3, 0, 0x00001a2c, 0xffffffff, 0x41434343, },
+ { 0, 3, 0, 0x00001a30, 0xffffffff, 0x33353739, },
+ { 0, 3, 1, 0x00001a34, 0xffffffff, 0x39414141, },
+ { 0, 3, 1, 0x00001a38, 0xffffffff, 0x31333537, },
+ { 0, 3, 2, 0x00001ad8, 0xffffffff, 0x37393939, },
+ { 0, 3, 2, 0x00001adc, 0xffffffff, 0x29313335, },
+ { 0, 3, 0, 0x00001a3c, 0xffffffff, 0x34343434, },
+ { 0, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, },
+ { 0, 3, 0, 0x00001a44, 0xffffffff, 0x32322426, },
+ { 0, 3, 1, 0x00001a48, 0xffffffff, 0x30323232, },
+ { 0, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, },
+ { 0, 3, 2, 0x00001ae0, 0xffffffff, 0x30303030, },
+ { 0, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830, },
+ { 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20222222, },
+ { 1, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, },
+ { 1, 0, 0, 0x00000c28, 0xffffffff, 0x39414345, },
+ { 1, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, },
+ { 1, 0, 0, 0x00000c30, 0xffffffff, 0x38404244, },
+ { 1, 0, 1, 0x00000c34, 0xffffffff, 0x46464646, },
+ { 1, 0, 1, 0x00000c38, 0xffffffff, 0x36384042, },
+ { 1, 0, 2, 0x00000cd8, 0xffffffff, 0x46464646, },
+ { 1, 0, 2, 0x00000cdc, 0xffffffff, 0x34363840, },
+ { 1, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, },
+ { 1, 0, 0, 0x00000c40, 0xffffffff, 0x38404244, },
+ { 1, 0, 0, 0x00000c44, 0xffffffff, 0x46463738, },
+ { 1, 0, 1, 0x00000c48, 0xffffffff, 0x42444646, },
+ { 1, 0, 1, 0x00000c4c, 0xffffffff, 0x35373840, },
+ { 1, 0, 2, 0x00000ce0, 0xffffffff, 0x46464646, },
+ { 1, 0, 2, 0x00000ce4, 0xffffffff, 0x37394143, },
+ { 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x33333335, },
+ { 1, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, },
+ { 1, 1, 0, 0x00000e28, 0xffffffff, 0x39414345, },
+ { 1, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, },
+ { 1, 1, 0, 0x00000e30, 0xffffffff, 0x38404244, },
+ { 1, 1, 1, 0x00000e34, 0xffffffff, 0x46464646, },
+ { 1, 1, 1, 0x00000e38, 0xffffffff, 0x36384042, },
+ { 1, 1, 2, 0x00000ed8, 0xffffffff, 0x46464646, },
+ { 1, 1, 2, 0x00000edc, 0xffffffff, 0x34363840, },
+ { 1, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, },
+ { 1, 1, 0, 0x00000e40, 0xffffffff, 0x38404244, },
+ { 1, 1, 0, 0x00000e44, 0xffffffff, 0x46463738, },
+ { 1, 1, 1, 0x00000e48, 0xffffffff, 0x42444646, },
+ { 1, 1, 1, 0x00000e4c, 0xffffffff, 0x35373840, },
+ { 1, 1, 2, 0x00000ee0, 0xffffffff, 0x46464646, },
+ { 1, 1, 2, 0x00000ee4, 0xffffffff, 0x37394143, },
+ { 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x33333335, },
+ { 1, 2, 0, 0x00001824, 0xffffffff, 0x46464646, },
+ { 1, 2, 0, 0x00001828, 0xffffffff, 0x39414345, },
+ { 1, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, },
+ { 1, 2, 0, 0x00001830, 0xffffffff, 0x38404244, },
+ { 1, 2, 1, 0x00001834, 0xffffffff, 0x46464646, },
+ { 1, 2, 1, 0x00001838, 0xffffffff, 0x36384042, },
+ { 1, 2, 2, 0x000018d8, 0xffffffff, 0x46464646, },
+ { 1, 2, 2, 0x000018dc, 0xffffffff, 0x34363840, },
+ { 1, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, },
+ { 1, 2, 0, 0x00001840, 0xffffffff, 0x38404244, },
+ { 1, 2, 0, 0x00001844, 0xffffffff, 0x46463738, },
+ { 1, 2, 1, 0x00001848, 0xffffffff, 0x42444646, },
+ { 1, 2, 1, 0x0000184c, 0xffffffff, 0x35373840, },
+ { 1, 2, 2, 0x000018e0, 0xffffffff, 0x46464646, },
+ { 1, 2, 2, 0x000018e4, 0xffffffff, 0x37394143, },
+ { 1, 2, 2, 0x000018e8, 0x0000ffff, 0x33333335, },
+ { 1, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, },
+ { 1, 3, 0, 0x00001a28, 0xffffffff, 0x39414345, },
+ { 1, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, },
+ { 1, 3, 0, 0x00001a30, 0xffffffff, 0x38404244, },
+ { 1, 3, 1, 0x00001a34, 0xffffffff, 0x46464646, },
+ { 1, 3, 1, 0x00001a38, 0xffffffff, 0x36384042, },
+ { 1, 3, 2, 0x00001ad8, 0xffffffff, 0x46464646, },
+ { 1, 3, 2, 0x00001adc, 0xffffffff, 0x34363840, },
+ { 1, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, },
+ { 1, 3, 0, 0x00001a40, 0xffffffff, 0x38404244, },
+ { 1, 3, 0, 0x00001a44, 0xffffffff, 0x46463738, },
+ { 1, 3, 1, 0x00001a48, 0xffffffff, 0x42444646, },
+ { 1, 3, 1, 0x00001a4c, 0xffffffff, 0x35373840, },
+ { 1, 3, 2, 0x00001ae0, 0xffffffff, 0x46464646, },
+ { 1, 3, 2, 0x00001ae4, 0xffffffff, 0x37394143, },
+ { 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x33333335, },
+};
+
+RTW_DECL_TABLE_BB_PG(rtw8814a_bb_pg_type8);
+
+static const u32 rtw8814a_rf_a[] = {
+ 0x018, 0x00013124,
+ 0x040, 0x00000C00,
+ 0x058, 0x00000F98,
+ 0x07F, 0x00068004,
+ 0x0B0, 0x000FFFFE,
+ 0x0B1, 0x0003FF48,
+ 0x0B2, 0x0006AA3F,
+ 0x0B3, 0x000FFC9A,
+ 0x0B4, 0x0000A78F,
+ 0x0B5, 0x00000A3F,
+ 0x0B6, 0x0000C09C,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B7, 0x00030008,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B7, 0x00030008,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B7, 0x00030008,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B7, 0x00030008,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B7, 0x00030008,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B7, 0x00030008,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B7, 0x00030008,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B7, 0x00030008,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B7, 0x00030008,
+ 0xA0000000, 0x00000000,
+ 0x0B7, 0x0003000C,
+ 0xB0000000, 0x00000000,
+ 0x0B8, 0x0007400E,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B9, 0x000FBF50,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B9, 0x000FBF50,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B9, 0x000FBF50,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B9, 0x000FBF50,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B9, 0x000FBF50,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B9, 0x000FBF50,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B9, 0x000FBF50,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B9, 0x000FBF50,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x0B9, 0x000FBF50,
+ 0xA0000000, 0x00000000,
+ 0x0B9, 0x000FBF50,
+ 0xB0000000, 0x00000000,
+ 0x0BA, 0x00050780,
+ 0x0BB, 0x00000000,
+ 0x0BC, 0x00040009,
+ 0x0BD, 0x00000000,
+ 0x0BE, 0x00000000,
+ 0x0BF, 0x00000000,
+ 0x0EF, 0x00020000,
+ 0x03E, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03F, 0x00030000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03F, 0x00030000,
+ 0xA0000000, 0x00000000,
+ 0x03F, 0x00030000,
+ 0xB0000000, 0x00000000,
+ 0x03E, 0x00020000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03F, 0x00040000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03F, 0x00040000,
+ 0xA0000000, 0x00000000,
+ 0x03F, 0x00040000,
+ 0xB0000000, 0x00000000,
+ 0x03E, 0x00040000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03F, 0x00030000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03F, 0x00030000,
+ 0xA0000000, 0x00000000,
+ 0x03F, 0x00030000,
+ 0xB0000000, 0x00000000,
+ 0x03E, 0x00060000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03F, 0x00030000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03F, 0x00030000,
+ 0xA0000000, 0x00000000,
+ 0x03F, 0x00030000,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x00010000,
+ 0x03E, 0x00000000,
+ 0x03F, 0x00006800,
+ 0x03E, 0x00000080,
+ 0x03F, 0x00006000,
+ 0x03E, 0x00000100,
+ 0x03F, 0x00004800,
+ 0x03E, 0x00000180,
+ 0x03F, 0x00004000,
+ 0x03E, 0x00000200,
+ 0x03F, 0x00004000,
+ 0x03E, 0x00000280,
+ 0x03F, 0x00002800,
+ 0x03E, 0x00000300,
+ 0x03F, 0x00002800,
+ 0x03E, 0x00000380,
+ 0x03F, 0x00002000,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x00040000,
+ 0x03E, 0x00000000,
+ 0x03F, 0x000000BC,
+ 0x03E, 0x00000040,
+ 0x03F, 0x00000053,
+ 0x03E, 0x00000050,
+ 0x03F, 0x00000050,
+ 0x03E, 0x00000060,
+ 0x03F, 0x00000050,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x00000400,
+ 0x03E, 0x00000006,
+ 0x041, 0x000EE080,
+ 0x03E, 0x00000008,
+ 0x041, 0x000EE0C0,
+ 0x03E, 0x0000000A,
+ 0x041, 0x000EE100,
+ 0x03E, 0x0000000C,
+ 0x041, 0x000EE100,
+ 0x0EF, 0x00000000,
+ 0x018, 0x00000006,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0xA0000000, 0x00000000,
+ 0x086, 0x000E4B58,
+ 0x087, 0x00049F80,
+ 0xB0000000, 0x00000000,
+ 0x0DF, 0x00000008,
+ 0x0EF, 0x00002000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x000179C3,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x000179C3,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x000179C3,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x000179C3,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x000179C3,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x000179C3,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x000179C3,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0003F258,
+ 0x03B, 0x00030A58,
+ 0x03B, 0x0002FA58,
+ 0x03B, 0x00022590,
+ 0x03B, 0x0001FA50,
+ 0x03B, 0x00010248,
+ 0x03B, 0x00008240,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000100,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0000ADF6,
+ 0x034, 0x00009DF3,
+ 0x034, 0x00008DF0,
+ 0x034, 0x00007DED,
+ 0x034, 0x00006DEA,
+ 0x034, 0x00005CED,
+ 0x034, 0x00004CEA,
+ 0x034, 0x000034EA,
+ 0x034, 0x000024E7,
+ 0x034, 0x0000146A,
+ 0x034, 0x0000006B,
+ 0xB0000000, 0x00000000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0008ADF6,
+ 0x034, 0x00089DF3,
+ 0x034, 0x00088DF0,
+ 0x034, 0x00087DED,
+ 0x034, 0x00086DEA,
+ 0x034, 0x00085CED,
+ 0x034, 0x00084CEA,
+ 0x034, 0x000834EA,
+ 0x034, 0x000824E7,
+ 0x034, 0x0008146A,
+ 0x034, 0x0008006B,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x000020A2,
+ 0x0DF, 0x00000080,
+ 0x035, 0x00000192,
+ 0x035, 0x00008192,
+ 0x035, 0x00010192,
+ 0x036, 0x00000024,
+ 0x036, 0x00008024,
+ 0x036, 0x00010024,
+ 0x036, 0x00018024,
+ 0x0EF, 0x00000000,
+ 0x051, 0x00000C21,
+ 0x052, 0x000006D9,
+ 0x053, 0x000FC649,
+ 0x054, 0x0000017E,
+ 0x018, 0x0001012A,
+ 0x081, 0x0007FC00,
+ 0x089, 0x00050110,
+ 0x08A, 0x00043E50,
+ 0x08B, 0x0002E180,
+ 0x08C, 0x00093C3C,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0xA0000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0xA0000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00001000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00084000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00028000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00030023,
+ 0x03C, 0x00048000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00028623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00021633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0001C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00010293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00009593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x80000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0000118B,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0000078B,
+ 0xB0000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x000AC000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00040000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x0004C000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00070023,
+ 0x03C, 0x00048000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00068623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00061633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0005C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00050293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00049593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x80000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0004138B,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0004078B,
+ 0xB0000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00084000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0008C000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00084000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00084000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00060000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00084000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00084000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00004000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B0023,
+ 0x80000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000A8623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000A1633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0009C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00090293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00089593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x80000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0008118B,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0008078B,
+ 0xB0000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x00000800,
+ 0x03B, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000801,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0xB0000000, 0x00000000,
+ 0x03B, 0x00040000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001801,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000003,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000003,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001001,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0xB0000000, 0x00000000,
+ 0x03B, 0x00080000,
+ 0x80000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001802,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000800,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00001002,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0x0EF, 0x00000100,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A1AD,
+ 0x034, 0x000491AA,
+ 0x034, 0x000481A7,
+ 0x034, 0x000470AA,
+ 0x034, 0x000460A7,
+ 0x034, 0x00045049,
+ 0x034, 0x00044046,
+ 0x034, 0x00043026,
+ 0x034, 0x00042009,
+ 0x034, 0x00041006,
+ 0x034, 0x00040003,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AF,
+ 0x034, 0x000483AB,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004406A,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AF,
+ 0x034, 0x000483AB,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004406A,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AF,
+ 0x034, 0x000483AB,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004406A,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AF,
+ 0x034, 0x000483AB,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004406A,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3F5,
+ 0x034, 0x000493F2,
+ 0x034, 0x000483B0,
+ 0x034, 0x00047370,
+ 0x034, 0x0004636D,
+ 0x034, 0x0004536A,
+ 0x034, 0x00044349,
+ 0x034, 0x0004316A,
+ 0x034, 0x00042167,
+ 0x034, 0x00041129,
+ 0x034, 0x00040049,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AF,
+ 0x034, 0x000483AB,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004406A,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AF,
+ 0x034, 0x000483AB,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004406A,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0004AFF1,
+ 0x034, 0x00049FEE,
+ 0x034, 0x00048FEB,
+ 0x034, 0x00047FE8,
+ 0x034, 0x00046DEA,
+ 0x034, 0x00045DE7,
+ 0x034, 0x00044CEA,
+ 0x034, 0x00043CE7,
+ 0x034, 0x00042C69,
+ 0x034, 0x00041C66,
+ 0x034, 0x00040C28,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A1AD,
+ 0x034, 0x000291AA,
+ 0x034, 0x000281A7,
+ 0x034, 0x000270AA,
+ 0x034, 0x000260A7,
+ 0x034, 0x00025049,
+ 0x034, 0x00024046,
+ 0x034, 0x00023026,
+ 0x034, 0x00022009,
+ 0x034, 0x00021006,
+ 0x034, 0x00020003,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EF,
+ 0x034, 0x000293AC,
+ 0x034, 0x0002838A,
+ 0x034, 0x0002718C,
+ 0x034, 0x00026189,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EF,
+ 0x034, 0x000293AC,
+ 0x034, 0x0002838A,
+ 0x034, 0x0002718C,
+ 0x034, 0x00026189,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EF,
+ 0x034, 0x000293AC,
+ 0x034, 0x0002838A,
+ 0x034, 0x0002718C,
+ 0x034, 0x00026189,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EF,
+ 0x034, 0x000293AC,
+ 0x034, 0x0002838A,
+ 0x034, 0x0002718C,
+ 0x034, 0x00026189,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3F5,
+ 0x034, 0x000293F2,
+ 0x034, 0x000282F1,
+ 0x034, 0x000272B0,
+ 0x034, 0x000262AD,
+ 0x034, 0x000252AA,
+ 0x034, 0x000242A7,
+ 0x034, 0x000230EC,
+ 0x034, 0x000220E9,
+ 0x034, 0x0002106A,
+ 0x034, 0x00020067,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EF,
+ 0x034, 0x000293AC,
+ 0x034, 0x0002838A,
+ 0x034, 0x0002718C,
+ 0x034, 0x00026189,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EF,
+ 0x034, 0x000293AC,
+ 0x034, 0x0002838A,
+ 0x034, 0x0002718C,
+ 0x034, 0x00026189,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0002AFF1,
+ 0x034, 0x00029FEE,
+ 0x034, 0x00028FEB,
+ 0x034, 0x00027FE8,
+ 0x034, 0x00026DEA,
+ 0x034, 0x00025DE7,
+ 0x034, 0x00024CEA,
+ 0x034, 0x00023CE7,
+ 0x034, 0x00022C69,
+ 0x034, 0x00021C66,
+ 0x034, 0x00020C28,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EC,
+ 0x034, 0x0000938C,
+ 0x034, 0x000081AD,
+ 0x034, 0x000071AA,
+ 0x034, 0x000061A7,
+ 0x034, 0x000050AA,
+ 0x034, 0x000040A7,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x0000100C,
+ 0x034, 0x00000009,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3F4,
+ 0x034, 0x000093F1,
+ 0x034, 0x000082B1,
+ 0x034, 0x000071D1,
+ 0x034, 0x000061CE,
+ 0x034, 0x000051CB,
+ 0x034, 0x000041C8,
+ 0x034, 0x000030CB,
+ 0x034, 0x000020C8,
+ 0x034, 0x00001087,
+ 0x034, 0x00000084,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0000AFF1,
+ 0x034, 0x00009FEE,
+ 0x034, 0x00008FEB,
+ 0x034, 0x00007FE8,
+ 0x034, 0x00006DEA,
+ 0x034, 0x00005DE7,
+ 0x034, 0x00004CEA,
+ 0x034, 0x00003CE7,
+ 0x034, 0x00002C69,
+ 0x034, 0x00001C66,
+ 0x034, 0x00000C28,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA1AD,
+ 0x034, 0x000C91AA,
+ 0x034, 0x000C81A7,
+ 0x034, 0x000C70AA,
+ 0x034, 0x000C60A7,
+ 0x034, 0x000C5049,
+ 0x034, 0x000C4046,
+ 0x034, 0x000C3026,
+ 0x034, 0x000C2009,
+ 0x034, 0x000C1006,
+ 0x034, 0x000C0003,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AF,
+ 0x034, 0x000C83AB,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C406A,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AF,
+ 0x034, 0x000C83AB,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C406A,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AF,
+ 0x034, 0x000C83AB,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C406A,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AF,
+ 0x034, 0x000C83AB,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C406A,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3F5,
+ 0x034, 0x000C93F2,
+ 0x034, 0x000C83B0,
+ 0x034, 0x000C7370,
+ 0x034, 0x000C636D,
+ 0x034, 0x000C536A,
+ 0x034, 0x000C4349,
+ 0x034, 0x000C316A,
+ 0x034, 0x000C2167,
+ 0x034, 0x000C1129,
+ 0x034, 0x000C0049,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AF,
+ 0x034, 0x000C83AB,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C406A,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AF,
+ 0x034, 0x000C83AB,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C406A,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x000CA794,
+ 0x034, 0x000C9791,
+ 0x034, 0x000C878E,
+ 0x034, 0x000C778B,
+ 0x034, 0x000C658D,
+ 0x034, 0x000C558A,
+ 0x034, 0x000C448D,
+ 0x034, 0x000C348A,
+ 0x034, 0x000C244C,
+ 0x034, 0x000C1449,
+ 0x034, 0x000C042B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA1AD,
+ 0x034, 0x000A91AA,
+ 0x034, 0x000A81A7,
+ 0x034, 0x000A70AA,
+ 0x034, 0x000A60A7,
+ 0x034, 0x000A5049,
+ 0x034, 0x000A4046,
+ 0x034, 0x000A3026,
+ 0x034, 0x000A2009,
+ 0x034, 0x000A1006,
+ 0x034, 0x000A0003,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EF,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A838A,
+ 0x034, 0x000A718C,
+ 0x034, 0x000A6189,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EF,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A838A,
+ 0x034, 0x000A718C,
+ 0x034, 0x000A6189,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EF,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A838A,
+ 0x034, 0x000A718C,
+ 0x034, 0x000A6189,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EF,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A838A,
+ 0x034, 0x000A718C,
+ 0x034, 0x000A6189,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3F5,
+ 0x034, 0x000A93F2,
+ 0x034, 0x000A82F1,
+ 0x034, 0x000A72B0,
+ 0x034, 0x000A62AD,
+ 0x034, 0x000A52AA,
+ 0x034, 0x000A42A7,
+ 0x034, 0x000A30EC,
+ 0x034, 0x000A20E9,
+ 0x034, 0x000A106A,
+ 0x034, 0x000A0067,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EF,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A838A,
+ 0x034, 0x000A718C,
+ 0x034, 0x000A6189,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EF,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A838A,
+ 0x034, 0x000A718C,
+ 0x034, 0x000A6189,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x000AA794,
+ 0x034, 0x000A9791,
+ 0x034, 0x000A878E,
+ 0x034, 0x000A778B,
+ 0x034, 0x000A658D,
+ 0x034, 0x000A558A,
+ 0x034, 0x000A448D,
+ 0x034, 0x000A348A,
+ 0x034, 0x000A244C,
+ 0x034, 0x000A1449,
+ 0x034, 0x000A042B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EC,
+ 0x034, 0x0008938C,
+ 0x034, 0x000881AD,
+ 0x034, 0x000871AA,
+ 0x034, 0x000861A7,
+ 0x034, 0x000850AA,
+ 0x034, 0x000840A7,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x0008100C,
+ 0x034, 0x00080009,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3F4,
+ 0x034, 0x000893F1,
+ 0x034, 0x000882B1,
+ 0x034, 0x000871D1,
+ 0x034, 0x000861CE,
+ 0x034, 0x000851CB,
+ 0x034, 0x000841C8,
+ 0x034, 0x000830CB,
+ 0x034, 0x000820C8,
+ 0x034, 0x00081087,
+ 0x034, 0x00080084,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0008A794,
+ 0x034, 0x00089791,
+ 0x034, 0x0008878E,
+ 0x034, 0x0008778B,
+ 0x034, 0x0008658D,
+ 0x034, 0x0008558A,
+ 0x034, 0x0008448D,
+ 0x034, 0x0008348A,
+ 0x034, 0x0008244C,
+ 0x034, 0x00081449,
+ 0x034, 0x0008042B,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x018, 0x0001712A,
+ 0x0EF, 0x00000040,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0xA0000000, 0x00000000,
+ 0x035, 0x00000747,
+ 0x035, 0x00008747,
+ 0x035, 0x00010747,
+ 0x035, 0x00020747,
+ 0x035, 0x00028747,
+ 0x035, 0x00030747,
+ 0x035, 0x00040747,
+ 0x035, 0x00048747,
+ 0x035, 0x00050747,
+ 0x035, 0x000805FB,
+ 0x035, 0x000885FB,
+ 0x035, 0x000905FB,
+ 0x035, 0x000A05FB,
+ 0x035, 0x000A85FB,
+ 0x035, 0x000B05FB,
+ 0x035, 0x000C05FB,
+ 0x035, 0x000C85FB,
+ 0x035, 0x000D05FB,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x018, 0x0001712A,
+ 0x0EF, 0x00000010,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000473,
+ 0x036, 0x00008473,
+ 0x036, 0x00010473,
+ 0x036, 0x00020473,
+ 0x036, 0x00028473,
+ 0x036, 0x00030473,
+ 0x036, 0x00040473,
+ 0x036, 0x00048473,
+ 0x036, 0x00050473,
+ 0x036, 0x00080473,
+ 0x036, 0x00088473,
+ 0x036, 0x00090473,
+ 0x036, 0x000A0473,
+ 0x036, 0x000A8473,
+ 0x036, 0x000B0473,
+ 0x036, 0x000C0473,
+ 0x036, 0x000C8473,
+ 0x036, 0x000D0473,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0xA0000000, 0x00000000,
+ 0x036, 0x00000473,
+ 0x036, 0x00008473,
+ 0x036, 0x00010473,
+ 0x036, 0x00020473,
+ 0x036, 0x00028473,
+ 0x036, 0x00030473,
+ 0x036, 0x00040473,
+ 0x036, 0x00048473,
+ 0x036, 0x00050473,
+ 0x036, 0x00080473,
+ 0x036, 0x00088473,
+ 0x036, 0x00090473,
+ 0x036, 0x000A0473,
+ 0x036, 0x000A8473,
+ 0x036, 0x000B0473,
+ 0x036, 0x000C0473,
+ 0x036, 0x000C8473,
+ 0x036, 0x000D0473,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x0EF, 0x00000004,
+ 0x037, 0x00000000,
+ 0x038, 0x00005146,
+ 0x037, 0x00004000,
+ 0x038, 0x00005146,
+ 0x037, 0x00008000,
+ 0x038, 0x00005146,
+ 0x037, 0x00010000,
+ 0x038, 0x00005146,
+ 0x037, 0x00014000,
+ 0x038, 0x00005146,
+ 0x037, 0x00018000,
+ 0x038, 0x00004D4E,
+ 0x037, 0x0001C000,
+ 0x038, 0x00004D4E,
+ 0x037, 0x00020000,
+ 0x038, 0x00004D4E,
+ 0x037, 0x00024000,
+ 0x038, 0x000071C6,
+ 0x037, 0x00028000,
+ 0x038, 0x000071C6,
+ 0x037, 0x0002C000,
+ 0x038, 0x000071C6,
+ 0x037, 0x00030000,
+ 0x038, 0x000071CE,
+ 0x037, 0x00034000,
+ 0x038, 0x000071CE,
+ 0x037, 0x00038000,
+ 0x038, 0x00005126,
+ 0x037, 0x0003C000,
+ 0x038, 0x00005126,
+ 0x037, 0x00040000,
+ 0x038, 0x00005126,
+ 0x037, 0x00044000,
+ 0x038, 0x00005126,
+ 0x037, 0x00048000,
+ 0x038, 0x00005126,
+ 0x037, 0x00080000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00084000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00088000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00090000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00094000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00098000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x0009C000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A8000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000AC000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B8000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000BC000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C8000,
+ 0x038, 0x00005ECE,
+ 0x0EF, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000008,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x0000007D,
+ 0x03C, 0x0000047D,
+ 0x03C, 0x0000087D,
+ 0x03C, 0x0000107D,
+ 0x03C, 0x0000147D,
+ 0x03C, 0x0000187D,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x0000054A,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x0000154A,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x0000254A,
+ 0x03C, 0x00002821,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x0000054A,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x0000154A,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x0000254A,
+ 0x03C, 0x00002821,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x0000054A,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x0000154A,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x0000254A,
+ 0x03C, 0x00002821,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x0000054A,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x0000154A,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x0000254A,
+ 0x03C, 0x00002821,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x0000054A,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x0000154A,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x0000254A,
+ 0x03C, 0x00002821,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x0000054A,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x0000154A,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x0000254A,
+ 0x03C, 0x00002821,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x0000054A,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x0000154A,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x0000254A,
+ 0x03C, 0x00002821,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x0000054A,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x0000154A,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x0000254A,
+ 0x03C, 0x00002821,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x0000037E,
+ 0x03C, 0x00000575,
+ 0x03C, 0x00000971,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001575,
+ 0x03C, 0x00001871,
+ 0x03C, 0x0000217E,
+ 0x03C, 0x00002575,
+ 0x03C, 0x00002871,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x061, 0x000C0D47,
+ 0x062, 0x0000133C,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0xA0000000, 0x00000000,
+ 0x063, 0x0007D0E7,
+ 0xB0000000, 0x00000000,
+ 0x064, 0x00014FEC,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0xA0000000, 0x00000000,
+ 0x065, 0x000933FF,
+ 0xB0000000, 0x00000000,
+ 0x066, 0x00000040,
+ 0x057, 0x00050000,
+ 0x056, 0x00051DF0,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x055, 0x00082061,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x055, 0x00082061,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x055, 0x00082061,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x055, 0x00082061,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x055, 0x00082061,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x055, 0x00082061,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x055, 0x00082061,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x055, 0x00082061,
+ 0xA0000000, 0x00000000,
+ 0x055, 0x00082060,
+ 0xB0000000, 0x00000000,
+ 0x01C, 0x000739D2,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x01F, 0x0002255C,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x01F, 0x0002255C,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x01F, 0x0002255C,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x01F, 0x0002255C,
+ 0xA0000000, 0x00000000,
+ 0x01F, 0x0002255C,
+ 0xB0000000, 0x00000000,
+ 0x0B1, 0x0007FF48,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x0C4, 0x00081700,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x0C4, 0x00081700,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x0C4, 0x00081700,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x0C4, 0x00081700,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x0C4, 0x00081700,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x0C4, 0x00081700,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x0C4, 0x00081700,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x0C4, 0x00081700,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x0C4, 0x00081700,
+ 0xA0000000, 0x00000000,
+ 0x0C4, 0x00083F00,
+ 0xB0000000, 0x00000000,
+ 0x018, 0x0001B126,
+ 0xFFE, 0x00000000,
+ 0xFFE, 0x00000000,
+ 0xFFE, 0x00000000,
+ 0x018, 0x00013126,
+ 0x018, 0x00013124,
+};
+
+RTW_DECL_TABLE_RF_RADIO(rtw8814a_rf_a, A);
+
+static const u32 rtw8814a_rf_b[] = {
+ 0x018, 0x00013124,
+ 0x040, 0x00000C00,
+ 0x058, 0x00000F98,
+ 0x07F, 0x00068004,
+ 0x018, 0x00000006,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0xA0000000, 0x00000000,
+ 0x086, 0x000E4B58,
+ 0x087, 0x00049F80,
+ 0xB0000000, 0x00000000,
+ 0x0DF, 0x00000008,
+ 0x0EF, 0x00002000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017BC3,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F39B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017BC3,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017BC3,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F39B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017BC3,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017BC3,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017BC3,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017BC3,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0003F258,
+ 0x03B, 0x00030A58,
+ 0x03B, 0x0002FA58,
+ 0x03B, 0x00022590,
+ 0x03B, 0x0001FA50,
+ 0x03B, 0x00010248,
+ 0x03B, 0x00008240,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000100,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0000ADF6,
+ 0x034, 0x00009DF3,
+ 0x034, 0x00008DF0,
+ 0x034, 0x00007DED,
+ 0x034, 0x00006DEA,
+ 0x034, 0x00005CED,
+ 0x034, 0x00004CEA,
+ 0x034, 0x000034EA,
+ 0x034, 0x000024E7,
+ 0x034, 0x0000146A,
+ 0x034, 0x0000006B,
+ 0xB0000000, 0x00000000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0008ADF6,
+ 0x034, 0x00089DF3,
+ 0x034, 0x00088DF0,
+ 0x034, 0x00087DED,
+ 0x034, 0x00086DEA,
+ 0x034, 0x00085CED,
+ 0x034, 0x00084CEA,
+ 0x034, 0x000834EA,
+ 0x034, 0x000824E7,
+ 0x034, 0x0008146A,
+ 0x034, 0x0008006B,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x000020A2,
+ 0x0DF, 0x00000080,
+ 0x035, 0x00000192,
+ 0x035, 0x00008192,
+ 0x035, 0x00010192,
+ 0x036, 0x00000024,
+ 0x036, 0x00008024,
+ 0x036, 0x00010024,
+ 0x036, 0x00018024,
+ 0x0EF, 0x00000000,
+ 0x051, 0x00000C21,
+ 0x052, 0x000006D9,
+ 0x053, 0x000FC649,
+ 0x054, 0x0000017E,
+ 0x018, 0x0001012A,
+ 0x081, 0x0007FC00,
+ 0x089, 0x00050110,
+ 0x08A, 0x00043E50,
+ 0x08B, 0x0002E180,
+ 0x08C, 0x00093C3C,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0xA0000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0xB0000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x0EF, 0x00001000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00084000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00040000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00030023,
+ 0x03C, 0x00048000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00028623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00021633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0001C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00010293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00009593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x80000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x00000F8B,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0000078B,
+ 0xB0000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00060000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00048000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00048000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00048000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00048000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00070023,
+ 0x03C, 0x00048000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00068623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00061633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0005C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00050293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00049593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x03B, 0x0004078B,
+ 0x03C, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00048000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00060000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0004C000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00044000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0004C000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00048000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00004000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00044000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00044000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B0023,
+ 0x80000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000A8623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000A1633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0009C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00090293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00089593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x80000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0008138B,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0008078B,
+ 0xB0000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x00000800,
+ 0x03B, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0xB0000000, 0x00000000,
+ 0x03B, 0x00040000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000800,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000800,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0xB0000000, 0x00000000,
+ 0x03B, 0x00080000,
+ 0x80000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001802,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001802,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00001002,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0x0EF, 0x00000100,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A38C,
+ 0x034, 0x000491AD,
+ 0x034, 0x000481AA,
+ 0x034, 0x000471A7,
+ 0x034, 0x000460AA,
+ 0x034, 0x000450A7,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x0004200C,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A38C,
+ 0x034, 0x00049389,
+ 0x034, 0x0004816D,
+ 0x034, 0x0004716A,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A38B,
+ 0x034, 0x00049388,
+ 0x034, 0x0004818B,
+ 0x034, 0x00047188,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A38C,
+ 0x034, 0x00049389,
+ 0x034, 0x0004816D,
+ 0x034, 0x0004716A,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A38B,
+ 0x034, 0x00049388,
+ 0x034, 0x0004818B,
+ 0x034, 0x00047188,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3F5,
+ 0x034, 0x000493F3,
+ 0x034, 0x000483B2,
+ 0x034, 0x00047390,
+ 0x034, 0x0004638D,
+ 0x034, 0x0004538A,
+ 0x034, 0x00044387,
+ 0x034, 0x0004324A,
+ 0x034, 0x00042247,
+ 0x034, 0x0004104D,
+ 0x034, 0x0004004A,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004AFF7,
+ 0x034, 0x00049FF6,
+ 0x034, 0x00048FF3,
+ 0x034, 0x00047FF0,
+ 0x034, 0x00046FED,
+ 0x034, 0x00045FEA,
+ 0x034, 0x00044FE7,
+ 0x034, 0x00043DEA,
+ 0x034, 0x00042DE7,
+ 0x034, 0x00041DE4,
+ 0x034, 0x00040CE7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A38C,
+ 0x034, 0x00049389,
+ 0x034, 0x0004816D,
+ 0x034, 0x0004716A,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A38C,
+ 0x034, 0x00049389,
+ 0x034, 0x0004816D,
+ 0x034, 0x0004716A,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0004AFF4,
+ 0x034, 0x00049FF1,
+ 0x034, 0x00048FEE,
+ 0x034, 0x00047FEB,
+ 0x034, 0x00046FE8,
+ 0x034, 0x00045DEA,
+ 0x034, 0x00044CED,
+ 0x034, 0x00043CEA,
+ 0x034, 0x00042C6C,
+ 0x034, 0x00041C69,
+ 0x034, 0x00040C2B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A38C,
+ 0x034, 0x000291AD,
+ 0x034, 0x000281AA,
+ 0x034, 0x000271A7,
+ 0x034, 0x000260AA,
+ 0x034, 0x000250A7,
+ 0x034, 0x0002402C,
+ 0x034, 0x00023029,
+ 0x034, 0x0002200C,
+ 0x034, 0x00021009,
+ 0x034, 0x00020006,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EE,
+ 0x034, 0x000293AC,
+ 0x034, 0x00028389,
+ 0x034, 0x0002716D,
+ 0x034, 0x0002616A,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EF,
+ 0x034, 0x000293AD,
+ 0x034, 0x0002838A,
+ 0x034, 0x0002718C,
+ 0x034, 0x00026189,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EE,
+ 0x034, 0x000293AC,
+ 0x034, 0x00028389,
+ 0x034, 0x0002716D,
+ 0x034, 0x0002616A,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EF,
+ 0x034, 0x000293AD,
+ 0x034, 0x0002838A,
+ 0x034, 0x0002718C,
+ 0x034, 0x00026189,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3F5,
+ 0x034, 0x000293F3,
+ 0x034, 0x000283D0,
+ 0x034, 0x00027371,
+ 0x034, 0x0002636E,
+ 0x034, 0x0002536B,
+ 0x034, 0x00024368,
+ 0x034, 0x0002332A,
+ 0x034, 0x00022327,
+ 0x034, 0x0002104C,
+ 0x034, 0x00020049,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002AFF7,
+ 0x034, 0x00029FF6,
+ 0x034, 0x00028FF3,
+ 0x034, 0x00027FF0,
+ 0x034, 0x00026FED,
+ 0x034, 0x00025FEA,
+ 0x034, 0x00024FE7,
+ 0x034, 0x00023DEA,
+ 0x034, 0x00022DE7,
+ 0x034, 0x00021DE4,
+ 0x034, 0x00020F25,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EE,
+ 0x034, 0x000293AC,
+ 0x034, 0x00028389,
+ 0x034, 0x0002716D,
+ 0x034, 0x0002616A,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EE,
+ 0x034, 0x000293AC,
+ 0x034, 0x00028389,
+ 0x034, 0x0002716D,
+ 0x034, 0x0002616A,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0002AFF4,
+ 0x034, 0x00029FF1,
+ 0x034, 0x00028FEE,
+ 0x034, 0x00027FEB,
+ 0x034, 0x00026FE8,
+ 0x034, 0x00025DEA,
+ 0x034, 0x00024CED,
+ 0x034, 0x00023CEA,
+ 0x034, 0x00022C6C,
+ 0x034, 0x00021C69,
+ 0x034, 0x00020C2B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A38C,
+ 0x034, 0x000091AD,
+ 0x034, 0x000081AA,
+ 0x034, 0x000071A7,
+ 0x034, 0x000060AA,
+ 0x034, 0x000050A7,
+ 0x034, 0x0000402C,
+ 0x034, 0x00003029,
+ 0x034, 0x00002026,
+ 0x034, 0x00001009,
+ 0x034, 0x00000006,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EC,
+ 0x034, 0x000093AC,
+ 0x034, 0x000081EC,
+ 0x034, 0x0000716D,
+ 0x034, 0x0000616A,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000404C,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EF,
+ 0x034, 0x000093AD,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EC,
+ 0x034, 0x000093AC,
+ 0x034, 0x000081EC,
+ 0x034, 0x0000716D,
+ 0x034, 0x0000616A,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000404C,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EF,
+ 0x034, 0x000093AD,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3F4,
+ 0x034, 0x000093F0,
+ 0x034, 0x000083AE,
+ 0x034, 0x00007350,
+ 0x034, 0x0000634D,
+ 0x034, 0x0000534A,
+ 0x034, 0x00004347,
+ 0x034, 0x0000312D,
+ 0x034, 0x0000212A,
+ 0x034, 0x00001127,
+ 0x034, 0x0000002A,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000AFF7,
+ 0x034, 0x00009FF4,
+ 0x034, 0x00008FF1,
+ 0x034, 0x00007FEE,
+ 0x034, 0x00006FEB,
+ 0x034, 0x00005FE8,
+ 0x034, 0x00004DEB,
+ 0x034, 0x00003DE8,
+ 0x034, 0x00002DE5,
+ 0x034, 0x00001C8B,
+ 0x034, 0x00000C88,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EC,
+ 0x034, 0x000093AC,
+ 0x034, 0x000081EC,
+ 0x034, 0x0000716D,
+ 0x034, 0x0000616A,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000404C,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EC,
+ 0x034, 0x000093AC,
+ 0x034, 0x000081EC,
+ 0x034, 0x0000716D,
+ 0x034, 0x0000616A,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000404C,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0000AFF4,
+ 0x034, 0x00009FF1,
+ 0x034, 0x00008FEE,
+ 0x034, 0x00007FEB,
+ 0x034, 0x00006FE8,
+ 0x034, 0x00005DEA,
+ 0x034, 0x00004CED,
+ 0x034, 0x00003CEA,
+ 0x034, 0x00002C6C,
+ 0x034, 0x00001C69,
+ 0x034, 0x00000C2B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA38C,
+ 0x034, 0x000C91AD,
+ 0x034, 0x000C81AA,
+ 0x034, 0x000C71A7,
+ 0x034, 0x000C60AA,
+ 0x034, 0x000C50A7,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C200C,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA38C,
+ 0x034, 0x000C9389,
+ 0x034, 0x000C816D,
+ 0x034, 0x000C716A,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA38B,
+ 0x034, 0x000C9388,
+ 0x034, 0x000C818B,
+ 0x034, 0x000C7188,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA38C,
+ 0x034, 0x000C9389,
+ 0x034, 0x000C816D,
+ 0x034, 0x000C716A,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA38B,
+ 0x034, 0x000C9388,
+ 0x034, 0x000C818B,
+ 0x034, 0x000C7188,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3F5,
+ 0x034, 0x000C93F3,
+ 0x034, 0x000C83B2,
+ 0x034, 0x000C7390,
+ 0x034, 0x000C638D,
+ 0x034, 0x000C538A,
+ 0x034, 0x000C4387,
+ 0x034, 0x000C324A,
+ 0x034, 0x000C2247,
+ 0x034, 0x000C104D,
+ 0x034, 0x000C004A,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CAFF7,
+ 0x034, 0x000C9FF6,
+ 0x034, 0x000C8FF3,
+ 0x034, 0x000C7FF0,
+ 0x034, 0x000C6FED,
+ 0x034, 0x000C5FEA,
+ 0x034, 0x000C4FE7,
+ 0x034, 0x000C3DEA,
+ 0x034, 0x000C2DE7,
+ 0x034, 0x000C1DE4,
+ 0x034, 0x000C0CE7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA38C,
+ 0x034, 0x000C9389,
+ 0x034, 0x000C816D,
+ 0x034, 0x000C716A,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA38C,
+ 0x034, 0x000C9389,
+ 0x034, 0x000C816D,
+ 0x034, 0x000C716A,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x000CA794,
+ 0x034, 0x000C9791,
+ 0x034, 0x000C878E,
+ 0x034, 0x000C778B,
+ 0x034, 0x000C658D,
+ 0x034, 0x000C558A,
+ 0x034, 0x000C448D,
+ 0x034, 0x000C348A,
+ 0x034, 0x000C244C,
+ 0x034, 0x000C1449,
+ 0x034, 0x000C042B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA38C,
+ 0x034, 0x000A91AD,
+ 0x034, 0x000A81AA,
+ 0x034, 0x000A71A7,
+ 0x034, 0x000A60AA,
+ 0x034, 0x000A50A7,
+ 0x034, 0x000A402C,
+ 0x034, 0x000A3029,
+ 0x034, 0x000A200C,
+ 0x034, 0x000A1009,
+ 0x034, 0x000A0006,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EE,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A8389,
+ 0x034, 0x000A716D,
+ 0x034, 0x000A616A,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EF,
+ 0x034, 0x000A93AD,
+ 0x034, 0x000A838A,
+ 0x034, 0x000A718C,
+ 0x034, 0x000A6189,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EE,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A8389,
+ 0x034, 0x000A716D,
+ 0x034, 0x000A616A,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EF,
+ 0x034, 0x000A93AD,
+ 0x034, 0x000A838A,
+ 0x034, 0x000A718C,
+ 0x034, 0x000A6189,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3F5,
+ 0x034, 0x000A93F3,
+ 0x034, 0x000A83D0,
+ 0x034, 0x000A7371,
+ 0x034, 0x000A636E,
+ 0x034, 0x000A536B,
+ 0x034, 0x000A4368,
+ 0x034, 0x000A332A,
+ 0x034, 0x000A2327,
+ 0x034, 0x000A104C,
+ 0x034, 0x000A0049,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AAFF7,
+ 0x034, 0x000A9FF6,
+ 0x034, 0x000A8FF3,
+ 0x034, 0x000A7FF0,
+ 0x034, 0x000A6FED,
+ 0x034, 0x000A5FEA,
+ 0x034, 0x000A4FE7,
+ 0x034, 0x000A3DEA,
+ 0x034, 0x000A2DE7,
+ 0x034, 0x000A1DE4,
+ 0x034, 0x000A0F25,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EE,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A8389,
+ 0x034, 0x000A716D,
+ 0x034, 0x000A616A,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EE,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A8389,
+ 0x034, 0x000A716D,
+ 0x034, 0x000A616A,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x000AA794,
+ 0x034, 0x000A9791,
+ 0x034, 0x000A878E,
+ 0x034, 0x000A778B,
+ 0x034, 0x000A658D,
+ 0x034, 0x000A558A,
+ 0x034, 0x000A448D,
+ 0x034, 0x000A348A,
+ 0x034, 0x000A244C,
+ 0x034, 0x000A1449,
+ 0x034, 0x000A042B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A38C,
+ 0x034, 0x000891AD,
+ 0x034, 0x000881AA,
+ 0x034, 0x000871A7,
+ 0x034, 0x000860AA,
+ 0x034, 0x000850A7,
+ 0x034, 0x0008402C,
+ 0x034, 0x00083029,
+ 0x034, 0x00082026,
+ 0x034, 0x00081009,
+ 0x034, 0x00080006,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EC,
+ 0x034, 0x000893AC,
+ 0x034, 0x000881EC,
+ 0x034, 0x0008716D,
+ 0x034, 0x0008616A,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008404C,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EF,
+ 0x034, 0x000893AD,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EC,
+ 0x034, 0x000893AC,
+ 0x034, 0x000881EC,
+ 0x034, 0x0008716D,
+ 0x034, 0x0008616A,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008404C,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EF,
+ 0x034, 0x000893AD,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3F4,
+ 0x034, 0x000893F0,
+ 0x034, 0x000883AE,
+ 0x034, 0x00087350,
+ 0x034, 0x0008634D,
+ 0x034, 0x0008534A,
+ 0x034, 0x00084347,
+ 0x034, 0x0008312D,
+ 0x034, 0x0008212A,
+ 0x034, 0x00081127,
+ 0x034, 0x0008002A,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008AFF7,
+ 0x034, 0x00089FF4,
+ 0x034, 0x00088FF1,
+ 0x034, 0x00087FEE,
+ 0x034, 0x00086FEB,
+ 0x034, 0x00085FE8,
+ 0x034, 0x00084DEB,
+ 0x034, 0x00083DE8,
+ 0x034, 0x00082DE5,
+ 0x034, 0x00081C8B,
+ 0x034, 0x00080C88,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EC,
+ 0x034, 0x000893AC,
+ 0x034, 0x000881EC,
+ 0x034, 0x0008716D,
+ 0x034, 0x0008616A,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008404C,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EC,
+ 0x034, 0x000893AC,
+ 0x034, 0x000881EC,
+ 0x034, 0x0008716D,
+ 0x034, 0x0008616A,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008404C,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0008A794,
+ 0x034, 0x00089791,
+ 0x034, 0x0008878E,
+ 0x034, 0x0008778B,
+ 0x034, 0x0008658D,
+ 0x034, 0x0008558A,
+ 0x034, 0x0008448D,
+ 0x034, 0x0008348A,
+ 0x034, 0x0008244C,
+ 0x034, 0x00081449,
+ 0x034, 0x0008042B,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x0DF, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x018, 0x0001712A,
+ 0x0EF, 0x00000040,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0xA0000000, 0x00000000,
+ 0x035, 0x00000484,
+ 0x035, 0x00008484,
+ 0x035, 0x00010484,
+ 0x035, 0x00020584,
+ 0x035, 0x00028584,
+ 0x035, 0x00030584,
+ 0x035, 0x00040584,
+ 0x035, 0x00048584,
+ 0x035, 0x00050584,
+ 0x035, 0x000805FB,
+ 0x035, 0x000885FB,
+ 0x035, 0x000905FB,
+ 0x035, 0x000A05FB,
+ 0x035, 0x000A85FB,
+ 0x035, 0x000B05FB,
+ 0x035, 0x000C05FB,
+ 0x035, 0x000C85FB,
+ 0x035, 0x000D05FB,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x0DF, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x018, 0x0001712A,
+ 0x0EF, 0x00000010,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000473,
+ 0x036, 0x00008473,
+ 0x036, 0x00010473,
+ 0x036, 0x00020473,
+ 0x036, 0x00028473,
+ 0x036, 0x00030473,
+ 0x036, 0x00040473,
+ 0x036, 0x00048473,
+ 0x036, 0x00050473,
+ 0x036, 0x00080473,
+ 0x036, 0x00088473,
+ 0x036, 0x00090473,
+ 0x036, 0x000A0473,
+ 0x036, 0x000A8473,
+ 0x036, 0x000B0473,
+ 0x036, 0x000C0473,
+ 0x036, 0x000C8473,
+ 0x036, 0x000D0473,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0xA0000000, 0x00000000,
+ 0x036, 0x00000474,
+ 0x036, 0x00008474,
+ 0x036, 0x00010474,
+ 0x036, 0x00020474,
+ 0x036, 0x00028474,
+ 0x036, 0x00030474,
+ 0x036, 0x00040474,
+ 0x036, 0x00048474,
+ 0x036, 0x00050474,
+ 0x036, 0x00080474,
+ 0x036, 0x00088474,
+ 0x036, 0x00090474,
+ 0x036, 0x000A0474,
+ 0x036, 0x000A8474,
+ 0x036, 0x000B0474,
+ 0x036, 0x000C0474,
+ 0x036, 0x000C8474,
+ 0x036, 0x000D0474,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x0EF, 0x00000004,
+ 0x037, 0x00000000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00004000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00008000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00010000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00014000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00018000,
+ 0x038, 0x0000514E,
+ 0x037, 0x0001C000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00020000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00024000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00028000,
+ 0x038, 0x0000514E,
+ 0x037, 0x0002C000,
+ 0x038, 0x0000714E,
+ 0x037, 0x00030000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00034000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00038000,
+ 0x038, 0x0000514E,
+ 0x037, 0x0003C000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00040000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00044000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00048000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00080000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00084000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00088000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00090000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00094000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00098000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x0009C000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A8000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000AC000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B8000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000BC000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C8000,
+ 0x038, 0x00005ECE,
+ 0x0EF, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000008,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x0000007D,
+ 0x03C, 0x0000047D,
+ 0x03C, 0x0000087D,
+ 0x03C, 0x0000107D,
+ 0x03C, 0x0000147D,
+ 0x03C, 0x0000187D,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027E,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227E,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027E,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227E,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027E,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227E,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027E,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227E,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027E,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227E,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027E,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227E,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027E,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227E,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027E,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227E,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x0000037E,
+ 0x03C, 0x00000575,
+ 0x03C, 0x00000971,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001575,
+ 0x03C, 0x00001871,
+ 0x03C, 0x0000217E,
+ 0x03C, 0x00002575,
+ 0x03C, 0x00002871,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x061, 0x000C0D47,
+ 0x062, 0x0000133C,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0xA0000000, 0x00000000,
+ 0x063, 0x0007D0E7,
+ 0xB0000000, 0x00000000,
+ 0x064, 0x00014FEC,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0xA0000000, 0x00000000,
+ 0x065, 0x000923FF,
+ 0xB0000000, 0x00000000,
+ 0x066, 0x00000040,
+ 0x057, 0x00050000,
+ 0x056, 0x00051DF0,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x055, 0x00082060,
+ 0xB0000000, 0x00000000,
+};
+
+RTW_DECL_TABLE_RF_RADIO(rtw8814a_rf_b, B);
+
+static const u32 rtw8814a_rf_c[] = {
+ 0x018, 0x00013124,
+ 0x040, 0x00000C00,
+ 0x058, 0x00000F98,
+ 0x07F, 0x00068004,
+ 0x018, 0x00000006,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0xA0000000, 0x00000000,
+ 0x086, 0x000E4B58,
+ 0x087, 0x00049F80,
+ 0xB0000000, 0x00000000,
+ 0x0DF, 0x00000008,
+ 0x0EF, 0x00002000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017823,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017823,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017823,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017823,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017823,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017823,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017823,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0003F258,
+ 0x03B, 0x00030A58,
+ 0x03B, 0x0002FA58,
+ 0x03B, 0x00022590,
+ 0x03B, 0x0001FA50,
+ 0x03B, 0x00010248,
+ 0x03B, 0x00008240,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000100,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0000ADF6,
+ 0x034, 0x00009DF3,
+ 0x034, 0x00008DF0,
+ 0x034, 0x00007DED,
+ 0x034, 0x00006DEA,
+ 0x034, 0x00005CED,
+ 0x034, 0x00004CEA,
+ 0x034, 0x000034EA,
+ 0x034, 0x000024E7,
+ 0x034, 0x0000146A,
+ 0x034, 0x0000006B,
+ 0xB0000000, 0x00000000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0008ADF6,
+ 0x034, 0x00089DF3,
+ 0x034, 0x00088DF0,
+ 0x034, 0x00087DED,
+ 0x034, 0x00086DEA,
+ 0x034, 0x00085CED,
+ 0x034, 0x00084CEA,
+ 0x034, 0x000834EA,
+ 0x034, 0x000824E7,
+ 0x034, 0x0008146A,
+ 0x034, 0x0008006B,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x000020A2,
+ 0x0DF, 0x00000080,
+ 0x035, 0x00000192,
+ 0x035, 0x00008192,
+ 0x035, 0x00010192,
+ 0x036, 0x00000024,
+ 0x036, 0x00008024,
+ 0x036, 0x00010024,
+ 0x036, 0x00018024,
+ 0x0EF, 0x00000000,
+ 0x051, 0x00000C21,
+ 0x052, 0x000006D9,
+ 0x053, 0x000FC649,
+ 0x054, 0x0000017E,
+ 0x018, 0x0001012A,
+ 0x081, 0x0007FC00,
+ 0x089, 0x00050110,
+ 0x08A, 0x00043E50,
+ 0x08B, 0x0002E180,
+ 0x08C, 0x00093C3C,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0xA0000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0xA0000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00001000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0006C000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x000D4000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00080000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0006C000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0008C000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00004000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x000A0000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00030023,
+ 0x03C, 0x00048000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00028623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00021633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0001C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00010293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00009593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x80000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0000118B,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0000078B,
+ 0xB0000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0004C000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00084000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00080000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0004C000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x000D0000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00080000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00080000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00028000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00070023,
+ 0x03C, 0x00048000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00068623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00061633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0005C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00050293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00049593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x03B, 0x0004078B,
+ 0x03C, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00060000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00080000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B0023,
+ 0x80000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000A8623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000A1633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0009C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00090293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00089593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x80000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0008128B,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0008078B,
+ 0xB0000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x00000800,
+ 0x03B, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001803,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001803,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0xB0000000, 0x00000000,
+ 0x03B, 0x00040000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000800,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0xB0000000, 0x00000000,
+ 0x03B, 0x00080000,
+ 0x80000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001802,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001802,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00001002,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0xA0000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000100,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A38C,
+ 0x034, 0x000491AD,
+ 0x034, 0x000481AA,
+ 0x034, 0x000471A7,
+ 0x034, 0x000460AA,
+ 0x034, 0x000450A7,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x0004200C,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AD,
+ 0x034, 0x0004838A,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004404C,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AD,
+ 0x034, 0x0004838A,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004404C,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AD,
+ 0x034, 0x0004838A,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004404C,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AD,
+ 0x034, 0x0004838A,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004404C,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3F5,
+ 0x034, 0x000493F3,
+ 0x034, 0x00048393,
+ 0x034, 0x00047390,
+ 0x034, 0x0004638D,
+ 0x034, 0x0004538A,
+ 0x034, 0x00044387,
+ 0x034, 0x000430ED,
+ 0x034, 0x000420EA,
+ 0x034, 0x000410E7,
+ 0x034, 0x0004002D,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004AFF7,
+ 0x034, 0x00049FF6,
+ 0x034, 0x00048FF3,
+ 0x034, 0x00047FF0,
+ 0x034, 0x00046FED,
+ 0x034, 0x00045FEA,
+ 0x034, 0x00044FE7,
+ 0x034, 0x00043CD0,
+ 0x034, 0x00042CCD,
+ 0x034, 0x00041CCA,
+ 0x034, 0x00040CC7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AD,
+ 0x034, 0x0004838A,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004404C,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EF,
+ 0x034, 0x000493AD,
+ 0x034, 0x0004838A,
+ 0x034, 0x0004718C,
+ 0x034, 0x00046189,
+ 0x034, 0x0004506D,
+ 0x034, 0x0004404C,
+ 0x034, 0x0004302C,
+ 0x034, 0x00042029,
+ 0x034, 0x00041026,
+ 0x034, 0x00040023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0004AFF4,
+ 0x034, 0x00049FF1,
+ 0x034, 0x00048FEE,
+ 0x034, 0x00047FEB,
+ 0x034, 0x00046FE8,
+ 0x034, 0x00045DEA,
+ 0x034, 0x00044CED,
+ 0x034, 0x00043CEA,
+ 0x034, 0x00042C6C,
+ 0x034, 0x00041C69,
+ 0x034, 0x00040C2B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EC,
+ 0x034, 0x0002938C,
+ 0x034, 0x000281AD,
+ 0x034, 0x000271AA,
+ 0x034, 0x000261A7,
+ 0x034, 0x000250AA,
+ 0x034, 0x000240A7,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x0002100C,
+ 0x034, 0x00020009,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EC,
+ 0x034, 0x0002936D,
+ 0x034, 0x0002836A,
+ 0x034, 0x0002716D,
+ 0x034, 0x0002616A,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EC,
+ 0x034, 0x000293AC,
+ 0x034, 0x0002838A,
+ 0x034, 0x0002718C,
+ 0x034, 0x00026189,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EC,
+ 0x034, 0x0002936D,
+ 0x034, 0x0002836A,
+ 0x034, 0x0002716D,
+ 0x034, 0x0002616A,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EC,
+ 0x034, 0x000293AC,
+ 0x034, 0x0002838A,
+ 0x034, 0x0002718C,
+ 0x034, 0x00026189,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3F5,
+ 0x034, 0x000293F3,
+ 0x034, 0x000282F2,
+ 0x034, 0x000272D0,
+ 0x034, 0x000262CD,
+ 0x034, 0x000252CA,
+ 0x034, 0x000242C7,
+ 0x034, 0x000230CD,
+ 0x034, 0x000220CA,
+ 0x034, 0x000210C7,
+ 0x034, 0x00020086,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002AFF7,
+ 0x034, 0x00029FF6,
+ 0x034, 0x00028FF3,
+ 0x034, 0x00027FF0,
+ 0x034, 0x00026FED,
+ 0x034, 0x00025FEA,
+ 0x034, 0x00024FE7,
+ 0x034, 0x00023DEA,
+ 0x034, 0x00022DE7,
+ 0x034, 0x00021DE4,
+ 0x034, 0x00020E44,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EC,
+ 0x034, 0x0002936D,
+ 0x034, 0x0002836A,
+ 0x034, 0x0002716D,
+ 0x034, 0x0002616A,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EC,
+ 0x034, 0x0002936D,
+ 0x034, 0x0002836A,
+ 0x034, 0x0002716D,
+ 0x034, 0x0002616A,
+ 0x034, 0x0002506D,
+ 0x034, 0x0002406A,
+ 0x034, 0x0002302C,
+ 0x034, 0x00022029,
+ 0x034, 0x00021026,
+ 0x034, 0x00020023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0002AFF4,
+ 0x034, 0x00029FF1,
+ 0x034, 0x00028FEE,
+ 0x034, 0x00027FEB,
+ 0x034, 0x00026FE8,
+ 0x034, 0x00025DEA,
+ 0x034, 0x00024CED,
+ 0x034, 0x00023CEA,
+ 0x034, 0x00022C6C,
+ 0x034, 0x00021C69,
+ 0x034, 0x00020C2B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A38C,
+ 0x034, 0x000091AD,
+ 0x034, 0x000081AA,
+ 0x034, 0x000071A7,
+ 0x034, 0x000060AA,
+ 0x034, 0x000050A7,
+ 0x034, 0x0000402C,
+ 0x034, 0x00003029,
+ 0x034, 0x0000200C,
+ 0x034, 0x00001009,
+ 0x034, 0x00000006,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AB,
+ 0x034, 0x00008389,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AB,
+ 0x034, 0x00008389,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AB,
+ 0x034, 0x00008389,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AB,
+ 0x034, 0x00008389,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3F5,
+ 0x034, 0x000093F1,
+ 0x034, 0x000083B0,
+ 0x034, 0x00007370,
+ 0x034, 0x0000636D,
+ 0x034, 0x0000536A,
+ 0x034, 0x00004367,
+ 0x034, 0x0000308E,
+ 0x034, 0x0000208B,
+ 0x034, 0x00001088,
+ 0x034, 0x00000085,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000AFF7,
+ 0x034, 0x00009FF5,
+ 0x034, 0x00008FF2,
+ 0x034, 0x00007FEF,
+ 0x034, 0x00006FEC,
+ 0x034, 0x00005FE9,
+ 0x034, 0x00004EAA,
+ 0x034, 0x00003EA7,
+ 0x034, 0x00002C70,
+ 0x034, 0x00001C6D,
+ 0x034, 0x00000C6A,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AB,
+ 0x034, 0x00008389,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AB,
+ 0x034, 0x00008389,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0000AFF4,
+ 0x034, 0x00009FF1,
+ 0x034, 0x00008FEE,
+ 0x034, 0x00007FEB,
+ 0x034, 0x00006FE8,
+ 0x034, 0x00005DEA,
+ 0x034, 0x00004CED,
+ 0x034, 0x00003CEA,
+ 0x034, 0x00002C6C,
+ 0x034, 0x00001C69,
+ 0x034, 0x00000C2B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA38C,
+ 0x034, 0x000C91AD,
+ 0x034, 0x000C81AA,
+ 0x034, 0x000C71A7,
+ 0x034, 0x000C60AA,
+ 0x034, 0x000C50A7,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C200C,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AD,
+ 0x034, 0x000C838A,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C404C,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AD,
+ 0x034, 0x000C838A,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C404C,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AD,
+ 0x034, 0x000C838A,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C404C,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AD,
+ 0x034, 0x000C838A,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C404C,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3F5,
+ 0x034, 0x000C93F3,
+ 0x034, 0x000C8393,
+ 0x034, 0x000C7390,
+ 0x034, 0x000C638D,
+ 0x034, 0x000C538A,
+ 0x034, 0x000C4387,
+ 0x034, 0x000C30ED,
+ 0x034, 0x000C20EA,
+ 0x034, 0x000C10E7,
+ 0x034, 0x000C002D,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CAFF7,
+ 0x034, 0x000C9FF6,
+ 0x034, 0x000C8FF3,
+ 0x034, 0x000C7FF0,
+ 0x034, 0x000C6FED,
+ 0x034, 0x000C5FEA,
+ 0x034, 0x000C4FE7,
+ 0x034, 0x000C3CD0,
+ 0x034, 0x000C2CCD,
+ 0x034, 0x000C1CCA,
+ 0x034, 0x000C0CC7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AD,
+ 0x034, 0x000C838A,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C404C,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EF,
+ 0x034, 0x000C93AD,
+ 0x034, 0x000C838A,
+ 0x034, 0x000C718C,
+ 0x034, 0x000C6189,
+ 0x034, 0x000C506D,
+ 0x034, 0x000C404C,
+ 0x034, 0x000C302C,
+ 0x034, 0x000C2029,
+ 0x034, 0x000C1026,
+ 0x034, 0x000C0023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x000CA794,
+ 0x034, 0x000C9791,
+ 0x034, 0x000C878E,
+ 0x034, 0x000C778B,
+ 0x034, 0x000C658D,
+ 0x034, 0x000C558A,
+ 0x034, 0x000C448D,
+ 0x034, 0x000C348A,
+ 0x034, 0x000C244C,
+ 0x034, 0x000C1449,
+ 0x034, 0x000C042B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EC,
+ 0x034, 0x000A938C,
+ 0x034, 0x000A81AD,
+ 0x034, 0x000A71AA,
+ 0x034, 0x000A61A7,
+ 0x034, 0x000A50AA,
+ 0x034, 0x000A40A7,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A100C,
+ 0x034, 0x000A0009,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EC,
+ 0x034, 0x000A936D,
+ 0x034, 0x000A836A,
+ 0x034, 0x000A716D,
+ 0x034, 0x000A616A,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EC,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A838A,
+ 0x034, 0x000A718C,
+ 0x034, 0x000A6189,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EC,
+ 0x034, 0x000A936D,
+ 0x034, 0x000A836A,
+ 0x034, 0x000A716D,
+ 0x034, 0x000A616A,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EC,
+ 0x034, 0x000A93AC,
+ 0x034, 0x000A838A,
+ 0x034, 0x000A718C,
+ 0x034, 0x000A6189,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3F5,
+ 0x034, 0x000A93F3,
+ 0x034, 0x000A82F2,
+ 0x034, 0x000A72D0,
+ 0x034, 0x000A62CD,
+ 0x034, 0x000A52CA,
+ 0x034, 0x000A42C7,
+ 0x034, 0x000A30CD,
+ 0x034, 0x000A20CA,
+ 0x034, 0x000A10C7,
+ 0x034, 0x000A0086,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AAFF7,
+ 0x034, 0x000A9FF6,
+ 0x034, 0x000A8FF3,
+ 0x034, 0x000A7FF0,
+ 0x034, 0x000A6FED,
+ 0x034, 0x000A5FEA,
+ 0x034, 0x000A4FE7,
+ 0x034, 0x000A3DEA,
+ 0x034, 0x000A2DE7,
+ 0x034, 0x000A1DE4,
+ 0x034, 0x000A0E44,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EC,
+ 0x034, 0x000A936D,
+ 0x034, 0x000A836A,
+ 0x034, 0x000A716D,
+ 0x034, 0x000A616A,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EC,
+ 0x034, 0x000A936D,
+ 0x034, 0x000A836A,
+ 0x034, 0x000A716D,
+ 0x034, 0x000A616A,
+ 0x034, 0x000A506D,
+ 0x034, 0x000A406A,
+ 0x034, 0x000A302C,
+ 0x034, 0x000A2029,
+ 0x034, 0x000A1026,
+ 0x034, 0x000A0023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x000AA794,
+ 0x034, 0x000A9791,
+ 0x034, 0x000A878E,
+ 0x034, 0x000A778B,
+ 0x034, 0x000A658D,
+ 0x034, 0x000A558A,
+ 0x034, 0x000A448D,
+ 0x034, 0x000A348A,
+ 0x034, 0x000A244C,
+ 0x034, 0x000A1449,
+ 0x034, 0x000A042B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A38C,
+ 0x034, 0x000891AD,
+ 0x034, 0x000881AA,
+ 0x034, 0x000871A7,
+ 0x034, 0x000860AA,
+ 0x034, 0x000850A7,
+ 0x034, 0x0008402C,
+ 0x034, 0x00083029,
+ 0x034, 0x0008200C,
+ 0x034, 0x00081009,
+ 0x034, 0x00000006,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AB,
+ 0x034, 0x00088389,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AB,
+ 0x034, 0x00088389,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AB,
+ 0x034, 0x00088389,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AB,
+ 0x034, 0x00088389,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3F5,
+ 0x034, 0x000893F1,
+ 0x034, 0x000883B0,
+ 0x034, 0x00087370,
+ 0x034, 0x0008636D,
+ 0x034, 0x0008536A,
+ 0x034, 0x00084367,
+ 0x034, 0x0008308E,
+ 0x034, 0x0008208B,
+ 0x034, 0x00081088,
+ 0x034, 0x00080085,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008AFF7,
+ 0x034, 0x00089FF5,
+ 0x034, 0x00088FF2,
+ 0x034, 0x00087FEF,
+ 0x034, 0x00086FEC,
+ 0x034, 0x00085FE9,
+ 0x034, 0x00084EAA,
+ 0x034, 0x00083EA7,
+ 0x034, 0x00082C70,
+ 0x034, 0x00081C6D,
+ 0x034, 0x00080C6A,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AB,
+ 0x034, 0x00088389,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AB,
+ 0x034, 0x00088389,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0008A794,
+ 0x034, 0x00089791,
+ 0x034, 0x0008878E,
+ 0x034, 0x0008778B,
+ 0x034, 0x0008658D,
+ 0x034, 0x0008558A,
+ 0x034, 0x0008448D,
+ 0x034, 0x0008348A,
+ 0x034, 0x0008244C,
+ 0x034, 0x00081449,
+ 0x034, 0x0008042B,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x0DF, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x018, 0x0001712A,
+ 0x0EF, 0x00000040,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0xA0000000, 0x00000000,
+ 0x035, 0x00000484,
+ 0x035, 0x00008484,
+ 0x035, 0x00010484,
+ 0x035, 0x00020584,
+ 0x035, 0x00028584,
+ 0x035, 0x00030584,
+ 0x035, 0x00040584,
+ 0x035, 0x00048584,
+ 0x035, 0x00050584,
+ 0x035, 0x000805FB,
+ 0x035, 0x000885FB,
+ 0x035, 0x000905FB,
+ 0x035, 0x000A05FB,
+ 0x035, 0x000A85FB,
+ 0x035, 0x000B05FB,
+ 0x035, 0x000C05FB,
+ 0x035, 0x000C85FB,
+ 0x035, 0x000D05FB,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x0DF, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x018, 0x0001712A,
+ 0x0EF, 0x00000010,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000473,
+ 0x036, 0x00008473,
+ 0x036, 0x00010473,
+ 0x036, 0x00020473,
+ 0x036, 0x00028473,
+ 0x036, 0x00030473,
+ 0x036, 0x00040473,
+ 0x036, 0x00048473,
+ 0x036, 0x00050473,
+ 0x036, 0x00080473,
+ 0x036, 0x00088473,
+ 0x036, 0x00090473,
+ 0x036, 0x000A0473,
+ 0x036, 0x000A8473,
+ 0x036, 0x000B0473,
+ 0x036, 0x000C0473,
+ 0x036, 0x000C8473,
+ 0x036, 0x000D0473,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0xA0000000, 0x00000000,
+ 0x036, 0x00000474,
+ 0x036, 0x00008474,
+ 0x036, 0x00010474,
+ 0x036, 0x00020474,
+ 0x036, 0x00028474,
+ 0x036, 0x00030474,
+ 0x036, 0x00040474,
+ 0x036, 0x00048474,
+ 0x036, 0x00050474,
+ 0x036, 0x00080474,
+ 0x036, 0x00088474,
+ 0x036, 0x00090474,
+ 0x036, 0x000A0474,
+ 0x036, 0x000A8474,
+ 0x036, 0x000B0474,
+ 0x036, 0x000C0474,
+ 0x036, 0x000C8474,
+ 0x036, 0x000D0474,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x0EF, 0x00000004,
+ 0x037, 0x00000000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00004000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00008000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00010000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00014000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00018000,
+ 0x038, 0x0000514E,
+ 0x037, 0x0001C000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00020000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00024000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00028000,
+ 0x038, 0x0000514E,
+ 0x037, 0x0002C000,
+ 0x038, 0x0000714E,
+ 0x037, 0x00030000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00034000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00038000,
+ 0x038, 0x0000514E,
+ 0x037, 0x0003C000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00040000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00044000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00048000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00080000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00084000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00088000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00090000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00094000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00098000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x0009C000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A8000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000AC000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B8000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000BC000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C8000,
+ 0x038, 0x00005ECE,
+ 0x0EF, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000008,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x0000007D,
+ 0x03C, 0x0000047D,
+ 0x03C, 0x0000087D,
+ 0x03C, 0x0000107D,
+ 0x03C, 0x0000147D,
+ 0x03C, 0x0000187D,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x00000541,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x00001541,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x00002541,
+ 0x03C, 0x00002821,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027D,
+ 0x03C, 0x00000546,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127D,
+ 0x03C, 0x00001546,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227D,
+ 0x03C, 0x00002546,
+ 0x03C, 0x00002821,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x0000037E,
+ 0x03C, 0x00000575,
+ 0x03C, 0x00000971,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001575,
+ 0x03C, 0x00001871,
+ 0x03C, 0x0000217E,
+ 0x03C, 0x00002575,
+ 0x03C, 0x00002871,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x061, 0x000C0D47,
+ 0x062, 0x0000133C,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0xA0000000, 0x00000000,
+ 0x063, 0x0007D0E7,
+ 0xB0000000, 0x00000000,
+ 0x064, 0x00014FEC,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0xA0000000, 0x00000000,
+ 0x065, 0x000923FF,
+ 0xB0000000, 0x00000000,
+ 0x066, 0x00000040,
+ 0x057, 0x00050000,
+ 0x056, 0x00051DF0,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x055, 0x00082060,
+ 0xB0000000, 0x00000000,
+};
+
+RTW_DECL_TABLE_RF_RADIO(rtw8814a_rf_c, C);
+
+static const u32 rtw8814a_rf_d[] = {
+ 0x018, 0x00013124,
+ 0x040, 0x00000C00,
+ 0x058, 0x00000F98,
+ 0x07F, 0x00068004,
+ 0x018, 0x00000006,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x086, 0x000E335A,
+ 0x087, 0x00079F80,
+ 0xA0000000, 0x00000000,
+ 0x086, 0x000E4B58,
+ 0x087, 0x00049F80,
+ 0xB0000000, 0x00000000,
+ 0x0DF, 0x00000008,
+ 0x0EF, 0x00002000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017803,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F09B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017803,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017803,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F09B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017803,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017803,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017803,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0003F19B,
+ 0x03B, 0x00037A5B,
+ 0x03B, 0x0002A433,
+ 0x03B, 0x00027BD3,
+ 0x03B, 0x0001F80B,
+ 0x03B, 0x00017803,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0003F258,
+ 0x03B, 0x00030A58,
+ 0x03B, 0x0002FA58,
+ 0x03B, 0x00022590,
+ 0x03B, 0x0001FA50,
+ 0x03B, 0x00010248,
+ 0x03B, 0x00008240,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000100,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0000ADF6,
+ 0x034, 0x00009DF3,
+ 0x034, 0x00008DF0,
+ 0x034, 0x00007DED,
+ 0x034, 0x00006DEA,
+ 0x034, 0x00005CED,
+ 0x034, 0x00004CEA,
+ 0x034, 0x000034EA,
+ 0x034, 0x000024E7,
+ 0x034, 0x0000146A,
+ 0x034, 0x0000006B,
+ 0xB0000000, 0x00000000,
+ 0x80000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A0D0,
+ 0x034, 0x000090CD,
+ 0x034, 0x000080CA,
+ 0x034, 0x0000704D,
+ 0x034, 0x0000604A,
+ 0x034, 0x00005047,
+ 0x034, 0x0000400A,
+ 0x034, 0x00003007,
+ 0x034, 0x00002004,
+ 0x034, 0x00001001,
+ 0x034, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0008ADF6,
+ 0x034, 0x00089DF3,
+ 0x034, 0x00088DF0,
+ 0x034, 0x00087DED,
+ 0x034, 0x00086DEA,
+ 0x034, 0x00085CED,
+ 0x034, 0x00084CEA,
+ 0x034, 0x000834EA,
+ 0x034, 0x000824E7,
+ 0x034, 0x0008146A,
+ 0x034, 0x0008006B,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x000020A2,
+ 0x0DF, 0x00000080,
+ 0x035, 0x00000192,
+ 0x035, 0x00008192,
+ 0x035, 0x00010192,
+ 0x036, 0x00000024,
+ 0x036, 0x00008024,
+ 0x036, 0x00010024,
+ 0x036, 0x00018024,
+ 0x0EF, 0x00000000,
+ 0x051, 0x00000C21,
+ 0x052, 0x000006D9,
+ 0x053, 0x000FC649,
+ 0x054, 0x0000017E,
+ 0x018, 0x0001012A,
+ 0x081, 0x0007FC00,
+ 0x089, 0x00050110,
+ 0x08A, 0x00043E50,
+ 0x08B, 0x0002E180,
+ 0x08C, 0x00093C3C,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0xA0000000, 0x00000000,
+ 0x085, 0x000F8000,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0xA0000000, 0x00000000,
+ 0x08D, 0x000FFFF0,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00001000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00038023,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00044000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00048000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00044000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00040000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00088000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00048000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00030023,
+ 0x03C, 0x00048000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00028623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00021633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0001C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00010293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00009593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x80000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x00000F8B,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0000078B,
+ 0xB0000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00078023,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00044000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00044000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00044000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00070023,
+ 0x03C, 0x00048000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00068623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00061633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0005C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00050293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00049593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x80000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x00040F8B,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0004078B,
+ 0xB0000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B8023,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00004000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00060000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00004000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00060000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00024000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00004000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000B0023,
+ 0x80000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x00020000,
+ 0xB0000000, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000A8623,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x000A1633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x0009C633,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00090293,
+ 0x03C, 0x00000000,
+ 0x03A, 0x0000013C,
+ 0x03B, 0x00089593,
+ 0x03C, 0x00000000,
+ 0x03A, 0x00000148,
+ 0x80000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03B, 0x0008138B,
+ 0xA0000000, 0x00000000,
+ 0x03B, 0x0008078B,
+ 0xB0000000, 0x00000000,
+ 0x03C, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x0EF, 0x00000800,
+ 0x03B, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001003,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001803,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00000803,
+ 0xB0000000, 0x00000000,
+ 0x03B, 0x00040000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001002,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000001,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x90000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000802,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001803,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0xB0000000, 0x00000000,
+ 0x03B, 0x00080000,
+ 0x80000007, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001802,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00001000,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x03A, 0x00000802,
+ 0xA0000000, 0x00000000,
+ 0x03A, 0x00001002,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000006, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x018, 0x00013124,
+ 0x0EF, 0x00000100,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3EB,
+ 0x034, 0x0004938B,
+ 0x034, 0x000481AC,
+ 0x034, 0x000471A9,
+ 0x034, 0x000460AC,
+ 0x034, 0x000450A9,
+ 0x034, 0x0004402E,
+ 0x034, 0x0004302B,
+ 0x034, 0x00042028,
+ 0x034, 0x0004100B,
+ 0x034, 0x00040008,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3AD,
+ 0x034, 0x0004938A,
+ 0x034, 0x0004818C,
+ 0x034, 0x00047189,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3AD,
+ 0x034, 0x0004938A,
+ 0x034, 0x0004818C,
+ 0x034, 0x00047189,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3AD,
+ 0x034, 0x0004938A,
+ 0x034, 0x0004818C,
+ 0x034, 0x00047189,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3AD,
+ 0x034, 0x0004938A,
+ 0x034, 0x0004818C,
+ 0x034, 0x00047189,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3F4,
+ 0x034, 0x000493D2,
+ 0x034, 0x000482D1,
+ 0x034, 0x000471F1,
+ 0x034, 0x000461EE,
+ 0x034, 0x000451EB,
+ 0x034, 0x000441E8,
+ 0x034, 0x0004314B,
+ 0x034, 0x00042148,
+ 0x034, 0x0004104B,
+ 0x034, 0x00040048,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004AFF7,
+ 0x034, 0x00049FF6,
+ 0x034, 0x00048FF3,
+ 0x034, 0x00047FF0,
+ 0x034, 0x00046FED,
+ 0x034, 0x00045FEA,
+ 0x034, 0x00044FE7,
+ 0x034, 0x00043CB1,
+ 0x034, 0x00042CAE,
+ 0x034, 0x00041CAB,
+ 0x034, 0x00040CA8,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3AD,
+ 0x034, 0x0004938A,
+ 0x034, 0x0004818C,
+ 0x034, 0x00047189,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0004A3AD,
+ 0x034, 0x0004938A,
+ 0x034, 0x0004818C,
+ 0x034, 0x00047189,
+ 0x034, 0x0004606D,
+ 0x034, 0x0004506A,
+ 0x034, 0x0004402C,
+ 0x034, 0x00043029,
+ 0x034, 0x00042026,
+ 0x034, 0x00041009,
+ 0x034, 0x00040006,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0004AFF4,
+ 0x034, 0x00049FF1,
+ 0x034, 0x00048FEE,
+ 0x034, 0x00047FEB,
+ 0x034, 0x00046FE8,
+ 0x034, 0x00045DEA,
+ 0x034, 0x00044CED,
+ 0x034, 0x00043CEA,
+ 0x034, 0x00042C6C,
+ 0x034, 0x00041C69,
+ 0x034, 0x00040C2B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3EE,
+ 0x034, 0x000293EB,
+ 0x034, 0x0002838B,
+ 0x034, 0x000271AC,
+ 0x034, 0x000261A9,
+ 0x034, 0x000250AC,
+ 0x034, 0x000240A9,
+ 0x034, 0x000230A6,
+ 0x034, 0x0002202C,
+ 0x034, 0x00021029,
+ 0x034, 0x00020026,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3AD,
+ 0x034, 0x0002938A,
+ 0x034, 0x0002818C,
+ 0x034, 0x00027189,
+ 0x034, 0x0002606D,
+ 0x034, 0x0002504C,
+ 0x034, 0x0002402C,
+ 0x034, 0x00023029,
+ 0x034, 0x00022026,
+ 0x034, 0x00021023,
+ 0x034, 0x00020006,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3AD,
+ 0x034, 0x0002938A,
+ 0x034, 0x0002818C,
+ 0x034, 0x00027189,
+ 0x034, 0x0002606D,
+ 0x034, 0x0002504C,
+ 0x034, 0x0002402C,
+ 0x034, 0x00023029,
+ 0x034, 0x00022026,
+ 0x034, 0x00021023,
+ 0x034, 0x00020006,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3AD,
+ 0x034, 0x0002938A,
+ 0x034, 0x0002818C,
+ 0x034, 0x00027189,
+ 0x034, 0x0002606D,
+ 0x034, 0x0002504C,
+ 0x034, 0x0002402C,
+ 0x034, 0x00023029,
+ 0x034, 0x00022026,
+ 0x034, 0x00021023,
+ 0x034, 0x00020006,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3AD,
+ 0x034, 0x0002938A,
+ 0x034, 0x0002818C,
+ 0x034, 0x00027189,
+ 0x034, 0x0002606D,
+ 0x034, 0x0002504C,
+ 0x034, 0x0002402C,
+ 0x034, 0x00023029,
+ 0x034, 0x00022026,
+ 0x034, 0x00021023,
+ 0x034, 0x00020006,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3F5,
+ 0x034, 0x000293D2,
+ 0x034, 0x000283CE,
+ 0x034, 0x00027290,
+ 0x034, 0x0002628D,
+ 0x034, 0x0002528A,
+ 0x034, 0x00024287,
+ 0x034, 0x0002308D,
+ 0x034, 0x0002208A,
+ 0x034, 0x00021087,
+ 0x034, 0x00020048,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002AFF7,
+ 0x034, 0x00029FF6,
+ 0x034, 0x00028FF3,
+ 0x034, 0x00027FF0,
+ 0x034, 0x00026FED,
+ 0x034, 0x00025FEA,
+ 0x034, 0x00024FE7,
+ 0x034, 0x00023DEA,
+ 0x034, 0x00022DE7,
+ 0x034, 0x00021DE4,
+ 0x034, 0x00020D48,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3AD,
+ 0x034, 0x0002938A,
+ 0x034, 0x0002818C,
+ 0x034, 0x00027189,
+ 0x034, 0x0002606D,
+ 0x034, 0x0002504C,
+ 0x034, 0x0002402C,
+ 0x034, 0x00023029,
+ 0x034, 0x00022026,
+ 0x034, 0x00021023,
+ 0x034, 0x00020006,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0002A3AD,
+ 0x034, 0x0002938A,
+ 0x034, 0x0002818C,
+ 0x034, 0x00027189,
+ 0x034, 0x0002606D,
+ 0x034, 0x0002504C,
+ 0x034, 0x0002402C,
+ 0x034, 0x00023029,
+ 0x034, 0x00022026,
+ 0x034, 0x00021023,
+ 0x034, 0x00020006,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0002AFF4,
+ 0x034, 0x00029FF1,
+ 0x034, 0x00028FEE,
+ 0x034, 0x00027FEB,
+ 0x034, 0x00026FE8,
+ 0x034, 0x00025DEA,
+ 0x034, 0x00024CED,
+ 0x034, 0x00023CEA,
+ 0x034, 0x00022C6C,
+ 0x034, 0x00021C69,
+ 0x034, 0x00020C2B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EF,
+ 0x034, 0x000093EC,
+ 0x034, 0x0000838C,
+ 0x034, 0x000071AD,
+ 0x034, 0x000061AA,
+ 0x034, 0x000050AD,
+ 0x034, 0x000040AA,
+ 0x034, 0x0000306A,
+ 0x034, 0x0000202D,
+ 0x034, 0x0000102A,
+ 0x034, 0x00000027,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3F1,
+ 0x034, 0x000092B1,
+ 0x034, 0x000081CF,
+ 0x034, 0x00007170,
+ 0x034, 0x0000616D,
+ 0x034, 0x0000516A,
+ 0x034, 0x00004167,
+ 0x034, 0x0000302F,
+ 0x034, 0x0000202C,
+ 0x034, 0x00001029,
+ 0x034, 0x00000026,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000AFF7,
+ 0x034, 0x00009FF6,
+ 0x034, 0x00008FF3,
+ 0x034, 0x00007FF0,
+ 0x034, 0x00006FED,
+ 0x034, 0x00005FEA,
+ 0x034, 0x00004FE7,
+ 0x034, 0x00003EC7,
+ 0x034, 0x00002EC4,
+ 0x034, 0x00001D4B,
+ 0x034, 0x00000D48,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0000A3EE,
+ 0x034, 0x000093AC,
+ 0x034, 0x0000838A,
+ 0x034, 0x0000718C,
+ 0x034, 0x00006189,
+ 0x034, 0x0000506D,
+ 0x034, 0x0000406A,
+ 0x034, 0x0000302C,
+ 0x034, 0x00002029,
+ 0x034, 0x00001026,
+ 0x034, 0x00000023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0000AFF4,
+ 0x034, 0x00009FF1,
+ 0x034, 0x00008FEE,
+ 0x034, 0x00007FEB,
+ 0x034, 0x00006FE8,
+ 0x034, 0x00005DEA,
+ 0x034, 0x00004CED,
+ 0x034, 0x00003CEA,
+ 0x034, 0x00002C6C,
+ 0x034, 0x00001C69,
+ 0x034, 0x00000C2B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3EB,
+ 0x034, 0x000C938B,
+ 0x034, 0x000C81AC,
+ 0x034, 0x000C71A9,
+ 0x034, 0x000C60AC,
+ 0x034, 0x000C50A9,
+ 0x034, 0x000C402E,
+ 0x034, 0x000C302B,
+ 0x034, 0x000C2028,
+ 0x034, 0x000C100B,
+ 0x034, 0x000C0008,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3AD,
+ 0x034, 0x000C938A,
+ 0x034, 0x000C818C,
+ 0x034, 0x000C7189,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3AD,
+ 0x034, 0x000C938A,
+ 0x034, 0x000C818C,
+ 0x034, 0x000C7189,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3AD,
+ 0x034, 0x000C938A,
+ 0x034, 0x000C818C,
+ 0x034, 0x000C7189,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3AD,
+ 0x034, 0x000C938A,
+ 0x034, 0x000C818C,
+ 0x034, 0x000C7189,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3F4,
+ 0x034, 0x000C93D2,
+ 0x034, 0x000C82D1,
+ 0x034, 0x000C71F1,
+ 0x034, 0x000C61EE,
+ 0x034, 0x000C51EB,
+ 0x034, 0x000C41E8,
+ 0x034, 0x000C314B,
+ 0x034, 0x000C2148,
+ 0x034, 0x000C104B,
+ 0x034, 0x000C0048,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CAFF7,
+ 0x034, 0x000C9FF6,
+ 0x034, 0x000C8FF3,
+ 0x034, 0x000C7FF0,
+ 0x034, 0x000C6FED,
+ 0x034, 0x000C5FEA,
+ 0x034, 0x000C4FE7,
+ 0x034, 0x000C3CB1,
+ 0x034, 0x000C2CAE,
+ 0x034, 0x000C1CAB,
+ 0x034, 0x000C0CA8,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3AD,
+ 0x034, 0x000C938A,
+ 0x034, 0x000C818C,
+ 0x034, 0x000C7189,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000CA3AD,
+ 0x034, 0x000C938A,
+ 0x034, 0x000C818C,
+ 0x034, 0x000C7189,
+ 0x034, 0x000C606D,
+ 0x034, 0x000C506A,
+ 0x034, 0x000C402C,
+ 0x034, 0x000C3029,
+ 0x034, 0x000C2026,
+ 0x034, 0x000C1009,
+ 0x034, 0x000C0006,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x000CA794,
+ 0x034, 0x000C9791,
+ 0x034, 0x000C878E,
+ 0x034, 0x000C778B,
+ 0x034, 0x000C658D,
+ 0x034, 0x000C558A,
+ 0x034, 0x000C448D,
+ 0x034, 0x000C348A,
+ 0x034, 0x000C244C,
+ 0x034, 0x000C1449,
+ 0x034, 0x000C042B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3EE,
+ 0x034, 0x000A93EB,
+ 0x034, 0x000A838B,
+ 0x034, 0x000A71AC,
+ 0x034, 0x000A61A9,
+ 0x034, 0x000A50AC,
+ 0x034, 0x000A40A9,
+ 0x034, 0x000A30A6,
+ 0x034, 0x000A202C,
+ 0x034, 0x000A1029,
+ 0x034, 0x000A0026,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3AD,
+ 0x034, 0x000A938A,
+ 0x034, 0x000A818C,
+ 0x034, 0x000A7189,
+ 0x034, 0x000A606D,
+ 0x034, 0x000A504C,
+ 0x034, 0x000A402C,
+ 0x034, 0x000A3029,
+ 0x034, 0x000A2026,
+ 0x034, 0x000A1023,
+ 0x034, 0x000A0006,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3AD,
+ 0x034, 0x000A938A,
+ 0x034, 0x000A818C,
+ 0x034, 0x000A7189,
+ 0x034, 0x000A606D,
+ 0x034, 0x000A504C,
+ 0x034, 0x000A402C,
+ 0x034, 0x000A3029,
+ 0x034, 0x000A2026,
+ 0x034, 0x000A1023,
+ 0x034, 0x000A0006,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3AD,
+ 0x034, 0x000A938A,
+ 0x034, 0x000A818C,
+ 0x034, 0x000A7189,
+ 0x034, 0x000A606D,
+ 0x034, 0x000A504C,
+ 0x034, 0x000A402C,
+ 0x034, 0x000A3029,
+ 0x034, 0x000A2026,
+ 0x034, 0x000A1023,
+ 0x034, 0x000A0006,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3AD,
+ 0x034, 0x000A938A,
+ 0x034, 0x000A818C,
+ 0x034, 0x000A7189,
+ 0x034, 0x000A606D,
+ 0x034, 0x000A504C,
+ 0x034, 0x000A402C,
+ 0x034, 0x000A3029,
+ 0x034, 0x000A2026,
+ 0x034, 0x000A1023,
+ 0x034, 0x000A0006,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3F5,
+ 0x034, 0x000A93D2,
+ 0x034, 0x000A83CE,
+ 0x034, 0x000A7290,
+ 0x034, 0x000A628D,
+ 0x034, 0x000A528A,
+ 0x034, 0x000A4287,
+ 0x034, 0x000A308D,
+ 0x034, 0x000A208A,
+ 0x034, 0x000A1087,
+ 0x034, 0x000A0048,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AAFF7,
+ 0x034, 0x000A9FF6,
+ 0x034, 0x000A8FF3,
+ 0x034, 0x000A7FF0,
+ 0x034, 0x000A6FED,
+ 0x034, 0x000A5FEA,
+ 0x034, 0x000A4FE7,
+ 0x034, 0x000A3DEA,
+ 0x034, 0x000A2DE7,
+ 0x034, 0x000A1DE4,
+ 0x034, 0x000A0D48,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3AD,
+ 0x034, 0x000A938A,
+ 0x034, 0x000A818C,
+ 0x034, 0x000A7189,
+ 0x034, 0x000A606D,
+ 0x034, 0x000A504C,
+ 0x034, 0x000A402C,
+ 0x034, 0x000A3029,
+ 0x034, 0x000A2026,
+ 0x034, 0x000A1023,
+ 0x034, 0x000A0006,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x000AA3AD,
+ 0x034, 0x000A938A,
+ 0x034, 0x000A818C,
+ 0x034, 0x000A7189,
+ 0x034, 0x000A606D,
+ 0x034, 0x000A504C,
+ 0x034, 0x000A402C,
+ 0x034, 0x000A3029,
+ 0x034, 0x000A2026,
+ 0x034, 0x000A1023,
+ 0x034, 0x000A0006,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x000AA794,
+ 0x034, 0x000A9791,
+ 0x034, 0x000A878E,
+ 0x034, 0x000A778B,
+ 0x034, 0x000A658D,
+ 0x034, 0x000A558A,
+ 0x034, 0x000A448D,
+ 0x034, 0x000A348A,
+ 0x034, 0x000A244C,
+ 0x034, 0x000A1449,
+ 0x034, 0x000A042B,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EF,
+ 0x034, 0x000893EC,
+ 0x034, 0x0008838C,
+ 0x034, 0x000871AD,
+ 0x034, 0x000861AA,
+ 0x034, 0x000850AD,
+ 0x034, 0x000840AA,
+ 0x034, 0x0008306A,
+ 0x034, 0x0008202D,
+ 0x034, 0x0008102A,
+ 0x034, 0x00080027,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3F1,
+ 0x034, 0x000892B1,
+ 0x034, 0x000881CF,
+ 0x034, 0x00087170,
+ 0x034, 0x0008616D,
+ 0x034, 0x0008516A,
+ 0x034, 0x00084167,
+ 0x034, 0x0008302F,
+ 0x034, 0x0008202C,
+ 0x034, 0x00081029,
+ 0x034, 0x00080026,
+ 0x90000009, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008AFF7,
+ 0x034, 0x00089FF6,
+ 0x034, 0x00088FF3,
+ 0x034, 0x00087FF0,
+ 0x034, 0x00086FED,
+ 0x034, 0x00085FEA,
+ 0x034, 0x00084FE7,
+ 0x034, 0x00083EC7,
+ 0x034, 0x00082EC4,
+ 0x034, 0x00081D4B,
+ 0x034, 0x00080D48,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x034, 0x0008A3EE,
+ 0x034, 0x000893AC,
+ 0x034, 0x0008838A,
+ 0x034, 0x0008718C,
+ 0x034, 0x00086189,
+ 0x034, 0x0008506D,
+ 0x034, 0x0008406A,
+ 0x034, 0x0008302C,
+ 0x034, 0x00082029,
+ 0x034, 0x00081026,
+ 0x034, 0x00080023,
+ 0xA0000000, 0x00000000,
+ 0x034, 0x0008A794,
+ 0x034, 0x00089791,
+ 0x034, 0x0008878E,
+ 0x034, 0x0008778B,
+ 0x034, 0x0008658D,
+ 0x034, 0x0008558A,
+ 0x034, 0x0008448D,
+ 0x034, 0x0008348A,
+ 0x034, 0x0008244C,
+ 0x034, 0x00081449,
+ 0x034, 0x0008042B,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x0DF, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x018, 0x0001712A,
+ 0x0EF, 0x00000040,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x035, 0x000006CC,
+ 0x035, 0x000086CC,
+ 0x035, 0x000106CC,
+ 0x035, 0x000206CC,
+ 0x035, 0x000286CC,
+ 0x035, 0x000306CC,
+ 0x035, 0x000406CC,
+ 0x035, 0x000486CC,
+ 0x035, 0x000506CC,
+ 0x035, 0x000806CC,
+ 0x035, 0x000886CC,
+ 0x035, 0x000906CC,
+ 0x035, 0x000A06CC,
+ 0x035, 0x000A86CC,
+ 0x035, 0x000B06CC,
+ 0x035, 0x000C06CC,
+ 0x035, 0x000C86CC,
+ 0x035, 0x000D06CC,
+ 0xA0000000, 0x00000000,
+ 0x035, 0x00000484,
+ 0x035, 0x00008484,
+ 0x035, 0x00010484,
+ 0x035, 0x00020584,
+ 0x035, 0x00028584,
+ 0x035, 0x00030584,
+ 0x035, 0x00040584,
+ 0x035, 0x00048584,
+ 0x035, 0x00050584,
+ 0x035, 0x000805FB,
+ 0x035, 0x000885FB,
+ 0x035, 0x000905FB,
+ 0x035, 0x000A05FB,
+ 0x035, 0x000A85FB,
+ 0x035, 0x000B05FB,
+ 0x035, 0x000C05FB,
+ 0x035, 0x000C85FB,
+ 0x035, 0x000D05FB,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x0DF, 0x00000001,
+ 0xA0000000, 0x00000000,
+ 0x0DF, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x018, 0x0001712A,
+ 0x0EF, 0x00000010,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000473,
+ 0x036, 0x00008473,
+ 0x036, 0x00010473,
+ 0x036, 0x00020473,
+ 0x036, 0x00028473,
+ 0x036, 0x00030473,
+ 0x036, 0x00040473,
+ 0x036, 0x00048473,
+ 0x036, 0x00050473,
+ 0x036, 0x00080473,
+ 0x036, 0x00088473,
+ 0x036, 0x00090473,
+ 0x036, 0x000A0473,
+ 0x036, 0x000A8473,
+ 0x036, 0x000B0473,
+ 0x036, 0x000C0473,
+ 0x036, 0x000C8473,
+ 0x036, 0x000D0473,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x036, 0x00000475,
+ 0x036, 0x00008475,
+ 0x036, 0x00010475,
+ 0x036, 0x00020475,
+ 0x036, 0x00028475,
+ 0x036, 0x00030475,
+ 0x036, 0x00040475,
+ 0x036, 0x00048475,
+ 0x036, 0x00050475,
+ 0x036, 0x00080475,
+ 0x036, 0x00088475,
+ 0x036, 0x00090475,
+ 0x036, 0x000A0475,
+ 0x036, 0x000A8475,
+ 0x036, 0x000B0475,
+ 0x036, 0x000C0475,
+ 0x036, 0x000C8475,
+ 0x036, 0x000D0475,
+ 0xA0000000, 0x00000000,
+ 0x036, 0x00000474,
+ 0x036, 0x00008474,
+ 0x036, 0x00010474,
+ 0x036, 0x00020474,
+ 0x036, 0x00028474,
+ 0x036, 0x00030474,
+ 0x036, 0x00040474,
+ 0x036, 0x00048474,
+ 0x036, 0x00050474,
+ 0x036, 0x00080474,
+ 0x036, 0x00088474,
+ 0x036, 0x00090474,
+ 0x036, 0x000A0474,
+ 0x036, 0x000A8474,
+ 0x036, 0x000B0474,
+ 0x036, 0x000C0474,
+ 0x036, 0x000C8474,
+ 0x036, 0x000D0474,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x0EF, 0x00000004,
+ 0x037, 0x00000000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00004000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00008000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00010000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00014000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00018000,
+ 0x038, 0x0000514E,
+ 0x037, 0x0001C000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00020000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00024000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00028000,
+ 0x038, 0x0000514E,
+ 0x037, 0x0002C000,
+ 0x038, 0x0000714E,
+ 0x037, 0x00030000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00034000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00038000,
+ 0x038, 0x0000514E,
+ 0x037, 0x0003C000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00040000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00044000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00048000,
+ 0x038, 0x0000514E,
+ 0x037, 0x00080000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00084000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00088000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00090000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00094000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x00098000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x0009C000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000A8000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000AC000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000B8000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000BC000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C0000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C4000,
+ 0x038, 0x00005ECE,
+ 0x037, 0x000C8000,
+ 0x038, 0x00005ECE,
+ 0x0EF, 0x00000000,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000008,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x0000007D,
+ 0x03C, 0x0000047D,
+ 0x03C, 0x0000087D,
+ 0x03C, 0x0000107D,
+ 0x03C, 0x0000147D,
+ 0x03C, 0x0000187D,
+ 0xB0000000, 0x00000000,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x00000275,
+ 0x03C, 0x00000542,
+ 0x03C, 0x00000821,
+ 0x03C, 0x00001275,
+ 0x03C, 0x00001542,
+ 0x03C, 0x00001821,
+ 0x03C, 0x00002275,
+ 0x03C, 0x00002542,
+ 0x03C, 0x00002821,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027F,
+ 0x03C, 0x00000542,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127F,
+ 0x03C, 0x00001542,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227F,
+ 0x03C, 0x00002542,
+ 0x03C, 0x00002821,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027F,
+ 0x03C, 0x00000542,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127F,
+ 0x03C, 0x00001542,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227F,
+ 0x03C, 0x00002542,
+ 0x03C, 0x00002821,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027F,
+ 0x03C, 0x00000542,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127F,
+ 0x03C, 0x00001542,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227F,
+ 0x03C, 0x00002542,
+ 0x03C, 0x00002821,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027F,
+ 0x03C, 0x00000542,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127F,
+ 0x03C, 0x00001542,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227F,
+ 0x03C, 0x00002542,
+ 0x03C, 0x00002821,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027F,
+ 0x03C, 0x00000542,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127F,
+ 0x03C, 0x00001542,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227F,
+ 0x03C, 0x00002542,
+ 0x03C, 0x00002821,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027F,
+ 0x03C, 0x00000542,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127F,
+ 0x03C, 0x00001542,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227F,
+ 0x03C, 0x00002542,
+ 0x03C, 0x00002821,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x03C, 0x0000027F,
+ 0x03C, 0x00000542,
+ 0x03C, 0x00000821,
+ 0x03C, 0x0000127F,
+ 0x03C, 0x00001542,
+ 0x03C, 0x00001821,
+ 0x03C, 0x0000227F,
+ 0x03C, 0x00002542,
+ 0x03C, 0x00002821,
+ 0xA0000000, 0x00000000,
+ 0x03C, 0x0000037E,
+ 0x03C, 0x00000575,
+ 0x03C, 0x00000971,
+ 0x03C, 0x0000127E,
+ 0x03C, 0x00001575,
+ 0x03C, 0x00001871,
+ 0x03C, 0x0000217E,
+ 0x03C, 0x00002575,
+ 0x03C, 0x00002871,
+ 0xB0000000, 0x00000000,
+ 0x0EF, 0x00000000,
+ 0x061, 0x000C0D47,
+ 0x062, 0x0000133C,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x063, 0x000750E7,
+ 0xA0000000, 0x00000000,
+ 0x063, 0x0007D0E7,
+ 0xB0000000, 0x00000000,
+ 0x064, 0x00014FEC,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0x065, 0x000920D0,
+ 0xA0000000, 0x00000000,
+ 0x065, 0x000923FF,
+ 0xB0000000, 0x00000000,
+ 0x066, 0x00000040,
+ 0x057, 0x00050000,
+ 0x056, 0x00051DF0,
+ 0x80000001, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000002, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000003, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000004, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000005, 0x00000000, 0x40000000, 0x00000000,
+ 0x90000008, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000a, 0x00000000, 0x40000000, 0x00000000,
+ 0x9000000b, 0x00000000, 0x40000000, 0x00000000,
+ 0xA0000000, 0x00000000,
+ 0x055, 0x00082060,
+ 0xB0000000, 0x00000000,
+};
+
+RTW_DECL_TABLE_RF_RADIO(rtw8814a_rf_d, D);
+
+static const struct rtw_txpwr_lmt_cfg_pair rtw8814a_txpwr_lmt[] = {
+ { 0, 0, 0, 0, 1, 36, },
+ { 2, 0, 0, 0, 1, 32, },
+ { 1, 0, 0, 0, 1, 32, },
+ { 0, 0, 0, 0, 2, 36, },
+ { 2, 0, 0, 0, 2, 32, },
+ { 1, 0, 0, 0, 2, 32, },
+ { 0, 0, 0, 0, 3, 36, },
+ { 2, 0, 0, 0, 3, 32, },
+ { 1, 0, 0, 0, 3, 32, },
+ { 0, 0, 0, 0, 4, 36, },
+ { 2, 0, 0, 0, 4, 32, },
+ { 1, 0, 0, 0, 4, 32, },
+ { 0, 0, 0, 0, 5, 36, },
+ { 2, 0, 0, 0, 5, 32, },
+ { 1, 0, 0, 0, 5, 32, },
+ { 0, 0, 0, 0, 6, 36, },
+ { 2, 0, 0, 0, 6, 32, },
+ { 1, 0, 0, 0, 6, 32, },
+ { 0, 0, 0, 0, 7, 36, },
+ { 2, 0, 0, 0, 7, 32, },
+ { 1, 0, 0, 0, 7, 32, },
+ { 0, 0, 0, 0, 8, 36, },
+ { 2, 0, 0, 0, 8, 32, },
+ { 1, 0, 0, 0, 8, 32, },
+ { 0, 0, 0, 0, 9, 36, },
+ { 2, 0, 0, 0, 9, 32, },
+ { 1, 0, 0, 0, 9, 32, },
+ { 0, 0, 0, 0, 10, 36, },
+ { 2, 0, 0, 0, 10, 32, },
+ { 1, 0, 0, 0, 10, 32, },
+ { 0, 0, 0, 0, 11, 36, },
+ { 2, 0, 0, 0, 11, 32, },
+ { 1, 0, 0, 0, 11, 32, },
+ { 0, 0, 0, 0, 12, 63, },
+ { 2, 0, 0, 0, 12, 32, },
+ { 1, 0, 0, 0, 12, 32, },
+ { 0, 0, 0, 0, 13, 63, },
+ { 2, 0, 0, 0, 13, 32, },
+ { 1, 0, 0, 0, 13, 32, },
+ { 0, 0, 0, 0, 14, 63, },
+ { 2, 0, 0, 0, 14, 63, },
+ { 1, 0, 0, 0, 14, 32, },
+ { 0, 0, 0, 1, 1, 34, },
+ { 2, 0, 0, 1, 1, 32, },
+ { 1, 0, 0, 1, 1, 32, },
+ { 0, 0, 0, 1, 2, 36, },
+ { 2, 0, 0, 1, 2, 32, },
+ { 1, 0, 0, 1, 2, 32, },
+ { 0, 0, 0, 1, 3, 36, },
+ { 2, 0, 0, 1, 3, 32, },
+ { 1, 0, 0, 1, 3, 32, },
+ { 0, 0, 0, 1, 4, 36, },
+ { 2, 0, 0, 1, 4, 32, },
+ { 1, 0, 0, 1, 4, 32, },
+ { 0, 0, 0, 1, 5, 36, },
+ { 2, 0, 0, 1, 5, 32, },
+ { 1, 0, 0, 1, 5, 32, },
+ { 0, 0, 0, 1, 6, 36, },
+ { 2, 0, 0, 1, 6, 32, },
+ { 1, 0, 0, 1, 6, 32, },
+ { 0, 0, 0, 1, 7, 36, },
+ { 2, 0, 0, 1, 7, 32, },
+ { 1, 0, 0, 1, 7, 32, },
+ { 0, 0, 0, 1, 8, 36, },
+ { 2, 0, 0, 1, 8, 32, },
+ { 1, 0, 0, 1, 8, 32, },
+ { 0, 0, 0, 1, 9, 36, },
+ { 2, 0, 0, 1, 9, 32, },
+ { 1, 0, 0, 1, 9, 32, },
+ { 0, 0, 0, 1, 10, 36, },
+ { 2, 0, 0, 1, 10, 32, },
+ { 1, 0, 0, 1, 10, 32, },
+ { 0, 0, 0, 1, 11, 32, },
+ { 2, 0, 0, 1, 11, 32, },
+ { 1, 0, 0, 1, 11, 32, },
+ { 0, 0, 0, 1, 12, 63, },
+ { 2, 0, 0, 1, 12, 32, },
+ { 1, 0, 0, 1, 12, 32, },
+ { 0, 0, 0, 1, 13, 63, },
+ { 2, 0, 0, 1, 13, 32, },
+ { 1, 0, 0, 1, 13, 32, },
+ { 0, 0, 0, 1, 14, 63, },
+ { 2, 0, 0, 1, 14, 63, },
+ { 1, 0, 0, 1, 14, 63, },
+ { 0, 0, 0, 2, 1, 34, },
+ { 2, 0, 0, 2, 1, 32, },
+ { 1, 0, 0, 2, 1, 32, },
+ { 0, 0, 0, 2, 2, 36, },
+ { 2, 0, 0, 2, 2, 32, },
+ { 1, 0, 0, 2, 2, 32, },
+ { 0, 0, 0, 2, 3, 36, },
+ { 2, 0, 0, 2, 3, 32, },
+ { 1, 0, 0, 2, 3, 32, },
+ { 0, 0, 0, 2, 4, 36, },
+ { 2, 0, 0, 2, 4, 32, },
+ { 1, 0, 0, 2, 4, 32, },
+ { 0, 0, 0, 2, 5, 36, },
+ { 2, 0, 0, 2, 5, 32, },
+ { 1, 0, 0, 2, 5, 32, },
+ { 0, 0, 0, 2, 6, 36, },
+ { 2, 0, 0, 2, 6, 32, },
+ { 1, 0, 0, 2, 6, 32, },
+ { 0, 0, 0, 2, 7, 36, },
+ { 2, 0, 0, 2, 7, 32, },
+ { 1, 0, 0, 2, 7, 32, },
+ { 0, 0, 0, 2, 8, 36, },
+ { 2, 0, 0, 2, 8, 32, },
+ { 1, 0, 0, 2, 8, 32, },
+ { 0, 0, 0, 2, 9, 36, },
+ { 2, 0, 0, 2, 9, 32, },
+ { 1, 0, 0, 2, 9, 32, },
+ { 0, 0, 0, 2, 10, 36, },
+ { 2, 0, 0, 2, 10, 32, },
+ { 1, 0, 0, 2, 10, 32, },
+ { 0, 0, 0, 2, 11, 32, },
+ { 2, 0, 0, 2, 11, 32, },
+ { 1, 0, 0, 2, 11, 32, },
+ { 0, 0, 0, 2, 12, 63, },
+ { 2, 0, 0, 2, 12, 32, },
+ { 1, 0, 0, 2, 12, 32, },
+ { 0, 0, 0, 2, 13, 63, },
+ { 2, 0, 0, 2, 13, 32, },
+ { 1, 0, 0, 2, 13, 32, },
+ { 0, 0, 0, 2, 14, 63, },
+ { 2, 0, 0, 2, 14, 63, },
+ { 1, 0, 0, 2, 14, 63, },
+ { 0, 0, 0, 3, 1, 32, },
+ { 2, 0, 0, 3, 1, 30, },
+ { 1, 0, 0, 3, 1, 30, },
+ { 0, 0, 0, 3, 2, 34, },
+ { 2, 0, 0, 3, 2, 30, },
+ { 1, 0, 0, 3, 2, 30, },
+ { 0, 0, 0, 3, 3, 34, },
+ { 2, 0, 0, 3, 3, 30, },
+ { 1, 0, 0, 3, 3, 30, },
+ { 0, 0, 0, 3, 4, 34, },
+ { 2, 0, 0, 3, 4, 30, },
+ { 1, 0, 0, 3, 4, 30, },
+ { 0, 0, 0, 3, 5, 34, },
+ { 2, 0, 0, 3, 5, 30, },
+ { 1, 0, 0, 3, 5, 30, },
+ { 0, 0, 0, 3, 6, 34, },
+ { 2, 0, 0, 3, 6, 30, },
+ { 1, 0, 0, 3, 6, 30, },
+ { 0, 0, 0, 3, 7, 34, },
+ { 2, 0, 0, 3, 7, 30, },
+ { 1, 0, 0, 3, 7, 30, },
+ { 0, 0, 0, 3, 8, 34, },
+ { 2, 0, 0, 3, 8, 30, },
+ { 1, 0, 0, 3, 8, 30, },
+ { 0, 0, 0, 3, 9, 34, },
+ { 2, 0, 0, 3, 9, 30, },
+ { 1, 0, 0, 3, 9, 30, },
+ { 0, 0, 0, 3, 10, 34, },
+ { 2, 0, 0, 3, 10, 30, },
+ { 1, 0, 0, 3, 10, 30, },
+ { 0, 0, 0, 3, 11, 30, },
+ { 2, 0, 0, 3, 11, 30, },
+ { 1, 0, 0, 3, 11, 30, },
+ { 0, 0, 0, 3, 12, 63, },
+ { 2, 0, 0, 3, 12, 30, },
+ { 1, 0, 0, 3, 12, 30, },
+ { 0, 0, 0, 3, 13, 63, },
+ { 2, 0, 0, 3, 13, 30, },
+ { 1, 0, 0, 3, 13, 30, },
+ { 0, 0, 0, 3, 14, 63, },
+ { 2, 0, 0, 3, 14, 63, },
+ { 1, 0, 0, 3, 14, 63, },
+ { 0, 0, 0, 6, 1, 30, },
+ { 2, 0, 0, 6, 1, 28, },
+ { 1, 0, 0, 6, 1, 28, },
+ { 0, 0, 0, 6, 2, 32, },
+ { 2, 0, 0, 6, 2, 28, },
+ { 1, 0, 0, 6, 2, 28, },
+ { 0, 0, 0, 6, 3, 32, },
+ { 2, 0, 0, 6, 3, 28, },
+ { 1, 0, 0, 6, 3, 28, },
+ { 0, 0, 0, 6, 4, 32, },
+ { 2, 0, 0, 6, 4, 28, },
+ { 1, 0, 0, 6, 4, 28, },
+ { 0, 0, 0, 6, 5, 32, },
+ { 2, 0, 0, 6, 5, 28, },
+ { 1, 0, 0, 6, 5, 28, },
+ { 0, 0, 0, 6, 6, 32, },
+ { 2, 0, 0, 6, 6, 28, },
+ { 1, 0, 0, 6, 6, 28, },
+ { 0, 0, 0, 6, 7, 32, },
+ { 2, 0, 0, 6, 7, 28, },
+ { 1, 0, 0, 6, 7, 28, },
+ { 0, 0, 0, 6, 8, 32, },
+ { 2, 0, 0, 6, 8, 28, },
+ { 1, 0, 0, 6, 8, 28, },
+ { 0, 0, 0, 6, 9, 32, },
+ { 2, 0, 0, 6, 9, 28, },
+ { 1, 0, 0, 6, 9, 28, },
+ { 0, 0, 0, 6, 10, 32, },
+ { 2, 0, 0, 6, 10, 28, },
+ { 1, 0, 0, 6, 10, 28, },
+ { 0, 0, 0, 6, 11, 28, },
+ { 2, 0, 0, 6, 11, 28, },
+ { 1, 0, 0, 6, 11, 28, },
+ { 0, 0, 0, 6, 12, 63, },
+ { 2, 0, 0, 6, 12, 28, },
+ { 1, 0, 0, 6, 12, 28, },
+ { 0, 0, 0, 6, 13, 63, },
+ { 2, 0, 0, 6, 13, 28, },
+ { 1, 0, 0, 6, 13, 28, },
+ { 0, 0, 0, 6, 14, 63, },
+ { 2, 0, 0, 6, 14, 63, },
+ { 1, 0, 0, 6, 14, 63, },
+ { 0, 0, 0, 7, 1, 28, },
+ { 2, 0, 0, 7, 1, 26, },
+ { 1, 0, 0, 7, 1, 26, },
+ { 0, 0, 0, 7, 2, 30, },
+ { 2, 0, 0, 7, 2, 26, },
+ { 1, 0, 0, 7, 2, 26, },
+ { 0, 0, 0, 7, 3, 30, },
+ { 2, 0, 0, 7, 3, 26, },
+ { 1, 0, 0, 7, 3, 26, },
+ { 0, 0, 0, 7, 4, 30, },
+ { 2, 0, 0, 7, 4, 26, },
+ { 1, 0, 0, 7, 4, 26, },
+ { 0, 0, 0, 7, 5, 30, },
+ { 2, 0, 0, 7, 5, 26, },
+ { 1, 0, 0, 7, 5, 26, },
+ { 0, 0, 0, 7, 6, 30, },
+ { 2, 0, 0, 7, 6, 26, },
+ { 1, 0, 0, 7, 6, 26, },
+ { 0, 0, 0, 7, 7, 30, },
+ { 2, 0, 0, 7, 7, 26, },
+ { 1, 0, 0, 7, 7, 26, },
+ { 0, 0, 0, 7, 8, 30, },
+ { 2, 0, 0, 7, 8, 26, },
+ { 1, 0, 0, 7, 8, 26, },
+ { 0, 0, 0, 7, 9, 30, },
+ { 2, 0, 0, 7, 9, 26, },
+ { 1, 0, 0, 7, 9, 26, },
+ { 0, 0, 0, 7, 10, 30, },
+ { 2, 0, 0, 7, 10, 26, },
+ { 1, 0, 0, 7, 10, 26, },
+ { 0, 0, 0, 7, 11, 26, },
+ { 2, 0, 0, 7, 11, 26, },
+ { 1, 0, 0, 7, 11, 26, },
+ { 0, 0, 0, 7, 12, 63, },
+ { 2, 0, 0, 7, 12, 26, },
+ { 1, 0, 0, 7, 12, 26, },
+ { 0, 0, 0, 7, 13, 63, },
+ { 2, 0, 0, 7, 13, 26, },
+ { 1, 0, 0, 7, 13, 26, },
+ { 0, 0, 0, 7, 14, 63, },
+ { 2, 0, 0, 7, 14, 63, },
+ { 1, 0, 0, 7, 14, 63, },
+ { 0, 0, 1, 2, 1, 63, },
+ { 2, 0, 1, 2, 1, 63, },
+ { 1, 0, 1, 2, 1, 63, },
+ { 0, 0, 1, 2, 2, 63, },
+ { 2, 0, 1, 2, 2, 63, },
+ { 1, 0, 1, 2, 2, 63, },
+ { 0, 0, 1, 2, 3, 32, },
+ { 2, 0, 1, 2, 3, 32, },
+ { 1, 0, 1, 2, 3, 32, },
+ { 0, 0, 1, 2, 4, 36, },
+ { 2, 0, 1, 2, 4, 32, },
+ { 1, 0, 1, 2, 4, 32, },
+ { 0, 0, 1, 2, 5, 36, },
+ { 2, 0, 1, 2, 5, 32, },
+ { 1, 0, 1, 2, 5, 32, },
+ { 0, 0, 1, 2, 6, 36, },
+ { 2, 0, 1, 2, 6, 32, },
+ { 1, 0, 1, 2, 6, 32, },
+ { 0, 0, 1, 2, 7, 36, },
+ { 2, 0, 1, 2, 7, 32, },
+ { 1, 0, 1, 2, 7, 32, },
+ { 0, 0, 1, 2, 8, 36, },
+ { 2, 0, 1, 2, 8, 32, },
+ { 1, 0, 1, 2, 8, 32, },
+ { 0, 0, 1, 2, 9, 36, },
+ { 2, 0, 1, 2, 9, 32, },
+ { 1, 0, 1, 2, 9, 32, },
+ { 0, 0, 1, 2, 10, 36, },
+ { 2, 0, 1, 2, 10, 32, },
+ { 1, 0, 1, 2, 10, 32, },
+ { 0, 0, 1, 2, 11, 32, },
+ { 2, 0, 1, 2, 11, 32, },
+ { 1, 0, 1, 2, 11, 32, },
+ { 0, 0, 1, 2, 12, 63, },
+ { 2, 0, 1, 2, 12, 32, },
+ { 1, 0, 1, 2, 12, 32, },
+ { 0, 0, 1, 2, 13, 63, },
+ { 2, 0, 1, 2, 13, 32, },
+ { 1, 0, 1, 2, 13, 32, },
+ { 0, 0, 1, 2, 14, 63, },
+ { 2, 0, 1, 2, 14, 63, },
+ { 1, 0, 1, 2, 14, 63, },
+ { 0, 0, 1, 3, 1, 63, },
+ { 2, 0, 1, 3, 1, 63, },
+ { 1, 0, 1, 3, 1, 63, },
+ { 0, 0, 1, 3, 2, 63, },
+ { 2, 0, 1, 3, 2, 63, },
+ { 1, 0, 1, 3, 2, 63, },
+ { 0, 0, 1, 3, 3, 30, },
+ { 2, 0, 1, 3, 3, 30, },
+ { 1, 0, 1, 3, 3, 30, },
+ { 0, 0, 1, 3, 4, 34, },
+ { 2, 0, 1, 3, 4, 30, },
+ { 1, 0, 1, 3, 4, 30, },
+ { 0, 0, 1, 3, 5, 34, },
+ { 2, 0, 1, 3, 5, 30, },
+ { 1, 0, 1, 3, 5, 30, },
+ { 0, 0, 1, 3, 6, 34, },
+ { 2, 0, 1, 3, 6, 30, },
+ { 1, 0, 1, 3, 6, 30, },
+ { 0, 0, 1, 3, 7, 34, },
+ { 2, 0, 1, 3, 7, 30, },
+ { 1, 0, 1, 3, 7, 30, },
+ { 0, 0, 1, 3, 8, 34, },
+ { 2, 0, 1, 3, 8, 30, },
+ { 1, 0, 1, 3, 8, 30, },
+ { 0, 0, 1, 3, 9, 34, },
+ { 2, 0, 1, 3, 9, 30, },
+ { 1, 0, 1, 3, 9, 30, },
+ { 0, 0, 1, 3, 10, 34, },
+ { 2, 0, 1, 3, 10, 30, },
+ { 1, 0, 1, 3, 10, 30, },
+ { 0, 0, 1, 3, 11, 30, },
+ { 2, 0, 1, 3, 11, 30, },
+ { 1, 0, 1, 3, 11, 30, },
+ { 0, 0, 1, 3, 12, 63, },
+ { 2, 0, 1, 3, 12, 30, },
+ { 1, 0, 1, 3, 12, 30, },
+ { 0, 0, 1, 3, 13, 63, },
+ { 2, 0, 1, 3, 13, 30, },
+ { 1, 0, 1, 3, 13, 30, },
+ { 0, 0, 1, 3, 14, 63, },
+ { 2, 0, 1, 3, 14, 63, },
+ { 1, 0, 1, 3, 14, 63, },
+ { 0, 0, 1, 6, 1, 63, },
+ { 2, 0, 1, 6, 1, 63, },
+ { 1, 0, 1, 6, 1, 63, },
+ { 0, 0, 1, 6, 2, 63, },
+ { 2, 0, 1, 6, 2, 63, },
+ { 1, 0, 1, 6, 2, 63, },
+ { 0, 0, 1, 6, 3, 28, },
+ { 2, 0, 1, 6, 3, 28, },
+ { 1, 0, 1, 6, 3, 28, },
+ { 0, 0, 1, 6, 4, 32, },
+ { 2, 0, 1, 6, 4, 28, },
+ { 1, 0, 1, 6, 4, 28, },
+ { 0, 0, 1, 6, 5, 32, },
+ { 2, 0, 1, 6, 5, 28, },
+ { 1, 0, 1, 6, 5, 28, },
+ { 0, 0, 1, 6, 6, 32, },
+ { 2, 0, 1, 6, 6, 28, },
+ { 1, 0, 1, 6, 6, 28, },
+ { 0, 0, 1, 6, 7, 32, },
+ { 2, 0, 1, 6, 7, 28, },
+ { 1, 0, 1, 6, 7, 28, },
+ { 0, 0, 1, 6, 8, 32, },
+ { 2, 0, 1, 6, 8, 28, },
+ { 1, 0, 1, 6, 8, 28, },
+ { 0, 0, 1, 6, 9, 32, },
+ { 2, 0, 1, 6, 9, 28, },
+ { 1, 0, 1, 6, 9, 28, },
+ { 0, 0, 1, 6, 10, 32, },
+ { 2, 0, 1, 6, 10, 28, },
+ { 1, 0, 1, 6, 10, 28, },
+ { 0, 0, 1, 6, 11, 28, },
+ { 2, 0, 1, 6, 11, 28, },
+ { 1, 0, 1, 6, 11, 28, },
+ { 0, 0, 1, 6, 12, 63, },
+ { 2, 0, 1, 6, 12, 28, },
+ { 1, 0, 1, 6, 12, 28, },
+ { 0, 0, 1, 6, 13, 63, },
+ { 2, 0, 1, 6, 13, 28, },
+ { 1, 0, 1, 6, 13, 28, },
+ { 0, 0, 1, 6, 14, 63, },
+ { 2, 0, 1, 6, 14, 63, },
+ { 1, 0, 1, 6, 14, 63, },
+ { 0, 0, 1, 7, 1, 63, },
+ { 2, 0, 1, 7, 1, 63, },
+ { 1, 0, 1, 7, 1, 63, },
+ { 0, 0, 1, 7, 2, 63, },
+ { 2, 0, 1, 7, 2, 63, },
+ { 1, 0, 1, 7, 2, 63, },
+ { 0, 0, 1, 7, 3, 26, },
+ { 2, 0, 1, 7, 3, 26, },
+ { 1, 0, 1, 7, 3, 26, },
+ { 0, 0, 1, 7, 4, 30, },
+ { 2, 0, 1, 7, 4, 26, },
+ { 1, 0, 1, 7, 4, 26, },
+ { 0, 0, 1, 7, 5, 30, },
+ { 2, 0, 1, 7, 5, 26, },
+ { 1, 0, 1, 7, 5, 26, },
+ { 0, 0, 1, 7, 6, 30, },
+ { 2, 0, 1, 7, 6, 26, },
+ { 1, 0, 1, 7, 6, 26, },
+ { 0, 0, 1, 7, 7, 30, },
+ { 2, 0, 1, 7, 7, 26, },
+ { 1, 0, 1, 7, 7, 26, },
+ { 0, 0, 1, 7, 8, 30, },
+ { 2, 0, 1, 7, 8, 26, },
+ { 1, 0, 1, 7, 8, 26, },
+ { 0, 0, 1, 7, 9, 30, },
+ { 2, 0, 1, 7, 9, 26, },
+ { 1, 0, 1, 7, 9, 26, },
+ { 0, 0, 1, 7, 10, 30, },
+ { 2, 0, 1, 7, 10, 26, },
+ { 1, 0, 1, 7, 10, 26, },
+ { 0, 0, 1, 7, 11, 26, },
+ { 2, 0, 1, 7, 11, 26, },
+ { 1, 0, 1, 7, 11, 26, },
+ { 0, 0, 1, 7, 12, 63, },
+ { 2, 0, 1, 7, 12, 26, },
+ { 1, 0, 1, 7, 12, 26, },
+ { 0, 0, 1, 7, 13, 63, },
+ { 2, 0, 1, 7, 13, 26, },
+ { 1, 0, 1, 7, 13, 26, },
+ { 0, 0, 1, 7, 14, 63, },
+ { 2, 0, 1, 7, 14, 63, },
+ { 1, 0, 1, 7, 14, 63, },
+ { 0, 1, 0, 1, 36, 30, },
+ { 2, 1, 0, 1, 36, 32, },
+ { 1, 1, 0, 1, 36, 32, },
+ { 0, 1, 0, 1, 40, 30, },
+ { 2, 1, 0, 1, 40, 32, },
+ { 1, 1, 0, 1, 40, 32, },
+ { 0, 1, 0, 1, 44, 30, },
+ { 2, 1, 0, 1, 44, 32, },
+ { 1, 1, 0, 1, 44, 32, },
+ { 0, 1, 0, 1, 48, 30, },
+ { 2, 1, 0, 1, 48, 32, },
+ { 1, 1, 0, 1, 48, 32, },
+ { 0, 1, 0, 1, 52, 36, },
+ { 2, 1, 0, 1, 52, 32, },
+ { 1, 1, 0, 1, 52, 32, },
+ { 0, 1, 0, 1, 56, 34, },
+ { 2, 1, 0, 1, 56, 32, },
+ { 1, 1, 0, 1, 56, 32, },
+ { 0, 1, 0, 1, 60, 32, },
+ { 2, 1, 0, 1, 60, 32, },
+ { 1, 1, 0, 1, 60, 32, },
+ { 0, 1, 0, 1, 64, 28, },
+ { 2, 1, 0, 1, 64, 32, },
+ { 1, 1, 0, 1, 64, 32, },
+ { 0, 1, 0, 1, 100, 30, },
+ { 2, 1, 0, 1, 100, 32, },
+ { 1, 1, 0, 1, 100, 32, },
+ { 0, 1, 0, 1, 104, 30, },
+ { 2, 1, 0, 1, 104, 32, },
+ { 1, 1, 0, 1, 104, 32, },
+ { 0, 1, 0, 1, 108, 32, },
+ { 2, 1, 0, 1, 108, 32, },
+ { 1, 1, 0, 1, 108, 32, },
+ { 0, 1, 0, 1, 112, 34, },
+ { 2, 1, 0, 1, 112, 32, },
+ { 1, 1, 0, 1, 112, 32, },
+ { 0, 1, 0, 1, 116, 34, },
+ { 2, 1, 0, 1, 116, 32, },
+ { 1, 1, 0, 1, 116, 32, },
+ { 0, 1, 0, 1, 120, 36, },
+ { 2, 1, 0, 1, 120, 32, },
+ { 1, 1, 0, 1, 120, 32, },
+ { 0, 1, 0, 1, 124, 34, },
+ { 2, 1, 0, 1, 124, 32, },
+ { 1, 1, 0, 1, 124, 32, },
+ { 0, 1, 0, 1, 128, 32, },
+ { 2, 1, 0, 1, 128, 32, },
+ { 1, 1, 0, 1, 128, 32, },
+ { 0, 1, 0, 1, 132, 30, },
+ { 2, 1, 0, 1, 132, 32, },
+ { 1, 1, 0, 1, 132, 32, },
+ { 0, 1, 0, 1, 136, 30, },
+ { 2, 1, 0, 1, 136, 32, },
+ { 1, 1, 0, 1, 136, 32, },
+ { 0, 1, 0, 1, 140, 28, },
+ { 2, 1, 0, 1, 140, 32, },
+ { 1, 1, 0, 1, 140, 32, },
+ { 0, 1, 0, 1, 149, 36, },
+ { 2, 1, 0, 1, 149, 32, },
+ { 1, 1, 0, 1, 149, 63, },
+ { 0, 1, 0, 1, 153, 36, },
+ { 2, 1, 0, 1, 153, 32, },
+ { 1, 1, 0, 1, 153, 63, },
+ { 0, 1, 0, 1, 157, 36, },
+ { 2, 1, 0, 1, 157, 32, },
+ { 1, 1, 0, 1, 157, 63, },
+ { 0, 1, 0, 1, 161, 36, },
+ { 2, 1, 0, 1, 161, 32, },
+ { 1, 1, 0, 1, 161, 63, },
+ { 0, 1, 0, 1, 165, 36, },
+ { 2, 1, 0, 1, 165, 32, },
+ { 1, 1, 0, 1, 165, 63, },
+ { 0, 1, 0, 2, 36, 30, },
+ { 2, 1, 0, 2, 36, 32, },
+ { 1, 1, 0, 2, 36, 32, },
+ { 0, 1, 0, 2, 40, 30, },
+ { 2, 1, 0, 2, 40, 32, },
+ { 1, 1, 0, 2, 40, 32, },
+ { 0, 1, 0, 2, 44, 30, },
+ { 2, 1, 0, 2, 44, 32, },
+ { 1, 1, 0, 2, 44, 32, },
+ { 0, 1, 0, 2, 48, 30, },
+ { 2, 1, 0, 2, 48, 32, },
+ { 1, 1, 0, 2, 48, 32, },
+ { 0, 1, 0, 2, 52, 36, },
+ { 2, 1, 0, 2, 52, 32, },
+ { 1, 1, 0, 2, 52, 32, },
+ { 0, 1, 0, 2, 56, 34, },
+ { 2, 1, 0, 2, 56, 32, },
+ { 1, 1, 0, 2, 56, 32, },
+ { 0, 1, 0, 2, 60, 32, },
+ { 2, 1, 0, 2, 60, 32, },
+ { 1, 1, 0, 2, 60, 32, },
+ { 0, 1, 0, 2, 64, 28, },
+ { 2, 1, 0, 2, 64, 32, },
+ { 1, 1, 0, 2, 64, 32, },
+ { 0, 1, 0, 2, 100, 30, },
+ { 2, 1, 0, 2, 100, 32, },
+ { 1, 1, 0, 2, 100, 32, },
+ { 0, 1, 0, 2, 104, 30, },
+ { 2, 1, 0, 2, 104, 32, },
+ { 1, 1, 0, 2, 104, 32, },
+ { 0, 1, 0, 2, 108, 32, },
+ { 2, 1, 0, 2, 108, 32, },
+ { 1, 1, 0, 2, 108, 32, },
+ { 0, 1, 0, 2, 112, 34, },
+ { 2, 1, 0, 2, 112, 32, },
+ { 1, 1, 0, 2, 112, 32, },
+ { 0, 1, 0, 2, 116, 34, },
+ { 2, 1, 0, 2, 116, 32, },
+ { 1, 1, 0, 2, 116, 32, },
+ { 0, 1, 0, 2, 120, 36, },
+ { 2, 1, 0, 2, 120, 32, },
+ { 1, 1, 0, 2, 120, 32, },
+ { 0, 1, 0, 2, 124, 34, },
+ { 2, 1, 0, 2, 124, 32, },
+ { 1, 1, 0, 2, 124, 32, },
+ { 0, 1, 0, 2, 128, 32, },
+ { 2, 1, 0, 2, 128, 32, },
+ { 1, 1, 0, 2, 128, 32, },
+ { 0, 1, 0, 2, 132, 30, },
+ { 2, 1, 0, 2, 132, 32, },
+ { 1, 1, 0, 2, 132, 32, },
+ { 0, 1, 0, 2, 136, 30, },
+ { 2, 1, 0, 2, 136, 32, },
+ { 1, 1, 0, 2, 136, 32, },
+ { 0, 1, 0, 2, 140, 28, },
+ { 2, 1, 0, 2, 140, 32, },
+ { 1, 1, 0, 2, 140, 32, },
+ { 0, 1, 0, 2, 149, 36, },
+ { 2, 1, 0, 2, 149, 32, },
+ { 1, 1, 0, 2, 149, 63, },
+ { 0, 1, 0, 2, 153, 36, },
+ { 2, 1, 0, 2, 153, 32, },
+ { 1, 1, 0, 2, 153, 63, },
+ { 0, 1, 0, 2, 157, 36, },
+ { 2, 1, 0, 2, 157, 32, },
+ { 1, 1, 0, 2, 157, 63, },
+ { 0, 1, 0, 2, 161, 36, },
+ { 2, 1, 0, 2, 161, 32, },
+ { 1, 1, 0, 2, 161, 63, },
+ { 0, 1, 0, 2, 165, 36, },
+ { 2, 1, 0, 2, 165, 32, },
+ { 1, 1, 0, 2, 165, 63, },
+ { 0, 1, 0, 3, 36, 28, },
+ { 2, 1, 0, 3, 36, 30, },
+ { 1, 1, 0, 3, 36, 30, },
+ { 0, 1, 0, 3, 40, 28, },
+ { 2, 1, 0, 3, 40, 30, },
+ { 1, 1, 0, 3, 40, 30, },
+ { 0, 1, 0, 3, 44, 28, },
+ { 2, 1, 0, 3, 44, 30, },
+ { 1, 1, 0, 3, 44, 30, },
+ { 0, 1, 0, 3, 48, 28, },
+ { 2, 1, 0, 3, 48, 30, },
+ { 1, 1, 0, 3, 48, 30, },
+ { 0, 1, 0, 3, 52, 34, },
+ { 2, 1, 0, 3, 52, 30, },
+ { 1, 1, 0, 3, 52, 30, },
+ { 0, 1, 0, 3, 56, 32, },
+ { 2, 1, 0, 3, 56, 30, },
+ { 1, 1, 0, 3, 56, 30, },
+ { 0, 1, 0, 3, 60, 30, },
+ { 2, 1, 0, 3, 60, 30, },
+ { 1, 1, 0, 3, 60, 30, },
+ { 0, 1, 0, 3, 64, 26, },
+ { 2, 1, 0, 3, 64, 30, },
+ { 1, 1, 0, 3, 64, 30, },
+ { 0, 1, 0, 3, 100, 28, },
+ { 2, 1, 0, 3, 100, 30, },
+ { 1, 1, 0, 3, 100, 30, },
+ { 0, 1, 0, 3, 104, 28, },
+ { 2, 1, 0, 3, 104, 30, },
+ { 1, 1, 0, 3, 104, 30, },
+ { 0, 1, 0, 3, 108, 30, },
+ { 2, 1, 0, 3, 108, 30, },
+ { 1, 1, 0, 3, 108, 30, },
+ { 0, 1, 0, 3, 112, 32, },
+ { 2, 1, 0, 3, 112, 30, },
+ { 1, 1, 0, 3, 112, 30, },
+ { 0, 1, 0, 3, 116, 32, },
+ { 2, 1, 0, 3, 116, 30, },
+ { 1, 1, 0, 3, 116, 30, },
+ { 0, 1, 0, 3, 120, 34, },
+ { 2, 1, 0, 3, 120, 30, },
+ { 1, 1, 0, 3, 120, 30, },
+ { 0, 1, 0, 3, 124, 32, },
+ { 2, 1, 0, 3, 124, 30, },
+ { 1, 1, 0, 3, 124, 30, },
+ { 0, 1, 0, 3, 128, 30, },
+ { 2, 1, 0, 3, 128, 30, },
+ { 1, 1, 0, 3, 128, 30, },
+ { 0, 1, 0, 3, 132, 28, },
+ { 2, 1, 0, 3, 132, 30, },
+ { 1, 1, 0, 3, 132, 30, },
+ { 0, 1, 0, 3, 136, 28, },
+ { 2, 1, 0, 3, 136, 30, },
+ { 1, 1, 0, 3, 136, 30, },
+ { 0, 1, 0, 3, 140, 26, },
+ { 2, 1, 0, 3, 140, 30, },
+ { 1, 1, 0, 3, 140, 30, },
+ { 0, 1, 0, 3, 149, 34, },
+ { 2, 1, 0, 3, 149, 30, },
+ { 1, 1, 0, 3, 149, 63, },
+ { 0, 1, 0, 3, 153, 34, },
+ { 2, 1, 0, 3, 153, 30, },
+ { 1, 1, 0, 3, 153, 63, },
+ { 0, 1, 0, 3, 157, 34, },
+ { 2, 1, 0, 3, 157, 30, },
+ { 1, 1, 0, 3, 157, 63, },
+ { 0, 1, 0, 3, 161, 34, },
+ { 2, 1, 0, 3, 161, 30, },
+ { 1, 1, 0, 3, 161, 63, },
+ { 0, 1, 0, 3, 165, 34, },
+ { 2, 1, 0, 3, 165, 30, },
+ { 1, 1, 0, 3, 165, 63, },
+ { 0, 1, 0, 6, 36, 26, },
+ { 2, 1, 0, 6, 36, 28, },
+ { 1, 1, 0, 6, 36, 28, },
+ { 0, 1, 0, 6, 40, 26, },
+ { 2, 1, 0, 6, 40, 28, },
+ { 1, 1, 0, 6, 40, 28, },
+ { 0, 1, 0, 6, 44, 26, },
+ { 2, 1, 0, 6, 44, 28, },
+ { 1, 1, 0, 6, 44, 28, },
+ { 0, 1, 0, 6, 48, 26, },
+ { 2, 1, 0, 6, 48, 28, },
+ { 1, 1, 0, 6, 48, 28, },
+ { 0, 1, 0, 6, 52, 32, },
+ { 2, 1, 0, 6, 52, 28, },
+ { 1, 1, 0, 6, 52, 28, },
+ { 0, 1, 0, 6, 56, 30, },
+ { 2, 1, 0, 6, 56, 28, },
+ { 1, 1, 0, 6, 56, 28, },
+ { 0, 1, 0, 6, 60, 28, },
+ { 2, 1, 0, 6, 60, 28, },
+ { 1, 1, 0, 6, 60, 28, },
+ { 0, 1, 0, 6, 64, 24, },
+ { 2, 1, 0, 6, 64, 28, },
+ { 1, 1, 0, 6, 64, 28, },
+ { 0, 1, 0, 6, 100, 26, },
+ { 2, 1, 0, 6, 100, 28, },
+ { 1, 1, 0, 6, 100, 28, },
+ { 0, 1, 0, 6, 104, 26, },
+ { 2, 1, 0, 6, 104, 28, },
+ { 1, 1, 0, 6, 104, 28, },
+ { 0, 1, 0, 6, 108, 28, },
+ { 2, 1, 0, 6, 108, 28, },
+ { 1, 1, 0, 6, 108, 28, },
+ { 0, 1, 0, 6, 112, 30, },
+ { 2, 1, 0, 6, 112, 28, },
+ { 1, 1, 0, 6, 112, 28, },
+ { 0, 1, 0, 6, 116, 30, },
+ { 2, 1, 0, 6, 116, 28, },
+ { 1, 1, 0, 6, 116, 28, },
+ { 0, 1, 0, 6, 120, 32, },
+ { 2, 1, 0, 6, 120, 28, },
+ { 1, 1, 0, 6, 120, 28, },
+ { 0, 1, 0, 6, 124, 30, },
+ { 2, 1, 0, 6, 124, 28, },
+ { 1, 1, 0, 6, 124, 28, },
+ { 0, 1, 0, 6, 128, 28, },
+ { 2, 1, 0, 6, 128, 28, },
+ { 1, 1, 0, 6, 128, 28, },
+ { 0, 1, 0, 6, 132, 26, },
+ { 2, 1, 0, 6, 132, 28, },
+ { 1, 1, 0, 6, 132, 28, },
+ { 0, 1, 0, 6, 136, 26, },
+ { 2, 1, 0, 6, 136, 28, },
+ { 1, 1, 0, 6, 136, 28, },
+ { 0, 1, 0, 6, 140, 24, },
+ { 2, 1, 0, 6, 140, 28, },
+ { 1, 1, 0, 6, 140, 28, },
+ { 0, 1, 0, 6, 149, 32, },
+ { 2, 1, 0, 6, 149, 28, },
+ { 1, 1, 0, 6, 149, 63, },
+ { 0, 1, 0, 6, 153, 32, },
+ { 2, 1, 0, 6, 153, 28, },
+ { 1, 1, 0, 6, 153, 63, },
+ { 0, 1, 0, 6, 157, 32, },
+ { 2, 1, 0, 6, 157, 28, },
+ { 1, 1, 0, 6, 157, 63, },
+ { 0, 1, 0, 6, 161, 32, },
+ { 2, 1, 0, 6, 161, 28, },
+ { 1, 1, 0, 6, 161, 63, },
+ { 0, 1, 0, 6, 165, 32, },
+ { 2, 1, 0, 6, 165, 28, },
+ { 1, 1, 0, 6, 165, 63, },
+ { 0, 1, 0, 7, 36, 24, },
+ { 2, 1, 0, 7, 36, 26, },
+ { 1, 1, 0, 7, 36, 26, },
+ { 0, 1, 0, 7, 40, 24, },
+ { 2, 1, 0, 7, 40, 26, },
+ { 1, 1, 0, 7, 40, 26, },
+ { 0, 1, 0, 7, 44, 24, },
+ { 2, 1, 0, 7, 44, 26, },
+ { 1, 1, 0, 7, 44, 26, },
+ { 0, 1, 0, 7, 48, 24, },
+ { 2, 1, 0, 7, 48, 26, },
+ { 1, 1, 0, 7, 48, 26, },
+ { 0, 1, 0, 7, 52, 30, },
+ { 2, 1, 0, 7, 52, 26, },
+ { 1, 1, 0, 7, 52, 26, },
+ { 0, 1, 0, 7, 56, 28, },
+ { 2, 1, 0, 7, 56, 26, },
+ { 1, 1, 0, 7, 56, 26, },
+ { 0, 1, 0, 7, 60, 26, },
+ { 2, 1, 0, 7, 60, 26, },
+ { 1, 1, 0, 7, 60, 26, },
+ { 0, 1, 0, 7, 64, 22, },
+ { 2, 1, 0, 7, 64, 26, },
+ { 1, 1, 0, 7, 64, 26, },
+ { 0, 1, 0, 7, 100, 24, },
+ { 2, 1, 0, 7, 100, 26, },
+ { 1, 1, 0, 7, 100, 26, },
+ { 0, 1, 0, 7, 104, 24, },
+ { 2, 1, 0, 7, 104, 26, },
+ { 1, 1, 0, 7, 104, 26, },
+ { 0, 1, 0, 7, 108, 26, },
+ { 2, 1, 0, 7, 108, 26, },
+ { 1, 1, 0, 7, 108, 26, },
+ { 0, 1, 0, 7, 112, 28, },
+ { 2, 1, 0, 7, 112, 26, },
+ { 1, 1, 0, 7, 112, 26, },
+ { 0, 1, 0, 7, 116, 28, },
+ { 2, 1, 0, 7, 116, 26, },
+ { 1, 1, 0, 7, 116, 26, },
+ { 0, 1, 0, 7, 120, 30, },
+ { 2, 1, 0, 7, 120, 26, },
+ { 1, 1, 0, 7, 120, 26, },
+ { 0, 1, 0, 7, 124, 28, },
+ { 2, 1, 0, 7, 124, 26, },
+ { 1, 1, 0, 7, 124, 26, },
+ { 0, 1, 0, 7, 128, 26, },
+ { 2, 1, 0, 7, 128, 26, },
+ { 1, 1, 0, 7, 128, 26, },
+ { 0, 1, 0, 7, 132, 24, },
+ { 2, 1, 0, 7, 132, 26, },
+ { 1, 1, 0, 7, 132, 26, },
+ { 0, 1, 0, 7, 136, 24, },
+ { 2, 1, 0, 7, 136, 26, },
+ { 1, 1, 0, 7, 136, 26, },
+ { 0, 1, 0, 7, 140, 22, },
+ { 2, 1, 0, 7, 140, 26, },
+ { 1, 1, 0, 7, 140, 26, },
+ { 0, 1, 0, 7, 149, 30, },
+ { 2, 1, 0, 7, 149, 26, },
+ { 1, 1, 0, 7, 149, 63, },
+ { 0, 1, 0, 7, 153, 30, },
+ { 2, 1, 0, 7, 153, 26, },
+ { 1, 1, 0, 7, 153, 63, },
+ { 0, 1, 0, 7, 157, 30, },
+ { 2, 1, 0, 7, 157, 26, },
+ { 1, 1, 0, 7, 157, 63, },
+ { 0, 1, 0, 7, 161, 30, },
+ { 2, 1, 0, 7, 161, 26, },
+ { 1, 1, 0, 7, 161, 63, },
+ { 0, 1, 0, 7, 165, 30, },
+ { 2, 1, 0, 7, 165, 26, },
+ { 1, 1, 0, 7, 165, 63, },
+ { 0, 1, 1, 2, 38, 30, },
+ { 2, 1, 1, 2, 38, 32, },
+ { 1, 1, 1, 2, 38, 32, },
+ { 0, 1, 1, 2, 46, 30, },
+ { 2, 1, 1, 2, 46, 32, },
+ { 1, 1, 1, 2, 46, 32, },
+ { 0, 1, 1, 2, 54, 32, },
+ { 2, 1, 1, 2, 54, 32, },
+ { 1, 1, 1, 2, 54, 32, },
+ { 0, 1, 1, 2, 62, 32, },
+ { 2, 1, 1, 2, 62, 32, },
+ { 1, 1, 1, 2, 62, 32, },
+ { 0, 1, 1, 2, 102, 28, },
+ { 2, 1, 1, 2, 102, 32, },
+ { 1, 1, 1, 2, 102, 32, },
+ { 0, 1, 1, 2, 110, 32, },
+ { 2, 1, 1, 2, 110, 32, },
+ { 1, 1, 1, 2, 110, 32, },
+ { 0, 1, 1, 2, 118, 36, },
+ { 2, 1, 1, 2, 118, 32, },
+ { 1, 1, 1, 2, 118, 32, },
+ { 0, 1, 1, 2, 126, 34, },
+ { 2, 1, 1, 2, 126, 32, },
+ { 1, 1, 1, 2, 126, 32, },
+ { 0, 1, 1, 2, 134, 32, },
+ { 2, 1, 1, 2, 134, 32, },
+ { 1, 1, 1, 2, 134, 32, },
+ { 0, 1, 1, 2, 151, 36, },
+ { 2, 1, 1, 2, 151, 32, },
+ { 1, 1, 1, 2, 151, 63, },
+ { 0, 1, 1, 2, 159, 36, },
+ { 2, 1, 1, 2, 159, 32, },
+ { 1, 1, 1, 2, 159, 63, },
+ { 0, 1, 1, 3, 38, 28, },
+ { 2, 1, 1, 3, 38, 30, },
+ { 1, 1, 1, 3, 38, 30, },
+ { 0, 1, 1, 3, 46, 28, },
+ { 2, 1, 1, 3, 46, 30, },
+ { 1, 1, 1, 3, 46, 30, },
+ { 0, 1, 1, 3, 54, 30, },
+ { 2, 1, 1, 3, 54, 30, },
+ { 1, 1, 1, 3, 54, 30, },
+ { 0, 1, 1, 3, 62, 30, },
+ { 2, 1, 1, 3, 62, 30, },
+ { 1, 1, 1, 3, 62, 30, },
+ { 0, 1, 1, 3, 102, 26, },
+ { 2, 1, 1, 3, 102, 30, },
+ { 1, 1, 1, 3, 102, 30, },
+ { 0, 1, 1, 3, 110, 30, },
+ { 2, 1, 1, 3, 110, 30, },
+ { 1, 1, 1, 3, 110, 30, },
+ { 0, 1, 1, 3, 118, 34, },
+ { 2, 1, 1, 3, 118, 30, },
+ { 1, 1, 1, 3, 118, 30, },
+ { 0, 1, 1, 3, 126, 32, },
+ { 2, 1, 1, 3, 126, 30, },
+ { 1, 1, 1, 3, 126, 30, },
+ { 0, 1, 1, 3, 134, 30, },
+ { 2, 1, 1, 3, 134, 30, },
+ { 1, 1, 1, 3, 134, 30, },
+ { 0, 1, 1, 3, 151, 34, },
+ { 2, 1, 1, 3, 151, 30, },
+ { 1, 1, 1, 3, 151, 63, },
+ { 0, 1, 1, 3, 159, 34, },
+ { 2, 1, 1, 3, 159, 30, },
+ { 1, 1, 1, 3, 159, 63, },
+ { 0, 1, 1, 6, 38, 26, },
+ { 2, 1, 1, 6, 38, 28, },
+ { 1, 1, 1, 6, 38, 28, },
+ { 0, 1, 1, 6, 46, 26, },
+ { 2, 1, 1, 6, 46, 28, },
+ { 1, 1, 1, 6, 46, 28, },
+ { 0, 1, 1, 6, 54, 28, },
+ { 2, 1, 1, 6, 54, 28, },
+ { 1, 1, 1, 6, 54, 28, },
+ { 0, 1, 1, 6, 62, 28, },
+ { 2, 1, 1, 6, 62, 28, },
+ { 1, 1, 1, 6, 62, 28, },
+ { 0, 1, 1, 6, 102, 24, },
+ { 2, 1, 1, 6, 102, 28, },
+ { 1, 1, 1, 6, 102, 28, },
+ { 0, 1, 1, 6, 110, 28, },
+ { 2, 1, 1, 6, 110, 28, },
+ { 1, 1, 1, 6, 110, 28, },
+ { 0, 1, 1, 6, 118, 32, },
+ { 2, 1, 1, 6, 118, 28, },
+ { 1, 1, 1, 6, 118, 28, },
+ { 0, 1, 1, 6, 126, 30, },
+ { 2, 1, 1, 6, 126, 28, },
+ { 1, 1, 1, 6, 126, 28, },
+ { 0, 1, 1, 6, 134, 28, },
+ { 2, 1, 1, 6, 134, 28, },
+ { 1, 1, 1, 6, 134, 28, },
+ { 0, 1, 1, 6, 151, 32, },
+ { 2, 1, 1, 6, 151, 28, },
+ { 1, 1, 1, 6, 151, 63, },
+ { 0, 1, 1, 6, 159, 32, },
+ { 2, 1, 1, 6, 159, 28, },
+ { 1, 1, 1, 6, 159, 63, },
+ { 0, 1, 1, 7, 38, 24, },
+ { 2, 1, 1, 7, 38, 26, },
+ { 1, 1, 1, 7, 38, 26, },
+ { 0, 1, 1, 7, 46, 24, },
+ { 2, 1, 1, 7, 46, 26, },
+ { 1, 1, 1, 7, 46, 26, },
+ { 0, 1, 1, 7, 54, 26, },
+ { 2, 1, 1, 7, 54, 26, },
+ { 1, 1, 1, 7, 54, 26, },
+ { 0, 1, 1, 7, 62, 26, },
+ { 2, 1, 1, 7, 62, 26, },
+ { 1, 1, 1, 7, 62, 26, },
+ { 0, 1, 1, 7, 102, 22, },
+ { 2, 1, 1, 7, 102, 26, },
+ { 1, 1, 1, 7, 102, 26, },
+ { 0, 1, 1, 7, 110, 26, },
+ { 2, 1, 1, 7, 110, 26, },
+ { 1, 1, 1, 7, 110, 26, },
+ { 0, 1, 1, 7, 118, 30, },
+ { 2, 1, 1, 7, 118, 26, },
+ { 1, 1, 1, 7, 118, 26, },
+ { 0, 1, 1, 7, 126, 28, },
+ { 2, 1, 1, 7, 126, 26, },
+ { 1, 1, 1, 7, 126, 26, },
+ { 0, 1, 1, 7, 134, 26, },
+ { 2, 1, 1, 7, 134, 26, },
+ { 1, 1, 1, 7, 134, 26, },
+ { 0, 1, 1, 7, 151, 30, },
+ { 2, 1, 1, 7, 151, 26, },
+ { 1, 1, 1, 7, 151, 63, },
+ { 0, 1, 1, 7, 159, 30, },
+ { 2, 1, 1, 7, 159, 26, },
+ { 1, 1, 1, 7, 159, 63, },
+ { 0, 1, 2, 4, 42, 30, },
+ { 2, 1, 2, 4, 42, 32, },
+ { 1, 1, 2, 4, 42, 32, },
+ { 0, 1, 2, 4, 58, 28, },
+ { 2, 1, 2, 4, 58, 32, },
+ { 1, 1, 2, 4, 58, 32, },
+ { 0, 1, 2, 4, 106, 30, },
+ { 2, 1, 2, 4, 106, 32, },
+ { 1, 1, 2, 4, 106, 32, },
+ { 0, 1, 2, 4, 122, 34, },
+ { 2, 1, 2, 4, 122, 32, },
+ { 1, 1, 2, 4, 122, 32, },
+ { 0, 1, 2, 4, 155, 36, },
+ { 2, 1, 2, 4, 155, 32, },
+ { 1, 1, 2, 4, 155, 63, },
+ { 0, 1, 2, 5, 42, 28, },
+ { 2, 1, 2, 5, 42, 30, },
+ { 1, 1, 2, 5, 42, 30, },
+ { 0, 1, 2, 5, 58, 26, },
+ { 2, 1, 2, 5, 58, 30, },
+ { 1, 1, 2, 5, 58, 30, },
+ { 0, 1, 2, 5, 106, 28, },
+ { 2, 1, 2, 5, 106, 30, },
+ { 1, 1, 2, 5, 106, 30, },
+ { 0, 1, 2, 5, 122, 32, },
+ { 2, 1, 2, 5, 122, 30, },
+ { 1, 1, 2, 5, 122, 30, },
+ { 0, 1, 2, 5, 155, 34, },
+ { 2, 1, 2, 5, 155, 30, },
+ { 1, 1, 2, 5, 155, 63, },
+ { 0, 1, 2, 8, 42, 26, },
+ { 2, 1, 2, 8, 42, 28, },
+ { 1, 1, 2, 8, 42, 28, },
+ { 0, 1, 2, 8, 58, 24, },
+ { 2, 1, 2, 8, 58, 28, },
+ { 1, 1, 2, 8, 58, 28, },
+ { 0, 1, 2, 8, 106, 26, },
+ { 2, 1, 2, 8, 106, 28, },
+ { 1, 1, 2, 8, 106, 28, },
+ { 0, 1, 2, 8, 122, 30, },
+ { 2, 1, 2, 8, 122, 28, },
+ { 1, 1, 2, 8, 122, 28, },
+ { 0, 1, 2, 8, 155, 32, },
+ { 2, 1, 2, 8, 155, 28, },
+ { 1, 1, 2, 8, 155, 63, },
+ { 0, 1, 2, 9, 42, 24, },
+ { 2, 1, 2, 9, 42, 26, },
+ { 1, 1, 2, 9, 42, 26, },
+ { 0, 1, 2, 9, 58, 22, },
+ { 2, 1, 2, 9, 58, 26, },
+ { 1, 1, 2, 9, 58, 26, },
+ { 0, 1, 2, 9, 106, 24, },
+ { 2, 1, 2, 9, 106, 26, },
+ { 1, 1, 2, 9, 106, 26, },
+ { 0, 1, 2, 9, 122, 28, },
+ { 2, 1, 2, 9, 122, 26, },
+ { 1, 1, 2, 9, 122, 26, },
+ { 0, 1, 2, 9, 155, 30, },
+ { 2, 1, 2, 9, 155, 26, },
+ { 1, 1, 2, 9, 155, 63, },
+};
+
+RTW_DECL_TABLE_TXPWR_LMT(rtw8814a_txpwr_lmt);
+
+static const struct rtw_txpwr_lmt_cfg_pair rtw8814a_txpwr_lmt_type0[] = {
+ { 0, 0, 0, 0, 1, 32, },
+ { 2, 0, 0, 0, 1, 32, },
+ { 1, 0, 0, 0, 1, 32, },
+ { 0, 0, 0, 0, 2, 32, },
+ { 2, 0, 0, 0, 2, 32, },
+ { 1, 0, 0, 0, 2, 32, },
+ { 0, 0, 0, 0, 3, 32, },
+ { 2, 0, 0, 0, 3, 32, },
+ { 1, 0, 0, 0, 3, 32, },
+ { 0, 0, 0, 0, 4, 32, },
+ { 2, 0, 0, 0, 4, 32, },
+ { 1, 0, 0, 0, 4, 32, },
+ { 0, 0, 0, 0, 5, 32, },
+ { 2, 0, 0, 0, 5, 32, },
+ { 1, 0, 0, 0, 5, 32, },
+ { 0, 0, 0, 0, 6, 32, },
+ { 2, 0, 0, 0, 6, 32, },
+ { 1, 0, 0, 0, 6, 32, },
+ { 0, 0, 0, 0, 7, 32, },
+ { 2, 0, 0, 0, 7, 32, },
+ { 1, 0, 0, 0, 7, 32, },
+ { 0, 0, 0, 0, 8, 32, },
+ { 2, 0, 0, 0, 8, 32, },
+ { 1, 0, 0, 0, 8, 32, },
+ { 0, 0, 0, 0, 9, 32, },
+ { 2, 0, 0, 0, 9, 32, },
+ { 1, 0, 0, 0, 9, 32, },
+ { 0, 0, 0, 0, 10, 32, },
+ { 2, 0, 0, 0, 10, 32, },
+ { 1, 0, 0, 0, 10, 32, },
+ { 0, 0, 0, 0, 11, 32, },
+ { 2, 0, 0, 0, 11, 32, },
+ { 1, 0, 0, 0, 11, 32, },
+ { 0, 0, 0, 0, 12, 24, },
+ { 2, 0, 0, 0, 12, 32, },
+ { 1, 0, 0, 0, 12, 32, },
+ { 0, 0, 0, 0, 13, 16, },
+ { 2, 0, 0, 0, 13, 32, },
+ { 1, 0, 0, 0, 13, 32, },
+ { 0, 0, 0, 0, 14, 63, },
+ { 2, 0, 0, 0, 14, 63, },
+ { 1, 0, 0, 0, 14, 32, },
+ { 0, 0, 0, 1, 1, 28, },
+ { 2, 0, 0, 1, 1, 32, },
+ { 1, 0, 0, 1, 1, 32, },
+ { 0, 0, 0, 1, 2, 32, },
+ { 2, 0, 0, 1, 2, 32, },
+ { 1, 0, 0, 1, 2, 32, },
+ { 0, 0, 0, 1, 3, 32, },
+ { 2, 0, 0, 1, 3, 32, },
+ { 1, 0, 0, 1, 3, 32, },
+ { 0, 0, 0, 1, 4, 32, },
+ { 2, 0, 0, 1, 4, 32, },
+ { 1, 0, 0, 1, 4, 32, },
+ { 0, 0, 0, 1, 5, 32, },
+ { 2, 0, 0, 1, 5, 32, },
+ { 1, 0, 0, 1, 5, 32, },
+ { 0, 0, 0, 1, 6, 32, },
+ { 2, 0, 0, 1, 6, 32, },
+ { 1, 0, 0, 1, 6, 32, },
+ { 0, 0, 0, 1, 7, 32, },
+ { 2, 0, 0, 1, 7, 32, },
+ { 1, 0, 0, 1, 7, 32, },
+ { 0, 0, 0, 1, 8, 32, },
+ { 2, 0, 0, 1, 8, 32, },
+ { 1, 0, 0, 1, 8, 32, },
+ { 0, 0, 0, 1, 9, 32, },
+ { 2, 0, 0, 1, 9, 32, },
+ { 1, 0, 0, 1, 9, 32, },
+ { 0, 0, 0, 1, 10, 32, },
+ { 2, 0, 0, 1, 10, 32, },
+ { 1, 0, 0, 1, 10, 32, },
+ { 0, 0, 0, 1, 11, 28, },
+ { 2, 0, 0, 1, 11, 32, },
+ { 1, 0, 0, 1, 11, 32, },
+ { 0, 0, 0, 1, 12, 18, },
+ { 2, 0, 0, 1, 12, 32, },
+ { 1, 0, 0, 1, 12, 32, },
+ { 0, 0, 0, 1, 13, 8, },
+ { 2, 0, 0, 1, 13, 32, },
+ { 1, 0, 0, 1, 13, 32, },
+ { 0, 0, 0, 1, 14, 63, },
+ { 2, 0, 0, 1, 14, 63, },
+ { 1, 0, 0, 1, 14, 63, },
+ { 0, 0, 0, 2, 1, 26, },
+ { 2, 0, 0, 2, 1, 32, },
+ { 1, 0, 0, 2, 1, 32, },
+ { 0, 0, 0, 2, 2, 32, },
+ { 2, 0, 0, 2, 2, 32, },
+ { 1, 0, 0, 2, 2, 32, },
+ { 0, 0, 0, 2, 3, 32, },
+ { 2, 0, 0, 2, 3, 32, },
+ { 1, 0, 0, 2, 3, 32, },
+ { 0, 0, 0, 2, 4, 32, },
+ { 2, 0, 0, 2, 4, 32, },
+ { 1, 0, 0, 2, 4, 32, },
+ { 0, 0, 0, 2, 5, 32, },
+ { 2, 0, 0, 2, 5, 32, },
+ { 1, 0, 0, 2, 5, 32, },
+ { 0, 0, 0, 2, 6, 32, },
+ { 2, 0, 0, 2, 6, 32, },
+ { 1, 0, 0, 2, 6, 32, },
+ { 0, 0, 0, 2, 7, 32, },
+ { 2, 0, 0, 2, 7, 32, },
+ { 1, 0, 0, 2, 7, 32, },
+ { 0, 0, 0, 2, 8, 32, },
+ { 2, 0, 0, 2, 8, 32, },
+ { 1, 0, 0, 2, 8, 32, },
+ { 0, 0, 0, 2, 9, 32, },
+ { 2, 0, 0, 2, 9, 32, },
+ { 1, 0, 0, 2, 9, 32, },
+ { 0, 0, 0, 2, 10, 32, },
+ { 2, 0, 0, 2, 10, 32, },
+ { 1, 0, 0, 2, 10, 32, },
+ { 0, 0, 0, 2, 11, 26, },
+ { 2, 0, 0, 2, 11, 32, },
+ { 1, 0, 0, 2, 11, 32, },
+ { 0, 0, 0, 2, 12, 16, },
+ { 2, 0, 0, 2, 12, 32, },
+ { 1, 0, 0, 2, 12, 32, },
+ { 0, 0, 0, 2, 13, 6, },
+ { 2, 0, 0, 2, 13, 32, },
+ { 1, 0, 0, 2, 13, 32, },
+ { 0, 0, 0, 2, 14, 63, },
+ { 2, 0, 0, 2, 14, 63, },
+ { 1, 0, 0, 2, 14, 63, },
+ { 0, 0, 0, 3, 1, 24, },
+ { 2, 0, 0, 3, 1, 30, },
+ { 1, 0, 0, 3, 1, 30, },
+ { 0, 0, 0, 3, 2, 30, },
+ { 2, 0, 0, 3, 2, 30, },
+ { 1, 0, 0, 3, 2, 30, },
+ { 0, 0, 0, 3, 3, 30, },
+ { 2, 0, 0, 3, 3, 30, },
+ { 1, 0, 0, 3, 3, 30, },
+ { 0, 0, 0, 3, 4, 30, },
+ { 2, 0, 0, 3, 4, 30, },
+ { 1, 0, 0, 3, 4, 30, },
+ { 0, 0, 0, 3, 5, 30, },
+ { 2, 0, 0, 3, 5, 30, },
+ { 1, 0, 0, 3, 5, 30, },
+ { 0, 0, 0, 3, 6, 30, },
+ { 2, 0, 0, 3, 6, 30, },
+ { 1, 0, 0, 3, 6, 30, },
+ { 0, 0, 0, 3, 7, 30, },
+ { 2, 0, 0, 3, 7, 30, },
+ { 1, 0, 0, 3, 7, 30, },
+ { 0, 0, 0, 3, 8, 30, },
+ { 2, 0, 0, 3, 8, 30, },
+ { 1, 0, 0, 3, 8, 30, },
+ { 0, 0, 0, 3, 9, 30, },
+ { 2, 0, 0, 3, 9, 30, },
+ { 1, 0, 0, 3, 9, 30, },
+ { 0, 0, 0, 3, 10, 30, },
+ { 2, 0, 0, 3, 10, 30, },
+ { 1, 0, 0, 3, 10, 30, },
+ { 0, 0, 0, 3, 11, 24, },
+ { 2, 0, 0, 3, 11, 30, },
+ { 1, 0, 0, 3, 11, 30, },
+ { 0, 0, 0, 3, 12, 14, },
+ { 2, 0, 0, 3, 12, 30, },
+ { 1, 0, 0, 3, 12, 30, },
+ { 0, 0, 0, 3, 13, 4, },
+ { 2, 0, 0, 3, 13, 30, },
+ { 1, 0, 0, 3, 13, 30, },
+ { 0, 0, 0, 3, 14, 63, },
+ { 2, 0, 0, 3, 14, 63, },
+ { 1, 0, 0, 3, 14, 63, },
+ { 0, 0, 0, 6, 1, 22, },
+ { 2, 0, 0, 6, 1, 28, },
+ { 1, 0, 0, 6, 1, 28, },
+ { 0, 0, 0, 6, 2, 28, },
+ { 2, 0, 0, 6, 2, 28, },
+ { 1, 0, 0, 6, 2, 28, },
+ { 0, 0, 0, 6, 3, 28, },
+ { 2, 0, 0, 6, 3, 28, },
+ { 1, 0, 0, 6, 3, 28, },
+ { 0, 0, 0, 6, 4, 28, },
+ { 2, 0, 0, 6, 4, 28, },
+ { 1, 0, 0, 6, 4, 28, },
+ { 0, 0, 0, 6, 5, 28, },
+ { 2, 0, 0, 6, 5, 28, },
+ { 1, 0, 0, 6, 5, 28, },
+ { 0, 0, 0, 6, 6, 28, },
+ { 2, 0, 0, 6, 6, 28, },
+ { 1, 0, 0, 6, 6, 28, },
+ { 0, 0, 0, 6, 7, 28, },
+ { 2, 0, 0, 6, 7, 28, },
+ { 1, 0, 0, 6, 7, 28, },
+ { 0, 0, 0, 6, 8, 28, },
+ { 2, 0, 0, 6, 8, 28, },
+ { 1, 0, 0, 6, 8, 28, },
+ { 0, 0, 0, 6, 9, 28, },
+ { 2, 0, 0, 6, 9, 28, },
+ { 1, 0, 0, 6, 9, 28, },
+ { 0, 0, 0, 6, 10, 28, },
+ { 2, 0, 0, 6, 10, 28, },
+ { 1, 0, 0, 6, 10, 28, },
+ { 0, 0, 0, 6, 11, 22, },
+ { 2, 0, 0, 6, 11, 28, },
+ { 1, 0, 0, 6, 11, 28, },
+ { 0, 0, 0, 6, 12, 14, },
+ { 2, 0, 0, 6, 12, 28, },
+ { 1, 0, 0, 6, 12, 28, },
+ { 0, 0, 0, 6, 13, 4, },
+ { 2, 0, 0, 6, 13, 28, },
+ { 1, 0, 0, 6, 13, 28, },
+ { 0, 0, 0, 6, 14, 63, },
+ { 2, 0, 0, 6, 14, 63, },
+ { 1, 0, 0, 6, 14, 63, },
+ { 0, 0, 0, 7, 1, 20, },
+ { 2, 0, 0, 7, 1, 26, },
+ { 1, 0, 0, 7, 1, 26, },
+ { 0, 0, 0, 7, 2, 26, },
+ { 2, 0, 0, 7, 2, 26, },
+ { 1, 0, 0, 7, 2, 26, },
+ { 0, 0, 0, 7, 3, 26, },
+ { 2, 0, 0, 7, 3, 26, },
+ { 1, 0, 0, 7, 3, 26, },
+ { 0, 0, 0, 7, 4, 26, },
+ { 2, 0, 0, 7, 4, 26, },
+ { 1, 0, 0, 7, 4, 26, },
+ { 0, 0, 0, 7, 5, 26, },
+ { 2, 0, 0, 7, 5, 26, },
+ { 1, 0, 0, 7, 5, 26, },
+ { 0, 0, 0, 7, 6, 26, },
+ { 2, 0, 0, 7, 6, 26, },
+ { 1, 0, 0, 7, 6, 26, },
+ { 0, 0, 0, 7, 7, 26, },
+ { 2, 0, 0, 7, 7, 26, },
+ { 1, 0, 0, 7, 7, 26, },
+ { 0, 0, 0, 7, 8, 26, },
+ { 2, 0, 0, 7, 8, 26, },
+ { 1, 0, 0, 7, 8, 26, },
+ { 0, 0, 0, 7, 9, 26, },
+ { 2, 0, 0, 7, 9, 26, },
+ { 1, 0, 0, 7, 9, 26, },
+ { 0, 0, 0, 7, 10, 26, },
+ { 2, 0, 0, 7, 10, 26, },
+ { 1, 0, 0, 7, 10, 26, },
+ { 0, 0, 0, 7, 11, 20, },
+ { 2, 0, 0, 7, 11, 26, },
+ { 1, 0, 0, 7, 11, 26, },
+ { 0, 0, 0, 7, 12, 14, },
+ { 2, 0, 0, 7, 12, 26, },
+ { 1, 0, 0, 7, 12, 26, },
+ { 0, 0, 0, 7, 13, 4, },
+ { 2, 0, 0, 7, 13, 26, },
+ { 1, 0, 0, 7, 13, 26, },
+ { 0, 0, 0, 7, 14, 63, },
+ { 2, 0, 0, 7, 14, 63, },
+ { 1, 0, 0, 7, 14, 63, },
+ { 0, 0, 1, 2, 1, 63, },
+ { 2, 0, 1, 2, 1, 63, },
+ { 1, 0, 1, 2, 1, 63, },
+ { 0, 0, 1, 2, 2, 63, },
+ { 2, 0, 1, 2, 2, 63, },
+ { 1, 0, 1, 2, 2, 63, },
+ { 0, 0, 1, 2, 3, 26, },
+ { 2, 0, 1, 2, 3, 32, },
+ { 1, 0, 1, 2, 3, 32, },
+ { 0, 0, 1, 2, 4, 32, },
+ { 2, 0, 1, 2, 4, 32, },
+ { 1, 0, 1, 2, 4, 32, },
+ { 0, 0, 1, 2, 5, 32, },
+ { 2, 0, 1, 2, 5, 32, },
+ { 1, 0, 1, 2, 5, 32, },
+ { 0, 0, 1, 2, 6, 32, },
+ { 2, 0, 1, 2, 6, 32, },
+ { 1, 0, 1, 2, 6, 32, },
+ { 0, 0, 1, 2, 7, 32, },
+ { 2, 0, 1, 2, 7, 32, },
+ { 1, 0, 1, 2, 7, 32, },
+ { 0, 0, 1, 2, 8, 32, },
+ { 2, 0, 1, 2, 8, 32, },
+ { 1, 0, 1, 2, 8, 32, },
+ { 0, 0, 1, 2, 9, 32, },
+ { 2, 0, 1, 2, 9, 32, },
+ { 1, 0, 1, 2, 9, 32, },
+ { 0, 0, 1, 2, 10, 32, },
+ { 2, 0, 1, 2, 10, 32, },
+ { 1, 0, 1, 2, 10, 32, },
+ { 0, 0, 1, 2, 11, 26, },
+ { 2, 0, 1, 2, 11, 32, },
+ { 1, 0, 1, 2, 11, 32, },
+ { 0, 0, 1, 2, 12, 16, },
+ { 2, 0, 1, 2, 12, 32, },
+ { 1, 0, 1, 2, 12, 32, },
+ { 0, 0, 1, 2, 13, 10, },
+ { 2, 0, 1, 2, 13, 32, },
+ { 1, 0, 1, 2, 13, 32, },
+ { 0, 0, 1, 2, 14, 63, },
+ { 2, 0, 1, 2, 14, 63, },
+ { 1, 0, 1, 2, 14, 63, },
+ { 0, 0, 1, 3, 1, 63, },
+ { 2, 0, 1, 3, 1, 63, },
+ { 1, 0, 1, 3, 1, 63, },
+ { 0, 0, 1, 3, 2, 63, },
+ { 2, 0, 1, 3, 2, 63, },
+ { 1, 0, 1, 3, 2, 63, },
+ { 0, 0, 1, 3, 3, 24, },
+ { 2, 0, 1, 3, 3, 30, },
+ { 1, 0, 1, 3, 3, 30, },
+ { 0, 0, 1, 3, 4, 30, },
+ { 2, 0, 1, 3, 4, 30, },
+ { 1, 0, 1, 3, 4, 30, },
+ { 0, 0, 1, 3, 5, 30, },
+ { 2, 0, 1, 3, 5, 30, },
+ { 1, 0, 1, 3, 5, 30, },
+ { 0, 0, 1, 3, 6, 30, },
+ { 2, 0, 1, 3, 6, 30, },
+ { 1, 0, 1, 3, 6, 30, },
+ { 0, 0, 1, 3, 7, 30, },
+ { 2, 0, 1, 3, 7, 30, },
+ { 1, 0, 1, 3, 7, 30, },
+ { 0, 0, 1, 3, 8, 30, },
+ { 2, 0, 1, 3, 8, 30, },
+ { 1, 0, 1, 3, 8, 30, },
+ { 0, 0, 1, 3, 9, 30, },
+ { 2, 0, 1, 3, 9, 30, },
+ { 1, 0, 1, 3, 9, 30, },
+ { 0, 0, 1, 3, 10, 30, },
+ { 2, 0, 1, 3, 10, 30, },
+ { 1, 0, 1, 3, 10, 30, },
+ { 0, 0, 1, 3, 11, 24, },
+ { 2, 0, 1, 3, 11, 30, },
+ { 1, 0, 1, 3, 11, 30, },
+ { 0, 0, 1, 3, 12, 14, },
+ { 2, 0, 1, 3, 12, 30, },
+ { 1, 0, 1, 3, 12, 30, },
+ { 0, 0, 1, 3, 13, 8, },
+ { 2, 0, 1, 3, 13, 30, },
+ { 1, 0, 1, 3, 13, 30, },
+ { 0, 0, 1, 3, 14, 63, },
+ { 2, 0, 1, 3, 14, 63, },
+ { 1, 0, 1, 3, 14, 63, },
+ { 0, 0, 1, 6, 1, 63, },
+ { 2, 0, 1, 6, 1, 63, },
+ { 1, 0, 1, 6, 1, 63, },
+ { 0, 0, 1, 6, 2, 63, },
+ { 2, 0, 1, 6, 2, 63, },
+ { 1, 0, 1, 6, 2, 63, },
+ { 0, 0, 1, 6, 3, 22, },
+ { 2, 0, 1, 6, 3, 28, },
+ { 1, 0, 1, 6, 3, 28, },
+ { 0, 0, 1, 6, 4, 28, },
+ { 2, 0, 1, 6, 4, 28, },
+ { 1, 0, 1, 6, 4, 28, },
+ { 0, 0, 1, 6, 5, 28, },
+ { 2, 0, 1, 6, 5, 28, },
+ { 1, 0, 1, 6, 5, 28, },
+ { 0, 0, 1, 6, 6, 28, },
+ { 2, 0, 1, 6, 6, 28, },
+ { 1, 0, 1, 6, 6, 28, },
+ { 0, 0, 1, 6, 7, 28, },
+ { 2, 0, 1, 6, 7, 28, },
+ { 1, 0, 1, 6, 7, 28, },
+ { 0, 0, 1, 6, 8, 28, },
+ { 2, 0, 1, 6, 8, 28, },
+ { 1, 0, 1, 6, 8, 28, },
+ { 0, 0, 1, 6, 9, 28, },
+ { 2, 0, 1, 6, 9, 28, },
+ { 1, 0, 1, 6, 9, 28, },
+ { 0, 0, 1, 6, 10, 28, },
+ { 2, 0, 1, 6, 10, 28, },
+ { 1, 0, 1, 6, 10, 28, },
+ { 0, 0, 1, 6, 11, 22, },
+ { 2, 0, 1, 6, 11, 28, },
+ { 1, 0, 1, 6, 11, 28, },
+ { 0, 0, 1, 6, 12, 14, },
+ { 2, 0, 1, 6, 12, 28, },
+ { 1, 0, 1, 6, 12, 28, },
+ { 0, 0, 1, 6, 13, 8, },
+ { 2, 0, 1, 6, 13, 28, },
+ { 1, 0, 1, 6, 13, 28, },
+ { 0, 0, 1, 6, 14, 63, },
+ { 2, 0, 1, 6, 14, 63, },
+ { 1, 0, 1, 6, 14, 63, },
+ { 0, 0, 1, 7, 1, 63, },
+ { 2, 0, 1, 7, 1, 63, },
+ { 1, 0, 1, 7, 1, 63, },
+ { 0, 0, 1, 7, 2, 63, },
+ { 2, 0, 1, 7, 2, 63, },
+ { 1, 0, 1, 7, 2, 63, },
+ { 0, 0, 1, 7, 3, 20, },
+ { 2, 0, 1, 7, 3, 26, },
+ { 1, 0, 1, 7, 3, 26, },
+ { 0, 0, 1, 7, 4, 26, },
+ { 2, 0, 1, 7, 4, 26, },
+ { 1, 0, 1, 7, 4, 26, },
+ { 0, 0, 1, 7, 5, 26, },
+ { 2, 0, 1, 7, 5, 26, },
+ { 1, 0, 1, 7, 5, 26, },
+ { 0, 0, 1, 7, 6, 26, },
+ { 2, 0, 1, 7, 6, 26, },
+ { 1, 0, 1, 7, 6, 26, },
+ { 0, 0, 1, 7, 7, 26, },
+ { 2, 0, 1, 7, 7, 26, },
+ { 1, 0, 1, 7, 7, 26, },
+ { 0, 0, 1, 7, 8, 26, },
+ { 2, 0, 1, 7, 8, 26, },
+ { 1, 0, 1, 7, 8, 26, },
+ { 0, 0, 1, 7, 9, 26, },
+ { 2, 0, 1, 7, 9, 26, },
+ { 1, 0, 1, 7, 9, 26, },
+ { 0, 0, 1, 7, 10, 26, },
+ { 2, 0, 1, 7, 10, 26, },
+ { 1, 0, 1, 7, 10, 26, },
+ { 0, 0, 1, 7, 11, 20, },
+ { 2, 0, 1, 7, 11, 26, },
+ { 1, 0, 1, 7, 11, 26, },
+ { 0, 0, 1, 7, 12, 14, },
+ { 2, 0, 1, 7, 12, 26, },
+ { 1, 0, 1, 7, 12, 26, },
+ { 0, 0, 1, 7, 13, 8, },
+ { 2, 0, 1, 7, 13, 26, },
+ { 1, 0, 1, 7, 13, 26, },
+ { 0, 0, 1, 7, 14, 63, },
+ { 2, 0, 1, 7, 14, 63, },
+ { 1, 0, 1, 7, 14, 63, },
+ { 0, 1, 0, 1, 36, 28, },
+ { 2, 1, 0, 1, 36, 32, },
+ { 1, 1, 0, 1, 36, 32, },
+ { 0, 1, 0, 1, 40, 32, },
+ { 2, 1, 0, 1, 40, 32, },
+ { 1, 1, 0, 1, 40, 32, },
+ { 0, 1, 0, 1, 44, 32, },
+ { 2, 1, 0, 1, 44, 32, },
+ { 1, 1, 0, 1, 44, 32, },
+ { 0, 1, 0, 1, 48, 32, },
+ { 2, 1, 0, 1, 48, 32, },
+ { 1, 1, 0, 1, 48, 32, },
+ { 0, 1, 0, 1, 52, 32, },
+ { 2, 1, 0, 1, 52, 32, },
+ { 1, 1, 0, 1, 52, 32, },
+ { 0, 1, 0, 1, 56, 32, },
+ { 2, 1, 0, 1, 56, 32, },
+ { 1, 1, 0, 1, 56, 32, },
+ { 0, 1, 0, 1, 60, 32, },
+ { 2, 1, 0, 1, 60, 32, },
+ { 1, 1, 0, 1, 60, 32, },
+ { 0, 1, 0, 1, 64, 28, },
+ { 2, 1, 0, 1, 64, 32, },
+ { 1, 1, 0, 1, 64, 32, },
+ { 0, 1, 0, 1, 100, 28, },
+ { 2, 1, 0, 1, 100, 32, },
+ { 1, 1, 0, 1, 100, 32, },
+ { 0, 1, 0, 1, 104, 32, },
+ { 2, 1, 0, 1, 104, 32, },
+ { 1, 1, 0, 1, 104, 32, },
+ { 0, 1, 0, 1, 108, 32, },
+ { 2, 1, 0, 1, 108, 32, },
+ { 1, 1, 0, 1, 108, 32, },
+ { 0, 1, 0, 1, 112, 32, },
+ { 2, 1, 0, 1, 112, 32, },
+ { 1, 1, 0, 1, 112, 32, },
+ { 0, 1, 0, 1, 116, 32, },
+ { 2, 1, 0, 1, 116, 32, },
+ { 1, 1, 0, 1, 116, 32, },
+ { 0, 1, 0, 1, 120, 32, },
+ { 2, 1, 0, 1, 120, 32, },
+ { 1, 1, 0, 1, 120, 32, },
+ { 0, 1, 0, 1, 124, 32, },
+ { 2, 1, 0, 1, 124, 32, },
+ { 1, 1, 0, 1, 124, 32, },
+ { 0, 1, 0, 1, 128, 32, },
+ { 2, 1, 0, 1, 128, 32, },
+ { 1, 1, 0, 1, 128, 32, },
+ { 0, 1, 0, 1, 132, 32, },
+ { 2, 1, 0, 1, 132, 32, },
+ { 1, 1, 0, 1, 132, 32, },
+ { 0, 1, 0, 1, 136, 32, },
+ { 2, 1, 0, 1, 136, 32, },
+ { 1, 1, 0, 1, 136, 32, },
+ { 0, 1, 0, 1, 140, 28, },
+ { 2, 1, 0, 1, 140, 32, },
+ { 1, 1, 0, 1, 140, 32, },
+ { 0, 1, 0, 1, 149, 28, },
+ { 2, 1, 0, 1, 149, 32, },
+ { 1, 1, 0, 1, 149, 63, },
+ { 0, 1, 0, 1, 153, 32, },
+ { 2, 1, 0, 1, 153, 32, },
+ { 1, 1, 0, 1, 153, 63, },
+ { 0, 1, 0, 1, 157, 32, },
+ { 2, 1, 0, 1, 157, 32, },
+ { 1, 1, 0, 1, 157, 63, },
+ { 0, 1, 0, 1, 161, 32, },
+ { 2, 1, 0, 1, 161, 32, },
+ { 1, 1, 0, 1, 161, 63, },
+ { 0, 1, 0, 1, 165, 32, },
+ { 2, 1, 0, 1, 165, 32, },
+ { 1, 1, 0, 1, 165, 63, },
+ { 0, 1, 0, 2, 36, 26, },
+ { 2, 1, 0, 2, 36, 32, },
+ { 1, 1, 0, 2, 36, 32, },
+ { 0, 1, 0, 2, 40, 32, },
+ { 2, 1, 0, 2, 40, 32, },
+ { 1, 1, 0, 2, 40, 32, },
+ { 0, 1, 0, 2, 44, 32, },
+ { 2, 1, 0, 2, 44, 32, },
+ { 1, 1, 0, 2, 44, 32, },
+ { 0, 1, 0, 2, 48, 32, },
+ { 2, 1, 0, 2, 48, 32, },
+ { 1, 1, 0, 2, 48, 32, },
+ { 0, 1, 0, 2, 52, 32, },
+ { 2, 1, 0, 2, 52, 32, },
+ { 1, 1, 0, 2, 52, 32, },
+ { 0, 1, 0, 2, 56, 32, },
+ { 2, 1, 0, 2, 56, 32, },
+ { 1, 1, 0, 2, 56, 32, },
+ { 0, 1, 0, 2, 60, 32, },
+ { 2, 1, 0, 2, 60, 32, },
+ { 1, 1, 0, 2, 60, 32, },
+ { 0, 1, 0, 2, 64, 26, },
+ { 2, 1, 0, 2, 64, 32, },
+ { 1, 1, 0, 2, 64, 32, },
+ { 0, 1, 0, 2, 100, 26, },
+ { 2, 1, 0, 2, 100, 32, },
+ { 1, 1, 0, 2, 100, 32, },
+ { 0, 1, 0, 2, 104, 32, },
+ { 2, 1, 0, 2, 104, 32, },
+ { 1, 1, 0, 2, 104, 32, },
+ { 0, 1, 0, 2, 108, 32, },
+ { 2, 1, 0, 2, 108, 32, },
+ { 1, 1, 0, 2, 108, 32, },
+ { 0, 1, 0, 2, 112, 32, },
+ { 2, 1, 0, 2, 112, 32, },
+ { 1, 1, 0, 2, 112, 32, },
+ { 0, 1, 0, 2, 116, 32, },
+ { 2, 1, 0, 2, 116, 32, },
+ { 1, 1, 0, 2, 116, 32, },
+ { 0, 1, 0, 2, 120, 32, },
+ { 2, 1, 0, 2, 120, 32, },
+ { 1, 1, 0, 2, 120, 32, },
+ { 0, 1, 0, 2, 124, 32, },
+ { 2, 1, 0, 2, 124, 32, },
+ { 1, 1, 0, 2, 124, 32, },
+ { 0, 1, 0, 2, 128, 32, },
+ { 2, 1, 0, 2, 128, 32, },
+ { 1, 1, 0, 2, 128, 32, },
+ { 0, 1, 0, 2, 132, 32, },
+ { 2, 1, 0, 2, 132, 32, },
+ { 1, 1, 0, 2, 132, 32, },
+ { 0, 1, 0, 2, 136, 32, },
+ { 2, 1, 0, 2, 136, 32, },
+ { 1, 1, 0, 2, 136, 32, },
+ { 0, 1, 0, 2, 140, 26, },
+ { 2, 1, 0, 2, 140, 32, },
+ { 1, 1, 0, 2, 140, 32, },
+ { 0, 1, 0, 2, 149, 26, },
+ { 2, 1, 0, 2, 149, 32, },
+ { 1, 1, 0, 2, 149, 63, },
+ { 0, 1, 0, 2, 153, 32, },
+ { 2, 1, 0, 2, 153, 32, },
+ { 1, 1, 0, 2, 153, 63, },
+ { 0, 1, 0, 2, 157, 32, },
+ { 2, 1, 0, 2, 157, 32, },
+ { 1, 1, 0, 2, 157, 63, },
+ { 0, 1, 0, 2, 161, 32, },
+ { 2, 1, 0, 2, 161, 32, },
+ { 1, 1, 0, 2, 161, 63, },
+ { 0, 1, 0, 2, 165, 32, },
+ { 2, 1, 0, 2, 165, 32, },
+ { 1, 1, 0, 2, 165, 63, },
+ { 0, 1, 0, 3, 36, 24, },
+ { 2, 1, 0, 3, 36, 28, },
+ { 1, 1, 0, 3, 36, 28, },
+ { 0, 1, 0, 3, 40, 28, },
+ { 2, 1, 0, 3, 40, 28, },
+ { 1, 1, 0, 3, 40, 28, },
+ { 0, 1, 0, 3, 44, 28, },
+ { 2, 1, 0, 3, 44, 28, },
+ { 1, 1, 0, 3, 44, 28, },
+ { 0, 1, 0, 3, 48, 28, },
+ { 2, 1, 0, 3, 48, 28, },
+ { 1, 1, 0, 3, 48, 28, },
+ { 0, 1, 0, 3, 52, 28, },
+ { 2, 1, 0, 3, 52, 28, },
+ { 1, 1, 0, 3, 52, 28, },
+ { 0, 1, 0, 3, 56, 28, },
+ { 2, 1, 0, 3, 56, 28, },
+ { 1, 1, 0, 3, 56, 28, },
+ { 0, 1, 0, 3, 60, 28, },
+ { 2, 1, 0, 3, 60, 28, },
+ { 1, 1, 0, 3, 60, 28, },
+ { 0, 1, 0, 3, 64, 24, },
+ { 2, 1, 0, 3, 64, 28, },
+ { 1, 1, 0, 3, 64, 28, },
+ { 0, 1, 0, 3, 100, 24, },
+ { 2, 1, 0, 3, 100, 28, },
+ { 1, 1, 0, 3, 100, 28, },
+ { 0, 1, 0, 3, 104, 28, },
+ { 2, 1, 0, 3, 104, 28, },
+ { 1, 1, 0, 3, 104, 28, },
+ { 0, 1, 0, 3, 108, 28, },
+ { 2, 1, 0, 3, 108, 28, },
+ { 1, 1, 0, 3, 108, 28, },
+ { 0, 1, 0, 3, 112, 28, },
+ { 2, 1, 0, 3, 112, 28, },
+ { 1, 1, 0, 3, 112, 28, },
+ { 0, 1, 0, 3, 116, 28, },
+ { 2, 1, 0, 3, 116, 28, },
+ { 1, 1, 0, 3, 116, 28, },
+ { 0, 1, 0, 3, 120, 28, },
+ { 2, 1, 0, 3, 120, 28, },
+ { 1, 1, 0, 3, 120, 28, },
+ { 0, 1, 0, 3, 124, 28, },
+ { 2, 1, 0, 3, 124, 28, },
+ { 1, 1, 0, 3, 124, 28, },
+ { 0, 1, 0, 3, 128, 28, },
+ { 2, 1, 0, 3, 128, 28, },
+ { 1, 1, 0, 3, 128, 28, },
+ { 0, 1, 0, 3, 132, 28, },
+ { 2, 1, 0, 3, 132, 28, },
+ { 1, 1, 0, 3, 132, 28, },
+ { 0, 1, 0, 3, 136, 28, },
+ { 2, 1, 0, 3, 136, 28, },
+ { 1, 1, 0, 3, 136, 28, },
+ { 0, 1, 0, 3, 140, 24, },
+ { 2, 1, 0, 3, 140, 28, },
+ { 1, 1, 0, 3, 140, 28, },
+ { 0, 1, 0, 3, 149, 24, },
+ { 2, 1, 0, 3, 149, 28, },
+ { 1, 1, 0, 3, 149, 63, },
+ { 0, 1, 0, 3, 153, 28, },
+ { 2, 1, 0, 3, 153, 28, },
+ { 1, 1, 0, 3, 153, 63, },
+ { 0, 1, 0, 3, 157, 28, },
+ { 2, 1, 0, 3, 157, 28, },
+ { 1, 1, 0, 3, 157, 63, },
+ { 0, 1, 0, 3, 161, 28, },
+ { 2, 1, 0, 3, 161, 28, },
+ { 1, 1, 0, 3, 161, 63, },
+ { 0, 1, 0, 3, 165, 28, },
+ { 2, 1, 0, 3, 165, 28, },
+ { 1, 1, 0, 3, 165, 63, },
+ { 0, 1, 0, 6, 36, 22, },
+ { 2, 1, 0, 6, 36, 26, },
+ { 1, 1, 0, 6, 36, 26, },
+ { 0, 1, 0, 6, 40, 26, },
+ { 2, 1, 0, 6, 40, 26, },
+ { 1, 1, 0, 6, 40, 26, },
+ { 0, 1, 0, 6, 44, 26, },
+ { 2, 1, 0, 6, 44, 26, },
+ { 1, 1, 0, 6, 44, 26, },
+ { 0, 1, 0, 6, 48, 26, },
+ { 2, 1, 0, 6, 48, 26, },
+ { 1, 1, 0, 6, 48, 26, },
+ { 0, 1, 0, 6, 52, 26, },
+ { 2, 1, 0, 6, 52, 26, },
+ { 1, 1, 0, 6, 52, 26, },
+ { 0, 1, 0, 6, 56, 26, },
+ { 2, 1, 0, 6, 56, 26, },
+ { 1, 1, 0, 6, 56, 26, },
+ { 0, 1, 0, 6, 60, 26, },
+ { 2, 1, 0, 6, 60, 26, },
+ { 1, 1, 0, 6, 60, 26, },
+ { 0, 1, 0, 6, 64, 22, },
+ { 2, 1, 0, 6, 64, 26, },
+ { 1, 1, 0, 6, 64, 26, },
+ { 0, 1, 0, 6, 100, 22, },
+ { 2, 1, 0, 6, 100, 26, },
+ { 1, 1, 0, 6, 100, 26, },
+ { 0, 1, 0, 6, 104, 26, },
+ { 2, 1, 0, 6, 104, 26, },
+ { 1, 1, 0, 6, 104, 26, },
+ { 0, 1, 0, 6, 108, 26, },
+ { 2, 1, 0, 6, 108, 26, },
+ { 1, 1, 0, 6, 108, 26, },
+ { 0, 1, 0, 6, 112, 26, },
+ { 2, 1, 0, 6, 112, 26, },
+ { 1, 1, 0, 6, 112, 26, },
+ { 0, 1, 0, 6, 116, 26, },
+ { 2, 1, 0, 6, 116, 26, },
+ { 1, 1, 0, 6, 116, 26, },
+ { 0, 1, 0, 6, 120, 26, },
+ { 2, 1, 0, 6, 120, 26, },
+ { 1, 1, 0, 6, 120, 26, },
+ { 0, 1, 0, 6, 124, 26, },
+ { 2, 1, 0, 6, 124, 26, },
+ { 1, 1, 0, 6, 124, 26, },
+ { 0, 1, 0, 6, 128, 26, },
+ { 2, 1, 0, 6, 128, 26, },
+ { 1, 1, 0, 6, 128, 26, },
+ { 0, 1, 0, 6, 132, 26, },
+ { 2, 1, 0, 6, 132, 26, },
+ { 1, 1, 0, 6, 132, 26, },
+ { 0, 1, 0, 6, 136, 26, },
+ { 2, 1, 0, 6, 136, 26, },
+ { 1, 1, 0, 6, 136, 26, },
+ { 0, 1, 0, 6, 140, 22, },
+ { 2, 1, 0, 6, 140, 26, },
+ { 1, 1, 0, 6, 140, 26, },
+ { 0, 1, 0, 6, 149, 22, },
+ { 2, 1, 0, 6, 149, 26, },
+ { 1, 1, 0, 6, 149, 63, },
+ { 0, 1, 0, 6, 153, 26, },
+ { 2, 1, 0, 6, 153, 26, },
+ { 1, 1, 0, 6, 153, 63, },
+ { 0, 1, 0, 6, 157, 26, },
+ { 2, 1, 0, 6, 157, 26, },
+ { 1, 1, 0, 6, 157, 63, },
+ { 0, 1, 0, 6, 161, 26, },
+ { 2, 1, 0, 6, 161, 26, },
+ { 1, 1, 0, 6, 161, 63, },
+ { 0, 1, 0, 6, 165, 26, },
+ { 2, 1, 0, 6, 165, 26, },
+ { 1, 1, 0, 6, 165, 63, },
+ { 0, 1, 0, 7, 36, 20, },
+ { 2, 1, 0, 7, 36, 24, },
+ { 1, 1, 0, 7, 36, 24, },
+ { 0, 1, 0, 7, 40, 24, },
+ { 2, 1, 0, 7, 40, 24, },
+ { 1, 1, 0, 7, 40, 24, },
+ { 0, 1, 0, 7, 44, 24, },
+ { 2, 1, 0, 7, 44, 24, },
+ { 1, 1, 0, 7, 44, 24, },
+ { 0, 1, 0, 7, 48, 24, },
+ { 2, 1, 0, 7, 48, 24, },
+ { 1, 1, 0, 7, 48, 24, },
+ { 0, 1, 0, 7, 52, 24, },
+ { 2, 1, 0, 7, 52, 24, },
+ { 1, 1, 0, 7, 52, 24, },
+ { 0, 1, 0, 7, 56, 24, },
+ { 2, 1, 0, 7, 56, 24, },
+ { 1, 1, 0, 7, 56, 24, },
+ { 0, 1, 0, 7, 60, 24, },
+ { 2, 1, 0, 7, 60, 24, },
+ { 1, 1, 0, 7, 60, 24, },
+ { 0, 1, 0, 7, 64, 20, },
+ { 2, 1, 0, 7, 64, 24, },
+ { 1, 1, 0, 7, 64, 24, },
+ { 0, 1, 0, 7, 100, 20, },
+ { 2, 1, 0, 7, 100, 24, },
+ { 1, 1, 0, 7, 100, 24, },
+ { 0, 1, 0, 7, 104, 24, },
+ { 2, 1, 0, 7, 104, 24, },
+ { 1, 1, 0, 7, 104, 24, },
+ { 0, 1, 0, 7, 108, 24, },
+ { 2, 1, 0, 7, 108, 24, },
+ { 1, 1, 0, 7, 108, 24, },
+ { 0, 1, 0, 7, 112, 24, },
+ { 2, 1, 0, 7, 112, 24, },
+ { 1, 1, 0, 7, 112, 24, },
+ { 0, 1, 0, 7, 116, 24, },
+ { 2, 1, 0, 7, 116, 24, },
+ { 1, 1, 0, 7, 116, 24, },
+ { 0, 1, 0, 7, 120, 24, },
+ { 2, 1, 0, 7, 120, 24, },
+ { 1, 1, 0, 7, 120, 24, },
+ { 0, 1, 0, 7, 124, 24, },
+ { 2, 1, 0, 7, 124, 24, },
+ { 1, 1, 0, 7, 124, 24, },
+ { 0, 1, 0, 7, 128, 24, },
+ { 2, 1, 0, 7, 128, 24, },
+ { 1, 1, 0, 7, 128, 24, },
+ { 0, 1, 0, 7, 132, 24, },
+ { 2, 1, 0, 7, 132, 24, },
+ { 1, 1, 0, 7, 132, 24, },
+ { 0, 1, 0, 7, 136, 24, },
+ { 2, 1, 0, 7, 136, 24, },
+ { 1, 1, 0, 7, 136, 24, },
+ { 0, 1, 0, 7, 140, 20, },
+ { 2, 1, 0, 7, 140, 24, },
+ { 1, 1, 0, 7, 140, 24, },
+ { 0, 1, 0, 7, 149, 20, },
+ { 2, 1, 0, 7, 149, 24, },
+ { 1, 1, 0, 7, 149, 63, },
+ { 0, 1, 0, 7, 153, 24, },
+ { 2, 1, 0, 7, 153, 24, },
+ { 1, 1, 0, 7, 153, 63, },
+ { 0, 1, 0, 7, 157, 24, },
+ { 2, 1, 0, 7, 157, 24, },
+ { 1, 1, 0, 7, 157, 63, },
+ { 0, 1, 0, 7, 161, 24, },
+ { 2, 1, 0, 7, 161, 24, },
+ { 1, 1, 0, 7, 161, 63, },
+ { 0, 1, 0, 7, 165, 24, },
+ { 2, 1, 0, 7, 165, 24, },
+ { 1, 1, 0, 7, 165, 63, },
+ { 0, 1, 1, 2, 38, 26, },
+ { 2, 1, 1, 2, 38, 32, },
+ { 1, 1, 1, 2, 38, 32, },
+ { 0, 1, 1, 2, 46, 32, },
+ { 2, 1, 1, 2, 46, 32, },
+ { 1, 1, 1, 2, 46, 32, },
+ { 0, 1, 1, 2, 54, 32, },
+ { 2, 1, 1, 2, 54, 32, },
+ { 1, 1, 1, 2, 54, 32, },
+ { 0, 1, 1, 2, 62, 26, },
+ { 2, 1, 1, 2, 62, 32, },
+ { 1, 1, 1, 2, 62, 32, },
+ { 0, 1, 1, 2, 102, 26, },
+ { 2, 1, 1, 2, 102, 32, },
+ { 1, 1, 1, 2, 102, 32, },
+ { 0, 1, 1, 2, 110, 32, },
+ { 2, 1, 1, 2, 110, 32, },
+ { 1, 1, 1, 2, 110, 32, },
+ { 0, 1, 1, 2, 118, 32, },
+ { 2, 1, 1, 2, 118, 32, },
+ { 1, 1, 1, 2, 118, 32, },
+ { 0, 1, 1, 2, 126, 32, },
+ { 2, 1, 1, 2, 126, 32, },
+ { 1, 1, 1, 2, 126, 32, },
+ { 0, 1, 1, 2, 134, 32, },
+ { 2, 1, 1, 2, 134, 32, },
+ { 1, 1, 1, 2, 134, 32, },
+ { 0, 1, 1, 2, 151, 26, },
+ { 2, 1, 1, 2, 151, 32, },
+ { 1, 1, 1, 2, 151, 63, },
+ { 0, 1, 1, 2, 159, 32, },
+ { 2, 1, 1, 2, 159, 32, },
+ { 1, 1, 1, 2, 159, 63, },
+ { 0, 1, 1, 3, 38, 24, },
+ { 2, 1, 1, 3, 38, 28, },
+ { 1, 1, 1, 3, 38, 28, },
+ { 0, 1, 1, 3, 46, 28, },
+ { 2, 1, 1, 3, 46, 28, },
+ { 1, 1, 1, 3, 46, 28, },
+ { 0, 1, 1, 3, 54, 28, },
+ { 2, 1, 1, 3, 54, 28, },
+ { 1, 1, 1, 3, 54, 28, },
+ { 0, 1, 1, 3, 62, 24, },
+ { 2, 1, 1, 3, 62, 28, },
+ { 1, 1, 1, 3, 62, 28, },
+ { 0, 1, 1, 3, 102, 24, },
+ { 2, 1, 1, 3, 102, 28, },
+ { 1, 1, 1, 3, 102, 28, },
+ { 0, 1, 1, 3, 110, 28, },
+ { 2, 1, 1, 3, 110, 28, },
+ { 1, 1, 1, 3, 110, 28, },
+ { 0, 1, 1, 3, 118, 28, },
+ { 2, 1, 1, 3, 118, 28, },
+ { 1, 1, 1, 3, 118, 28, },
+ { 0, 1, 1, 3, 126, 28, },
+ { 2, 1, 1, 3, 126, 28, },
+ { 1, 1, 1, 3, 126, 28, },
+ { 0, 1, 1, 3, 134, 28, },
+ { 2, 1, 1, 3, 134, 28, },
+ { 1, 1, 1, 3, 134, 28, },
+ { 0, 1, 1, 3, 151, 24, },
+ { 2, 1, 1, 3, 151, 28, },
+ { 1, 1, 1, 3, 151, 63, },
+ { 0, 1, 1, 3, 159, 28, },
+ { 2, 1, 1, 3, 159, 28, },
+ { 1, 1, 1, 3, 159, 63, },
+ { 0, 1, 1, 6, 38, 20, },
+ { 2, 1, 1, 6, 38, 26, },
+ { 1, 1, 1, 6, 38, 26, },
+ { 0, 1, 1, 6, 46, 26, },
+ { 2, 1, 1, 6, 46, 26, },
+ { 1, 1, 1, 6, 46, 26, },
+ { 0, 1, 1, 6, 54, 26, },
+ { 2, 1, 1, 6, 54, 26, },
+ { 1, 1, 1, 6, 54, 26, },
+ { 0, 1, 1, 6, 62, 20, },
+ { 2, 1, 1, 6, 62, 26, },
+ { 1, 1, 1, 6, 62, 26, },
+ { 0, 1, 1, 6, 102, 20, },
+ { 2, 1, 1, 6, 102, 26, },
+ { 1, 1, 1, 6, 102, 26, },
+ { 0, 1, 1, 6, 110, 26, },
+ { 2, 1, 1, 6, 110, 26, },
+ { 1, 1, 1, 6, 110, 26, },
+ { 0, 1, 1, 6, 118, 26, },
+ { 2, 1, 1, 6, 118, 26, },
+ { 1, 1, 1, 6, 118, 26, },
+ { 0, 1, 1, 6, 126, 26, },
+ { 2, 1, 1, 6, 126, 26, },
+ { 1, 1, 1, 6, 126, 26, },
+ { 0, 1, 1, 6, 134, 26, },
+ { 2, 1, 1, 6, 134, 26, },
+ { 1, 1, 1, 6, 134, 26, },
+ { 0, 1, 1, 6, 151, 20, },
+ { 2, 1, 1, 6, 151, 26, },
+ { 1, 1, 1, 6, 151, 63, },
+ { 0, 1, 1, 6, 159, 26, },
+ { 2, 1, 1, 6, 159, 26, },
+ { 1, 1, 1, 6, 159, 63, },
+ { 0, 1, 1, 7, 38, 18, },
+ { 2, 1, 1, 7, 38, 24, },
+ { 1, 1, 1, 7, 38, 24, },
+ { 0, 1, 1, 7, 46, 24, },
+ { 2, 1, 1, 7, 46, 24, },
+ { 1, 1, 1, 7, 46, 24, },
+ { 0, 1, 1, 7, 54, 24, },
+ { 2, 1, 1, 7, 54, 24, },
+ { 1, 1, 1, 7, 54, 24, },
+ { 0, 1, 1, 7, 62, 18, },
+ { 2, 1, 1, 7, 62, 24, },
+ { 1, 1, 1, 7, 62, 24, },
+ { 0, 1, 1, 7, 102, 18, },
+ { 2, 1, 1, 7, 102, 24, },
+ { 1, 1, 1, 7, 102, 24, },
+ { 0, 1, 1, 7, 110, 24, },
+ { 2, 1, 1, 7, 110, 24, },
+ { 1, 1, 1, 7, 110, 24, },
+ { 0, 1, 1, 7, 118, 24, },
+ { 2, 1, 1, 7, 118, 24, },
+ { 1, 1, 1, 7, 118, 24, },
+ { 0, 1, 1, 7, 126, 24, },
+ { 2, 1, 1, 7, 126, 24, },
+ { 1, 1, 1, 7, 126, 24, },
+ { 0, 1, 1, 7, 134, 24, },
+ { 2, 1, 1, 7, 134, 24, },
+ { 1, 1, 1, 7, 134, 24, },
+ { 0, 1, 1, 7, 151, 18, },
+ { 2, 1, 1, 7, 151, 24, },
+ { 1, 1, 1, 7, 151, 63, },
+ { 0, 1, 1, 7, 159, 24, },
+ { 2, 1, 1, 7, 159, 24, },
+ { 1, 1, 1, 7, 159, 63, },
+ { 0, 1, 2, 4, 42, 22, },
+ { 2, 1, 2, 4, 42, 30, },
+ { 1, 1, 2, 4, 42, 30, },
+ { 0, 1, 2, 4, 58, 22, },
+ { 2, 1, 2, 4, 58, 30, },
+ { 1, 1, 2, 4, 58, 30, },
+ { 0, 1, 2, 4, 106, 22, },
+ { 2, 1, 2, 4, 106, 30, },
+ { 1, 1, 2, 4, 106, 30, },
+ { 0, 1, 2, 4, 122, 30, },
+ { 2, 1, 2, 4, 122, 30, },
+ { 1, 1, 2, 4, 122, 30, },
+ { 0, 1, 2, 4, 155, 22, },
+ { 2, 1, 2, 4, 155, 30, },
+ { 1, 1, 2, 4, 155, 63, },
+ { 0, 1, 2, 5, 42, 20, },
+ { 2, 1, 2, 5, 42, 28, },
+ { 1, 1, 2, 5, 42, 28, },
+ { 0, 1, 2, 5, 58, 20, },
+ { 2, 1, 2, 5, 58, 28, },
+ { 1, 1, 2, 5, 58, 28, },
+ { 0, 1, 2, 5, 106, 20, },
+ { 2, 1, 2, 5, 106, 28, },
+ { 1, 1, 2, 5, 106, 28, },
+ { 0, 1, 2, 5, 122, 28, },
+ { 2, 1, 2, 5, 122, 28, },
+ { 1, 1, 2, 5, 122, 28, },
+ { 0, 1, 2, 5, 155, 20, },
+ { 2, 1, 2, 5, 155, 28, },
+ { 1, 1, 2, 5, 155, 63, },
+ { 0, 1, 2, 8, 42, 18, },
+ { 2, 1, 2, 8, 42, 26, },
+ { 1, 1, 2, 8, 42, 26, },
+ { 0, 1, 2, 8, 58, 18, },
+ { 2, 1, 2, 8, 58, 26, },
+ { 1, 1, 2, 8, 58, 26, },
+ { 0, 1, 2, 8, 106, 18, },
+ { 2, 1, 2, 8, 106, 26, },
+ { 1, 1, 2, 8, 106, 26, },
+ { 0, 1, 2, 8, 122, 26, },
+ { 2, 1, 2, 8, 122, 26, },
+ { 1, 1, 2, 8, 122, 26, },
+ { 0, 1, 2, 8, 155, 18, },
+ { 2, 1, 2, 8, 155, 26, },
+ { 1, 1, 2, 8, 155, 63, },
+ { 0, 1, 2, 9, 42, 16, },
+ { 2, 1, 2, 9, 42, 24, },
+ { 1, 1, 2, 9, 42, 24, },
+ { 0, 1, 2, 9, 58, 16, },
+ { 2, 1, 2, 9, 58, 24, },
+ { 1, 1, 2, 9, 58, 24, },
+ { 0, 1, 2, 9, 106, 16, },
+ { 2, 1, 2, 9, 106, 24, },
+ { 1, 1, 2, 9, 106, 24, },
+ { 0, 1, 2, 9, 122, 24, },
+ { 2, 1, 2, 9, 122, 24, },
+ { 1, 1, 2, 9, 122, 24, },
+ { 0, 1, 2, 9, 155, 16, },
+ { 2, 1, 2, 9, 155, 24, },
+ { 1, 1, 2, 9, 155, 63, },
+};
+
+RTW_DECL_TABLE_TXPWR_LMT(rtw8814a_txpwr_lmt_type0);
+
+static const struct rtw_txpwr_lmt_cfg_pair rtw8814a_txpwr_lmt_type1[] = {
+ { 0, 0, 0, 0, 1, 34, },
+ { 2, 0, 0, 0, 1, 32, },
+ { 1, 0, 0, 0, 1, 32, },
+ { 0, 0, 0, 0, 2, 34, },
+ { 2, 0, 0, 0, 2, 32, },
+ { 1, 0, 0, 0, 2, 32, },
+ { 0, 0, 0, 0, 3, 34, },
+ { 2, 0, 0, 0, 3, 32, },
+ { 1, 0, 0, 0, 3, 32, },
+ { 0, 0, 0, 0, 4, 34, },
+ { 2, 0, 0, 0, 4, 32, },
+ { 1, 0, 0, 0, 4, 32, },
+ { 0, 0, 0, 0, 5, 34, },
+ { 2, 0, 0, 0, 5, 32, },
+ { 1, 0, 0, 0, 5, 32, },
+ { 0, 0, 0, 0, 6, 34, },
+ { 2, 0, 0, 0, 6, 32, },
+ { 1, 0, 0, 0, 6, 32, },
+ { 0, 0, 0, 0, 7, 34, },
+ { 2, 0, 0, 0, 7, 32, },
+ { 1, 0, 0, 0, 7, 32, },
+ { 0, 0, 0, 0, 8, 34, },
+ { 2, 0, 0, 0, 8, 32, },
+ { 1, 0, 0, 0, 8, 32, },
+ { 0, 0, 0, 0, 9, 34, },
+ { 2, 0, 0, 0, 9, 32, },
+ { 1, 0, 0, 0, 9, 32, },
+ { 0, 0, 0, 0, 10, 34, },
+ { 2, 0, 0, 0, 10, 32, },
+ { 1, 0, 0, 0, 10, 32, },
+ { 0, 0, 0, 0, 11, 34, },
+ { 2, 0, 0, 0, 11, 32, },
+ { 1, 0, 0, 0, 11, 32, },
+ { 0, 0, 0, 0, 12, 24, },
+ { 2, 0, 0, 0, 12, 32, },
+ { 1, 0, 0, 0, 12, 32, },
+ { 0, 0, 0, 0, 13, 16, },
+ { 2, 0, 0, 0, 13, 32, },
+ { 1, 0, 0, 0, 13, 32, },
+ { 0, 0, 0, 0, 14, 63, },
+ { 2, 0, 0, 0, 14, 63, },
+ { 1, 0, 0, 0, 14, 32, },
+ { 0, 0, 0, 1, 1, 30, },
+ { 2, 0, 0, 1, 1, 32, },
+ { 1, 0, 0, 1, 1, 32, },
+ { 0, 0, 0, 1, 2, 32, },
+ { 2, 0, 0, 1, 2, 32, },
+ { 1, 0, 0, 1, 2, 32, },
+ { 0, 0, 0, 1, 3, 32, },
+ { 2, 0, 0, 1, 3, 32, },
+ { 1, 0, 0, 1, 3, 32, },
+ { 0, 0, 0, 1, 4, 32, },
+ { 2, 0, 0, 1, 4, 32, },
+ { 1, 0, 0, 1, 4, 32, },
+ { 0, 0, 0, 1, 5, 32, },
+ { 2, 0, 0, 1, 5, 32, },
+ { 1, 0, 0, 1, 5, 32, },
+ { 0, 0, 0, 1, 6, 32, },
+ { 2, 0, 0, 1, 6, 32, },
+ { 1, 0, 0, 1, 6, 32, },
+ { 0, 0, 0, 1, 7, 32, },
+ { 2, 0, 0, 1, 7, 32, },
+ { 1, 0, 0, 1, 7, 32, },
+ { 0, 0, 0, 1, 8, 32, },
+ { 2, 0, 0, 1, 8, 32, },
+ { 1, 0, 0, 1, 8, 32, },
+ { 0, 0, 0, 1, 9, 32, },
+ { 2, 0, 0, 1, 9, 32, },
+ { 1, 0, 0, 1, 9, 32, },
+ { 0, 0, 0, 1, 10, 32, },
+ { 2, 0, 0, 1, 10, 32, },
+ { 1, 0, 0, 1, 10, 32, },
+ { 0, 0, 0, 1, 11, 30, },
+ { 2, 0, 0, 1, 11, 32, },
+ { 1, 0, 0, 1, 11, 32, },
+ { 0, 0, 0, 1, 12, 18, },
+ { 2, 0, 0, 1, 12, 32, },
+ { 1, 0, 0, 1, 12, 32, },
+ { 0, 0, 0, 1, 13, 8, },
+ { 2, 0, 0, 1, 13, 32, },
+ { 1, 0, 0, 1, 13, 32, },
+ { 0, 0, 0, 1, 14, 63, },
+ { 2, 0, 0, 1, 14, 63, },
+ { 1, 0, 0, 1, 14, 63, },
+ { 0, 0, 0, 2, 1, 28, },
+ { 2, 0, 0, 2, 1, 32, },
+ { 1, 0, 0, 2, 1, 32, },
+ { 0, 0, 0, 2, 2, 32, },
+ { 2, 0, 0, 2, 2, 32, },
+ { 1, 0, 0, 2, 2, 32, },
+ { 0, 0, 0, 2, 3, 32, },
+ { 2, 0, 0, 2, 3, 32, },
+ { 1, 0, 0, 2, 3, 32, },
+ { 0, 0, 0, 2, 4, 32, },
+ { 2, 0, 0, 2, 4, 32, },
+ { 1, 0, 0, 2, 4, 32, },
+ { 0, 0, 0, 2, 5, 32, },
+ { 2, 0, 0, 2, 5, 32, },
+ { 1, 0, 0, 2, 5, 32, },
+ { 0, 0, 0, 2, 6, 32, },
+ { 2, 0, 0, 2, 6, 32, },
+ { 1, 0, 0, 2, 6, 32, },
+ { 0, 0, 0, 2, 7, 32, },
+ { 2, 0, 0, 2, 7, 32, },
+ { 1, 0, 0, 2, 7, 32, },
+ { 0, 0, 0, 2, 8, 32, },
+ { 2, 0, 0, 2, 8, 32, },
+ { 1, 0, 0, 2, 8, 32, },
+ { 0, 0, 0, 2, 9, 32, },
+ { 2, 0, 0, 2, 9, 32, },
+ { 1, 0, 0, 2, 9, 32, },
+ { 0, 0, 0, 2, 10, 32, },
+ { 2, 0, 0, 2, 10, 32, },
+ { 1, 0, 0, 2, 10, 32, },
+ { 0, 0, 0, 2, 11, 28, },
+ { 2, 0, 0, 2, 11, 32, },
+ { 1, 0, 0, 2, 11, 32, },
+ { 0, 0, 0, 2, 12, 16, },
+ { 2, 0, 0, 2, 12, 32, },
+ { 1, 0, 0, 2, 12, 32, },
+ { 0, 0, 0, 2, 13, 6, },
+ { 2, 0, 0, 2, 13, 32, },
+ { 1, 0, 0, 2, 13, 32, },
+ { 0, 0, 0, 2, 14, 63, },
+ { 2, 0, 0, 2, 14, 63, },
+ { 1, 0, 0, 2, 14, 63, },
+ { 0, 0, 0, 3, 1, 26, },
+ { 2, 0, 0, 3, 1, 30, },
+ { 1, 0, 0, 3, 1, 30, },
+ { 0, 0, 0, 3, 2, 30, },
+ { 2, 0, 0, 3, 2, 30, },
+ { 1, 0, 0, 3, 2, 30, },
+ { 0, 0, 0, 3, 3, 30, },
+ { 2, 0, 0, 3, 3, 30, },
+ { 1, 0, 0, 3, 3, 30, },
+ { 0, 0, 0, 3, 4, 30, },
+ { 2, 0, 0, 3, 4, 30, },
+ { 1, 0, 0, 3, 4, 30, },
+ { 0, 0, 0, 3, 5, 30, },
+ { 2, 0, 0, 3, 5, 30, },
+ { 1, 0, 0, 3, 5, 30, },
+ { 0, 0, 0, 3, 6, 30, },
+ { 2, 0, 0, 3, 6, 30, },
+ { 1, 0, 0, 3, 6, 30, },
+ { 0, 0, 0, 3, 7, 30, },
+ { 2, 0, 0, 3, 7, 30, },
+ { 1, 0, 0, 3, 7, 30, },
+ { 0, 0, 0, 3, 8, 30, },
+ { 2, 0, 0, 3, 8, 30, },
+ { 1, 0, 0, 3, 8, 30, },
+ { 0, 0, 0, 3, 9, 30, },
+ { 2, 0, 0, 3, 9, 30, },
+ { 1, 0, 0, 3, 9, 30, },
+ { 0, 0, 0, 3, 10, 30, },
+ { 2, 0, 0, 3, 10, 30, },
+ { 1, 0, 0, 3, 10, 30, },
+ { 0, 0, 0, 3, 11, 26, },
+ { 2, 0, 0, 3, 11, 30, },
+ { 1, 0, 0, 3, 11, 30, },
+ { 0, 0, 0, 3, 12, 14, },
+ { 2, 0, 0, 3, 12, 30, },
+ { 1, 0, 0, 3, 12, 30, },
+ { 0, 0, 0, 3, 13, 4, },
+ { 2, 0, 0, 3, 13, 30, },
+ { 1, 0, 0, 3, 13, 30, },
+ { 0, 0, 0, 3, 14, 63, },
+ { 2, 0, 0, 3, 14, 63, },
+ { 1, 0, 0, 3, 14, 63, },
+ { 0, 0, 0, 6, 1, 24, },
+ { 2, 0, 0, 6, 1, 28, },
+ { 1, 0, 0, 6, 1, 28, },
+ { 0, 0, 0, 6, 2, 28, },
+ { 2, 0, 0, 6, 2, 28, },
+ { 1, 0, 0, 6, 2, 28, },
+ { 0, 0, 0, 6, 3, 28, },
+ { 2, 0, 0, 6, 3, 28, },
+ { 1, 0, 0, 6, 3, 28, },
+ { 0, 0, 0, 6, 4, 28, },
+ { 2, 0, 0, 6, 4, 28, },
+ { 1, 0, 0, 6, 4, 28, },
+ { 0, 0, 0, 6, 5, 28, },
+ { 2, 0, 0, 6, 5, 28, },
+ { 1, 0, 0, 6, 5, 28, },
+ { 0, 0, 0, 6, 6, 28, },
+ { 2, 0, 0, 6, 6, 28, },
+ { 1, 0, 0, 6, 6, 28, },
+ { 0, 0, 0, 6, 7, 28, },
+ { 2, 0, 0, 6, 7, 28, },
+ { 1, 0, 0, 6, 7, 28, },
+ { 0, 0, 0, 6, 8, 28, },
+ { 2, 0, 0, 6, 8, 28, },
+ { 1, 0, 0, 6, 8, 28, },
+ { 0, 0, 0, 6, 9, 28, },
+ { 2, 0, 0, 6, 9, 28, },
+ { 1, 0, 0, 6, 9, 28, },
+ { 0, 0, 0, 6, 10, 28, },
+ { 2, 0, 0, 6, 10, 28, },
+ { 1, 0, 0, 6, 10, 28, },
+ { 0, 0, 0, 6, 11, 24, },
+ { 2, 0, 0, 6, 11, 28, },
+ { 1, 0, 0, 6, 11, 28, },
+ { 0, 0, 0, 6, 12, 14, },
+ { 2, 0, 0, 6, 12, 28, },
+ { 1, 0, 0, 6, 12, 28, },
+ { 0, 0, 0, 6, 13, 4, },
+ { 2, 0, 0, 6, 13, 28, },
+ { 1, 0, 0, 6, 13, 28, },
+ { 0, 0, 0, 6, 14, 63, },
+ { 2, 0, 0, 6, 14, 63, },
+ { 1, 0, 0, 6, 14, 63, },
+ { 0, 0, 0, 7, 1, 22, },
+ { 2, 0, 0, 7, 1, 26, },
+ { 1, 0, 0, 7, 1, 26, },
+ { 0, 0, 0, 7, 2, 26, },
+ { 2, 0, 0, 7, 2, 26, },
+ { 1, 0, 0, 7, 2, 26, },
+ { 0, 0, 0, 7, 3, 26, },
+ { 2, 0, 0, 7, 3, 26, },
+ { 1, 0, 0, 7, 3, 26, },
+ { 0, 0, 0, 7, 4, 26, },
+ { 2, 0, 0, 7, 4, 26, },
+ { 1, 0, 0, 7, 4, 26, },
+ { 0, 0, 0, 7, 5, 26, },
+ { 2, 0, 0, 7, 5, 26, },
+ { 1, 0, 0, 7, 5, 26, },
+ { 0, 0, 0, 7, 6, 26, },
+ { 2, 0, 0, 7, 6, 26, },
+ { 1, 0, 0, 7, 6, 26, },
+ { 0, 0, 0, 7, 7, 26, },
+ { 2, 0, 0, 7, 7, 26, },
+ { 1, 0, 0, 7, 7, 26, },
+ { 0, 0, 0, 7, 8, 26, },
+ { 2, 0, 0, 7, 8, 26, },
+ { 1, 0, 0, 7, 8, 26, },
+ { 0, 0, 0, 7, 9, 26, },
+ { 2, 0, 0, 7, 9, 26, },
+ { 1, 0, 0, 7, 9, 26, },
+ { 0, 0, 0, 7, 10, 26, },
+ { 2, 0, 0, 7, 10, 26, },
+ { 1, 0, 0, 7, 10, 26, },
+ { 0, 0, 0, 7, 11, 22, },
+ { 2, 0, 0, 7, 11, 26, },
+ { 1, 0, 0, 7, 11, 26, },
+ { 0, 0, 0, 7, 12, 14, },
+ { 2, 0, 0, 7, 12, 26, },
+ { 1, 0, 0, 7, 12, 26, },
+ { 0, 0, 0, 7, 13, 4, },
+ { 2, 0, 0, 7, 13, 26, },
+ { 1, 0, 0, 7, 13, 26, },
+ { 0, 0, 0, 7, 14, 63, },
+ { 2, 0, 0, 7, 14, 63, },
+ { 1, 0, 0, 7, 14, 63, },
+ { 0, 0, 1, 2, 1, 63, },
+ { 2, 0, 1, 2, 1, 63, },
+ { 1, 0, 1, 2, 1, 63, },
+ { 0, 0, 1, 2, 2, 63, },
+ { 2, 0, 1, 2, 2, 63, },
+ { 1, 0, 1, 2, 2, 63, },
+ { 0, 0, 1, 2, 3, 28, },
+ { 2, 0, 1, 2, 3, 32, },
+ { 1, 0, 1, 2, 3, 32, },
+ { 0, 0, 1, 2, 4, 32, },
+ { 2, 0, 1, 2, 4, 32, },
+ { 1, 0, 1, 2, 4, 32, },
+ { 0, 0, 1, 2, 5, 32, },
+ { 2, 0, 1, 2, 5, 32, },
+ { 1, 0, 1, 2, 5, 32, },
+ { 0, 0, 1, 2, 6, 32, },
+ { 2, 0, 1, 2, 6, 32, },
+ { 1, 0, 1, 2, 6, 32, },
+ { 0, 0, 1, 2, 7, 32, },
+ { 2, 0, 1, 2, 7, 32, },
+ { 1, 0, 1, 2, 7, 32, },
+ { 0, 0, 1, 2, 8, 32, },
+ { 2, 0, 1, 2, 8, 32, },
+ { 1, 0, 1, 2, 8, 32, },
+ { 0, 0, 1, 2, 9, 32, },
+ { 2, 0, 1, 2, 9, 32, },
+ { 1, 0, 1, 2, 9, 32, },
+ { 0, 0, 1, 2, 10, 32, },
+ { 2, 0, 1, 2, 10, 32, },
+ { 1, 0, 1, 2, 10, 32, },
+ { 0, 0, 1, 2, 11, 28, },
+ { 2, 0, 1, 2, 11, 32, },
+ { 1, 0, 1, 2, 11, 32, },
+ { 0, 0, 1, 2, 12, 16, },
+ { 2, 0, 1, 2, 12, 32, },
+ { 1, 0, 1, 2, 12, 32, },
+ { 0, 0, 1, 2, 13, 10, },
+ { 2, 0, 1, 2, 13, 32, },
+ { 1, 0, 1, 2, 13, 32, },
+ { 0, 0, 1, 2, 14, 63, },
+ { 2, 0, 1, 2, 14, 63, },
+ { 1, 0, 1, 2, 14, 63, },
+ { 0, 0, 1, 3, 1, 63, },
+ { 2, 0, 1, 3, 1, 63, },
+ { 1, 0, 1, 3, 1, 63, },
+ { 0, 0, 1, 3, 2, 63, },
+ { 2, 0, 1, 3, 2, 63, },
+ { 1, 0, 1, 3, 2, 63, },
+ { 0, 0, 1, 3, 3, 26, },
+ { 2, 0, 1, 3, 3, 30, },
+ { 1, 0, 1, 3, 3, 30, },
+ { 0, 0, 1, 3, 4, 30, },
+ { 2, 0, 1, 3, 4, 30, },
+ { 1, 0, 1, 3, 4, 30, },
+ { 0, 0, 1, 3, 5, 30, },
+ { 2, 0, 1, 3, 5, 30, },
+ { 1, 0, 1, 3, 5, 30, },
+ { 0, 0, 1, 3, 6, 30, },
+ { 2, 0, 1, 3, 6, 30, },
+ { 1, 0, 1, 3, 6, 30, },
+ { 0, 0, 1, 3, 7, 30, },
+ { 2, 0, 1, 3, 7, 30, },
+ { 1, 0, 1, 3, 7, 30, },
+ { 0, 0, 1, 3, 8, 30, },
+ { 2, 0, 1, 3, 8, 30, },
+ { 1, 0, 1, 3, 8, 30, },
+ { 0, 0, 1, 3, 9, 30, },
+ { 2, 0, 1, 3, 9, 30, },
+ { 1, 0, 1, 3, 9, 30, },
+ { 0, 0, 1, 3, 10, 30, },
+ { 2, 0, 1, 3, 10, 30, },
+ { 1, 0, 1, 3, 10, 30, },
+ { 0, 0, 1, 3, 11, 26, },
+ { 2, 0, 1, 3, 11, 30, },
+ { 1, 0, 1, 3, 11, 30, },
+ { 0, 0, 1, 3, 12, 14, },
+ { 2, 0, 1, 3, 12, 30, },
+ { 1, 0, 1, 3, 12, 30, },
+ { 0, 0, 1, 3, 13, 8, },
+ { 2, 0, 1, 3, 13, 30, },
+ { 1, 0, 1, 3, 13, 30, },
+ { 0, 0, 1, 3, 14, 63, },
+ { 2, 0, 1, 3, 14, 63, },
+ { 1, 0, 1, 3, 14, 63, },
+ { 0, 0, 1, 6, 1, 63, },
+ { 2, 0, 1, 6, 1, 63, },
+ { 1, 0, 1, 6, 1, 63, },
+ { 0, 0, 1, 6, 2, 63, },
+ { 2, 0, 1, 6, 2, 63, },
+ { 1, 0, 1, 6, 2, 63, },
+ { 0, 0, 1, 6, 3, 24, },
+ { 2, 0, 1, 6, 3, 28, },
+ { 1, 0, 1, 6, 3, 28, },
+ { 0, 0, 1, 6, 4, 28, },
+ { 2, 0, 1, 6, 4, 28, },
+ { 1, 0, 1, 6, 4, 28, },
+ { 0, 0, 1, 6, 5, 28, },
+ { 2, 0, 1, 6, 5, 28, },
+ { 1, 0, 1, 6, 5, 28, },
+ { 0, 0, 1, 6, 6, 28, },
+ { 2, 0, 1, 6, 6, 28, },
+ { 1, 0, 1, 6, 6, 28, },
+ { 0, 0, 1, 6, 7, 28, },
+ { 2, 0, 1, 6, 7, 28, },
+ { 1, 0, 1, 6, 7, 28, },
+ { 0, 0, 1, 6, 8, 28, },
+ { 2, 0, 1, 6, 8, 28, },
+ { 1, 0, 1, 6, 8, 28, },
+ { 0, 0, 1, 6, 9, 28, },
+ { 2, 0, 1, 6, 9, 28, },
+ { 1, 0, 1, 6, 9, 28, },
+ { 0, 0, 1, 6, 10, 28, },
+ { 2, 0, 1, 6, 10, 28, },
+ { 1, 0, 1, 6, 10, 28, },
+ { 0, 0, 1, 6, 11, 24, },
+ { 2, 0, 1, 6, 11, 28, },
+ { 1, 0, 1, 6, 11, 28, },
+ { 0, 0, 1, 6, 12, 14, },
+ { 2, 0, 1, 6, 12, 28, },
+ { 1, 0, 1, 6, 12, 28, },
+ { 0, 0, 1, 6, 13, 8, },
+ { 2, 0, 1, 6, 13, 28, },
+ { 1, 0, 1, 6, 13, 28, },
+ { 0, 0, 1, 6, 14, 63, },
+ { 2, 0, 1, 6, 14, 63, },
+ { 1, 0, 1, 6, 14, 63, },
+ { 0, 0, 1, 7, 1, 63, },
+ { 2, 0, 1, 7, 1, 63, },
+ { 1, 0, 1, 7, 1, 63, },
+ { 0, 0, 1, 7, 2, 63, },
+ { 2, 0, 1, 7, 2, 63, },
+ { 1, 0, 1, 7, 2, 63, },
+ { 0, 0, 1, 7, 3, 22, },
+ { 2, 0, 1, 7, 3, 26, },
+ { 1, 0, 1, 7, 3, 26, },
+ { 0, 0, 1, 7, 4, 26, },
+ { 2, 0, 1, 7, 4, 26, },
+ { 1, 0, 1, 7, 4, 26, },
+ { 0, 0, 1, 7, 5, 26, },
+ { 2, 0, 1, 7, 5, 26, },
+ { 1, 0, 1, 7, 5, 26, },
+ { 0, 0, 1, 7, 6, 26, },
+ { 2, 0, 1, 7, 6, 26, },
+ { 1, 0, 1, 7, 6, 26, },
+ { 0, 0, 1, 7, 7, 26, },
+ { 2, 0, 1, 7, 7, 26, },
+ { 1, 0, 1, 7, 7, 26, },
+ { 0, 0, 1, 7, 8, 26, },
+ { 2, 0, 1, 7, 8, 26, },
+ { 1, 0, 1, 7, 8, 26, },
+ { 0, 0, 1, 7, 9, 26, },
+ { 2, 0, 1, 7, 9, 26, },
+ { 1, 0, 1, 7, 9, 26, },
+ { 0, 0, 1, 7, 10, 26, },
+ { 2, 0, 1, 7, 10, 26, },
+ { 1, 0, 1, 7, 10, 26, },
+ { 0, 0, 1, 7, 11, 22, },
+ { 2, 0, 1, 7, 11, 26, },
+ { 1, 0, 1, 7, 11, 26, },
+ { 0, 0, 1, 7, 12, 14, },
+ { 2, 0, 1, 7, 12, 26, },
+ { 1, 0, 1, 7, 12, 26, },
+ { 0, 0, 1, 7, 13, 8, },
+ { 2, 0, 1, 7, 13, 26, },
+ { 1, 0, 1, 7, 13, 26, },
+ { 0, 0, 1, 7, 14, 63, },
+ { 2, 0, 1, 7, 14, 63, },
+ { 1, 0, 1, 7, 14, 63, },
+ { 0, 1, 0, 1, 36, 28, },
+ { 2, 1, 0, 1, 36, 32, },
+ { 1, 1, 0, 1, 36, 32, },
+ { 0, 1, 0, 1, 40, 32, },
+ { 2, 1, 0, 1, 40, 32, },
+ { 1, 1, 0, 1, 40, 32, },
+ { 0, 1, 0, 1, 44, 32, },
+ { 2, 1, 0, 1, 44, 32, },
+ { 1, 1, 0, 1, 44, 32, },
+ { 0, 1, 0, 1, 48, 32, },
+ { 2, 1, 0, 1, 48, 32, },
+ { 1, 1, 0, 1, 48, 32, },
+ { 0, 1, 0, 1, 52, 32, },
+ { 2, 1, 0, 1, 52, 32, },
+ { 1, 1, 0, 1, 52, 32, },
+ { 0, 1, 0, 1, 56, 32, },
+ { 2, 1, 0, 1, 56, 32, },
+ { 1, 1, 0, 1, 56, 32, },
+ { 0, 1, 0, 1, 60, 32, },
+ { 2, 1, 0, 1, 60, 32, },
+ { 1, 1, 0, 1, 60, 32, },
+ { 0, 1, 0, 1, 64, 30, },
+ { 2, 1, 0, 1, 64, 32, },
+ { 1, 1, 0, 1, 64, 32, },
+ { 0, 1, 0, 1, 100, 28, },
+ { 2, 1, 0, 1, 100, 32, },
+ { 1, 1, 0, 1, 100, 32, },
+ { 0, 1, 0, 1, 104, 32, },
+ { 2, 1, 0, 1, 104, 32, },
+ { 1, 1, 0, 1, 104, 32, },
+ { 0, 1, 0, 1, 108, 32, },
+ { 2, 1, 0, 1, 108, 32, },
+ { 1, 1, 0, 1, 108, 32, },
+ { 0, 1, 0, 1, 112, 32, },
+ { 2, 1, 0, 1, 112, 32, },
+ { 1, 1, 0, 1, 112, 32, },
+ { 0, 1, 0, 1, 116, 32, },
+ { 2, 1, 0, 1, 116, 32, },
+ { 1, 1, 0, 1, 116, 32, },
+ { 0, 1, 0, 1, 120, 32, },
+ { 2, 1, 0, 1, 120, 32, },
+ { 1, 1, 0, 1, 120, 32, },
+ { 0, 1, 0, 1, 124, 32, },
+ { 2, 1, 0, 1, 124, 32, },
+ { 1, 1, 0, 1, 124, 32, },
+ { 0, 1, 0, 1, 128, 32, },
+ { 2, 1, 0, 1, 128, 32, },
+ { 1, 1, 0, 1, 128, 32, },
+ { 0, 1, 0, 1, 132, 32, },
+ { 2, 1, 0, 1, 132, 32, },
+ { 1, 1, 0, 1, 132, 32, },
+ { 0, 1, 0, 1, 136, 32, },
+ { 2, 1, 0, 1, 136, 32, },
+ { 1, 1, 0, 1, 136, 32, },
+ { 0, 1, 0, 1, 140, 28, },
+ { 2, 1, 0, 1, 140, 32, },
+ { 1, 1, 0, 1, 140, 32, },
+ { 0, 1, 0, 1, 149, 28, },
+ { 2, 1, 0, 1, 149, 32, },
+ { 1, 1, 0, 1, 149, 63, },
+ { 0, 1, 0, 1, 153, 32, },
+ { 2, 1, 0, 1, 153, 32, },
+ { 1, 1, 0, 1, 153, 63, },
+ { 0, 1, 0, 1, 157, 32, },
+ { 2, 1, 0, 1, 157, 32, },
+ { 1, 1, 0, 1, 157, 63, },
+ { 0, 1, 0, 1, 161, 32, },
+ { 2, 1, 0, 1, 161, 32, },
+ { 1, 1, 0, 1, 161, 63, },
+ { 0, 1, 0, 1, 165, 32, },
+ { 2, 1, 0, 1, 165, 32, },
+ { 1, 1, 0, 1, 165, 63, },
+ { 0, 1, 0, 2, 36, 28, },
+ { 2, 1, 0, 2, 36, 32, },
+ { 1, 1, 0, 2, 36, 32, },
+ { 0, 1, 0, 2, 40, 32, },
+ { 2, 1, 0, 2, 40, 32, },
+ { 1, 1, 0, 2, 40, 32, },
+ { 0, 1, 0, 2, 44, 32, },
+ { 2, 1, 0, 2, 44, 32, },
+ { 1, 1, 0, 2, 44, 32, },
+ { 0, 1, 0, 2, 48, 32, },
+ { 2, 1, 0, 2, 48, 32, },
+ { 1, 1, 0, 2, 48, 32, },
+ { 0, 1, 0, 2, 52, 32, },
+ { 2, 1, 0, 2, 52, 32, },
+ { 1, 1, 0, 2, 52, 32, },
+ { 0, 1, 0, 2, 56, 32, },
+ { 2, 1, 0, 2, 56, 32, },
+ { 1, 1, 0, 2, 56, 32, },
+ { 0, 1, 0, 2, 60, 32, },
+ { 2, 1, 0, 2, 60, 32, },
+ { 1, 1, 0, 2, 60, 32, },
+ { 0, 1, 0, 2, 64, 30, },
+ { 2, 1, 0, 2, 64, 32, },
+ { 1, 1, 0, 2, 64, 32, },
+ { 0, 1, 0, 2, 100, 28, },
+ { 2, 1, 0, 2, 100, 32, },
+ { 1, 1, 0, 2, 100, 32, },
+ { 0, 1, 0, 2, 104, 32, },
+ { 2, 1, 0, 2, 104, 32, },
+ { 1, 1, 0, 2, 104, 32, },
+ { 0, 1, 0, 2, 108, 32, },
+ { 2, 1, 0, 2, 108, 32, },
+ { 1, 1, 0, 2, 108, 32, },
+ { 0, 1, 0, 2, 112, 32, },
+ { 2, 1, 0, 2, 112, 32, },
+ { 1, 1, 0, 2, 112, 32, },
+ { 0, 1, 0, 2, 116, 32, },
+ { 2, 1, 0, 2, 116, 32, },
+ { 1, 1, 0, 2, 116, 32, },
+ { 0, 1, 0, 2, 120, 32, },
+ { 2, 1, 0, 2, 120, 32, },
+ { 1, 1, 0, 2, 120, 32, },
+ { 0, 1, 0, 2, 124, 32, },
+ { 2, 1, 0, 2, 124, 32, },
+ { 1, 1, 0, 2, 124, 32, },
+ { 0, 1, 0, 2, 128, 32, },
+ { 2, 1, 0, 2, 128, 32, },
+ { 1, 1, 0, 2, 128, 32, },
+ { 0, 1, 0, 2, 132, 32, },
+ { 2, 1, 0, 2, 132, 32, },
+ { 1, 1, 0, 2, 132, 32, },
+ { 0, 1, 0, 2, 136, 32, },
+ { 2, 1, 0, 2, 136, 32, },
+ { 1, 1, 0, 2, 136, 32, },
+ { 0, 1, 0, 2, 140, 28, },
+ { 2, 1, 0, 2, 140, 32, },
+ { 1, 1, 0, 2, 140, 32, },
+ { 0, 1, 0, 2, 149, 28, },
+ { 2, 1, 0, 2, 149, 32, },
+ { 1, 1, 0, 2, 149, 63, },
+ { 0, 1, 0, 2, 153, 32, },
+ { 2, 1, 0, 2, 153, 32, },
+ { 1, 1, 0, 2, 153, 63, },
+ { 0, 1, 0, 2, 157, 32, },
+ { 2, 1, 0, 2, 157, 32, },
+ { 1, 1, 0, 2, 157, 63, },
+ { 0, 1, 0, 2, 161, 32, },
+ { 2, 1, 0, 2, 161, 32, },
+ { 1, 1, 0, 2, 161, 63, },
+ { 0, 1, 0, 2, 165, 32, },
+ { 2, 1, 0, 2, 165, 32, },
+ { 1, 1, 0, 2, 165, 63, },
+ { 0, 1, 0, 3, 36, 26, },
+ { 2, 1, 0, 3, 36, 30, },
+ { 1, 1, 0, 3, 36, 30, },
+ { 0, 1, 0, 3, 40, 30, },
+ { 2, 1, 0, 3, 40, 30, },
+ { 1, 1, 0, 3, 40, 30, },
+ { 0, 1, 0, 3, 44, 30, },
+ { 2, 1, 0, 3, 44, 30, },
+ { 1, 1, 0, 3, 44, 30, },
+ { 0, 1, 0, 3, 48, 30, },
+ { 2, 1, 0, 3, 48, 30, },
+ { 1, 1, 0, 3, 48, 30, },
+ { 0, 1, 0, 3, 52, 30, },
+ { 2, 1, 0, 3, 52, 30, },
+ { 1, 1, 0, 3, 52, 30, },
+ { 0, 1, 0, 3, 56, 30, },
+ { 2, 1, 0, 3, 56, 30, },
+ { 1, 1, 0, 3, 56, 30, },
+ { 0, 1, 0, 3, 60, 30, },
+ { 2, 1, 0, 3, 60, 30, },
+ { 1, 1, 0, 3, 60, 30, },
+ { 0, 1, 0, 3, 64, 28, },
+ { 2, 1, 0, 3, 64, 30, },
+ { 1, 1, 0, 3, 64, 30, },
+ { 0, 1, 0, 3, 100, 28, },
+ { 2, 1, 0, 3, 100, 30, },
+ { 1, 1, 0, 3, 100, 30, },
+ { 0, 1, 0, 3, 104, 30, },
+ { 2, 1, 0, 3, 104, 30, },
+ { 1, 1, 0, 3, 104, 30, },
+ { 0, 1, 0, 3, 108, 30, },
+ { 2, 1, 0, 3, 108, 30, },
+ { 1, 1, 0, 3, 108, 30, },
+ { 0, 1, 0, 3, 112, 30, },
+ { 2, 1, 0, 3, 112, 30, },
+ { 1, 1, 0, 3, 112, 30, },
+ { 0, 1, 0, 3, 116, 30, },
+ { 2, 1, 0, 3, 116, 30, },
+ { 1, 1, 0, 3, 116, 30, },
+ { 0, 1, 0, 3, 120, 30, },
+ { 2, 1, 0, 3, 120, 30, },
+ { 1, 1, 0, 3, 120, 30, },
+ { 0, 1, 0, 3, 124, 30, },
+ { 2, 1, 0, 3, 124, 30, },
+ { 1, 1, 0, 3, 124, 30, },
+ { 0, 1, 0, 3, 128, 30, },
+ { 2, 1, 0, 3, 128, 30, },
+ { 1, 1, 0, 3, 128, 30, },
+ { 0, 1, 0, 3, 132, 30, },
+ { 2, 1, 0, 3, 132, 30, },
+ { 1, 1, 0, 3, 132, 30, },
+ { 0, 1, 0, 3, 136, 30, },
+ { 2, 1, 0, 3, 136, 30, },
+ { 1, 1, 0, 3, 136, 30, },
+ { 0, 1, 0, 3, 140, 26, },
+ { 2, 1, 0, 3, 140, 30, },
+ { 1, 1, 0, 3, 140, 30, },
+ { 0, 1, 0, 3, 149, 26, },
+ { 2, 1, 0, 3, 149, 30, },
+ { 1, 1, 0, 3, 149, 63, },
+ { 0, 1, 0, 3, 153, 30, },
+ { 2, 1, 0, 3, 153, 30, },
+ { 1, 1, 0, 3, 153, 63, },
+ { 0, 1, 0, 3, 157, 30, },
+ { 2, 1, 0, 3, 157, 30, },
+ { 1, 1, 0, 3, 157, 63, },
+ { 0, 1, 0, 3, 161, 30, },
+ { 2, 1, 0, 3, 161, 30, },
+ { 1, 1, 0, 3, 161, 63, },
+ { 0, 1, 0, 3, 165, 30, },
+ { 2, 1, 0, 3, 165, 30, },
+ { 1, 1, 0, 3, 165, 63, },
+ { 0, 1, 0, 6, 36, 24, },
+ { 2, 1, 0, 6, 36, 28, },
+ { 1, 1, 0, 6, 36, 28, },
+ { 0, 1, 0, 6, 40, 28, },
+ { 2, 1, 0, 6, 40, 28, },
+ { 1, 1, 0, 6, 40, 28, },
+ { 0, 1, 0, 6, 44, 28, },
+ { 2, 1, 0, 6, 44, 28, },
+ { 1, 1, 0, 6, 44, 28, },
+ { 0, 1, 0, 6, 48, 28, },
+ { 2, 1, 0, 6, 48, 28, },
+ { 1, 1, 0, 6, 48, 28, },
+ { 0, 1, 0, 6, 52, 28, },
+ { 2, 1, 0, 6, 52, 28, },
+ { 1, 1, 0, 6, 52, 28, },
+ { 0, 1, 0, 6, 56, 28, },
+ { 2, 1, 0, 6, 56, 28, },
+ { 1, 1, 0, 6, 56, 28, },
+ { 0, 1, 0, 6, 60, 28, },
+ { 2, 1, 0, 6, 60, 28, },
+ { 1, 1, 0, 6, 60, 28, },
+ { 0, 1, 0, 6, 64, 26, },
+ { 2, 1, 0, 6, 64, 28, },
+ { 1, 1, 0, 6, 64, 28, },
+ { 0, 1, 0, 6, 100, 24, },
+ { 2, 1, 0, 6, 100, 28, },
+ { 1, 1, 0, 6, 100, 28, },
+ { 0, 1, 0, 6, 104, 28, },
+ { 2, 1, 0, 6, 104, 28, },
+ { 1, 1, 0, 6, 104, 28, },
+ { 0, 1, 0, 6, 108, 28, },
+ { 2, 1, 0, 6, 108, 28, },
+ { 1, 1, 0, 6, 108, 28, },
+ { 0, 1, 0, 6, 112, 28, },
+ { 2, 1, 0, 6, 112, 28, },
+ { 1, 1, 0, 6, 112, 28, },
+ { 0, 1, 0, 6, 116, 28, },
+ { 2, 1, 0, 6, 116, 28, },
+ { 1, 1, 0, 6, 116, 28, },
+ { 0, 1, 0, 6, 120, 28, },
+ { 2, 1, 0, 6, 120, 28, },
+ { 1, 1, 0, 6, 120, 28, },
+ { 0, 1, 0, 6, 124, 28, },
+ { 2, 1, 0, 6, 124, 28, },
+ { 1, 1, 0, 6, 124, 28, },
+ { 0, 1, 0, 6, 128, 28, },
+ { 2, 1, 0, 6, 128, 28, },
+ { 1, 1, 0, 6, 128, 28, },
+ { 0, 1, 0, 6, 132, 28, },
+ { 2, 1, 0, 6, 132, 28, },
+ { 1, 1, 0, 6, 132, 28, },
+ { 0, 1, 0, 6, 136, 28, },
+ { 2, 1, 0, 6, 136, 28, },
+ { 1, 1, 0, 6, 136, 28, },
+ { 0, 1, 0, 6, 140, 24, },
+ { 2, 1, 0, 6, 140, 28, },
+ { 1, 1, 0, 6, 140, 28, },
+ { 0, 1, 0, 6, 149, 24, },
+ { 2, 1, 0, 6, 149, 28, },
+ { 1, 1, 0, 6, 149, 63, },
+ { 0, 1, 0, 6, 153, 28, },
+ { 2, 1, 0, 6, 153, 28, },
+ { 1, 1, 0, 6, 153, 63, },
+ { 0, 1, 0, 6, 157, 28, },
+ { 2, 1, 0, 6, 157, 28, },
+ { 1, 1, 0, 6, 157, 63, },
+ { 0, 1, 0, 6, 161, 28, },
+ { 2, 1, 0, 6, 161, 28, },
+ { 1, 1, 0, 6, 161, 63, },
+ { 0, 1, 0, 6, 165, 28, },
+ { 2, 1, 0, 6, 165, 28, },
+ { 1, 1, 0, 6, 165, 63, },
+ { 0, 1, 0, 7, 36, 22, },
+ { 2, 1, 0, 7, 36, 26, },
+ { 1, 1, 0, 7, 36, 26, },
+ { 0, 1, 0, 7, 40, 26, },
+ { 2, 1, 0, 7, 40, 26, },
+ { 1, 1, 0, 7, 40, 26, },
+ { 0, 1, 0, 7, 44, 26, },
+ { 2, 1, 0, 7, 44, 26, },
+ { 1, 1, 0, 7, 44, 26, },
+ { 0, 1, 0, 7, 48, 26, },
+ { 2, 1, 0, 7, 48, 26, },
+ { 1, 1, 0, 7, 48, 26, },
+ { 0, 1, 0, 7, 52, 26, },
+ { 2, 1, 0, 7, 52, 26, },
+ { 1, 1, 0, 7, 52, 26, },
+ { 0, 1, 0, 7, 56, 26, },
+ { 2, 1, 0, 7, 56, 26, },
+ { 1, 1, 0, 7, 56, 26, },
+ { 0, 1, 0, 7, 60, 26, },
+ { 2, 1, 0, 7, 60, 26, },
+ { 1, 1, 0, 7, 60, 26, },
+ { 0, 1, 0, 7, 64, 24, },
+ { 2, 1, 0, 7, 64, 26, },
+ { 1, 1, 0, 7, 64, 26, },
+ { 0, 1, 0, 7, 100, 22, },
+ { 2, 1, 0, 7, 100, 26, },
+ { 1, 1, 0, 7, 100, 26, },
+ { 0, 1, 0, 7, 104, 26, },
+ { 2, 1, 0, 7, 104, 26, },
+ { 1, 1, 0, 7, 104, 26, },
+ { 0, 1, 0, 7, 108, 26, },
+ { 2, 1, 0, 7, 108, 26, },
+ { 1, 1, 0, 7, 108, 26, },
+ { 0, 1, 0, 7, 112, 26, },
+ { 2, 1, 0, 7, 112, 26, },
+ { 1, 1, 0, 7, 112, 26, },
+ { 0, 1, 0, 7, 116, 26, },
+ { 2, 1, 0, 7, 116, 26, },
+ { 1, 1, 0, 7, 116, 26, },
+ { 0, 1, 0, 7, 120, 26, },
+ { 2, 1, 0, 7, 120, 26, },
+ { 1, 1, 0, 7, 120, 26, },
+ { 0, 1, 0, 7, 124, 26, },
+ { 2, 1, 0, 7, 124, 26, },
+ { 1, 1, 0, 7, 124, 26, },
+ { 0, 1, 0, 7, 128, 26, },
+ { 2, 1, 0, 7, 128, 26, },
+ { 1, 1, 0, 7, 128, 26, },
+ { 0, 1, 0, 7, 132, 26, },
+ { 2, 1, 0, 7, 132, 26, },
+ { 1, 1, 0, 7, 132, 26, },
+ { 0, 1, 0, 7, 136, 26, },
+ { 2, 1, 0, 7, 136, 26, },
+ { 1, 1, 0, 7, 136, 26, },
+ { 0, 1, 0, 7, 140, 22, },
+ { 2, 1, 0, 7, 140, 26, },
+ { 1, 1, 0, 7, 140, 26, },
+ { 0, 1, 0, 7, 149, 22, },
+ { 2, 1, 0, 7, 149, 26, },
+ { 1, 1, 0, 7, 149, 63, },
+ { 0, 1, 0, 7, 153, 26, },
+ { 2, 1, 0, 7, 153, 26, },
+ { 1, 1, 0, 7, 153, 63, },
+ { 0, 1, 0, 7, 157, 26, },
+ { 2, 1, 0, 7, 157, 26, },
+ { 1, 1, 0, 7, 157, 63, },
+ { 0, 1, 0, 7, 161, 26, },
+ { 2, 1, 0, 7, 161, 26, },
+ { 1, 1, 0, 7, 161, 63, },
+ { 0, 1, 0, 7, 165, 26, },
+ { 2, 1, 0, 7, 165, 26, },
+ { 1, 1, 0, 7, 165, 63, },
+ { 0, 1, 1, 2, 38, 28, },
+ { 2, 1, 1, 2, 38, 32, },
+ { 1, 1, 1, 2, 38, 32, },
+ { 0, 1, 1, 2, 46, 32, },
+ { 2, 1, 1, 2, 46, 32, },
+ { 1, 1, 1, 2, 46, 32, },
+ { 0, 1, 1, 2, 54, 32, },
+ { 2, 1, 1, 2, 54, 32, },
+ { 1, 1, 1, 2, 54, 32, },
+ { 0, 1, 1, 2, 62, 28, },
+ { 2, 1, 1, 2, 62, 32, },
+ { 1, 1, 1, 2, 62, 32, },
+ { 0, 1, 1, 2, 102, 28, },
+ { 2, 1, 1, 2, 102, 32, },
+ { 1, 1, 1, 2, 102, 32, },
+ { 0, 1, 1, 2, 110, 32, },
+ { 2, 1, 1, 2, 110, 32, },
+ { 1, 1, 1, 2, 110, 32, },
+ { 0, 1, 1, 2, 118, 32, },
+ { 2, 1, 1, 2, 118, 32, },
+ { 1, 1, 1, 2, 118, 32, },
+ { 0, 1, 1, 2, 126, 32, },
+ { 2, 1, 1, 2, 126, 32, },
+ { 1, 1, 1, 2, 126, 32, },
+ { 0, 1, 1, 2, 134, 30, },
+ { 2, 1, 1, 2, 134, 32, },
+ { 1, 1, 1, 2, 134, 32, },
+ { 0, 1, 1, 2, 151, 28, },
+ { 2, 1, 1, 2, 151, 32, },
+ { 1, 1, 1, 2, 151, 63, },
+ { 0, 1, 1, 2, 159, 32, },
+ { 2, 1, 1, 2, 159, 32, },
+ { 1, 1, 1, 2, 159, 63, },
+ { 0, 1, 1, 3, 38, 26, },
+ { 2, 1, 1, 3, 38, 30, },
+ { 1, 1, 1, 3, 38, 30, },
+ { 0, 1, 1, 3, 46, 30, },
+ { 2, 1, 1, 3, 46, 30, },
+ { 1, 1, 1, 3, 46, 30, },
+ { 0, 1, 1, 3, 54, 30, },
+ { 2, 1, 1, 3, 54, 30, },
+ { 1, 1, 1, 3, 54, 30, },
+ { 0, 1, 1, 3, 62, 26, },
+ { 2, 1, 1, 3, 62, 30, },
+ { 1, 1, 1, 3, 62, 30, },
+ { 0, 1, 1, 3, 102, 26, },
+ { 2, 1, 1, 3, 102, 30, },
+ { 1, 1, 1, 3, 102, 30, },
+ { 0, 1, 1, 3, 110, 30, },
+ { 2, 1, 1, 3, 110, 30, },
+ { 1, 1, 1, 3, 110, 30, },
+ { 0, 1, 1, 3, 118, 30, },
+ { 2, 1, 1, 3, 118, 30, },
+ { 1, 1, 1, 3, 118, 30, },
+ { 0, 1, 1, 3, 126, 30, },
+ { 2, 1, 1, 3, 126, 30, },
+ { 1, 1, 1, 3, 126, 30, },
+ { 0, 1, 1, 3, 134, 28, },
+ { 2, 1, 1, 3, 134, 30, },
+ { 1, 1, 1, 3, 134, 30, },
+ { 0, 1, 1, 3, 151, 26, },
+ { 2, 1, 1, 3, 151, 30, },
+ { 1, 1, 1, 3, 151, 63, },
+ { 0, 1, 1, 3, 159, 30, },
+ { 2, 1, 1, 3, 159, 30, },
+ { 1, 1, 1, 3, 159, 63, },
+ { 0, 1, 1, 6, 38, 20, },
+ { 2, 1, 1, 6, 38, 28, },
+ { 1, 1, 1, 6, 38, 28, },
+ { 0, 1, 1, 6, 46, 28, },
+ { 2, 1, 1, 6, 46, 28, },
+ { 1, 1, 1, 6, 46, 28, },
+ { 0, 1, 1, 6, 54, 28, },
+ { 2, 1, 1, 6, 54, 28, },
+ { 1, 1, 1, 6, 54, 28, },
+ { 0, 1, 1, 6, 62, 20, },
+ { 2, 1, 1, 6, 62, 28, },
+ { 1, 1, 1, 6, 62, 28, },
+ { 0, 1, 1, 6, 102, 22, },
+ { 2, 1, 1, 6, 102, 28, },
+ { 1, 1, 1, 6, 102, 28, },
+ { 0, 1, 1, 6, 110, 28, },
+ { 2, 1, 1, 6, 110, 28, },
+ { 1, 1, 1, 6, 110, 28, },
+ { 0, 1, 1, 6, 118, 28, },
+ { 2, 1, 1, 6, 118, 28, },
+ { 1, 1, 1, 6, 118, 28, },
+ { 0, 1, 1, 6, 126, 28, },
+ { 2, 1, 1, 6, 126, 28, },
+ { 1, 1, 1, 6, 126, 28, },
+ { 0, 1, 1, 6, 134, 26, },
+ { 2, 1, 1, 6, 134, 28, },
+ { 1, 1, 1, 6, 134, 28, },
+ { 0, 1, 1, 6, 151, 22, },
+ { 2, 1, 1, 6, 151, 28, },
+ { 1, 1, 1, 6, 151, 63, },
+ { 0, 1, 1, 6, 159, 28, },
+ { 2, 1, 1, 6, 159, 28, },
+ { 1, 1, 1, 6, 159, 63, },
+ { 0, 1, 1, 7, 38, 18, },
+ { 2, 1, 1, 7, 38, 26, },
+ { 1, 1, 1, 7, 38, 26, },
+ { 0, 1, 1, 7, 46, 26, },
+ { 2, 1, 1, 7, 46, 26, },
+ { 1, 1, 1, 7, 46, 26, },
+ { 0, 1, 1, 7, 54, 26, },
+ { 2, 1, 1, 7, 54, 26, },
+ { 1, 1, 1, 7, 54, 26, },
+ { 0, 1, 1, 7, 62, 18, },
+ { 2, 1, 1, 7, 62, 26, },
+ { 1, 1, 1, 7, 62, 26, },
+ { 0, 1, 1, 7, 102, 20, },
+ { 2, 1, 1, 7, 102, 26, },
+ { 1, 1, 1, 7, 102, 26, },
+ { 0, 1, 1, 7, 110, 26, },
+ { 2, 1, 1, 7, 110, 26, },
+ { 1, 1, 1, 7, 110, 26, },
+ { 0, 1, 1, 7, 118, 26, },
+ { 2, 1, 1, 7, 118, 26, },
+ { 1, 1, 1, 7, 118, 26, },
+ { 0, 1, 1, 7, 126, 26, },
+ { 2, 1, 1, 7, 126, 26, },
+ { 1, 1, 1, 7, 126, 26, },
+ { 0, 1, 1, 7, 134, 24, },
+ { 2, 1, 1, 7, 134, 26, },
+ { 1, 1, 1, 7, 134, 26, },
+ { 0, 1, 1, 7, 151, 20, },
+ { 2, 1, 1, 7, 151, 26, },
+ { 1, 1, 1, 7, 151, 63, },
+ { 0, 1, 1, 7, 159, 26, },
+ { 2, 1, 1, 7, 159, 26, },
+ { 1, 1, 1, 7, 159, 63, },
+ { 0, 1, 2, 4, 42, 24, },
+ { 2, 1, 2, 4, 42, 32, },
+ { 1, 1, 2, 4, 42, 32, },
+ { 0, 1, 2, 4, 58, 24, },
+ { 2, 1, 2, 4, 58, 32, },
+ { 1, 1, 2, 4, 58, 32, },
+ { 0, 1, 2, 4, 106, 24, },
+ { 2, 1, 2, 4, 106, 32, },
+ { 1, 1, 2, 4, 106, 32, },
+ { 0, 1, 2, 4, 122, 32, },
+ { 2, 1, 2, 4, 122, 32, },
+ { 1, 1, 2, 4, 122, 32, },
+ { 0, 1, 2, 4, 155, 26, },
+ { 2, 1, 2, 4, 155, 32, },
+ { 1, 1, 2, 4, 155, 63, },
+ { 0, 1, 2, 5, 42, 22, },
+ { 2, 1, 2, 5, 42, 30, },
+ { 1, 1, 2, 5, 42, 30, },
+ { 0, 1, 2, 5, 58, 22, },
+ { 2, 1, 2, 5, 58, 30, },
+ { 1, 1, 2, 5, 58, 30, },
+ { 0, 1, 2, 5, 106, 22, },
+ { 2, 1, 2, 5, 106, 30, },
+ { 1, 1, 2, 5, 106, 30, },
+ { 0, 1, 2, 5, 122, 30, },
+ { 2, 1, 2, 5, 122, 30, },
+ { 1, 1, 2, 5, 122, 30, },
+ { 0, 1, 2, 5, 155, 24, },
+ { 2, 1, 2, 5, 155, 30, },
+ { 1, 1, 2, 5, 155, 63, },
+ { 0, 1, 2, 8, 42, 20, },
+ { 2, 1, 2, 8, 42, 28, },
+ { 1, 1, 2, 8, 42, 28, },
+ { 0, 1, 2, 8, 58, 20, },
+ { 2, 1, 2, 8, 58, 28, },
+ { 1, 1, 2, 8, 58, 28, },
+ { 0, 1, 2, 8, 106, 20, },
+ { 2, 1, 2, 8, 106, 28, },
+ { 1, 1, 2, 8, 106, 28, },
+ { 0, 1, 2, 8, 122, 28, },
+ { 2, 1, 2, 8, 122, 28, },
+ { 1, 1, 2, 8, 122, 28, },
+ { 0, 1, 2, 8, 155, 20, },
+ { 2, 1, 2, 8, 155, 28, },
+ { 1, 1, 2, 8, 155, 63, },
+ { 0, 1, 2, 9, 42, 18, },
+ { 2, 1, 2, 9, 42, 26, },
+ { 1, 1, 2, 9, 42, 26, },
+ { 0, 1, 2, 9, 58, 18, },
+ { 2, 1, 2, 9, 58, 26, },
+ { 1, 1, 2, 9, 58, 26, },
+ { 0, 1, 2, 9, 106, 18, },
+ { 2, 1, 2, 9, 106, 26, },
+ { 1, 1, 2, 9, 106, 26, },
+ { 0, 1, 2, 9, 122, 26, },
+ { 2, 1, 2, 9, 122, 26, },
+ { 1, 1, 2, 9, 122, 26, },
+ { 0, 1, 2, 9, 155, 18, },
+ { 2, 1, 2, 9, 155, 26, },
+ { 1, 1, 2, 9, 155, 63, },
+};
+
+RTW_DECL_TABLE_TXPWR_LMT(rtw8814a_txpwr_lmt_type1);
+
+static const struct rtw_txpwr_lmt_cfg_pair rtw8814a_txpwr_lmt_type2[] = {
+ { 0, 0, 0, 0, 1, 42, },
+ { 2, 0, 0, 0, 1, 42, },
+ { 1, 0, 0, 0, 1, 42, },
+ { 0, 0, 0, 0, 2, 50, },
+ { 2, 0, 0, 0, 2, 42, },
+ { 1, 0, 0, 0, 2, 42, },
+ { 0, 0, 0, 0, 3, 50, },
+ { 2, 0, 0, 0, 3, 42, },
+ { 1, 0, 0, 0, 3, 42, },
+ { 0, 0, 0, 0, 4, 50, },
+ { 2, 0, 0, 0, 4, 42, },
+ { 1, 0, 0, 0, 4, 42, },
+ { 0, 0, 0, 0, 5, 50, },
+ { 2, 0, 0, 0, 5, 42, },
+ { 1, 0, 0, 0, 5, 42, },
+ { 0, 0, 0, 0, 6, 50, },
+ { 2, 0, 0, 0, 6, 42, },
+ { 1, 0, 0, 0, 6, 42, },
+ { 0, 0, 0, 0, 7, 50, },
+ { 2, 0, 0, 0, 7, 42, },
+ { 1, 0, 0, 0, 7, 42, },
+ { 0, 0, 0, 0, 8, 50, },
+ { 2, 0, 0, 0, 8, 42, },
+ { 1, 0, 0, 0, 8, 42, },
+ { 0, 0, 0, 0, 9, 50, },
+ { 2, 0, 0, 0, 9, 42, },
+ { 1, 0, 0, 0, 9, 42, },
+ { 0, 0, 0, 0, 10, 50, },
+ { 2, 0, 0, 0, 10, 42, },
+ { 1, 0, 0, 0, 10, 42, },
+ { 0, 0, 0, 0, 11, 44, },
+ { 2, 0, 0, 0, 11, 42, },
+ { 1, 0, 0, 0, 11, 42, },
+ { 0, 0, 0, 0, 12, 63, },
+ { 2, 0, 0, 0, 12, 42, },
+ { 1, 0, 0, 0, 12, 42, },
+ { 0, 0, 0, 0, 13, 63, },
+ { 2, 0, 0, 0, 13, 42, },
+ { 1, 0, 0, 0, 13, 42, },
+ { 0, 0, 0, 0, 14, 63, },
+ { 2, 0, 0, 0, 14, 63, },
+ { 1, 0, 0, 0, 14, 42, },
+ { 0, 0, 0, 1, 1, 32, },
+ { 2, 0, 0, 1, 1, 42, },
+ { 1, 0, 0, 1, 1, 42, },
+ { 0, 0, 0, 1, 2, 42, },
+ { 2, 0, 0, 1, 2, 42, },
+ { 1, 0, 0, 1, 2, 42, },
+ { 0, 0, 0, 1, 3, 42, },
+ { 2, 0, 0, 1, 3, 42, },
+ { 1, 0, 0, 1, 3, 42, },
+ { 0, 0, 0, 1, 4, 42, },
+ { 2, 0, 0, 1, 4, 42, },
+ { 1, 0, 0, 1, 4, 42, },
+ { 0, 0, 0, 1, 5, 42, },
+ { 2, 0, 0, 1, 5, 42, },
+ { 1, 0, 0, 1, 5, 42, },
+ { 0, 0, 0, 1, 6, 42, },
+ { 2, 0, 0, 1, 6, 42, },
+ { 1, 0, 0, 1, 6, 42, },
+ { 0, 0, 0, 1, 7, 42, },
+ { 2, 0, 0, 1, 7, 42, },
+ { 1, 0, 0, 1, 7, 42, },
+ { 0, 0, 0, 1, 8, 42, },
+ { 2, 0, 0, 1, 8, 42, },
+ { 1, 0, 0, 1, 8, 42, },
+ { 0, 0, 0, 1, 9, 42, },
+ { 2, 0, 0, 1, 9, 42, },
+ { 1, 0, 0, 1, 9, 42, },
+ { 0, 0, 0, 1, 10, 42, },
+ { 2, 0, 0, 1, 10, 42, },
+ { 1, 0, 0, 1, 10, 42, },
+ { 0, 0, 0, 1, 11, 32, },
+ { 2, 0, 0, 1, 11, 42, },
+ { 1, 0, 0, 1, 11, 42, },
+ { 0, 0, 0, 1, 12, 63, },
+ { 2, 0, 0, 1, 12, 42, },
+ { 1, 0, 0, 1, 12, 42, },
+ { 0, 0, 0, 1, 13, 63, },
+ { 2, 0, 0, 1, 13, 42, },
+ { 1, 0, 0, 1, 13, 42, },
+ { 0, 0, 0, 1, 14, 63, },
+ { 2, 0, 0, 1, 14, 63, },
+ { 1, 0, 0, 1, 14, 63, },
+ { 0, 0, 0, 2, 1, 32, },
+ { 2, 0, 0, 2, 1, 42, },
+ { 1, 0, 0, 2, 1, 42, },
+ { 0, 0, 0, 2, 2, 40, },
+ { 2, 0, 0, 2, 2, 42, },
+ { 1, 0, 0, 2, 2, 42, },
+ { 0, 0, 0, 2, 3, 40, },
+ { 2, 0, 0, 2, 3, 42, },
+ { 1, 0, 0, 2, 3, 42, },
+ { 0, 0, 0, 2, 4, 40, },
+ { 2, 0, 0, 2, 4, 42, },
+ { 1, 0, 0, 2, 4, 42, },
+ { 0, 0, 0, 2, 5, 40, },
+ { 2, 0, 0, 2, 5, 42, },
+ { 1, 0, 0, 2, 5, 42, },
+ { 0, 0, 0, 2, 6, 40, },
+ { 2, 0, 0, 2, 6, 42, },
+ { 1, 0, 0, 2, 6, 42, },
+ { 0, 0, 0, 2, 7, 40, },
+ { 2, 0, 0, 2, 7, 42, },
+ { 1, 0, 0, 2, 7, 42, },
+ { 0, 0, 0, 2, 8, 40, },
+ { 2, 0, 0, 2, 8, 42, },
+ { 1, 0, 0, 2, 8, 42, },
+ { 0, 0, 0, 2, 9, 40, },
+ { 2, 0, 0, 2, 9, 42, },
+ { 1, 0, 0, 2, 9, 42, },
+ { 0, 0, 0, 2, 10, 40, },
+ { 2, 0, 0, 2, 10, 42, },
+ { 1, 0, 0, 2, 10, 42, },
+ { 0, 0, 0, 2, 11, 28, },
+ { 2, 0, 0, 2, 11, 42, },
+ { 1, 0, 0, 2, 11, 42, },
+ { 0, 0, 0, 2, 12, 63, },
+ { 2, 0, 0, 2, 12, 42, },
+ { 1, 0, 0, 2, 12, 42, },
+ { 0, 0, 0, 2, 13, 63, },
+ { 2, 0, 0, 2, 13, 42, },
+ { 1, 0, 0, 2, 13, 42, },
+ { 0, 0, 0, 2, 14, 63, },
+ { 2, 0, 0, 2, 14, 63, },
+ { 1, 0, 0, 2, 14, 63, },
+ { 0, 0, 0, 3, 1, 32, },
+ { 2, 0, 0, 3, 1, 40, },
+ { 1, 0, 0, 3, 1, 40, },
+ { 0, 0, 0, 3, 2, 40, },
+ { 2, 0, 0, 3, 2, 40, },
+ { 1, 0, 0, 3, 2, 40, },
+ { 0, 0, 0, 3, 3, 40, },
+ { 2, 0, 0, 3, 3, 40, },
+ { 1, 0, 0, 3, 3, 40, },
+ { 0, 0, 0, 3, 4, 40, },
+ { 2, 0, 0, 3, 4, 40, },
+ { 1, 0, 0, 3, 4, 40, },
+ { 0, 0, 0, 3, 5, 40, },
+ { 2, 0, 0, 3, 5, 40, },
+ { 1, 0, 0, 3, 5, 40, },
+ { 0, 0, 0, 3, 6, 40, },
+ { 2, 0, 0, 3, 6, 40, },
+ { 1, 0, 0, 3, 6, 40, },
+ { 0, 0, 0, 3, 7, 40, },
+ { 2, 0, 0, 3, 7, 40, },
+ { 1, 0, 0, 3, 7, 40, },
+ { 0, 0, 0, 3, 8, 40, },
+ { 2, 0, 0, 3, 8, 40, },
+ { 1, 0, 0, 3, 8, 40, },
+ { 0, 0, 0, 3, 9, 40, },
+ { 2, 0, 0, 3, 9, 40, },
+ { 1, 0, 0, 3, 9, 40, },
+ { 0, 0, 0, 3, 10, 40, },
+ { 2, 0, 0, 3, 10, 40, },
+ { 1, 0, 0, 3, 10, 40, },
+ { 0, 0, 0, 3, 11, 28, },
+ { 2, 0, 0, 3, 11, 40, },
+ { 1, 0, 0, 3, 11, 40, },
+ { 0, 0, 0, 3, 12, 63, },
+ { 2, 0, 0, 3, 12, 40, },
+ { 1, 0, 0, 3, 12, 40, },
+ { 0, 0, 0, 3, 13, 63, },
+ { 2, 0, 0, 3, 13, 40, },
+ { 1, 0, 0, 3, 13, 40, },
+ { 0, 0, 0, 3, 14, 63, },
+ { 2, 0, 0, 3, 14, 63, },
+ { 1, 0, 0, 3, 14, 63, },
+ { 0, 0, 0, 6, 1, 32, },
+ { 2, 0, 0, 6, 1, 40, },
+ { 1, 0, 0, 6, 1, 40, },
+ { 0, 0, 0, 6, 2, 40, },
+ { 2, 0, 0, 6, 2, 40, },
+ { 1, 0, 0, 6, 2, 40, },
+ { 0, 0, 0, 6, 3, 40, },
+ { 2, 0, 0, 6, 3, 40, },
+ { 1, 0, 0, 6, 3, 40, },
+ { 0, 0, 0, 6, 4, 40, },
+ { 2, 0, 0, 6, 4, 40, },
+ { 1, 0, 0, 6, 4, 40, },
+ { 0, 0, 0, 6, 5, 40, },
+ { 2, 0, 0, 6, 5, 40, },
+ { 1, 0, 0, 6, 5, 40, },
+ { 0, 0, 0, 6, 6, 40, },
+ { 2, 0, 0, 6, 6, 40, },
+ { 1, 0, 0, 6, 6, 40, },
+ { 0, 0, 0, 6, 7, 40, },
+ { 2, 0, 0, 6, 7, 40, },
+ { 1, 0, 0, 6, 7, 40, },
+ { 0, 0, 0, 6, 8, 40, },
+ { 2, 0, 0, 6, 8, 40, },
+ { 1, 0, 0, 6, 8, 40, },
+ { 0, 0, 0, 6, 9, 40, },
+ { 2, 0, 0, 6, 9, 40, },
+ { 1, 0, 0, 6, 9, 40, },
+ { 0, 0, 0, 6, 10, 40, },
+ { 2, 0, 0, 6, 10, 40, },
+ { 1, 0, 0, 6, 10, 40, },
+ { 0, 0, 0, 6, 11, 28, },
+ { 2, 0, 0, 6, 11, 40, },
+ { 1, 0, 0, 6, 11, 40, },
+ { 0, 0, 0, 6, 12, 63, },
+ { 2, 0, 0, 6, 12, 40, },
+ { 1, 0, 0, 6, 12, 40, },
+ { 0, 0, 0, 6, 13, 63, },
+ { 2, 0, 0, 6, 13, 40, },
+ { 1, 0, 0, 6, 13, 40, },
+ { 0, 0, 0, 6, 14, 63, },
+ { 2, 0, 0, 6, 14, 63, },
+ { 1, 0, 0, 6, 14, 63, },
+ { 0, 0, 0, 7, 1, 32, },
+ { 2, 0, 0, 7, 1, 40, },
+ { 1, 0, 0, 7, 1, 40, },
+ { 0, 0, 0, 7, 2, 40, },
+ { 2, 0, 0, 7, 2, 40, },
+ { 1, 0, 0, 7, 2, 40, },
+ { 0, 0, 0, 7, 3, 40, },
+ { 2, 0, 0, 7, 3, 40, },
+ { 1, 0, 0, 7, 3, 40, },
+ { 0, 0, 0, 7, 4, 40, },
+ { 2, 0, 0, 7, 4, 40, },
+ { 1, 0, 0, 7, 4, 40, },
+ { 0, 0, 0, 7, 5, 40, },
+ { 2, 0, 0, 7, 5, 40, },
+ { 1, 0, 0, 7, 5, 40, },
+ { 0, 0, 0, 7, 6, 40, },
+ { 2, 0, 0, 7, 6, 40, },
+ { 1, 0, 0, 7, 6, 40, },
+ { 0, 0, 0, 7, 7, 40, },
+ { 2, 0, 0, 7, 7, 40, },
+ { 1, 0, 0, 7, 7, 40, },
+ { 0, 0, 0, 7, 8, 40, },
+ { 2, 0, 0, 7, 8, 40, },
+ { 1, 0, 0, 7, 8, 40, },
+ { 0, 0, 0, 7, 9, 40, },
+ { 2, 0, 0, 7, 9, 40, },
+ { 1, 0, 0, 7, 9, 40, },
+ { 0, 0, 0, 7, 10, 40, },
+ { 2, 0, 0, 7, 10, 40, },
+ { 1, 0, 0, 7, 10, 40, },
+ { 0, 0, 0, 7, 11, 28, },
+ { 2, 0, 0, 7, 11, 40, },
+ { 1, 0, 0, 7, 11, 40, },
+ { 0, 0, 0, 7, 12, 63, },
+ { 2, 0, 0, 7, 12, 40, },
+ { 1, 0, 0, 7, 12, 40, },
+ { 0, 0, 0, 7, 13, 63, },
+ { 2, 0, 0, 7, 13, 40, },
+ { 1, 0, 0, 7, 13, 40, },
+ { 0, 0, 0, 7, 14, 63, },
+ { 2, 0, 0, 7, 14, 63, },
+ { 1, 0, 0, 7, 14, 63, },
+ { 0, 0, 1, 2, 1, 63, },
+ { 2, 0, 1, 2, 1, 63, },
+ { 1, 0, 1, 2, 1, 63, },
+ { 0, 0, 1, 2, 2, 63, },
+ { 2, 0, 1, 2, 2, 63, },
+ { 1, 0, 1, 2, 2, 63, },
+ { 0, 0, 1, 2, 3, 30, },
+ { 2, 0, 1, 2, 3, 34, },
+ { 1, 0, 1, 2, 3, 34, },
+ { 0, 0, 1, 2, 4, 34, },
+ { 2, 0, 1, 2, 4, 34, },
+ { 1, 0, 1, 2, 4, 34, },
+ { 0, 0, 1, 2, 5, 34, },
+ { 2, 0, 1, 2, 5, 34, },
+ { 1, 0, 1, 2, 5, 34, },
+ { 0, 0, 1, 2, 6, 34, },
+ { 2, 0, 1, 2, 6, 34, },
+ { 1, 0, 1, 2, 6, 34, },
+ { 0, 0, 1, 2, 7, 34, },
+ { 2, 0, 1, 2, 7, 34, },
+ { 1, 0, 1, 2, 7, 34, },
+ { 0, 0, 1, 2, 8, 34, },
+ { 2, 0, 1, 2, 8, 34, },
+ { 1, 0, 1, 2, 8, 34, },
+ { 0, 0, 1, 2, 9, 34, },
+ { 2, 0, 1, 2, 9, 34, },
+ { 1, 0, 1, 2, 9, 34, },
+ { 0, 0, 1, 2, 10, 34, },
+ { 2, 0, 1, 2, 10, 34, },
+ { 1, 0, 1, 2, 10, 34, },
+ { 0, 0, 1, 2, 11, 28, },
+ { 2, 0, 1, 2, 11, 34, },
+ { 1, 0, 1, 2, 11, 34, },
+ { 0, 0, 1, 2, 12, 63, },
+ { 2, 0, 1, 2, 12, 34, },
+ { 1, 0, 1, 2, 12, 34, },
+ { 0, 0, 1, 2, 13, 63, },
+ { 2, 0, 1, 2, 13, 34, },
+ { 1, 0, 1, 2, 13, 34, },
+ { 0, 0, 1, 2, 14, 63, },
+ { 2, 0, 1, 2, 14, 63, },
+ { 1, 0, 1, 2, 14, 63, },
+ { 0, 0, 1, 3, 1, 63, },
+ { 2, 0, 1, 3, 1, 63, },
+ { 1, 0, 1, 3, 1, 63, },
+ { 0, 0, 1, 3, 2, 63, },
+ { 2, 0, 1, 3, 2, 63, },
+ { 1, 0, 1, 3, 2, 63, },
+ { 0, 0, 1, 3, 3, 30, },
+ { 2, 0, 1, 3, 3, 34, },
+ { 1, 0, 1, 3, 3, 34, },
+ { 0, 0, 1, 3, 4, 34, },
+ { 2, 0, 1, 3, 4, 34, },
+ { 1, 0, 1, 3, 4, 34, },
+ { 0, 0, 1, 3, 5, 34, },
+ { 2, 0, 1, 3, 5, 34, },
+ { 1, 0, 1, 3, 5, 34, },
+ { 0, 0, 1, 3, 6, 34, },
+ { 2, 0, 1, 3, 6, 34, },
+ { 1, 0, 1, 3, 6, 34, },
+ { 0, 0, 1, 3, 7, 34, },
+ { 2, 0, 1, 3, 7, 34, },
+ { 1, 0, 1, 3, 7, 34, },
+ { 0, 0, 1, 3, 8, 34, },
+ { 2, 0, 1, 3, 8, 34, },
+ { 1, 0, 1, 3, 8, 34, },
+ { 0, 0, 1, 3, 9, 34, },
+ { 2, 0, 1, 3, 9, 34, },
+ { 1, 0, 1, 3, 9, 34, },
+ { 0, 0, 1, 3, 10, 34, },
+ { 2, 0, 1, 3, 10, 34, },
+ { 1, 0, 1, 3, 10, 34, },
+ { 0, 0, 1, 3, 11, 28, },
+ { 2, 0, 1, 3, 11, 34, },
+ { 1, 0, 1, 3, 11, 34, },
+ { 0, 0, 1, 3, 12, 63, },
+ { 2, 0, 1, 3, 12, 34, },
+ { 1, 0, 1, 3, 12, 34, },
+ { 0, 0, 1, 3, 13, 63, },
+ { 2, 0, 1, 3, 13, 34, },
+ { 1, 0, 1, 3, 13, 34, },
+ { 0, 0, 1, 3, 14, 63, },
+ { 2, 0, 1, 3, 14, 63, },
+ { 1, 0, 1, 3, 14, 63, },
+ { 0, 0, 1, 6, 1, 63, },
+ { 2, 0, 1, 6, 1, 63, },
+ { 1, 0, 1, 6, 1, 63, },
+ { 0, 0, 1, 6, 2, 63, },
+ { 2, 0, 1, 6, 2, 63, },
+ { 1, 0, 1, 6, 2, 63, },
+ { 0, 0, 1, 6, 3, 30, },
+ { 2, 0, 1, 6, 3, 34, },
+ { 1, 0, 1, 6, 3, 34, },
+ { 0, 0, 1, 6, 4, 34, },
+ { 2, 0, 1, 6, 4, 34, },
+ { 1, 0, 1, 6, 4, 34, },
+ { 0, 0, 1, 6, 5, 34, },
+ { 2, 0, 1, 6, 5, 34, },
+ { 1, 0, 1, 6, 5, 34, },
+ { 0, 0, 1, 6, 6, 34, },
+ { 2, 0, 1, 6, 6, 34, },
+ { 1, 0, 1, 6, 6, 34, },
+ { 0, 0, 1, 6, 7, 34, },
+ { 2, 0, 1, 6, 7, 34, },
+ { 1, 0, 1, 6, 7, 34, },
+ { 0, 0, 1, 6, 8, 34, },
+ { 2, 0, 1, 6, 8, 34, },
+ { 1, 0, 1, 6, 8, 34, },
+ { 0, 0, 1, 6, 9, 34, },
+ { 2, 0, 1, 6, 9, 34, },
+ { 1, 0, 1, 6, 9, 34, },
+ { 0, 0, 1, 6, 10, 34, },
+ { 2, 0, 1, 6, 10, 34, },
+ { 1, 0, 1, 6, 10, 34, },
+ { 0, 0, 1, 6, 11, 28, },
+ { 2, 0, 1, 6, 11, 34, },
+ { 1, 0, 1, 6, 11, 34, },
+ { 0, 0, 1, 6, 12, 63, },
+ { 2, 0, 1, 6, 12, 34, },
+ { 1, 0, 1, 6, 12, 34, },
+ { 0, 0, 1, 6, 13, 63, },
+ { 2, 0, 1, 6, 13, 34, },
+ { 1, 0, 1, 6, 13, 34, },
+ { 0, 0, 1, 6, 14, 63, },
+ { 2, 0, 1, 6, 14, 63, },
+ { 1, 0, 1, 6, 14, 63, },
+ { 0, 0, 1, 7, 1, 63, },
+ { 2, 0, 1, 7, 1, 63, },
+ { 1, 0, 1, 7, 1, 63, },
+ { 0, 0, 1, 7, 2, 63, },
+ { 2, 0, 1, 7, 2, 63, },
+ { 1, 0, 1, 7, 2, 63, },
+ { 0, 0, 1, 7, 3, 30, },
+ { 2, 0, 1, 7, 3, 34, },
+ { 1, 0, 1, 7, 3, 34, },
+ { 0, 0, 1, 7, 4, 34, },
+ { 2, 0, 1, 7, 4, 34, },
+ { 1, 0, 1, 7, 4, 34, },
+ { 0, 0, 1, 7, 5, 34, },
+ { 2, 0, 1, 7, 5, 34, },
+ { 1, 0, 1, 7, 5, 34, },
+ { 0, 0, 1, 7, 6, 34, },
+ { 2, 0, 1, 7, 6, 34, },
+ { 1, 0, 1, 7, 6, 34, },
+ { 0, 0, 1, 7, 7, 34, },
+ { 2, 0, 1, 7, 7, 34, },
+ { 1, 0, 1, 7, 7, 34, },
+ { 0, 0, 1, 7, 8, 34, },
+ { 2, 0, 1, 7, 8, 34, },
+ { 1, 0, 1, 7, 8, 34, },
+ { 0, 0, 1, 7, 9, 34, },
+ { 2, 0, 1, 7, 9, 34, },
+ { 1, 0, 1, 7, 9, 34, },
+ { 0, 0, 1, 7, 10, 34, },
+ { 2, 0, 1, 7, 10, 34, },
+ { 1, 0, 1, 7, 10, 34, },
+ { 0, 0, 1, 7, 11, 28, },
+ { 2, 0, 1, 7, 11, 34, },
+ { 1, 0, 1, 7, 11, 34, },
+ { 0, 0, 1, 7, 12, 63, },
+ { 2, 0, 1, 7, 12, 34, },
+ { 1, 0, 1, 7, 12, 34, },
+ { 0, 0, 1, 7, 13, 63, },
+ { 2, 0, 1, 7, 13, 34, },
+ { 1, 0, 1, 7, 13, 34, },
+ { 0, 0, 1, 7, 14, 63, },
+ { 2, 0, 1, 7, 14, 63, },
+ { 1, 0, 1, 7, 14, 63, },
+ { 0, 1, 0, 1, 36, 42, },
+ { 2, 1, 0, 1, 36, 42, },
+ { 1, 1, 0, 1, 36, 42, },
+ { 0, 1, 0, 1, 40, 42, },
+ { 2, 1, 0, 1, 40, 42, },
+ { 1, 1, 0, 1, 40, 42, },
+ { 0, 1, 0, 1, 44, 42, },
+ { 2, 1, 0, 1, 44, 42, },
+ { 1, 1, 0, 1, 44, 42, },
+ { 0, 1, 0, 1, 48, 42, },
+ { 2, 1, 0, 1, 48, 42, },
+ { 1, 1, 0, 1, 48, 42, },
+ { 0, 1, 0, 1, 52, 42, },
+ { 2, 1, 0, 1, 52, 42, },
+ { 1, 1, 0, 1, 52, 42, },
+ { 0, 1, 0, 1, 56, 42, },
+ { 2, 1, 0, 1, 56, 42, },
+ { 1, 1, 0, 1, 56, 42, },
+ { 0, 1, 0, 1, 60, 42, },
+ { 2, 1, 0, 1, 60, 42, },
+ { 1, 1, 0, 1, 60, 42, },
+ { 0, 1, 0, 1, 64, 42, },
+ { 2, 1, 0, 1, 64, 42, },
+ { 1, 1, 0, 1, 64, 42, },
+ { 0, 1, 0, 1, 100, 42, },
+ { 2, 1, 0, 1, 100, 42, },
+ { 1, 1, 0, 1, 100, 42, },
+ { 0, 1, 0, 1, 104, 42, },
+ { 2, 1, 0, 1, 104, 42, },
+ { 1, 1, 0, 1, 104, 42, },
+ { 0, 1, 0, 1, 108, 42, },
+ { 2, 1, 0, 1, 108, 42, },
+ { 1, 1, 0, 1, 108, 42, },
+ { 0, 1, 0, 1, 112, 42, },
+ { 2, 1, 0, 1, 112, 42, },
+ { 1, 1, 0, 1, 112, 42, },
+ { 0, 1, 0, 1, 116, 42, },
+ { 2, 1, 0, 1, 116, 42, },
+ { 1, 1, 0, 1, 116, 42, },
+ { 0, 1, 0, 1, 120, 42, },
+ { 2, 1, 0, 1, 120, 42, },
+ { 1, 1, 0, 1, 120, 42, },
+ { 0, 1, 0, 1, 124, 42, },
+ { 2, 1, 0, 1, 124, 42, },
+ { 1, 1, 0, 1, 124, 42, },
+ { 0, 1, 0, 1, 128, 42, },
+ { 2, 1, 0, 1, 128, 42, },
+ { 1, 1, 0, 1, 128, 42, },
+ { 0, 1, 0, 1, 132, 42, },
+ { 2, 1, 0, 1, 132, 42, },
+ { 1, 1, 0, 1, 132, 42, },
+ { 0, 1, 0, 1, 136, 42, },
+ { 2, 1, 0, 1, 136, 42, },
+ { 1, 1, 0, 1, 136, 42, },
+ { 0, 1, 0, 1, 140, 40, },
+ { 2, 1, 0, 1, 140, 40, },
+ { 1, 1, 0, 1, 140, 40, },
+ { 0, 1, 0, 1, 149, 44, },
+ { 2, 1, 0, 1, 149, 44, },
+ { 1, 1, 0, 1, 149, 63, },
+ { 0, 1, 0, 1, 153, 44, },
+ { 2, 1, 0, 1, 153, 44, },
+ { 1, 1, 0, 1, 153, 63, },
+ { 0, 1, 0, 1, 157, 44, },
+ { 2, 1, 0, 1, 157, 44, },
+ { 1, 1, 0, 1, 157, 63, },
+ { 0, 1, 0, 1, 161, 44, },
+ { 2, 1, 0, 1, 161, 44, },
+ { 1, 1, 0, 1, 161, 63, },
+ { 0, 1, 0, 1, 165, 44, },
+ { 2, 1, 0, 1, 165, 44, },
+ { 1, 1, 0, 1, 165, 63, },
+ { 0, 1, 0, 2, 36, 32, },
+ { 2, 1, 0, 2, 36, 32, },
+ { 1, 1, 0, 2, 36, 32, },
+ { 0, 1, 0, 2, 40, 32, },
+ { 2, 1, 0, 2, 40, 32, },
+ { 1, 1, 0, 2, 40, 32, },
+ { 0, 1, 0, 2, 44, 32, },
+ { 2, 1, 0, 2, 44, 32, },
+ { 1, 1, 0, 2, 44, 32, },
+ { 0, 1, 0, 2, 48, 36, },
+ { 2, 1, 0, 2, 48, 36, },
+ { 1, 1, 0, 2, 48, 36, },
+ { 0, 1, 0, 2, 52, 36, },
+ { 2, 1, 0, 2, 52, 36, },
+ { 1, 1, 0, 2, 52, 36, },
+ { 0, 1, 0, 2, 56, 32, },
+ { 2, 1, 0, 2, 56, 32, },
+ { 1, 1, 0, 2, 56, 32, },
+ { 0, 1, 0, 2, 60, 32, },
+ { 2, 1, 0, 2, 60, 32, },
+ { 1, 1, 0, 2, 60, 32, },
+ { 0, 1, 0, 2, 64, 32, },
+ { 2, 1, 0, 2, 64, 32, },
+ { 1, 1, 0, 2, 64, 32, },
+ { 0, 1, 0, 2, 100, 32, },
+ { 2, 1, 0, 2, 100, 32, },
+ { 1, 1, 0, 2, 100, 32, },
+ { 0, 1, 0, 2, 104, 32, },
+ { 2, 1, 0, 2, 104, 32, },
+ { 1, 1, 0, 2, 104, 32, },
+ { 0, 1, 0, 2, 108, 32, },
+ { 2, 1, 0, 2, 108, 32, },
+ { 1, 1, 0, 2, 108, 32, },
+ { 0, 1, 0, 2, 112, 32, },
+ { 2, 1, 0, 2, 112, 32, },
+ { 1, 1, 0, 2, 112, 32, },
+ { 0, 1, 0, 2, 116, 32, },
+ { 2, 1, 0, 2, 116, 32, },
+ { 1, 1, 0, 2, 116, 32, },
+ { 0, 1, 0, 2, 120, 32, },
+ { 2, 1, 0, 2, 120, 32, },
+ { 1, 1, 0, 2, 120, 32, },
+ { 0, 1, 0, 2, 124, 32, },
+ { 2, 1, 0, 2, 124, 32, },
+ { 1, 1, 0, 2, 124, 32, },
+ { 0, 1, 0, 2, 128, 32, },
+ { 2, 1, 0, 2, 128, 32, },
+ { 1, 1, 0, 2, 128, 32, },
+ { 0, 1, 0, 2, 132, 32, },
+ { 2, 1, 0, 2, 132, 32, },
+ { 1, 1, 0, 2, 132, 32, },
+ { 0, 1, 0, 2, 136, 32, },
+ { 2, 1, 0, 2, 136, 32, },
+ { 1, 1, 0, 2, 136, 32, },
+ { 0, 1, 0, 2, 140, 30, },
+ { 2, 1, 0, 2, 140, 30, },
+ { 1, 1, 0, 2, 140, 30, },
+ { 0, 1, 0, 2, 149, 40, },
+ { 2, 1, 0, 2, 149, 40, },
+ { 1, 1, 0, 2, 149, 63, },
+ { 0, 1, 0, 2, 153, 40, },
+ { 2, 1, 0, 2, 153, 40, },
+ { 1, 1, 0, 2, 153, 63, },
+ { 0, 1, 0, 2, 157, 40, },
+ { 2, 1, 0, 2, 157, 40, },
+ { 1, 1, 0, 2, 157, 63, },
+ { 0, 1, 0, 2, 161, 40, },
+ { 2, 1, 0, 2, 161, 40, },
+ { 1, 1, 0, 2, 161, 63, },
+ { 0, 1, 0, 2, 165, 42, },
+ { 2, 1, 0, 2, 165, 42, },
+ { 1, 1, 0, 2, 165, 63, },
+ { 0, 1, 0, 3, 36, 32, },
+ { 2, 1, 0, 3, 36, 32, },
+ { 1, 1, 0, 3, 36, 32, },
+ { 0, 1, 0, 3, 40, 32, },
+ { 2, 1, 0, 3, 40, 32, },
+ { 1, 1, 0, 3, 40, 32, },
+ { 0, 1, 0, 3, 44, 32, },
+ { 2, 1, 0, 3, 44, 32, },
+ { 1, 1, 0, 3, 44, 32, },
+ { 0, 1, 0, 3, 48, 36, },
+ { 2, 1, 0, 3, 48, 36, },
+ { 1, 1, 0, 3, 48, 36, },
+ { 0, 1, 0, 3, 52, 36, },
+ { 2, 1, 0, 3, 52, 36, },
+ { 1, 1, 0, 3, 52, 36, },
+ { 0, 1, 0, 3, 56, 32, },
+ { 2, 1, 0, 3, 56, 32, },
+ { 1, 1, 0, 3, 56, 32, },
+ { 0, 1, 0, 3, 60, 32, },
+ { 2, 1, 0, 3, 60, 32, },
+ { 1, 1, 0, 3, 60, 32, },
+ { 0, 1, 0, 3, 64, 32, },
+ { 2, 1, 0, 3, 64, 32, },
+ { 1, 1, 0, 3, 64, 32, },
+ { 0, 1, 0, 3, 100, 32, },
+ { 2, 1, 0, 3, 100, 32, },
+ { 1, 1, 0, 3, 100, 32, },
+ { 0, 1, 0, 3, 104, 32, },
+ { 2, 1, 0, 3, 104, 32, },
+ { 1, 1, 0, 3, 104, 32, },
+ { 0, 1, 0, 3, 108, 32, },
+ { 2, 1, 0, 3, 108, 32, },
+ { 1, 1, 0, 3, 108, 32, },
+ { 0, 1, 0, 3, 112, 32, },
+ { 2, 1, 0, 3, 112, 32, },
+ { 1, 1, 0, 3, 112, 32, },
+ { 0, 1, 0, 3, 116, 32, },
+ { 2, 1, 0, 3, 116, 32, },
+ { 1, 1, 0, 3, 116, 32, },
+ { 0, 1, 0, 3, 120, 32, },
+ { 2, 1, 0, 3, 120, 32, },
+ { 1, 1, 0, 3, 120, 32, },
+ { 0, 1, 0, 3, 124, 32, },
+ { 2, 1, 0, 3, 124, 32, },
+ { 1, 1, 0, 3, 124, 32, },
+ { 0, 1, 0, 3, 128, 32, },
+ { 2, 1, 0, 3, 128, 32, },
+ { 1, 1, 0, 3, 128, 32, },
+ { 0, 1, 0, 3, 132, 32, },
+ { 2, 1, 0, 3, 132, 32, },
+ { 1, 1, 0, 3, 132, 32, },
+ { 0, 1, 0, 3, 136, 32, },
+ { 2, 1, 0, 3, 136, 32, },
+ { 1, 1, 0, 3, 136, 32, },
+ { 0, 1, 0, 3, 140, 30, },
+ { 2, 1, 0, 3, 140, 30, },
+ { 1, 1, 0, 3, 140, 30, },
+ { 0, 1, 0, 3, 149, 40, },
+ { 2, 1, 0, 3, 149, 40, },
+ { 1, 1, 0, 3, 149, 63, },
+ { 0, 1, 0, 3, 153, 40, },
+ { 2, 1, 0, 3, 153, 40, },
+ { 1, 1, 0, 3, 153, 63, },
+ { 0, 1, 0, 3, 157, 40, },
+ { 2, 1, 0, 3, 157, 40, },
+ { 1, 1, 0, 3, 157, 63, },
+ { 0, 1, 0, 3, 161, 40, },
+ { 2, 1, 0, 3, 161, 40, },
+ { 1, 1, 0, 3, 161, 63, },
+ { 0, 1, 0, 3, 165, 42, },
+ { 2, 1, 0, 3, 165, 42, },
+ { 1, 1, 0, 3, 165, 63, },
+ { 0, 1, 0, 6, 36, 32, },
+ { 2, 1, 0, 6, 36, 32, },
+ { 1, 1, 0, 6, 36, 32, },
+ { 0, 1, 0, 6, 40, 32, },
+ { 2, 1, 0, 6, 40, 32, },
+ { 1, 1, 0, 6, 40, 32, },
+ { 0, 1, 0, 6, 44, 32, },
+ { 2, 1, 0, 6, 44, 32, },
+ { 1, 1, 0, 6, 44, 32, },
+ { 0, 1, 0, 6, 48, 36, },
+ { 2, 1, 0, 6, 48, 36, },
+ { 1, 1, 0, 6, 48, 36, },
+ { 0, 1, 0, 6, 52, 36, },
+ { 2, 1, 0, 6, 52, 36, },
+ { 1, 1, 0, 6, 52, 36, },
+ { 0, 1, 0, 6, 56, 32, },
+ { 2, 1, 0, 6, 56, 32, },
+ { 1, 1, 0, 6, 56, 32, },
+ { 0, 1, 0, 6, 60, 32, },
+ { 2, 1, 0, 6, 60, 32, },
+ { 1, 1, 0, 6, 60, 32, },
+ { 0, 1, 0, 6, 64, 32, },
+ { 2, 1, 0, 6, 64, 32, },
+ { 1, 1, 0, 6, 64, 32, },
+ { 0, 1, 0, 6, 100, 32, },
+ { 2, 1, 0, 6, 100, 32, },
+ { 1, 1, 0, 6, 100, 32, },
+ { 0, 1, 0, 6, 104, 32, },
+ { 2, 1, 0, 6, 104, 32, },
+ { 1, 1, 0, 6, 104, 32, },
+ { 0, 1, 0, 6, 108, 32, },
+ { 2, 1, 0, 6, 108, 32, },
+ { 1, 1, 0, 6, 108, 32, },
+ { 0, 1, 0, 6, 112, 32, },
+ { 2, 1, 0, 6, 112, 32, },
+ { 1, 1, 0, 6, 112, 32, },
+ { 0, 1, 0, 6, 116, 32, },
+ { 2, 1, 0, 6, 116, 32, },
+ { 1, 1, 0, 6, 116, 32, },
+ { 0, 1, 0, 6, 120, 32, },
+ { 2, 1, 0, 6, 120, 32, },
+ { 1, 1, 0, 6, 120, 32, },
+ { 0, 1, 0, 6, 124, 32, },
+ { 2, 1, 0, 6, 124, 32, },
+ { 1, 1, 0, 6, 124, 32, },
+ { 0, 1, 0, 6, 128, 32, },
+ { 2, 1, 0, 6, 128, 32, },
+ { 1, 1, 0, 6, 128, 32, },
+ { 0, 1, 0, 6, 132, 32, },
+ { 2, 1, 0, 6, 132, 32, },
+ { 1, 1, 0, 6, 132, 32, },
+ { 0, 1, 0, 6, 136, 32, },
+ { 2, 1, 0, 6, 136, 32, },
+ { 1, 1, 0, 6, 136, 32, },
+ { 0, 1, 0, 6, 140, 30, },
+ { 2, 1, 0, 6, 140, 30, },
+ { 1, 1, 0, 6, 140, 30, },
+ { 0, 1, 0, 6, 149, 40, },
+ { 2, 1, 0, 6, 149, 40, },
+ { 1, 1, 0, 6, 149, 63, },
+ { 0, 1, 0, 6, 153, 40, },
+ { 2, 1, 0, 6, 153, 40, },
+ { 1, 1, 0, 6, 153, 63, },
+ { 0, 1, 0, 6, 157, 40, },
+ { 2, 1, 0, 6, 157, 40, },
+ { 1, 1, 0, 6, 157, 63, },
+ { 0, 1, 0, 6, 161, 40, },
+ { 2, 1, 0, 6, 161, 40, },
+ { 1, 1, 0, 6, 161, 63, },
+ { 0, 1, 0, 6, 165, 42, },
+ { 2, 1, 0, 6, 165, 42, },
+ { 1, 1, 0, 6, 165, 63, },
+ { 0, 1, 0, 7, 36, 32, },
+ { 2, 1, 0, 7, 36, 32, },
+ { 1, 1, 0, 7, 36, 32, },
+ { 0, 1, 0, 7, 40, 32, },
+ { 2, 1, 0, 7, 40, 32, },
+ { 1, 1, 0, 7, 40, 32, },
+ { 0, 1, 0, 7, 44, 32, },
+ { 2, 1, 0, 7, 44, 32, },
+ { 1, 1, 0, 7, 44, 32, },
+ { 0, 1, 0, 7, 48, 36, },
+ { 2, 1, 0, 7, 48, 36, },
+ { 1, 1, 0, 7, 48, 36, },
+ { 0, 1, 0, 7, 52, 36, },
+ { 2, 1, 0, 7, 52, 36, },
+ { 1, 1, 0, 7, 52, 36, },
+ { 0, 1, 0, 7, 56, 32, },
+ { 2, 1, 0, 7, 56, 32, },
+ { 1, 1, 0, 7, 56, 32, },
+ { 0, 1, 0, 7, 60, 32, },
+ { 2, 1, 0, 7, 60, 32, },
+ { 1, 1, 0, 7, 60, 32, },
+ { 0, 1, 0, 7, 64, 32, },
+ { 2, 1, 0, 7, 64, 32, },
+ { 1, 1, 0, 7, 64, 32, },
+ { 0, 1, 0, 7, 100, 32, },
+ { 2, 1, 0, 7, 100, 32, },
+ { 1, 1, 0, 7, 100, 32, },
+ { 0, 1, 0, 7, 104, 32, },
+ { 2, 1, 0, 7, 104, 32, },
+ { 1, 1, 0, 7, 104, 32, },
+ { 0, 1, 0, 7, 108, 32, },
+ { 2, 1, 0, 7, 108, 32, },
+ { 1, 1, 0, 7, 108, 32, },
+ { 0, 1, 0, 7, 112, 32, },
+ { 2, 1, 0, 7, 112, 32, },
+ { 1, 1, 0, 7, 112, 32, },
+ { 0, 1, 0, 7, 116, 32, },
+ { 2, 1, 0, 7, 116, 32, },
+ { 1, 1, 0, 7, 116, 32, },
+ { 0, 1, 0, 7, 120, 32, },
+ { 2, 1, 0, 7, 120, 32, },
+ { 1, 1, 0, 7, 120, 32, },
+ { 0, 1, 0, 7, 124, 32, },
+ { 2, 1, 0, 7, 124, 32, },
+ { 1, 1, 0, 7, 124, 32, },
+ { 0, 1, 0, 7, 128, 32, },
+ { 2, 1, 0, 7, 128, 32, },
+ { 1, 1, 0, 7, 128, 32, },
+ { 0, 1, 0, 7, 132, 32, },
+ { 2, 1, 0, 7, 132, 32, },
+ { 1, 1, 0, 7, 132, 32, },
+ { 0, 1, 0, 7, 136, 32, },
+ { 2, 1, 0, 7, 136, 32, },
+ { 1, 1, 0, 7, 136, 32, },
+ { 0, 1, 0, 7, 140, 30, },
+ { 2, 1, 0, 7, 140, 30, },
+ { 1, 1, 0, 7, 140, 30, },
+ { 0, 1, 0, 7, 149, 40, },
+ { 2, 1, 0, 7, 149, 40, },
+ { 1, 1, 0, 7, 149, 63, },
+ { 0, 1, 0, 7, 153, 40, },
+ { 2, 1, 0, 7, 153, 40, },
+ { 1, 1, 0, 7, 153, 63, },
+ { 0, 1, 0, 7, 157, 40, },
+ { 2, 1, 0, 7, 157, 40, },
+ { 1, 1, 0, 7, 157, 63, },
+ { 0, 1, 0, 7, 161, 40, },
+ { 2, 1, 0, 7, 161, 40, },
+ { 1, 1, 0, 7, 161, 63, },
+ { 0, 1, 0, 7, 165, 42, },
+ { 2, 1, 0, 7, 165, 42, },
+ { 1, 1, 0, 7, 165, 63, },
+ { 0, 1, 1, 2, 38, 32, },
+ { 2, 1, 1, 2, 38, 32, },
+ { 1, 1, 1, 2, 38, 32, },
+ { 0, 1, 1, 2, 46, 36, },
+ { 2, 1, 1, 2, 46, 36, },
+ { 1, 1, 1, 2, 46, 36, },
+ { 0, 1, 1, 2, 54, 36, },
+ { 2, 1, 1, 2, 54, 36, },
+ { 1, 1, 1, 2, 54, 36, },
+ { 0, 1, 1, 2, 62, 32, },
+ { 2, 1, 1, 2, 62, 32, },
+ { 1, 1, 1, 2, 62, 32, },
+ { 0, 1, 1, 2, 102, 30, },
+ { 2, 1, 1, 2, 102, 30, },
+ { 1, 1, 1, 2, 102, 30, },
+ { 0, 1, 1, 2, 110, 32, },
+ { 2, 1, 1, 2, 110, 32, },
+ { 1, 1, 1, 2, 110, 32, },
+ { 0, 1, 1, 2, 118, 32, },
+ { 2, 1, 1, 2, 118, 32, },
+ { 1, 1, 1, 2, 118, 32, },
+ { 0, 1, 1, 2, 126, 32, },
+ { 2, 1, 1, 2, 126, 32, },
+ { 1, 1, 1, 2, 126, 32, },
+ { 0, 1, 1, 2, 134, 36, },
+ { 2, 1, 1, 2, 134, 36, },
+ { 1, 1, 1, 2, 134, 36, },
+ { 0, 1, 1, 2, 151, 36, },
+ { 2, 1, 1, 2, 151, 36, },
+ { 1, 1, 1, 2, 151, 63, },
+ { 0, 1, 1, 2, 159, 40, },
+ { 2, 1, 1, 2, 159, 40, },
+ { 1, 1, 1, 2, 159, 63, },
+ { 0, 1, 1, 3, 38, 32, },
+ { 2, 1, 1, 3, 38, 32, },
+ { 1, 1, 1, 3, 38, 32, },
+ { 0, 1, 1, 3, 46, 36, },
+ { 2, 1, 1, 3, 46, 36, },
+ { 1, 1, 1, 3, 46, 36, },
+ { 0, 1, 1, 3, 54, 36, },
+ { 2, 1, 1, 3, 54, 36, },
+ { 1, 1, 1, 3, 54, 36, },
+ { 0, 1, 1, 3, 62, 32, },
+ { 2, 1, 1, 3, 62, 32, },
+ { 1, 1, 1, 3, 62, 32, },
+ { 0, 1, 1, 3, 102, 30, },
+ { 2, 1, 1, 3, 102, 30, },
+ { 1, 1, 1, 3, 102, 30, },
+ { 0, 1, 1, 3, 110, 32, },
+ { 2, 1, 1, 3, 110, 32, },
+ { 1, 1, 1, 3, 110, 32, },
+ { 0, 1, 1, 3, 118, 32, },
+ { 2, 1, 1, 3, 118, 32, },
+ { 1, 1, 1, 3, 118, 32, },
+ { 0, 1, 1, 3, 126, 32, },
+ { 2, 1, 1, 3, 126, 32, },
+ { 1, 1, 1, 3, 126, 32, },
+ { 0, 1, 1, 3, 134, 36, },
+ { 2, 1, 1, 3, 134, 36, },
+ { 1, 1, 1, 3, 134, 36, },
+ { 0, 1, 1, 3, 151, 36, },
+ { 2, 1, 1, 3, 151, 36, },
+ { 1, 1, 1, 3, 151, 63, },
+ { 0, 1, 1, 3, 159, 40, },
+ { 2, 1, 1, 3, 159, 40, },
+ { 1, 1, 1, 3, 159, 63, },
+ { 0, 1, 1, 6, 38, 32, },
+ { 2, 1, 1, 6, 38, 32, },
+ { 1, 1, 1, 6, 38, 32, },
+ { 0, 1, 1, 6, 46, 36, },
+ { 2, 1, 1, 6, 46, 36, },
+ { 1, 1, 1, 6, 46, 36, },
+ { 0, 1, 1, 6, 54, 36, },
+ { 2, 1, 1, 6, 54, 36, },
+ { 1, 1, 1, 6, 54, 36, },
+ { 0, 1, 1, 6, 62, 32, },
+ { 2, 1, 1, 6, 62, 32, },
+ { 1, 1, 1, 6, 62, 32, },
+ { 0, 1, 1, 6, 102, 30, },
+ { 2, 1, 1, 6, 102, 30, },
+ { 1, 1, 1, 6, 102, 30, },
+ { 0, 1, 1, 6, 110, 32, },
+ { 2, 1, 1, 6, 110, 32, },
+ { 1, 1, 1, 6, 110, 32, },
+ { 0, 1, 1, 6, 118, 32, },
+ { 2, 1, 1, 6, 118, 32, },
+ { 1, 1, 1, 6, 118, 32, },
+ { 0, 1, 1, 6, 126, 32, },
+ { 2, 1, 1, 6, 126, 32, },
+ { 1, 1, 1, 6, 126, 32, },
+ { 0, 1, 1, 6, 134, 36, },
+ { 2, 1, 1, 6, 134, 36, },
+ { 1, 1, 1, 6, 134, 36, },
+ { 0, 1, 1, 6, 151, 36, },
+ { 2, 1, 1, 6, 151, 36, },
+ { 1, 1, 1, 6, 151, 63, },
+ { 0, 1, 1, 6, 159, 40, },
+ { 2, 1, 1, 6, 159, 40, },
+ { 1, 1, 1, 6, 159, 63, },
+ { 0, 1, 1, 7, 38, 32, },
+ { 2, 1, 1, 7, 38, 32, },
+ { 1, 1, 1, 7, 38, 32, },
+ { 0, 1, 1, 7, 46, 36, },
+ { 2, 1, 1, 7, 46, 36, },
+ { 1, 1, 1, 7, 46, 36, },
+ { 0, 1, 1, 7, 54, 36, },
+ { 2, 1, 1, 7, 54, 36, },
+ { 1, 1, 1, 7, 54, 36, },
+ { 0, 1, 1, 7, 62, 32, },
+ { 2, 1, 1, 7, 62, 32, },
+ { 1, 1, 1, 7, 62, 32, },
+ { 0, 1, 1, 7, 102, 30, },
+ { 2, 1, 1, 7, 102, 30, },
+ { 1, 1, 1, 7, 102, 30, },
+ { 0, 1, 1, 7, 110, 32, },
+ { 2, 1, 1, 7, 110, 32, },
+ { 1, 1, 1, 7, 110, 32, },
+ { 0, 1, 1, 7, 118, 32, },
+ { 2, 1, 1, 7, 118, 32, },
+ { 1, 1, 1, 7, 118, 32, },
+ { 0, 1, 1, 7, 126, 32, },
+ { 2, 1, 1, 7, 126, 32, },
+ { 1, 1, 1, 7, 126, 32, },
+ { 0, 1, 1, 7, 134, 36, },
+ { 2, 1, 1, 7, 134, 36, },
+ { 1, 1, 1, 7, 134, 36, },
+ { 0, 1, 1, 7, 151, 36, },
+ { 2, 1, 1, 7, 151, 36, },
+ { 1, 1, 1, 7, 151, 63, },
+ { 0, 1, 1, 7, 159, 40, },
+ { 2, 1, 1, 7, 159, 40, },
+ { 1, 1, 1, 7, 159, 63, },
+ { 0, 1, 2, 4, 42, 34, },
+ { 2, 1, 2, 4, 42, 34, },
+ { 1, 1, 2, 4, 42, 34, },
+ { 0, 1, 2, 4, 58, 34, },
+ { 2, 1, 2, 4, 58, 34, },
+ { 1, 1, 2, 4, 58, 34, },
+ { 0, 1, 2, 4, 106, 32, },
+ { 2, 1, 2, 4, 106, 32, },
+ { 1, 1, 2, 4, 106, 32, },
+ { 0, 1, 2, 4, 122, 34, },
+ { 2, 1, 2, 4, 122, 34, },
+ { 1, 1, 2, 4, 122, 34, },
+ { 0, 1, 2, 4, 155, 34, },
+ { 2, 1, 2, 4, 155, 34, },
+ { 1, 1, 2, 4, 155, 63, },
+ { 0, 1, 2, 5, 42, 34, },
+ { 2, 1, 2, 5, 42, 34, },
+ { 1, 1, 2, 5, 42, 34, },
+ { 0, 1, 2, 5, 58, 34, },
+ { 2, 1, 2, 5, 58, 34, },
+ { 1, 1, 2, 5, 58, 34, },
+ { 0, 1, 2, 5, 106, 32, },
+ { 2, 1, 2, 5, 106, 32, },
+ { 1, 1, 2, 5, 106, 32, },
+ { 0, 1, 2, 5, 122, 34, },
+ { 2, 1, 2, 5, 122, 34, },
+ { 1, 1, 2, 5, 122, 34, },
+ { 0, 1, 2, 5, 155, 34, },
+ { 2, 1, 2, 5, 155, 34, },
+ { 1, 1, 2, 5, 155, 63, },
+ { 0, 1, 2, 8, 42, 34, },
+ { 2, 1, 2, 8, 42, 34, },
+ { 1, 1, 2, 8, 42, 34, },
+ { 0, 1, 2, 8, 58, 34, },
+ { 2, 1, 2, 8, 58, 34, },
+ { 1, 1, 2, 8, 58, 34, },
+ { 0, 1, 2, 8, 106, 32, },
+ { 2, 1, 2, 8, 106, 32, },
+ { 1, 1, 2, 8, 106, 32, },
+ { 0, 1, 2, 8, 122, 34, },
+ { 2, 1, 2, 8, 122, 34, },
+ { 1, 1, 2, 8, 122, 34, },
+ { 0, 1, 2, 8, 155, 34, },
+ { 2, 1, 2, 8, 155, 34, },
+ { 1, 1, 2, 8, 155, 63, },
+ { 0, 1, 2, 9, 42, 34, },
+ { 2, 1, 2, 9, 42, 34, },
+ { 1, 1, 2, 9, 42, 34, },
+ { 0, 1, 2, 9, 58, 34, },
+ { 2, 1, 2, 9, 58, 34, },
+ { 1, 1, 2, 9, 58, 34, },
+ { 0, 1, 2, 9, 106, 32, },
+ { 2, 1, 2, 9, 106, 32, },
+ { 1, 1, 2, 9, 106, 32, },
+ { 0, 1, 2, 9, 122, 34, },
+ { 2, 1, 2, 9, 122, 34, },
+ { 1, 1, 2, 9, 122, 34, },
+ { 0, 1, 2, 9, 155, 34, },
+ { 2, 1, 2, 9, 155, 34, },
+ { 1, 1, 2, 9, 155, 63, },
+};
+
+RTW_DECL_TABLE_TXPWR_LMT(rtw8814a_txpwr_lmt_type2);
+
+static const struct rtw_txpwr_lmt_cfg_pair rtw8814a_txpwr_lmt_type3[] = {
+ { 0, 0, 0, 0, 1, 46, },
+ { 2, 0, 0, 0, 1, 40, },
+ { 1, 0, 0, 0, 1, 40, },
+ { 0, 0, 0, 0, 2, 46, },
+ { 2, 0, 0, 0, 2, 40, },
+ { 1, 0, 0, 0, 2, 40, },
+ { 0, 0, 0, 0, 3, 46, },
+ { 2, 0, 0, 0, 3, 40, },
+ { 1, 0, 0, 0, 3, 40, },
+ { 0, 0, 0, 0, 4, 46, },
+ { 2, 0, 0, 0, 4, 40, },
+ { 1, 0, 0, 0, 4, 40, },
+ { 0, 0, 0, 0, 5, 46, },
+ { 2, 0, 0, 0, 5, 40, },
+ { 1, 0, 0, 0, 5, 40, },
+ { 0, 0, 0, 0, 6, 46, },
+ { 2, 0, 0, 0, 6, 40, },
+ { 1, 0, 0, 0, 6, 40, },
+ { 0, 0, 0, 0, 7, 46, },
+ { 2, 0, 0, 0, 7, 40, },
+ { 1, 0, 0, 0, 7, 40, },
+ { 0, 0, 0, 0, 8, 46, },
+ { 2, 0, 0, 0, 8, 40, },
+ { 1, 0, 0, 0, 8, 40, },
+ { 0, 0, 0, 0, 9, 46, },
+ { 2, 0, 0, 0, 9, 40, },
+ { 1, 0, 0, 0, 9, 40, },
+ { 0, 0, 0, 0, 10, 46, },
+ { 2, 0, 0, 0, 10, 40, },
+ { 1, 0, 0, 0, 10, 40, },
+ { 0, 0, 0, 0, 11, 46, },
+ { 2, 0, 0, 0, 11, 40, },
+ { 1, 0, 0, 0, 11, 40, },
+ { 0, 0, 0, 0, 12, 63, },
+ { 2, 0, 0, 0, 12, 40, },
+ { 1, 0, 0, 0, 12, 40, },
+ { 0, 0, 0, 0, 13, 63, },
+ { 2, 0, 0, 0, 13, 40, },
+ { 1, 0, 0, 0, 13, 40, },
+ { 0, 0, 0, 0, 14, 63, },
+ { 2, 0, 0, 0, 14, 63, },
+ { 1, 0, 0, 0, 14, 40, },
+ { 0, 0, 0, 1, 1, 46, },
+ { 2, 0, 0, 1, 1, 40, },
+ { 1, 0, 0, 1, 1, 40, },
+ { 0, 0, 0, 1, 2, 46, },
+ { 2, 0, 0, 1, 2, 40, },
+ { 1, 0, 0, 1, 2, 40, },
+ { 0, 0, 0, 1, 3, 46, },
+ { 2, 0, 0, 1, 3, 40, },
+ { 1, 0, 0, 1, 3, 40, },
+ { 0, 0, 0, 1, 4, 46, },
+ { 2, 0, 0, 1, 4, 40, },
+ { 1, 0, 0, 1, 4, 40, },
+ { 0, 0, 0, 1, 5, 46, },
+ { 2, 0, 0, 1, 5, 40, },
+ { 1, 0, 0, 1, 5, 40, },
+ { 0, 0, 0, 1, 6, 46, },
+ { 2, 0, 0, 1, 6, 40, },
+ { 1, 0, 0, 1, 6, 40, },
+ { 0, 0, 0, 1, 7, 46, },
+ { 2, 0, 0, 1, 7, 40, },
+ { 1, 0, 0, 1, 7, 40, },
+ { 0, 0, 0, 1, 8, 46, },
+ { 2, 0, 0, 1, 8, 40, },
+ { 1, 0, 0, 1, 8, 40, },
+ { 0, 0, 0, 1, 9, 46, },
+ { 2, 0, 0, 1, 9, 40, },
+ { 1, 0, 0, 1, 9, 40, },
+ { 0, 0, 0, 1, 10, 46, },
+ { 2, 0, 0, 1, 10, 40, },
+ { 1, 0, 0, 1, 10, 40, },
+ { 0, 0, 0, 1, 11, 46, },
+ { 2, 0, 0, 1, 11, 40, },
+ { 1, 0, 0, 1, 11, 40, },
+ { 0, 0, 0, 1, 12, 63, },
+ { 2, 0, 0, 1, 12, 40, },
+ { 1, 0, 0, 1, 12, 40, },
+ { 0, 0, 0, 1, 13, 63, },
+ { 2, 0, 0, 1, 13, 40, },
+ { 1, 0, 0, 1, 13, 40, },
+ { 0, 0, 0, 1, 14, 63, },
+ { 2, 0, 0, 1, 14, 63, },
+ { 1, 0, 0, 1, 14, 63, },
+ { 0, 0, 0, 2, 1, 46, },
+ { 2, 0, 0, 2, 1, 40, },
+ { 1, 0, 0, 2, 1, 40, },
+ { 0, 0, 0, 2, 2, 46, },
+ { 2, 0, 0, 2, 2, 40, },
+ { 1, 0, 0, 2, 2, 40, },
+ { 0, 0, 0, 2, 3, 46, },
+ { 2, 0, 0, 2, 3, 40, },
+ { 1, 0, 0, 2, 3, 40, },
+ { 0, 0, 0, 2, 4, 46, },
+ { 2, 0, 0, 2, 4, 40, },
+ { 1, 0, 0, 2, 4, 40, },
+ { 0, 0, 0, 2, 5, 46, },
+ { 2, 0, 0, 2, 5, 40, },
+ { 1, 0, 0, 2, 5, 40, },
+ { 0, 0, 0, 2, 6, 46, },
+ { 2, 0, 0, 2, 6, 40, },
+ { 1, 0, 0, 2, 6, 40, },
+ { 0, 0, 0, 2, 7, 46, },
+ { 2, 0, 0, 2, 7, 40, },
+ { 1, 0, 0, 2, 7, 40, },
+ { 0, 0, 0, 2, 8, 46, },
+ { 2, 0, 0, 2, 8, 40, },
+ { 1, 0, 0, 2, 8, 40, },
+ { 0, 0, 0, 2, 9, 46, },
+ { 2, 0, 0, 2, 9, 40, },
+ { 1, 0, 0, 2, 9, 40, },
+ { 0, 0, 0, 2, 10, 46, },
+ { 2, 0, 0, 2, 10, 40, },
+ { 1, 0, 0, 2, 10, 40, },
+ { 0, 0, 0, 2, 11, 46, },
+ { 2, 0, 0, 2, 11, 40, },
+ { 1, 0, 0, 2, 11, 40, },
+ { 0, 0, 0, 2, 12, 63, },
+ { 2, 0, 0, 2, 12, 40, },
+ { 1, 0, 0, 2, 12, 40, },
+ { 0, 0, 0, 2, 13, 63, },
+ { 2, 0, 0, 2, 13, 40, },
+ { 1, 0, 0, 2, 13, 40, },
+ { 0, 0, 0, 2, 14, 63, },
+ { 2, 0, 0, 2, 14, 63, },
+ { 1, 0, 0, 2, 14, 63, },
+ { 0, 0, 0, 3, 1, 46, },
+ { 2, 0, 0, 3, 1, 40, },
+ { 1, 0, 0, 3, 1, 40, },
+ { 0, 0, 0, 3, 2, 46, },
+ { 2, 0, 0, 3, 2, 40, },
+ { 1, 0, 0, 3, 2, 40, },
+ { 0, 0, 0, 3, 3, 46, },
+ { 2, 0, 0, 3, 3, 40, },
+ { 1, 0, 0, 3, 3, 40, },
+ { 0, 0, 0, 3, 4, 46, },
+ { 2, 0, 0, 3, 4, 40, },
+ { 1, 0, 0, 3, 4, 40, },
+ { 0, 0, 0, 3, 5, 46, },
+ { 2, 0, 0, 3, 5, 40, },
+ { 1, 0, 0, 3, 5, 40, },
+ { 0, 0, 0, 3, 6, 46, },
+ { 2, 0, 0, 3, 6, 40, },
+ { 1, 0, 0, 3, 6, 40, },
+ { 0, 0, 0, 3, 7, 46, },
+ { 2, 0, 0, 3, 7, 40, },
+ { 1, 0, 0, 3, 7, 40, },
+ { 0, 0, 0, 3, 8, 46, },
+ { 2, 0, 0, 3, 8, 40, },
+ { 1, 0, 0, 3, 8, 40, },
+ { 0, 0, 0, 3, 9, 46, },
+ { 2, 0, 0, 3, 9, 40, },
+ { 1, 0, 0, 3, 9, 40, },
+ { 0, 0, 0, 3, 10, 46, },
+ { 2, 0, 0, 3, 10, 40, },
+ { 1, 0, 0, 3, 10, 40, },
+ { 0, 0, 0, 3, 11, 46, },
+ { 2, 0, 0, 3, 11, 40, },
+ { 1, 0, 0, 3, 11, 40, },
+ { 0, 0, 0, 3, 12, 63, },
+ { 2, 0, 0, 3, 12, 40, },
+ { 1, 0, 0, 3, 12, 40, },
+ { 0, 0, 0, 3, 13, 63, },
+ { 2, 0, 0, 3, 13, 40, },
+ { 1, 0, 0, 3, 13, 40, },
+ { 0, 0, 0, 3, 14, 63, },
+ { 2, 0, 0, 3, 14, 63, },
+ { 1, 0, 0, 3, 14, 63, },
+ { 0, 0, 0, 6, 1, 46, },
+ { 2, 0, 0, 6, 1, 40, },
+ { 1, 0, 0, 6, 1, 40, },
+ { 0, 0, 0, 6, 2, 46, },
+ { 2, 0, 0, 6, 2, 40, },
+ { 1, 0, 0, 6, 2, 40, },
+ { 0, 0, 0, 6, 3, 46, },
+ { 2, 0, 0, 6, 3, 40, },
+ { 1, 0, 0, 6, 3, 40, },
+ { 0, 0, 0, 6, 4, 46, },
+ { 2, 0, 0, 6, 4, 40, },
+ { 1, 0, 0, 6, 4, 40, },
+ { 0, 0, 0, 6, 5, 46, },
+ { 2, 0, 0, 6, 5, 40, },
+ { 1, 0, 0, 6, 5, 40, },
+ { 0, 0, 0, 6, 6, 46, },
+ { 2, 0, 0, 6, 6, 40, },
+ { 1, 0, 0, 6, 6, 40, },
+ { 0, 0, 0, 6, 7, 46, },
+ { 2, 0, 0, 6, 7, 40, },
+ { 1, 0, 0, 6, 7, 40, },
+ { 0, 0, 0, 6, 8, 46, },
+ { 2, 0, 0, 6, 8, 40, },
+ { 1, 0, 0, 6, 8, 40, },
+ { 0, 0, 0, 6, 9, 46, },
+ { 2, 0, 0, 6, 9, 40, },
+ { 1, 0, 0, 6, 9, 40, },
+ { 0, 0, 0, 6, 10, 46, },
+ { 2, 0, 0, 6, 10, 40, },
+ { 1, 0, 0, 6, 10, 40, },
+ { 0, 0, 0, 6, 11, 46, },
+ { 2, 0, 0, 6, 11, 40, },
+ { 1, 0, 0, 6, 11, 40, },
+ { 0, 0, 0, 6, 12, 63, },
+ { 2, 0, 0, 6, 12, 40, },
+ { 1, 0, 0, 6, 12, 40, },
+ { 0, 0, 0, 6, 13, 63, },
+ { 2, 0, 0, 6, 13, 40, },
+ { 1, 0, 0, 6, 13, 40, },
+ { 0, 0, 0, 6, 14, 63, },
+ { 2, 0, 0, 6, 14, 63, },
+ { 1, 0, 0, 6, 14, 63, },
+ { 0, 0, 0, 7, 1, 46, },
+ { 2, 0, 0, 7, 1, 40, },
+ { 1, 0, 0, 7, 1, 40, },
+ { 0, 0, 0, 7, 2, 46, },
+ { 2, 0, 0, 7, 2, 40, },
+ { 1, 0, 0, 7, 2, 40, },
+ { 0, 0, 0, 7, 3, 46, },
+ { 2, 0, 0, 7, 3, 40, },
+ { 1, 0, 0, 7, 3, 40, },
+ { 0, 0, 0, 7, 4, 46, },
+ { 2, 0, 0, 7, 4, 40, },
+ { 1, 0, 0, 7, 4, 40, },
+ { 0, 0, 0, 7, 5, 46, },
+ { 2, 0, 0, 7, 5, 40, },
+ { 1, 0, 0, 7, 5, 40, },
+ { 0, 0, 0, 7, 6, 46, },
+ { 2, 0, 0, 7, 6, 40, },
+ { 1, 0, 0, 7, 6, 40, },
+ { 0, 0, 0, 7, 7, 46, },
+ { 2, 0, 0, 7, 7, 40, },
+ { 1, 0, 0, 7, 7, 40, },
+ { 0, 0, 0, 7, 8, 46, },
+ { 2, 0, 0, 7, 8, 40, },
+ { 1, 0, 0, 7, 8, 40, },
+ { 0, 0, 0, 7, 9, 46, },
+ { 2, 0, 0, 7, 9, 40, },
+ { 1, 0, 0, 7, 9, 40, },
+ { 0, 0, 0, 7, 10, 46, },
+ { 2, 0, 0, 7, 10, 40, },
+ { 1, 0, 0, 7, 10, 40, },
+ { 0, 0, 0, 7, 11, 46, },
+ { 2, 0, 0, 7, 11, 40, },
+ { 1, 0, 0, 7, 11, 40, },
+ { 0, 0, 0, 7, 12, 63, },
+ { 2, 0, 0, 7, 12, 40, },
+ { 1, 0, 0, 7, 12, 40, },
+ { 0, 0, 0, 7, 13, 63, },
+ { 2, 0, 0, 7, 13, 40, },
+ { 1, 0, 0, 7, 13, 40, },
+ { 0, 0, 0, 7, 14, 63, },
+ { 2, 0, 0, 7, 14, 63, },
+ { 1, 0, 0, 7, 14, 63, },
+ { 0, 0, 1, 2, 1, 63, },
+ { 2, 0, 1, 2, 1, 63, },
+ { 1, 0, 1, 2, 1, 63, },
+ { 0, 0, 1, 2, 2, 63, },
+ { 2, 0, 1, 2, 2, 63, },
+ { 1, 0, 1, 2, 2, 63, },
+ { 0, 0, 1, 2, 3, 46, },
+ { 2, 0, 1, 2, 3, 40, },
+ { 1, 0, 1, 2, 3, 40, },
+ { 0, 0, 1, 2, 4, 46, },
+ { 2, 0, 1, 2, 4, 40, },
+ { 1, 0, 1, 2, 4, 40, },
+ { 0, 0, 1, 2, 5, 46, },
+ { 2, 0, 1, 2, 5, 40, },
+ { 1, 0, 1, 2, 5, 40, },
+ { 0, 0, 1, 2, 6, 46, },
+ { 2, 0, 1, 2, 6, 40, },
+ { 1, 0, 1, 2, 6, 40, },
+ { 0, 0, 1, 2, 7, 46, },
+ { 2, 0, 1, 2, 7, 40, },
+ { 1, 0, 1, 2, 7, 40, },
+ { 0, 0, 1, 2, 8, 46, },
+ { 2, 0, 1, 2, 8, 40, },
+ { 1, 0, 1, 2, 8, 40, },
+ { 0, 0, 1, 2, 9, 46, },
+ { 2, 0, 1, 2, 9, 40, },
+ { 1, 0, 1, 2, 9, 40, },
+ { 0, 0, 1, 2, 10, 46, },
+ { 2, 0, 1, 2, 10, 40, },
+ { 1, 0, 1, 2, 10, 40, },
+ { 0, 0, 1, 2, 11, 46, },
+ { 2, 0, 1, 2, 11, 40, },
+ { 1, 0, 1, 2, 11, 40, },
+ { 0, 0, 1, 2, 12, 63, },
+ { 2, 0, 1, 2, 12, 40, },
+ { 1, 0, 1, 2, 12, 40, },
+ { 0, 0, 1, 2, 13, 63, },
+ { 2, 0, 1, 2, 13, 40, },
+ { 1, 0, 1, 2, 13, 40, },
+ { 0, 0, 1, 2, 14, 63, },
+ { 2, 0, 1, 2, 14, 63, },
+ { 1, 0, 1, 2, 14, 63, },
+ { 0, 0, 1, 3, 1, 63, },
+ { 2, 0, 1, 3, 1, 63, },
+ { 1, 0, 1, 3, 1, 63, },
+ { 0, 0, 1, 3, 2, 63, },
+ { 2, 0, 1, 3, 2, 63, },
+ { 1, 0, 1, 3, 2, 63, },
+ { 0, 0, 1, 3, 3, 46, },
+ { 2, 0, 1, 3, 3, 40, },
+ { 1, 0, 1, 3, 3, 40, },
+ { 0, 0, 1, 3, 4, 46, },
+ { 2, 0, 1, 3, 4, 40, },
+ { 1, 0, 1, 3, 4, 40, },
+ { 0, 0, 1, 3, 5, 46, },
+ { 2, 0, 1, 3, 5, 40, },
+ { 1, 0, 1, 3, 5, 40, },
+ { 0, 0, 1, 3, 6, 46, },
+ { 2, 0, 1, 3, 6, 40, },
+ { 1, 0, 1, 3, 6, 40, },
+ { 0, 0, 1, 3, 7, 46, },
+ { 2, 0, 1, 3, 7, 40, },
+ { 1, 0, 1, 3, 7, 40, },
+ { 0, 0, 1, 3, 8, 46, },
+ { 2, 0, 1, 3, 8, 40, },
+ { 1, 0, 1, 3, 8, 40, },
+ { 0, 0, 1, 3, 9, 46, },
+ { 2, 0, 1, 3, 9, 40, },
+ { 1, 0, 1, 3, 9, 40, },
+ { 0, 0, 1, 3, 10, 46, },
+ { 2, 0, 1, 3, 10, 40, },
+ { 1, 0, 1, 3, 10, 40, },
+ { 0, 0, 1, 3, 11, 46, },
+ { 2, 0, 1, 3, 11, 40, },
+ { 1, 0, 1, 3, 11, 40, },
+ { 0, 0, 1, 3, 12, 63, },
+ { 2, 0, 1, 3, 12, 40, },
+ { 1, 0, 1, 3, 12, 40, },
+ { 0, 0, 1, 3, 13, 63, },
+ { 2, 0, 1, 3, 13, 40, },
+ { 1, 0, 1, 3, 13, 40, },
+ { 0, 0, 1, 3, 14, 63, },
+ { 2, 0, 1, 3, 14, 63, },
+ { 1, 0, 1, 3, 14, 63, },
+ { 0, 0, 1, 6, 1, 63, },
+ { 2, 0, 1, 6, 1, 63, },
+ { 1, 0, 1, 6, 1, 63, },
+ { 0, 0, 1, 6, 2, 63, },
+ { 2, 0, 1, 6, 2, 63, },
+ { 1, 0, 1, 6, 2, 63, },
+ { 0, 0, 1, 6, 3, 46, },
+ { 2, 0, 1, 6, 3, 40, },
+ { 1, 0, 1, 6, 3, 40, },
+ { 0, 0, 1, 6, 4, 46, },
+ { 2, 0, 1, 6, 4, 40, },
+ { 1, 0, 1, 6, 4, 40, },
+ { 0, 0, 1, 6, 5, 46, },
+ { 2, 0, 1, 6, 5, 40, },
+ { 1, 0, 1, 6, 5, 40, },
+ { 0, 0, 1, 6, 6, 46, },
+ { 2, 0, 1, 6, 6, 40, },
+ { 1, 0, 1, 6, 6, 40, },
+ { 0, 0, 1, 6, 7, 46, },
+ { 2, 0, 1, 6, 7, 40, },
+ { 1, 0, 1, 6, 7, 40, },
+ { 0, 0, 1, 6, 8, 46, },
+ { 2, 0, 1, 6, 8, 40, },
+ { 1, 0, 1, 6, 8, 40, },
+ { 0, 0, 1, 6, 9, 46, },
+ { 2, 0, 1, 6, 9, 40, },
+ { 1, 0, 1, 6, 9, 40, },
+ { 0, 0, 1, 6, 10, 46, },
+ { 2, 0, 1, 6, 10, 40, },
+ { 1, 0, 1, 6, 10, 40, },
+ { 0, 0, 1, 6, 11, 46, },
+ { 2, 0, 1, 6, 11, 40, },
+ { 1, 0, 1, 6, 11, 40, },
+ { 0, 0, 1, 6, 12, 63, },
+ { 2, 0, 1, 6, 12, 40, },
+ { 1, 0, 1, 6, 12, 40, },
+ { 0, 0, 1, 6, 13, 63, },
+ { 2, 0, 1, 6, 13, 40, },
+ { 1, 0, 1, 6, 13, 40, },
+ { 0, 0, 1, 6, 14, 63, },
+ { 2, 0, 1, 6, 14, 63, },
+ { 1, 0, 1, 6, 14, 63, },
+ { 0, 0, 1, 7, 1, 63, },
+ { 2, 0, 1, 7, 1, 63, },
+ { 1, 0, 1, 7, 1, 63, },
+ { 0, 0, 1, 7, 2, 63, },
+ { 2, 0, 1, 7, 2, 63, },
+ { 1, 0, 1, 7, 2, 63, },
+ { 0, 0, 1, 7, 3, 46, },
+ { 2, 0, 1, 7, 3, 40, },
+ { 1, 0, 1, 7, 3, 40, },
+ { 0, 0, 1, 7, 4, 46, },
+ { 2, 0, 1, 7, 4, 40, },
+ { 1, 0, 1, 7, 4, 40, },
+ { 0, 0, 1, 7, 5, 46, },
+ { 2, 0, 1, 7, 5, 40, },
+ { 1, 0, 1, 7, 5, 40, },
+ { 0, 0, 1, 7, 6, 46, },
+ { 2, 0, 1, 7, 6, 40, },
+ { 1, 0, 1, 7, 6, 40, },
+ { 0, 0, 1, 7, 7, 46, },
+ { 2, 0, 1, 7, 7, 40, },
+ { 1, 0, 1, 7, 7, 40, },
+ { 0, 0, 1, 7, 8, 46, },
+ { 2, 0, 1, 7, 8, 40, },
+ { 1, 0, 1, 7, 8, 40, },
+ { 0, 0, 1, 7, 9, 46, },
+ { 2, 0, 1, 7, 9, 40, },
+ { 1, 0, 1, 7, 9, 40, },
+ { 0, 0, 1, 7, 10, 46, },
+ { 2, 0, 1, 7, 10, 40, },
+ { 1, 0, 1, 7, 10, 40, },
+ { 0, 0, 1, 7, 11, 46, },
+ { 2, 0, 1, 7, 11, 40, },
+ { 1, 0, 1, 7, 11, 40, },
+ { 0, 0, 1, 7, 12, 63, },
+ { 2, 0, 1, 7, 12, 40, },
+ { 1, 0, 1, 7, 12, 40, },
+ { 0, 0, 1, 7, 13, 63, },
+ { 2, 0, 1, 7, 13, 40, },
+ { 1, 0, 1, 7, 13, 40, },
+ { 0, 0, 1, 7, 14, 63, },
+ { 2, 0, 1, 7, 14, 63, },
+ { 1, 0, 1, 7, 14, 63, },
+ { 0, 1, 0, 1, 36, 46, },
+ { 2, 1, 0, 1, 36, 40, },
+ { 1, 1, 0, 1, 36, 40, },
+ { 0, 1, 0, 1, 40, 46, },
+ { 2, 1, 0, 1, 40, 40, },
+ { 1, 1, 0, 1, 40, 40, },
+ { 0, 1, 0, 1, 44, 46, },
+ { 2, 1, 0, 1, 44, 40, },
+ { 1, 1, 0, 1, 44, 40, },
+ { 0, 1, 0, 1, 48, 46, },
+ { 2, 1, 0, 1, 48, 40, },
+ { 1, 1, 0, 1, 48, 40, },
+ { 0, 1, 0, 1, 52, 46, },
+ { 2, 1, 0, 1, 52, 40, },
+ { 1, 1, 0, 1, 52, 40, },
+ { 0, 1, 0, 1, 56, 46, },
+ { 2, 1, 0, 1, 56, 40, },
+ { 1, 1, 0, 1, 56, 40, },
+ { 0, 1, 0, 1, 60, 46, },
+ { 2, 1, 0, 1, 60, 40, },
+ { 1, 1, 0, 1, 60, 40, },
+ { 0, 1, 0, 1, 64, 46, },
+ { 2, 1, 0, 1, 64, 40, },
+ { 1, 1, 0, 1, 64, 40, },
+ { 0, 1, 0, 1, 100, 46, },
+ { 2, 1, 0, 1, 100, 40, },
+ { 1, 1, 0, 1, 100, 40, },
+ { 0, 1, 0, 1, 104, 46, },
+ { 2, 1, 0, 1, 104, 40, },
+ { 1, 1, 0, 1, 104, 40, },
+ { 0, 1, 0, 1, 108, 46, },
+ { 2, 1, 0, 1, 108, 40, },
+ { 1, 1, 0, 1, 108, 40, },
+ { 0, 1, 0, 1, 112, 46, },
+ { 2, 1, 0, 1, 112, 40, },
+ { 1, 1, 0, 1, 112, 40, },
+ { 0, 1, 0, 1, 116, 46, },
+ { 2, 1, 0, 1, 116, 40, },
+ { 1, 1, 0, 1, 116, 40, },
+ { 0, 1, 0, 1, 120, 46, },
+ { 2, 1, 0, 1, 120, 40, },
+ { 1, 1, 0, 1, 120, 40, },
+ { 0, 1, 0, 1, 124, 46, },
+ { 2, 1, 0, 1, 124, 40, },
+ { 1, 1, 0, 1, 124, 40, },
+ { 0, 1, 0, 1, 128, 46, },
+ { 2, 1, 0, 1, 128, 40, },
+ { 1, 1, 0, 1, 128, 40, },
+ { 0, 1, 0, 1, 132, 46, },
+ { 2, 1, 0, 1, 132, 40, },
+ { 1, 1, 0, 1, 132, 40, },
+ { 0, 1, 0, 1, 136, 46, },
+ { 2, 1, 0, 1, 136, 40, },
+ { 1, 1, 0, 1, 136, 40, },
+ { 0, 1, 0, 1, 140, 46, },
+ { 2, 1, 0, 1, 140, 40, },
+ { 1, 1, 0, 1, 140, 40, },
+ { 0, 1, 0, 1, 149, 46, },
+ { 2, 1, 0, 1, 149, 40, },
+ { 1, 1, 0, 1, 149, 63, },
+ { 0, 1, 0, 1, 153, 46, },
+ { 2, 1, 0, 1, 153, 40, },
+ { 1, 1, 0, 1, 153, 63, },
+ { 0, 1, 0, 1, 157, 46, },
+ { 2, 1, 0, 1, 157, 40, },
+ { 1, 1, 0, 1, 157, 63, },
+ { 0, 1, 0, 1, 161, 46, },
+ { 2, 1, 0, 1, 161, 40, },
+ { 1, 1, 0, 1, 161, 63, },
+ { 0, 1, 0, 1, 165, 46, },
+ { 2, 1, 0, 1, 165, 40, },
+ { 1, 1, 0, 1, 165, 63, },
+ { 0, 1, 0, 2, 36, 46, },
+ { 2, 1, 0, 2, 36, 40, },
+ { 1, 1, 0, 2, 36, 40, },
+ { 0, 1, 0, 2, 40, 46, },
+ { 2, 1, 0, 2, 40, 40, },
+ { 1, 1, 0, 2, 40, 40, },
+ { 0, 1, 0, 2, 44, 46, },
+ { 2, 1, 0, 2, 44, 40, },
+ { 1, 1, 0, 2, 44, 40, },
+ { 0, 1, 0, 2, 48, 46, },
+ { 2, 1, 0, 2, 48, 40, },
+ { 1, 1, 0, 2, 48, 40, },
+ { 0, 1, 0, 2, 52, 46, },
+ { 2, 1, 0, 2, 52, 40, },
+ { 1, 1, 0, 2, 52, 40, },
+ { 0, 1, 0, 2, 56, 46, },
+ { 2, 1, 0, 2, 56, 40, },
+ { 1, 1, 0, 2, 56, 40, },
+ { 0, 1, 0, 2, 60, 46, },
+ { 2, 1, 0, 2, 60, 40, },
+ { 1, 1, 0, 2, 60, 40, },
+ { 0, 1, 0, 2, 64, 46, },
+ { 2, 1, 0, 2, 64, 40, },
+ { 1, 1, 0, 2, 64, 40, },
+ { 0, 1, 0, 2, 100, 46, },
+ { 2, 1, 0, 2, 100, 40, },
+ { 1, 1, 0, 2, 100, 40, },
+ { 0, 1, 0, 2, 104, 46, },
+ { 2, 1, 0, 2, 104, 40, },
+ { 1, 1, 0, 2, 104, 40, },
+ { 0, 1, 0, 2, 108, 46, },
+ { 2, 1, 0, 2, 108, 40, },
+ { 1, 1, 0, 2, 108, 40, },
+ { 0, 1, 0, 2, 112, 46, },
+ { 2, 1, 0, 2, 112, 40, },
+ { 1, 1, 0, 2, 112, 40, },
+ { 0, 1, 0, 2, 116, 46, },
+ { 2, 1, 0, 2, 116, 40, },
+ { 1, 1, 0, 2, 116, 40, },
+ { 0, 1, 0, 2, 120, 46, },
+ { 2, 1, 0, 2, 120, 40, },
+ { 1, 1, 0, 2, 120, 40, },
+ { 0, 1, 0, 2, 124, 46, },
+ { 2, 1, 0, 2, 124, 40, },
+ { 1, 1, 0, 2, 124, 40, },
+ { 0, 1, 0, 2, 128, 46, },
+ { 2, 1, 0, 2, 128, 40, },
+ { 1, 1, 0, 2, 128, 40, },
+ { 0, 1, 0, 2, 132, 46, },
+ { 2, 1, 0, 2, 132, 40, },
+ { 1, 1, 0, 2, 132, 40, },
+ { 0, 1, 0, 2, 136, 46, },
+ { 2, 1, 0, 2, 136, 40, },
+ { 1, 1, 0, 2, 136, 40, },
+ { 0, 1, 0, 2, 140, 46, },
+ { 2, 1, 0, 2, 140, 40, },
+ { 1, 1, 0, 2, 140, 40, },
+ { 0, 1, 0, 2, 149, 46, },
+ { 2, 1, 0, 2, 149, 40, },
+ { 1, 1, 0, 2, 149, 63, },
+ { 0, 1, 0, 2, 153, 46, },
+ { 2, 1, 0, 2, 153, 40, },
+ { 1, 1, 0, 2, 153, 63, },
+ { 0, 1, 0, 2, 157, 46, },
+ { 2, 1, 0, 2, 157, 40, },
+ { 1, 1, 0, 2, 157, 63, },
+ { 0, 1, 0, 2, 161, 46, },
+ { 2, 1, 0, 2, 161, 40, },
+ { 1, 1, 0, 2, 161, 63, },
+ { 0, 1, 0, 2, 165, 46, },
+ { 2, 1, 0, 2, 165, 40, },
+ { 1, 1, 0, 2, 165, 63, },
+ { 0, 1, 0, 3, 36, 46, },
+ { 2, 1, 0, 3, 36, 40, },
+ { 1, 1, 0, 3, 36, 40, },
+ { 0, 1, 0, 3, 40, 46, },
+ { 2, 1, 0, 3, 40, 40, },
+ { 1, 1, 0, 3, 40, 40, },
+ { 0, 1, 0, 3, 44, 46, },
+ { 2, 1, 0, 3, 44, 40, },
+ { 1, 1, 0, 3, 44, 40, },
+ { 0, 1, 0, 3, 48, 46, },
+ { 2, 1, 0, 3, 48, 40, },
+ { 1, 1, 0, 3, 48, 40, },
+ { 0, 1, 0, 3, 52, 46, },
+ { 2, 1, 0, 3, 52, 40, },
+ { 1, 1, 0, 3, 52, 40, },
+ { 0, 1, 0, 3, 56, 46, },
+ { 2, 1, 0, 3, 56, 40, },
+ { 1, 1, 0, 3, 56, 40, },
+ { 0, 1, 0, 3, 60, 46, },
+ { 2, 1, 0, 3, 60, 40, },
+ { 1, 1, 0, 3, 60, 40, },
+ { 0, 1, 0, 3, 64, 46, },
+ { 2, 1, 0, 3, 64, 40, },
+ { 1, 1, 0, 3, 64, 40, },
+ { 0, 1, 0, 3, 100, 46, },
+ { 2, 1, 0, 3, 100, 40, },
+ { 1, 1, 0, 3, 100, 40, },
+ { 0, 1, 0, 3, 104, 46, },
+ { 2, 1, 0, 3, 104, 40, },
+ { 1, 1, 0, 3, 104, 40, },
+ { 0, 1, 0, 3, 108, 46, },
+ { 2, 1, 0, 3, 108, 40, },
+ { 1, 1, 0, 3, 108, 40, },
+ { 0, 1, 0, 3, 112, 46, },
+ { 2, 1, 0, 3, 112, 40, },
+ { 1, 1, 0, 3, 112, 40, },
+ { 0, 1, 0, 3, 116, 46, },
+ { 2, 1, 0, 3, 116, 40, },
+ { 1, 1, 0, 3, 116, 40, },
+ { 0, 1, 0, 3, 120, 46, },
+ { 2, 1, 0, 3, 120, 40, },
+ { 1, 1, 0, 3, 120, 40, },
+ { 0, 1, 0, 3, 124, 46, },
+ { 2, 1, 0, 3, 124, 40, },
+ { 1, 1, 0, 3, 124, 40, },
+ { 0, 1, 0, 3, 128, 46, },
+ { 2, 1, 0, 3, 128, 40, },
+ { 1, 1, 0, 3, 128, 40, },
+ { 0, 1, 0, 3, 132, 46, },
+ { 2, 1, 0, 3, 132, 40, },
+ { 1, 1, 0, 3, 132, 40, },
+ { 0, 1, 0, 3, 136, 46, },
+ { 2, 1, 0, 3, 136, 40, },
+ { 1, 1, 0, 3, 136, 40, },
+ { 0, 1, 0, 3, 140, 46, },
+ { 2, 1, 0, 3, 140, 40, },
+ { 1, 1, 0, 3, 140, 40, },
+ { 0, 1, 0, 3, 149, 46, },
+ { 2, 1, 0, 3, 149, 40, },
+ { 1, 1, 0, 3, 149, 63, },
+ { 0, 1, 0, 3, 153, 46, },
+ { 2, 1, 0, 3, 153, 40, },
+ { 1, 1, 0, 3, 153, 63, },
+ { 0, 1, 0, 3, 157, 46, },
+ { 2, 1, 0, 3, 157, 40, },
+ { 1, 1, 0, 3, 157, 63, },
+ { 0, 1, 0, 3, 161, 46, },
+ { 2, 1, 0, 3, 161, 40, },
+ { 1, 1, 0, 3, 161, 63, },
+ { 0, 1, 0, 3, 165, 46, },
+ { 2, 1, 0, 3, 165, 40, },
+ { 1, 1, 0, 3, 165, 63, },
+ { 0, 1, 0, 6, 36, 46, },
+ { 2, 1, 0, 6, 36, 40, },
+ { 1, 1, 0, 6, 36, 40, },
+ { 0, 1, 0, 6, 40, 46, },
+ { 2, 1, 0, 6, 40, 40, },
+ { 1, 1, 0, 6, 40, 40, },
+ { 0, 1, 0, 6, 44, 46, },
+ { 2, 1, 0, 6, 44, 40, },
+ { 1, 1, 0, 6, 44, 40, },
+ { 0, 1, 0, 6, 48, 46, },
+ { 2, 1, 0, 6, 48, 40, },
+ { 1, 1, 0, 6, 48, 40, },
+ { 0, 1, 0, 6, 52, 46, },
+ { 2, 1, 0, 6, 52, 40, },
+ { 1, 1, 0, 6, 52, 40, },
+ { 0, 1, 0, 6, 56, 46, },
+ { 2, 1, 0, 6, 56, 40, },
+ { 1, 1, 0, 6, 56, 40, },
+ { 0, 1, 0, 6, 60, 46, },
+ { 2, 1, 0, 6, 60, 40, },
+ { 1, 1, 0, 6, 60, 40, },
+ { 0, 1, 0, 6, 64, 46, },
+ { 2, 1, 0, 6, 64, 40, },
+ { 1, 1, 0, 6, 64, 40, },
+ { 0, 1, 0, 6, 100, 46, },
+ { 2, 1, 0, 6, 100, 40, },
+ { 1, 1, 0, 6, 100, 40, },
+ { 0, 1, 0, 6, 104, 46, },
+ { 2, 1, 0, 6, 104, 40, },
+ { 1, 1, 0, 6, 104, 40, },
+ { 0, 1, 0, 6, 108, 46, },
+ { 2, 1, 0, 6, 108, 40, },
+ { 1, 1, 0, 6, 108, 40, },
+ { 0, 1, 0, 6, 112, 46, },
+ { 2, 1, 0, 6, 112, 40, },
+ { 1, 1, 0, 6, 112, 40, },
+ { 0, 1, 0, 6, 116, 46, },
+ { 2, 1, 0, 6, 116, 40, },
+ { 1, 1, 0, 6, 116, 40, },
+ { 0, 1, 0, 6, 120, 46, },
+ { 2, 1, 0, 6, 120, 40, },
+ { 1, 1, 0, 6, 120, 40, },
+ { 0, 1, 0, 6, 124, 46, },
+ { 2, 1, 0, 6, 124, 40, },
+ { 1, 1, 0, 6, 124, 40, },
+ { 0, 1, 0, 6, 128, 46, },
+ { 2, 1, 0, 6, 128, 40, },
+ { 1, 1, 0, 6, 128, 40, },
+ { 0, 1, 0, 6, 132, 46, },
+ { 2, 1, 0, 6, 132, 40, },
+ { 1, 1, 0, 6, 132, 40, },
+ { 0, 1, 0, 6, 136, 46, },
+ { 2, 1, 0, 6, 136, 40, },
+ { 1, 1, 0, 6, 136, 40, },
+ { 0, 1, 0, 6, 140, 46, },
+ { 2, 1, 0, 6, 140, 40, },
+ { 1, 1, 0, 6, 140, 40, },
+ { 0, 1, 0, 6, 149, 46, },
+ { 2, 1, 0, 6, 149, 40, },
+ { 1, 1, 0, 6, 149, 63, },
+ { 0, 1, 0, 6, 153, 46, },
+ { 2, 1, 0, 6, 153, 40, },
+ { 1, 1, 0, 6, 153, 63, },
+ { 0, 1, 0, 6, 157, 46, },
+ { 2, 1, 0, 6, 157, 40, },
+ { 1, 1, 0, 6, 157, 63, },
+ { 0, 1, 0, 6, 161, 46, },
+ { 2, 1, 0, 6, 161, 40, },
+ { 1, 1, 0, 6, 161, 63, },
+ { 0, 1, 0, 6, 165, 46, },
+ { 2, 1, 0, 6, 165, 40, },
+ { 1, 1, 0, 6, 165, 63, },
+ { 0, 1, 0, 7, 36, 46, },
+ { 2, 1, 0, 7, 36, 40, },
+ { 1, 1, 0, 7, 36, 40, },
+ { 0, 1, 0, 7, 40, 46, },
+ { 2, 1, 0, 7, 40, 40, },
+ { 1, 1, 0, 7, 40, 40, },
+ { 0, 1, 0, 7, 44, 46, },
+ { 2, 1, 0, 7, 44, 40, },
+ { 1, 1, 0, 7, 44, 40, },
+ { 0, 1, 0, 7, 48, 46, },
+ { 2, 1, 0, 7, 48, 40, },
+ { 1, 1, 0, 7, 48, 40, },
+ { 0, 1, 0, 7, 52, 46, },
+ { 2, 1, 0, 7, 52, 40, },
+ { 1, 1, 0, 7, 52, 40, },
+ { 0, 1, 0, 7, 56, 46, },
+ { 2, 1, 0, 7, 56, 40, },
+ { 1, 1, 0, 7, 56, 40, },
+ { 0, 1, 0, 7, 60, 46, },
+ { 2, 1, 0, 7, 60, 40, },
+ { 1, 1, 0, 7, 60, 40, },
+ { 0, 1, 0, 7, 64, 46, },
+ { 2, 1, 0, 7, 64, 40, },
+ { 1, 1, 0, 7, 64, 40, },
+ { 0, 1, 0, 7, 100, 46, },
+ { 2, 1, 0, 7, 100, 40, },
+ { 1, 1, 0, 7, 100, 40, },
+ { 0, 1, 0, 7, 104, 46, },
+ { 2, 1, 0, 7, 104, 40, },
+ { 1, 1, 0, 7, 104, 40, },
+ { 0, 1, 0, 7, 108, 46, },
+ { 2, 1, 0, 7, 108, 40, },
+ { 1, 1, 0, 7, 108, 40, },
+ { 0, 1, 0, 7, 112, 46, },
+ { 2, 1, 0, 7, 112, 40, },
+ { 1, 1, 0, 7, 112, 40, },
+ { 0, 1, 0, 7, 116, 46, },
+ { 2, 1, 0, 7, 116, 40, },
+ { 1, 1, 0, 7, 116, 40, },
+ { 0, 1, 0, 7, 120, 46, },
+ { 2, 1, 0, 7, 120, 40, },
+ { 1, 1, 0, 7, 120, 40, },
+ { 0, 1, 0, 7, 124, 46, },
+ { 2, 1, 0, 7, 124, 40, },
+ { 1, 1, 0, 7, 124, 40, },
+ { 0, 1, 0, 7, 128, 46, },
+ { 2, 1, 0, 7, 128, 40, },
+ { 1, 1, 0, 7, 128, 40, },
+ { 0, 1, 0, 7, 132, 46, },
+ { 2, 1, 0, 7, 132, 40, },
+ { 1, 1, 0, 7, 132, 40, },
+ { 0, 1, 0, 7, 136, 46, },
+ { 2, 1, 0, 7, 136, 40, },
+ { 1, 1, 0, 7, 136, 40, },
+ { 0, 1, 0, 7, 140, 46, },
+ { 2, 1, 0, 7, 140, 40, },
+ { 1, 1, 0, 7, 140, 40, },
+ { 0, 1, 0, 7, 149, 46, },
+ { 2, 1, 0, 7, 149, 40, },
+ { 1, 1, 0, 7, 149, 63, },
+ { 0, 1, 0, 7, 153, 46, },
+ { 2, 1, 0, 7, 153, 40, },
+ { 1, 1, 0, 7, 153, 63, },
+ { 0, 1, 0, 7, 157, 46, },
+ { 2, 1, 0, 7, 157, 40, },
+ { 1, 1, 0, 7, 157, 63, },
+ { 0, 1, 0, 7, 161, 46, },
+ { 2, 1, 0, 7, 161, 40, },
+ { 1, 1, 0, 7, 161, 63, },
+ { 0, 1, 0, 7, 165, 46, },
+ { 2, 1, 0, 7, 165, 40, },
+ { 1, 1, 0, 7, 165, 63, },
+ { 0, 1, 1, 2, 38, 46, },
+ { 2, 1, 1, 2, 38, 40, },
+ { 1, 1, 1, 2, 38, 40, },
+ { 0, 1, 1, 2, 46, 46, },
+ { 2, 1, 1, 2, 46, 40, },
+ { 1, 1, 1, 2, 46, 40, },
+ { 0, 1, 1, 2, 54, 46, },
+ { 2, 1, 1, 2, 54, 40, },
+ { 1, 1, 1, 2, 54, 40, },
+ { 0, 1, 1, 2, 62, 46, },
+ { 2, 1, 1, 2, 62, 40, },
+ { 1, 1, 1, 2, 62, 40, },
+ { 0, 1, 1, 2, 102, 46, },
+ { 2, 1, 1, 2, 102, 40, },
+ { 1, 1, 1, 2, 102, 40, },
+ { 0, 1, 1, 2, 110, 46, },
+ { 2, 1, 1, 2, 110, 40, },
+ { 1, 1, 1, 2, 110, 40, },
+ { 0, 1, 1, 2, 118, 46, },
+ { 2, 1, 1, 2, 118, 40, },
+ { 1, 1, 1, 2, 118, 40, },
+ { 0, 1, 1, 2, 126, 46, },
+ { 2, 1, 1, 2, 126, 40, },
+ { 1, 1, 1, 2, 126, 40, },
+ { 0, 1, 1, 2, 134, 46, },
+ { 2, 1, 1, 2, 134, 40, },
+ { 1, 1, 1, 2, 134, 40, },
+ { 0, 1, 1, 2, 151, 46, },
+ { 2, 1, 1, 2, 151, 40, },
+ { 1, 1, 1, 2, 151, 63, },
+ { 0, 1, 1, 2, 159, 46, },
+ { 2, 1, 1, 2, 159, 40, },
+ { 1, 1, 1, 2, 159, 63, },
+ { 0, 1, 1, 3, 38, 46, },
+ { 2, 1, 1, 3, 38, 40, },
+ { 1, 1, 1, 3, 38, 40, },
+ { 0, 1, 1, 3, 46, 46, },
+ { 2, 1, 1, 3, 46, 40, },
+ { 1, 1, 1, 3, 46, 40, },
+ { 0, 1, 1, 3, 54, 46, },
+ { 2, 1, 1, 3, 54, 40, },
+ { 1, 1, 1, 3, 54, 40, },
+ { 0, 1, 1, 3, 62, 46, },
+ { 2, 1, 1, 3, 62, 40, },
+ { 1, 1, 1, 3, 62, 40, },
+ { 0, 1, 1, 3, 102, 46, },
+ { 2, 1, 1, 3, 102, 40, },
+ { 1, 1, 1, 3, 102, 40, },
+ { 0, 1, 1, 3, 110, 46, },
+ { 2, 1, 1, 3, 110, 40, },
+ { 1, 1, 1, 3, 110, 40, },
+ { 0, 1, 1, 3, 118, 46, },
+ { 2, 1, 1, 3, 118, 40, },
+ { 1, 1, 1, 3, 118, 40, },
+ { 0, 1, 1, 3, 126, 46, },
+ { 2, 1, 1, 3, 126, 40, },
+ { 1, 1, 1, 3, 126, 40, },
+ { 0, 1, 1, 3, 134, 46, },
+ { 2, 1, 1, 3, 134, 40, },
+ { 1, 1, 1, 3, 134, 40, },
+ { 0, 1, 1, 3, 151, 46, },
+ { 2, 1, 1, 3, 151, 40, },
+ { 1, 1, 1, 3, 151, 63, },
+ { 0, 1, 1, 3, 159, 46, },
+ { 2, 1, 1, 3, 159, 40, },
+ { 1, 1, 1, 3, 159, 63, },
+ { 0, 1, 1, 6, 38, 46, },
+ { 2, 1, 1, 6, 38, 40, },
+ { 1, 1, 1, 6, 38, 40, },
+ { 0, 1, 1, 6, 46, 46, },
+ { 2, 1, 1, 6, 46, 40, },
+ { 1, 1, 1, 6, 46, 40, },
+ { 0, 1, 1, 6, 54, 46, },
+ { 2, 1, 1, 6, 54, 40, },
+ { 1, 1, 1, 6, 54, 40, },
+ { 0, 1, 1, 6, 62, 46, },
+ { 2, 1, 1, 6, 62, 40, },
+ { 1, 1, 1, 6, 62, 40, },
+ { 0, 1, 1, 6, 102, 46, },
+ { 2, 1, 1, 6, 102, 40, },
+ { 1, 1, 1, 6, 102, 40, },
+ { 0, 1, 1, 6, 110, 46, },
+ { 2, 1, 1, 6, 110, 40, },
+ { 1, 1, 1, 6, 110, 40, },
+ { 0, 1, 1, 6, 118, 46, },
+ { 2, 1, 1, 6, 118, 40, },
+ { 1, 1, 1, 6, 118, 40, },
+ { 0, 1, 1, 6, 126, 46, },
+ { 2, 1, 1, 6, 126, 40, },
+ { 1, 1, 1, 6, 126, 40, },
+ { 0, 1, 1, 6, 134, 46, },
+ { 2, 1, 1, 6, 134, 40, },
+ { 1, 1, 1, 6, 134, 40, },
+ { 0, 1, 1, 6, 151, 46, },
+ { 2, 1, 1, 6, 151, 40, },
+ { 1, 1, 1, 6, 151, 63, },
+ { 0, 1, 1, 6, 159, 46, },
+ { 2, 1, 1, 6, 159, 40, },
+ { 1, 1, 1, 6, 159, 63, },
+ { 0, 1, 1, 7, 38, 46, },
+ { 2, 1, 1, 7, 38, 40, },
+ { 1, 1, 1, 7, 38, 40, },
+ { 0, 1, 1, 7, 46, 46, },
+ { 2, 1, 1, 7, 46, 40, },
+ { 1, 1, 1, 7, 46, 40, },
+ { 0, 1, 1, 7, 54, 46, },
+ { 2, 1, 1, 7, 54, 40, },
+ { 1, 1, 1, 7, 54, 40, },
+ { 0, 1, 1, 7, 62, 46, },
+ { 2, 1, 1, 7, 62, 40, },
+ { 1, 1, 1, 7, 62, 40, },
+ { 0, 1, 1, 7, 102, 46, },
+ { 2, 1, 1, 7, 102, 40, },
+ { 1, 1, 1, 7, 102, 40, },
+ { 0, 1, 1, 7, 110, 46, },
+ { 2, 1, 1, 7, 110, 40, },
+ { 1, 1, 1, 7, 110, 40, },
+ { 0, 1, 1, 7, 118, 46, },
+ { 2, 1, 1, 7, 118, 40, },
+ { 1, 1, 1, 7, 118, 40, },
+ { 0, 1, 1, 7, 126, 46, },
+ { 2, 1, 1, 7, 126, 40, },
+ { 1, 1, 1, 7, 126, 40, },
+ { 0, 1, 1, 7, 134, 46, },
+ { 2, 1, 1, 7, 134, 40, },
+ { 1, 1, 1, 7, 134, 40, },
+ { 0, 1, 1, 7, 151, 46, },
+ { 2, 1, 1, 7, 151, 40, },
+ { 1, 1, 1, 7, 151, 63, },
+ { 0, 1, 1, 7, 159, 46, },
+ { 2, 1, 1, 7, 159, 40, },
+ { 1, 1, 1, 7, 159, 63, },
+ { 0, 1, 2, 4, 42, 46, },
+ { 2, 1, 2, 4, 42, 40, },
+ { 1, 1, 2, 4, 42, 40, },
+ { 0, 1, 2, 4, 58, 46, },
+ { 2, 1, 2, 4, 58, 40, },
+ { 1, 1, 2, 4, 58, 40, },
+ { 0, 1, 2, 4, 106, 46, },
+ { 2, 1, 2, 4, 106, 40, },
+ { 1, 1, 2, 4, 106, 40, },
+ { 0, 1, 2, 4, 122, 46, },
+ { 2, 1, 2, 4, 122, 40, },
+ { 1, 1, 2, 4, 122, 40, },
+ { 0, 1, 2, 4, 155, 46, },
+ { 2, 1, 2, 4, 155, 40, },
+ { 1, 1, 2, 4, 155, 63, },
+ { 0, 1, 2, 5, 42, 46, },
+ { 2, 1, 2, 5, 42, 40, },
+ { 1, 1, 2, 5, 42, 40, },
+ { 0, 1, 2, 5, 58, 46, },
+ { 2, 1, 2, 5, 58, 40, },
+ { 1, 1, 2, 5, 58, 40, },
+ { 0, 1, 2, 5, 106, 46, },
+ { 2, 1, 2, 5, 106, 40, },
+ { 1, 1, 2, 5, 106, 40, },
+ { 0, 1, 2, 5, 122, 46, },
+ { 2, 1, 2, 5, 122, 40, },
+ { 1, 1, 2, 5, 122, 40, },
+ { 0, 1, 2, 5, 155, 46, },
+ { 2, 1, 2, 5, 155, 40, },
+ { 1, 1, 2, 5, 155, 63, },
+ { 0, 1, 2, 8, 42, 46, },
+ { 2, 1, 2, 8, 42, 40, },
+ { 1, 1, 2, 8, 42, 40, },
+ { 0, 1, 2, 8, 58, 46, },
+ { 2, 1, 2, 8, 58, 40, },
+ { 1, 1, 2, 8, 58, 40, },
+ { 0, 1, 2, 8, 106, 46, },
+ { 2, 1, 2, 8, 106, 40, },
+ { 1, 1, 2, 8, 106, 40, },
+ { 0, 1, 2, 8, 122, 46, },
+ { 2, 1, 2, 8, 122, 40, },
+ { 1, 1, 2, 8, 122, 40, },
+ { 0, 1, 2, 8, 155, 46, },
+ { 2, 1, 2, 8, 155, 40, },
+ { 1, 1, 2, 8, 155, 63, },
+ { 0, 1, 2, 9, 42, 46, },
+ { 2, 1, 2, 9, 42, 40, },
+ { 1, 1, 2, 9, 42, 40, },
+ { 0, 1, 2, 9, 58, 46, },
+ { 2, 1, 2, 9, 58, 40, },
+ { 1, 1, 2, 9, 58, 40, },
+ { 0, 1, 2, 9, 106, 46, },
+ { 2, 1, 2, 9, 106, 40, },
+ { 1, 1, 2, 9, 106, 40, },
+ { 0, 1, 2, 9, 122, 46, },
+ { 2, 1, 2, 9, 122, 40, },
+ { 1, 1, 2, 9, 122, 40, },
+ { 0, 1, 2, 9, 155, 46, },
+ { 2, 1, 2, 9, 155, 40, },
+ { 1, 1, 2, 9, 155, 63, },
+};
+
+RTW_DECL_TABLE_TXPWR_LMT(rtw8814a_txpwr_lmt_type3);
+
+static const struct rtw_txpwr_lmt_cfg_pair rtw8814a_txpwr_lmt_type5[] = {
+ { 0, 0, 0, 0, 1, 46, },
+ { 2, 0, 0, 0, 1, 40, },
+ { 1, 0, 0, 0, 1, 40, },
+ { 0, 0, 0, 0, 2, 46, },
+ { 2, 0, 0, 0, 2, 40, },
+ { 1, 0, 0, 0, 2, 40, },
+ { 0, 0, 0, 0, 3, 46, },
+ { 2, 0, 0, 0, 3, 40, },
+ { 1, 0, 0, 0, 3, 40, },
+ { 0, 0, 0, 0, 4, 46, },
+ { 2, 0, 0, 0, 4, 40, },
+ { 1, 0, 0, 0, 4, 40, },
+ { 0, 0, 0, 0, 5, 46, },
+ { 2, 0, 0, 0, 5, 40, },
+ { 1, 0, 0, 0, 5, 40, },
+ { 0, 0, 0, 0, 6, 46, },
+ { 2, 0, 0, 0, 6, 40, },
+ { 1, 0, 0, 0, 6, 40, },
+ { 0, 0, 0, 0, 7, 46, },
+ { 2, 0, 0, 0, 7, 40, },
+ { 1, 0, 0, 0, 7, 40, },
+ { 0, 0, 0, 0, 8, 46, },
+ { 2, 0, 0, 0, 8, 40, },
+ { 1, 0, 0, 0, 8, 40, },
+ { 0, 0, 0, 0, 9, 46, },
+ { 2, 0, 0, 0, 9, 40, },
+ { 1, 0, 0, 0, 9, 40, },
+ { 0, 0, 0, 0, 10, 46, },
+ { 2, 0, 0, 0, 10, 40, },
+ { 1, 0, 0, 0, 10, 40, },
+ { 0, 0, 0, 0, 11, 46, },
+ { 2, 0, 0, 0, 11, 40, },
+ { 1, 0, 0, 0, 11, 40, },
+ { 0, 0, 0, 0, 12, 63, },
+ { 2, 0, 0, 0, 12, 40, },
+ { 1, 0, 0, 0, 12, 40, },
+ { 0, 0, 0, 0, 13, 63, },
+ { 2, 0, 0, 0, 13, 40, },
+ { 1, 0, 0, 0, 13, 40, },
+ { 0, 0, 0, 0, 14, 63, },
+ { 2, 0, 0, 0, 14, 63, },
+ { 1, 0, 0, 0, 14, 40, },
+ { 0, 0, 0, 1, 1, 46, },
+ { 2, 0, 0, 1, 1, 40, },
+ { 1, 0, 0, 1, 1, 40, },
+ { 0, 0, 0, 1, 2, 46, },
+ { 2, 0, 0, 1, 2, 40, },
+ { 1, 0, 0, 1, 2, 40, },
+ { 0, 0, 0, 1, 3, 46, },
+ { 2, 0, 0, 1, 3, 40, },
+ { 1, 0, 0, 1, 3, 40, },
+ { 0, 0, 0, 1, 4, 46, },
+ { 2, 0, 0, 1, 4, 40, },
+ { 1, 0, 0, 1, 4, 40, },
+ { 0, 0, 0, 1, 5, 46, },
+ { 2, 0, 0, 1, 5, 40, },
+ { 1, 0, 0, 1, 5, 40, },
+ { 0, 0, 0, 1, 6, 46, },
+ { 2, 0, 0, 1, 6, 40, },
+ { 1, 0, 0, 1, 6, 40, },
+ { 0, 0, 0, 1, 7, 46, },
+ { 2, 0, 0, 1, 7, 40, },
+ { 1, 0, 0, 1, 7, 40, },
+ { 0, 0, 0, 1, 8, 46, },
+ { 2, 0, 0, 1, 8, 40, },
+ { 1, 0, 0, 1, 8, 40, },
+ { 0, 0, 0, 1, 9, 46, },
+ { 2, 0, 0, 1, 9, 40, },
+ { 1, 0, 0, 1, 9, 40, },
+ { 0, 0, 0, 1, 10, 46, },
+ { 2, 0, 0, 1, 10, 40, },
+ { 1, 0, 0, 1, 10, 40, },
+ { 0, 0, 0, 1, 11, 46, },
+ { 2, 0, 0, 1, 11, 40, },
+ { 1, 0, 0, 1, 11, 40, },
+ { 0, 0, 0, 1, 12, 63, },
+ { 2, 0, 0, 1, 12, 40, },
+ { 1, 0, 0, 1, 12, 40, },
+ { 0, 0, 0, 1, 13, 63, },
+ { 2, 0, 0, 1, 13, 40, },
+ { 1, 0, 0, 1, 13, 40, },
+ { 0, 0, 0, 1, 14, 63, },
+ { 2, 0, 0, 1, 14, 63, },
+ { 1, 0, 0, 1, 14, 63, },
+ { 0, 0, 0, 2, 1, 46, },
+ { 2, 0, 0, 2, 1, 40, },
+ { 1, 0, 0, 2, 1, 40, },
+ { 0, 0, 0, 2, 2, 46, },
+ { 2, 0, 0, 2, 2, 40, },
+ { 1, 0, 0, 2, 2, 40, },
+ { 0, 0, 0, 2, 3, 46, },
+ { 2, 0, 0, 2, 3, 40, },
+ { 1, 0, 0, 2, 3, 40, },
+ { 0, 0, 0, 2, 4, 46, },
+ { 2, 0, 0, 2, 4, 40, },
+ { 1, 0, 0, 2, 4, 40, },
+ { 0, 0, 0, 2, 5, 46, },
+ { 2, 0, 0, 2, 5, 40, },
+ { 1, 0, 0, 2, 5, 40, },
+ { 0, 0, 0, 2, 6, 46, },
+ { 2, 0, 0, 2, 6, 40, },
+ { 1, 0, 0, 2, 6, 40, },
+ { 0, 0, 0, 2, 7, 46, },
+ { 2, 0, 0, 2, 7, 40, },
+ { 1, 0, 0, 2, 7, 40, },
+ { 0, 0, 0, 2, 8, 46, },
+ { 2, 0, 0, 2, 8, 40, },
+ { 1, 0, 0, 2, 8, 40, },
+ { 0, 0, 0, 2, 9, 46, },
+ { 2, 0, 0, 2, 9, 40, },
+ { 1, 0, 0, 2, 9, 40, },
+ { 0, 0, 0, 2, 10, 46, },
+ { 2, 0, 0, 2, 10, 40, },
+ { 1, 0, 0, 2, 10, 40, },
+ { 0, 0, 0, 2, 11, 46, },
+ { 2, 0, 0, 2, 11, 40, },
+ { 1, 0, 0, 2, 11, 40, },
+ { 0, 0, 0, 2, 12, 63, },
+ { 2, 0, 0, 2, 12, 40, },
+ { 1, 0, 0, 2, 12, 40, },
+ { 0, 0, 0, 2, 13, 63, },
+ { 2, 0, 0, 2, 13, 40, },
+ { 1, 0, 0, 2, 13, 40, },
+ { 0, 0, 0, 2, 14, 63, },
+ { 2, 0, 0, 2, 14, 63, },
+ { 1, 0, 0, 2, 14, 63, },
+ { 0, 0, 0, 3, 1, 46, },
+ { 2, 0, 0, 3, 1, 40, },
+ { 1, 0, 0, 3, 1, 40, },
+ { 0, 0, 0, 3, 2, 46, },
+ { 2, 0, 0, 3, 2, 40, },
+ { 1, 0, 0, 3, 2, 40, },
+ { 0, 0, 0, 3, 3, 46, },
+ { 2, 0, 0, 3, 3, 40, },
+ { 1, 0, 0, 3, 3, 40, },
+ { 0, 0, 0, 3, 4, 46, },
+ { 2, 0, 0, 3, 4, 40, },
+ { 1, 0, 0, 3, 4, 40, },
+ { 0, 0, 0, 3, 5, 46, },
+ { 2, 0, 0, 3, 5, 40, },
+ { 1, 0, 0, 3, 5, 40, },
+ { 0, 0, 0, 3, 6, 46, },
+ { 2, 0, 0, 3, 6, 40, },
+ { 1, 0, 0, 3, 6, 40, },
+ { 0, 0, 0, 3, 7, 46, },
+ { 2, 0, 0, 3, 7, 40, },
+ { 1, 0, 0, 3, 7, 40, },
+ { 0, 0, 0, 3, 8, 46, },
+ { 2, 0, 0, 3, 8, 40, },
+ { 1, 0, 0, 3, 8, 40, },
+ { 0, 0, 0, 3, 9, 46, },
+ { 2, 0, 0, 3, 9, 40, },
+ { 1, 0, 0, 3, 9, 40, },
+ { 0, 0, 0, 3, 10, 46, },
+ { 2, 0, 0, 3, 10, 40, },
+ { 1, 0, 0, 3, 10, 40, },
+ { 0, 0, 0, 3, 11, 46, },
+ { 2, 0, 0, 3, 11, 40, },
+ { 1, 0, 0, 3, 11, 40, },
+ { 0, 0, 0, 3, 12, 63, },
+ { 2, 0, 0, 3, 12, 40, },
+ { 1, 0, 0, 3, 12, 40, },
+ { 0, 0, 0, 3, 13, 63, },
+ { 2, 0, 0, 3, 13, 40, },
+ { 1, 0, 0, 3, 13, 40, },
+ { 0, 0, 0, 3, 14, 63, },
+ { 2, 0, 0, 3, 14, 63, },
+ { 1, 0, 0, 3, 14, 63, },
+ { 0, 0, 0, 6, 1, 46, },
+ { 2, 0, 0, 6, 1, 40, },
+ { 1, 0, 0, 6, 1, 40, },
+ { 0, 0, 0, 6, 2, 46, },
+ { 2, 0, 0, 6, 2, 40, },
+ { 1, 0, 0, 6, 2, 40, },
+ { 0, 0, 0, 6, 3, 46, },
+ { 2, 0, 0, 6, 3, 40, },
+ { 1, 0, 0, 6, 3, 40, },
+ { 0, 0, 0, 6, 4, 46, },
+ { 2, 0, 0, 6, 4, 40, },
+ { 1, 0, 0, 6, 4, 40, },
+ { 0, 0, 0, 6, 5, 46, },
+ { 2, 0, 0, 6, 5, 40, },
+ { 1, 0, 0, 6, 5, 40, },
+ { 0, 0, 0, 6, 6, 46, },
+ { 2, 0, 0, 6, 6, 40, },
+ { 1, 0, 0, 6, 6, 40, },
+ { 0, 0, 0, 6, 7, 46, },
+ { 2, 0, 0, 6, 7, 40, },
+ { 1, 0, 0, 6, 7, 40, },
+ { 0, 0, 0, 6, 8, 46, },
+ { 2, 0, 0, 6, 8, 40, },
+ { 1, 0, 0, 6, 8, 40, },
+ { 0, 0, 0, 6, 9, 46, },
+ { 2, 0, 0, 6, 9, 40, },
+ { 1, 0, 0, 6, 9, 40, },
+ { 0, 0, 0, 6, 10, 46, },
+ { 2, 0, 0, 6, 10, 40, },
+ { 1, 0, 0, 6, 10, 40, },
+ { 0, 0, 0, 6, 11, 46, },
+ { 2, 0, 0, 6, 11, 40, },
+ { 1, 0, 0, 6, 11, 40, },
+ { 0, 0, 0, 6, 12, 63, },
+ { 2, 0, 0, 6, 12, 40, },
+ { 1, 0, 0, 6, 12, 40, },
+ { 0, 0, 0, 6, 13, 63, },
+ { 2, 0, 0, 6, 13, 40, },
+ { 1, 0, 0, 6, 13, 40, },
+ { 0, 0, 0, 6, 14, 63, },
+ { 2, 0, 0, 6, 14, 63, },
+ { 1, 0, 0, 6, 14, 63, },
+ { 0, 0, 0, 7, 1, 46, },
+ { 2, 0, 0, 7, 1, 40, },
+ { 1, 0, 0, 7, 1, 40, },
+ { 0, 0, 0, 7, 2, 46, },
+ { 2, 0, 0, 7, 2, 40, },
+ { 1, 0, 0, 7, 2, 40, },
+ { 0, 0, 0, 7, 3, 46, },
+ { 2, 0, 0, 7, 3, 40, },
+ { 1, 0, 0, 7, 3, 40, },
+ { 0, 0, 0, 7, 4, 46, },
+ { 2, 0, 0, 7, 4, 40, },
+ { 1, 0, 0, 7, 4, 40, },
+ { 0, 0, 0, 7, 5, 46, },
+ { 2, 0, 0, 7, 5, 40, },
+ { 1, 0, 0, 7, 5, 40, },
+ { 0, 0, 0, 7, 6, 46, },
+ { 2, 0, 0, 7, 6, 40, },
+ { 1, 0, 0, 7, 6, 40, },
+ { 0, 0, 0, 7, 7, 46, },
+ { 2, 0, 0, 7, 7, 40, },
+ { 1, 0, 0, 7, 7, 40, },
+ { 0, 0, 0, 7, 8, 46, },
+ { 2, 0, 0, 7, 8, 40, },
+ { 1, 0, 0, 7, 8, 40, },
+ { 0, 0, 0, 7, 9, 46, },
+ { 2, 0, 0, 7, 9, 40, },
+ { 1, 0, 0, 7, 9, 40, },
+ { 0, 0, 0, 7, 10, 46, },
+ { 2, 0, 0, 7, 10, 40, },
+ { 1, 0, 0, 7, 10, 40, },
+ { 0, 0, 0, 7, 11, 46, },
+ { 2, 0, 0, 7, 11, 40, },
+ { 1, 0, 0, 7, 11, 40, },
+ { 0, 0, 0, 7, 12, 63, },
+ { 2, 0, 0, 7, 12, 40, },
+ { 1, 0, 0, 7, 12, 40, },
+ { 0, 0, 0, 7, 13, 63, },
+ { 2, 0, 0, 7, 13, 40, },
+ { 1, 0, 0, 7, 13, 40, },
+ { 0, 0, 0, 7, 14, 63, },
+ { 2, 0, 0, 7, 14, 63, },
+ { 1, 0, 0, 7, 14, 63, },
+ { 0, 0, 1, 2, 1, 63, },
+ { 2, 0, 1, 2, 1, 63, },
+ { 1, 0, 1, 2, 1, 63, },
+ { 0, 0, 1, 2, 2, 63, },
+ { 2, 0, 1, 2, 2, 63, },
+ { 1, 0, 1, 2, 2, 63, },
+ { 0, 0, 1, 2, 3, 46, },
+ { 2, 0, 1, 2, 3, 40, },
+ { 1, 0, 1, 2, 3, 40, },
+ { 0, 0, 1, 2, 4, 46, },
+ { 2, 0, 1, 2, 4, 40, },
+ { 1, 0, 1, 2, 4, 40, },
+ { 0, 0, 1, 2, 5, 46, },
+ { 2, 0, 1, 2, 5, 40, },
+ { 1, 0, 1, 2, 5, 40, },
+ { 0, 0, 1, 2, 6, 46, },
+ { 2, 0, 1, 2, 6, 40, },
+ { 1, 0, 1, 2, 6, 40, },
+ { 0, 0, 1, 2, 7, 46, },
+ { 2, 0, 1, 2, 7, 40, },
+ { 1, 0, 1, 2, 7, 40, },
+ { 0, 0, 1, 2, 8, 46, },
+ { 2, 0, 1, 2, 8, 40, },
+ { 1, 0, 1, 2, 8, 40, },
+ { 0, 0, 1, 2, 9, 46, },
+ { 2, 0, 1, 2, 9, 40, },
+ { 1, 0, 1, 2, 9, 40, },
+ { 0, 0, 1, 2, 10, 46, },
+ { 2, 0, 1, 2, 10, 40, },
+ { 1, 0, 1, 2, 10, 40, },
+ { 0, 0, 1, 2, 11, 46, },
+ { 2, 0, 1, 2, 11, 40, },
+ { 1, 0, 1, 2, 11, 40, },
+ { 0, 0, 1, 2, 12, 63, },
+ { 2, 0, 1, 2, 12, 40, },
+ { 1, 0, 1, 2, 12, 40, },
+ { 0, 0, 1, 2, 13, 63, },
+ { 2, 0, 1, 2, 13, 40, },
+ { 1, 0, 1, 2, 13, 40, },
+ { 0, 0, 1, 2, 14, 63, },
+ { 2, 0, 1, 2, 14, 63, },
+ { 1, 0, 1, 2, 14, 63, },
+ { 0, 0, 1, 3, 1, 63, },
+ { 2, 0, 1, 3, 1, 63, },
+ { 1, 0, 1, 3, 1, 63, },
+ { 0, 0, 1, 3, 2, 63, },
+ { 2, 0, 1, 3, 2, 63, },
+ { 1, 0, 1, 3, 2, 63, },
+ { 0, 0, 1, 3, 3, 46, },
+ { 2, 0, 1, 3, 3, 40, },
+ { 1, 0, 1, 3, 3, 40, },
+ { 0, 0, 1, 3, 4, 46, },
+ { 2, 0, 1, 3, 4, 40, },
+ { 1, 0, 1, 3, 4, 40, },
+ { 0, 0, 1, 3, 5, 46, },
+ { 2, 0, 1, 3, 5, 40, },
+ { 1, 0, 1, 3, 5, 40, },
+ { 0, 0, 1, 3, 6, 46, },
+ { 2, 0, 1, 3, 6, 40, },
+ { 1, 0, 1, 3, 6, 40, },
+ { 0, 0, 1, 3, 7, 46, },
+ { 2, 0, 1, 3, 7, 40, },
+ { 1, 0, 1, 3, 7, 40, },
+ { 0, 0, 1, 3, 8, 46, },
+ { 2, 0, 1, 3, 8, 40, },
+ { 1, 0, 1, 3, 8, 40, },
+ { 0, 0, 1, 3, 9, 46, },
+ { 2, 0, 1, 3, 9, 40, },
+ { 1, 0, 1, 3, 9, 40, },
+ { 0, 0, 1, 3, 10, 46, },
+ { 2, 0, 1, 3, 10, 40, },
+ { 1, 0, 1, 3, 10, 40, },
+ { 0, 0, 1, 3, 11, 46, },
+ { 2, 0, 1, 3, 11, 40, },
+ { 1, 0, 1, 3, 11, 40, },
+ { 0, 0, 1, 3, 12, 63, },
+ { 2, 0, 1, 3, 12, 40, },
+ { 1, 0, 1, 3, 12, 40, },
+ { 0, 0, 1, 3, 13, 63, },
+ { 2, 0, 1, 3, 13, 40, },
+ { 1, 0, 1, 3, 13, 40, },
+ { 0, 0, 1, 3, 14, 63, },
+ { 2, 0, 1, 3, 14, 63, },
+ { 1, 0, 1, 3, 14, 63, },
+ { 0, 0, 1, 6, 1, 63, },
+ { 2, 0, 1, 6, 1, 63, },
+ { 1, 0, 1, 6, 1, 63, },
+ { 0, 0, 1, 6, 2, 63, },
+ { 2, 0, 1, 6, 2, 63, },
+ { 1, 0, 1, 6, 2, 63, },
+ { 0, 0, 1, 6, 3, 46, },
+ { 2, 0, 1, 6, 3, 40, },
+ { 1, 0, 1, 6, 3, 40, },
+ { 0, 0, 1, 6, 4, 46, },
+ { 2, 0, 1, 6, 4, 40, },
+ { 1, 0, 1, 6, 4, 40, },
+ { 0, 0, 1, 6, 5, 46, },
+ { 2, 0, 1, 6, 5, 40, },
+ { 1, 0, 1, 6, 5, 40, },
+ { 0, 0, 1, 6, 6, 46, },
+ { 2, 0, 1, 6, 6, 40, },
+ { 1, 0, 1, 6, 6, 40, },
+ { 0, 0, 1, 6, 7, 46, },
+ { 2, 0, 1, 6, 7, 40, },
+ { 1, 0, 1, 6, 7, 40, },
+ { 0, 0, 1, 6, 8, 46, },
+ { 2, 0, 1, 6, 8, 40, },
+ { 1, 0, 1, 6, 8, 40, },
+ { 0, 0, 1, 6, 9, 46, },
+ { 2, 0, 1, 6, 9, 40, },
+ { 1, 0, 1, 6, 9, 40, },
+ { 0, 0, 1, 6, 10, 46, },
+ { 2, 0, 1, 6, 10, 40, },
+ { 1, 0, 1, 6, 10, 40, },
+ { 0, 0, 1, 6, 11, 46, },
+ { 2, 0, 1, 6, 11, 40, },
+ { 1, 0, 1, 6, 11, 40, },
+ { 0, 0, 1, 6, 12, 63, },
+ { 2, 0, 1, 6, 12, 40, },
+ { 1, 0, 1, 6, 12, 40, },
+ { 0, 0, 1, 6, 13, 63, },
+ { 2, 0, 1, 6, 13, 40, },
+ { 1, 0, 1, 6, 13, 40, },
+ { 0, 0, 1, 6, 14, 63, },
+ { 2, 0, 1, 6, 14, 63, },
+ { 1, 0, 1, 6, 14, 63, },
+ { 0, 0, 1, 7, 1, 63, },
+ { 2, 0, 1, 7, 1, 63, },
+ { 1, 0, 1, 7, 1, 63, },
+ { 0, 0, 1, 7, 2, 63, },
+ { 2, 0, 1, 7, 2, 63, },
+ { 1, 0, 1, 7, 2, 63, },
+ { 0, 0, 1, 7, 3, 46, },
+ { 2, 0, 1, 7, 3, 40, },
+ { 1, 0, 1, 7, 3, 40, },
+ { 0, 0, 1, 7, 4, 46, },
+ { 2, 0, 1, 7, 4, 40, },
+ { 1, 0, 1, 7, 4, 40, },
+ { 0, 0, 1, 7, 5, 46, },
+ { 2, 0, 1, 7, 5, 40, },
+ { 1, 0, 1, 7, 5, 40, },
+ { 0, 0, 1, 7, 6, 46, },
+ { 2, 0, 1, 7, 6, 40, },
+ { 1, 0, 1, 7, 6, 40, },
+ { 0, 0, 1, 7, 7, 46, },
+ { 2, 0, 1, 7, 7, 40, },
+ { 1, 0, 1, 7, 7, 40, },
+ { 0, 0, 1, 7, 8, 46, },
+ { 2, 0, 1, 7, 8, 40, },
+ { 1, 0, 1, 7, 8, 40, },
+ { 0, 0, 1, 7, 9, 46, },
+ { 2, 0, 1, 7, 9, 40, },
+ { 1, 0, 1, 7, 9, 40, },
+ { 0, 0, 1, 7, 10, 46, },
+ { 2, 0, 1, 7, 10, 40, },
+ { 1, 0, 1, 7, 10, 40, },
+ { 0, 0, 1, 7, 11, 46, },
+ { 2, 0, 1, 7, 11, 40, },
+ { 1, 0, 1, 7, 11, 40, },
+ { 0, 0, 1, 7, 12, 63, },
+ { 2, 0, 1, 7, 12, 40, },
+ { 1, 0, 1, 7, 12, 40, },
+ { 0, 0, 1, 7, 13, 63, },
+ { 2, 0, 1, 7, 13, 40, },
+ { 1, 0, 1, 7, 13, 40, },
+ { 0, 0, 1, 7, 14, 63, },
+ { 2, 0, 1, 7, 14, 63, },
+ { 1, 0, 1, 7, 14, 63, },
+ { 0, 1, 0, 1, 36, 46, },
+ { 2, 1, 0, 1, 36, 40, },
+ { 1, 1, 0, 1, 36, 40, },
+ { 0, 1, 0, 1, 40, 46, },
+ { 2, 1, 0, 1, 40, 40, },
+ { 1, 1, 0, 1, 40, 40, },
+ { 0, 1, 0, 1, 44, 46, },
+ { 2, 1, 0, 1, 44, 40, },
+ { 1, 1, 0, 1, 44, 40, },
+ { 0, 1, 0, 1, 48, 46, },
+ { 2, 1, 0, 1, 48, 40, },
+ { 1, 1, 0, 1, 48, 40, },
+ { 0, 1, 0, 1, 52, 46, },
+ { 2, 1, 0, 1, 52, 40, },
+ { 1, 1, 0, 1, 52, 40, },
+ { 0, 1, 0, 1, 56, 46, },
+ { 2, 1, 0, 1, 56, 40, },
+ { 1, 1, 0, 1, 56, 40, },
+ { 0, 1, 0, 1, 60, 46, },
+ { 2, 1, 0, 1, 60, 40, },
+ { 1, 1, 0, 1, 60, 40, },
+ { 0, 1, 0, 1, 64, 46, },
+ { 2, 1, 0, 1, 64, 40, },
+ { 1, 1, 0, 1, 64, 40, },
+ { 0, 1, 0, 1, 100, 46, },
+ { 2, 1, 0, 1, 100, 40, },
+ { 1, 1, 0, 1, 100, 40, },
+ { 0, 1, 0, 1, 104, 46, },
+ { 2, 1, 0, 1, 104, 40, },
+ { 1, 1, 0, 1, 104, 40, },
+ { 0, 1, 0, 1, 108, 46, },
+ { 2, 1, 0, 1, 108, 40, },
+ { 1, 1, 0, 1, 108, 40, },
+ { 0, 1, 0, 1, 112, 46, },
+ { 2, 1, 0, 1, 112, 40, },
+ { 1, 1, 0, 1, 112, 40, },
+ { 0, 1, 0, 1, 116, 46, },
+ { 2, 1, 0, 1, 116, 40, },
+ { 1, 1, 0, 1, 116, 40, },
+ { 0, 1, 0, 1, 120, 46, },
+ { 2, 1, 0, 1, 120, 40, },
+ { 1, 1, 0, 1, 120, 40, },
+ { 0, 1, 0, 1, 124, 46, },
+ { 2, 1, 0, 1, 124, 40, },
+ { 1, 1, 0, 1, 124, 40, },
+ { 0, 1, 0, 1, 128, 46, },
+ { 2, 1, 0, 1, 128, 40, },
+ { 1, 1, 0, 1, 128, 40, },
+ { 0, 1, 0, 1, 132, 46, },
+ { 2, 1, 0, 1, 132, 40, },
+ { 1, 1, 0, 1, 132, 40, },
+ { 0, 1, 0, 1, 136, 46, },
+ { 2, 1, 0, 1, 136, 40, },
+ { 1, 1, 0, 1, 136, 40, },
+ { 0, 1, 0, 1, 140, 46, },
+ { 2, 1, 0, 1, 140, 40, },
+ { 1, 1, 0, 1, 140, 40, },
+ { 0, 1, 0, 1, 149, 46, },
+ { 2, 1, 0, 1, 149, 40, },
+ { 1, 1, 0, 1, 149, 63, },
+ { 0, 1, 0, 1, 153, 46, },
+ { 2, 1, 0, 1, 153, 40, },
+ { 1, 1, 0, 1, 153, 63, },
+ { 0, 1, 0, 1, 157, 46, },
+ { 2, 1, 0, 1, 157, 40, },
+ { 1, 1, 0, 1, 157, 63, },
+ { 0, 1, 0, 1, 161, 46, },
+ { 2, 1, 0, 1, 161, 40, },
+ { 1, 1, 0, 1, 161, 63, },
+ { 0, 1, 0, 1, 165, 46, },
+ { 2, 1, 0, 1, 165, 40, },
+ { 1, 1, 0, 1, 165, 63, },
+ { 0, 1, 0, 2, 36, 46, },
+ { 2, 1, 0, 2, 36, 40, },
+ { 1, 1, 0, 2, 36, 40, },
+ { 0, 1, 0, 2, 40, 46, },
+ { 2, 1, 0, 2, 40, 40, },
+ { 1, 1, 0, 2, 40, 40, },
+ { 0, 1, 0, 2, 44, 46, },
+ { 2, 1, 0, 2, 44, 40, },
+ { 1, 1, 0, 2, 44, 40, },
+ { 0, 1, 0, 2, 48, 46, },
+ { 2, 1, 0, 2, 48, 40, },
+ { 1, 1, 0, 2, 48, 40, },
+ { 0, 1, 0, 2, 52, 46, },
+ { 2, 1, 0, 2, 52, 40, },
+ { 1, 1, 0, 2, 52, 40, },
+ { 0, 1, 0, 2, 56, 46, },
+ { 2, 1, 0, 2, 56, 40, },
+ { 1, 1, 0, 2, 56, 40, },
+ { 0, 1, 0, 2, 60, 46, },
+ { 2, 1, 0, 2, 60, 40, },
+ { 1, 1, 0, 2, 60, 40, },
+ { 0, 1, 0, 2, 64, 46, },
+ { 2, 1, 0, 2, 64, 40, },
+ { 1, 1, 0, 2, 64, 40, },
+ { 0, 1, 0, 2, 100, 46, },
+ { 2, 1, 0, 2, 100, 40, },
+ { 1, 1, 0, 2, 100, 40, },
+ { 0, 1, 0, 2, 104, 46, },
+ { 2, 1, 0, 2, 104, 40, },
+ { 1, 1, 0, 2, 104, 40, },
+ { 0, 1, 0, 2, 108, 46, },
+ { 2, 1, 0, 2, 108, 40, },
+ { 1, 1, 0, 2, 108, 40, },
+ { 0, 1, 0, 2, 112, 46, },
+ { 2, 1, 0, 2, 112, 40, },
+ { 1, 1, 0, 2, 112, 40, },
+ { 0, 1, 0, 2, 116, 46, },
+ { 2, 1, 0, 2, 116, 40, },
+ { 1, 1, 0, 2, 116, 40, },
+ { 0, 1, 0, 2, 120, 46, },
+ { 2, 1, 0, 2, 120, 40, },
+ { 1, 1, 0, 2, 120, 40, },
+ { 0, 1, 0, 2, 124, 46, },
+ { 2, 1, 0, 2, 124, 40, },
+ { 1, 1, 0, 2, 124, 40, },
+ { 0, 1, 0, 2, 128, 46, },
+ { 2, 1, 0, 2, 128, 40, },
+ { 1, 1, 0, 2, 128, 40, },
+ { 0, 1, 0, 2, 132, 46, },
+ { 2, 1, 0, 2, 132, 40, },
+ { 1, 1, 0, 2, 132, 40, },
+ { 0, 1, 0, 2, 136, 46, },
+ { 2, 1, 0, 2, 136, 40, },
+ { 1, 1, 0, 2, 136, 40, },
+ { 0, 1, 0, 2, 140, 46, },
+ { 2, 1, 0, 2, 140, 40, },
+ { 1, 1, 0, 2, 140, 40, },
+ { 0, 1, 0, 2, 149, 46, },
+ { 2, 1, 0, 2, 149, 40, },
+ { 1, 1, 0, 2, 149, 63, },
+ { 0, 1, 0, 2, 153, 46, },
+ { 2, 1, 0, 2, 153, 40, },
+ { 1, 1, 0, 2, 153, 63, },
+ { 0, 1, 0, 2, 157, 46, },
+ { 2, 1, 0, 2, 157, 40, },
+ { 1, 1, 0, 2, 157, 63, },
+ { 0, 1, 0, 2, 161, 46, },
+ { 2, 1, 0, 2, 161, 40, },
+ { 1, 1, 0, 2, 161, 63, },
+ { 0, 1, 0, 2, 165, 46, },
+ { 2, 1, 0, 2, 165, 40, },
+ { 1, 1, 0, 2, 165, 63, },
+ { 0, 1, 0, 3, 36, 46, },
+ { 2, 1, 0, 3, 36, 40, },
+ { 1, 1, 0, 3, 36, 40, },
+ { 0, 1, 0, 3, 40, 46, },
+ { 2, 1, 0, 3, 40, 40, },
+ { 1, 1, 0, 3, 40, 40, },
+ { 0, 1, 0, 3, 44, 46, },
+ { 2, 1, 0, 3, 44, 40, },
+ { 1, 1, 0, 3, 44, 40, },
+ { 0, 1, 0, 3, 48, 46, },
+ { 2, 1, 0, 3, 48, 40, },
+ { 1, 1, 0, 3, 48, 40, },
+ { 0, 1, 0, 3, 52, 46, },
+ { 2, 1, 0, 3, 52, 40, },
+ { 1, 1, 0, 3, 52, 40, },
+ { 0, 1, 0, 3, 56, 46, },
+ { 2, 1, 0, 3, 56, 40, },
+ { 1, 1, 0, 3, 56, 40, },
+ { 0, 1, 0, 3, 60, 46, },
+ { 2, 1, 0, 3, 60, 40, },
+ { 1, 1, 0, 3, 60, 40, },
+ { 0, 1, 0, 3, 64, 46, },
+ { 2, 1, 0, 3, 64, 40, },
+ { 1, 1, 0, 3, 64, 40, },
+ { 0, 1, 0, 3, 100, 46, },
+ { 2, 1, 0, 3, 100, 40, },
+ { 1, 1, 0, 3, 100, 40, },
+ { 0, 1, 0, 3, 104, 46, },
+ { 2, 1, 0, 3, 104, 40, },
+ { 1, 1, 0, 3, 104, 40, },
+ { 0, 1, 0, 3, 108, 46, },
+ { 2, 1, 0, 3, 108, 40, },
+ { 1, 1, 0, 3, 108, 40, },
+ { 0, 1, 0, 3, 112, 46, },
+ { 2, 1, 0, 3, 112, 40, },
+ { 1, 1, 0, 3, 112, 40, },
+ { 0, 1, 0, 3, 116, 46, },
+ { 2, 1, 0, 3, 116, 40, },
+ { 1, 1, 0, 3, 116, 40, },
+ { 0, 1, 0, 3, 120, 46, },
+ { 2, 1, 0, 3, 120, 40, },
+ { 1, 1, 0, 3, 120, 40, },
+ { 0, 1, 0, 3, 124, 46, },
+ { 2, 1, 0, 3, 124, 40, },
+ { 1, 1, 0, 3, 124, 40, },
+ { 0, 1, 0, 3, 128, 46, },
+ { 2, 1, 0, 3, 128, 40, },
+ { 1, 1, 0, 3, 128, 40, },
+ { 0, 1, 0, 3, 132, 46, },
+ { 2, 1, 0, 3, 132, 40, },
+ { 1, 1, 0, 3, 132, 40, },
+ { 0, 1, 0, 3, 136, 46, },
+ { 2, 1, 0, 3, 136, 40, },
+ { 1, 1, 0, 3, 136, 40, },
+ { 0, 1, 0, 3, 140, 46, },
+ { 2, 1, 0, 3, 140, 40, },
+ { 1, 1, 0, 3, 140, 40, },
+ { 0, 1, 0, 3, 149, 46, },
+ { 2, 1, 0, 3, 149, 40, },
+ { 1, 1, 0, 3, 149, 63, },
+ { 0, 1, 0, 3, 153, 46, },
+ { 2, 1, 0, 3, 153, 40, },
+ { 1, 1, 0, 3, 153, 63, },
+ { 0, 1, 0, 3, 157, 46, },
+ { 2, 1, 0, 3, 157, 40, },
+ { 1, 1, 0, 3, 157, 63, },
+ { 0, 1, 0, 3, 161, 46, },
+ { 2, 1, 0, 3, 161, 40, },
+ { 1, 1, 0, 3, 161, 63, },
+ { 0, 1, 0, 3, 165, 46, },
+ { 2, 1, 0, 3, 165, 40, },
+ { 1, 1, 0, 3, 165, 63, },
+ { 0, 1, 0, 6, 36, 46, },
+ { 2, 1, 0, 6, 36, 40, },
+ { 1, 1, 0, 6, 36, 40, },
+ { 0, 1, 0, 6, 40, 46, },
+ { 2, 1, 0, 6, 40, 40, },
+ { 1, 1, 0, 6, 40, 40, },
+ { 0, 1, 0, 6, 44, 46, },
+ { 2, 1, 0, 6, 44, 40, },
+ { 1, 1, 0, 6, 44, 40, },
+ { 0, 1, 0, 6, 48, 46, },
+ { 2, 1, 0, 6, 48, 40, },
+ { 1, 1, 0, 6, 48, 40, },
+ { 0, 1, 0, 6, 52, 46, },
+ { 2, 1, 0, 6, 52, 40, },
+ { 1, 1, 0, 6, 52, 40, },
+ { 0, 1, 0, 6, 56, 46, },
+ { 2, 1, 0, 6, 56, 40, },
+ { 1, 1, 0, 6, 56, 40, },
+ { 0, 1, 0, 6, 60, 46, },
+ { 2, 1, 0, 6, 60, 40, },
+ { 1, 1, 0, 6, 60, 40, },
+ { 0, 1, 0, 6, 64, 46, },
+ { 2, 1, 0, 6, 64, 40, },
+ { 1, 1, 0, 6, 64, 40, },
+ { 0, 1, 0, 6, 100, 46, },
+ { 2, 1, 0, 6, 100, 40, },
+ { 1, 1, 0, 6, 100, 40, },
+ { 0, 1, 0, 6, 104, 46, },
+ { 2, 1, 0, 6, 104, 40, },
+ { 1, 1, 0, 6, 104, 40, },
+ { 0, 1, 0, 6, 108, 46, },
+ { 2, 1, 0, 6, 108, 40, },
+ { 1, 1, 0, 6, 108, 40, },
+ { 0, 1, 0, 6, 112, 46, },
+ { 2, 1, 0, 6, 112, 40, },
+ { 1, 1, 0, 6, 112, 40, },
+ { 0, 1, 0, 6, 116, 46, },
+ { 2, 1, 0, 6, 116, 40, },
+ { 1, 1, 0, 6, 116, 40, },
+ { 0, 1, 0, 6, 120, 46, },
+ { 2, 1, 0, 6, 120, 40, },
+ { 1, 1, 0, 6, 120, 40, },
+ { 0, 1, 0, 6, 124, 46, },
+ { 2, 1, 0, 6, 124, 40, },
+ { 1, 1, 0, 6, 124, 40, },
+ { 0, 1, 0, 6, 128, 46, },
+ { 2, 1, 0, 6, 128, 40, },
+ { 1, 1, 0, 6, 128, 40, },
+ { 0, 1, 0, 6, 132, 46, },
+ { 2, 1, 0, 6, 132, 40, },
+ { 1, 1, 0, 6, 132, 40, },
+ { 0, 1, 0, 6, 136, 46, },
+ { 2, 1, 0, 6, 136, 40, },
+ { 1, 1, 0, 6, 136, 40, },
+ { 0, 1, 0, 6, 140, 46, },
+ { 2, 1, 0, 6, 140, 40, },
+ { 1, 1, 0, 6, 140, 40, },
+ { 0, 1, 0, 6, 149, 46, },
+ { 2, 1, 0, 6, 149, 40, },
+ { 1, 1, 0, 6, 149, 63, },
+ { 0, 1, 0, 6, 153, 46, },
+ { 2, 1, 0, 6, 153, 40, },
+ { 1, 1, 0, 6, 153, 63, },
+ { 0, 1, 0, 6, 157, 46, },
+ { 2, 1, 0, 6, 157, 40, },
+ { 1, 1, 0, 6, 157, 63, },
+ { 0, 1, 0, 6, 161, 46, },
+ { 2, 1, 0, 6, 161, 40, },
+ { 1, 1, 0, 6, 161, 63, },
+ { 0, 1, 0, 6, 165, 46, },
+ { 2, 1, 0, 6, 165, 40, },
+ { 1, 1, 0, 6, 165, 63, },
+ { 0, 1, 0, 7, 36, 46, },
+ { 2, 1, 0, 7, 36, 40, },
+ { 1, 1, 0, 7, 36, 40, },
+ { 0, 1, 0, 7, 40, 46, },
+ { 2, 1, 0, 7, 40, 40, },
+ { 1, 1, 0, 7, 40, 40, },
+ { 0, 1, 0, 7, 44, 46, },
+ { 2, 1, 0, 7, 44, 40, },
+ { 1, 1, 0, 7, 44, 40, },
+ { 0, 1, 0, 7, 48, 46, },
+ { 2, 1, 0, 7, 48, 40, },
+ { 1, 1, 0, 7, 48, 40, },
+ { 0, 1, 0, 7, 52, 46, },
+ { 2, 1, 0, 7, 52, 40, },
+ { 1, 1, 0, 7, 52, 40, },
+ { 0, 1, 0, 7, 56, 46, },
+ { 2, 1, 0, 7, 56, 40, },
+ { 1, 1, 0, 7, 56, 40, },
+ { 0, 1, 0, 7, 60, 46, },
+ { 2, 1, 0, 7, 60, 40, },
+ { 1, 1, 0, 7, 60, 40, },
+ { 0, 1, 0, 7, 64, 46, },
+ { 2, 1, 0, 7, 64, 40, },
+ { 1, 1, 0, 7, 64, 40, },
+ { 0, 1, 0, 7, 100, 46, },
+ { 2, 1, 0, 7, 100, 40, },
+ { 1, 1, 0, 7, 100, 40, },
+ { 0, 1, 0, 7, 104, 46, },
+ { 2, 1, 0, 7, 104, 40, },
+ { 1, 1, 0, 7, 104, 40, },
+ { 0, 1, 0, 7, 108, 46, },
+ { 2, 1, 0, 7, 108, 40, },
+ { 1, 1, 0, 7, 108, 40, },
+ { 0, 1, 0, 7, 112, 46, },
+ { 2, 1, 0, 7, 112, 40, },
+ { 1, 1, 0, 7, 112, 40, },
+ { 0, 1, 0, 7, 116, 46, },
+ { 2, 1, 0, 7, 116, 40, },
+ { 1, 1, 0, 7, 116, 40, },
+ { 0, 1, 0, 7, 120, 46, },
+ { 2, 1, 0, 7, 120, 40, },
+ { 1, 1, 0, 7, 120, 40, },
+ { 0, 1, 0, 7, 124, 46, },
+ { 2, 1, 0, 7, 124, 40, },
+ { 1, 1, 0, 7, 124, 40, },
+ { 0, 1, 0, 7, 128, 46, },
+ { 2, 1, 0, 7, 128, 40, },
+ { 1, 1, 0, 7, 128, 40, },
+ { 0, 1, 0, 7, 132, 46, },
+ { 2, 1, 0, 7, 132, 40, },
+ { 1, 1, 0, 7, 132, 40, },
+ { 0, 1, 0, 7, 136, 46, },
+ { 2, 1, 0, 7, 136, 40, },
+ { 1, 1, 0, 7, 136, 40, },
+ { 0, 1, 0, 7, 140, 46, },
+ { 2, 1, 0, 7, 140, 40, },
+ { 1, 1, 0, 7, 140, 40, },
+ { 0, 1, 0, 7, 149, 46, },
+ { 2, 1, 0, 7, 149, 40, },
+ { 1, 1, 0, 7, 149, 63, },
+ { 0, 1, 0, 7, 153, 46, },
+ { 2, 1, 0, 7, 153, 40, },
+ { 1, 1, 0, 7, 153, 63, },
+ { 0, 1, 0, 7, 157, 46, },
+ { 2, 1, 0, 7, 157, 40, },
+ { 1, 1, 0, 7, 157, 63, },
+ { 0, 1, 0, 7, 161, 46, },
+ { 2, 1, 0, 7, 161, 40, },
+ { 1, 1, 0, 7, 161, 63, },
+ { 0, 1, 0, 7, 165, 46, },
+ { 2, 1, 0, 7, 165, 40, },
+ { 1, 1, 0, 7, 165, 63, },
+ { 0, 1, 1, 2, 38, 46, },
+ { 2, 1, 1, 2, 38, 40, },
+ { 1, 1, 1, 2, 38, 40, },
+ { 0, 1, 1, 2, 46, 46, },
+ { 2, 1, 1, 2, 46, 40, },
+ { 1, 1, 1, 2, 46, 40, },
+ { 0, 1, 1, 2, 54, 46, },
+ { 2, 1, 1, 2, 54, 40, },
+ { 1, 1, 1, 2, 54, 40, },
+ { 0, 1, 1, 2, 62, 46, },
+ { 2, 1, 1, 2, 62, 40, },
+ { 1, 1, 1, 2, 62, 40, },
+ { 0, 1, 1, 2, 102, 46, },
+ { 2, 1, 1, 2, 102, 40, },
+ { 1, 1, 1, 2, 102, 40, },
+ { 0, 1, 1, 2, 110, 46, },
+ { 2, 1, 1, 2, 110, 40, },
+ { 1, 1, 1, 2, 110, 40, },
+ { 0, 1, 1, 2, 118, 46, },
+ { 2, 1, 1, 2, 118, 40, },
+ { 1, 1, 1, 2, 118, 40, },
+ { 0, 1, 1, 2, 126, 46, },
+ { 2, 1, 1, 2, 126, 40, },
+ { 1, 1, 1, 2, 126, 40, },
+ { 0, 1, 1, 2, 134, 46, },
+ { 2, 1, 1, 2, 134, 40, },
+ { 1, 1, 1, 2, 134, 40, },
+ { 0, 1, 1, 2, 151, 46, },
+ { 2, 1, 1, 2, 151, 40, },
+ { 1, 1, 1, 2, 151, 63, },
+ { 0, 1, 1, 2, 159, 46, },
+ { 2, 1, 1, 2, 159, 40, },
+ { 1, 1, 1, 2, 159, 63, },
+ { 0, 1, 1, 3, 38, 46, },
+ { 2, 1, 1, 3, 38, 40, },
+ { 1, 1, 1, 3, 38, 40, },
+ { 0, 1, 1, 3, 46, 46, },
+ { 2, 1, 1, 3, 46, 40, },
+ { 1, 1, 1, 3, 46, 40, },
+ { 0, 1, 1, 3, 54, 46, },
+ { 2, 1, 1, 3, 54, 40, },
+ { 1, 1, 1, 3, 54, 40, },
+ { 0, 1, 1, 3, 62, 46, },
+ { 2, 1, 1, 3, 62, 40, },
+ { 1, 1, 1, 3, 62, 40, },
+ { 0, 1, 1, 3, 102, 46, },
+ { 2, 1, 1, 3, 102, 40, },
+ { 1, 1, 1, 3, 102, 40, },
+ { 0, 1, 1, 3, 110, 46, },
+ { 2, 1, 1, 3, 110, 40, },
+ { 1, 1, 1, 3, 110, 40, },
+ { 0, 1, 1, 3, 118, 46, },
+ { 2, 1, 1, 3, 118, 40, },
+ { 1, 1, 1, 3, 118, 40, },
+ { 0, 1, 1, 3, 126, 46, },
+ { 2, 1, 1, 3, 126, 40, },
+ { 1, 1, 1, 3, 126, 40, },
+ { 0, 1, 1, 3, 134, 46, },
+ { 2, 1, 1, 3, 134, 40, },
+ { 1, 1, 1, 3, 134, 40, },
+ { 0, 1, 1, 3, 151, 46, },
+ { 2, 1, 1, 3, 151, 40, },
+ { 1, 1, 1, 3, 151, 63, },
+ { 0, 1, 1, 3, 159, 46, },
+ { 2, 1, 1, 3, 159, 40, },
+ { 1, 1, 1, 3, 159, 63, },
+ { 0, 1, 1, 6, 38, 46, },
+ { 2, 1, 1, 6, 38, 40, },
+ { 1, 1, 1, 6, 38, 40, },
+ { 0, 1, 1, 6, 46, 46, },
+ { 2, 1, 1, 6, 46, 40, },
+ { 1, 1, 1, 6, 46, 40, },
+ { 0, 1, 1, 6, 54, 46, },
+ { 2, 1, 1, 6, 54, 40, },
+ { 1, 1, 1, 6, 54, 40, },
+ { 0, 1, 1, 6, 62, 46, },
+ { 2, 1, 1, 6, 62, 40, },
+ { 1, 1, 1, 6, 62, 40, },
+ { 0, 1, 1, 6, 102, 46, },
+ { 2, 1, 1, 6, 102, 40, },
+ { 1, 1, 1, 6, 102, 40, },
+ { 0, 1, 1, 6, 110, 46, },
+ { 2, 1, 1, 6, 110, 40, },
+ { 1, 1, 1, 6, 110, 40, },
+ { 0, 1, 1, 6, 118, 46, },
+ { 2, 1, 1, 6, 118, 40, },
+ { 1, 1, 1, 6, 118, 40, },
+ { 0, 1, 1, 6, 126, 46, },
+ { 2, 1, 1, 6, 126, 40, },
+ { 1, 1, 1, 6, 126, 40, },
+ { 0, 1, 1, 6, 134, 46, },
+ { 2, 1, 1, 6, 134, 40, },
+ { 1, 1, 1, 6, 134, 40, },
+ { 0, 1, 1, 6, 151, 46, },
+ { 2, 1, 1, 6, 151, 40, },
+ { 1, 1, 1, 6, 151, 63, },
+ { 0, 1, 1, 6, 159, 46, },
+ { 2, 1, 1, 6, 159, 40, },
+ { 1, 1, 1, 6, 159, 63, },
+ { 0, 1, 1, 7, 38, 46, },
+ { 2, 1, 1, 7, 38, 40, },
+ { 1, 1, 1, 7, 38, 40, },
+ { 0, 1, 1, 7, 46, 46, },
+ { 2, 1, 1, 7, 46, 40, },
+ { 1, 1, 1, 7, 46, 40, },
+ { 0, 1, 1, 7, 54, 46, },
+ { 2, 1, 1, 7, 54, 40, },
+ { 1, 1, 1, 7, 54, 40, },
+ { 0, 1, 1, 7, 62, 46, },
+ { 2, 1, 1, 7, 62, 40, },
+ { 1, 1, 1, 7, 62, 40, },
+ { 0, 1, 1, 7, 102, 46, },
+ { 2, 1, 1, 7, 102, 40, },
+ { 1, 1, 1, 7, 102, 40, },
+ { 0, 1, 1, 7, 110, 46, },
+ { 2, 1, 1, 7, 110, 40, },
+ { 1, 1, 1, 7, 110, 40, },
+ { 0, 1, 1, 7, 118, 46, },
+ { 2, 1, 1, 7, 118, 40, },
+ { 1, 1, 1, 7, 118, 40, },
+ { 0, 1, 1, 7, 126, 46, },
+ { 2, 1, 1, 7, 126, 40, },
+ { 1, 1, 1, 7, 126, 40, },
+ { 0, 1, 1, 7, 134, 46, },
+ { 2, 1, 1, 7, 134, 40, },
+ { 1, 1, 1, 7, 134, 40, },
+ { 0, 1, 1, 7, 151, 46, },
+ { 2, 1, 1, 7, 151, 40, },
+ { 1, 1, 1, 7, 151, 63, },
+ { 0, 1, 1, 7, 159, 46, },
+ { 2, 1, 1, 7, 159, 40, },
+ { 1, 1, 1, 7, 159, 63, },
+ { 0, 1, 2, 4, 42, 46, },
+ { 2, 1, 2, 4, 42, 40, },
+ { 1, 1, 2, 4, 42, 40, },
+ { 0, 1, 2, 4, 58, 46, },
+ { 2, 1, 2, 4, 58, 40, },
+ { 1, 1, 2, 4, 58, 40, },
+ { 0, 1, 2, 4, 106, 46, },
+ { 2, 1, 2, 4, 106, 40, },
+ { 1, 1, 2, 4, 106, 40, },
+ { 0, 1, 2, 4, 122, 46, },
+ { 2, 1, 2, 4, 122, 40, },
+ { 1, 1, 2, 4, 122, 40, },
+ { 0, 1, 2, 4, 155, 46, },
+ { 2, 1, 2, 4, 155, 40, },
+ { 1, 1, 2, 4, 155, 63, },
+ { 0, 1, 2, 5, 42, 46, },
+ { 2, 1, 2, 5, 42, 40, },
+ { 1, 1, 2, 5, 42, 40, },
+ { 0, 1, 2, 5, 58, 46, },
+ { 2, 1, 2, 5, 58, 40, },
+ { 1, 1, 2, 5, 58, 40, },
+ { 0, 1, 2, 5, 106, 46, },
+ { 2, 1, 2, 5, 106, 40, },
+ { 1, 1, 2, 5, 106, 40, },
+ { 0, 1, 2, 5, 122, 46, },
+ { 2, 1, 2, 5, 122, 40, },
+ { 1, 1, 2, 5, 122, 40, },
+ { 0, 1, 2, 5, 155, 46, },
+ { 2, 1, 2, 5, 155, 40, },
+ { 1, 1, 2, 5, 155, 63, },
+ { 0, 1, 2, 8, 42, 46, },
+ { 2, 1, 2, 8, 42, 40, },
+ { 1, 1, 2, 8, 42, 40, },
+ { 0, 1, 2, 8, 58, 46, },
+ { 2, 1, 2, 8, 58, 40, },
+ { 1, 1, 2, 8, 58, 40, },
+ { 0, 1, 2, 8, 106, 46, },
+ { 2, 1, 2, 8, 106, 40, },
+ { 1, 1, 2, 8, 106, 40, },
+ { 0, 1, 2, 8, 122, 46, },
+ { 2, 1, 2, 8, 122, 40, },
+ { 1, 1, 2, 8, 122, 40, },
+ { 0, 1, 2, 8, 155, 46, },
+ { 2, 1, 2, 8, 155, 40, },
+ { 1, 1, 2, 8, 155, 63, },
+ { 0, 1, 2, 9, 42, 46, },
+ { 2, 1, 2, 9, 42, 40, },
+ { 1, 1, 2, 9, 42, 40, },
+ { 0, 1, 2, 9, 58, 46, },
+ { 2, 1, 2, 9, 58, 40, },
+ { 1, 1, 2, 9, 58, 40, },
+ { 0, 1, 2, 9, 106, 46, },
+ { 2, 1, 2, 9, 106, 40, },
+ { 1, 1, 2, 9, 106, 40, },
+ { 0, 1, 2, 9, 122, 46, },
+ { 2, 1, 2, 9, 122, 40, },
+ { 1, 1, 2, 9, 122, 40, },
+ { 0, 1, 2, 9, 155, 46, },
+ { 2, 1, 2, 9, 155, 40, },
+ { 1, 1, 2, 9, 155, 63, },
+};
+
+RTW_DECL_TABLE_TXPWR_LMT(rtw8814a_txpwr_lmt_type5);
+
+static const struct rtw_txpwr_lmt_cfg_pair rtw8814a_txpwr_lmt_type7[] = {
+ { 0, 0, 0, 0, 1, 44, },
+ { 2, 0, 0, 0, 1, 32, },
+ { 1, 0, 0, 0, 1, 32, },
+ { 0, 0, 0, 0, 2, 52, },
+ { 2, 0, 0, 0, 2, 32, },
+ { 1, 0, 0, 0, 2, 32, },
+ { 0, 0, 0, 0, 3, 52, },
+ { 2, 0, 0, 0, 3, 32, },
+ { 1, 0, 0, 0, 3, 32, },
+ { 0, 0, 0, 0, 4, 52, },
+ { 2, 0, 0, 0, 4, 32, },
+ { 1, 0, 0, 0, 4, 32, },
+ { 0, 0, 0, 0, 5, 52, },
+ { 2, 0, 0, 0, 5, 32, },
+ { 1, 0, 0, 0, 5, 32, },
+ { 0, 0, 0, 0, 6, 52, },
+ { 2, 0, 0, 0, 6, 32, },
+ { 1, 0, 0, 0, 6, 32, },
+ { 0, 0, 0, 0, 7, 52, },
+ { 2, 0, 0, 0, 7, 32, },
+ { 1, 0, 0, 0, 7, 32, },
+ { 0, 0, 0, 0, 8, 52, },
+ { 2, 0, 0, 0, 8, 32, },
+ { 1, 0, 0, 0, 8, 32, },
+ { 0, 0, 0, 0, 9, 52, },
+ { 2, 0, 0, 0, 9, 32, },
+ { 1, 0, 0, 0, 9, 32, },
+ { 0, 0, 0, 0, 10, 52, },
+ { 2, 0, 0, 0, 10, 32, },
+ { 1, 0, 0, 0, 10, 32, },
+ { 0, 0, 0, 0, 11, 44, },
+ { 2, 0, 0, 0, 11, 32, },
+ { 1, 0, 0, 0, 11, 32, },
+ { 0, 0, 0, 0, 12, 63, },
+ { 2, 0, 0, 0, 12, 32, },
+ { 1, 0, 0, 0, 12, 32, },
+ { 0, 0, 0, 0, 13, 63, },
+ { 2, 0, 0, 0, 13, 32, },
+ { 1, 0, 0, 0, 13, 32, },
+ { 0, 0, 0, 0, 14, 63, },
+ { 2, 0, 0, 0, 14, 63, },
+ { 1, 0, 0, 0, 14, 32, },
+ { 0, 0, 0, 1, 1, 38, },
+ { 2, 0, 0, 1, 1, 32, },
+ { 1, 0, 0, 1, 1, 32, },
+ { 0, 0, 0, 1, 2, 46, },
+ { 2, 0, 0, 1, 2, 32, },
+ { 1, 0, 0, 1, 2, 32, },
+ { 0, 0, 0, 1, 3, 46, },
+ { 2, 0, 0, 1, 3, 32, },
+ { 1, 0, 0, 1, 3, 32, },
+ { 0, 0, 0, 1, 4, 46, },
+ { 2, 0, 0, 1, 4, 32, },
+ { 1, 0, 0, 1, 4, 32, },
+ { 0, 0, 0, 1, 5, 46, },
+ { 2, 0, 0, 1, 5, 32, },
+ { 1, 0, 0, 1, 5, 32, },
+ { 0, 0, 0, 1, 6, 46, },
+ { 2, 0, 0, 1, 6, 32, },
+ { 1, 0, 0, 1, 6, 32, },
+ { 0, 0, 0, 1, 7, 46, },
+ { 2, 0, 0, 1, 7, 32, },
+ { 1, 0, 0, 1, 7, 32, },
+ { 0, 0, 0, 1, 8, 46, },
+ { 2, 0, 0, 1, 8, 32, },
+ { 1, 0, 0, 1, 8, 32, },
+ { 0, 0, 0, 1, 9, 46, },
+ { 2, 0, 0, 1, 9, 32, },
+ { 1, 0, 0, 1, 9, 32, },
+ { 0, 0, 0, 1, 10, 46, },
+ { 2, 0, 0, 1, 10, 32, },
+ { 1, 0, 0, 1, 10, 32, },
+ { 0, 0, 0, 1, 11, 38, },
+ { 2, 0, 0, 1, 11, 32, },
+ { 1, 0, 0, 1, 11, 32, },
+ { 0, 0, 0, 1, 12, 63, },
+ { 2, 0, 0, 1, 12, 32, },
+ { 1, 0, 0, 1, 12, 32, },
+ { 0, 0, 0, 1, 13, 63, },
+ { 2, 0, 0, 1, 13, 32, },
+ { 1, 0, 0, 1, 13, 32, },
+ { 0, 0, 0, 1, 14, 63, },
+ { 2, 0, 0, 1, 14, 63, },
+ { 1, 0, 0, 1, 14, 63, },
+ { 0, 0, 0, 2, 1, 34, },
+ { 2, 0, 0, 2, 1, 32, },
+ { 1, 0, 0, 2, 1, 32, },
+ { 0, 0, 0, 2, 2, 46, },
+ { 2, 0, 0, 2, 2, 32, },
+ { 1, 0, 0, 2, 2, 32, },
+ { 0, 0, 0, 2, 3, 46, },
+ { 2, 0, 0, 2, 3, 32, },
+ { 1, 0, 0, 2, 3, 32, },
+ { 0, 0, 0, 2, 4, 46, },
+ { 2, 0, 0, 2, 4, 32, },
+ { 1, 0, 0, 2, 4, 32, },
+ { 0, 0, 0, 2, 5, 46, },
+ { 2, 0, 0, 2, 5, 32, },
+ { 1, 0, 0, 2, 5, 32, },
+ { 0, 0, 0, 2, 6, 46, },
+ { 2, 0, 0, 2, 6, 32, },
+ { 1, 0, 0, 2, 6, 32, },
+ { 0, 0, 0, 2, 7, 46, },
+ { 2, 0, 0, 2, 7, 32, },
+ { 1, 0, 0, 2, 7, 32, },
+ { 0, 0, 0, 2, 8, 46, },
+ { 2, 0, 0, 2, 8, 32, },
+ { 1, 0, 0, 2, 8, 32, },
+ { 0, 0, 0, 2, 9, 46, },
+ { 2, 0, 0, 2, 9, 32, },
+ { 1, 0, 0, 2, 9, 32, },
+ { 0, 0, 0, 2, 10, 46, },
+ { 2, 0, 0, 2, 10, 32, },
+ { 1, 0, 0, 2, 10, 32, },
+ { 0, 0, 0, 2, 11, 34, },
+ { 2, 0, 0, 2, 11, 32, },
+ { 1, 0, 0, 2, 11, 32, },
+ { 0, 0, 0, 2, 12, 63, },
+ { 2, 0, 0, 2, 12, 32, },
+ { 1, 0, 0, 2, 12, 32, },
+ { 0, 0, 0, 2, 13, 63, },
+ { 2, 0, 0, 2, 13, 32, },
+ { 1, 0, 0, 2, 13, 32, },
+ { 0, 0, 0, 2, 14, 63, },
+ { 2, 0, 0, 2, 14, 63, },
+ { 1, 0, 0, 2, 14, 63, },
+ { 0, 0, 0, 3, 1, 32, },
+ { 2, 0, 0, 3, 1, 30, },
+ { 1, 0, 0, 3, 1, 30, },
+ { 0, 0, 0, 3, 2, 44, },
+ { 2, 0, 0, 3, 2, 30, },
+ { 1, 0, 0, 3, 2, 30, },
+ { 0, 0, 0, 3, 3, 44, },
+ { 2, 0, 0, 3, 3, 30, },
+ { 1, 0, 0, 3, 3, 30, },
+ { 0, 0, 0, 3, 4, 44, },
+ { 2, 0, 0, 3, 4, 30, },
+ { 1, 0, 0, 3, 4, 30, },
+ { 0, 0, 0, 3, 5, 44, },
+ { 2, 0, 0, 3, 5, 30, },
+ { 1, 0, 0, 3, 5, 30, },
+ { 0, 0, 0, 3, 6, 44, },
+ { 2, 0, 0, 3, 6, 30, },
+ { 1, 0, 0, 3, 6, 30, },
+ { 0, 0, 0, 3, 7, 44, },
+ { 2, 0, 0, 3, 7, 30, },
+ { 1, 0, 0, 3, 7, 30, },
+ { 0, 0, 0, 3, 8, 44, },
+ { 2, 0, 0, 3, 8, 30, },
+ { 1, 0, 0, 3, 8, 30, },
+ { 0, 0, 0, 3, 9, 44, },
+ { 2, 0, 0, 3, 9, 30, },
+ { 1, 0, 0, 3, 9, 30, },
+ { 0, 0, 0, 3, 10, 44, },
+ { 2, 0, 0, 3, 10, 30, },
+ { 1, 0, 0, 3, 10, 30, },
+ { 0, 0, 0, 3, 11, 32, },
+ { 2, 0, 0, 3, 11, 30, },
+ { 1, 0, 0, 3, 11, 30, },
+ { 0, 0, 0, 3, 12, 63, },
+ { 2, 0, 0, 3, 12, 30, },
+ { 1, 0, 0, 3, 12, 30, },
+ { 0, 0, 0, 3, 13, 63, },
+ { 2, 0, 0, 3, 13, 30, },
+ { 1, 0, 0, 3, 13, 30, },
+ { 0, 0, 0, 3, 14, 63, },
+ { 2, 0, 0, 3, 14, 63, },
+ { 1, 0, 0, 3, 14, 63, },
+ { 0, 0, 0, 6, 1, 30, },
+ { 2, 0, 0, 6, 1, 28, },
+ { 1, 0, 0, 6, 1, 28, },
+ { 0, 0, 0, 6, 2, 42, },
+ { 2, 0, 0, 6, 2, 28, },
+ { 1, 0, 0, 6, 2, 28, },
+ { 0, 0, 0, 6, 3, 42, },
+ { 2, 0, 0, 6, 3, 28, },
+ { 1, 0, 0, 6, 3, 28, },
+ { 0, 0, 0, 6, 4, 42, },
+ { 2, 0, 0, 6, 4, 28, },
+ { 1, 0, 0, 6, 4, 28, },
+ { 0, 0, 0, 6, 5, 42, },
+ { 2, 0, 0, 6, 5, 28, },
+ { 1, 0, 0, 6, 5, 28, },
+ { 0, 0, 0, 6, 6, 42, },
+ { 2, 0, 0, 6, 6, 28, },
+ { 1, 0, 0, 6, 6, 28, },
+ { 0, 0, 0, 6, 7, 42, },
+ { 2, 0, 0, 6, 7, 28, },
+ { 1, 0, 0, 6, 7, 28, },
+ { 0, 0, 0, 6, 8, 42, },
+ { 2, 0, 0, 6, 8, 28, },
+ { 1, 0, 0, 6, 8, 28, },
+ { 0, 0, 0, 6, 9, 42, },
+ { 2, 0, 0, 6, 9, 28, },
+ { 1, 0, 0, 6, 9, 28, },
+ { 0, 0, 0, 6, 10, 42, },
+ { 2, 0, 0, 6, 10, 28, },
+ { 1, 0, 0, 6, 10, 28, },
+ { 0, 0, 0, 6, 11, 30, },
+ { 2, 0, 0, 6, 11, 28, },
+ { 1, 0, 0, 6, 11, 28, },
+ { 0, 0, 0, 6, 12, 63, },
+ { 2, 0, 0, 6, 12, 28, },
+ { 1, 0, 0, 6, 12, 28, },
+ { 0, 0, 0, 6, 13, 63, },
+ { 2, 0, 0, 6, 13, 28, },
+ { 1, 0, 0, 6, 13, 28, },
+ { 0, 0, 0, 6, 14, 63, },
+ { 2, 0, 0, 6, 14, 63, },
+ { 1, 0, 0, 6, 14, 63, },
+ { 0, 0, 0, 7, 1, 28, },
+ { 2, 0, 0, 7, 1, 26, },
+ { 1, 0, 0, 7, 1, 26, },
+ { 0, 0, 0, 7, 2, 40, },
+ { 2, 0, 0, 7, 2, 26, },
+ { 1, 0, 0, 7, 2, 26, },
+ { 0, 0, 0, 7, 3, 40, },
+ { 2, 0, 0, 7, 3, 26, },
+ { 1, 0, 0, 7, 3, 26, },
+ { 0, 0, 0, 7, 4, 40, },
+ { 2, 0, 0, 7, 4, 26, },
+ { 1, 0, 0, 7, 4, 26, },
+ { 0, 0, 0, 7, 5, 40, },
+ { 2, 0, 0, 7, 5, 26, },
+ { 1, 0, 0, 7, 5, 26, },
+ { 0, 0, 0, 7, 6, 40, },
+ { 2, 0, 0, 7, 6, 26, },
+ { 1, 0, 0, 7, 6, 26, },
+ { 0, 0, 0, 7, 7, 40, },
+ { 2, 0, 0, 7, 7, 26, },
+ { 1, 0, 0, 7, 7, 26, },
+ { 0, 0, 0, 7, 8, 40, },
+ { 2, 0, 0, 7, 8, 26, },
+ { 1, 0, 0, 7, 8, 26, },
+ { 0, 0, 0, 7, 9, 40, },
+ { 2, 0, 0, 7, 9, 26, },
+ { 1, 0, 0, 7, 9, 26, },
+ { 0, 0, 0, 7, 10, 40, },
+ { 2, 0, 0, 7, 10, 26, },
+ { 1, 0, 0, 7, 10, 26, },
+ { 0, 0, 0, 7, 11, 28, },
+ { 2, 0, 0, 7, 11, 26, },
+ { 1, 0, 0, 7, 11, 26, },
+ { 0, 0, 0, 7, 12, 63, },
+ { 2, 0, 0, 7, 12, 26, },
+ { 1, 0, 0, 7, 12, 26, },
+ { 0, 0, 0, 7, 13, 63, },
+ { 2, 0, 0, 7, 13, 26, },
+ { 1, 0, 0, 7, 13, 26, },
+ { 0, 0, 0, 7, 14, 63, },
+ { 2, 0, 0, 7, 14, 63, },
+ { 1, 0, 0, 7, 14, 63, },
+ { 0, 0, 1, 2, 1, 63, },
+ { 2, 0, 1, 2, 1, 63, },
+ { 1, 0, 1, 2, 1, 63, },
+ { 0, 0, 1, 2, 2, 63, },
+ { 2, 0, 1, 2, 2, 63, },
+ { 1, 0, 1, 2, 2, 63, },
+ { 0, 0, 1, 2, 3, 36, },
+ { 2, 0, 1, 2, 3, 32, },
+ { 1, 0, 1, 2, 3, 32, },
+ { 0, 0, 1, 2, 4, 40, },
+ { 2, 0, 1, 2, 4, 32, },
+ { 1, 0, 1, 2, 4, 32, },
+ { 0, 0, 1, 2, 5, 40, },
+ { 2, 0, 1, 2, 5, 32, },
+ { 1, 0, 1, 2, 5, 32, },
+ { 0, 0, 1, 2, 6, 40, },
+ { 2, 0, 1, 2, 6, 32, },
+ { 1, 0, 1, 2, 6, 32, },
+ { 0, 0, 1, 2, 7, 40, },
+ { 2, 0, 1, 2, 7, 32, },
+ { 1, 0, 1, 2, 7, 32, },
+ { 0, 0, 1, 2, 8, 40, },
+ { 2, 0, 1, 2, 8, 32, },
+ { 1, 0, 1, 2, 8, 32, },
+ { 0, 0, 1, 2, 9, 40, },
+ { 2, 0, 1, 2, 9, 32, },
+ { 1, 0, 1, 2, 9, 32, },
+ { 0, 0, 1, 2, 10, 40, },
+ { 2, 0, 1, 2, 10, 32, },
+ { 1, 0, 1, 2, 10, 32, },
+ { 0, 0, 1, 2, 11, 34, },
+ { 2, 0, 1, 2, 11, 32, },
+ { 1, 0, 1, 2, 11, 32, },
+ { 0, 0, 1, 2, 12, 63, },
+ { 2, 0, 1, 2, 12, 32, },
+ { 1, 0, 1, 2, 12, 32, },
+ { 0, 0, 1, 2, 13, 63, },
+ { 2, 0, 1, 2, 13, 32, },
+ { 1, 0, 1, 2, 13, 32, },
+ { 0, 0, 1, 2, 14, 63, },
+ { 2, 0, 1, 2, 14, 63, },
+ { 1, 0, 1, 2, 14, 63, },
+ { 0, 0, 1, 3, 1, 63, },
+ { 2, 0, 1, 3, 1, 63, },
+ { 1, 0, 1, 3, 1, 63, },
+ { 0, 0, 1, 3, 2, 63, },
+ { 2, 0, 1, 3, 2, 63, },
+ { 1, 0, 1, 3, 2, 63, },
+ { 0, 0, 1, 3, 3, 34, },
+ { 2, 0, 1, 3, 3, 30, },
+ { 1, 0, 1, 3, 3, 30, },
+ { 0, 0, 1, 3, 4, 38, },
+ { 2, 0, 1, 3, 4, 30, },
+ { 1, 0, 1, 3, 4, 30, },
+ { 0, 0, 1, 3, 5, 38, },
+ { 2, 0, 1, 3, 5, 30, },
+ { 1, 0, 1, 3, 5, 30, },
+ { 0, 0, 1, 3, 6, 38, },
+ { 2, 0, 1, 3, 6, 30, },
+ { 1, 0, 1, 3, 6, 30, },
+ { 0, 0, 1, 3, 7, 38, },
+ { 2, 0, 1, 3, 7, 30, },
+ { 1, 0, 1, 3, 7, 30, },
+ { 0, 0, 1, 3, 8, 38, },
+ { 2, 0, 1, 3, 8, 30, },
+ { 1, 0, 1, 3, 8, 30, },
+ { 0, 0, 1, 3, 9, 38, },
+ { 2, 0, 1, 3, 9, 30, },
+ { 1, 0, 1, 3, 9, 30, },
+ { 0, 0, 1, 3, 10, 38, },
+ { 2, 0, 1, 3, 10, 30, },
+ { 1, 0, 1, 3, 10, 30, },
+ { 0, 0, 1, 3, 11, 32, },
+ { 2, 0, 1, 3, 11, 30, },
+ { 1, 0, 1, 3, 11, 30, },
+ { 0, 0, 1, 3, 12, 63, },
+ { 2, 0, 1, 3, 12, 30, },
+ { 1, 0, 1, 3, 12, 30, },
+ { 0, 0, 1, 3, 13, 63, },
+ { 2, 0, 1, 3, 13, 30, },
+ { 1, 0, 1, 3, 13, 30, },
+ { 0, 0, 1, 3, 14, 63, },
+ { 2, 0, 1, 3, 14, 63, },
+ { 1, 0, 1, 3, 14, 63, },
+ { 0, 0, 1, 6, 1, 63, },
+ { 2, 0, 1, 6, 1, 63, },
+ { 1, 0, 1, 6, 1, 63, },
+ { 0, 0, 1, 6, 2, 63, },
+ { 2, 0, 1, 6, 2, 63, },
+ { 1, 0, 1, 6, 2, 63, },
+ { 0, 0, 1, 6, 3, 32, },
+ { 2, 0, 1, 6, 3, 28, },
+ { 1, 0, 1, 6, 3, 28, },
+ { 0, 0, 1, 6, 4, 36, },
+ { 2, 0, 1, 6, 4, 28, },
+ { 1, 0, 1, 6, 4, 28, },
+ { 0, 0, 1, 6, 5, 36, },
+ { 2, 0, 1, 6, 5, 28, },
+ { 1, 0, 1, 6, 5, 28, },
+ { 0, 0, 1, 6, 6, 36, },
+ { 2, 0, 1, 6, 6, 28, },
+ { 1, 0, 1, 6, 6, 28, },
+ { 0, 0, 1, 6, 7, 36, },
+ { 2, 0, 1, 6, 7, 28, },
+ { 1, 0, 1, 6, 7, 28, },
+ { 0, 0, 1, 6, 8, 36, },
+ { 2, 0, 1, 6, 8, 28, },
+ { 1, 0, 1, 6, 8, 28, },
+ { 0, 0, 1, 6, 9, 36, },
+ { 2, 0, 1, 6, 9, 28, },
+ { 1, 0, 1, 6, 9, 28, },
+ { 0, 0, 1, 6, 10, 36, },
+ { 2, 0, 1, 6, 10, 28, },
+ { 1, 0, 1, 6, 10, 28, },
+ { 0, 0, 1, 6, 11, 30, },
+ { 2, 0, 1, 6, 11, 28, },
+ { 1, 0, 1, 6, 11, 28, },
+ { 0, 0, 1, 6, 12, 63, },
+ { 2, 0, 1, 6, 12, 28, },
+ { 1, 0, 1, 6, 12, 28, },
+ { 0, 0, 1, 6, 13, 63, },
+ { 2, 0, 1, 6, 13, 28, },
+ { 1, 0, 1, 6, 13, 28, },
+ { 0, 0, 1, 6, 14, 63, },
+ { 2, 0, 1, 6, 14, 63, },
+ { 1, 0, 1, 6, 14, 63, },
+ { 0, 0, 1, 7, 1, 63, },
+ { 2, 0, 1, 7, 1, 63, },
+ { 1, 0, 1, 7, 1, 63, },
+ { 0, 0, 1, 7, 2, 63, },
+ { 2, 0, 1, 7, 2, 63, },
+ { 1, 0, 1, 7, 2, 63, },
+ { 0, 0, 1, 7, 3, 32, },
+ { 2, 0, 1, 7, 3, 26, },
+ { 1, 0, 1, 7, 3, 26, },
+ { 0, 0, 1, 7, 4, 36, },
+ { 2, 0, 1, 7, 4, 26, },
+ { 1, 0, 1, 7, 4, 26, },
+ { 0, 0, 1, 7, 5, 36, },
+ { 2, 0, 1, 7, 5, 26, },
+ { 1, 0, 1, 7, 5, 26, },
+ { 0, 0, 1, 7, 6, 36, },
+ { 2, 0, 1, 7, 6, 26, },
+ { 1, 0, 1, 7, 6, 26, },
+ { 0, 0, 1, 7, 7, 36, },
+ { 2, 0, 1, 7, 7, 26, },
+ { 1, 0, 1, 7, 7, 26, },
+ { 0, 0, 1, 7, 8, 36, },
+ { 2, 0, 1, 7, 8, 26, },
+ { 1, 0, 1, 7, 8, 26, },
+ { 0, 0, 1, 7, 9, 36, },
+ { 2, 0, 1, 7, 9, 26, },
+ { 1, 0, 1, 7, 9, 26, },
+ { 0, 0, 1, 7, 10, 36, },
+ { 2, 0, 1, 7, 10, 26, },
+ { 1, 0, 1, 7, 10, 26, },
+ { 0, 0, 1, 7, 11, 30, },
+ { 2, 0, 1, 7, 11, 26, },
+ { 1, 0, 1, 7, 11, 26, },
+ { 0, 0, 1, 7, 12, 63, },
+ { 2, 0, 1, 7, 12, 26, },
+ { 1, 0, 1, 7, 12, 26, },
+ { 0, 0, 1, 7, 13, 63, },
+ { 2, 0, 1, 7, 13, 26, },
+ { 1, 0, 1, 7, 13, 26, },
+ { 0, 0, 1, 7, 14, 63, },
+ { 2, 0, 1, 7, 14, 63, },
+ { 1, 0, 1, 7, 14, 63, },
+ { 0, 1, 0, 1, 36, 38, },
+ { 2, 1, 0, 1, 36, 32, },
+ { 1, 1, 0, 1, 36, 32, },
+ { 0, 1, 0, 1, 40, 38, },
+ { 2, 1, 0, 1, 40, 32, },
+ { 1, 1, 0, 1, 40, 32, },
+ { 0, 1, 0, 1, 44, 38, },
+ { 2, 1, 0, 1, 44, 32, },
+ { 1, 1, 0, 1, 44, 32, },
+ { 0, 1, 0, 1, 48, 38, },
+ { 2, 1, 0, 1, 48, 32, },
+ { 1, 1, 0, 1, 48, 32, },
+ { 0, 1, 0, 1, 52, 38, },
+ { 2, 1, 0, 1, 52, 32, },
+ { 1, 1, 0, 1, 52, 32, },
+ { 0, 1, 0, 1, 56, 38, },
+ { 2, 1, 0, 1, 56, 32, },
+ { 1, 1, 0, 1, 56, 32, },
+ { 0, 1, 0, 1, 60, 38, },
+ { 2, 1, 0, 1, 60, 32, },
+ { 1, 1, 0, 1, 60, 32, },
+ { 0, 1, 0, 1, 64, 38, },
+ { 2, 1, 0, 1, 64, 32, },
+ { 1, 1, 0, 1, 64, 32, },
+ { 0, 1, 0, 1, 100, 36, },
+ { 2, 1, 0, 1, 100, 32, },
+ { 1, 1, 0, 1, 100, 32, },
+ { 0, 1, 0, 1, 104, 36, },
+ { 2, 1, 0, 1, 104, 32, },
+ { 1, 1, 0, 1, 104, 32, },
+ { 0, 1, 0, 1, 108, 36, },
+ { 2, 1, 0, 1, 108, 32, },
+ { 1, 1, 0, 1, 108, 32, },
+ { 0, 1, 0, 1, 112, 36, },
+ { 2, 1, 0, 1, 112, 32, },
+ { 1, 1, 0, 1, 112, 32, },
+ { 0, 1, 0, 1, 116, 36, },
+ { 2, 1, 0, 1, 116, 32, },
+ { 1, 1, 0, 1, 116, 32, },
+ { 0, 1, 0, 1, 120, 36, },
+ { 2, 1, 0, 1, 120, 32, },
+ { 1, 1, 0, 1, 120, 32, },
+ { 0, 1, 0, 1, 124, 36, },
+ { 2, 1, 0, 1, 124, 32, },
+ { 1, 1, 0, 1, 124, 32, },
+ { 0, 1, 0, 1, 128, 36, },
+ { 2, 1, 0, 1, 128, 32, },
+ { 1, 1, 0, 1, 128, 32, },
+ { 0, 1, 0, 1, 132, 36, },
+ { 2, 1, 0, 1, 132, 32, },
+ { 1, 1, 0, 1, 132, 32, },
+ { 0, 1, 0, 1, 136, 36, },
+ { 2, 1, 0, 1, 136, 32, },
+ { 1, 1, 0, 1, 136, 32, },
+ { 0, 1, 0, 1, 140, 36, },
+ { 2, 1, 0, 1, 140, 32, },
+ { 1, 1, 0, 1, 140, 32, },
+ { 0, 1, 0, 1, 149, 36, },
+ { 2, 1, 0, 1, 149, 32, },
+ { 1, 1, 0, 1, 149, 63, },
+ { 0, 1, 0, 1, 153, 36, },
+ { 2, 1, 0, 1, 153, 32, },
+ { 1, 1, 0, 1, 153, 63, },
+ { 0, 1, 0, 1, 157, 36, },
+ { 2, 1, 0, 1, 157, 32, },
+ { 1, 1, 0, 1, 157, 63, },
+ { 0, 1, 0, 1, 161, 36, },
+ { 2, 1, 0, 1, 161, 32, },
+ { 1, 1, 0, 1, 161, 63, },
+ { 0, 1, 0, 1, 165, 36, },
+ { 2, 1, 0, 1, 165, 32, },
+ { 1, 1, 0, 1, 165, 63, },
+ { 0, 1, 0, 2, 36, 36, },
+ { 2, 1, 0, 2, 36, 32, },
+ { 1, 1, 0, 2, 36, 32, },
+ { 0, 1, 0, 2, 40, 36, },
+ { 2, 1, 0, 2, 40, 32, },
+ { 1, 1, 0, 2, 40, 32, },
+ { 0, 1, 0, 2, 44, 36, },
+ { 2, 1, 0, 2, 44, 32, },
+ { 1, 1, 0, 2, 44, 32, },
+ { 0, 1, 0, 2, 48, 36, },
+ { 2, 1, 0, 2, 48, 32, },
+ { 1, 1, 0, 2, 48, 32, },
+ { 0, 1, 0, 2, 52, 36, },
+ { 2, 1, 0, 2, 52, 32, },
+ { 1, 1, 0, 2, 52, 32, },
+ { 0, 1, 0, 2, 56, 36, },
+ { 2, 1, 0, 2, 56, 32, },
+ { 1, 1, 0, 2, 56, 32, },
+ { 0, 1, 0, 2, 60, 36, },
+ { 2, 1, 0, 2, 60, 32, },
+ { 1, 1, 0, 2, 60, 32, },
+ { 0, 1, 0, 2, 64, 36, },
+ { 2, 1, 0, 2, 64, 32, },
+ { 1, 1, 0, 2, 64, 32, },
+ { 0, 1, 0, 2, 100, 36, },
+ { 2, 1, 0, 2, 100, 32, },
+ { 1, 1, 0, 2, 100, 32, },
+ { 0, 1, 0, 2, 104, 36, },
+ { 2, 1, 0, 2, 104, 32, },
+ { 1, 1, 0, 2, 104, 32, },
+ { 0, 1, 0, 2, 108, 36, },
+ { 2, 1, 0, 2, 108, 32, },
+ { 1, 1, 0, 2, 108, 32, },
+ { 0, 1, 0, 2, 112, 36, },
+ { 2, 1, 0, 2, 112, 32, },
+ { 1, 1, 0, 2, 112, 32, },
+ { 0, 1, 0, 2, 116, 36, },
+ { 2, 1, 0, 2, 116, 32, },
+ { 1, 1, 0, 2, 116, 32, },
+ { 0, 1, 0, 2, 120, 36, },
+ { 2, 1, 0, 2, 120, 32, },
+ { 1, 1, 0, 2, 120, 32, },
+ { 0, 1, 0, 2, 124, 36, },
+ { 2, 1, 0, 2, 124, 32, },
+ { 1, 1, 0, 2, 124, 32, },
+ { 0, 1, 0, 2, 128, 36, },
+ { 2, 1, 0, 2, 128, 32, },
+ { 1, 1, 0, 2, 128, 32, },
+ { 0, 1, 0, 2, 132, 36, },
+ { 2, 1, 0, 2, 132, 32, },
+ { 1, 1, 0, 2, 132, 32, },
+ { 0, 1, 0, 2, 136, 36, },
+ { 2, 1, 0, 2, 136, 32, },
+ { 1, 1, 0, 2, 136, 32, },
+ { 0, 1, 0, 2, 140, 34, },
+ { 2, 1, 0, 2, 140, 32, },
+ { 1, 1, 0, 2, 140, 32, },
+ { 0, 1, 0, 2, 149, 32, },
+ { 2, 1, 0, 2, 149, 32, },
+ { 1, 1, 0, 2, 149, 63, },
+ { 0, 1, 0, 2, 153, 38, },
+ { 2, 1, 0, 2, 153, 32, },
+ { 1, 1, 0, 2, 153, 63, },
+ { 0, 1, 0, 2, 157, 38, },
+ { 2, 1, 0, 2, 157, 32, },
+ { 1, 1, 0, 2, 157, 63, },
+ { 0, 1, 0, 2, 161, 38, },
+ { 2, 1, 0, 2, 161, 32, },
+ { 1, 1, 0, 2, 161, 63, },
+ { 0, 1, 0, 2, 165, 38, },
+ { 2, 1, 0, 2, 165, 32, },
+ { 1, 1, 0, 2, 165, 63, },
+ { 0, 1, 0, 3, 36, 34, },
+ { 2, 1, 0, 3, 36, 30, },
+ { 1, 1, 0, 3, 36, 30, },
+ { 0, 1, 0, 3, 40, 34, },
+ { 2, 1, 0, 3, 40, 30, },
+ { 1, 1, 0, 3, 40, 30, },
+ { 0, 1, 0, 3, 44, 34, },
+ { 2, 1, 0, 3, 44, 30, },
+ { 1, 1, 0, 3, 44, 30, },
+ { 0, 1, 0, 3, 48, 34, },
+ { 2, 1, 0, 3, 48, 30, },
+ { 1, 1, 0, 3, 48, 30, },
+ { 0, 1, 0, 3, 52, 34, },
+ { 2, 1, 0, 3, 52, 30, },
+ { 1, 1, 0, 3, 52, 30, },
+ { 0, 1, 0, 3, 56, 34, },
+ { 2, 1, 0, 3, 56, 30, },
+ { 1, 1, 0, 3, 56, 30, },
+ { 0, 1, 0, 3, 60, 34, },
+ { 2, 1, 0, 3, 60, 30, },
+ { 1, 1, 0, 3, 60, 30, },
+ { 0, 1, 0, 3, 64, 34, },
+ { 2, 1, 0, 3, 64, 30, },
+ { 1, 1, 0, 3, 64, 30, },
+ { 0, 1, 0, 3, 100, 34, },
+ { 2, 1, 0, 3, 100, 30, },
+ { 1, 1, 0, 3, 100, 30, },
+ { 0, 1, 0, 3, 104, 34, },
+ { 2, 1, 0, 3, 104, 30, },
+ { 1, 1, 0, 3, 104, 30, },
+ { 0, 1, 0, 3, 108, 34, },
+ { 2, 1, 0, 3, 108, 30, },
+ { 1, 1, 0, 3, 108, 30, },
+ { 0, 1, 0, 3, 112, 34, },
+ { 2, 1, 0, 3, 112, 30, },
+ { 1, 1, 0, 3, 112, 30, },
+ { 0, 1, 0, 3, 116, 34, },
+ { 2, 1, 0, 3, 116, 30, },
+ { 1, 1, 0, 3, 116, 30, },
+ { 0, 1, 0, 3, 120, 34, },
+ { 2, 1, 0, 3, 120, 30, },
+ { 1, 1, 0, 3, 120, 30, },
+ { 0, 1, 0, 3, 124, 34, },
+ { 2, 1, 0, 3, 124, 30, },
+ { 1, 1, 0, 3, 124, 30, },
+ { 0, 1, 0, 3, 128, 34, },
+ { 2, 1, 0, 3, 128, 30, },
+ { 1, 1, 0, 3, 128, 30, },
+ { 0, 1, 0, 3, 132, 34, },
+ { 2, 1, 0, 3, 132, 30, },
+ { 1, 1, 0, 3, 132, 30, },
+ { 0, 1, 0, 3, 136, 34, },
+ { 2, 1, 0, 3, 136, 30, },
+ { 1, 1, 0, 3, 136, 30, },
+ { 0, 1, 0, 3, 140, 32, },
+ { 2, 1, 0, 3, 140, 30, },
+ { 1, 1, 0, 3, 140, 30, },
+ { 0, 1, 0, 3, 149, 30, },
+ { 2, 1, 0, 3, 149, 30, },
+ { 1, 1, 0, 3, 149, 63, },
+ { 0, 1, 0, 3, 153, 36, },
+ { 2, 1, 0, 3, 153, 30, },
+ { 1, 1, 0, 3, 153, 63, },
+ { 0, 1, 0, 3, 157, 36, },
+ { 2, 1, 0, 3, 157, 30, },
+ { 1, 1, 0, 3, 157, 63, },
+ { 0, 1, 0, 3, 161, 36, },
+ { 2, 1, 0, 3, 161, 30, },
+ { 1, 1, 0, 3, 161, 63, },
+ { 0, 1, 0, 3, 165, 36, },
+ { 2, 1, 0, 3, 165, 30, },
+ { 1, 1, 0, 3, 165, 63, },
+ { 0, 1, 0, 6, 36, 32, },
+ { 2, 1, 0, 6, 36, 28, },
+ { 1, 1, 0, 6, 36, 28, },
+ { 0, 1, 0, 6, 40, 32, },
+ { 2, 1, 0, 6, 40, 28, },
+ { 1, 1, 0, 6, 40, 28, },
+ { 0, 1, 0, 6, 44, 32, },
+ { 2, 1, 0, 6, 44, 28, },
+ { 1, 1, 0, 6, 44, 28, },
+ { 0, 1, 0, 6, 48, 32, },
+ { 2, 1, 0, 6, 48, 28, },
+ { 1, 1, 0, 6, 48, 28, },
+ { 0, 1, 0, 6, 52, 32, },
+ { 2, 1, 0, 6, 52, 28, },
+ { 1, 1, 0, 6, 52, 28, },
+ { 0, 1, 0, 6, 56, 32, },
+ { 2, 1, 0, 6, 56, 28, },
+ { 1, 1, 0, 6, 56, 28, },
+ { 0, 1, 0, 6, 60, 32, },
+ { 2, 1, 0, 6, 60, 28, },
+ { 1, 1, 0, 6, 60, 28, },
+ { 0, 1, 0, 6, 64, 32, },
+ { 2, 1, 0, 6, 64, 28, },
+ { 1, 1, 0, 6, 64, 28, },
+ { 0, 1, 0, 6, 100, 32, },
+ { 2, 1, 0, 6, 100, 28, },
+ { 1, 1, 0, 6, 100, 28, },
+ { 0, 1, 0, 6, 104, 32, },
+ { 2, 1, 0, 6, 104, 28, },
+ { 1, 1, 0, 6, 104, 28, },
+ { 0, 1, 0, 6, 108, 32, },
+ { 2, 1, 0, 6, 108, 28, },
+ { 1, 1, 0, 6, 108, 28, },
+ { 0, 1, 0, 6, 112, 32, },
+ { 2, 1, 0, 6, 112, 28, },
+ { 1, 1, 0, 6, 112, 28, },
+ { 0, 1, 0, 6, 116, 32, },
+ { 2, 1, 0, 6, 116, 28, },
+ { 1, 1, 0, 6, 116, 28, },
+ { 0, 1, 0, 6, 120, 32, },
+ { 2, 1, 0, 6, 120, 28, },
+ { 1, 1, 0, 6, 120, 28, },
+ { 0, 1, 0, 6, 124, 32, },
+ { 2, 1, 0, 6, 124, 28, },
+ { 1, 1, 0, 6, 124, 28, },
+ { 0, 1, 0, 6, 128, 32, },
+ { 2, 1, 0, 6, 128, 28, },
+ { 1, 1, 0, 6, 128, 28, },
+ { 0, 1, 0, 6, 132, 32, },
+ { 2, 1, 0, 6, 132, 28, },
+ { 1, 1, 0, 6, 132, 28, },
+ { 0, 1, 0, 6, 136, 32, },
+ { 2, 1, 0, 6, 136, 28, },
+ { 1, 1, 0, 6, 136, 28, },
+ { 0, 1, 0, 6, 140, 30, },
+ { 2, 1, 0, 6, 140, 28, },
+ { 1, 1, 0, 6, 140, 28, },
+ { 0, 1, 0, 6, 149, 28, },
+ { 2, 1, 0, 6, 149, 28, },
+ { 1, 1, 0, 6, 149, 63, },
+ { 0, 1, 0, 6, 153, 34, },
+ { 2, 1, 0, 6, 153, 28, },
+ { 1, 1, 0, 6, 153, 63, },
+ { 0, 1, 0, 6, 157, 34, },
+ { 2, 1, 0, 6, 157, 28, },
+ { 1, 1, 0, 6, 157, 63, },
+ { 0, 1, 0, 6, 161, 34, },
+ { 2, 1, 0, 6, 161, 28, },
+ { 1, 1, 0, 6, 161, 63, },
+ { 0, 1, 0, 6, 165, 34, },
+ { 2, 1, 0, 6, 165, 28, },
+ { 1, 1, 0, 6, 165, 63, },
+ { 0, 1, 0, 7, 36, 30, },
+ { 2, 1, 0, 7, 36, 26, },
+ { 1, 1, 0, 7, 36, 26, },
+ { 0, 1, 0, 7, 40, 30, },
+ { 2, 1, 0, 7, 40, 26, },
+ { 1, 1, 0, 7, 40, 26, },
+ { 0, 1, 0, 7, 44, 30, },
+ { 2, 1, 0, 7, 44, 26, },
+ { 1, 1, 0, 7, 44, 26, },
+ { 0, 1, 0, 7, 48, 30, },
+ { 2, 1, 0, 7, 48, 26, },
+ { 1, 1, 0, 7, 48, 26, },
+ { 0, 1, 0, 7, 52, 30, },
+ { 2, 1, 0, 7, 52, 26, },
+ { 1, 1, 0, 7, 52, 26, },
+ { 0, 1, 0, 7, 56, 30, },
+ { 2, 1, 0, 7, 56, 26, },
+ { 1, 1, 0, 7, 56, 26, },
+ { 0, 1, 0, 7, 60, 30, },
+ { 2, 1, 0, 7, 60, 26, },
+ { 1, 1, 0, 7, 60, 26, },
+ { 0, 1, 0, 7, 64, 30, },
+ { 2, 1, 0, 7, 64, 26, },
+ { 1, 1, 0, 7, 64, 26, },
+ { 0, 1, 0, 7, 100, 30, },
+ { 2, 1, 0, 7, 100, 26, },
+ { 1, 1, 0, 7, 100, 26, },
+ { 0, 1, 0, 7, 104, 30, },
+ { 2, 1, 0, 7, 104, 26, },
+ { 1, 1, 0, 7, 104, 26, },
+ { 0, 1, 0, 7, 108, 30, },
+ { 2, 1, 0, 7, 108, 26, },
+ { 1, 1, 0, 7, 108, 26, },
+ { 0, 1, 0, 7, 112, 30, },
+ { 2, 1, 0, 7, 112, 26, },
+ { 1, 1, 0, 7, 112, 26, },
+ { 0, 1, 0, 7, 116, 30, },
+ { 2, 1, 0, 7, 116, 26, },
+ { 1, 1, 0, 7, 116, 26, },
+ { 0, 1, 0, 7, 120, 30, },
+ { 2, 1, 0, 7, 120, 26, },
+ { 1, 1, 0, 7, 120, 26, },
+ { 0, 1, 0, 7, 124, 30, },
+ { 2, 1, 0, 7, 124, 26, },
+ { 1, 1, 0, 7, 124, 26, },
+ { 0, 1, 0, 7, 128, 30, },
+ { 2, 1, 0, 7, 128, 26, },
+ { 1, 1, 0, 7, 128, 26, },
+ { 0, 1, 0, 7, 132, 30, },
+ { 2, 1, 0, 7, 132, 26, },
+ { 1, 1, 0, 7, 132, 26, },
+ { 0, 1, 0, 7, 136, 30, },
+ { 2, 1, 0, 7, 136, 26, },
+ { 1, 1, 0, 7, 136, 26, },
+ { 0, 1, 0, 7, 140, 28, },
+ { 2, 1, 0, 7, 140, 26, },
+ { 1, 1, 0, 7, 140, 26, },
+ { 0, 1, 0, 7, 149, 26, },
+ { 2, 1, 0, 7, 149, 26, },
+ { 1, 1, 0, 7, 149, 63, },
+ { 0, 1, 0, 7, 153, 32, },
+ { 2, 1, 0, 7, 153, 26, },
+ { 1, 1, 0, 7, 153, 63, },
+ { 0, 1, 0, 7, 157, 32, },
+ { 2, 1, 0, 7, 157, 26, },
+ { 1, 1, 0, 7, 157, 63, },
+ { 0, 1, 0, 7, 161, 32, },
+ { 2, 1, 0, 7, 161, 26, },
+ { 1, 1, 0, 7, 161, 63, },
+ { 0, 1, 0, 7, 165, 32, },
+ { 2, 1, 0, 7, 165, 26, },
+ { 1, 1, 0, 7, 165, 63, },
+ { 0, 1, 1, 2, 38, 32, },
+ { 2, 1, 1, 2, 38, 32, },
+ { 1, 1, 1, 2, 38, 32, },
+ { 0, 1, 1, 2, 46, 32, },
+ { 2, 1, 1, 2, 46, 32, },
+ { 1, 1, 1, 2, 46, 32, },
+ { 0, 1, 1, 2, 54, 32, },
+ { 2, 1, 1, 2, 54, 32, },
+ { 1, 1, 1, 2, 54, 32, },
+ { 0, 1, 1, 2, 62, 30, },
+ { 2, 1, 1, 2, 62, 32, },
+ { 1, 1, 1, 2, 62, 32, },
+ { 0, 1, 1, 2, 102, 30, },
+ { 2, 1, 1, 2, 102, 32, },
+ { 1, 1, 1, 2, 102, 32, },
+ { 0, 1, 1, 2, 110, 38, },
+ { 2, 1, 1, 2, 110, 32, },
+ { 1, 1, 1, 2, 110, 32, },
+ { 0, 1, 1, 2, 118, 38, },
+ { 2, 1, 1, 2, 118, 32, },
+ { 1, 1, 1, 2, 118, 32, },
+ { 0, 1, 1, 2, 126, 38, },
+ { 2, 1, 1, 2, 126, 32, },
+ { 1, 1, 1, 2, 126, 32, },
+ { 0, 1, 1, 2, 134, 38, },
+ { 2, 1, 1, 2, 134, 32, },
+ { 1, 1, 1, 2, 134, 32, },
+ { 0, 1, 1, 2, 151, 32, },
+ { 2, 1, 1, 2, 151, 32, },
+ { 1, 1, 1, 2, 151, 63, },
+ { 0, 1, 1, 2, 159, 32, },
+ { 2, 1, 1, 2, 159, 32, },
+ { 1, 1, 1, 2, 159, 63, },
+ { 0, 1, 1, 3, 38, 30, },
+ { 2, 1, 1, 3, 38, 30, },
+ { 1, 1, 1, 3, 38, 30, },
+ { 0, 1, 1, 3, 46, 30, },
+ { 2, 1, 1, 3, 46, 30, },
+ { 1, 1, 1, 3, 46, 30, },
+ { 0, 1, 1, 3, 54, 30, },
+ { 2, 1, 1, 3, 54, 30, },
+ { 1, 1, 1, 3, 54, 30, },
+ { 0, 1, 1, 3, 62, 28, },
+ { 2, 1, 1, 3, 62, 30, },
+ { 1, 1, 1, 3, 62, 30, },
+ { 0, 1, 1, 3, 102, 28, },
+ { 2, 1, 1, 3, 102, 30, },
+ { 1, 1, 1, 3, 102, 30, },
+ { 0, 1, 1, 3, 110, 36, },
+ { 2, 1, 1, 3, 110, 30, },
+ { 1, 1, 1, 3, 110, 30, },
+ { 0, 1, 1, 3, 118, 36, },
+ { 2, 1, 1, 3, 118, 30, },
+ { 1, 1, 1, 3, 118, 30, },
+ { 0, 1, 1, 3, 126, 36, },
+ { 2, 1, 1, 3, 126, 30, },
+ { 1, 1, 1, 3, 126, 30, },
+ { 0, 1, 1, 3, 134, 36, },
+ { 2, 1, 1, 3, 134, 30, },
+ { 1, 1, 1, 3, 134, 30, },
+ { 0, 1, 1, 3, 151, 30, },
+ { 2, 1, 1, 3, 151, 30, },
+ { 1, 1, 1, 3, 151, 63, },
+ { 0, 1, 1, 3, 159, 30, },
+ { 2, 1, 1, 3, 159, 30, },
+ { 1, 1, 1, 3, 159, 63, },
+ { 0, 1, 1, 6, 38, 28, },
+ { 2, 1, 1, 6, 38, 28, },
+ { 1, 1, 1, 6, 38, 28, },
+ { 0, 1, 1, 6, 46, 28, },
+ { 2, 1, 1, 6, 46, 28, },
+ { 1, 1, 1, 6, 46, 28, },
+ { 0, 1, 1, 6, 54, 28, },
+ { 2, 1, 1, 6, 54, 28, },
+ { 1, 1, 1, 6, 54, 28, },
+ { 0, 1, 1, 6, 62, 26, },
+ { 2, 1, 1, 6, 62, 28, },
+ { 1, 1, 1, 6, 62, 28, },
+ { 0, 1, 1, 6, 102, 26, },
+ { 2, 1, 1, 6, 102, 28, },
+ { 1, 1, 1, 6, 102, 28, },
+ { 0, 1, 1, 6, 110, 34, },
+ { 2, 1, 1, 6, 110, 28, },
+ { 1, 1, 1, 6, 110, 28, },
+ { 0, 1, 1, 6, 118, 34, },
+ { 2, 1, 1, 6, 118, 28, },
+ { 1, 1, 1, 6, 118, 28, },
+ { 0, 1, 1, 6, 126, 34, },
+ { 2, 1, 1, 6, 126, 28, },
+ { 1, 1, 1, 6, 126, 28, },
+ { 0, 1, 1, 6, 134, 34, },
+ { 2, 1, 1, 6, 134, 28, },
+ { 1, 1, 1, 6, 134, 28, },
+ { 0, 1, 1, 6, 151, 28, },
+ { 2, 1, 1, 6, 151, 28, },
+ { 1, 1, 1, 6, 151, 63, },
+ { 0, 1, 1, 6, 159, 28, },
+ { 2, 1, 1, 6, 159, 28, },
+ { 1, 1, 1, 6, 159, 63, },
+ { 0, 1, 1, 7, 38, 26, },
+ { 2, 1, 1, 7, 38, 26, },
+ { 1, 1, 1, 7, 38, 26, },
+ { 0, 1, 1, 7, 46, 26, },
+ { 2, 1, 1, 7, 46, 26, },
+ { 1, 1, 1, 7, 46, 26, },
+ { 0, 1, 1, 7, 54, 26, },
+ { 2, 1, 1, 7, 54, 26, },
+ { 1, 1, 1, 7, 54, 26, },
+ { 0, 1, 1, 7, 62, 24, },
+ { 2, 1, 1, 7, 62, 26, },
+ { 1, 1, 1, 7, 62, 26, },
+ { 0, 1, 1, 7, 102, 24, },
+ { 2, 1, 1, 7, 102, 26, },
+ { 1, 1, 1, 7, 102, 26, },
+ { 0, 1, 1, 7, 110, 32, },
+ { 2, 1, 1, 7, 110, 26, },
+ { 1, 1, 1, 7, 110, 26, },
+ { 0, 1, 1, 7, 118, 32, },
+ { 2, 1, 1, 7, 118, 26, },
+ { 1, 1, 1, 7, 118, 26, },
+ { 0, 1, 1, 7, 126, 32, },
+ { 2, 1, 1, 7, 126, 26, },
+ { 1, 1, 1, 7, 126, 26, },
+ { 0, 1, 1, 7, 134, 32, },
+ { 2, 1, 1, 7, 134, 26, },
+ { 1, 1, 1, 7, 134, 26, },
+ { 0, 1, 1, 7, 151, 26, },
+ { 2, 1, 1, 7, 151, 26, },
+ { 1, 1, 1, 7, 151, 63, },
+ { 0, 1, 1, 7, 159, 26, },
+ { 2, 1, 1, 7, 159, 26, },
+ { 1, 1, 1, 7, 159, 63, },
+ { 0, 1, 2, 4, 42, 26, },
+ { 2, 1, 2, 4, 42, 32, },
+ { 1, 1, 2, 4, 42, 32, },
+ { 0, 1, 2, 4, 58, 26, },
+ { 2, 1, 2, 4, 58, 32, },
+ { 1, 1, 2, 4, 58, 32, },
+ { 0, 1, 2, 4, 106, 28, },
+ { 2, 1, 2, 4, 106, 32, },
+ { 1, 1, 2, 4, 106, 32, },
+ { 0, 1, 2, 4, 122, 28, },
+ { 2, 1, 2, 4, 122, 32, },
+ { 1, 1, 2, 4, 122, 32, },
+ { 0, 1, 2, 4, 155, 28, },
+ { 2, 1, 2, 4, 155, 32, },
+ { 1, 1, 2, 4, 155, 63, },
+ { 0, 1, 2, 5, 42, 24, },
+ { 2, 1, 2, 5, 42, 30, },
+ { 1, 1, 2, 5, 42, 30, },
+ { 0, 1, 2, 5, 58, 24, },
+ { 2, 1, 2, 5, 58, 30, },
+ { 1, 1, 2, 5, 58, 30, },
+ { 0, 1, 2, 5, 106, 26, },
+ { 2, 1, 2, 5, 106, 30, },
+ { 1, 1, 2, 5, 106, 30, },
+ { 0, 1, 2, 5, 122, 26, },
+ { 2, 1, 2, 5, 122, 30, },
+ { 1, 1, 2, 5, 122, 30, },
+ { 0, 1, 2, 5, 155, 26, },
+ { 2, 1, 2, 5, 155, 30, },
+ { 1, 1, 2, 5, 155, 63, },
+ { 0, 1, 2, 8, 42, 22, },
+ { 2, 1, 2, 8, 42, 28, },
+ { 1, 1, 2, 8, 42, 28, },
+ { 0, 1, 2, 8, 58, 22, },
+ { 2, 1, 2, 8, 58, 28, },
+ { 1, 1, 2, 8, 58, 28, },
+ { 0, 1, 2, 8, 106, 24, },
+ { 2, 1, 2, 8, 106, 28, },
+ { 1, 1, 2, 8, 106, 28, },
+ { 0, 1, 2, 8, 122, 24, },
+ { 2, 1, 2, 8, 122, 28, },
+ { 1, 1, 2, 8, 122, 28, },
+ { 0, 1, 2, 8, 155, 24, },
+ { 2, 1, 2, 8, 155, 28, },
+ { 1, 1, 2, 8, 155, 63, },
+ { 0, 1, 2, 9, 42, 20, },
+ { 2, 1, 2, 9, 42, 26, },
+ { 1, 1, 2, 9, 42, 26, },
+ { 0, 1, 2, 9, 58, 20, },
+ { 2, 1, 2, 9, 58, 26, },
+ { 1, 1, 2, 9, 58, 26, },
+ { 0, 1, 2, 9, 106, 22, },
+ { 2, 1, 2, 9, 106, 26, },
+ { 1, 1, 2, 9, 106, 26, },
+ { 0, 1, 2, 9, 122, 22, },
+ { 2, 1, 2, 9, 122, 26, },
+ { 1, 1, 2, 9, 122, 26, },
+ { 0, 1, 2, 9, 155, 22, },
+ { 2, 1, 2, 9, 155, 26, },
+ { 1, 1, 2, 9, 155, 63, },
+};
+
+RTW_DECL_TABLE_TXPWR_LMT(rtw8814a_txpwr_lmt_type7);
+
+static const struct rtw_txpwr_lmt_cfg_pair rtw8814a_txpwr_lmt_type8[] = {
+ { 0, 0, 0, 0, 1, 46, },
+ { 2, 0, 0, 0, 1, 46, },
+ { 1, 0, 0, 0, 1, 46, },
+ { 0, 0, 0, 0, 2, 46, },
+ { 2, 0, 0, 0, 2, 46, },
+ { 1, 0, 0, 0, 2, 46, },
+ { 0, 0, 0, 0, 3, 46, },
+ { 2, 0, 0, 0, 3, 46, },
+ { 1, 0, 0, 0, 3, 46, },
+ { 0, 0, 0, 0, 4, 46, },
+ { 2, 0, 0, 0, 4, 46, },
+ { 1, 0, 0, 0, 4, 46, },
+ { 0, 0, 0, 0, 5, 46, },
+ { 2, 0, 0, 0, 5, 46, },
+ { 1, 0, 0, 0, 5, 46, },
+ { 0, 0, 0, 0, 6, 46, },
+ { 2, 0, 0, 0, 6, 46, },
+ { 1, 0, 0, 0, 6, 46, },
+ { 0, 0, 0, 0, 7, 46, },
+ { 2, 0, 0, 0, 7, 46, },
+ { 1, 0, 0, 0, 7, 46, },
+ { 0, 0, 0, 0, 8, 46, },
+ { 2, 0, 0, 0, 8, 46, },
+ { 1, 0, 0, 0, 8, 46, },
+ { 0, 0, 0, 0, 9, 46, },
+ { 2, 0, 0, 0, 9, 46, },
+ { 1, 0, 0, 0, 9, 46, },
+ { 0, 0, 0, 0, 10, 46, },
+ { 2, 0, 0, 0, 10, 46, },
+ { 1, 0, 0, 0, 10, 46, },
+ { 0, 0, 0, 0, 11, 46, },
+ { 2, 0, 0, 0, 11, 46, },
+ { 1, 0, 0, 0, 11, 46, },
+ { 0, 0, 0, 0, 12, 63, },
+ { 2, 0, 0, 0, 12, 46, },
+ { 1, 0, 0, 0, 12, 46, },
+ { 0, 0, 0, 0, 13, 63, },
+ { 2, 0, 0, 0, 13, 46, },
+ { 1, 0, 0, 0, 13, 46, },
+ { 0, 0, 0, 0, 14, 63, },
+ { 2, 0, 0, 0, 14, 63, },
+ { 1, 0, 0, 0, 14, 46, },
+ { 0, 0, 0, 1, 1, 46, },
+ { 2, 0, 0, 1, 1, 46, },
+ { 1, 0, 0, 1, 1, 46, },
+ { 0, 0, 0, 1, 2, 46, },
+ { 2, 0, 0, 1, 2, 46, },
+ { 1, 0, 0, 1, 2, 46, },
+ { 0, 0, 0, 1, 3, 46, },
+ { 2, 0, 0, 1, 3, 46, },
+ { 1, 0, 0, 1, 3, 46, },
+ { 0, 0, 0, 1, 4, 46, },
+ { 2, 0, 0, 1, 4, 46, },
+ { 1, 0, 0, 1, 4, 46, },
+ { 0, 0, 0, 1, 5, 46, },
+ { 2, 0, 0, 1, 5, 46, },
+ { 1, 0, 0, 1, 5, 46, },
+ { 0, 0, 0, 1, 6, 46, },
+ { 2, 0, 0, 1, 6, 46, },
+ { 1, 0, 0, 1, 6, 46, },
+ { 0, 0, 0, 1, 7, 46, },
+ { 2, 0, 0, 1, 7, 46, },
+ { 1, 0, 0, 1, 7, 46, },
+ { 0, 0, 0, 1, 8, 46, },
+ { 2, 0, 0, 1, 8, 46, },
+ { 1, 0, 0, 1, 8, 46, },
+ { 0, 0, 0, 1, 9, 46, },
+ { 2, 0, 0, 1, 9, 46, },
+ { 1, 0, 0, 1, 9, 46, },
+ { 0, 0, 0, 1, 10, 46, },
+ { 2, 0, 0, 1, 10, 46, },
+ { 1, 0, 0, 1, 10, 46, },
+ { 0, 0, 0, 1, 11, 46, },
+ { 2, 0, 0, 1, 11, 46, },
+ { 1, 0, 0, 1, 11, 46, },
+ { 0, 0, 0, 1, 12, 63, },
+ { 2, 0, 0, 1, 12, 46, },
+ { 1, 0, 0, 1, 12, 46, },
+ { 0, 0, 0, 1, 13, 63, },
+ { 2, 0, 0, 1, 13, 46, },
+ { 1, 0, 0, 1, 13, 46, },
+ { 0, 0, 0, 1, 14, 63, },
+ { 2, 0, 0, 1, 14, 63, },
+ { 1, 0, 0, 1, 14, 46, },
+ { 0, 0, 0, 2, 1, 46, },
+ { 2, 0, 0, 2, 1, 46, },
+ { 1, 0, 0, 2, 1, 46, },
+ { 0, 0, 0, 2, 2, 46, },
+ { 2, 0, 0, 2, 2, 46, },
+ { 1, 0, 0, 2, 2, 46, },
+ { 0, 0, 0, 2, 3, 46, },
+ { 2, 0, 0, 2, 3, 46, },
+ { 1, 0, 0, 2, 3, 46, },
+ { 0, 0, 0, 2, 4, 46, },
+ { 2, 0, 0, 2, 4, 46, },
+ { 1, 0, 0, 2, 4, 46, },
+ { 0, 0, 0, 2, 5, 46, },
+ { 2, 0, 0, 2, 5, 46, },
+ { 1, 0, 0, 2, 5, 46, },
+ { 0, 0, 0, 2, 6, 46, },
+ { 2, 0, 0, 2, 6, 46, },
+ { 1, 0, 0, 2, 6, 46, },
+ { 0, 0, 0, 2, 7, 46, },
+ { 2, 0, 0, 2, 7, 46, },
+ { 1, 0, 0, 2, 7, 46, },
+ { 0, 0, 0, 2, 8, 46, },
+ { 2, 0, 0, 2, 8, 46, },
+ { 1, 0, 0, 2, 8, 46, },
+ { 0, 0, 0, 2, 9, 46, },
+ { 2, 0, 0, 2, 9, 46, },
+ { 1, 0, 0, 2, 9, 46, },
+ { 0, 0, 0, 2, 10, 46, },
+ { 2, 0, 0, 2, 10, 46, },
+ { 1, 0, 0, 2, 10, 46, },
+ { 0, 0, 0, 2, 11, 46, },
+ { 2, 0, 0, 2, 11, 46, },
+ { 1, 0, 0, 2, 11, 46, },
+ { 0, 0, 0, 2, 12, 63, },
+ { 2, 0, 0, 2, 12, 46, },
+ { 1, 0, 0, 2, 12, 46, },
+ { 0, 0, 0, 2, 13, 63, },
+ { 2, 0, 0, 2, 13, 46, },
+ { 1, 0, 0, 2, 13, 46, },
+ { 0, 0, 0, 2, 14, 63, },
+ { 2, 0, 0, 2, 14, 63, },
+ { 1, 0, 0, 2, 14, 46, },
+ { 0, 0, 0, 3, 1, 46, },
+ { 2, 0, 0, 3, 1, 46, },
+ { 1, 0, 0, 3, 1, 46, },
+ { 0, 0, 0, 3, 2, 46, },
+ { 2, 0, 0, 3, 2, 46, },
+ { 1, 0, 0, 3, 2, 46, },
+ { 0, 0, 0, 3, 3, 46, },
+ { 2, 0, 0, 3, 3, 46, },
+ { 1, 0, 0, 3, 3, 46, },
+ { 0, 0, 0, 3, 4, 46, },
+ { 2, 0, 0, 3, 4, 46, },
+ { 1, 0, 0, 3, 4, 46, },
+ { 0, 0, 0, 3, 5, 46, },
+ { 2, 0, 0, 3, 5, 46, },
+ { 1, 0, 0, 3, 5, 46, },
+ { 0, 0, 0, 3, 6, 46, },
+ { 2, 0, 0, 3, 6, 46, },
+ { 1, 0, 0, 3, 6, 46, },
+ { 0, 0, 0, 3, 7, 46, },
+ { 2, 0, 0, 3, 7, 46, },
+ { 1, 0, 0, 3, 7, 46, },
+ { 0, 0, 0, 3, 8, 46, },
+ { 2, 0, 0, 3, 8, 46, },
+ { 1, 0, 0, 3, 8, 46, },
+ { 0, 0, 0, 3, 9, 46, },
+ { 2, 0, 0, 3, 9, 46, },
+ { 1, 0, 0, 3, 9, 46, },
+ { 0, 0, 0, 3, 10, 46, },
+ { 2, 0, 0, 3, 10, 46, },
+ { 1, 0, 0, 3, 10, 46, },
+ { 0, 0, 0, 3, 11, 46, },
+ { 2, 0, 0, 3, 11, 46, },
+ { 1, 0, 0, 3, 11, 46, },
+ { 0, 0, 0, 3, 12, 63, },
+ { 2, 0, 0, 3, 12, 46, },
+ { 1, 0, 0, 3, 12, 46, },
+ { 0, 0, 0, 3, 13, 63, },
+ { 2, 0, 0, 3, 13, 46, },
+ { 1, 0, 0, 3, 13, 46, },
+ { 0, 0, 0, 3, 14, 63, },
+ { 2, 0, 0, 3, 14, 63, },
+ { 1, 0, 0, 3, 14, 46, },
+ { 0, 0, 0, 6, 1, 46, },
+ { 2, 0, 0, 6, 1, 46, },
+ { 1, 0, 0, 6, 1, 46, },
+ { 0, 0, 0, 6, 2, 46, },
+ { 2, 0, 0, 6, 2, 46, },
+ { 1, 0, 0, 6, 2, 46, },
+ { 0, 0, 0, 6, 3, 46, },
+ { 2, 0, 0, 6, 3, 46, },
+ { 1, 0, 0, 6, 3, 46, },
+ { 0, 0, 0, 6, 4, 46, },
+ { 2, 0, 0, 6, 4, 46, },
+ { 1, 0, 0, 6, 4, 46, },
+ { 0, 0, 0, 6, 5, 46, },
+ { 2, 0, 0, 6, 5, 46, },
+ { 1, 0, 0, 6, 5, 46, },
+ { 0, 0, 0, 6, 6, 46, },
+ { 2, 0, 0, 6, 6, 46, },
+ { 1, 0, 0, 6, 6, 46, },
+ { 0, 0, 0, 6, 7, 46, },
+ { 2, 0, 0, 6, 7, 46, },
+ { 1, 0, 0, 6, 7, 46, },
+ { 0, 0, 0, 6, 8, 46, },
+ { 2, 0, 0, 6, 8, 46, },
+ { 1, 0, 0, 6, 8, 46, },
+ { 0, 0, 0, 6, 9, 46, },
+ { 2, 0, 0, 6, 9, 46, },
+ { 1, 0, 0, 6, 9, 46, },
+ { 0, 0, 0, 6, 10, 46, },
+ { 2, 0, 0, 6, 10, 46, },
+ { 1, 0, 0, 6, 10, 46, },
+ { 0, 0, 0, 6, 11, 46, },
+ { 2, 0, 0, 6, 11, 46, },
+ { 1, 0, 0, 6, 11, 46, },
+ { 0, 0, 0, 6, 12, 63, },
+ { 2, 0, 0, 6, 12, 46, },
+ { 1, 0, 0, 6, 12, 46, },
+ { 0, 0, 0, 6, 13, 63, },
+ { 2, 0, 0, 6, 13, 46, },
+ { 1, 0, 0, 6, 13, 46, },
+ { 0, 0, 0, 6, 14, 63, },
+ { 2, 0, 0, 6, 14, 63, },
+ { 1, 0, 0, 6, 14, 46, },
+ { 0, 0, 0, 7, 1, 46, },
+ { 2, 0, 0, 7, 1, 46, },
+ { 1, 0, 0, 7, 1, 46, },
+ { 0, 0, 0, 7, 2, 46, },
+ { 2, 0, 0, 7, 2, 46, },
+ { 1, 0, 0, 7, 2, 46, },
+ { 0, 0, 0, 7, 3, 46, },
+ { 2, 0, 0, 7, 3, 46, },
+ { 1, 0, 0, 7, 3, 46, },
+ { 0, 0, 0, 7, 4, 46, },
+ { 2, 0, 0, 7, 4, 46, },
+ { 1, 0, 0, 7, 4, 46, },
+ { 0, 0, 0, 7, 5, 46, },
+ { 2, 0, 0, 7, 5, 46, },
+ { 1, 0, 0, 7, 5, 46, },
+ { 0, 0, 0, 7, 6, 46, },
+ { 2, 0, 0, 7, 6, 46, },
+ { 1, 0, 0, 7, 6, 46, },
+ { 0, 0, 0, 7, 7, 46, },
+ { 2, 0, 0, 7, 7, 46, },
+ { 1, 0, 0, 7, 7, 46, },
+ { 0, 0, 0, 7, 8, 46, },
+ { 2, 0, 0, 7, 8, 46, },
+ { 1, 0, 0, 7, 8, 46, },
+ { 0, 0, 0, 7, 9, 46, },
+ { 2, 0, 0, 7, 9, 46, },
+ { 1, 0, 0, 7, 9, 46, },
+ { 0, 0, 0, 7, 10, 46, },
+ { 2, 0, 0, 7, 10, 46, },
+ { 1, 0, 0, 7, 10, 46, },
+ { 0, 0, 0, 7, 11, 46, },
+ { 2, 0, 0, 7, 11, 46, },
+ { 1, 0, 0, 7, 11, 46, },
+ { 0, 0, 0, 7, 12, 63, },
+ { 2, 0, 0, 7, 12, 46, },
+ { 1, 0, 0, 7, 12, 46, },
+ { 0, 0, 0, 7, 13, 63, },
+ { 2, 0, 0, 7, 13, 46, },
+ { 1, 0, 0, 7, 13, 46, },
+ { 0, 0, 0, 7, 14, 63, },
+ { 2, 0, 0, 7, 14, 63, },
+ { 1, 0, 0, 7, 14, 46, },
+ { 0, 0, 1, 2, 1, 63, },
+ { 2, 0, 1, 2, 1, 63, },
+ { 1, 0, 1, 2, 1, 63, },
+ { 0, 0, 1, 2, 2, 63, },
+ { 2, 0, 1, 2, 2, 63, },
+ { 1, 0, 1, 2, 2, 63, },
+ { 0, 0, 1, 2, 3, 30, },
+ { 2, 0, 1, 2, 3, 34, },
+ { 1, 0, 1, 2, 3, 34, },
+ { 0, 0, 1, 2, 4, 34, },
+ { 2, 0, 1, 2, 4, 34, },
+ { 1, 0, 1, 2, 4, 34, },
+ { 0, 0, 1, 2, 5, 34, },
+ { 2, 0, 1, 2, 5, 34, },
+ { 1, 0, 1, 2, 5, 34, },
+ { 0, 0, 1, 2, 6, 34, },
+ { 2, 0, 1, 2, 6, 34, },
+ { 1, 0, 1, 2, 6, 34, },
+ { 0, 0, 1, 2, 7, 34, },
+ { 2, 0, 1, 2, 7, 34, },
+ { 1, 0, 1, 2, 7, 34, },
+ { 0, 0, 1, 2, 8, 34, },
+ { 2, 0, 1, 2, 8, 34, },
+ { 1, 0, 1, 2, 8, 34, },
+ { 0, 0, 1, 2, 9, 34, },
+ { 2, 0, 1, 2, 9, 34, },
+ { 1, 0, 1, 2, 9, 34, },
+ { 0, 0, 1, 2, 10, 34, },
+ { 2, 0, 1, 2, 10, 34, },
+ { 1, 0, 1, 2, 10, 34, },
+ { 0, 0, 1, 2, 11, 28, },
+ { 2, 0, 1, 2, 11, 34, },
+ { 1, 0, 1, 2, 11, 34, },
+ { 0, 0, 1, 2, 12, 63, },
+ { 2, 0, 1, 2, 12, 34, },
+ { 1, 0, 1, 2, 12, 34, },
+ { 0, 0, 1, 2, 13, 63, },
+ { 2, 0, 1, 2, 13, 34, },
+ { 1, 0, 1, 2, 13, 34, },
+ { 0, 0, 1, 2, 14, 63, },
+ { 2, 0, 1, 2, 14, 63, },
+ { 1, 0, 1, 2, 14, 63, },
+ { 0, 0, 1, 3, 1, 63, },
+ { 2, 0, 1, 3, 1, 63, },
+ { 1, 0, 1, 3, 1, 63, },
+ { 0, 0, 1, 3, 2, 63, },
+ { 2, 0, 1, 3, 2, 63, },
+ { 1, 0, 1, 3, 2, 63, },
+ { 0, 0, 1, 3, 3, 30, },
+ { 2, 0, 1, 3, 3, 34, },
+ { 1, 0, 1, 3, 3, 34, },
+ { 0, 0, 1, 3, 4, 34, },
+ { 2, 0, 1, 3, 4, 34, },
+ { 1, 0, 1, 3, 4, 34, },
+ { 0, 0, 1, 3, 5, 34, },
+ { 2, 0, 1, 3, 5, 34, },
+ { 1, 0, 1, 3, 5, 34, },
+ { 0, 0, 1, 3, 6, 34, },
+ { 2, 0, 1, 3, 6, 34, },
+ { 1, 0, 1, 3, 6, 34, },
+ { 0, 0, 1, 3, 7, 34, },
+ { 2, 0, 1, 3, 7, 34, },
+ { 1, 0, 1, 3, 7, 34, },
+ { 0, 0, 1, 3, 8, 34, },
+ { 2, 0, 1, 3, 8, 34, },
+ { 1, 0, 1, 3, 8, 34, },
+ { 0, 0, 1, 3, 9, 34, },
+ { 2, 0, 1, 3, 9, 34, },
+ { 1, 0, 1, 3, 9, 34, },
+ { 0, 0, 1, 3, 10, 34, },
+ { 2, 0, 1, 3, 10, 34, },
+ { 1, 0, 1, 3, 10, 34, },
+ { 0, 0, 1, 3, 11, 28, },
+ { 2, 0, 1, 3, 11, 34, },
+ { 1, 0, 1, 3, 11, 34, },
+ { 0, 0, 1, 3, 12, 63, },
+ { 2, 0, 1, 3, 12, 34, },
+ { 1, 0, 1, 3, 12, 34, },
+ { 0, 0, 1, 3, 13, 63, },
+ { 2, 0, 1, 3, 13, 34, },
+ { 1, 0, 1, 3, 13, 34, },
+ { 0, 0, 1, 3, 14, 63, },
+ { 2, 0, 1, 3, 14, 63, },
+ { 1, 0, 1, 3, 14, 63, },
+ { 0, 0, 1, 6, 1, 63, },
+ { 2, 0, 1, 6, 1, 63, },
+ { 1, 0, 1, 6, 1, 63, },
+ { 0, 0, 1, 6, 2, 63, },
+ { 2, 0, 1, 6, 2, 63, },
+ { 1, 0, 1, 6, 2, 63, },
+ { 0, 0, 1, 6, 3, 30, },
+ { 2, 0, 1, 6, 3, 34, },
+ { 1, 0, 1, 6, 3, 34, },
+ { 0, 0, 1, 6, 4, 34, },
+ { 2, 0, 1, 6, 4, 34, },
+ { 1, 0, 1, 6, 4, 34, },
+ { 0, 0, 1, 6, 5, 34, },
+ { 2, 0, 1, 6, 5, 34, },
+ { 1, 0, 1, 6, 5, 34, },
+ { 0, 0, 1, 6, 6, 34, },
+ { 2, 0, 1, 6, 6, 34, },
+ { 1, 0, 1, 6, 6, 34, },
+ { 0, 0, 1, 6, 7, 34, },
+ { 2, 0, 1, 6, 7, 34, },
+ { 1, 0, 1, 6, 7, 34, },
+ { 0, 0, 1, 6, 8, 34, },
+ { 2, 0, 1, 6, 8, 34, },
+ { 1, 0, 1, 6, 8, 34, },
+ { 0, 0, 1, 6, 9, 34, },
+ { 2, 0, 1, 6, 9, 34, },
+ { 1, 0, 1, 6, 9, 34, },
+ { 0, 0, 1, 6, 10, 34, },
+ { 2, 0, 1, 6, 10, 34, },
+ { 1, 0, 1, 6, 10, 34, },
+ { 0, 0, 1, 6, 11, 28, },
+ { 2, 0, 1, 6, 11, 34, },
+ { 1, 0, 1, 6, 11, 34, },
+ { 0, 0, 1, 6, 12, 63, },
+ { 2, 0, 1, 6, 12, 34, },
+ { 1, 0, 1, 6, 12, 34, },
+ { 0, 0, 1, 6, 13, 63, },
+ { 2, 0, 1, 6, 13, 34, },
+ { 1, 0, 1, 6, 13, 34, },
+ { 0, 0, 1, 6, 14, 63, },
+ { 2, 0, 1, 6, 14, 63, },
+ { 1, 0, 1, 6, 14, 63, },
+ { 0, 0, 1, 7, 1, 63, },
+ { 2, 0, 1, 7, 1, 63, },
+ { 1, 0, 1, 7, 1, 63, },
+ { 0, 0, 1, 7, 2, 63, },
+ { 2, 0, 1, 7, 2, 63, },
+ { 1, 0, 1, 7, 2, 63, },
+ { 0, 0, 1, 7, 3, 30, },
+ { 2, 0, 1, 7, 3, 34, },
+ { 1, 0, 1, 7, 3, 34, },
+ { 0, 0, 1, 7, 4, 34, },
+ { 2, 0, 1, 7, 4, 34, },
+ { 1, 0, 1, 7, 4, 34, },
+ { 0, 0, 1, 7, 5, 34, },
+ { 2, 0, 1, 7, 5, 34, },
+ { 1, 0, 1, 7, 5, 34, },
+ { 0, 0, 1, 7, 6, 34, },
+ { 2, 0, 1, 7, 6, 34, },
+ { 1, 0, 1, 7, 6, 34, },
+ { 0, 0, 1, 7, 7, 34, },
+ { 2, 0, 1, 7, 7, 34, },
+ { 1, 0, 1, 7, 7, 34, },
+ { 0, 0, 1, 7, 8, 34, },
+ { 2, 0, 1, 7, 8, 34, },
+ { 1, 0, 1, 7, 8, 34, },
+ { 0, 0, 1, 7, 9, 34, },
+ { 2, 0, 1, 7, 9, 34, },
+ { 1, 0, 1, 7, 9, 34, },
+ { 0, 0, 1, 7, 10, 34, },
+ { 2, 0, 1, 7, 10, 34, },
+ { 1, 0, 1, 7, 10, 34, },
+ { 0, 0, 1, 7, 11, 28, },
+ { 2, 0, 1, 7, 11, 34, },
+ { 1, 0, 1, 7, 11, 34, },
+ { 0, 0, 1, 7, 12, 63, },
+ { 2, 0, 1, 7, 12, 34, },
+ { 1, 0, 1, 7, 12, 34, },
+ { 0, 0, 1, 7, 13, 63, },
+ { 2, 0, 1, 7, 13, 34, },
+ { 1, 0, 1, 7, 13, 34, },
+ { 0, 0, 1, 7, 14, 63, },
+ { 2, 0, 1, 7, 14, 63, },
+ { 1, 0, 1, 7, 14, 63, },
+ { 0, 1, 0, 1, 36, 46, },
+ { 2, 1, 0, 1, 36, 46, },
+ { 1, 1, 0, 1, 36, 46, },
+ { 0, 1, 0, 1, 40, 46, },
+ { 2, 1, 0, 1, 40, 46, },
+ { 1, 1, 0, 1, 40, 46, },
+ { 0, 1, 0, 1, 44, 46, },
+ { 2, 1, 0, 1, 44, 46, },
+ { 1, 1, 0, 1, 44, 46, },
+ { 0, 1, 0, 1, 48, 46, },
+ { 2, 1, 0, 1, 48, 46, },
+ { 1, 1, 0, 1, 48, 46, },
+ { 0, 1, 0, 1, 52, 46, },
+ { 2, 1, 0, 1, 52, 46, },
+ { 1, 1, 0, 1, 52, 46, },
+ { 0, 1, 0, 1, 56, 46, },
+ { 2, 1, 0, 1, 56, 46, },
+ { 1, 1, 0, 1, 56, 46, },
+ { 0, 1, 0, 1, 60, 46, },
+ { 2, 1, 0, 1, 60, 46, },
+ { 1, 1, 0, 1, 60, 46, },
+ { 0, 1, 0, 1, 64, 46, },
+ { 2, 1, 0, 1, 64, 46, },
+ { 1, 1, 0, 1, 64, 46, },
+ { 0, 1, 0, 1, 100, 46, },
+ { 2, 1, 0, 1, 100, 46, },
+ { 1, 1, 0, 1, 100, 46, },
+ { 0, 1, 0, 1, 104, 46, },
+ { 2, 1, 0, 1, 104, 46, },
+ { 1, 1, 0, 1, 104, 46, },
+ { 0, 1, 0, 1, 108, 46, },
+ { 2, 1, 0, 1, 108, 46, },
+ { 1, 1, 0, 1, 108, 46, },
+ { 0, 1, 0, 1, 112, 46, },
+ { 2, 1, 0, 1, 112, 46, },
+ { 1, 1, 0, 1, 112, 46, },
+ { 0, 1, 0, 1, 116, 46, },
+ { 2, 1, 0, 1, 116, 46, },
+ { 1, 1, 0, 1, 116, 46, },
+ { 0, 1, 0, 1, 120, 46, },
+ { 2, 1, 0, 1, 120, 46, },
+ { 1, 1, 0, 1, 120, 46, },
+ { 0, 1, 0, 1, 124, 46, },
+ { 2, 1, 0, 1, 124, 46, },
+ { 1, 1, 0, 1, 124, 46, },
+ { 0, 1, 0, 1, 128, 46, },
+ { 2, 1, 0, 1, 128, 46, },
+ { 1, 1, 0, 1, 128, 46, },
+ { 0, 1, 0, 1, 132, 46, },
+ { 2, 1, 0, 1, 132, 46, },
+ { 1, 1, 0, 1, 132, 46, },
+ { 0, 1, 0, 1, 136, 46, },
+ { 2, 1, 0, 1, 136, 46, },
+ { 1, 1, 0, 1, 136, 46, },
+ { 0, 1, 0, 1, 140, 46, },
+ { 2, 1, 0, 1, 140, 46, },
+ { 1, 1, 0, 1, 140, 46, },
+ { 0, 1, 0, 1, 149, 46, },
+ { 2, 1, 0, 1, 149, 46, },
+ { 1, 1, 0, 1, 149, 63, },
+ { 0, 1, 0, 1, 153, 46, },
+ { 2, 1, 0, 1, 153, 46, },
+ { 1, 1, 0, 1, 153, 63, },
+ { 0, 1, 0, 1, 157, 46, },
+ { 2, 1, 0, 1, 157, 46, },
+ { 1, 1, 0, 1, 157, 63, },
+ { 0, 1, 0, 1, 161, 46, },
+ { 2, 1, 0, 1, 161, 46, },
+ { 1, 1, 0, 1, 161, 63, },
+ { 0, 1, 0, 1, 165, 46, },
+ { 2, 1, 0, 1, 165, 46, },
+ { 1, 1, 0, 1, 165, 63, },
+ { 0, 1, 0, 2, 36, 46, },
+ { 2, 1, 0, 2, 36, 46, },
+ { 1, 1, 0, 2, 36, 46, },
+ { 0, 1, 0, 2, 40, 46, },
+ { 2, 1, 0, 2, 40, 46, },
+ { 1, 1, 0, 2, 40, 46, },
+ { 0, 1, 0, 2, 44, 46, },
+ { 2, 1, 0, 2, 44, 46, },
+ { 1, 1, 0, 2, 44, 46, },
+ { 0, 1, 0, 2, 48, 46, },
+ { 2, 1, 0, 2, 48, 46, },
+ { 1, 1, 0, 2, 48, 46, },
+ { 0, 1, 0, 2, 52, 46, },
+ { 2, 1, 0, 2, 52, 46, },
+ { 1, 1, 0, 2, 52, 46, },
+ { 0, 1, 0, 2, 56, 46, },
+ { 2, 1, 0, 2, 56, 46, },
+ { 1, 1, 0, 2, 56, 46, },
+ { 0, 1, 0, 2, 60, 46, },
+ { 2, 1, 0, 2, 60, 46, },
+ { 1, 1, 0, 2, 60, 46, },
+ { 0, 1, 0, 2, 64, 46, },
+ { 2, 1, 0, 2, 64, 46, },
+ { 1, 1, 0, 2, 64, 46, },
+ { 0, 1, 0, 2, 100, 46, },
+ { 2, 1, 0, 2, 100, 46, },
+ { 1, 1, 0, 2, 100, 46, },
+ { 0, 1, 0, 2, 104, 46, },
+ { 2, 1, 0, 2, 104, 46, },
+ { 1, 1, 0, 2, 104, 46, },
+ { 0, 1, 0, 2, 108, 46, },
+ { 2, 1, 0, 2, 108, 46, },
+ { 1, 1, 0, 2, 108, 46, },
+ { 0, 1, 0, 2, 112, 46, },
+ { 2, 1, 0, 2, 112, 46, },
+ { 1, 1, 0, 2, 112, 46, },
+ { 0, 1, 0, 2, 116, 46, },
+ { 2, 1, 0, 2, 116, 46, },
+ { 1, 1, 0, 2, 116, 46, },
+ { 0, 1, 0, 2, 120, 46, },
+ { 2, 1, 0, 2, 120, 46, },
+ { 1, 1, 0, 2, 120, 46, },
+ { 0, 1, 0, 2, 124, 46, },
+ { 2, 1, 0, 2, 124, 46, },
+ { 1, 1, 0, 2, 124, 46, },
+ { 0, 1, 0, 2, 128, 46, },
+ { 2, 1, 0, 2, 128, 46, },
+ { 1, 1, 0, 2, 128, 46, },
+ { 0, 1, 0, 2, 132, 46, },
+ { 2, 1, 0, 2, 132, 46, },
+ { 1, 1, 0, 2, 132, 46, },
+ { 0, 1, 0, 2, 136, 46, },
+ { 2, 1, 0, 2, 136, 46, },
+ { 1, 1, 0, 2, 136, 46, },
+ { 0, 1, 0, 2, 140, 46, },
+ { 2, 1, 0, 2, 140, 46, },
+ { 1, 1, 0, 2, 140, 46, },
+ { 0, 1, 0, 2, 149, 46, },
+ { 2, 1, 0, 2, 149, 46, },
+ { 1, 1, 0, 2, 149, 63, },
+ { 0, 1, 0, 2, 153, 46, },
+ { 2, 1, 0, 2, 153, 46, },
+ { 1, 1, 0, 2, 153, 63, },
+ { 0, 1, 0, 2, 157, 46, },
+ { 2, 1, 0, 2, 157, 46, },
+ { 1, 1, 0, 2, 157, 63, },
+ { 0, 1, 0, 2, 161, 46, },
+ { 2, 1, 0, 2, 161, 46, },
+ { 1, 1, 0, 2, 161, 63, },
+ { 0, 1, 0, 2, 165, 46, },
+ { 2, 1, 0, 2, 165, 46, },
+ { 1, 1, 0, 2, 165, 63, },
+ { 0, 1, 0, 3, 36, 46, },
+ { 2, 1, 0, 3, 36, 46, },
+ { 1, 1, 0, 3, 36, 46, },
+ { 0, 1, 0, 3, 40, 46, },
+ { 2, 1, 0, 3, 40, 46, },
+ { 1, 1, 0, 3, 40, 46, },
+ { 0, 1, 0, 3, 44, 46, },
+ { 2, 1, 0, 3, 44, 46, },
+ { 1, 1, 0, 3, 44, 46, },
+ { 0, 1, 0, 3, 48, 46, },
+ { 2, 1, 0, 3, 48, 46, },
+ { 1, 1, 0, 3, 48, 46, },
+ { 0, 1, 0, 3, 52, 46, },
+ { 2, 1, 0, 3, 52, 46, },
+ { 1, 1, 0, 3, 52, 46, },
+ { 0, 1, 0, 3, 56, 46, },
+ { 2, 1, 0, 3, 56, 46, },
+ { 1, 1, 0, 3, 56, 46, },
+ { 0, 1, 0, 3, 60, 46, },
+ { 2, 1, 0, 3, 60, 46, },
+ { 1, 1, 0, 3, 60, 46, },
+ { 0, 1, 0, 3, 64, 46, },
+ { 2, 1, 0, 3, 64, 46, },
+ { 1, 1, 0, 3, 64, 46, },
+ { 0, 1, 0, 3, 100, 46, },
+ { 2, 1, 0, 3, 100, 46, },
+ { 1, 1, 0, 3, 100, 46, },
+ { 0, 1, 0, 3, 104, 46, },
+ { 2, 1, 0, 3, 104, 46, },
+ { 1, 1, 0, 3, 104, 46, },
+ { 0, 1, 0, 3, 108, 46, },
+ { 2, 1, 0, 3, 108, 46, },
+ { 1, 1, 0, 3, 108, 46, },
+ { 0, 1, 0, 3, 112, 46, },
+ { 2, 1, 0, 3, 112, 46, },
+ { 1, 1, 0, 3, 112, 46, },
+ { 0, 1, 0, 3, 116, 46, },
+ { 2, 1, 0, 3, 116, 46, },
+ { 1, 1, 0, 3, 116, 46, },
+ { 0, 1, 0, 3, 120, 46, },
+ { 2, 1, 0, 3, 120, 46, },
+ { 1, 1, 0, 3, 120, 46, },
+ { 0, 1, 0, 3, 124, 46, },
+ { 2, 1, 0, 3, 124, 46, },
+ { 1, 1, 0, 3, 124, 46, },
+ { 0, 1, 0, 3, 128, 46, },
+ { 2, 1, 0, 3, 128, 46, },
+ { 1, 1, 0, 3, 128, 46, },
+ { 0, 1, 0, 3, 132, 46, },
+ { 2, 1, 0, 3, 132, 46, },
+ { 1, 1, 0, 3, 132, 46, },
+ { 0, 1, 0, 3, 136, 46, },
+ { 2, 1, 0, 3, 136, 46, },
+ { 1, 1, 0, 3, 136, 46, },
+ { 0, 1, 0, 3, 140, 46, },
+ { 2, 1, 0, 3, 140, 46, },
+ { 1, 1, 0, 3, 140, 46, },
+ { 0, 1, 0, 3, 149, 46, },
+ { 2, 1, 0, 3, 149, 46, },
+ { 1, 1, 0, 3, 149, 63, },
+ { 0, 1, 0, 3, 153, 46, },
+ { 2, 1, 0, 3, 153, 46, },
+ { 1, 1, 0, 3, 153, 63, },
+ { 0, 1, 0, 3, 157, 46, },
+ { 2, 1, 0, 3, 157, 46, },
+ { 1, 1, 0, 3, 157, 63, },
+ { 0, 1, 0, 3, 161, 46, },
+ { 2, 1, 0, 3, 161, 46, },
+ { 1, 1, 0, 3, 161, 63, },
+ { 0, 1, 0, 3, 165, 46, },
+ { 2, 1, 0, 3, 165, 46, },
+ { 1, 1, 0, 3, 165, 63, },
+ { 0, 1, 0, 6, 36, 46, },
+ { 2, 1, 0, 6, 36, 46, },
+ { 1, 1, 0, 6, 36, 46, },
+ { 0, 1, 0, 6, 40, 46, },
+ { 2, 1, 0, 6, 40, 46, },
+ { 1, 1, 0, 6, 40, 46, },
+ { 0, 1, 0, 6, 44, 46, },
+ { 2, 1, 0, 6, 44, 46, },
+ { 1, 1, 0, 6, 44, 46, },
+ { 0, 1, 0, 6, 48, 46, },
+ { 2, 1, 0, 6, 48, 46, },
+ { 1, 1, 0, 6, 48, 46, },
+ { 0, 1, 0, 6, 52, 46, },
+ { 2, 1, 0, 6, 52, 46, },
+ { 1, 1, 0, 6, 52, 46, },
+ { 0, 1, 0, 6, 56, 46, },
+ { 2, 1, 0, 6, 56, 46, },
+ { 1, 1, 0, 6, 56, 46, },
+ { 0, 1, 0, 6, 60, 46, },
+ { 2, 1, 0, 6, 60, 46, },
+ { 1, 1, 0, 6, 60, 46, },
+ { 0, 1, 0, 6, 64, 46, },
+ { 2, 1, 0, 6, 64, 46, },
+ { 1, 1, 0, 6, 64, 46, },
+ { 0, 1, 0, 6, 100, 46, },
+ { 2, 1, 0, 6, 100, 46, },
+ { 1, 1, 0, 6, 100, 46, },
+ { 0, 1, 0, 6, 104, 46, },
+ { 2, 1, 0, 6, 104, 46, },
+ { 1, 1, 0, 6, 104, 46, },
+ { 0, 1, 0, 6, 108, 46, },
+ { 2, 1, 0, 6, 108, 46, },
+ { 1, 1, 0, 6, 108, 46, },
+ { 0, 1, 0, 6, 112, 46, },
+ { 2, 1, 0, 6, 112, 46, },
+ { 1, 1, 0, 6, 112, 46, },
+ { 0, 1, 0, 6, 116, 46, },
+ { 2, 1, 0, 6, 116, 46, },
+ { 1, 1, 0, 6, 116, 46, },
+ { 0, 1, 0, 6, 120, 46, },
+ { 2, 1, 0, 6, 120, 46, },
+ { 1, 1, 0, 6, 120, 46, },
+ { 0, 1, 0, 6, 124, 46, },
+ { 2, 1, 0, 6, 124, 46, },
+ { 1, 1, 0, 6, 124, 46, },
+ { 0, 1, 0, 6, 128, 46, },
+ { 2, 1, 0, 6, 128, 46, },
+ { 1, 1, 0, 6, 128, 46, },
+ { 0, 1, 0, 6, 132, 46, },
+ { 2, 1, 0, 6, 132, 46, },
+ { 1, 1, 0, 6, 132, 46, },
+ { 0, 1, 0, 6, 136, 46, },
+ { 2, 1, 0, 6, 136, 46, },
+ { 1, 1, 0, 6, 136, 46, },
+ { 0, 1, 0, 6, 140, 46, },
+ { 2, 1, 0, 6, 140, 46, },
+ { 1, 1, 0, 6, 140, 46, },
+ { 0, 1, 0, 6, 149, 46, },
+ { 2, 1, 0, 6, 149, 46, },
+ { 1, 1, 0, 6, 149, 63, },
+ { 0, 1, 0, 6, 153, 46, },
+ { 2, 1, 0, 6, 153, 46, },
+ { 1, 1, 0, 6, 153, 63, },
+ { 0, 1, 0, 6, 157, 46, },
+ { 2, 1, 0, 6, 157, 46, },
+ { 1, 1, 0, 6, 157, 63, },
+ { 0, 1, 0, 6, 161, 46, },
+ { 2, 1, 0, 6, 161, 46, },
+ { 1, 1, 0, 6, 161, 63, },
+ { 0, 1, 0, 6, 165, 46, },
+ { 2, 1, 0, 6, 165, 46, },
+ { 1, 1, 0, 6, 165, 63, },
+ { 0, 1, 0, 7, 36, 46, },
+ { 2, 1, 0, 7, 36, 46, },
+ { 1, 1, 0, 7, 36, 46, },
+ { 0, 1, 0, 7, 40, 46, },
+ { 2, 1, 0, 7, 40, 46, },
+ { 1, 1, 0, 7, 40, 46, },
+ { 0, 1, 0, 7, 44, 46, },
+ { 2, 1, 0, 7, 44, 46, },
+ { 1, 1, 0, 7, 44, 46, },
+ { 0, 1, 0, 7, 48, 46, },
+ { 2, 1, 0, 7, 48, 46, },
+ { 1, 1, 0, 7, 48, 46, },
+ { 0, 1, 0, 7, 52, 46, },
+ { 2, 1, 0, 7, 52, 46, },
+ { 1, 1, 0, 7, 52, 46, },
+ { 0, 1, 0, 7, 56, 46, },
+ { 2, 1, 0, 7, 56, 46, },
+ { 1, 1, 0, 7, 56, 46, },
+ { 0, 1, 0, 7, 60, 46, },
+ { 2, 1, 0, 7, 60, 46, },
+ { 1, 1, 0, 7, 60, 46, },
+ { 0, 1, 0, 7, 64, 46, },
+ { 2, 1, 0, 7, 64, 46, },
+ { 1, 1, 0, 7, 64, 46, },
+ { 0, 1, 0, 7, 100, 46, },
+ { 2, 1, 0, 7, 100, 46, },
+ { 1, 1, 0, 7, 100, 46, },
+ { 0, 1, 0, 7, 104, 46, },
+ { 2, 1, 0, 7, 104, 46, },
+ { 1, 1, 0, 7, 104, 46, },
+ { 0, 1, 0, 7, 108, 46, },
+ { 2, 1, 0, 7, 108, 46, },
+ { 1, 1, 0, 7, 108, 46, },
+ { 0, 1, 0, 7, 112, 46, },
+ { 2, 1, 0, 7, 112, 46, },
+ { 1, 1, 0, 7, 112, 46, },
+ { 0, 1, 0, 7, 116, 46, },
+ { 2, 1, 0, 7, 116, 46, },
+ { 1, 1, 0, 7, 116, 46, },
+ { 0, 1, 0, 7, 120, 46, },
+ { 2, 1, 0, 7, 120, 46, },
+ { 1, 1, 0, 7, 120, 46, },
+ { 0, 1, 0, 7, 124, 46, },
+ { 2, 1, 0, 7, 124, 46, },
+ { 1, 1, 0, 7, 124, 46, },
+ { 0, 1, 0, 7, 128, 46, },
+ { 2, 1, 0, 7, 128, 46, },
+ { 1, 1, 0, 7, 128, 46, },
+ { 0, 1, 0, 7, 132, 46, },
+ { 2, 1, 0, 7, 132, 46, },
+ { 1, 1, 0, 7, 132, 46, },
+ { 0, 1, 0, 7, 136, 46, },
+ { 2, 1, 0, 7, 136, 46, },
+ { 1, 1, 0, 7, 136, 46, },
+ { 0, 1, 0, 7, 140, 46, },
+ { 2, 1, 0, 7, 140, 46, },
+ { 1, 1, 0, 7, 140, 46, },
+ { 0, 1, 0, 7, 149, 46, },
+ { 2, 1, 0, 7, 149, 46, },
+ { 1, 1, 0, 7, 149, 63, },
+ { 0, 1, 0, 7, 153, 46, },
+ { 2, 1, 0, 7, 153, 46, },
+ { 1, 1, 0, 7, 153, 63, },
+ { 0, 1, 0, 7, 157, 46, },
+ { 2, 1, 0, 7, 157, 46, },
+ { 1, 1, 0, 7, 157, 63, },
+ { 0, 1, 0, 7, 161, 46, },
+ { 2, 1, 0, 7, 161, 46, },
+ { 1, 1, 0, 7, 161, 63, },
+ { 0, 1, 0, 7, 165, 46, },
+ { 2, 1, 0, 7, 165, 46, },
+ { 1, 1, 0, 7, 165, 63, },
+ { 0, 1, 1, 2, 38, 46, },
+ { 2, 1, 1, 2, 38, 46, },
+ { 1, 1, 1, 2, 38, 46, },
+ { 0, 1, 1, 2, 46, 46, },
+ { 2, 1, 1, 2, 46, 46, },
+ { 1, 1, 1, 2, 46, 46, },
+ { 0, 1, 1, 2, 54, 46, },
+ { 2, 1, 1, 2, 54, 46, },
+ { 1, 1, 1, 2, 54, 46, },
+ { 0, 1, 1, 2, 62, 46, },
+ { 2, 1, 1, 2, 62, 46, },
+ { 1, 1, 1, 2, 62, 46, },
+ { 0, 1, 1, 2, 102, 46, },
+ { 2, 1, 1, 2, 102, 46, },
+ { 1, 1, 1, 2, 102, 46, },
+ { 0, 1, 1, 2, 110, 46, },
+ { 2, 1, 1, 2, 110, 46, },
+ { 1, 1, 1, 2, 110, 46, },
+ { 0, 1, 1, 2, 118, 46, },
+ { 2, 1, 1, 2, 118, 46, },
+ { 1, 1, 1, 2, 118, 46, },
+ { 0, 1, 1, 2, 126, 46, },
+ { 2, 1, 1, 2, 126, 46, },
+ { 1, 1, 1, 2, 126, 46, },
+ { 0, 1, 1, 2, 134, 46, },
+ { 2, 1, 1, 2, 134, 46, },
+ { 1, 1, 1, 2, 134, 46, },
+ { 0, 1, 1, 2, 151, 46, },
+ { 2, 1, 1, 2, 151, 46, },
+ { 1, 1, 1, 2, 151, 63, },
+ { 0, 1, 1, 2, 159, 46, },
+ { 2, 1, 1, 2, 159, 46, },
+ { 1, 1, 1, 2, 159, 63, },
+ { 0, 1, 1, 3, 38, 46, },
+ { 2, 1, 1, 3, 38, 46, },
+ { 1, 1, 1, 3, 38, 46, },
+ { 0, 1, 1, 3, 46, 46, },
+ { 2, 1, 1, 3, 46, 46, },
+ { 1, 1, 1, 3, 46, 46, },
+ { 0, 1, 1, 3, 54, 46, },
+ { 2, 1, 1, 3, 54, 46, },
+ { 1, 1, 1, 3, 54, 46, },
+ { 0, 1, 1, 3, 62, 46, },
+ { 2, 1, 1, 3, 62, 46, },
+ { 1, 1, 1, 3, 62, 46, },
+ { 0, 1, 1, 3, 102, 46, },
+ { 2, 1, 1, 3, 102, 46, },
+ { 1, 1, 1, 3, 102, 46, },
+ { 0, 1, 1, 3, 110, 46, },
+ { 2, 1, 1, 3, 110, 46, },
+ { 1, 1, 1, 3, 110, 46, },
+ { 0, 1, 1, 3, 118, 46, },
+ { 2, 1, 1, 3, 118, 46, },
+ { 1, 1, 1, 3, 118, 46, },
+ { 0, 1, 1, 3, 126, 46, },
+ { 2, 1, 1, 3, 126, 46, },
+ { 1, 1, 1, 3, 126, 46, },
+ { 0, 1, 1, 3, 134, 46, },
+ { 2, 1, 1, 3, 134, 46, },
+ { 1, 1, 1, 3, 134, 46, },
+ { 0, 1, 1, 3, 151, 46, },
+ { 2, 1, 1, 3, 151, 46, },
+ { 1, 1, 1, 3, 151, 63, },
+ { 0, 1, 1, 3, 159, 46, },
+ { 2, 1, 1, 3, 159, 46, },
+ { 1, 1, 1, 3, 159, 63, },
+ { 0, 1, 1, 6, 38, 46, },
+ { 2, 1, 1, 6, 38, 46, },
+ { 1, 1, 1, 6, 38, 46, },
+ { 0, 1, 1, 6, 46, 46, },
+ { 2, 1, 1, 6, 46, 46, },
+ { 1, 1, 1, 6, 46, 46, },
+ { 0, 1, 1, 6, 54, 46, },
+ { 2, 1, 1, 6, 54, 46, },
+ { 1, 1, 1, 6, 54, 46, },
+ { 0, 1, 1, 6, 62, 46, },
+ { 2, 1, 1, 6, 62, 46, },
+ { 1, 1, 1, 6, 62, 46, },
+ { 0, 1, 1, 6, 102, 46, },
+ { 2, 1, 1, 6, 102, 46, },
+ { 1, 1, 1, 6, 102, 46, },
+ { 0, 1, 1, 6, 110, 46, },
+ { 2, 1, 1, 6, 110, 46, },
+ { 1, 1, 1, 6, 110, 46, },
+ { 0, 1, 1, 6, 118, 46, },
+ { 2, 1, 1, 6, 118, 46, },
+ { 1, 1, 1, 6, 118, 46, },
+ { 0, 1, 1, 6, 126, 46, },
+ { 2, 1, 1, 6, 126, 46, },
+ { 1, 1, 1, 6, 126, 46, },
+ { 0, 1, 1, 6, 134, 46, },
+ { 2, 1, 1, 6, 134, 46, },
+ { 1, 1, 1, 6, 134, 46, },
+ { 0, 1, 1, 6, 151, 46, },
+ { 2, 1, 1, 6, 151, 46, },
+ { 1, 1, 1, 6, 151, 63, },
+ { 0, 1, 1, 6, 159, 46, },
+ { 2, 1, 1, 6, 159, 46, },
+ { 1, 1, 1, 6, 159, 63, },
+ { 0, 1, 1, 7, 38, 46, },
+ { 2, 1, 1, 7, 38, 46, },
+ { 1, 1, 1, 7, 38, 46, },
+ { 0, 1, 1, 7, 46, 46, },
+ { 2, 1, 1, 7, 46, 46, },
+ { 1, 1, 1, 7, 46, 46, },
+ { 0, 1, 1, 7, 54, 46, },
+ { 2, 1, 1, 7, 54, 46, },
+ { 1, 1, 1, 7, 54, 46, },
+ { 0, 1, 1, 7, 62, 46, },
+ { 2, 1, 1, 7, 62, 46, },
+ { 1, 1, 1, 7, 62, 46, },
+ { 0, 1, 1, 7, 102, 46, },
+ { 2, 1, 1, 7, 102, 46, },
+ { 1, 1, 1, 7, 102, 46, },
+ { 0, 1, 1, 7, 110, 46, },
+ { 2, 1, 1, 7, 110, 46, },
+ { 1, 1, 1, 7, 110, 46, },
+ { 0, 1, 1, 7, 118, 46, },
+ { 2, 1, 1, 7, 118, 46, },
+ { 1, 1, 1, 7, 118, 46, },
+ { 0, 1, 1, 7, 126, 46, },
+ { 2, 1, 1, 7, 126, 46, },
+ { 1, 1, 1, 7, 126, 46, },
+ { 0, 1, 1, 7, 134, 46, },
+ { 2, 1, 1, 7, 134, 46, },
+ { 1, 1, 1, 7, 134, 46, },
+ { 0, 1, 1, 7, 151, 46, },
+ { 2, 1, 1, 7, 151, 46, },
+ { 1, 1, 1, 7, 151, 63, },
+ { 0, 1, 1, 7, 159, 46, },
+ { 2, 1, 1, 7, 159, 46, },
+ { 1, 1, 1, 7, 159, 63, },
+ { 0, 1, 2, 4, 42, 46, },
+ { 2, 1, 2, 4, 42, 46, },
+ { 1, 1, 2, 4, 42, 46, },
+ { 0, 1, 2, 4, 58, 46, },
+ { 2, 1, 2, 4, 58, 46, },
+ { 1, 1, 2, 4, 58, 46, },
+ { 0, 1, 2, 4, 106, 46, },
+ { 2, 1, 2, 4, 106, 46, },
+ { 1, 1, 2, 4, 106, 46, },
+ { 0, 1, 2, 4, 122, 46, },
+ { 2, 1, 2, 4, 122, 46, },
+ { 1, 1, 2, 4, 122, 46, },
+ { 0, 1, 2, 4, 155, 46, },
+ { 2, 1, 2, 4, 155, 46, },
+ { 1, 1, 2, 4, 155, 63, },
+ { 0, 1, 2, 5, 42, 46, },
+ { 2, 1, 2, 5, 42, 46, },
+ { 1, 1, 2, 5, 42, 46, },
+ { 0, 1, 2, 5, 58, 46, },
+ { 2, 1, 2, 5, 58, 46, },
+ { 1, 1, 2, 5, 58, 46, },
+ { 0, 1, 2, 5, 106, 46, },
+ { 2, 1, 2, 5, 106, 46, },
+ { 1, 1, 2, 5, 106, 46, },
+ { 0, 1, 2, 5, 122, 46, },
+ { 2, 1, 2, 5, 122, 46, },
+ { 1, 1, 2, 5, 122, 46, },
+ { 0, 1, 2, 5, 155, 46, },
+ { 2, 1, 2, 5, 155, 46, },
+ { 1, 1, 2, 5, 155, 63, },
+ { 0, 1, 2, 8, 42, 46, },
+ { 2, 1, 2, 8, 42, 46, },
+ { 1, 1, 2, 8, 42, 46, },
+ { 0, 1, 2, 8, 58, 46, },
+ { 2, 1, 2, 8, 58, 46, },
+ { 1, 1, 2, 8, 58, 46, },
+ { 0, 1, 2, 8, 106, 46, },
+ { 2, 1, 2, 8, 106, 46, },
+ { 1, 1, 2, 8, 106, 46, },
+ { 0, 1, 2, 8, 122, 46, },
+ { 2, 1, 2, 8, 122, 46, },
+ { 1, 1, 2, 8, 122, 46, },
+ { 0, 1, 2, 8, 155, 46, },
+ { 2, 1, 2, 8, 155, 46, },
+ { 1, 1, 2, 8, 155, 63, },
+ { 0, 1, 2, 9, 42, 46, },
+ { 2, 1, 2, 9, 42, 46, },
+ { 1, 1, 2, 9, 42, 46, },
+ { 0, 1, 2, 9, 58, 46, },
+ { 2, 1, 2, 9, 58, 46, },
+ { 1, 1, 2, 9, 58, 46, },
+ { 0, 1, 2, 9, 106, 46, },
+ { 2, 1, 2, 9, 106, 46, },
+ { 1, 1, 2, 9, 106, 46, },
+ { 0, 1, 2, 9, 122, 46, },
+ { 2, 1, 2, 9, 122, 46, },
+ { 1, 1, 2, 9, 122, 46, },
+ { 0, 1, 2, 9, 155, 46, },
+ { 2, 1, 2, 9, 155, 46, },
+ { 1, 1, 2, 9, 155, 63, },
+};
+
+RTW_DECL_TABLE_TXPWR_LMT(rtw8814a_txpwr_lmt_type8);
+
+static const u8
+rtw8814a_pwrtrk_5gd_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11,
+ 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19},
+ {0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10,
+ 11, 12, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18},
+ {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19},
+};
+
+static const u8
+rtw8814a_pwrtrk_5gd_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25, 25},
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25},
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25},
+};
+
+static const u8
+rtw8814a_pwrtrk_5gc_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10,
+ 11, 12, 13, 14, 15, 15, 15, 15, 16, 16, 17, 18},
+ {0, 1, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11,
+ 12, 12, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20},
+ {0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11,
+ 12, 13, 13, 14, 14, 15, 16, 17, 18, 18, 19, 20, 20},
+};
+
+static const u8
+rtw8814a_pwrtrk_5gc_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25},
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 17, 18, 19, 20, 21, 22, 23, 24, 24, 25, 25, 25},
+ {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 25},
+};
+
+static const u8
+rtw8814a_pwrtrk_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 13, 13, 14, 14, 15, 15, 16, 17, 17},
+ {0, 1, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11,
+ 12, 12, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20},
+ {0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11,
+ 12, 13, 13, 14, 14, 15, 16, 17, 18, 18, 19, 20, 20},
+};
+
+static const u8
+rtw8814a_pwrtrk_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14,
+ 15, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 23, 24},
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25},
+ {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 25},
+};
+
+static const u8
+rtw8814a_pwrtrk_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
+ 8, 9, 9, 10, 11, 11, 11, 11, 12, 12, 13, 13, 14},
+ {0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 11,
+ 12, 13, 14, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21},
+ {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19},
+};
+
+static const u8
+rtw8814a_pwrtrk_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 12, 13,
+ 14, 15, 16, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24},
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 25, 25, 25},
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25},
+};
+
+static const u8 rtw8814a_pwrtrk_2gd_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7,
+ 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_2gd_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_2gc_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7,
+ 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_2gc_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13
+};
+
+static const u8 rtw8814a_pwrtrk_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7,
+ 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7,
+ 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13
+};
+
+static const u8 rtw8814a_pwrtrk_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
+ 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_2g_cck_d_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7,
+ 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_2g_cck_d_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_2g_cck_c_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6,
+ 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12
+};
+
+static const u8 rtw8814a_pwrtrk_2g_cck_c_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7,
+ 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13
+};
+
+static const u8 rtw8814a_pwrtrk_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
+ 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11
+};
+
+static const u8 rtw8814a_pwrtrk_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7,
+ 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7,
+ 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7,
+ 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14
+};
+
+const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_tbl = {
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_5gd_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_5gd_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_5gd_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_5gd_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_5gd_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_5gd_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_5gc_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_5gc_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_5gc_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_5gc_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_5gc_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_5gc_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_5gb_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_5gb_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_5gb_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_5ga_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_5ga_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_5ga_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_5ga_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_5ga_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_5ga_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_2gd_n = rtw8814a_pwrtrk_2gd_n,
+ .pwrtrk_2gd_p = rtw8814a_pwrtrk_2gd_p,
+ .pwrtrk_2gc_n = rtw8814a_pwrtrk_2gc_n,
+ .pwrtrk_2gc_p = rtw8814a_pwrtrk_2gc_p,
+ .pwrtrk_2gb_n = rtw8814a_pwrtrk_2gb_n,
+ .pwrtrk_2gb_p = rtw8814a_pwrtrk_2gb_p,
+ .pwrtrk_2ga_n = rtw8814a_pwrtrk_2ga_n,
+ .pwrtrk_2ga_p = rtw8814a_pwrtrk_2ga_p,
+ .pwrtrk_2g_cckd_n = rtw8814a_pwrtrk_2g_cck_d_n,
+ .pwrtrk_2g_cckd_p = rtw8814a_pwrtrk_2g_cck_d_p,
+ .pwrtrk_2g_cckc_n = rtw8814a_pwrtrk_2g_cck_c_n,
+ .pwrtrk_2g_cckc_p = rtw8814a_pwrtrk_2g_cck_c_p,
+ .pwrtrk_2g_cckb_n = rtw8814a_pwrtrk_2g_cck_b_n,
+ .pwrtrk_2g_cckb_p = rtw8814a_pwrtrk_2g_cck_b_p,
+ .pwrtrk_2g_ccka_n = rtw8814a_pwrtrk_2g_cck_a_n,
+ .pwrtrk_2g_ccka_p = rtw8814a_pwrtrk_2g_cck_a_p,
+};
+
+static const u8
+rtw8814a_pwrtrk_type0_5gd_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+};
+
+static const u8
+rtw8814a_pwrtrk_type0_5gd_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+};
+
+static const u8
+rtw8814a_pwrtrk_type0_5gc_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+};
+
+static const u8
+rtw8814a_pwrtrk_type0_5gc_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+};
+
+static const u8
+rtw8814a_pwrtrk_type0_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+};
+
+static const u8
+rtw8814a_pwrtrk_type0_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+};
+
+static const u8
+rtw8814a_pwrtrk_type0_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+};
+
+static const u8
+rtw8814a_pwrtrk_type0_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2gd_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2gd_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2gc_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2gc_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2g_cck_d_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2g_cck_d_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2g_cck_c_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2g_cck_c_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type0_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_type0_tbl = {
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type0_5gd_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type0_5gd_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type0_5gd_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type0_5gd_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type0_5gd_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type0_5gd_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type0_5gc_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type0_5gc_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type0_5gc_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type0_5gc_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type0_5gc_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type0_5gc_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type0_5gb_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type0_5gb_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type0_5gb_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type0_5gb_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type0_5gb_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type0_5gb_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type0_5ga_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type0_5ga_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type0_5ga_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type0_5ga_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type0_5ga_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type0_5ga_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_2gd_n = rtw8814a_pwrtrk_type0_2gd_n,
+ .pwrtrk_2gd_p = rtw8814a_pwrtrk_type0_2gd_p,
+ .pwrtrk_2gc_n = rtw8814a_pwrtrk_type0_2gc_n,
+ .pwrtrk_2gc_p = rtw8814a_pwrtrk_type0_2gc_p,
+ .pwrtrk_2gb_n = rtw8814a_pwrtrk_type0_2gb_n,
+ .pwrtrk_2gb_p = rtw8814a_pwrtrk_type0_2gb_p,
+ .pwrtrk_2ga_n = rtw8814a_pwrtrk_type0_2ga_n,
+ .pwrtrk_2ga_p = rtw8814a_pwrtrk_type0_2ga_p,
+ .pwrtrk_2g_cckd_n = rtw8814a_pwrtrk_type0_2g_cck_d_n,
+ .pwrtrk_2g_cckd_p = rtw8814a_pwrtrk_type0_2g_cck_d_p,
+ .pwrtrk_2g_cckc_n = rtw8814a_pwrtrk_type0_2g_cck_c_n,
+ .pwrtrk_2g_cckc_p = rtw8814a_pwrtrk_type0_2g_cck_c_p,
+ .pwrtrk_2g_cckb_n = rtw8814a_pwrtrk_type0_2g_cck_b_n,
+ .pwrtrk_2g_cckb_p = rtw8814a_pwrtrk_type0_2g_cck_b_p,
+ .pwrtrk_2g_ccka_n = rtw8814a_pwrtrk_type0_2g_cck_a_n,
+ .pwrtrk_2g_ccka_p = rtw8814a_pwrtrk_type0_2g_cck_a_p,
+};
+
+static const u8
+rtw8814a_pwrtrk_type2_5gd_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 11, 12, 12,
+ 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
+ {0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 10, 10,
+ 11, 11, 12, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16},
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12,
+ 12, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+};
+
+static const u8
+rtw8814a_pwrtrk_type2_5gd_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22},
+ {0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22},
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 23},
+};
+
+static const u8
+rtw8814a_pwrtrk_type2_5gc_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 11, 12,
+ 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12,
+ 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11,
+ 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type2_5gc_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21},
+ {0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 20, 20, 21, 21, 21, 21, 21},
+ {0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21},
+};
+
+static const u8
+rtw8814a_pwrtrk_type2_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 11, 12, 13,
+ 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12,
+ 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11,
+ 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type2_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21},
+ {0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 20, 20, 20, 20, 20, 20, 20},
+ {0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21},
+};
+
+static const u8
+rtw8814a_pwrtrk_type2_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 11, 11,
+ 12, 13, 13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15},
+ {0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12,
+ 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+ {0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 11, 11, 11, 12,
+ 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13},
+};
+
+static const u8
+rtw8814a_pwrtrk_type2_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14,
+ 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 20},
+ {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14,
+ 15, 16, 16, 17, 18, 19, 20, 20, 20, 20, 20, 20, 20},
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15,
+ 15, 16, 17, 18, 19, 19, 20, 20, 20, 20, 20, 20, 20},
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2gd_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5,
+ 6, 6, 7, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2gd_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10,
+ 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2gc_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10,
+ 10, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2gc_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 8, 8, 9, 10, 10,
+ 11, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8,
+ 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10,
+ 10, 11, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 9,
+ 10, 11, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10,
+ 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2g_cck_d_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8,
+ 9, 9, 9, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2g_cck_d_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2g_cck_c_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 6, 6, 6, 7, 8, 9, 9, 10,
+ 10, 11, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2g_cck_c_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10,
+ 10, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10,
+ 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10,
+ 10, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 9, 9,
+ 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_type2_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10,
+ 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13
+};
+
+const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_type2_tbl = {
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type2_5gd_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type2_5gd_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type2_5gd_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type2_5gd_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type2_5gd_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type2_5gd_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type2_5gc_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type2_5gc_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type2_5gc_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type2_5gc_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type2_5gc_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type2_5gc_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type2_5gb_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type2_5gb_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type2_5gb_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type2_5gb_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type2_5gb_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type2_5gb_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type2_5ga_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type2_5ga_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type2_5ga_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type2_5ga_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type2_5ga_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type2_5ga_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_2gd_n = rtw8814a_pwrtrk_type2_2gd_n,
+ .pwrtrk_2gd_p = rtw8814a_pwrtrk_type2_2gd_p,
+ .pwrtrk_2gc_n = rtw8814a_pwrtrk_type2_2gc_n,
+ .pwrtrk_2gc_p = rtw8814a_pwrtrk_type2_2gc_p,
+ .pwrtrk_2gb_n = rtw8814a_pwrtrk_type2_2gb_n,
+ .pwrtrk_2gb_p = rtw8814a_pwrtrk_type2_2gb_p,
+ .pwrtrk_2ga_n = rtw8814a_pwrtrk_type2_2ga_n,
+ .pwrtrk_2ga_p = rtw8814a_pwrtrk_type2_2ga_p,
+ .pwrtrk_2g_cckd_n = rtw8814a_pwrtrk_type2_2g_cck_d_n,
+ .pwrtrk_2g_cckd_p = rtw8814a_pwrtrk_type2_2g_cck_d_p,
+ .pwrtrk_2g_cckc_n = rtw8814a_pwrtrk_type2_2g_cck_c_n,
+ .pwrtrk_2g_cckc_p = rtw8814a_pwrtrk_type2_2g_cck_c_p,
+ .pwrtrk_2g_cckb_n = rtw8814a_pwrtrk_type2_2g_cck_b_n,
+ .pwrtrk_2g_cckb_p = rtw8814a_pwrtrk_type2_2g_cck_b_p,
+ .pwrtrk_2g_ccka_n = rtw8814a_pwrtrk_type2_2g_cck_a_n,
+ .pwrtrk_2g_ccka_p = rtw8814a_pwrtrk_type2_2g_cck_a_p,
+};
+
+static const u8
+rtw8814a_pwrtrk_type5_5gd_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 3, 3, 3, 4, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 13, 14,
+ 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 4, 5, 6, 7, 7, 8, 7, 8, 10, 11, 12, 12, 13, 13, 14, 14,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 5, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 13, 14, 15, 15, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16},
+};
+
+static const u8
+rtw8814a_pwrtrk_type5_5gd_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9, 10, 10, 11, 12,
+ 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13},
+ {0, 0, 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 11, 12,
+ 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14},
+ {0, 0, 0, 1, 1, 2, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 13,
+ 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type5_5gc_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 1, 2, 3, 3, 4, 6, 7, 7, 8, 9, 9, 9, 10, 10, 10,
+ 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12},
+ {0, 1, 2, 3, 3, 7, 7, 8, 8, 9, 11, 12, 12, 13, 14, 14, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 0, 1, 2, 3, 4, 5, 7, 8, 8, 10, 11, 12, 12, 13, 13, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type5_5gc_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9, 11, 11,
+ 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13},
+ {0, 0, 1, 2, 3, 3, 5, 5, 6, 8, 8, 9, 10, 11, 13, 13, 13,
+ 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+ {0, 0, 1, 2, 3, 4, 4, 5, 7, 8, 9, 9, 10, 11, 12, 12, 12,
+ 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type5_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 1, 2, 2, 2, 3, 4, 5, 6, 7, 9, 10, 10, 10, 10, 10,
+ 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12},
+ {0, 1, 2, 3, 3, 7, 7, 8, 8, 9, 11, 12, 12, 13, 14, 14, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 0, 1, 2, 3, 4, 5, 7, 8, 8, 10, 11, 12, 12, 13, 13, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type5_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 1, 1, 2, 2, 4, 5, 6, 6, 7, 8, 9, 10, 11, 11, 11,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 0, 2, 3, 4, 5, 6, 8, 8, 9, 9, 11, 12, 13, 13, 13,
+ 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+ {0, 0, 0, 1, 2, 3, 3, 4, 6, 7, 8, 9, 10, 11, 12, 12, 12,
+ 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type5_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 0, 1, 2, 3, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12},
+ {0, 2, 3, 4, 5, 7, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 17,
+ 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18},
+ {0, 1, 2, 3, 3, 4, 6, 7, 8, 8, 10, 11, 11, 12, 13, 13, 13,
+ 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type5_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 1, 3, 3, 3, 5, 5, 6, 6, 8, 8, 9, 10, 11, 11, 11,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 11, 12, 13, 14, 15,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 0, 1, 3, 3, 4, 5, 5, 6, 7, 7, 8, 10, 10, 11, 11, 11,
+ 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13},
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2gd_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 9, 9, 9,
+ 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2gd_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2gc_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 10,
+ 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2gc_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 8, 9, 9, 9,
+ 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 10, 10, 10,
+ 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 9, 9, 9, 9,
+ 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 10,
+ 10, 11, 11, 11, 11, 111, 12, 12, 12, 12, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9,
+ 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2g_cck_d_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9,
+ 10, 10, 10, 10, 10, 11, 11, 10, 11, 11, 11, 11
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2g_cck_d_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8,
+ 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2g_cck_c_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 8, 8, 9, 10, 10, 10,
+ 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2g_cck_c_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8,
+ 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 2, 3, 4, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 10,
+ 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8,
+ 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10
+};
+
+static const u8 rtw8814a_pwrtrk_type5_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9,
+ 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
+};
+
+const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_type5_tbl = {
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type5_5gd_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type5_5gd_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type5_5gd_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type5_5gd_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type5_5gd_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type5_5gd_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type5_5gc_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type5_5gc_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type5_5gc_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type5_5gc_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type5_5gc_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type5_5gc_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type5_5gb_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type5_5gb_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type5_5gb_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type5_5gb_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type5_5gb_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type5_5gb_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type5_5ga_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type5_5ga_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type5_5ga_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type5_5ga_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type5_5ga_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type5_5ga_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_2gd_n = rtw8814a_pwrtrk_type5_2gd_n,
+ .pwrtrk_2gd_p = rtw8814a_pwrtrk_type5_2gd_p,
+ .pwrtrk_2gc_n = rtw8814a_pwrtrk_type5_2gc_n,
+ .pwrtrk_2gc_p = rtw8814a_pwrtrk_type5_2gc_p,
+ .pwrtrk_2gb_n = rtw8814a_pwrtrk_type5_2gb_n,
+ .pwrtrk_2gb_p = rtw8814a_pwrtrk_type5_2gb_p,
+ .pwrtrk_2ga_n = rtw8814a_pwrtrk_type5_2ga_n,
+ .pwrtrk_2ga_p = rtw8814a_pwrtrk_type5_2ga_p,
+ .pwrtrk_2g_cckd_n = rtw8814a_pwrtrk_type5_2g_cck_d_n,
+ .pwrtrk_2g_cckd_p = rtw8814a_pwrtrk_type5_2g_cck_d_p,
+ .pwrtrk_2g_cckc_n = rtw8814a_pwrtrk_type5_2g_cck_c_n,
+ .pwrtrk_2g_cckc_p = rtw8814a_pwrtrk_type5_2g_cck_c_p,
+ .pwrtrk_2g_cckb_n = rtw8814a_pwrtrk_type5_2g_cck_b_n,
+ .pwrtrk_2g_cckb_p = rtw8814a_pwrtrk_type5_2g_cck_b_p,
+ .pwrtrk_2g_ccka_n = rtw8814a_pwrtrk_type5_2g_cck_a_n,
+ .pwrtrk_2g_ccka_p = rtw8814a_pwrtrk_type5_2g_cck_a_p,
+};
+
+static const u8
+rtw8814a_pwrtrk_type7_5gd_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+};
+
+static const u8
+rtw8814a_pwrtrk_type7_5gd_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+};
+
+static const u8
+rtw8814a_pwrtrk_type7_5gc_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+};
+
+static const u8
+rtw8814a_pwrtrk_type7_5gc_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+};
+
+static const u8
+rtw8814a_pwrtrk_type7_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+};
+
+static const u8
+rtw8814a_pwrtrk_type7_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+};
+
+static const u8
+rtw8814a_pwrtrk_type7_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+ {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
+};
+
+static const u8
+rtw8814a_pwrtrk_type7_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2gd_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2gd_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2gc_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2gc_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2g_cck_d_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2g_cck_d_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2g_cck_c_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2g_cck_c_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7,
+ 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+static const u8 rtw8814a_pwrtrk_type7_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
+ 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
+};
+
+const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_type7_tbl = {
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type7_5gd_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type7_5gd_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type7_5gd_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type7_5gd_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type7_5gd_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type7_5gd_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type7_5gc_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type7_5gc_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type7_5gc_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type7_5gc_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type7_5gc_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type7_5gc_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type7_5gb_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type7_5gb_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type7_5gb_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type7_5gb_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type7_5gb_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type7_5gb_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type7_5ga_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type7_5ga_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type7_5ga_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type7_5ga_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type7_5ga_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type7_5ga_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_2gd_n = rtw8814a_pwrtrk_type7_2gd_n,
+ .pwrtrk_2gd_p = rtw8814a_pwrtrk_type7_2gd_p,
+ .pwrtrk_2gc_n = rtw8814a_pwrtrk_type7_2gc_n,
+ .pwrtrk_2gc_p = rtw8814a_pwrtrk_type7_2gc_p,
+ .pwrtrk_2gb_n = rtw8814a_pwrtrk_type7_2gb_n,
+ .pwrtrk_2gb_p = rtw8814a_pwrtrk_type7_2gb_p,
+ .pwrtrk_2ga_n = rtw8814a_pwrtrk_type7_2ga_n,
+ .pwrtrk_2ga_p = rtw8814a_pwrtrk_type7_2ga_p,
+ .pwrtrk_2g_cckd_n = rtw8814a_pwrtrk_type7_2g_cck_d_n,
+ .pwrtrk_2g_cckd_p = rtw8814a_pwrtrk_type7_2g_cck_d_p,
+ .pwrtrk_2g_cckc_n = rtw8814a_pwrtrk_type7_2g_cck_c_n,
+ .pwrtrk_2g_cckc_p = rtw8814a_pwrtrk_type7_2g_cck_c_p,
+ .pwrtrk_2g_cckb_n = rtw8814a_pwrtrk_type7_2g_cck_b_n,
+ .pwrtrk_2g_cckb_p = rtw8814a_pwrtrk_type7_2g_cck_b_p,
+ .pwrtrk_2g_ccka_n = rtw8814a_pwrtrk_type7_2g_cck_a_n,
+ .pwrtrk_2g_ccka_p = rtw8814a_pwrtrk_type7_2g_cck_a_p,
+};
+
+static const u8
+rtw8814a_pwrtrk_type8_5gd_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 4, 4, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13},
+ {0, 1, 2, 3, 4, 4, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12,
+ 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13},
+ {0, 1, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9, 10, 10,
+ 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11},
+};
+
+static const u8
+rtw8814a_pwrtrk_type8_5gd_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 14,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 0, 1, 2, 3, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+ {0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type8_5gc_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 4, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 12,
+ 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13},
+ {0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 9, 10, 10, 10, 11, 11,
+ 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13},
+ {0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11,
+ 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+};
+
+static const u8
+rtw8814a_pwrtrk_type8_5gc_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 4, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+ {0, 0, 1, 3, 4, 4, 5, 6, 7, 7, 8, 10, 11, 12, 13, 14,
+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
+ {0, 0, 1, 2, 4, 5, 5, 6, 6, 7, 7, 9, 10, 11, 12, 13, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type8_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 9, 10, 10, 10, 11, 11,
+ 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13},
+ {0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11,
+ 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+};
+
+static const u8
+rtw8814a_pwrtrk_type8_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+ {0, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 10, 11, 11, 13, 13,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+ {0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 10, 10, 11, 13, 13,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8
+rtw8814a_pwrtrk_type8_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11,
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12},
+ {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10, 10, 11, 11,
+ 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13},
+ {0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 10, 10, 11, 12,
+ 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13},
+};
+
+static const u8
+rtw8814a_pwrtrk_type8_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
+ {0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 9, 10, 11, 12, 13, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+ {0, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+ {0, 0, 1, 2, 3, 3, 4, 4, 6, 7, 7, 9, 10, 11, 12, 13, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14},
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2gd_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5,
+ 6, 6, 7, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2gd_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10,
+ 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2gc_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10,
+ 10, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2gc_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 8, 8, 9, 10, 10,
+ 11, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8,
+ 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10,
+ 10, 11, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 9,
+ 10, 11, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10,
+ 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2g_cck_d_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8,
+ 9, 9, 9, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2g_cck_d_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10,
+ 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2g_cck_c_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 6, 6, 6, 7, 8, 9, 9, 10,
+ 10, 11, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2g_cck_c_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10,
+ 10, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10,
+ 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10,
+ 10, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 9, 9,
+ 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12
+};
+
+static const u8 rtw8814a_pwrtrk_type8_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
+ 0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10,
+ 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13
+};
+
+const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_type8_tbl = {
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type8_5gd_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type8_5gd_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type8_5gd_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type8_5gd_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type8_5gd_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gd_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type8_5gd_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type8_5gc_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type8_5gc_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type8_5gc_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type8_5gc_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type8_5gc_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gc_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type8_5gc_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type8_5gb_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type8_5gb_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type8_5gb_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type8_5gb_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type8_5gb_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type8_5gb_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type8_5ga_n[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type8_5ga_n[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type8_5ga_n[RTW_PWR_TRK_5G_3],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8814a_pwrtrk_type8_5ga_p[RTW_PWR_TRK_5G_1],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8814a_pwrtrk_type8_5ga_p[RTW_PWR_TRK_5G_2],
+ .pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8814a_pwrtrk_type8_5ga_p[RTW_PWR_TRK_5G_3],
+ .pwrtrk_2gd_n = rtw8814a_pwrtrk_type8_2gd_n,
+ .pwrtrk_2gd_p = rtw8814a_pwrtrk_type8_2gd_p,
+ .pwrtrk_2gc_n = rtw8814a_pwrtrk_type8_2gc_n,
+ .pwrtrk_2gc_p = rtw8814a_pwrtrk_type8_2gc_p,
+ .pwrtrk_2gb_n = rtw8814a_pwrtrk_type8_2gb_n,
+ .pwrtrk_2gb_p = rtw8814a_pwrtrk_type8_2gb_p,
+ .pwrtrk_2ga_n = rtw8814a_pwrtrk_type8_2ga_n,
+ .pwrtrk_2ga_p = rtw8814a_pwrtrk_type8_2ga_p,
+ .pwrtrk_2g_cckd_n = rtw8814a_pwrtrk_type8_2g_cck_d_n,
+ .pwrtrk_2g_cckd_p = rtw8814a_pwrtrk_type8_2g_cck_d_p,
+ .pwrtrk_2g_cckc_n = rtw8814a_pwrtrk_type8_2g_cck_c_n,
+ .pwrtrk_2g_cckc_p = rtw8814a_pwrtrk_type8_2g_cck_c_p,
+ .pwrtrk_2g_cckb_n = rtw8814a_pwrtrk_type8_2g_cck_b_n,
+ .pwrtrk_2g_cckb_p = rtw8814a_pwrtrk_type8_2g_cck_b_p,
+ .pwrtrk_2g_ccka_n = rtw8814a_pwrtrk_type8_2g_cck_a_n,
+ .pwrtrk_2g_ccka_p = rtw8814a_pwrtrk_type8_2g_cck_a_p,
+};
+
+static const struct rtw_pwr_seq_cmd init_power_on_8814a[] = {
+ {0x10c2,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_USB_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
+ {0xFFFF,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ 0,
+ RTW_PWR_CMD_END, 0, 0},
+};
+
+static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8814a[] = {
+ {0x0012,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
+ {0x0015,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(5), 0},
+ {0x0015,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(6), 0},
+ {0x0023,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(4), 0},
+ {0x0046,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0x00},
+ {0x0062,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0x00},
+ {0x0005,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_PCI_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(2), 0},
+ {0x0005,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(3), 0},
+ {0x0301,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_PCI_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0},
+ {0x0071,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_PCI_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(2), 0},
+ {0xFFFF,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ 0,
+ RTW_PWR_CMD_END, 0, 0},
+};
+
+static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8814a[] = {
+ {0x0005,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(2), 0},
+ {0x0006,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
+ {0x0005,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(3), 0},
+ {0x00F0,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(7), 0},
+ {0x0081,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0x30, 0x20},
+ {0x0005,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
+ {0x0005,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_POLLING, BIT(0), 0},
+ {0xFFFF,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ 0,
+ RTW_PWR_CMD_END, 0, 0},
+};
+
+static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8814a[] = {
+ {0x0c00,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0x04},
+ {0x0e00,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0x04},
+ {0x1002,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(0), 0},
+ {0x0002,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_US},
+ {0x1002,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_PCI_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(1), 0},
+ {0x001F,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0},
+ {0x0007,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0x28},
+ {0x0008,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_USB_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0x02, 0},
+ {0x0066,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_USB_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(7), 0},
+ {0x0041,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_USB_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(4), 0},
+ {0x0042,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_USB_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(1), 0},
+ {0x004e,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_USB_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
+ {0x0041,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_USB_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(0), 0},
+ {0x0005,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
+ {0x0005,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_POLLING, BIT(1), 0},
+ {0xFFFF,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ 0,
+ RTW_PWR_CMD_END, 0, 0},
+};
+
+static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8814a[] = {
+ {0x0003,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(2), 0},
+ {0x0080,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0x01},
+ {0x0081,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0x30},
+ {0x0045,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0x00},
+ {0x0046,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0xff},
+ {0x0047,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0},
+ {0x0015,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
+ {0x0015,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
+ {0x0012,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(6), 0},
+ {0x0023,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
+ {0x0008,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(1), 0},
+ {0x0007,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xFF, 0x20},
+ {0x001f,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(1), 0},
+ {0x0020,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(1), 0},
+ {0x0021,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(1), 0},
+ {0x0076,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(1), 0},
+ {0x0091,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, 0xA0, 0xA0},
+ {0x0070,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
+ {0x0005,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ RTW_PWR_ADDR_MAC,
+ RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
+ {0xFFFF,
+ RTW_PWR_CUT_ALL_MSK,
+ RTW_PWR_INTF_ALL_MSK,
+ 0,
+ RTW_PWR_CMD_END, 0, 0},
+};
+
+const struct rtw_pwr_seq_cmd * const card_enable_flow_8814a[] = {
+ init_power_on_8814a,
+ trans_carddis_to_cardemu_8814a,
+ trans_cardemu_to_act_8814a,
+ NULL
+};
+
+const struct rtw_pwr_seq_cmd * const card_disable_flow_8814a[] = {
+ trans_act_to_cardemu_8814a,
+ trans_cardemu_to_carddis_8814a,
+ NULL
+};
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8814a_table.h b/drivers/net/wireless/realtek/rtw88/rtw8814a_table.h
new file mode 100644
index 000000000000..69fb87e36c48
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/rtw8814a_table.h
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/* Copyright(c) 2025 Realtek Corporation
+ */
+
+#ifndef __RTW8814A_TABLE_H__
+#define __RTW8814A_TABLE_H__
+
+extern const struct rtw_table rtw8814a_mac_tbl;
+extern const struct rtw_table rtw8814a_agc_tbl;
+extern const struct rtw_table rtw8814a_bb_tbl;
+extern const struct rtw_table rtw8814a_bb_pg_tbl;
+extern const struct rtw_table rtw8814a_bb_pg_type0_tbl;
+extern const struct rtw_table rtw8814a_bb_pg_type2_tbl;
+extern const struct rtw_table rtw8814a_bb_pg_type3_tbl;
+extern const struct rtw_table rtw8814a_bb_pg_type4_tbl;
+extern const struct rtw_table rtw8814a_bb_pg_type5_tbl;
+extern const struct rtw_table rtw8814a_bb_pg_type7_tbl;
+extern const struct rtw_table rtw8814a_bb_pg_type8_tbl;
+extern const struct rtw_table rtw8814a_rf_a_tbl;
+extern const struct rtw_table rtw8814a_rf_b_tbl;
+extern const struct rtw_table rtw8814a_rf_c_tbl;
+extern const struct rtw_table rtw8814a_rf_d_tbl;
+extern const struct rtw_table rtw8814a_txpwr_lmt_tbl;
+extern const struct rtw_table rtw8814a_txpwr_lmt_type0_tbl;
+extern const struct rtw_table rtw8814a_txpwr_lmt_type1_tbl;
+extern const struct rtw_table rtw8814a_txpwr_lmt_type2_tbl;
+extern const struct rtw_table rtw8814a_txpwr_lmt_type3_tbl;
+extern const struct rtw_table rtw8814a_txpwr_lmt_type5_tbl;
+extern const struct rtw_table rtw8814a_txpwr_lmt_type7_tbl;
+extern const struct rtw_table rtw8814a_txpwr_lmt_type8_tbl;
+extern const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_tbl;
+extern const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_type0_tbl;
+extern const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_type2_tbl;
+extern const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_type5_tbl;
+extern const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_type7_tbl;
+extern const struct rtw_pwr_track_tbl rtw8814a_rtw_pwrtrk_type8_tbl;
+extern const struct rtw_pwr_seq_cmd * const card_disable_flow_8814a[];
+extern const struct rtw_pwr_seq_cmd * const card_enable_flow_8814a[];
+
+#endif
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8814ae.c b/drivers/net/wireless/realtek/rtw88/rtw8814ae.c
new file mode 100644
index 000000000000..54d2e20a7764
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/rtw8814ae.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2025 Realtek Corporation
+ */
+
+#include <linux/module.h>
+#include <linux/pci.h>
+#include "pci.h"
+#include "rtw8814a.h"
+
+static const struct pci_device_id rtw_8814ae_id_table[] = {
+ {
+ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8813),
+ .driver_data = (kernel_ulong_t)&rtw8814a_hw_spec
+ },
+ {}
+};
+MODULE_DEVICE_TABLE(pci, rtw_8814ae_id_table);
+
+static struct pci_driver rtw_8814ae_driver = {
+ .name = "rtw_8814ae",
+ .id_table = rtw_8814ae_id_table,
+ .probe = rtw_pci_probe,
+ .remove = rtw_pci_remove,
+ .driver.pm = &rtw_pm_ops,
+ .shutdown = rtw_pci_shutdown,
+};
+module_pci_driver(rtw_8814ae_driver);
+
+MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>");
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8814ae driver");
+MODULE_LICENSE("Dual BSD/GPL");
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8814au.c b/drivers/net/wireless/realtek/rtw88/rtw8814au.c
new file mode 100644
index 000000000000..afe045fb84de
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw88/rtw8814au.c
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2025 Realtek Corporation
+ */
+
+#include <linux/module.h>
+#include <linux/usb.h>
+#include "main.h"
+#include "rtw8814a.h"
+#include "usb.h"
+
+static const struct usb_device_id rtw_8814au_id_table[] = {
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8813, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x400b, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x400d, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9054, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x1817, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x1852, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x1853, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0026, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331a, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x809a, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x809b, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0106, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa834, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa833, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8814a_hw_spec) },
+ {},
+};
+MODULE_DEVICE_TABLE(usb, rtw_8814au_id_table);
+
+static struct usb_driver rtw_8814au_driver = {
+ .name = "rtw_8814au",
+ .id_table = rtw_8814au_id_table,
+ .probe = rtw_usb_probe,
+ .disconnect = rtw_usb_disconnect,
+};
+module_usb_driver(rtw_8814au_driver);
+
+MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>");
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8814au driver");
+MODULE_LICENSE("Dual BSD/GPL");
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
index eb7e34c545d0..0ade7f11cbd2 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
@@ -680,11 +680,11 @@ static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
}
static void
-rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
+rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path,
+ u8 rs, u32 *phy_pwr_idx)
{
struct rtw_hal *hal = &rtwdev->hal;
static const u32 offset_txagc[2] = {0x1d00, 0x1d80};
- static u32 phy_pwr_idx;
u8 rate, rate_idx, pwr_index, shift;
int j;
@@ -692,12 +692,12 @@ rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
rate = rtw_rate_section[rs][j];
pwr_index = hal->tx_pwr_tbl[path][rate];
shift = rate & 0x3;
- phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
+ *phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
if (shift == 0x3 || rate == DESC_RATEVHT1SS_MCS9) {
rate_idx = rate & 0xfc;
rtw_write32(rtwdev, offset_txagc[path] + rate_idx,
- phy_pwr_idx);
- phy_pwr_idx = 0;
+ *phy_pwr_idx);
+ *phy_pwr_idx = 0;
}
}
}
@@ -705,14 +705,16 @@ rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
static void rtw8821c_set_tx_power_index(struct rtw_dev *rtwdev)
{
struct rtw_hal *hal = &rtwdev->hal;
+ u32 phy_pwr_idx = 0;
int rs, path;
for (path = 0; path < hal->rf_path_num; path++) {
- for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) {
+ for (rs = 0; rs <= __RTW_RATE_SECTION_2SS_MAX; rs++) {
if (rs == RTW_RATE_SECTION_HT_2S ||
rs == RTW_RATE_SECTION_VHT_2S)
continue;
- rtw8821c_set_tx_power_index_by_rate(rtwdev, path, rs);
+ rtw8821c_set_tx_power_index_by_rate(rtwdev, path, rs,
+ &phy_pwr_idx);
}
}
}
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
index 7f03903ddf4b..b4934da88e33 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
@@ -935,11 +935,11 @@ static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
}
static void
-rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
+rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path,
+ u8 rs, u32 *phy_pwr_idx)
{
struct rtw_hal *hal = &rtwdev->hal;
static const u32 offset_txagc[2] = {0x1d00, 0x1d80};
- static u32 phy_pwr_idx;
u8 rate, rate_idx, pwr_index, shift;
int j;
@@ -947,12 +947,12 @@ rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
rate = rtw_rate_section[rs][j];
pwr_index = hal->tx_pwr_tbl[path][rate];
shift = rate & 0x3;
- phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
+ *phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
if (shift == 0x3) {
rate_idx = rate & 0xfc;
rtw_write32(rtwdev, offset_txagc[path] + rate_idx,
- phy_pwr_idx);
- phy_pwr_idx = 0;
+ *phy_pwr_idx);
+ *phy_pwr_idx = 0;
}
}
}
@@ -960,11 +960,13 @@ rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
static void rtw8822b_set_tx_power_index(struct rtw_dev *rtwdev)
{
struct rtw_hal *hal = &rtwdev->hal;
+ u32 phy_pwr_idx = 0;
int rs, path;
for (path = 0; path < hal->rf_path_num; path++) {
- for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++)
- rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs);
+ for (rs = 0; rs <= __RTW_RATE_SECTION_2SS_MAX; rs++)
+ rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs,
+ &phy_pwr_idx);
}
}
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822bu.c b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c
index 8883300fc6ad..572d1f31832e 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822bu.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c
@@ -73,6 +73,10 @@ static const struct usb_device_id rtw_8822bu_id_table[] = {
.driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* ELECOM WDB-867DU3S */
{ USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0107, 0xff, 0xff, 0xff),
.driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Mercusys MA30H */
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x010a, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* Mercusys MA30N */
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3322, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&(rtw8822b_hw_spec) }, /* D-Link DWA-T185 rev. A1 */
{},
};
MODULE_DEVICE_TABLE(usb, rtw_8822bu_id_table);
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
index ec362a817f5f..5e53e0db177e 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
@@ -2746,7 +2746,7 @@ static void rtw8822c_set_tx_power_index(struct rtw_dev *rtwdev)
s8 diff_idx[4];
rtw8822c_set_write_tx_power_ref(rtwdev, pwr_ref_cck, pwr_ref_ofdm);
- for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) {
+ for (rs = 0; rs <= __RTW_RATE_SECTION_2SS_MAX; rs++) {
for (j = 0; j < rtw_rate_size[rs]; j++) {
rate = rtw_rate_section[rs][j];
pwr_a = hal->tx_pwr_tbl[RF_PATH_A][rate];
diff --git a/drivers/net/wireless/realtek/rtw88/rtw88xxa.c b/drivers/net/wireless/realtek/rtw88/rtw88xxa.c
index 71e61b9c0bec..0fa943271fb6 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw88xxa.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw88xxa.c
@@ -1637,7 +1637,7 @@ void rtw88xxa_set_tx_power_index(struct rtw_dev *rtwdev)
int rs, path;
for (path = 0; path < hal->rf_path_num; path++) {
- for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) {
+ for (rs = 0; rs <= __RTW_RATE_SECTION_2SS_MAX; rs++) {
if (hal->rf_path_num == 1 &&
(rs == RTW_RATE_SECTION_HT_2S ||
rs == RTW_RATE_SECTION_VHT_2S))
diff --git a/drivers/net/wireless/realtek/rtw88/rx.c b/drivers/net/wireless/realtek/rtw88/rx.c
index 90fc8a5fa89e..8b0afaaffaa0 100644
--- a/drivers/net/wireless/realtek/rtw88/rx.c
+++ b/drivers/net/wireless/realtek/rtw88/rx.c
@@ -73,6 +73,12 @@ static void rtw_rx_phy_stat(struct rtw_dev *rtwdev,
rate_ss_evm = 2;
evm_id = RTW_EVM_2SS_A;
break;
+ case DESC_RATEMCS16...DESC_RATEMCS23:
+ case DESC_RATEVHT3SS_MCS0...DESC_RATEVHT3SS_MCS9:
+ rate_ss = 3;
+ rate_ss_evm = 3;
+ evm_id = RTW_EVM_3SS_A;
+ break;
default:
rtw_warn(rtwdev, "unknown pkt rate = %d\n", pkt_stat->rate);
return;
diff --git a/drivers/net/wireless/realtek/rtw88/sar.c b/drivers/net/wireless/realtek/rtw88/sar.c
index c472f1502b82..50b9c2412bb1 100644
--- a/drivers/net/wireless/realtek/rtw88/sar.c
+++ b/drivers/net/wireless/realtek/rtw88/sar.c
@@ -97,7 +97,7 @@ int rtw_set_sar_specs(struct rtw_dev *rtwdev,
power, BIT(RTW_COMMON_SAR_FCT));
for (j = 0; j < RTW_RF_PATH_MAX; j++) {
- for (k = 0; k < RTW_RATE_SECTION_MAX; k++) {
+ for (k = 0; k < RTW_RATE_SECTION_NUM; k++) {
arg = (struct rtw_sar_arg){
.sar_band = idx,
.path = j,
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
index e024061bdbf7..6209a49312f1 100644
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
@@ -1147,7 +1147,7 @@ static void rtw_sdio_declaim(struct rtw_dev *rtwdev,
sdio_release_host(sdio_func);
}
-static struct rtw_hci_ops rtw_sdio_ops = {
+static const struct rtw_hci_ops rtw_sdio_ops = {
.tx_write = rtw_sdio_tx_write,
.tx_kick_off = rtw_sdio_tx_kick_off,
.setup = rtw_sdio_setup,
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
index c4908db4ff0e..c8092fa0d9f1 100644
--- a/drivers/net/wireless/realtek/rtw88/usb.c
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
@@ -881,7 +881,7 @@ static void rtw_usb_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
}
}
-static struct rtw_hci_ops rtw_usb_ops = {
+static const struct rtw_hci_ops rtw_usb_ops = {
.tx_write = rtw_usb_tx_write,
.tx_kick_off = rtw_usb_tx_kick_off,
.setup = rtw_usb_setup,
diff --git a/drivers/net/wireless/realtek/rtw88/util.c b/drivers/net/wireless/realtek/rtw88/util.c
index e222d3c01a77..66819f694405 100644
--- a/drivers/net/wireless/realtek/rtw88/util.c
+++ b/drivers/net/wireless/realtek/rtw88/util.c
@@ -101,7 +101,8 @@ void rtw_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss)
*nss = 4;
*mcs = rate - DESC_RATEVHT4SS_MCS0;
} else if (rate >= DESC_RATEMCS0 &&
- rate <= DESC_RATEMCS15) {
+ rate <= DESC_RATEMCS31) {
+ *nss = 0;
*mcs = rate - DESC_RATEMCS0;
}
}
diff --git a/drivers/net/wireless/realtek/rtw89/Kconfig b/drivers/net/wireless/realtek/rtw89/Kconfig
index b1c86cdd9c0e..205d7ecca7d7 100644
--- a/drivers/net/wireless/realtek/rtw89/Kconfig
+++ b/drivers/net/wireless/realtek/rtw89/Kconfig
@@ -123,7 +123,7 @@ config RTW89_DEBUGMSG
config RTW89_DEBUGFS
bool "Realtek rtw89 debugfs support"
- depends on RTW89_CORE
+ depends on RTW89_CORE && CFG80211_DEBUGFS
select RTW89_DEBUG
help
Enable debugfs support
diff --git a/drivers/net/wireless/realtek/rtw89/cam.c b/drivers/net/wireless/realtek/rtw89/cam.c
index 8fa1e6c1ce13..eca3d767ff60 100644
--- a/drivers/net/wireless/realtek/rtw89/cam.c
+++ b/drivers/net/wireless/realtek/rtw89/cam.c
@@ -476,6 +476,12 @@ int rtw89_cam_sec_key_add(struct rtw89_dev *rtwdev,
case WLAN_CIPHER_SUITE_WEP104:
hw_key_type = RTW89_SEC_KEY_TYPE_WEP104;
break;
+ case WLAN_CIPHER_SUITE_TKIP:
+ if (!chip->hw_tkip_crypto)
+ return -EOPNOTSUPP;
+ hw_key_type = RTW89_SEC_KEY_TYPE_TKIP;
+ key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
+ break;
case WLAN_CIPHER_SUITE_CCMP:
hw_key_type = RTW89_SEC_KEY_TYPE_CCMP128;
if (!chip->hw_mgmt_tx_encrypt)
diff --git a/drivers/net/wireless/realtek/rtw89/chan.c b/drivers/net/wireless/realtek/rtw89/chan.c
index 4df4e04c3e67..f60e93870b09 100644
--- a/drivers/net/wireless/realtek/rtw89/chan.c
+++ b/drivers/net/wireless/realtek/rtw89/chan.c
@@ -8,6 +8,7 @@
#include "fw.h"
#include "mac.h"
#include "ps.h"
+#include "sar.h"
#include "util.h"
static void rtw89_swap_chanctx(struct rtw89_dev *rtwdev,
@@ -155,7 +156,7 @@ int rtw89_iterate_entity_chan(struct rtw89_dev *rtwdev,
int ret;
u8 idx;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
for_each_set_bit(idx, hal->entity_map, NUM_OF_RTW89_CHANCTX) {
chan = rtw89_chan_get(rtwdev, idx);
@@ -310,7 +311,7 @@ const struct rtw89_chan *__rtw89_mgnt_chan_get(struct rtw89_dev *rtwdev,
enum rtw89_entity_mode mode;
u8 role_index;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
if (unlikely(link_index >= __RTW89_MLD_MAX_LINK_NUM)) {
WARN(1, "link index %u is invalid (max link inst num: %d)\n",
@@ -366,7 +367,7 @@ static void rtw89_entity_recalc_mgnt_roles(struct rtw89_dev *rtwdev)
u8 pos = 0;
int i, j;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
for (i = 0; i < RTW89_MAX_INTERFACE_NUM; i++)
mgnt->active_roles[i] = NULL;
@@ -427,7 +428,7 @@ enum rtw89_entity_mode rtw89_entity_recalc(struct rtw89_dev *rtwdev)
struct rtw89_chan chan;
u8 idx;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
bitmap_copy(recalc_map, hal->entity_map, NUM_OF_RTW89_CHANCTX);
@@ -2390,7 +2391,7 @@ static void rtw89_mcc_update_limit(struct rtw89_dev *rtwdev)
rtw89_iterate_mcc_roles(rtwdev, rtw89_mcc_upd_lmt_iterator, NULL);
}
-void rtw89_chanctx_work(struct work_struct *work)
+void rtw89_chanctx_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
chanctx_work.work);
@@ -2401,12 +2402,10 @@ void rtw89_chanctx_work(struct work_struct *work)
int ret;
int i;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
- if (hal->entity_pause) {
- mutex_unlock(&rtwdev->mutex);
+ if (hal->entity_pause)
return;
- }
for (i = 0; i < NUM_OF_RTW89_CHANCTX_CHANGES; i++) {
if (test_and_clear_bit(i, hal->changes))
@@ -2445,8 +2444,6 @@ void rtw89_chanctx_work(struct work_struct *work)
default:
break;
}
-
- mutex_unlock(&rtwdev->mutex);
}
void rtw89_queue_chanctx_change(struct rtw89_dev *rtwdev,
@@ -2477,8 +2474,8 @@ void rtw89_queue_chanctx_change(struct rtw89_dev *rtwdev,
rtw89_debug(rtwdev, RTW89_DBG_CHAN,
"queue chanctx work for mode %d with delay %d us\n",
mode, delay);
- ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->chanctx_work,
- usecs_to_jiffies(delay));
+ wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->chanctx_work,
+ usecs_to_jiffies(delay));
}
void rtw89_queue_chanctx_work(struct rtw89_dev *rtwdev)
@@ -2491,7 +2488,7 @@ void rtw89_chanctx_track(struct rtw89_dev *rtwdev)
struct rtw89_hal *hal = &rtwdev->hal;
enum rtw89_entity_mode mode;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
if (hal->entity_pause)
return;
@@ -2512,7 +2509,7 @@ void rtw89_chanctx_pause(struct rtw89_dev *rtwdev,
struct rtw89_hal *hal = &rtwdev->hal;
enum rtw89_entity_mode mode;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
if (hal->entity_pause)
return;
@@ -2555,7 +2552,7 @@ void rtw89_chanctx_proceed(struct rtw89_dev *rtwdev,
enum rtw89_entity_mode mode;
int ret;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
if (unlikely(!hal->entity_pause)) {
rtw89_chanctx_proceed_cb(rtwdev, cb_parm);
@@ -2677,6 +2674,7 @@ int rtw89_chanctx_ops_assign_vif(struct rtw89_dev *rtwdev,
struct rtw89_hal *hal = &rtwdev->hal;
struct rtw89_entity_mgnt *mgnt = &hal->entity_mgnt;
struct rtw89_entity_weight w = {};
+ int ret;
rtwvif_link->chanctx_idx = cfg->idx;
rtwvif_link->chanctx_assigned = true;
@@ -2696,7 +2694,13 @@ int rtw89_chanctx_ops_assign_vif(struct rtw89_dev *rtwdev,
rtw89_swap_chanctx(rtwdev, cfg->idx, RTW89_CHANCTX_0);
out:
- return rtw89_set_channel(rtwdev);
+ ret = rtw89_set_channel(rtwdev);
+ if (ret)
+ return ret;
+
+ rtw89_tas_reset(rtwdev, true);
+
+ return 0;
}
void rtw89_chanctx_ops_unassign_vif(struct rtw89_dev *rtwdev,
diff --git a/drivers/net/wireless/realtek/rtw89/chan.h b/drivers/net/wireless/realtek/rtw89/chan.h
index 092a6f676894..e6391f6f2aa7 100644
--- a/drivers/net/wireless/realtek/rtw89/chan.h
+++ b/drivers/net/wireless/realtek/rtw89/chan.h
@@ -99,7 +99,7 @@ void rtw89_config_roc_chandef(struct rtw89_dev *rtwdev,
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);
-void rtw89_chanctx_work(struct work_struct *work);
+void rtw89_chanctx_work(struct wiphy *wiphy, struct wiphy_work *work);
void rtw89_queue_chanctx_work(struct rtw89_dev *rtwdev);
void rtw89_queue_chanctx_change(struct rtw89_dev *rtwdev,
enum rtw89_chanctx_changes change);
diff --git a/drivers/net/wireless/realtek/rtw89/coex.c b/drivers/net/wireless/realtek/rtw89/coex.c
index 68316d44b204..5ccf0cbaed2f 100644
--- a/drivers/net/wireless/realtek/rtw89/coex.c
+++ b/drivers/net/wireless/realtek/rtw89/coex.c
@@ -10,7 +10,7 @@
#include "ps.h"
#include "reg.h"
-#define RTW89_COEX_VERSION 0x07000113
+#define RTW89_COEX_VERSION 0x07000413
#define FCXDEF_STEP 50 /* MUST <= FCXMAX_STEP and match with wl fw*/
#define BTC_E2G_LIMIT_DEF 80
@@ -89,10 +89,10 @@ static const struct rtw89_btc_fbtc_slot s_def[] = {
[CXST_B4] = __DEF_FBTC_SLOT(50, 0xe5555555, SLOT_MIX),
[CXST_LK] = __DEF_FBTC_SLOT(20, 0xea5a5a5a, SLOT_ISO),
[CXST_BLK] = __DEF_FBTC_SLOT(500, 0x55555555, SLOT_MIX),
- [CXST_E2G] = __DEF_FBTC_SLOT(0, 0xea5a5a5a, SLOT_MIX),
- [CXST_E5G] = __DEF_FBTC_SLOT(0, 0xffffffff, SLOT_ISO),
+ [CXST_E2G] = __DEF_FBTC_SLOT(5, 0xea5a5a5a, SLOT_MIX),
+ [CXST_E5G] = __DEF_FBTC_SLOT(5, 0xffffffff, SLOT_ISO),
[CXST_EBT] = __DEF_FBTC_SLOT(5, 0xe5555555, SLOT_MIX),
- [CXST_ENULL] = __DEF_FBTC_SLOT(0, 0xaaaaaaaa, SLOT_ISO),
+ [CXST_ENULL] = __DEF_FBTC_SLOT(5, 0xaaaaaaaa, SLOT_ISO),
[CXST_WLK] = __DEF_FBTC_SLOT(250, 0xea5a5a5a, SLOT_MIX),
[CXST_W1FDD] = __DEF_FBTC_SLOT(50, 0xffffffff, SLOT_ISO),
[CXST_B1FDD] = __DEF_FBTC_SLOT(50, 0xffffdfff, SLOT_ISO),
@@ -132,6 +132,14 @@ static const u32 cxtbl[] = {
static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = {
/* firmware version must be in decreasing order for each chip */
+ {RTL8852BT, RTW89_FW_VER_CODE(0, 29, 122, 0),
+ .fcxbtcrpt = 8, .fcxtdma = 7, .fcxslots = 7, .fcxcysta = 7,
+ .fcxstep = 7, .fcxnullsta = 7, .fcxmreg = 7, .fcxgpiodbg = 7,
+ .fcxbtver = 7, .fcxbtscan = 7, .fcxbtafh = 7, .fcxbtdevinfo = 7,
+ .fwlrole = 7, .frptmap = 3, .fcxctrl = 7, .fcxinit = 7,
+ .fwevntrptl = 1, .fwc2hfunc = 2, .drvinfo_type = 1, .info_buf = 1800,
+ .max_role_num = 6,
+ },
{RTL8852BT, RTW89_FW_VER_CODE(0, 29, 90, 0),
.fcxbtcrpt = 7, .fcxtdma = 7, .fcxslots = 7, .fcxcysta = 7,
.fcxstep = 7, .fcxnullsta = 7, .fcxmreg = 7, .fcxgpiodbg = 7,
@@ -1372,11 +1380,9 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
} else if (ver->fcxbtcrpt == 8) {
pfinfo = &pfwinfo->rpt_ctrl.finfo.v8;
pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v8);
- break;
} else if (ver->fcxbtcrpt == 7) {
pfinfo = &pfwinfo->rpt_ctrl.finfo.v7;
pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v7);
- break;
} else {
goto err;
}
@@ -1534,6 +1540,9 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
} else if (ver->fcxbtafh == 2) {
pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v2;
pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v2);
+ } else if (ver->fcxbtafh == 7) {
+ pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v7;
+ pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v7);
} else {
goto err;
}
@@ -1602,7 +1611,7 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
wl->ver_info.fw = le32_to_cpu(prpt->v4.wl_fw_info.fw_ver);
dm->wl_fw_cx_offload = !!le32_to_cpu(prpt->v4.wl_fw_info.cx_offload);
- for (i = RTW89_PHY_0; i < RTW89_PHY_MAX; i++)
+ for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++)
memcpy(&dm->gnt.band[i], &prpt->v4.gnt_val[i],
sizeof(dm->gnt.band[i]));
@@ -1634,7 +1643,7 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
wl->ver_info.fw = le32_to_cpu(prpt->v5.rpt_info.fw_ver);
dm->wl_fw_cx_offload = 0;
- for (i = RTW89_PHY_0; i < RTW89_PHY_MAX; i++)
+ for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++)
memcpy(&dm->gnt.band[i], &prpt->v5.gnt_val[i][0],
sizeof(dm->gnt.band[i]));
@@ -1661,7 +1670,7 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
wl->ver_info.fw = le32_to_cpu(prpt->v105.rpt_info.fw_ver);
dm->wl_fw_cx_offload = 0;
- for (i = RTW89_PHY_0; i < RTW89_PHY_MAX; i++)
+ for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++)
memcpy(&dm->gnt.band[i], &prpt->v105.gnt_val[i][0],
sizeof(dm->gnt.band[i]));
@@ -1687,7 +1696,7 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
wl->ver_info.fw_coex = le32_to_cpu(prpt->v7.rpt_info.cx_ver);
wl->ver_info.fw = le32_to_cpu(prpt->v7.rpt_info.fw_ver);
- for (i = RTW89_PHY_0; i < RTW89_PHY_MAX; i++)
+ for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++)
memcpy(&dm->gnt.band[i], &prpt->v7.gnt_val[i][0],
sizeof(dm->gnt.band[i]));
@@ -1719,7 +1728,7 @@ static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
wl->ver_info.fw_coex = le32_to_cpu(prpt->v8.rpt_info.cx_ver);
wl->ver_info.fw = le32_to_cpu(prpt->v8.rpt_info.fw_ver);
- for (i = RTW89_PHY_0; i < RTW89_PHY_MAX; i++)
+ for (i = RTW89_PHY_0; i < RTW89_PHY_NUM; i++)
memcpy(&dm->gnt.band[i], &prpt->v8.gnt_val[i][0],
sizeof(dm->gnt.band[i]));
@@ -2706,7 +2715,7 @@ static void _set_gnt(struct rtw89_dev *rtwdev, u8 phy_map, u8 wl_state, u8 bt_st
if (phy_map > BTC_PHY_ALL)
return;
- for (i = 0; i < RTW89_PHY_MAX; i++) {
+ for (i = 0; i < RTW89_PHY_NUM; i++) {
if (!(phy_map & BIT(i)))
continue;
@@ -2755,7 +2764,7 @@ static void _set_gnt_v1(struct rtw89_dev *rtwdev, u8 phy_map,
if (phy_map > BTC_PHY_ALL)
return;
- for (i = 0; i < RTW89_PHY_MAX; i++) {
+ for (i = 0; i < RTW89_PHY_NUM; i++) {
if (!(phy_map & BIT(i)))
continue;
@@ -2955,7 +2964,7 @@ static void _set_rf_trx_para(struct rtw89_dev *rtwdev)
if (ver->fwlrole == 0) {
link_mode = wl->role_info.link_mode;
- for (i = 0; i < RTW89_PHY_MAX; i++) {
+ for (i = 0; i < RTW89_PHY_NUM; i++) {
if (wl->dbcc_info.real_band[i] == RTW89_BAND_2G)
dbcc_2g_phy = i;
}
@@ -4240,7 +4249,7 @@ static void _set_ant_v0(struct rtw89_dev *rtwdev, bool force_exec,
case BTC_ANT_W2G:
rtw89_chip_cfg_ctrl_path(rtwdev, BTC_CTRL_BY_WL);
if (rtwdev->dbcc_en) {
- for (i = 0; i < RTW89_PHY_MAX; i++) {
+ for (i = 0; i < RTW89_PHY_NUM; i++) {
b2g = (wl_dinfo->real_band[i] == RTW89_BAND_2G);
gnt_wl_ctrl = b2g ? BTC_GNT_HW : BTC_GNT_SW_HI;
@@ -4583,23 +4592,16 @@ static void _action_bt_hid(struct rtw89_dev *rtwdev)
static void _action_bt_a2dp(struct rtw89_dev *rtwdev)
{
struct rtw89_btc *btc = &rtwdev->btc;
- struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info;
- struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc;
struct rtw89_btc_dm *dm = &btc->dm;
_set_ant(rtwdev, NM_EXEC, BTC_PHY_ALL, BTC_ANT_W2G);
+ dm->slot_dur[CXST_W1] = 20;
+ dm->slot_dur[CXST_B1] = BTC_B1_MAX;
+
switch (btc->cx.state_map) {
case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP */
- if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
- dm->slot_dur[CXST_W1] = 40;
- dm->slot_dur[CXST_B1] = 200;
- _set_policy(rtwdev,
- BTC_CXP_PAUTO_TDW1B1, BTC_ACT_BT_A2DP);
- } else {
- _set_policy(rtwdev,
- BTC_CXP_PAUTO_TD50B1, BTC_ACT_BT_A2DP);
- }
+ _set_policy(rtwdev, BTC_CXP_PAUTO_TDW1B1, BTC_ACT_BT_A2DP);
break;
case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP */
_set_policy(rtwdev, BTC_CXP_PAUTO2_TD3050, BTC_ACT_BT_A2DP);
@@ -4609,15 +4611,10 @@ static void _action_bt_a2dp(struct rtw89_dev *rtwdev)
break;
case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP */
case BTC_WLINKING: /* wl-connecting + bt-A2DP */
- if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
- dm->slot_dur[CXST_W1] = 40;
- dm->slot_dur[CXST_B1] = 200;
- _set_policy(rtwdev, BTC_CXP_AUTO_TDW1B1,
- BTC_ACT_BT_A2DP);
- } else {
- _set_policy(rtwdev, BTC_CXP_AUTO_TD50B1,
- BTC_ACT_BT_A2DP);
- }
+ if (btc->cx.wl.rfk_info.con_rfk)
+ _set_policy(rtwdev, BTC_CXP_OFF_BT, BTC_ACT_BT_A2DP);
+ else
+ _set_policy(rtwdev, BTC_CXP_AUTO_TDW1B1, BTC_ACT_BT_A2DP);
break;
case BTC_WIDLE: /* wl-idle + bt-A2DP */
_set_policy(rtwdev, BTC_CXP_AUTO_TD20B1, BTC_ACT_BT_A2DP);
@@ -4645,7 +4642,10 @@ static void _action_bt_a2dpsink(struct rtw89_dev *rtwdev)
_set_policy(rtwdev, BTC_CXP_FIX_TD2060, BTC_ACT_BT_A2DPSINK);
break;
case BTC_WLINKING: /* wl-connecting + bt-A2dp_Sink */
- _set_policy(rtwdev, BTC_CXP_FIX_TD3030, BTC_ACT_BT_A2DPSINK);
+ if (btc->cx.wl.rfk_info.con_rfk)
+ _set_policy(rtwdev, BTC_CXP_OFF_BT, BTC_ACT_BT_A2DPSINK);
+ else
+ _set_policy(rtwdev, BTC_CXP_FIX_TD3030, BTC_ACT_BT_A2DPSINK);
break;
case BTC_WIDLE: /* wl-idle + bt-A2dp_Sink */
_set_policy(rtwdev, BTC_CXP_FIX_TD2080, BTC_ACT_BT_A2DPSINK);
@@ -4693,27 +4693,20 @@ static void _action_bt_pan(struct rtw89_dev *rtwdev)
static void _action_bt_a2dp_hid(struct rtw89_dev *rtwdev)
{
struct rtw89_btc *btc = &rtwdev->btc;
- struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info;
- struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc;
struct rtw89_btc_dm *dm = &btc->dm;
_set_ant(rtwdev, NM_EXEC, BTC_PHY_ALL, BTC_ANT_W2G);
+ dm->slot_dur[CXST_W1] = 20;
+ dm->slot_dur[CXST_B1] = BTC_B1_MAX;
+
switch (btc->cx.state_map) {
case BTC_WBUSY_BNOSCAN: /* wl-busy + bt-A2DP+HID */
case BTC_WIDLE: /* wl-idle + bt-A2DP */
- if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
- dm->slot_dur[CXST_W1] = 40;
- dm->slot_dur[CXST_B1] = 200;
- _set_policy(rtwdev,
- BTC_CXP_PAUTO_TDW1B1, BTC_ACT_BT_A2DP_HID);
- } else {
- _set_policy(rtwdev,
- BTC_CXP_PAUTO_TD50B1, BTC_ACT_BT_A2DP_HID);
- }
+ _set_policy(rtwdev, BTC_CXP_PAUTO_TDW1B1, BTC_ACT_BT_A2DP_HID);
break;
case BTC_WBUSY_BSCAN: /* wl-busy + bt-inq + bt-A2DP+HID */
- _set_policy(rtwdev, BTC_CXP_PAUTO2_TD3050, BTC_ACT_BT_A2DP_HID);
+ _set_policy(rtwdev, BTC_CXP_PAUTO2_TD3070, BTC_ACT_BT_A2DP_HID);
break;
case BTC_WSCAN_BSCAN: /* wl-scan + bt-inq + bt-A2DP+HID */
@@ -4721,15 +4714,10 @@ static void _action_bt_a2dp_hid(struct rtw89_dev *rtwdev)
break;
case BTC_WSCAN_BNOSCAN: /* wl-scan + bt-A2DP+HID */
case BTC_WLINKING: /* wl-connecting + bt-A2DP+HID */
- if (a2dp.vendor_id == 0x4c || dm->leak_ap) {
- dm->slot_dur[CXST_W1] = 40;
- dm->slot_dur[CXST_B1] = 200;
- _set_policy(rtwdev, BTC_CXP_AUTO_TDW1B1,
- BTC_ACT_BT_A2DP_HID);
- } else {
- _set_policy(rtwdev, BTC_CXP_AUTO_TD50B1,
- BTC_ACT_BT_A2DP_HID);
- }
+ if (btc->cx.wl.rfk_info.con_rfk)
+ _set_policy(rtwdev, BTC_CXP_OFF_BT, BTC_ACT_BT_A2DP_HID);
+ else
+ _set_policy(rtwdev, BTC_CXP_AUTO_TDW1B1, BTC_ACT_BT_A2DP_HID);
break;
}
}
@@ -4905,9 +4893,9 @@ static void _set_btg_ctrl(struct rtw89_dev *rtwdev)
if (rtwdev->dbcc_en) {
if (ver->fwlrole == 0) {
- wl_rinfo.dbcc_2g_phy = RTW89_PHY_MAX;
+ wl_rinfo.dbcc_2g_phy = RTW89_PHY_NUM;
- for (i = 0; i < RTW89_PHY_MAX; i++) {
+ for (i = 0; i < RTW89_PHY_NUM; i++) {
if (wl_dinfo->real_band[i] == RTW89_BAND_2G)
wl_rinfo.dbcc_2g_phy = i;
}
@@ -5408,7 +5396,8 @@ static void _action_wl_scan(struct rtw89_dev *rtwdev)
struct rtw89_btc_wl_info *wl = &btc->cx.wl;
struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
- if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) {
+ if (btc->cx.state_map != BTC_WLINKING &&
+ RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw)) {
_action_wl_25g_mcc(rtwdev);
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], Scan offload!\n");
} else if (rtwdev->dbcc_en) {
@@ -5798,7 +5787,7 @@ static void _update_wl_info(struct rtw89_dev *rtwdev)
phy = wl_linfo[i].phy;
/* check dbcc role */
- if (rtwdev->dbcc_en && phy < RTW89_PHY_MAX) {
+ if (rtwdev->dbcc_en && phy < RTW89_PHY_NUM) {
wl_dinfo->role[phy] = wl_linfo[i].role;
wl_dinfo->op_band[phy] = wl_linfo[i].band;
_update_dbcc_band(rtwdev, phy);
@@ -5948,7 +5937,7 @@ static void _update_wl_info_v1(struct rtw89_dev *rtwdev)
phy = wl_linfo[i].phy;
- if (rtwdev->dbcc_en && phy < RTW89_PHY_MAX) {
+ if (rtwdev->dbcc_en && phy < RTW89_PHY_NUM) {
wl_dinfo->role[phy] = wl_linfo[i].role;
wl_dinfo->op_band[phy] = wl_linfo[i].band;
_update_dbcc_band(rtwdev, phy);
@@ -6098,7 +6087,7 @@ static void _update_wl_info_v2(struct rtw89_dev *rtwdev)
phy = wl_linfo[i].phy;
- if (rtwdev->dbcc_en && phy < RTW89_PHY_MAX) {
+ if (rtwdev->dbcc_en && phy < RTW89_PHY_NUM) {
wl_dinfo->role[phy] = wl_linfo[i].role;
wl_dinfo->op_band[phy] = wl_linfo[i].band;
_update_dbcc_band(rtwdev, phy);
@@ -6389,7 +6378,7 @@ static void _update_wl_info_v7(struct rtw89_dev *rtwdev, u8 rid)
struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
struct rtw89_btc_wl_link_info *wl_linfo = wl->link_info;
struct rtw89_btc_wl_active_role_v7 *act_role = NULL;
- u8 i, mode, cnt = 0, cnt_2g = 0, cnt_5g = 0, phy_now = RTW89_PHY_MAX, phy_dbcc;
+ u8 i, mode, cnt = 0, cnt_2g = 0, cnt_5g = 0, phy_now = RTW89_PHY_NUM, phy_dbcc;
bool b2g = false, b5g = false, client_joined = false, client_inc_2g = false;
u8 client_cnt_last[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER] = {};
u8 cid_role[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER] = {};
@@ -6400,7 +6389,7 @@ static void _update_wl_info_v7(struct rtw89_dev *rtwdev, u8 rid)
memset(wl_rinfo, 0, sizeof(*wl_rinfo));
for (i = 0; i < RTW89_PORT_NUM; i++) {
- if (!wl_linfo[i].active || wl_linfo[i].phy >= RTW89_PHY_MAX)
+ if (!wl_linfo[i].active || wl_linfo[i].phy >= RTW89_PHY_NUM)
continue;
act_role = &wl_rinfo->active_role[i];
@@ -6494,7 +6483,7 @@ static void _update_wl_info_v7(struct rtw89_dev *rtwdev, u8 rid)
mode = _chk_dbcc(rtwdev, cid_ch, cid_phy, cid_role, &dbcc_2g_phy);
/* correct 2G-located PHY band for gnt ctrl */
- if (dbcc_2g_phy < RTW89_PHY_MAX)
+ if (dbcc_2g_phy < RTW89_PHY_NUM)
wl_dinfo->op_band[dbcc_2g_phy] = RTW89_BAND_2G;
} else if (b2g && b5g && cnt == 2) {
mode = BTC_WLINK_25G_MCC;
@@ -6720,7 +6709,7 @@ static void _update_wl_info_v8(struct rtw89_dev *rtwdev, u8 role_id, u8 rlink_id
_fw_set_drv_info(rtwdev, CXDRVINFO_ROLE);
}
-void rtw89_coex_act1_work(struct work_struct *work)
+void rtw89_coex_act1_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
coex_act1_work.work);
@@ -6729,7 +6718,8 @@ void rtw89_coex_act1_work(struct work_struct *work)
struct rtw89_btc_cx *cx = &btc->cx;
struct rtw89_btc_wl_info *wl = &cx->wl;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
+
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], %s(): enter\n", __func__);
dm->cnt_notify[BTC_NCNT_TIMER]++;
if (wl->status.map._4way)
@@ -6738,10 +6728,9 @@ void rtw89_coex_act1_work(struct work_struct *work)
wl->status.map.connecting = false;
_run_coex(rtwdev, BTC_RSN_ACT1_WORK);
- mutex_unlock(&rtwdev->mutex);
}
-void rtw89_coex_bt_devinfo_work(struct work_struct *work)
+void rtw89_coex_bt_devinfo_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
coex_bt_devinfo_work.work);
@@ -6749,15 +6738,15 @@ void rtw89_coex_bt_devinfo_work(struct work_struct *work)
struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
+
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], %s(): enter\n", __func__);
dm->cnt_notify[BTC_NCNT_TIMER]++;
a2dp->play_latency = 0;
_run_coex(rtwdev, BTC_RSN_BT_DEVINFO_WORK);
- mutex_unlock(&rtwdev->mutex);
}
-void rtw89_coex_rfk_chk_work(struct work_struct *work)
+void rtw89_coex_rfk_chk_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
coex_rfk_chk_work.work);
@@ -6766,7 +6755,8 @@ void rtw89_coex_rfk_chk_work(struct work_struct *work)
struct rtw89_btc_cx *cx = &btc->cx;
struct rtw89_btc_wl_info *wl = &cx->wl;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
+
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC], %s(): enter\n", __func__);
dm->cnt_notify[BTC_NCNT_TIMER]++;
if (wl->rfk_info.state != BTC_WRFK_STOP) {
@@ -6778,7 +6768,6 @@ void rtw89_coex_rfk_chk_work(struct work_struct *work)
_write_scbd(rtwdev, BTC_WSCB_WLRFK, false);
_run_coex(rtwdev, BTC_RSN_RFK_CHK_WORK);
}
- mutex_unlock(&rtwdev->mutex);
}
static void _update_bt_scbd(struct rtw89_dev *rtwdev, bool only_update)
@@ -6882,7 +6871,7 @@ void _run_coex(struct rtw89_dev *rtwdev, enum btc_reason_and_action reason)
struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8;
u8 mode, igno_bt, always_freerun;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
dm->run_reason = reason;
_update_dm_step(rtwdev, reason);
@@ -7002,7 +6991,7 @@ void _run_coex(struct rtw89_dev *rtwdev, enum btc_reason_and_action reason)
goto exit;
}
- if (wl->status.val & btc_scanning_map.val) {
+ if (wl->status.val & btc_scanning_map.val && !wl->rfk_info.con_rfk) {
_action_wl_scan(rtwdev);
bt->scan_rx_low_pri = true;
goto exit;
@@ -7187,7 +7176,7 @@ void rtw89_btc_ntfy_scan_start(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band)
"[BTC], %s(): phy_idx=%d, band=%d\n",
__func__, phy_idx, band);
- if (phy_idx >= RTW89_PHY_MAX)
+ if (phy_idx >= RTW89_PHY_NUM)
return;
btc->dm.cnt_notify[BTC_NCNT_SCAN_START]++;
@@ -7223,6 +7212,8 @@ void rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx)
_fw_set_drv_info(rtwdev, CXDRVINFO_DBCC);
}
+ btc->dm.tdma_instant_excute = 1;
+
_run_coex(rtwdev, BTC_RSN_NTFY_SCAN_FINISH);
}
@@ -7235,7 +7226,7 @@ void rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band)
"[BTC], %s(): phy_idx=%d, band=%d\n",
__func__, phy_idx, band);
- if (phy_idx >= RTW89_PHY_MAX)
+ if (phy_idx >= RTW89_PHY_NUM)
return;
btc->dm.cnt_notify[BTC_NCNT_SWITCH_BAND]++;
@@ -7284,7 +7275,7 @@ void rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev,
"[BTC], %s(): EAPOL_End cnt=%d\n",
__func__, cnt);
wl->status.map._4way = false;
- cancel_delayed_work(&rtwdev->coex_act1_work);
+ wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_act1_work);
break;
case PACKET_ARP:
cnt = ++cx->cnt_wl[BTC_WCNT_ARP];
@@ -7303,56 +7294,56 @@ void rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev,
}
if (delay_work) {
- cancel_delayed_work(&rtwdev->coex_act1_work);
- ieee80211_queue_delayed_work(rtwdev->hw,
- &rtwdev->coex_act1_work, delay);
+ wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_act1_work);
+ wiphy_delayed_work_queue(rtwdev->hw->wiphy,
+ &rtwdev->coex_act1_work, delay);
}
btc->dm.cnt_notify[BTC_NCNT_SPECIAL_PACKET]++;
_run_coex(rtwdev, BTC_RSN_NTFY_SPECIFIC_PACKET);
}
-void rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work)
+void rtw89_btc_ntfy_eapol_packet_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
btc.eapol_notify_work);
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
+
rtw89_leave_ps_mode(rtwdev);
rtw89_btc_ntfy_specific_packet(rtwdev, PACKET_EAPOL);
- mutex_unlock(&rtwdev->mutex);
}
-void rtw89_btc_ntfy_arp_packet_work(struct work_struct *work)
+void rtw89_btc_ntfy_arp_packet_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
btc.arp_notify_work);
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
+
rtw89_btc_ntfy_specific_packet(rtwdev, PACKET_ARP);
- mutex_unlock(&rtwdev->mutex);
}
-void rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work)
+void rtw89_btc_ntfy_dhcp_packet_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
btc.dhcp_notify_work);
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
+
rtw89_leave_ps_mode(rtwdev);
rtw89_btc_ntfy_specific_packet(rtwdev, PACKET_DHCP);
- mutex_unlock(&rtwdev->mutex);
}
-void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work)
+void rtw89_btc_ntfy_icmp_packet_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
btc.icmp_notify_work);
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
+
rtw89_leave_ps_mode(rtwdev);
rtw89_btc_ntfy_specific_packet(rtwdev, PACKET_ICMP);
- mutex_unlock(&rtwdev->mutex);
}
static u8 _update_bt_rssi_level(struct rtw89_dev *rtwdev, u8 rssi)
@@ -7531,9 +7522,9 @@ static void _update_bt_info(struct rtw89_dev *rtwdev, u8 *buf, u32 len)
a2dp->vendor_id = 0;
a2dp->flush_time = 0;
a2dp->play_latency = 1;
- ieee80211_queue_delayed_work(rtwdev->hw,
- &rtwdev->coex_bt_devinfo_work,
- RTW89_COEX_BT_DEVINFO_WORK_PERIOD);
+ wiphy_delayed_work_queue(rtwdev->hw->wiphy,
+ &rtwdev->coex_bt_devinfo_work,
+ RTW89_COEX_BT_DEVINFO_WORK_PERIOD);
}
_run_coex(rtwdev, BTC_RSN_UPDATE_BT_INFO);
@@ -7671,7 +7662,8 @@ void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev,
else
wl->status.map.connecting = 0;
- if (state == BTC_ROLE_MSTS_STA_DIS_CONN)
+ if (state == BTC_ROLE_MSTS_STA_DIS_CONN ||
+ state == BTC_ROLE_MSTS_STA_CONN_END)
wl->status.map._4way = false;
_run_coex(rtwdev, BTC_RSN_NTFY_ROLE_INFO);
@@ -7781,7 +7773,7 @@ static bool _ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_path,
wl->rfk_info.state = BTC_WRFK_STOP;
_write_scbd(rtwdev, BTC_WSCB_WLRFK, false);
- cancel_delayed_work(&rtwdev->coex_rfk_chk_work);
+ wiphy_delayed_work_cancel(rtwdev->hw->wiphy, &rtwdev->coex_rfk_chk_work);
break;
default:
rtw89_debug(rtwdev, RTW89_DBG_BTC,
@@ -7795,9 +7787,9 @@ static bool _ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_path,
_run_coex(rtwdev, BTC_RSN_NTFY_WL_RFK);
if (wl->rfk_info.state == BTC_WRFK_START)
- ieee80211_queue_delayed_work(rtwdev->hw,
- &rtwdev->coex_rfk_chk_work,
- RTW89_COEX_RFK_CHK_WORK_PERIOD);
+ wiphy_delayed_work_queue(rtwdev->hw->wiphy,
+ &rtwdev->coex_rfk_chk_work,
+ RTW89_COEX_RFK_CHK_WORK_PERIOD);
}
rtw89_debug(rtwdev, RTW89_DBG_BTC,
@@ -7815,6 +7807,8 @@ void rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map,
bool allow;
int ret;
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
band = FIELD_GET(BTC_RFK_BAND_MAP, phy_map);
rtw89_debug(rtwdev, RTW89_DBG_RFK,
@@ -8115,6 +8109,7 @@ void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
return;
func = rtw89_btc_c2h_get_index_by_ver(rtwdev, func);
+ pfwinfo->cnt_c2h++;
switch (func) {
case BTF_EVNT_BUF_OVERFLOW:
@@ -8156,7 +8151,7 @@ void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
#define BTC_CX_FW_OFFLOAD 0
-static void _show_cx_info(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_cx_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
union rtw89_btc_module_info *md = &rtwdev->btc.mdinfo;
const struct rtw89_chip_info *chip = rtwdev->chip;
@@ -8168,40 +8163,43 @@ static void _show_cx_info(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_wl_info *wl = &btc->cx.wl;
u32 ver_main = 0, ver_sub = 0, ver_hotfix = 0, id_branch = 0;
u8 cv, rfe, iso, ant_num, ant_single_pos;
+ char *p = buf, *end = buf + bufsz;
if (!(dm->coex_info_map & BTC_COEX_INFO_CX))
- return;
+ return 0;
dm->cnt_notify[BTC_NCNT_SHOW_COEX_INFO]++;
- seq_printf(m, "========== [BTC COEX INFO (%d)] ==========\n",
- chip->chip_id);
+ p += scnprintf(p, end - p,
+ "========== [BTC COEX INFO (%d)] ==========\n",
+ chip->chip_id);
ver_main = FIELD_GET(GENMASK(31, 24), RTW89_COEX_VERSION);
ver_sub = FIELD_GET(GENMASK(23, 16), RTW89_COEX_VERSION);
ver_hotfix = FIELD_GET(GENMASK(15, 8), RTW89_COEX_VERSION);
id_branch = FIELD_GET(GENMASK(7, 0), RTW89_COEX_VERSION);
- seq_printf(m, " %-15s : Coex:%d.%d.%d(branch:%d), ",
- "[coex_version]", ver_main, ver_sub, ver_hotfix, id_branch);
+ p += scnprintf(p, end - p, " %-15s : Coex:%d.%d.%d(branch:%d), ",
+ "[coex_version]", ver_main, ver_sub, ver_hotfix,
+ id_branch);
ver_main = FIELD_GET(GENMASK(31, 24), wl->ver_info.fw_coex);
ver_sub = FIELD_GET(GENMASK(23, 16), wl->ver_info.fw_coex);
ver_hotfix = FIELD_GET(GENMASK(15, 8), wl->ver_info.fw_coex);
id_branch = FIELD_GET(GENMASK(7, 0), wl->ver_info.fw_coex);
- seq_printf(m, "WL_FW_coex:%d.%d.%d(branch:%d)",
- ver_main, ver_sub, ver_hotfix, id_branch);
+ p += scnprintf(p, end - p, "WL_FW_coex:%d.%d.%d(branch:%d)",
+ ver_main, ver_sub, ver_hotfix, id_branch);
ver_main = FIELD_GET(GENMASK(31, 24), chip->wlcx_desired);
ver_sub = FIELD_GET(GENMASK(23, 16), chip->wlcx_desired);
ver_hotfix = FIELD_GET(GENMASK(15, 8), chip->wlcx_desired);
- seq_printf(m, "(%s, desired:%d.%d.%d), ",
- (wl->ver_info.fw_coex >= chip->wlcx_desired ?
- "Match" : "Mismatch"), ver_main, ver_sub, ver_hotfix);
+ p += scnprintf(p, end - p, "(%s, desired:%d.%d.%d), ",
+ (wl->ver_info.fw_coex >= chip->wlcx_desired ?
+ "Match" : "Mismatch"), ver_main, ver_sub, ver_hotfix);
- seq_printf(m, "BT_FW_coex:%d(%s, desired:%d)\n",
- bt->ver_info.fw_coex,
- (bt->ver_info.fw_coex >= chip->btcx_desired ?
- "Match" : "Mismatch"), chip->btcx_desired);
+ p += scnprintf(p, end - p, "BT_FW_coex:%d(%s, desired:%d)\n",
+ bt->ver_info.fw_coex,
+ (bt->ver_info.fw_coex >= chip->btcx_desired ?
+ "Match" : "Mismatch"), chip->btcx_desired);
if (bt->enable.now && bt->ver_info.fw == 0)
rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_VER_INFO, true);
@@ -8212,10 +8210,11 @@ static void _show_cx_info(struct rtw89_dev *rtwdev, struct seq_file *m)
ver_sub = FIELD_GET(GENMASK(23, 16), wl->ver_info.fw);
ver_hotfix = FIELD_GET(GENMASK(15, 8), wl->ver_info.fw);
id_branch = FIELD_GET(GENMASK(7, 0), wl->ver_info.fw);
- seq_printf(m, " %-15s : WL_FW:%d.%d.%d.%d, BT_FW:0x%x(%s)\n",
- "[sub_module]",
- ver_main, ver_sub, ver_hotfix, id_branch,
- bt->ver_info.fw, bt->run_patch_code ? "patch" : "ROM");
+ p += scnprintf(p, end - p,
+ " %-15s : WL_FW:%d.%d.%d.%d, BT_FW:0x%x(%s)\n",
+ "[sub_module]",
+ ver_main, ver_sub, ver_hotfix, id_branch,
+ bt->ver_info.fw, bt->run_patch_code ? "patch" : "ROM");
if (ver->fcxinit == 7) {
cv = md->md_v7.kt_ver;
@@ -8231,36 +8230,41 @@ static void _show_cx_info(struct rtw89_dev *rtwdev, struct seq_file *m)
ant_single_pos = md->md.ant.single_pos;
}
- seq_printf(m, " %-15s : cv:%x, rfe_type:0x%x, ant_iso:%d, ant_pg:%d, %s",
- "[hw_info]", cv, rfe, iso, ant_num,
- ant_num > 1 ? "" :
- ant_single_pos ? "1Ant_Pos:S1, " : "1Ant_Pos:S0, ");
+ p += scnprintf(p, end - p,
+ " %-15s : cv:%x, rfe_type:0x%x, ant_iso:%d, ant_pg:%d, %s",
+ "[hw_info]", cv, rfe, iso, ant_num,
+ ant_num > 1 ? "" :
+ ant_single_pos ? "1Ant_Pos:S1, " : "1Ant_Pos:S0, ");
- seq_printf(m, "3rd_coex:%d, dbcc:%d, tx_num:%d, rx_num:%d\n",
- btc->cx.other.type, rtwdev->dbcc_en, hal->tx_nss,
- hal->rx_nss);
+ p += scnprintf(p, end - p,
+ "3rd_coex:%d, dbcc:%d, tx_num:%d, rx_num:%d\n",
+ btc->cx.other.type, rtwdev->dbcc_en, hal->tx_nss,
+ hal->rx_nss);
+
+ return p - buf;
}
-static void _show_wl_role_info(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_wl_role_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_wl_link_info *plink = NULL;
struct rtw89_btc_wl_info *wl = &btc->cx.wl;
struct rtw89_btc_wl_dbcc_info *wl_dinfo = &wl->dbcc_info;
struct rtw89_traffic_stats *t;
+ char *p = buf, *end = buf + bufsz;
u8 i;
if (rtwdev->dbcc_en) {
- seq_printf(m,
- " %-15s : PHY0_band(op:%d/scan:%d/real:%d), ",
- "[dbcc_info]", wl_dinfo->op_band[RTW89_PHY_0],
- wl_dinfo->scan_band[RTW89_PHY_0],
- wl_dinfo->real_band[RTW89_PHY_0]);
- seq_printf(m,
- "PHY1_band(op:%d/scan:%d/real:%d)\n",
- wl_dinfo->op_band[RTW89_PHY_1],
- wl_dinfo->scan_band[RTW89_PHY_1],
- wl_dinfo->real_band[RTW89_PHY_1]);
+ p += scnprintf(p, end - p,
+ " %-15s : PHY0_band(op:%d/scan:%d/real:%d), ",
+ "[dbcc_info]", wl_dinfo->op_band[RTW89_PHY_0],
+ wl_dinfo->scan_band[RTW89_PHY_0],
+ wl_dinfo->real_band[RTW89_PHY_0]);
+ p += scnprintf(p, end - p,
+ "PHY1_band(op:%d/scan:%d/real:%d)\n",
+ wl_dinfo->op_band[RTW89_PHY_1],
+ wl_dinfo->scan_band[RTW89_PHY_1],
+ wl_dinfo->real_band[RTW89_PHY_1]);
}
for (i = 0; i < RTW89_PORT_NUM; i++) {
@@ -8272,38 +8276,41 @@ static void _show_wl_role_info(struct rtw89_dev *rtwdev, struct seq_file *m)
if (!plink->active)
continue;
- seq_printf(m,
- " [port_%d] : role=%d(phy-%d), connect=%d(client_cnt=%d), mode=%d, center_ch=%d, bw=%d",
- plink->pid, (u32)plink->role, plink->phy,
- (u32)plink->connected, plink->client_cnt - 1,
- (u32)plink->mode, plink->ch, (u32)plink->bw);
+ p += scnprintf(p, end - p,
+ " [port_%d] : role=%d(phy-%d), connect=%d(client_cnt=%d), mode=%d, center_ch=%d, bw=%d",
+ plink->pid, (u32)plink->role, plink->phy,
+ (u32)plink->connected, plink->client_cnt - 1,
+ (u32)plink->mode, plink->ch, (u32)plink->bw);
if (plink->connected == MLME_NO_LINK)
continue;
- seq_printf(m,
- ", mac_id=%d, max_tx_time=%dus, max_tx_retry=%d\n",
- plink->mac_id, plink->tx_time, plink->tx_retry);
+ p += scnprintf(p, end - p,
+ ", mac_id=%d, max_tx_time=%dus, max_tx_retry=%d\n",
+ plink->mac_id, plink->tx_time, plink->tx_retry);
- seq_printf(m,
- " [port_%d] : rssi=-%ddBm(%d), busy=%d, dir=%s, ",
- plink->pid, 110 - plink->stat.rssi,
- plink->stat.rssi, plink->busy,
- plink->dir == RTW89_TFC_UL ? "UL" : "DL");
+ p += scnprintf(p, end - p,
+ " [port_%d] : rssi=-%ddBm(%d), busy=%d, dir=%s, ",
+ plink->pid, 110 - plink->stat.rssi,
+ plink->stat.rssi, plink->busy,
+ plink->dir == RTW89_TFC_UL ? "UL" : "DL");
t = &plink->stat.traffic;
- seq_printf(m,
- "tx[rate:%d/busy_level:%d], ",
- (u32)t->tx_rate, t->tx_tfc_lv);
+ p += scnprintf(p, end - p,
+ "tx[rate:%d/busy_level:%d], ",
+ (u32)t->tx_rate, t->tx_tfc_lv);
- seq_printf(m, "rx[rate:%d/busy_level:%d/drop:%d]\n",
- (u32)t->rx_rate,
- t->rx_tfc_lv, plink->rx_rate_drop_cnt);
+ p += scnprintf(p, end - p,
+ "rx[rate:%d/busy_level:%d/drop:%d]\n",
+ (u32)t->rx_rate,
+ t->rx_tfc_lv, plink->rx_rate_drop_cnt);
}
+
+ return p - buf;
}
-static void _show_wl_info(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_wl_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
const struct rtw89_btc_ver *ver = btc->ver;
@@ -8314,12 +8321,13 @@ static void _show_wl_info(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_wl_role_info_v2 *wl_rinfo_v2 = &wl->role_info_v2;
struct rtw89_btc_wl_role_info_v7 *wl_rinfo_v7 = &wl->role_info_v7;
struct rtw89_btc_wl_role_info_v8 *wl_rinfo_v8 = &wl->role_info_v8;
+ char *p = buf, *end = buf + bufsz;
u8 mode;
if (!(btc->dm.coex_info_map & BTC_COEX_INFO_WL))
- return;
+ return 0;
- seq_puts(m, "========== [WL Status] ==========\n");
+ p += scnprintf(p, end - p, "========== [WL Status] ==========\n");
if (ver->fwlrole == 0)
mode = wl_rinfo->link_mode;
@@ -8332,24 +8340,28 @@ static void _show_wl_info(struct rtw89_dev *rtwdev, struct seq_file *m)
else if (ver->fwlrole == 8)
mode = wl_rinfo_v8->link_mode;
else
- return;
+ goto out;
- seq_printf(m, " %-15s : link_mode:%d, ", "[status]", mode);
+ p += scnprintf(p, end - p, " %-15s : link_mode:%d, ", "[status]",
+ mode);
- seq_printf(m,
- "rf_off:%d, power_save:%d, scan:%s(band:%d/phy_map:0x%x), ",
- wl->status.map.rf_off, wl->status.map.lps,
- wl->status.map.scan ? "Y" : "N",
- wl->scan_info.band[RTW89_PHY_0], wl->scan_info.phy_map);
+ p += scnprintf(p, end - p,
+ "rf_off:%d, power_save:%d, scan:%s(band:%d/phy_map:0x%x), ",
+ wl->status.map.rf_off, wl->status.map.lps,
+ wl->status.map.scan ? "Y" : "N",
+ wl->scan_info.band[RTW89_PHY_0], wl->scan_info.phy_map);
- seq_printf(m,
- "connecting:%s, roam:%s, 4way:%s, init_ok:%s\n",
- wl->status.map.connecting ? "Y" : "N",
- wl->status.map.roaming ? "Y" : "N",
- wl->status.map._4way ? "Y" : "N",
- wl->status.map.init_ok ? "Y" : "N");
+ p += scnprintf(p, end - p,
+ "connecting:%s, roam:%s, 4way:%s, init_ok:%s\n",
+ wl->status.map.connecting ? "Y" : "N",
+ wl->status.map.roaming ? "Y" : "N",
+ wl->status.map._4way ? "Y" : "N",
+ wl->status.map.init_ok ? "Y" : "N");
- _show_wl_role_info(rtwdev, m);
+ p += _show_wl_role_info(rtwdev, p, end - p);
+
+out:
+ return p - buf;
}
enum btc_bt_a2dp_type {
@@ -8358,7 +8370,7 @@ enum btc_bt_a2dp_type {
BTC_A2DP_TWS_RELAY = 2,
};
-static void _show_bt_profile_info(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_bt_profile_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_bt_link_info *bt_linfo = &btc->cx.bt.link_info;
@@ -8366,50 +8378,55 @@ static void _show_bt_profile_info(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_bt_hid_desc hid = bt_linfo->hid_desc;
struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc;
struct rtw89_btc_bt_pan_desc pan = bt_linfo->pan_desc;
+ char *p = buf, *end = buf + bufsz;
if (hfp.exist) {
- seq_printf(m, " %-15s : type:%s, sut_pwr:%d, golden-rx:%d",
- "[HFP]", (hfp.type == 0 ? "SCO" : "eSCO"),
- bt_linfo->sut_pwr_level[0],
- bt_linfo->golden_rx_shift[0]);
+ p += scnprintf(p, end - p,
+ " %-15s : type:%s, sut_pwr:%d, golden-rx:%d",
+ "[HFP]", (hfp.type == 0 ? "SCO" : "eSCO"),
+ bt_linfo->sut_pwr_level[0],
+ bt_linfo->golden_rx_shift[0]);
}
if (hid.exist) {
- seq_printf(m,
- "\n\r %-15s : type:%s%s%s%s%s pair-cnt:%d, sut_pwr:%d, golden-rx:%d\n",
- "[HID]",
- hid.type & BTC_HID_218 ? "2/18," : "",
- hid.type & BTC_HID_418 ? "4/18," : "",
- hid.type & BTC_HID_BLE ? "BLE," : "",
- hid.type & BTC_HID_RCU ? "RCU," : "",
- hid.type & BTC_HID_RCU_VOICE ? "RCU-Voice," : "",
- hid.pair_cnt, bt_linfo->sut_pwr_level[1],
- bt_linfo->golden_rx_shift[1]);
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : type:%s%s%s%s%s pair-cnt:%d, sut_pwr:%d, golden-rx:%d\n",
+ "[HID]",
+ hid.type & BTC_HID_218 ? "2/18," : "",
+ hid.type & BTC_HID_418 ? "4/18," : "",
+ hid.type & BTC_HID_BLE ? "BLE," : "",
+ hid.type & BTC_HID_RCU ? "RCU," : "",
+ hid.type & BTC_HID_RCU_VOICE ? "RCU-Voice," : "",
+ hid.pair_cnt, bt_linfo->sut_pwr_level[1],
+ bt_linfo->golden_rx_shift[1]);
}
if (a2dp.exist) {
- seq_printf(m,
- " %-15s : type:%s, bit-pool:%d, flush-time:%d, ",
- "[A2DP]",
- a2dp.type == BTC_A2DP_LEGACY ? "Legacy" : "TWS",
- a2dp.bitpool, a2dp.flush_time);
+ p += scnprintf(p, end - p,
+ " %-15s : type:%s, bit-pool:%d, flush-time:%d, ",
+ "[A2DP]",
+ a2dp.type == BTC_A2DP_LEGACY ? "Legacy" : "TWS",
+ a2dp.bitpool, a2dp.flush_time);
- seq_printf(m,
- "vid:0x%x, Dev-name:0x%x, sut_pwr:%d, golden-rx:%d\n",
- a2dp.vendor_id, a2dp.device_name,
- bt_linfo->sut_pwr_level[2],
- bt_linfo->golden_rx_shift[2]);
+ p += scnprintf(p, end - p,
+ "vid:0x%x, Dev-name:0x%x, sut_pwr:%d, golden-rx:%d\n",
+ a2dp.vendor_id, a2dp.device_name,
+ bt_linfo->sut_pwr_level[2],
+ bt_linfo->golden_rx_shift[2]);
}
if (pan.exist) {
- seq_printf(m, " %-15s : sut_pwr:%d, golden-rx:%d\n",
- "[PAN]",
- bt_linfo->sut_pwr_level[3],
- bt_linfo->golden_rx_shift[3]);
+ p += scnprintf(p, end - p,
+ " %-15s : sut_pwr:%d, golden-rx:%d\n",
+ "[PAN]",
+ bt_linfo->sut_pwr_level[3],
+ bt_linfo->golden_rx_shift[3]);
}
+
+ return p - buf;
}
-static void _show_bt_info(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_bt_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
const struct rtw89_btc_ver *ver = btc->ver;
@@ -8418,129 +8435,136 @@ static void _show_bt_info(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_wl_info *wl = &cx->wl;
struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info;
union rtw89_btc_module_info *md = &btc->mdinfo;
+ char *p = buf, *end = buf + bufsz;
u8 *afh = bt_linfo->afh_map;
u8 *afh_le = bt_linfo->afh_map_le;
u8 bt_pos;
if (!(btc->dm.coex_info_map & BTC_COEX_INFO_BT))
- return;
+ return 0;
if (ver->fcxinit == 7)
bt_pos = md->md_v7.bt_pos;
else
bt_pos = md->md.bt_pos;
- seq_puts(m, "========== [BT Status] ==========\n");
-
- seq_printf(m, " %-15s : enable:%s, btg:%s%s, connect:%s, ",
- "[status]", bt->enable.now ? "Y" : "N",
- bt->btg_type ? "Y" : "N",
- (bt->enable.now && (bt->btg_type != bt_pos) ?
- "(efuse-mismatch!!)" : ""),
- (bt_linfo->status.map.connect ? "Y" : "N"));
-
- seq_printf(m, "igno_wl:%s, mailbox_avl:%s, rfk_state:0x%x\n",
- bt->igno_wl ? "Y" : "N",
- bt->mbx_avl ? "Y" : "N", bt->rfk_info.val);
-
- seq_printf(m, " %-15s : profile:%s%s%s%s%s ",
- "[profile]",
- (bt_linfo->profile_cnt.now == 0) ? "None," : "",
- bt_linfo->hfp_desc.exist ? "HFP," : "",
- bt_linfo->hid_desc.exist ? "HID," : "",
- bt_linfo->a2dp_desc.exist ?
- (bt_linfo->a2dp_desc.sink ? "A2DP_sink," : "A2DP,") : "",
- bt_linfo->pan_desc.exist ? "PAN," : "");
-
- seq_printf(m,
- "multi-link:%s, role:%s, ble-connect:%s, CQDDR:%s, A2DP_active:%s, PAN_active:%s\n",
- bt_linfo->multi_link.now ? "Y" : "N",
- bt_linfo->slave_role ? "Slave" : "Master",
- bt_linfo->status.map.ble_connect ? "Y" : "N",
- bt_linfo->cqddr ? "Y" : "N",
- bt_linfo->a2dp_desc.active ? "Y" : "N",
- bt_linfo->pan_desc.active ? "Y" : "N");
-
- seq_printf(m,
- " %-15s : rssi:%ddBm(lvl:%d), tx_rate:%dM, %s%s%s",
- "[link]", bt_linfo->rssi - 100,
- bt->rssi_level,
- bt_linfo->tx_3m ? 3 : 2,
- bt_linfo->status.map.inq_pag ? " inq-page!!" : "",
- bt_linfo->status.map.acl_busy ? " acl_busy!!" : "",
- bt_linfo->status.map.mesh_busy ? " mesh_busy!!" : "");
-
- seq_printf(m,
- "%s afh_map[%02x%02x_%02x%02x_%02x%02x_%02x%02x_%02x%02x], ",
- bt_linfo->relink.now ? " ReLink!!" : "",
- afh[0], afh[1], afh[2], afh[3], afh[4],
- afh[5], afh[6], afh[7], afh[8], afh[9]);
+ p += scnprintf(p, end - p, "========== [BT Status] ==========\n");
+
+ p += scnprintf(p, end - p,
+ " %-15s : enable:%s, btg:%s%s, connect:%s, ",
+ "[status]", bt->enable.now ? "Y" : "N",
+ bt->btg_type ? "Y" : "N",
+ (bt->enable.now && (bt->btg_type != bt_pos) ?
+ "(efuse-mismatch!!)" : ""),
+ (bt_linfo->status.map.connect ? "Y" : "N"));
+
+ p += scnprintf(p, end - p,
+ "igno_wl:%s, mailbox_avl:%s, rfk_state:0x%x\n",
+ bt->igno_wl ? "Y" : "N",
+ bt->mbx_avl ? "Y" : "N", bt->rfk_info.val);
+
+ p += scnprintf(p, end - p, " %-15s : profile:%s%s%s%s%s ",
+ "[profile]",
+ (bt_linfo->profile_cnt.now == 0) ? "None," : "",
+ bt_linfo->hfp_desc.exist ? "HFP," : "",
+ bt_linfo->hid_desc.exist ? "HID," : "",
+ bt_linfo->a2dp_desc.exist ?
+ (bt_linfo->a2dp_desc.sink ? "A2DP_sink," : "A2DP,") : "",
+ bt_linfo->pan_desc.exist ? "PAN," : "");
+
+ p += scnprintf(p, end - p,
+ "multi-link:%s, role:%s, ble-connect:%s, CQDDR:%s, A2DP_active:%s, PAN_active:%s\n",
+ bt_linfo->multi_link.now ? "Y" : "N",
+ bt_linfo->slave_role ? "Slave" : "Master",
+ bt_linfo->status.map.ble_connect ? "Y" : "N",
+ bt_linfo->cqddr ? "Y" : "N",
+ bt_linfo->a2dp_desc.active ? "Y" : "N",
+ bt_linfo->pan_desc.active ? "Y" : "N");
+
+ p += scnprintf(p, end - p,
+ " %-15s : rssi:%ddBm(lvl:%d), tx_rate:%dM, %s%s%s",
+ "[link]", bt_linfo->rssi - 100,
+ bt->rssi_level,
+ bt_linfo->tx_3m ? 3 : 2,
+ bt_linfo->status.map.inq_pag ? " inq-page!!" : "",
+ bt_linfo->status.map.acl_busy ? " acl_busy!!" : "",
+ bt_linfo->status.map.mesh_busy ? " mesh_busy!!" : "");
+
+ p += scnprintf(p, end - p,
+ "%s afh_map[%02x%02x_%02x%02x_%02x%02x_%02x%02x_%02x%02x], ",
+ bt_linfo->relink.now ? " ReLink!!" : "",
+ afh[0], afh[1], afh[2], afh[3], afh[4],
+ afh[5], afh[6], afh[7], afh[8], afh[9]);
if (ver->fcxbtafh == 2 && bt_linfo->status.map.ble_connect)
- seq_printf(m,
- "LE[%02x%02x_%02x_%02x%02x]",
- afh_le[0], afh_le[1], afh_le[2],
- afh_le[3], afh_le[4]);
-
- seq_printf(m, "wl_ch_map[en:%d/ch:%d/bw:%d]\n",
- wl->afh_info.en, wl->afh_info.ch, wl->afh_info.bw);
-
- seq_printf(m,
- " %-15s : retry:%d, relink:%d, rate_chg:%d, reinit:%d, reenable:%d, ",
- "[stat_cnt]", cx->cnt_bt[BTC_BCNT_RETRY],
- cx->cnt_bt[BTC_BCNT_RELINK], cx->cnt_bt[BTC_BCNT_RATECHG],
- cx->cnt_bt[BTC_BCNT_REINIT], cx->cnt_bt[BTC_BCNT_REENABLE]);
-
- seq_printf(m,
- "role-switch:%d, afh:%d, inq_page:%d(inq:%d/page:%d), igno_wl:%d\n",
- cx->cnt_bt[BTC_BCNT_ROLESW], cx->cnt_bt[BTC_BCNT_AFH],
- cx->cnt_bt[BTC_BCNT_INQPAG], cx->cnt_bt[BTC_BCNT_INQ],
- cx->cnt_bt[BTC_BCNT_PAGE], cx->cnt_bt[BTC_BCNT_IGNOWL]);
-
- _show_bt_profile_info(rtwdev, m);
-
- seq_printf(m,
- " %-15s : raw_data[%02x %02x %02x %02x %02x %02x] (type:%s/cnt:%d/same:%d)\n",
- "[bt_info]", bt->raw_info[2], bt->raw_info[3],
- bt->raw_info[4], bt->raw_info[5], bt->raw_info[6],
- bt->raw_info[7],
- bt->raw_info[0] == BTC_BTINFO_AUTO ? "auto" : "reply",
- cx->cnt_bt[BTC_BCNT_INFOUPDATE],
- cx->cnt_bt[BTC_BCNT_INFOSAME]);
-
- seq_printf(m,
- " %-15s : Hi-rx = %d, Hi-tx = %d, Lo-rx = %d, Lo-tx = %d (bt_polut_wl_tx = %d)",
- "[trx_req_cnt]", cx->cnt_bt[BTC_BCNT_HIPRI_RX],
- cx->cnt_bt[BTC_BCNT_HIPRI_TX], cx->cnt_bt[BTC_BCNT_LOPRI_RX],
- cx->cnt_bt[BTC_BCNT_LOPRI_TX], cx->cnt_bt[BTC_BCNT_POLUT]);
+ p += scnprintf(p, end - p,
+ "LE[%02x%02x_%02x_%02x%02x]",
+ afh_le[0], afh_le[1], afh_le[2],
+ afh_le[3], afh_le[4]);
+
+ p += scnprintf(p, end - p, "wl_ch_map[en:%d/ch:%d/bw:%d]\n",
+ wl->afh_info.en, wl->afh_info.ch, wl->afh_info.bw);
+
+ p += scnprintf(p, end - p,
+ " %-15s : retry:%d, relink:%d, rate_chg:%d, reinit:%d, reenable:%d, ",
+ "[stat_cnt]", cx->cnt_bt[BTC_BCNT_RETRY],
+ cx->cnt_bt[BTC_BCNT_RELINK],
+ cx->cnt_bt[BTC_BCNT_RATECHG],
+ cx->cnt_bt[BTC_BCNT_REINIT],
+ cx->cnt_bt[BTC_BCNT_REENABLE]);
+
+ p += scnprintf(p, end - p,
+ "role-switch:%d, afh:%d, inq_page:%d(inq:%d/page:%d), igno_wl:%d\n",
+ cx->cnt_bt[BTC_BCNT_ROLESW], cx->cnt_bt[BTC_BCNT_AFH],
+ cx->cnt_bt[BTC_BCNT_INQPAG], cx->cnt_bt[BTC_BCNT_INQ],
+ cx->cnt_bt[BTC_BCNT_PAGE], cx->cnt_bt[BTC_BCNT_IGNOWL]);
+
+ p += _show_bt_profile_info(rtwdev, p, end - p);
+
+ p += scnprintf(p, end - p,
+ " %-15s : raw_data[%02x %02x %02x %02x %02x %02x] (type:%s/cnt:%d/same:%d)\n",
+ "[bt_info]", bt->raw_info[2], bt->raw_info[3],
+ bt->raw_info[4], bt->raw_info[5], bt->raw_info[6],
+ bt->raw_info[7],
+ bt->raw_info[0] == BTC_BTINFO_AUTO ? "auto" : "reply",
+ cx->cnt_bt[BTC_BCNT_INFOUPDATE],
+ cx->cnt_bt[BTC_BCNT_INFOSAME]);
+
+ p += scnprintf(p, end - p,
+ " %-15s : Hi-rx = %d, Hi-tx = %d, Lo-rx = %d, Lo-tx = %d (bt_polut_wl_tx = %d)",
+ "[trx_req_cnt]", cx->cnt_bt[BTC_BCNT_HIPRI_RX],
+ cx->cnt_bt[BTC_BCNT_HIPRI_TX],
+ cx->cnt_bt[BTC_BCNT_LOPRI_RX],
+ cx->cnt_bt[BTC_BCNT_LOPRI_TX],
+ cx->cnt_bt[BTC_BCNT_POLUT]);
if (!bt->scan_info_update) {
rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_SCAN_INFO, true);
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
} else {
rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_SCAN_INFO, false);
if (ver->fcxbtscan == 1) {
- seq_printf(m,
- "(INQ:%d-%d/PAGE:%d-%d/LE:%d-%d/INIT:%d-%d)",
- le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INQ].win),
- le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INQ].intvl),
- le16_to_cpu(bt->scan_info_v1[BTC_SCAN_PAGE].win),
- le16_to_cpu(bt->scan_info_v1[BTC_SCAN_PAGE].intvl),
- le16_to_cpu(bt->scan_info_v1[BTC_SCAN_BLE].win),
- le16_to_cpu(bt->scan_info_v1[BTC_SCAN_BLE].intvl),
- le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INIT].win),
- le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INIT].intvl));
+ p += scnprintf(p, end - p,
+ "(INQ:%d-%d/PAGE:%d-%d/LE:%d-%d/INIT:%d-%d)",
+ le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INQ].win),
+ le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INQ].intvl),
+ le16_to_cpu(bt->scan_info_v1[BTC_SCAN_PAGE].win),
+ le16_to_cpu(bt->scan_info_v1[BTC_SCAN_PAGE].intvl),
+ le16_to_cpu(bt->scan_info_v1[BTC_SCAN_BLE].win),
+ le16_to_cpu(bt->scan_info_v1[BTC_SCAN_BLE].intvl),
+ le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INIT].win),
+ le16_to_cpu(bt->scan_info_v1[BTC_SCAN_INIT].intvl));
} else if (ver->fcxbtscan == 2) {
- seq_printf(m,
- "(BG:%d-%d/INIT:%d-%d/LE:%d-%d)",
- le16_to_cpu(bt->scan_info_v2[CXSCAN_BG].win),
- le16_to_cpu(bt->scan_info_v2[CXSCAN_BG].intvl),
- le16_to_cpu(bt->scan_info_v2[CXSCAN_INIT].win),
- le16_to_cpu(bt->scan_info_v2[CXSCAN_INIT].intvl),
- le16_to_cpu(bt->scan_info_v2[CXSCAN_LE].win),
- le16_to_cpu(bt->scan_info_v2[CXSCAN_LE].intvl));
+ p += scnprintf(p, end - p,
+ "(BG:%d-%d/INIT:%d-%d/LE:%d-%d)",
+ le16_to_cpu(bt->scan_info_v2[CXSCAN_BG].win),
+ le16_to_cpu(bt->scan_info_v2[CXSCAN_BG].intvl),
+ le16_to_cpu(bt->scan_info_v2[CXSCAN_INIT].win),
+ le16_to_cpu(bt->scan_info_v2[CXSCAN_INIT].intvl),
+ le16_to_cpu(bt->scan_info_v2[CXSCAN_LE].win),
+ le16_to_cpu(bt->scan_info_v2[CXSCAN_LE].intvl));
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
if (bt_linfo->profile_cnt.now || bt_linfo->status.map.ble_connect)
@@ -8560,6 +8584,8 @@ static void _show_bt_info(struct rtw89_dev *rtwdev, struct seq_file *m)
rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_DEVICE_INFO, true);
else
rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_DEVICE_INFO, false);
+
+ return p - buf;
}
#define CASE_BTC_RSN_STR(e) case BTC_RSN_ ## e: return #e
@@ -8853,114 +8879,132 @@ static const char *id_to_ant(u32 id)
}
static
-void seq_print_segment(struct seq_file *m, const char *prefix, u16 *data,
- u8 len, u8 seg_len, u8 start_idx, u8 ring_len)
+int scnprintf_segment(char *buf, size_t bufsz, const char *prefix, const u16 *data,
+ u8 len, u8 seg_len, u8 start_idx, u8 ring_len)
{
- u8 i;
+ char *p = buf, *end = buf + bufsz;
u8 cur_index;
+ u8 i;
for (i = 0; i < len ; i++) {
if ((i % seg_len) == 0)
- seq_printf(m, " %-15s : ", prefix);
+ p += scnprintf(p, end - p, " %-15s : ", prefix);
cur_index = (start_idx + i) % ring_len;
if (i % 3 == 0)
- seq_printf(m, "-> %-20s",
- steps_to_str(*(data + cur_index)));
+ p += scnprintf(p, end - p, "-> %-20s",
+ steps_to_str(*(data + cur_index)));
else if (i % 3 == 1)
- seq_printf(m, "-> %-15s",
- steps_to_str(*(data + cur_index)));
+ p += scnprintf(p, end - p, "-> %-15s",
+ steps_to_str(*(data + cur_index)));
else
- seq_printf(m, "-> %-13s",
- steps_to_str(*(data + cur_index)));
+ p += scnprintf(p, end - p, "-> %-13s",
+ steps_to_str(*(data + cur_index)));
if (i == (len - 1) || (i % seg_len) == (seg_len - 1))
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
+
+ return p - buf;
}
-static void _show_dm_step(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_dm_step(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_dm *dm = &btc->dm;
+ char *p = buf, *end = buf + bufsz;
u8 start_idx;
u8 len;
len = dm->dm_step.step_ov ? RTW89_BTC_DM_MAXSTEP : dm->dm_step.step_pos;
start_idx = dm->dm_step.step_ov ? dm->dm_step.step_pos : 0;
- seq_print_segment(m, "[dm_steps]", dm->dm_step.step, len, 6, start_idx,
- ARRAY_SIZE(dm->dm_step.step));
+ p += scnprintf_segment(p, end - p, "[dm_steps]", dm->dm_step.step, len,
+ 6, start_idx, ARRAY_SIZE(dm->dm_step.step));
+
+ return p - buf;
}
-static void _show_dm_info(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_dm_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
const struct rtw89_btc_ver *ver = btc->ver;
struct rtw89_btc_dm *dm = &btc->dm;
struct rtw89_btc_wl_info *wl = &btc->cx.wl;
struct rtw89_btc_bt_info *bt = &btc->cx.bt;
+ char *p = buf, *end = buf + bufsz;
u8 igno_bt;
if (!(dm->coex_info_map & BTC_COEX_INFO_DM))
- return;
+ return 0;
- seq_printf(m, "========== [Mechanism Status %s] ==========\n",
- (btc->manual_ctrl ? "(Manual)" : "(Auto)"));
+ p += scnprintf(p, end - p,
+ "========== [Mechanism Status %s] ==========\n",
+ (btc->manual_ctrl ? "(Manual)" : "(Auto)"));
- seq_printf(m,
- " %-15s : type:%s, reason:%s(), action:%s(), ant_path:%s, init_mode:%s, run_cnt:%d\n",
- "[status]",
- btc->ant_type == BTC_ANT_SHARED ? "shared" : "dedicated",
- steps_to_str(dm->run_reason),
- steps_to_str(dm->run_action | BTC_ACT_EXT_BIT),
- id_to_ant(FIELD_GET(GENMASK(7, 0), dm->set_ant_path)),
- id_to_mode(wl->coex_mode),
- dm->cnt_dm[BTC_DCNT_RUN]);
+ p += scnprintf(p, end - p,
+ " %-15s : type:%s, reason:%s(), action:%s(), ant_path:%s, init_mode:%s, run_cnt:%d\n",
+ "[status]",
+ btc->ant_type == BTC_ANT_SHARED ? "shared" : "dedicated",
+ steps_to_str(dm->run_reason),
+ steps_to_str(dm->run_action | BTC_ACT_EXT_BIT),
+ id_to_ant(FIELD_GET(GENMASK(7, 0), dm->set_ant_path)),
+ id_to_mode(wl->coex_mode),
+ dm->cnt_dm[BTC_DCNT_RUN]);
- _show_dm_step(rtwdev, m);
+ p += _show_dm_step(rtwdev, p, end - p);
if (ver->fcxctrl == 7)
igno_bt = btc->ctrl.ctrl_v7.igno_bt;
else
igno_bt = btc->ctrl.ctrl.igno_bt;
- seq_printf(m, " %-15s : wl_only:%d, bt_only:%d, igno_bt:%d, free_run:%d, wl_ps_ctrl:%d, wl_mimo_ps:%d, ",
- "[dm_flag]", dm->wl_only, dm->bt_only, igno_bt,
- dm->freerun, btc->lps, dm->wl_mimo_ps);
+ p += scnprintf(p, end - p,
+ " %-15s : wl_only:%d, bt_only:%d, igno_bt:%d, free_run:%d, wl_ps_ctrl:%d, wl_mimo_ps:%d, ",
+ "[dm_flag]", dm->wl_only, dm->bt_only, igno_bt,
+ dm->freerun, btc->lps, dm->wl_mimo_ps);
- seq_printf(m, "leak_ap:%d, fw_offload:%s%s\n", dm->leak_ap,
- (BTC_CX_FW_OFFLOAD ? "Y" : "N"),
- (dm->wl_fw_cx_offload == BTC_CX_FW_OFFLOAD ?
- "" : "(Mismatch!!)"));
+ p += scnprintf(p, end - p, "leak_ap:%d, fw_offload:%s%s\n",
+ dm->leak_ap,
+ (BTC_CX_FW_OFFLOAD ? "Y" : "N"),
+ (dm->wl_fw_cx_offload == BTC_CX_FW_OFFLOAD ?
+ "" : "(Mismatch!!)"));
if (dm->rf_trx_para.wl_tx_power == 0xff)
- seq_printf(m,
- " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:orig, ",
- "[trx_ctrl]", wl->rssi_level, dm->trx_para_level);
+ p += scnprintf(p, end - p,
+ " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:orig, ",
+ "[trx_ctrl]", wl->rssi_level,
+ dm->trx_para_level);
else
- seq_printf(m,
- " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:%d, ",
- "[trx_ctrl]", wl->rssi_level, dm->trx_para_level,
- dm->rf_trx_para.wl_tx_power);
+ p += scnprintf(p, end - p,
+ " %-15s : wl_rssi_lvl:%d, para_lvl:%d, wl_tx_pwr:%d, ",
+ "[trx_ctrl]", wl->rssi_level,
+ dm->trx_para_level,
+ dm->rf_trx_para.wl_tx_power);
- seq_printf(m,
- "wl_rx_lvl:%d, bt_tx_pwr_dec:%d, bt_rx_lna:%d(%s-tbl), wl_btg_rx:%d\n",
- dm->rf_trx_para.wl_rx_gain, dm->rf_trx_para.bt_tx_power,
- dm->rf_trx_para.bt_rx_gain,
- (bt->hi_lna_rx ? "Hi" : "Ori"), dm->wl_btg_rx);
+ p += scnprintf(p, end - p,
+ "wl_rx_lvl:%d, bt_tx_pwr_dec:%d, bt_rx_lna:%d(%s-tbl), wl_btg_rx:%d\n",
+ dm->rf_trx_para.wl_rx_gain,
+ dm->rf_trx_para.bt_tx_power,
+ dm->rf_trx_para.bt_rx_gain,
+ (bt->hi_lna_rx ? "Hi" : "Ori"), dm->wl_btg_rx);
- seq_printf(m,
- " %-15s : wl_tx_limit[en:%d/max_t:%dus/max_retry:%d], bt_slot_reg:%d-TU, bt_scan_rx_low_pri:%d\n",
- "[dm_ctrl]", dm->wl_tx_limit.enable, dm->wl_tx_limit.tx_time,
- dm->wl_tx_limit.tx_retry, btc->bt_req_len, bt->scan_rx_low_pri);
+ p += scnprintf(p, end - p,
+ " %-15s : wl_tx_limit[en:%d/max_t:%dus/max_retry:%d], bt_slot_reg:%d-TU, bt_scan_rx_low_pri:%d\n",
+ "[dm_ctrl]", dm->wl_tx_limit.enable,
+ dm->wl_tx_limit.tx_time,
+ dm->wl_tx_limit.tx_retry, btc->bt_req_len,
+ bt->scan_rx_low_pri);
+
+ return p - buf;
}
-static void _show_error(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_error(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
const struct rtw89_btc_ver *ver = btc->ver;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
union rtw89_btc_fbtc_cysta_info *pcysta;
+ char *p = buf, *end = buf + bufsz;
u32 except_cnt, exception_map;
pcysta = &pfwinfo->rpt_fbtc_cysta.finfo;
@@ -8985,81 +9029,87 @@ static void _show_error(struct rtw89_dev *rtwdev, struct seq_file *m)
except_cnt = pcysta->v7.except_cnt;
exception_map = le32_to_cpu(pcysta->v7.except_map);
} else {
- return;
+ return 0;
}
if (pfwinfo->event[BTF_EVNT_BUF_OVERFLOW] == 0 && except_cnt == 0 &&
!pfwinfo->len_mismch && !pfwinfo->fver_mismch)
- return;
+ return 0;
- seq_printf(m, " %-15s : ", "[error]");
+ p += scnprintf(p, end - p, " %-15s : ", "[error]");
if (pfwinfo->event[BTF_EVNT_BUF_OVERFLOW]) {
- seq_printf(m,
- "overflow-cnt: %d, ",
- pfwinfo->event[BTF_EVNT_BUF_OVERFLOW]);
+ p += scnprintf(p, end - p,
+ "overflow-cnt: %d, ",
+ pfwinfo->event[BTF_EVNT_BUF_OVERFLOW]);
}
if (pfwinfo->len_mismch) {
- seq_printf(m,
- "len-mismatch: 0x%x, ",
- pfwinfo->len_mismch);
+ p += scnprintf(p, end - p,
+ "len-mismatch: 0x%x, ",
+ pfwinfo->len_mismch);
}
if (pfwinfo->fver_mismch) {
- seq_printf(m,
- "fver-mismatch: 0x%x, ",
- pfwinfo->fver_mismch);
+ p += scnprintf(p, end - p,
+ "fver-mismatch: 0x%x, ",
+ pfwinfo->fver_mismch);
}
/* cycle statistics exceptions */
if (exception_map || except_cnt) {
- seq_printf(m,
- "exception-type: 0x%x, exception-cnt = %d",
- exception_map, except_cnt);
+ p += scnprintf(p, end - p,
+ "exception-type: 0x%x, exception-cnt = %d",
+ exception_map, except_cnt);
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
+
+ return p - buf;
}
-static void _show_fbtc_tdma(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fbtc_tdma(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
const struct rtw89_btc_ver *ver = btc->ver;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
struct rtw89_btc_rpt_cmn_info *pcinfo = NULL;
struct rtw89_btc_fbtc_tdma *t = NULL;
+ char *p = buf, *end = buf + bufsz;
pcinfo = &pfwinfo->rpt_fbtc_tdma.cinfo;
if (!pcinfo->valid)
- return;
+ return 0;
if (ver->fcxtdma == 1)
t = &pfwinfo->rpt_fbtc_tdma.finfo.v1;
else
t = &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma;
- seq_printf(m,
- " %-15s : ", "[tdma_policy]");
- seq_printf(m,
- "type:%d, rx_flow_ctrl:%d, tx_pause:%d, ",
- (u32)t->type,
- t->rxflctrl, t->txpause);
+ p += scnprintf(p, end - p,
+ " %-15s : ", "[tdma_policy]");
+ p += scnprintf(p, end - p,
+ "type:%d, rx_flow_ctrl:%d, tx_pause:%d, ",
+ (u32)t->type,
+ t->rxflctrl, t->txpause);
- seq_printf(m,
- "wl_toggle_n:%d, leak_n:%d, ext_ctrl:%d, ",
- t->wtgle_n, t->leak_n, t->ext_ctrl);
+ p += scnprintf(p, end - p,
+ "wl_toggle_n:%d, leak_n:%d, ext_ctrl:%d, ",
+ t->wtgle_n, t->leak_n, t->ext_ctrl);
- seq_printf(m,
- "policy_type:%d",
- (u32)btc->policy_type);
+ p += scnprintf(p, end - p,
+ "policy_type:%d",
+ (u32)btc->policy_type);
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
+
+ return p - buf;
}
-static void _show_fbtc_slots(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fbtc_slots(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_dm *dm = &btc->dm;
+ char *p = buf, *end = buf + bufsz;
u16 dur, cxtype;
u32 tbl;
u8 i = 0;
@@ -9074,28 +9124,30 @@ static void _show_fbtc_slots(struct rtw89_dev *rtwdev, struct seq_file *m)
tbl = le32_to_cpu(dm->slot_now.v7[i].cxtbl);
cxtype = le16_to_cpu(dm->slot_now.v7[i].cxtype);
} else {
- return;
+ return 0;
}
if (i % 5 == 0)
- seq_printf(m,
- " %-15s : %5s[%03d/0x%x/%d]",
- "[slot_list]",
- id_to_slot((u32)i),
- dur, tbl, cxtype);
+ p += scnprintf(p, end - p,
+ " %-15s : %5s[%03d/0x%x/%d]",
+ "[slot_list]",
+ id_to_slot((u32)i),
+ dur, tbl, cxtype);
else
- seq_printf(m,
- ", %5s[%03d/0x%x/%d]",
- id_to_slot((u32)i),
- dur, tbl, cxtype);
+ p += scnprintf(p, end - p,
+ ", %5s[%03d/0x%x/%d]",
+ id_to_slot((u32)i),
+ dur, tbl, cxtype);
if (i % 5 == 4)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
+
+ return p - buf;
}
-static void _show_fbtc_cysta_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fbtc_cysta_v2(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
@@ -9104,63 +9156,64 @@ static void _show_fbtc_cysta_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_rpt_cmn_info *pcinfo = NULL;
struct rtw89_btc_fbtc_cysta_v2 *pcysta_le32 = NULL;
union rtw89_btc_fbtc_rxflct r;
- u8 i, cnt = 0, slot_pair;
u16 cycle, c_begin, c_end, store_index;
+ char *p = buf, *end = buf + bufsz;
+ u8 i, cnt = 0, slot_pair;
pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
if (!pcinfo->valid)
- return;
+ return 0;
pcysta_le32 = &pfwinfo->rpt_fbtc_cysta.finfo.v2;
- seq_printf(m,
- " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
- "[cycle_cnt]",
- le16_to_cpu(pcysta_le32->cycles),
- le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL]),
- le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL_OK]),
- le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_SLOT]),
- le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_OK]));
+ p += scnprintf(p, end - p,
+ " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
+ "[cycle_cnt]",
+ le16_to_cpu(pcysta_le32->cycles),
+ le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL]),
+ le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL_OK]),
+ le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_SLOT]),
+ le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_OK]));
for (i = 0; i < CXST_MAX; i++) {
if (!le32_to_cpu(pcysta_le32->slot_cnt[i]))
continue;
- seq_printf(m, ", %s:%d", id_to_slot((u32)i),
- le32_to_cpu(pcysta_le32->slot_cnt[i]));
+ p += scnprintf(p, end - p, ", %s:%d", id_to_slot((u32)i),
+ le32_to_cpu(pcysta_le32->slot_cnt[i]));
}
if (dm->tdma_now.rxflctrl) {
- seq_printf(m, ", leak_rx:%d",
- le32_to_cpu(pcysta_le32->leakrx_cnt));
+ p += scnprintf(p, end - p, ", leak_rx:%d",
+ le32_to_cpu(pcysta_le32->leakrx_cnt));
}
if (le32_to_cpu(pcysta_le32->collision_cnt)) {
- seq_printf(m, ", collision:%d",
- le32_to_cpu(pcysta_le32->collision_cnt));
+ p += scnprintf(p, end - p, ", collision:%d",
+ le32_to_cpu(pcysta_le32->collision_cnt));
}
if (le32_to_cpu(pcysta_le32->skip_cnt)) {
- seq_printf(m, ", skip:%d",
- le32_to_cpu(pcysta_le32->skip_cnt));
- }
- seq_puts(m, "\n");
-
- seq_printf(m, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
- "[cycle_time]",
- le16_to_cpu(pcysta_le32->tavg_cycle[CXT_WL]),
- le16_to_cpu(pcysta_le32->tavg_cycle[CXT_BT]),
- le16_to_cpu(pcysta_le32->tavg_lk) / 1000,
- le16_to_cpu(pcysta_le32->tavg_lk) % 1000);
- seq_printf(m, ", max_t[wl:%d/bt:%d/lk:%d.%03d]",
- le16_to_cpu(pcysta_le32->tmax_cycle[CXT_WL]),
- le16_to_cpu(pcysta_le32->tmax_cycle[CXT_BT]),
- le16_to_cpu(pcysta_le32->tmax_lk) / 1000,
- le16_to_cpu(pcysta_le32->tmax_lk) % 1000);
- seq_printf(m, ", maxdiff_t[wl:%d/bt:%d]\n",
- le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_WL]),
- le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_BT]));
+ p += scnprintf(p, end - p, ", skip:%d",
+ le32_to_cpu(pcysta_le32->skip_cnt));
+ }
+ p += scnprintf(p, end - p, "\n");
+
+ p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
+ "[cycle_time]",
+ le16_to_cpu(pcysta_le32->tavg_cycle[CXT_WL]),
+ le16_to_cpu(pcysta_le32->tavg_cycle[CXT_BT]),
+ le16_to_cpu(pcysta_le32->tavg_lk) / 1000,
+ le16_to_cpu(pcysta_le32->tavg_lk) % 1000);
+ p += scnprintf(p, end - p, ", max_t[wl:%d/bt:%d/lk:%d.%03d]",
+ le16_to_cpu(pcysta_le32->tmax_cycle[CXT_WL]),
+ le16_to_cpu(pcysta_le32->tmax_cycle[CXT_BT]),
+ le16_to_cpu(pcysta_le32->tmax_lk) / 1000,
+ le16_to_cpu(pcysta_le32->tmax_lk) % 1000);
+ p += scnprintf(p, end - p, ", maxdiff_t[wl:%d/bt:%d]\n",
+ le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_WL]),
+ le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_BT]));
if (le16_to_cpu(pcysta_le32->cycles) <= 1)
- return;
+ goto out;
/* 1 cycle record 1 wl-slot and 1 bt-slot */
slot_pair = BTC_CYCLE_SLOT_MAX / 2;
@@ -9177,53 +9230,57 @@ static void _show_fbtc_cysta_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
store_index = ((cycle - 1) % slot_pair) * 2;
if (cnt % (BTC_CYCLE_SLOT_MAX / 4) == 1)
- seq_printf(m,
- " %-15s : ->b%02d->w%02d", "[cycle_step]",
- le16_to_cpu(pcysta_le32->tslot_cycle[store_index]),
- le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1]));
+ p += scnprintf(p, end - p,
+ " %-15s : ->b%02d->w%02d",
+ "[cycle_step]",
+ le16_to_cpu(pcysta_le32->tslot_cycle[store_index]),
+ le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1]));
else
- seq_printf(m,
- "->b%02d->w%02d",
- le16_to_cpu(pcysta_le32->tslot_cycle[store_index]),
- le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1]));
+ p += scnprintf(p, end - p,
+ "->b%02d->w%02d",
+ le16_to_cpu(pcysta_le32->tslot_cycle[store_index]),
+ le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1]));
if (cnt % (BTC_CYCLE_SLOT_MAX / 4) == 0 || cnt == c_end)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
if (a2dp->exist) {
- seq_printf(m,
- " %-15s : a2dp_ept:%d, a2dp_late:%d",
- "[a2dp_t_sta]",
- le16_to_cpu(pcysta_le32->a2dpept),
- le16_to_cpu(pcysta_le32->a2dpeptto));
-
- seq_printf(m,
- ", avg_t:%d, max_t:%d",
- le16_to_cpu(pcysta_le32->tavg_a2dpept),
- le16_to_cpu(pcysta_le32->tmax_a2dpept));
+ p += scnprintf(p, end - p,
+ " %-15s : a2dp_ept:%d, a2dp_late:%d",
+ "[a2dp_t_sta]",
+ le16_to_cpu(pcysta_le32->a2dpept),
+ le16_to_cpu(pcysta_le32->a2dpeptto));
+
+ p += scnprintf(p, end - p,
+ ", avg_t:%d, max_t:%d",
+ le16_to_cpu(pcysta_le32->tavg_a2dpept),
+ le16_to_cpu(pcysta_le32->tmax_a2dpept));
r.val = dm->tdma_now.rxflctrl;
if (r.type && r.tgln_n) {
- seq_printf(m,
- ", cycle[PSTDMA:%d/TDMA:%d], ",
- le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_ON]),
- le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_OFF]));
-
- seq_printf(m,
- "avg_t[PSTDMA:%d/TDMA:%d], ",
- le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_ON]),
- le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_OFF]));
-
- seq_printf(m,
- "max_t[PSTDMA:%d/TDMA:%d]",
- le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_ON]),
- le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_OFF]));
+ p += scnprintf(p, end - p,
+ ", cycle[PSTDMA:%d/TDMA:%d], ",
+ le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_ON]),
+ le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_OFF]));
+
+ p += scnprintf(p, end - p,
+ "avg_t[PSTDMA:%d/TDMA:%d], ",
+ le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_ON]),
+ le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_OFF]));
+
+ p += scnprintf(p, end - p,
+ "max_t[PSTDMA:%d/TDMA:%d]",
+ le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_ON]),
+ le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_OFF]));
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
+
+out:
+ return p - buf;
}
-static void _show_fbtc_cysta_v3(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fbtc_cysta_v3(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc;
@@ -9234,60 +9291,64 @@ static void _show_fbtc_cysta_v3(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_rpt_cmn_info *pcinfo;
u8 i, cnt = 0, slot_pair, divide_cnt;
u16 cycle, c_begin, c_end, store_index;
+ char *p = buf, *end = buf + bufsz;
pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
if (!pcinfo->valid)
- return;
+ return 0;
pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v3;
- seq_printf(m,
- " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
- "[cycle_cnt]",
- le16_to_cpu(pcysta->cycles),
- le32_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
- le32_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
- le32_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
- le32_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
+ p += scnprintf(p, end - p,
+ " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
+ "[cycle_cnt]",
+ le16_to_cpu(pcysta->cycles),
+ le32_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
+ le32_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
+ le32_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
+ le32_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
for (i = 0; i < CXST_MAX; i++) {
if (!le32_to_cpu(pcysta->slot_cnt[i]))
continue;
- seq_printf(m, ", %s:%d", id_to_slot(i),
- le32_to_cpu(pcysta->slot_cnt[i]));
+ p += scnprintf(p, end - p, ", %s:%d", id_to_slot(i),
+ le32_to_cpu(pcysta->slot_cnt[i]));
}
if (dm->tdma_now.rxflctrl)
- seq_printf(m, ", leak_rx:%d", le32_to_cpu(pcysta->leak_slot.cnt_rximr));
+ p += scnprintf(p, end - p, ", leak_rx:%d",
+ le32_to_cpu(pcysta->leak_slot.cnt_rximr));
if (le32_to_cpu(pcysta->collision_cnt))
- seq_printf(m, ", collision:%d", le32_to_cpu(pcysta->collision_cnt));
+ p += scnprintf(p, end - p, ", collision:%d",
+ le32_to_cpu(pcysta->collision_cnt));
if (le32_to_cpu(pcysta->skip_cnt))
- seq_printf(m, ", skip:%d", le32_to_cpu(pcysta->skip_cnt));
-
- seq_puts(m, "\n");
-
- seq_printf(m, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
- "[cycle_time]",
- le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
- le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
- le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
- le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
- seq_printf(m,
- ", max_t[wl:%d/bt:%d/lk:%d.%03d]",
- le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
- le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
- le16_to_cpu(pcysta->leak_slot.tmax) / 1000,
- le16_to_cpu(pcysta->leak_slot.tmax) % 1000);
- seq_printf(m,
- ", maxdiff_t[wl:%d/bt:%d]\n",
- le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]),
- le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT]));
+ p += scnprintf(p, end - p, ", skip:%d",
+ le32_to_cpu(pcysta->skip_cnt));
+
+ p += scnprintf(p, end - p, "\n");
+
+ p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
+ "[cycle_time]",
+ le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
+ le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
+ le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
+ le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
+ p += scnprintf(p, end - p,
+ ", max_t[wl:%d/bt:%d/lk:%d.%03d]",
+ le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
+ le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
+ le16_to_cpu(pcysta->leak_slot.tmax) / 1000,
+ le16_to_cpu(pcysta->leak_slot.tmax) % 1000);
+ p += scnprintf(p, end - p,
+ ", maxdiff_t[wl:%d/bt:%d]\n",
+ le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]),
+ le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT]));
cycle = le16_to_cpu(pcysta->cycles);
if (cycle <= 1)
- return;
+ goto out;
/* 1 cycle record 1 wl-slot and 1 bt-slot */
slot_pair = BTC_CYCLE_SLOT_MAX / 2;
@@ -9309,51 +9370,56 @@ static void _show_fbtc_cysta_v3(struct rtw89_dev *rtwdev, struct seq_file *m)
store_index = ((cycle - 1) % slot_pair) * 2;
if (cnt % divide_cnt == 1)
- seq_printf(m, " %-15s : ", "[cycle_step]");
+ p += scnprintf(p, end - p, " %-15s : ",
+ "[cycle_step]");
- seq_printf(m, "->b%02d",
- le16_to_cpu(pcysta->slot_step_time[store_index]));
+ p += scnprintf(p, end - p, "->b%02d",
+ le16_to_cpu(pcysta->slot_step_time[store_index]));
if (a2dp->exist) {
a2dp_trx = &pcysta->a2dp_trx[store_index];
- seq_printf(m, "(%d/%d/%dM/%d/%d/%d)",
- a2dp_trx->empty_cnt,
- a2dp_trx->retry_cnt,
- a2dp_trx->tx_rate ? 3 : 2,
- a2dp_trx->tx_cnt,
- a2dp_trx->ack_cnt,
- a2dp_trx->nack_cnt);
+ p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)",
+ a2dp_trx->empty_cnt,
+ a2dp_trx->retry_cnt,
+ a2dp_trx->tx_rate ? 3 : 2,
+ a2dp_trx->tx_cnt,
+ a2dp_trx->ack_cnt,
+ a2dp_trx->nack_cnt);
}
- seq_printf(m, "->w%02d",
- le16_to_cpu(pcysta->slot_step_time[store_index + 1]));
+ p += scnprintf(p, end - p, "->w%02d",
+ le16_to_cpu(pcysta->slot_step_time[store_index + 1]));
if (a2dp->exist) {
a2dp_trx = &pcysta->a2dp_trx[store_index + 1];
- seq_printf(m, "(%d/%d/%dM/%d/%d/%d)",
- a2dp_trx->empty_cnt,
- a2dp_trx->retry_cnt,
- a2dp_trx->tx_rate ? 3 : 2,
- a2dp_trx->tx_cnt,
- a2dp_trx->ack_cnt,
- a2dp_trx->nack_cnt);
+ p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)",
+ a2dp_trx->empty_cnt,
+ a2dp_trx->retry_cnt,
+ a2dp_trx->tx_rate ? 3 : 2,
+ a2dp_trx->tx_cnt,
+ a2dp_trx->ack_cnt,
+ a2dp_trx->nack_cnt);
}
if (cnt % divide_cnt == 0 || cnt == c_end)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
if (a2dp->exist) {
- seq_printf(m, " %-15s : a2dp_ept:%d, a2dp_late:%d",
- "[a2dp_t_sta]",
- le16_to_cpu(pcysta->a2dp_ept.cnt),
- le16_to_cpu(pcysta->a2dp_ept.cnt_timeout));
+ p += scnprintf(p, end - p,
+ " %-15s : a2dp_ept:%d, a2dp_late:%d",
+ "[a2dp_t_sta]",
+ le16_to_cpu(pcysta->a2dp_ept.cnt),
+ le16_to_cpu(pcysta->a2dp_ept.cnt_timeout));
- seq_printf(m, ", avg_t:%d, max_t:%d",
- le16_to_cpu(pcysta->a2dp_ept.tavg),
- le16_to_cpu(pcysta->a2dp_ept.tmax));
+ p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d",
+ le16_to_cpu(pcysta->a2dp_ept.tavg),
+ le16_to_cpu(pcysta->a2dp_ept.tmax));
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
+
+out:
+ return p - buf;
}
-static void _show_fbtc_cysta_v4(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fbtc_cysta_v4(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc;
@@ -9364,62 +9430,64 @@ static void _show_fbtc_cysta_v4(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_rpt_cmn_info *pcinfo;
u8 i, cnt = 0, slot_pair, divide_cnt;
u16 cycle, c_begin, c_end, store_index;
+ char *p = buf, *end = buf + bufsz;
pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
if (!pcinfo->valid)
- return;
+ return 0;
pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v4;
- seq_printf(m,
- " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
- "[cycle_cnt]",
- le16_to_cpu(pcysta->cycles),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
+ p += scnprintf(p, end - p,
+ " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
+ "[cycle_cnt]",
+ le16_to_cpu(pcysta->cycles),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
for (i = 0; i < CXST_MAX; i++) {
if (!le16_to_cpu(pcysta->slot_cnt[i]))
continue;
- seq_printf(m, ", %s:%d", id_to_slot(i),
- le16_to_cpu(pcysta->slot_cnt[i]));
+ p += scnprintf(p, end - p, ", %s:%d", id_to_slot(i),
+ le16_to_cpu(pcysta->slot_cnt[i]));
}
if (dm->tdma_now.rxflctrl)
- seq_printf(m, ", leak_rx:%d",
- le32_to_cpu(pcysta->leak_slot.cnt_rximr));
+ p += scnprintf(p, end - p, ", leak_rx:%d",
+ le32_to_cpu(pcysta->leak_slot.cnt_rximr));
if (pcysta->collision_cnt)
- seq_printf(m, ", collision:%d", pcysta->collision_cnt);
+ p += scnprintf(p, end - p, ", collision:%d",
+ pcysta->collision_cnt);
if (le16_to_cpu(pcysta->skip_cnt))
- seq_printf(m, ", skip:%d",
- le16_to_cpu(pcysta->skip_cnt));
-
- seq_puts(m, "\n");
-
- seq_printf(m, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
- "[cycle_time]",
- le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
- le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
- le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
- le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
- seq_printf(m,
- ", max_t[wl:%d/bt:%d/lk:%d.%03d]",
- le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
- le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
- le16_to_cpu(pcysta->leak_slot.tmax) / 1000,
- le16_to_cpu(pcysta->leak_slot.tmax) % 1000);
- seq_printf(m,
- ", maxdiff_t[wl:%d/bt:%d]\n",
- le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]),
- le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT]));
+ p += scnprintf(p, end - p, ", skip:%d",
+ le16_to_cpu(pcysta->skip_cnt));
+
+ p += scnprintf(p, end - p, "\n");
+
+ p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
+ "[cycle_time]",
+ le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
+ le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
+ le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
+ le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
+ p += scnprintf(p, end - p,
+ ", max_t[wl:%d/bt:%d/lk:%d.%03d]",
+ le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
+ le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
+ le16_to_cpu(pcysta->leak_slot.tmax) / 1000,
+ le16_to_cpu(pcysta->leak_slot.tmax) % 1000);
+ p += scnprintf(p, end - p,
+ ", maxdiff_t[wl:%d/bt:%d]\n",
+ le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]),
+ le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT]));
cycle = le16_to_cpu(pcysta->cycles);
if (cycle <= 1)
- return;
+ goto out;
/* 1 cycle record 1 wl-slot and 1 bt-slot */
slot_pair = BTC_CYCLE_SLOT_MAX / 2;
@@ -9441,51 +9509,56 @@ static void _show_fbtc_cysta_v4(struct rtw89_dev *rtwdev, struct seq_file *m)
store_index = ((cycle - 1) % slot_pair) * 2;
if (cnt % divide_cnt == 1)
- seq_printf(m, " %-15s : ", "[cycle_step]");
+ p += scnprintf(p, end - p, " %-15s : ",
+ "[cycle_step]");
- seq_printf(m, "->b%02d",
- le16_to_cpu(pcysta->slot_step_time[store_index]));
+ p += scnprintf(p, end - p, "->b%02d",
+ le16_to_cpu(pcysta->slot_step_time[store_index]));
if (a2dp->exist) {
a2dp_trx = &pcysta->a2dp_trx[store_index];
- seq_printf(m, "(%d/%d/%dM/%d/%d/%d)",
- a2dp_trx->empty_cnt,
- a2dp_trx->retry_cnt,
- a2dp_trx->tx_rate ? 3 : 2,
- a2dp_trx->tx_cnt,
- a2dp_trx->ack_cnt,
- a2dp_trx->nack_cnt);
+ p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)",
+ a2dp_trx->empty_cnt,
+ a2dp_trx->retry_cnt,
+ a2dp_trx->tx_rate ? 3 : 2,
+ a2dp_trx->tx_cnt,
+ a2dp_trx->ack_cnt,
+ a2dp_trx->nack_cnt);
}
- seq_printf(m, "->w%02d",
- le16_to_cpu(pcysta->slot_step_time[store_index + 1]));
+ p += scnprintf(p, end - p, "->w%02d",
+ le16_to_cpu(pcysta->slot_step_time[store_index + 1]));
if (a2dp->exist) {
a2dp_trx = &pcysta->a2dp_trx[store_index + 1];
- seq_printf(m, "(%d/%d/%dM/%d/%d/%d)",
- a2dp_trx->empty_cnt,
- a2dp_trx->retry_cnt,
- a2dp_trx->tx_rate ? 3 : 2,
- a2dp_trx->tx_cnt,
- a2dp_trx->ack_cnt,
- a2dp_trx->nack_cnt);
+ p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)",
+ a2dp_trx->empty_cnt,
+ a2dp_trx->retry_cnt,
+ a2dp_trx->tx_rate ? 3 : 2,
+ a2dp_trx->tx_cnt,
+ a2dp_trx->ack_cnt,
+ a2dp_trx->nack_cnt);
}
if (cnt % divide_cnt == 0 || cnt == c_end)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
if (a2dp->exist) {
- seq_printf(m, " %-15s : a2dp_ept:%d, a2dp_late:%d",
- "[a2dp_t_sta]",
- le16_to_cpu(pcysta->a2dp_ept.cnt),
- le16_to_cpu(pcysta->a2dp_ept.cnt_timeout));
+ p += scnprintf(p, end - p,
+ " %-15s : a2dp_ept:%d, a2dp_late:%d",
+ "[a2dp_t_sta]",
+ le16_to_cpu(pcysta->a2dp_ept.cnt),
+ le16_to_cpu(pcysta->a2dp_ept.cnt_timeout));
- seq_printf(m, ", avg_t:%d, max_t:%d",
- le16_to_cpu(pcysta->a2dp_ept.tavg),
- le16_to_cpu(pcysta->a2dp_ept.tmax));
+ p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d",
+ le16_to_cpu(pcysta->a2dp_ept.tavg),
+ le16_to_cpu(pcysta->a2dp_ept.tmax));
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
+
+out:
+ return p - buf;
}
-static void _show_fbtc_cysta_v5(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fbtc_cysta_v5(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc;
@@ -9496,58 +9569,60 @@ static void _show_fbtc_cysta_v5(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_rpt_cmn_info *pcinfo;
u8 i, cnt = 0, slot_pair, divide_cnt;
u16 cycle, c_begin, c_end, store_index;
+ char *p = buf, *end = buf + bufsz;
pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
if (!pcinfo->valid)
- return;
+ return 0;
pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v5;
- seq_printf(m,
- " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
- "[cycle_cnt]",
- le16_to_cpu(pcysta->cycles),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
+ p += scnprintf(p, end - p,
+ " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]",
+ "[cycle_cnt]",
+ le16_to_cpu(pcysta->cycles),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
for (i = 0; i < CXST_MAX; i++) {
if (!le16_to_cpu(pcysta->slot_cnt[i]))
continue;
- seq_printf(m, ", %s:%d", id_to_slot(i),
- le16_to_cpu(pcysta->slot_cnt[i]));
+ p += scnprintf(p, end - p, ", %s:%d", id_to_slot(i),
+ le16_to_cpu(pcysta->slot_cnt[i]));
}
if (dm->tdma_now.rxflctrl)
- seq_printf(m, ", leak_rx:%d",
- le32_to_cpu(pcysta->leak_slot.cnt_rximr));
+ p += scnprintf(p, end - p, ", leak_rx:%d",
+ le32_to_cpu(pcysta->leak_slot.cnt_rximr));
if (pcysta->collision_cnt)
- seq_printf(m, ", collision:%d", pcysta->collision_cnt);
+ p += scnprintf(p, end - p, ", collision:%d",
+ pcysta->collision_cnt);
if (le16_to_cpu(pcysta->skip_cnt))
- seq_printf(m, ", skip:%d",
- le16_to_cpu(pcysta->skip_cnt));
-
- seq_puts(m, "\n");
-
- seq_printf(m, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
- "[cycle_time]",
- le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
- le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
- le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
- le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
- seq_printf(m,
- ", max_t[wl:%d/bt:%d/lk:%d.%03d]\n",
- le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
- le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
- le16_to_cpu(pcysta->leak_slot.tmax) / 1000,
- le16_to_cpu(pcysta->leak_slot.tmax) % 1000);
+ p += scnprintf(p, end - p, ", skip:%d",
+ le16_to_cpu(pcysta->skip_cnt));
+
+ p += scnprintf(p, end - p, "\n");
+
+ p += scnprintf(p, end - p, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
+ "[cycle_time]",
+ le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
+ le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
+ le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
+ le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
+ p += scnprintf(p, end - p,
+ ", max_t[wl:%d/bt:%d/lk:%d.%03d]\n",
+ le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
+ le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
+ le16_to_cpu(pcysta->leak_slot.tmax) / 1000,
+ le16_to_cpu(pcysta->leak_slot.tmax) % 1000);
cycle = le16_to_cpu(pcysta->cycles);
if (cycle <= 1)
- return;
+ goto out;
/* 1 cycle record 1 wl-slot and 1 bt-slot */
slot_pair = BTC_CYCLE_SLOT_MAX / 2;
@@ -9565,58 +9640,63 @@ static void _show_fbtc_cysta_v5(struct rtw89_dev *rtwdev, struct seq_file *m)
divide_cnt = BTC_CYCLE_SLOT_MAX / 4;
if (c_begin > c_end)
- return;
+ goto out;
for (cycle = c_begin; cycle <= c_end; cycle++) {
cnt++;
store_index = ((cycle - 1) % slot_pair) * 2;
if (cnt % divide_cnt == 1)
- seq_printf(m, " %-15s : ", "[cycle_step]");
+ p += scnprintf(p, end - p, " %-15s : ",
+ "[cycle_step]");
- seq_printf(m, "->b%02d",
- le16_to_cpu(pcysta->slot_step_time[store_index]));
+ p += scnprintf(p, end - p, "->b%02d",
+ le16_to_cpu(pcysta->slot_step_time[store_index]));
if (a2dp->exist) {
a2dp_trx = &pcysta->a2dp_trx[store_index];
- seq_printf(m, "(%d/%d/%dM/%d/%d/%d)",
- a2dp_trx->empty_cnt,
- a2dp_trx->retry_cnt,
- a2dp_trx->tx_rate ? 3 : 2,
- a2dp_trx->tx_cnt,
- a2dp_trx->ack_cnt,
- a2dp_trx->nack_cnt);
+ p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)",
+ a2dp_trx->empty_cnt,
+ a2dp_trx->retry_cnt,
+ a2dp_trx->tx_rate ? 3 : 2,
+ a2dp_trx->tx_cnt,
+ a2dp_trx->ack_cnt,
+ a2dp_trx->nack_cnt);
}
- seq_printf(m, "->w%02d",
- le16_to_cpu(pcysta->slot_step_time[store_index + 1]));
+ p += scnprintf(p, end - p, "->w%02d",
+ le16_to_cpu(pcysta->slot_step_time[store_index + 1]));
if (a2dp->exist) {
a2dp_trx = &pcysta->a2dp_trx[store_index + 1];
- seq_printf(m, "(%d/%d/%dM/%d/%d/%d)",
- a2dp_trx->empty_cnt,
- a2dp_trx->retry_cnt,
- a2dp_trx->tx_rate ? 3 : 2,
- a2dp_trx->tx_cnt,
- a2dp_trx->ack_cnt,
- a2dp_trx->nack_cnt);
+ p += scnprintf(p, end - p, "(%d/%d/%dM/%d/%d/%d)",
+ a2dp_trx->empty_cnt,
+ a2dp_trx->retry_cnt,
+ a2dp_trx->tx_rate ? 3 : 2,
+ a2dp_trx->tx_cnt,
+ a2dp_trx->ack_cnt,
+ a2dp_trx->nack_cnt);
}
if (cnt % divide_cnt == 0 || cnt == c_end)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
if (a2dp->exist) {
- seq_printf(m, " %-15s : a2dp_ept:%d, a2dp_late:%d",
- "[a2dp_t_sta]",
- le16_to_cpu(pcysta->a2dp_ept.cnt),
- le16_to_cpu(pcysta->a2dp_ept.cnt_timeout));
+ p += scnprintf(p, end - p,
+ " %-15s : a2dp_ept:%d, a2dp_late:%d",
+ "[a2dp_t_sta]",
+ le16_to_cpu(pcysta->a2dp_ept.cnt),
+ le16_to_cpu(pcysta->a2dp_ept.cnt_timeout));
- seq_printf(m, ", avg_t:%d, max_t:%d",
- le16_to_cpu(pcysta->a2dp_ept.tavg),
- le16_to_cpu(pcysta->a2dp_ept.tmax));
+ p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d",
+ le16_to_cpu(pcysta->a2dp_ept.tavg),
+ le16_to_cpu(pcysta->a2dp_ept.tmax));
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
+
+out:
+ return p - buf;
}
-static void _show_fbtc_cysta_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fbtc_cysta_v7(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc_bt_info *bt = &rtwdev->btc.cx.bt;
struct rtw89_btc_bt_a2dp_desc *a2dp = &bt->link_info.a2dp_desc;
@@ -9624,68 +9704,75 @@ static void _show_fbtc_cysta_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_fbtc_cysta_v7 *pcysta = NULL;
struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
struct rtw89_btc_rpt_cmn_info *pcinfo;
+ char *p = buf, *end = buf + bufsz;
u16 cycle, c_begin, c_end, s_id;
u8 i, cnt = 0, divide_cnt;
u8 slot_pair;
pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo;
if (!pcinfo->valid)
- return;
+ return 0;
pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v7;
- seq_printf(m, "\n\r %-15s : cycle:%d", "[slot_stat]",
- le16_to_cpu(pcysta->cycles));
+ p += scnprintf(p, end - p, "\n\r %-15s : cycle:%d", "[slot_stat]",
+ le16_to_cpu(pcysta->cycles));
for (i = 0; i < CXST_MAX; i++) {
if (!le16_to_cpu(pcysta->slot_cnt[i]))
continue;
- seq_printf(m, ", %s:%d",
- id_to_slot(i), le16_to_cpu(pcysta->slot_cnt[i]));
+ p += scnprintf(p, end - p, ", %s:%d",
+ id_to_slot(i),
+ le16_to_cpu(pcysta->slot_cnt[i]));
}
if (dm->tdma_now.rxflctrl)
- seq_printf(m, ", leak_rx:%d",
- le32_to_cpu(pcysta->leak_slot.cnt_rximr));
+ p += scnprintf(p, end - p, ", leak_rx:%d",
+ le32_to_cpu(pcysta->leak_slot.cnt_rximr));
if (pcysta->collision_cnt)
- seq_printf(m, ", collision:%d", pcysta->collision_cnt);
+ p += scnprintf(p, end - p, ", collision:%d",
+ pcysta->collision_cnt);
if (pcysta->skip_cnt)
- seq_printf(m, ", skip:%d", le16_to_cpu(pcysta->skip_cnt));
-
- seq_printf(m, "\n\r %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
- "[cycle_stat]",
- le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
- le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
- le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
- le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
- seq_printf(m, ", max_t[wl:%d/bt:%d(>%dms:%d)/lk:%d.%03d]",
- le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
- le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
- dm->bt_slot_flood, dm->cnt_dm[BTC_DCNT_BT_SLOT_FLOOD],
- le16_to_cpu(pcysta->leak_slot.tamx) / 1000,
- le16_to_cpu(pcysta->leak_slot.tamx) % 1000);
- seq_printf(m, ", bcn[all:%d/ok:%d/in_bt:%d/in_bt_ok:%d]",
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
- le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
+ p += scnprintf(p, end - p, ", skip:%d",
+ le16_to_cpu(pcysta->skip_cnt));
+
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]",
+ "[cycle_stat]",
+ le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]),
+ le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]),
+ le16_to_cpu(pcysta->leak_slot.tavg) / 1000,
+ le16_to_cpu(pcysta->leak_slot.tavg) % 1000);
+ p += scnprintf(p, end - p,
+ ", max_t[wl:%d/bt:%d(>%dms:%d)/lk:%d.%03d]",
+ le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]),
+ le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]),
+ dm->bt_slot_flood, dm->cnt_dm[BTC_DCNT_BT_SLOT_FLOOD],
+ le16_to_cpu(pcysta->leak_slot.tamx) / 1000,
+ le16_to_cpu(pcysta->leak_slot.tamx) % 1000);
+ p += scnprintf(p, end - p, ", bcn[all:%d/ok:%d/in_bt:%d/in_bt_ok:%d]",
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]),
+ le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK]));
if (a2dp->exist) {
- seq_printf(m,
- "\n\r %-15s : a2dp_ept:%d, a2dp_late:%d(streak 2S:%d/max:%d)",
- "[a2dp_stat]",
- le16_to_cpu(pcysta->a2dp_ept.cnt),
- le16_to_cpu(pcysta->a2dp_ept.cnt_timeout),
- a2dp->no_empty_streak_2s, a2dp->no_empty_streak_max);
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : a2dp_ept:%d, a2dp_late:%d(streak 2S:%d/max:%d)",
+ "[a2dp_stat]",
+ le16_to_cpu(pcysta->a2dp_ept.cnt),
+ le16_to_cpu(pcysta->a2dp_ept.cnt_timeout),
+ a2dp->no_empty_streak_2s,
+ a2dp->no_empty_streak_max);
- seq_printf(m, ", avg_t:%d, max_t:%d",
- le16_to_cpu(pcysta->a2dp_ept.tavg),
- le16_to_cpu(pcysta->a2dp_ept.tmax));
+ p += scnprintf(p, end - p, ", avg_t:%d, max_t:%d",
+ le16_to_cpu(pcysta->a2dp_ept.tavg),
+ le16_to_cpu(pcysta->a2dp_ept.tmax));
}
if (le16_to_cpu(pcysta->cycles) <= 1)
- return;
+ goto out;
/* 1 cycle = 1 wl-slot + 1 bt-slot */
slot_pair = BTC_CYCLE_SLOT_MAX / 2;
@@ -9703,7 +9790,7 @@ static void _show_fbtc_cysta_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
divide_cnt = 6;
if (c_begin > c_end)
- return;
+ goto out;
for (cycle = c_begin; cycle <= c_end; cycle++) {
cnt++;
@@ -9711,129 +9798,142 @@ static void _show_fbtc_cysta_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
if (cnt % divide_cnt == 1) {
if (a2dp->exist)
- seq_printf(m, "\n\r %-15s : ", "[slotT_wermtan]");
+ p += scnprintf(p, end - p, "\n\r %-15s : ",
+ "[slotT_wermtan]");
else
- seq_printf(m, "\n\r %-15s : ", "[slotT_rxerr]");
+ p += scnprintf(p, end - p, "\n\r %-15s : ",
+ "[slotT_rxerr]");
}
- seq_printf(m, "->b%d", le16_to_cpu(pcysta->slot_step_time[s_id]));
+ p += scnprintf(p, end - p, "->b%d",
+ le16_to_cpu(pcysta->slot_step_time[s_id]));
if (a2dp->exist)
- seq_printf(m, "(%d/%d/%d/%dM/%d/%d/%d)",
- pcysta->wl_rx_err_ratio[s_id],
- pcysta->a2dp_trx[s_id].empty_cnt,
- pcysta->a2dp_trx[s_id].retry_cnt,
- (pcysta->a2dp_trx[s_id].tx_rate ? 3 : 2),
- pcysta->a2dp_trx[s_id].tx_cnt,
- pcysta->a2dp_trx[s_id].ack_cnt,
- pcysta->a2dp_trx[s_id].nack_cnt);
+ p += scnprintf(p, end - p, "(%d/%d/%d/%dM/%d/%d/%d)",
+ pcysta->wl_rx_err_ratio[s_id],
+ pcysta->a2dp_trx[s_id].empty_cnt,
+ pcysta->a2dp_trx[s_id].retry_cnt,
+ (pcysta->a2dp_trx[s_id].tx_rate ? 3 : 2),
+ pcysta->a2dp_trx[s_id].tx_cnt,
+ pcysta->a2dp_trx[s_id].ack_cnt,
+ pcysta->a2dp_trx[s_id].nack_cnt);
else
- seq_printf(m, "(%d)", pcysta->wl_rx_err_ratio[s_id]);
+ p += scnprintf(p, end - p, "(%d)",
+ pcysta->wl_rx_err_ratio[s_id]);
- seq_printf(m, "->w%d", le16_to_cpu(pcysta->slot_step_time[s_id + 1]));
+ p += scnprintf(p, end - p, "->w%d",
+ le16_to_cpu(pcysta->slot_step_time[s_id + 1]));
if (a2dp->exist)
- seq_printf(m, "(%d/%d/%d/%dM/%d/%d/%d)",
- pcysta->wl_rx_err_ratio[s_id + 1],
- pcysta->a2dp_trx[s_id + 1].empty_cnt,
- pcysta->a2dp_trx[s_id + 1].retry_cnt,
- (pcysta->a2dp_trx[s_id + 1].tx_rate ? 3 : 2),
- pcysta->a2dp_trx[s_id + 1].tx_cnt,
- pcysta->a2dp_trx[s_id + 1].ack_cnt,
- pcysta->a2dp_trx[s_id + 1].nack_cnt);
+ p += scnprintf(p, end - p, "(%d/%d/%d/%dM/%d/%d/%d)",
+ pcysta->wl_rx_err_ratio[s_id + 1],
+ pcysta->a2dp_trx[s_id + 1].empty_cnt,
+ pcysta->a2dp_trx[s_id + 1].retry_cnt,
+ (pcysta->a2dp_trx[s_id + 1].tx_rate ? 3 : 2),
+ pcysta->a2dp_trx[s_id + 1].tx_cnt,
+ pcysta->a2dp_trx[s_id + 1].ack_cnt,
+ pcysta->a2dp_trx[s_id + 1].nack_cnt);
else
- seq_printf(m, "(%d)", pcysta->wl_rx_err_ratio[s_id + 1]);
+ p += scnprintf(p, end - p, "(%d)",
+ pcysta->wl_rx_err_ratio[s_id + 1]);
}
+
+out:
+ return p - buf;
}
-static void _show_fbtc_nullsta(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fbtc_nullsta(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
const struct rtw89_btc_ver *ver = btc->ver;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
struct rtw89_btc_rpt_cmn_info *pcinfo;
union rtw89_btc_fbtc_cynullsta_info *ns;
+ char *p = buf, *end = buf + bufsz;
u8 i = 0;
if (!btc->dm.tdma_now.rxflctrl)
- return;
+ return 0;
pcinfo = &pfwinfo->rpt_fbtc_nullsta.cinfo;
if (!pcinfo->valid)
- return;
+ return 0;
ns = &pfwinfo->rpt_fbtc_nullsta.finfo;
if (ver->fcxnullsta == 1) {
for (i = 0; i < 2; i++) {
- seq_printf(m, " %-15s : ", "[NULL-STA]");
- seq_printf(m, "null-%d", i);
- seq_printf(m, "[ok:%d/",
- le32_to_cpu(ns->v1.result[i][1]));
- seq_printf(m, "fail:%d/",
- le32_to_cpu(ns->v1.result[i][0]));
- seq_printf(m, "on_time:%d/",
- le32_to_cpu(ns->v1.result[i][2]));
- seq_printf(m, "retry:%d/",
- le32_to_cpu(ns->v1.result[i][3]));
- seq_printf(m, "avg_t:%d.%03d/",
- le32_to_cpu(ns->v1.avg_t[i]) / 1000,
- le32_to_cpu(ns->v1.avg_t[i]) % 1000);
- seq_printf(m, "max_t:%d.%03d]\n",
- le32_to_cpu(ns->v1.max_t[i]) / 1000,
- le32_to_cpu(ns->v1.max_t[i]) % 1000);
+ p += scnprintf(p, end - p, " %-15s : ", "[NULL-STA]");
+ p += scnprintf(p, end - p, "null-%d", i);
+ p += scnprintf(p, end - p, "[ok:%d/",
+ le32_to_cpu(ns->v1.result[i][1]));
+ p += scnprintf(p, end - p, "fail:%d/",
+ le32_to_cpu(ns->v1.result[i][0]));
+ p += scnprintf(p, end - p, "on_time:%d/",
+ le32_to_cpu(ns->v1.result[i][2]));
+ p += scnprintf(p, end - p, "retry:%d/",
+ le32_to_cpu(ns->v1.result[i][3]));
+ p += scnprintf(p, end - p, "avg_t:%d.%03d/",
+ le32_to_cpu(ns->v1.avg_t[i]) / 1000,
+ le32_to_cpu(ns->v1.avg_t[i]) % 1000);
+ p += scnprintf(p, end - p, "max_t:%d.%03d]\n",
+ le32_to_cpu(ns->v1.max_t[i]) / 1000,
+ le32_to_cpu(ns->v1.max_t[i]) % 1000);
}
} else if (ver->fcxnullsta == 7) {
for (i = 0; i < 2; i++) {
- seq_printf(m, " %-15s : ", "[NULL-STA]");
- seq_printf(m, "null-%d", i);
- seq_printf(m, "[Tx:%d/",
- le32_to_cpu(ns->v7.result[i][4]));
- seq_printf(m, "[ok:%d/",
- le32_to_cpu(ns->v7.result[i][1]));
- seq_printf(m, "fail:%d/",
- le32_to_cpu(ns->v7.result[i][0]));
- seq_printf(m, "on_time:%d/",
- le32_to_cpu(ns->v7.result[i][2]));
- seq_printf(m, "retry:%d/",
- le32_to_cpu(ns->v7.result[i][3]));
- seq_printf(m, "avg_t:%d.%03d/",
- le32_to_cpu(ns->v7.tavg[i]) / 1000,
- le32_to_cpu(ns->v7.tavg[i]) % 1000);
- seq_printf(m, "max_t:%d.%03d]\n",
- le32_to_cpu(ns->v7.tmax[i]) / 1000,
- le32_to_cpu(ns->v7.tmax[i]) % 1000);
+ p += scnprintf(p, end - p, " %-15s : ", "[NULL-STA]");
+ p += scnprintf(p, end - p, "null-%d", i);
+ p += scnprintf(p, end - p, "[Tx:%d/",
+ le32_to_cpu(ns->v7.result[i][4]));
+ p += scnprintf(p, end - p, "[ok:%d/",
+ le32_to_cpu(ns->v7.result[i][1]));
+ p += scnprintf(p, end - p, "fail:%d/",
+ le32_to_cpu(ns->v7.result[i][0]));
+ p += scnprintf(p, end - p, "on_time:%d/",
+ le32_to_cpu(ns->v7.result[i][2]));
+ p += scnprintf(p, end - p, "retry:%d/",
+ le32_to_cpu(ns->v7.result[i][3]));
+ p += scnprintf(p, end - p, "avg_t:%d.%03d/",
+ le32_to_cpu(ns->v7.tavg[i]) / 1000,
+ le32_to_cpu(ns->v7.tavg[i]) % 1000);
+ p += scnprintf(p, end - p, "max_t:%d.%03d]\n",
+ le32_to_cpu(ns->v7.tmax[i]) / 1000,
+ le32_to_cpu(ns->v7.tmax[i]) % 1000);
}
} else {
for (i = 0; i < 2; i++) {
- seq_printf(m, " %-15s : ", "[NULL-STA]");
- seq_printf(m, "null-%d", i);
- seq_printf(m, "[Tx:%d/",
- le32_to_cpu(ns->v2.result[i][4]));
- seq_printf(m, "[ok:%d/",
- le32_to_cpu(ns->v2.result[i][1]));
- seq_printf(m, "fail:%d/",
- le32_to_cpu(ns->v2.result[i][0]));
- seq_printf(m, "on_time:%d/",
- le32_to_cpu(ns->v2.result[i][2]));
- seq_printf(m, "retry:%d/",
- le32_to_cpu(ns->v2.result[i][3]));
- seq_printf(m, "avg_t:%d.%03d/",
- le32_to_cpu(ns->v2.avg_t[i]) / 1000,
- le32_to_cpu(ns->v2.avg_t[i]) % 1000);
- seq_printf(m, "max_t:%d.%03d]\n",
- le32_to_cpu(ns->v2.max_t[i]) / 1000,
- le32_to_cpu(ns->v2.max_t[i]) % 1000);
+ p += scnprintf(p, end - p, " %-15s : ", "[NULL-STA]");
+ p += scnprintf(p, end - p, "null-%d", i);
+ p += scnprintf(p, end - p, "[Tx:%d/",
+ le32_to_cpu(ns->v2.result[i][4]));
+ p += scnprintf(p, end - p, "[ok:%d/",
+ le32_to_cpu(ns->v2.result[i][1]));
+ p += scnprintf(p, end - p, "fail:%d/",
+ le32_to_cpu(ns->v2.result[i][0]));
+ p += scnprintf(p, end - p, "on_time:%d/",
+ le32_to_cpu(ns->v2.result[i][2]));
+ p += scnprintf(p, end - p, "retry:%d/",
+ le32_to_cpu(ns->v2.result[i][3]));
+ p += scnprintf(p, end - p, "avg_t:%d.%03d/",
+ le32_to_cpu(ns->v2.avg_t[i]) / 1000,
+ le32_to_cpu(ns->v2.avg_t[i]) % 1000);
+ p += scnprintf(p, end - p, "max_t:%d.%03d]\n",
+ le32_to_cpu(ns->v2.max_t[i]) / 1000,
+ le32_to_cpu(ns->v2.max_t[i]) % 1000);
}
}
+
+ return p - buf;
}
-static void _show_fbtc_step_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fbtc_step_v2(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
struct rtw89_btc_rpt_cmn_info *pcinfo = NULL;
struct rtw89_btc_fbtc_steps_v2 *pstep = NULL;
const struct rtw89_btc_ver *ver = btc->ver;
+ char *p = buf, *end = buf + bufsz;
u8 type, val, cnt = 0, state = 0;
bool outloop = false;
u16 i, diff_t, n_start = 0, n_stop = 0;
@@ -9841,14 +9941,14 @@ static void _show_fbtc_step_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
pcinfo = &pfwinfo->rpt_fbtc_step.cinfo;
if (!pcinfo->valid)
- return;
+ return 0;
pstep = &pfwinfo->rpt_fbtc_step.finfo.v2;
pos_old = le16_to_cpu(pstep->pos_old);
pos_new = le16_to_cpu(pstep->pos_new);
if (pcinfo->req_fver != pstep->fver)
- return;
+ return 0;
/* store step info by using ring instead of FIFO*/
do {
@@ -9877,13 +9977,15 @@ static void _show_fbtc_step_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
continue;
if (cnt % 10 == 0)
- seq_printf(m, " %-15s : ", "[steps]");
+ p += scnprintf(p, end - p,
+ " %-15s : ", "[steps]");
- seq_printf(m, "-> %s(%02d)(%02d)",
- (type == CXSTEP_SLOT ? "SLT" :
- "EVT"), (u32)val, diff_t);
+ p += scnprintf(p, end - p,
+ "-> %s(%02d)(%02d)",
+ (type == CXSTEP_SLOT ? "SLT" :
+ "EVT"), (u32)val, diff_t);
if (cnt % 10 == 9)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
cnt++;
}
@@ -9900,29 +10002,32 @@ static void _show_fbtc_step_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
break;
}
} while (!outloop);
+
+ return p - buf;
}
-static void _show_fbtc_step_v3(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fbtc_step_v3(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
struct rtw89_btc_rpt_cmn_info *pcinfo;
struct rtw89_btc_fbtc_steps_v3 *pstep;
u32 i, n_begin, n_end, array_idx, cnt = 0;
+ char *p = buf, *end = buf + bufsz;
u8 type, val;
u16 diff_t;
if ((pfwinfo->rpt_en_map &
rtw89_btc_fw_rpt_ver(rtwdev, RPT_EN_FW_STEP_INFO)) == 0)
- return;
+ return 0;
pcinfo = &pfwinfo->rpt_fbtc_step.cinfo;
if (!pcinfo->valid)
- return;
+ return 0;
pstep = &pfwinfo->rpt_fbtc_step.finfo.v3;
if (pcinfo->req_fver != pstep->fver)
- return;
+ return 0;
if (le32_to_cpu(pstep->cnt) <= FCXDEF_STEP)
n_begin = 1;
@@ -9932,7 +10037,7 @@ static void _show_fbtc_step_v3(struct rtw89_dev *rtwdev, struct seq_file *m)
n_end = le32_to_cpu(pstep->cnt);
if (n_begin > n_end)
- return;
+ return 0;
/* restore step info by using ring instead of FIFO */
for (i = n_begin; i <= n_end; i++) {
@@ -9945,50 +10050,55 @@ static void _show_fbtc_step_v3(struct rtw89_dev *rtwdev, struct seq_file *m)
continue;
if (cnt % 10 == 0)
- seq_printf(m, " %-15s : ", "[steps]");
+ p += scnprintf(p, end - p, " %-15s : ", "[steps]");
- seq_printf(m, "-> %s(%02d)",
- (type == CXSTEP_SLOT ?
- id_to_slot((u32)val) :
- id_to_evt((u32)val)), diff_t);
+ p += scnprintf(p, end - p, "-> %s(%02d)",
+ (type == CXSTEP_SLOT ?
+ id_to_slot((u32)val) :
+ id_to_evt((u32)val)), diff_t);
if (cnt % 10 == 9)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
cnt++;
}
+
+ return p - buf;
}
-static void _show_fw_dm_msg(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_fw_dm_msg(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
const struct rtw89_btc_ver *ver = btc->ver;
+ char *p = buf, *end = buf + bufsz;
if (!(btc->dm.coex_info_map & BTC_COEX_INFO_DM))
- return;
+ goto out;
- _show_error(rtwdev, m);
- _show_fbtc_tdma(rtwdev, m);
- _show_fbtc_slots(rtwdev, m);
+ p += _show_error(rtwdev, p, end - p);
+ p += _show_fbtc_tdma(rtwdev, p, end - p);
+ p += _show_fbtc_slots(rtwdev, p, end - p);
if (ver->fcxcysta == 2)
- _show_fbtc_cysta_v2(rtwdev, m);
+ p += _show_fbtc_cysta_v2(rtwdev, p, end - p);
else if (ver->fcxcysta == 3)
- _show_fbtc_cysta_v3(rtwdev, m);
+ p += _show_fbtc_cysta_v3(rtwdev, p, end - p);
else if (ver->fcxcysta == 4)
- _show_fbtc_cysta_v4(rtwdev, m);
+ p += _show_fbtc_cysta_v4(rtwdev, p, end - p);
else if (ver->fcxcysta == 5)
- _show_fbtc_cysta_v5(rtwdev, m);
+ p += _show_fbtc_cysta_v5(rtwdev, p, end - p);
else if (ver->fcxcysta == 7)
- _show_fbtc_cysta_v7(rtwdev, m);
+ p += _show_fbtc_cysta_v7(rtwdev, p, end - p);
- _show_fbtc_nullsta(rtwdev, m);
+ p += _show_fbtc_nullsta(rtwdev, p, end - p);
if (ver->fcxstep == 2)
- _show_fbtc_step_v2(rtwdev, m);
+ p += _show_fbtc_step_v2(rtwdev, p, end - p);
else if (ver->fcxstep == 3)
- _show_fbtc_step_v3(rtwdev, m);
+ p += _show_fbtc_step_v3(rtwdev, p, end - p);
+out:
+ return p - buf;
}
static void _get_gnt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_coex_gnt *gnt_cfg)
@@ -10033,12 +10143,13 @@ static void _get_gnt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_coex_gnt *gnt
}
}
-static void _show_gpio_dbg(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_gpio_dbg(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo;
const struct rtw89_btc_ver *ver = rtwdev->btc.ver;
struct rtw89_btc_rpt_cmn_info *pcinfo = NULL;
union rtw89_btc_fbtc_gpio_dbg *gdbg = NULL;
+ char *p = buf, *end = buf + bufsz;
u8 *gpio_map, i;
u32 en_map;
@@ -10048,8 +10159,8 @@ static void _show_gpio_dbg(struct rtw89_dev *rtwdev, struct seq_file *m)
rtw89_debug(rtwdev, RTW89_DBG_BTC,
"[BTC], %s(): stop due rpt_fbtc_gpio_dbg.cinfo\n",
__func__);
- seq_puts(m, "\n");
- return;
+ p += scnprintf(p, end - p, "\n");
+ goto out;
}
if (ver->fcxgpiodbg == 7) {
@@ -10061,20 +10172,24 @@ static void _show_gpio_dbg(struct rtw89_dev *rtwdev, struct seq_file *m)
}
if (!en_map)
- return;
+ goto out;
- seq_printf(m, " %-15s : enable_map:0x%08x",
- "[gpio_dbg]", en_map);
+ p += scnprintf(p, end - p, " %-15s : enable_map:0x%08x",
+ "[gpio_dbg]", en_map);
for (i = 0; i < BTC_DBG_MAX1; i++) {
if (!(en_map & BIT(i)))
continue;
- seq_printf(m, ", %s->GPIO%d", id_to_gdbg(i), gpio_map[i]);
+ p += scnprintf(p, end - p, ", %s->GPIO%d", id_to_gdbg(i),
+ gpio_map[i]);
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
+
+out:
+ return p - buf;
}
-static void _show_mreg_v1(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_mreg_v1(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
struct rtw89_btc *btc = &rtwdev->btc;
@@ -10086,45 +10201,47 @@ static void _show_mreg_v1(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_bt_info *bt = &btc->cx.bt;
struct rtw89_mac_ax_coex_gnt gnt_cfg = {};
struct rtw89_mac_ax_gnt gnt;
+ char *p = buf, *end = buf + bufsz;
u8 i = 0, type = 0, cnt = 0;
u32 val, offset;
if (!(btc->dm.coex_info_map & BTC_COEX_INFO_MREG))
- return;
+ return 0;
- seq_puts(m, "========== [HW Status] ==========\n");
+ p += scnprintf(p, end - p, "========== [HW Status] ==========\n");
- seq_printf(m,
- " %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)\n",
- "[scoreboard]", wl->scbd, cx->cnt_wl[BTC_WCNT_SCBDUPDATE],
- bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD],
- cx->cnt_bt[BTC_BCNT_SCBDUPDATE]);
+ p += scnprintf(p, end - p,
+ " %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)\n",
+ "[scoreboard]", wl->scbd,
+ cx->cnt_wl[BTC_WCNT_SCBDUPDATE],
+ bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD],
+ cx->cnt_bt[BTC_BCNT_SCBDUPDATE]);
btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev);
_get_gnt(rtwdev, &gnt_cfg);
gnt = gnt_cfg.band[0];
- seq_printf(m,
- " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], ",
- "[gnt_status]",
- chip->chip_id == RTL8852C ? "HW" :
- btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT",
- gnt.gnt_wl_sw_en ? "SW" : "HW", gnt.gnt_wl,
- gnt.gnt_bt_sw_en ? "SW" : "HW", gnt.gnt_bt);
+ p += scnprintf(p, end - p,
+ " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], ",
+ "[gnt_status]",
+ chip->chip_id == RTL8852C ? "HW" :
+ btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT",
+ gnt.gnt_wl_sw_en ? "SW" : "HW", gnt.gnt_wl,
+ gnt.gnt_bt_sw_en ? "SW" : "HW", gnt.gnt_bt);
gnt = gnt_cfg.band[1];
- seq_printf(m, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n",
- gnt.gnt_wl_sw_en ? "SW" : "HW",
- gnt.gnt_wl,
- gnt.gnt_bt_sw_en ? "SW" : "HW",
- gnt.gnt_bt);
+ p += scnprintf(p, end - p, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n",
+ gnt.gnt_wl_sw_en ? "SW" : "HW",
+ gnt.gnt_wl,
+ gnt.gnt_bt_sw_en ? "SW" : "HW",
+ gnt.gnt_bt);
pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo;
if (!pcinfo->valid) {
rtw89_debug(rtwdev, RTW89_DBG_BTC,
"[BTC], %s(): stop due rpt_fbtc_mregval.cinfo\n",
__func__);
- return;
+ goto out;
}
pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v1;
@@ -10138,21 +10255,26 @@ static void _show_mreg_v1(struct rtw89_dev *rtwdev, struct seq_file *m)
val = le32_to_cpu(pmreg->mreg_val[i]);
if (cnt % 6 == 0)
- seq_printf(m, " %-15s : %d_0x%04x=0x%08x",
- "[reg]", (u32)type, offset, val);
+ p += scnprintf(p, end - p,
+ " %-15s : %d_0x%04x=0x%08x",
+ "[reg]", (u32)type, offset, val);
else
- seq_printf(m, ", %d_0x%04x=0x%08x", (u32)type,
- offset, val);
+ p += scnprintf(p, end - p, ", %d_0x%04x=0x%08x",
+ (u32)type,
+ offset, val);
if (cnt % 6 == 5)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
cnt++;
if (i >= pmreg->reg_num)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
+
+out:
+ return p - buf;
}
-static void _show_mreg_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_mreg_v2(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
struct rtw89_btc *btc = &rtwdev->btc;
@@ -10164,46 +10286,48 @@ static void _show_mreg_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_bt_info *bt = &btc->cx.bt;
struct rtw89_mac_ax_coex_gnt gnt_cfg = {};
struct rtw89_mac_ax_gnt gnt;
+ char *p = buf, *end = buf + bufsz;
u8 i = 0, type = 0, cnt = 0;
u32 val, offset;
if (!(btc->dm.coex_info_map & BTC_COEX_INFO_MREG))
- return;
+ return 0;
- seq_puts(m, "========== [HW Status] ==========\n");
+ p += scnprintf(p, end - p, "========== [HW Status] ==========\n");
- seq_printf(m,
- " %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)\n",
- "[scoreboard]", wl->scbd, cx->cnt_wl[BTC_WCNT_SCBDUPDATE],
- bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD],
- cx->cnt_bt[BTC_BCNT_SCBDUPDATE]);
+ p += scnprintf(p, end - p,
+ " %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)\n",
+ "[scoreboard]", wl->scbd,
+ cx->cnt_wl[BTC_WCNT_SCBDUPDATE],
+ bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD],
+ cx->cnt_bt[BTC_BCNT_SCBDUPDATE]);
btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev);
_get_gnt(rtwdev, &gnt_cfg);
gnt = gnt_cfg.band[0];
- seq_printf(m,
- " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], polut_type:%s",
- "[gnt_status]",
- chip->chip_id == RTL8852C ? "HW" :
- btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT",
- gnt.gnt_wl_sw_en ? "SW" : "HW", gnt.gnt_wl,
- gnt.gnt_bt_sw_en ? "SW" : "HW", gnt.gnt_bt,
- id_to_polut(wl->bt_polut_type[wl->pta_req_mac]));
+ p += scnprintf(p, end - p,
+ " %-15s : pta_owner:%s, phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d], polut_type:%s",
+ "[gnt_status]",
+ chip->chip_id == RTL8852C ? "HW" :
+ btc->dm.pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT",
+ gnt.gnt_wl_sw_en ? "SW" : "HW", gnt.gnt_wl,
+ gnt.gnt_bt_sw_en ? "SW" : "HW", gnt.gnt_bt,
+ id_to_polut(wl->bt_polut_type[wl->pta_req_mac]));
gnt = gnt_cfg.band[1];
- seq_printf(m, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n",
- gnt.gnt_wl_sw_en ? "SW" : "HW",
- gnt.gnt_wl,
- gnt.gnt_bt_sw_en ? "SW" : "HW",
- gnt.gnt_bt);
+ p += scnprintf(p, end - p, "phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]\n",
+ gnt.gnt_wl_sw_en ? "SW" : "HW",
+ gnt.gnt_wl,
+ gnt.gnt_bt_sw_en ? "SW" : "HW",
+ gnt.gnt_bt);
pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo;
if (!pcinfo->valid) {
rtw89_debug(rtwdev, RTW89_DBG_BTC,
"[BTC], %s(): stop due rpt_fbtc_mregval.cinfo\n",
__func__);
- return;
+ goto out;
}
pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v2;
@@ -10217,21 +10341,26 @@ static void _show_mreg_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
val = le32_to_cpu(pmreg->mreg_val[i]);
if (cnt % 6 == 0)
- seq_printf(m, " %-15s : %d_0x%04x=0x%08x",
- "[reg]", (u32)type, offset, val);
+ p += scnprintf(p, end - p,
+ " %-15s : %d_0x%04x=0x%08x",
+ "[reg]", (u32)type, offset, val);
else
- seq_printf(m, ", %d_0x%04x=0x%08x", (u32)type,
- offset, val);
+ p += scnprintf(p, end - p, ", %d_0x%04x=0x%08x",
+ (u32)type,
+ offset, val);
if (cnt % 6 == 5)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
cnt++;
if (i >= pmreg->reg_num)
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
+
+out:
+ return p - buf;
}
-static void _show_mreg_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_mreg_v7(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
@@ -10242,46 +10371,50 @@ static void _show_mreg_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_bt_info *bt = &cx->bt;
struct rtw89_mac_ax_gnt *gnt = NULL;
struct rtw89_btc_dm *dm = &btc->dm;
+ char *p = buf, *end = buf + bufsz;
u8 i, type, cnt = 0;
u32 val, offset;
if (!(dm->coex_info_map & BTC_COEX_INFO_MREG))
- return;
+ return 0;
- seq_puts(m, "\n\r========== [HW Status] ==========");
+ p += scnprintf(p, end - p, "\n\r========== [HW Status] ==========");
- seq_printf(m,
- "\n\r %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)",
- "[scoreboard]", wl->scbd, cx->cnt_wl[BTC_WCNT_SCBDUPDATE],
- bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD],
- cx->cnt_bt[BTC_BCNT_SCBDUPDATE]);
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : WL->BT:0x%08x(cnt:%d), BT->WL:0x%08x(total:%d, bt_update:%d)",
+ "[scoreboard]", wl->scbd,
+ cx->cnt_wl[BTC_WCNT_SCBDUPDATE],
+ bt->scbd, cx->cnt_bt[BTC_BCNT_SCBDREAD],
+ cx->cnt_bt[BTC_BCNT_SCBDUPDATE]);
/* To avoid I/O if WL LPS or power-off */
dm->pta_owner = rtw89_mac_get_ctrl_path(rtwdev);
- seq_printf(m,
- "\n\r %-15s : pta_owner:%s, pta_req_mac:MAC%d, rf_gnt_source: polut_type:%s",
- "[gnt_status]",
- rtwdev->chip->para_ver & BTC_FEAT_PTA_ONOFF_CTRL ? "HW" :
- dm->pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT",
- wl->pta_req_mac, id_to_polut(wl->bt_polut_type[wl->pta_req_mac]));
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : pta_owner:%s, pta_req_mac:MAC%d, rf_gnt_source: polut_type:%s",
+ "[gnt_status]",
+ rtwdev->chip->para_ver & BTC_FEAT_PTA_ONOFF_CTRL ? "HW" :
+ dm->pta_owner == BTC_CTRL_BY_WL ? "WL" : "BT",
+ wl->pta_req_mac,
+ id_to_polut(wl->bt_polut_type[wl->pta_req_mac]));
gnt = &dm->gnt.band[RTW89_PHY_0];
- seq_printf(m, ", phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d]",
- gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl,
- gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt);
+ p += scnprintf(p, end - p, ", phy-0[gnt_wl:%s-%d/gnt_bt:%s-%d]",
+ gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl,
+ gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt);
if (rtwdev->dbcc_en) {
gnt = &dm->gnt.band[RTW89_PHY_1];
- seq_printf(m, ", phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]",
- gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl,
- gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt);
+ p += scnprintf(p, end - p,
+ ", phy-1[gnt_wl:%s-%d/gnt_bt:%s-%d]",
+ gnt->gnt_wl_sw_en ? "SW" : "HW", gnt->gnt_wl,
+ gnt->gnt_bt_sw_en ? "SW" : "HW", gnt->gnt_bt);
}
pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo;
if (!pcinfo->valid)
- return;
+ goto out;
pmreg = &pfwinfo->rpt_fbtc_mregval.finfo.v7;
@@ -10291,17 +10424,21 @@ static void _show_mreg_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
val = le32_to_cpu(pmreg->mreg_val[i]);
if (cnt % 6 == 0)
- seq_printf(m, "\n\r %-15s : %s_0x%x=0x%x", "[reg]",
- id_to_regtype(type), offset, val);
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : %s_0x%x=0x%x", "[reg]",
+ id_to_regtype(type), offset, val);
else
- seq_printf(m, ", %s_0x%x=0x%x",
- id_to_regtype(type), offset, val);
+ p += scnprintf(p, end - p, ", %s_0x%x=0x%x",
+ id_to_regtype(type), offset, val);
cnt++;
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
+
+out:
+ return p - buf;
}
-static void _show_summary_v1(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_summary_v1(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
@@ -10312,56 +10449,59 @@ static void _show_summary_v1(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_wl_info *wl = &cx->wl;
struct rtw89_btc_bt_info *bt = &cx->bt;
u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify;
+ char *p = buf, *end = buf + bufsz;
u8 i;
if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
- return;
+ return 0;
- seq_puts(m, "========== [Statistics] ==========\n");
+ p += scnprintf(p, end - p, "========== [Statistics] ==========\n");
pcinfo = &pfwinfo->rpt_ctrl.cinfo;
if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) {
prptctrl = &pfwinfo->rpt_ctrl.finfo.v1;
- seq_printf(m,
- " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ",
- "[summary]", pfwinfo->cnt_h2c,
- pfwinfo->cnt_h2c_fail, prptctrl->h2c_cnt,
- pfwinfo->cnt_c2h, prptctrl->c2h_cnt);
+ p += scnprintf(p, end - p,
+ " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ",
+ "[summary]", pfwinfo->cnt_h2c,
+ pfwinfo->cnt_h2c_fail, prptctrl->h2c_cnt,
+ pfwinfo->cnt_c2h, prptctrl->c2h_cnt);
- seq_printf(m,
- "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x, dm_error_map:0x%x",
- pfwinfo->event[BTF_EVNT_RPT], prptctrl->rpt_cnt,
- prptctrl->rpt_enable, dm->error.val);
+ p += scnprintf(p, end - p,
+ "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x, dm_error_map:0x%x",
+ pfwinfo->event[BTF_EVNT_RPT],
+ prptctrl->rpt_cnt,
+ prptctrl->rpt_enable, dm->error.val);
if (dm->error.map.wl_fw_hang)
- seq_puts(m, " (WL FW Hang!!)");
- seq_puts(m, "\n");
- seq_printf(m,
- " %-15s : send_ok:%d, send_fail:%d, recv:%d",
- "[mailbox]", prptctrl->mb_send_ok_cnt,
- prptctrl->mb_send_fail_cnt, prptctrl->mb_recv_cnt);
-
- seq_printf(m,
- "(A2DP_empty:%d, A2DP_flowstop:%d, A2DP_full:%d)\n",
- prptctrl->mb_a2dp_empty_cnt,
- prptctrl->mb_a2dp_flct_cnt,
- prptctrl->mb_a2dp_full_cnt);
-
- seq_printf(m,
- " %-15s : wl_rfk[req:%d/go:%d/reject:%d/timeout:%d]",
- "[RFK]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
- cx->cnt_wl[BTC_WCNT_RFK_GO],
- cx->cnt_wl[BTC_WCNT_RFK_REJECT],
- cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
-
- seq_printf(m,
- ", bt_rfk[req:%d/go:%d/reject:%d/timeout:%d/fail:%d]\n",
- prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_REQ],
- prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_GO],
- prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_REJECT],
- prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_TIMEOUT],
- prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_FAIL]);
+ p += scnprintf(p, end - p, " (WL FW Hang!!)");
+ p += scnprintf(p, end - p, "\n");
+ p += scnprintf(p, end - p,
+ " %-15s : send_ok:%d, send_fail:%d, recv:%d",
+ "[mailbox]", prptctrl->mb_send_ok_cnt,
+ prptctrl->mb_send_fail_cnt,
+ prptctrl->mb_recv_cnt);
+
+ p += scnprintf(p, end - p,
+ "(A2DP_empty:%d, A2DP_flowstop:%d, A2DP_full:%d)\n",
+ prptctrl->mb_a2dp_empty_cnt,
+ prptctrl->mb_a2dp_flct_cnt,
+ prptctrl->mb_a2dp_full_cnt);
+
+ p += scnprintf(p, end - p,
+ " %-15s : wl_rfk[req:%d/go:%d/reject:%d/timeout:%d]",
+ "[RFK]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
+ cx->cnt_wl[BTC_WCNT_RFK_GO],
+ cx->cnt_wl[BTC_WCNT_RFK_REJECT],
+ cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
+
+ p += scnprintf(p, end - p,
+ ", bt_rfk[req:%d/go:%d/reject:%d/timeout:%d/fail:%d]\n",
+ prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_REQ],
+ prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_GO],
+ prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_REJECT],
+ prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_TIMEOUT],
+ prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_FAIL]);
if (prptctrl->bt_rfk_cnt[BTC_BCNT_RFK_TIMEOUT] > 0)
bt->rfk_info.map.timeout = 1;
@@ -10370,42 +10510,44 @@ static void _show_summary_v1(struct rtw89_dev *rtwdev, struct seq_file *m)
dm->error.map.wl_rfk_timeout = bt->rfk_info.map.timeout;
} else {
- seq_printf(m,
- " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d, rpt_cnt=%d, rpt_map=0x%x",
- "[summary]", pfwinfo->cnt_h2c,
- pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h,
- pfwinfo->event[BTF_EVNT_RPT],
- btc->fwinfo.rpt_en_map);
- seq_puts(m, " (WL FW report invalid!!)\n");
+ p += scnprintf(p, end - p,
+ " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d, rpt_cnt=%d, rpt_map=0x%x",
+ "[summary]", pfwinfo->cnt_h2c,
+ pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h,
+ pfwinfo->event[BTF_EVNT_RPT],
+ btc->fwinfo.rpt_en_map);
+ p += scnprintf(p, end - p, " (WL FW report invalid!!)\n");
}
for (i = 0; i < BTC_NCNT_NUM; i++)
cnt_sum += dm->cnt_notify[i];
- seq_printf(m,
- " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
- "[notify_cnt]", cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
- cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
+ p += scnprintf(p, end - p,
+ " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
+ "[notify_cnt]", cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
+ cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
+
+ p += scnprintf(p, end - p,
+ "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d\n",
+ cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
+ cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
+ cnt[BTC_NCNT_WL_STA]);
- seq_printf(m,
- "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d\n",
- cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
- cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
- cnt[BTC_NCNT_WL_STA]);
+ p += scnprintf(p, end - p,
+ " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
+ "[notify_cnt]", cnt[BTC_NCNT_SCAN_START],
+ cnt[BTC_NCNT_SCAN_FINISH], cnt[BTC_NCNT_SWITCH_BAND],
+ cnt[BTC_NCNT_SPECIAL_PACKET]);
- seq_printf(m,
- " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
- "[notify_cnt]", cnt[BTC_NCNT_SCAN_START],
- cnt[BTC_NCNT_SCAN_FINISH], cnt[BTC_NCNT_SWITCH_BAND],
- cnt[BTC_NCNT_SPECIAL_PACKET]);
+ p += scnprintf(p, end - p,
+ "timer=%d, control=%d, customerize=%d\n",
+ cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CONTROL],
+ cnt[BTC_NCNT_CUSTOMERIZE]);
- seq_printf(m,
- "timer=%d, control=%d, customerize=%d\n",
- cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CONTROL],
- cnt[BTC_NCNT_CUSTOMERIZE]);
+ return p - buf;
}
-static void _show_summary_v4(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_summary_v4(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
@@ -10416,64 +10558,65 @@ static void _show_summary_v4(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_wl_info *wl = &cx->wl;
struct rtw89_btc_bt_info *bt = &cx->bt;
u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify;
+ char *p = buf, *end = buf + bufsz;
u8 i;
if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
- return;
+ return 0;
- seq_puts(m, "========== [Statistics] ==========\n");
+ p += scnprintf(p, end - p, "========== [Statistics] ==========\n");
pcinfo = &pfwinfo->rpt_ctrl.cinfo;
if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) {
prptctrl = &pfwinfo->rpt_ctrl.finfo.v4;
- seq_printf(m,
- " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ",
- "[summary]", pfwinfo->cnt_h2c,
- pfwinfo->cnt_h2c_fail,
- le32_to_cpu(prptctrl->rpt_info.cnt_h2c),
- pfwinfo->cnt_c2h,
- le32_to_cpu(prptctrl->rpt_info.cnt_c2h));
-
- seq_printf(m,
- "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x, dm_error_map:0x%x",
- pfwinfo->event[BTF_EVNT_RPT],
- le32_to_cpu(prptctrl->rpt_info.cnt),
- le32_to_cpu(prptctrl->rpt_info.en),
- dm->error.val);
+ p += scnprintf(p, end - p,
+ " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ",
+ "[summary]", pfwinfo->cnt_h2c,
+ pfwinfo->cnt_h2c_fail,
+ le32_to_cpu(prptctrl->rpt_info.cnt_h2c),
+ pfwinfo->cnt_c2h,
+ le32_to_cpu(prptctrl->rpt_info.cnt_c2h));
+
+ p += scnprintf(p, end - p,
+ "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x, dm_error_map:0x%x",
+ pfwinfo->event[BTF_EVNT_RPT],
+ le32_to_cpu(prptctrl->rpt_info.cnt),
+ le32_to_cpu(prptctrl->rpt_info.en),
+ dm->error.val);
if (dm->error.map.wl_fw_hang)
- seq_puts(m, " (WL FW Hang!!)");
- seq_puts(m, "\n");
- seq_printf(m,
- " %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
- "[mailbox]",
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
-
- seq_printf(m,
- "A2DP_empty:%d(stop:%d, tx:%d, ack:%d, nack:%d)\n",
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
-
- seq_printf(m,
- " %-15s : wl_rfk[req:%d/go:%d/reject:%d/timeout:%d]",
- "[RFK]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
- cx->cnt_wl[BTC_WCNT_RFK_GO],
- cx->cnt_wl[BTC_WCNT_RFK_REJECT],
- cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
-
- seq_printf(m,
- ", bt_rfk[req:%d/go:%d/reject:%d/timeout:%d/fail:%d]\n",
- le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]),
- le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_GO]),
- le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REJECT]),
- le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_TIMEOUT]),
- le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_FAIL]));
+ p += scnprintf(p, end - p, " (WL FW Hang!!)");
+ p += scnprintf(p, end - p, "\n");
+ p += scnprintf(p, end - p,
+ " %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
+ "[mailbox]",
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
+
+ p += scnprintf(p, end - p,
+ "A2DP_empty:%d(stop:%d, tx:%d, ack:%d, nack:%d)\n",
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
+
+ p += scnprintf(p, end - p,
+ " %-15s : wl_rfk[req:%d/go:%d/reject:%d/timeout:%d]",
+ "[RFK]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
+ cx->cnt_wl[BTC_WCNT_RFK_GO],
+ cx->cnt_wl[BTC_WCNT_RFK_REJECT],
+ cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
+
+ p += scnprintf(p, end - p,
+ ", bt_rfk[req:%d/go:%d/reject:%d/timeout:%d/fail:%d]\n",
+ le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]),
+ le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_GO]),
+ le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REJECT]),
+ le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_TIMEOUT]),
+ le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_FAIL]));
if (le32_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_TIMEOUT]) > 0)
bt->rfk_info.map.timeout = 1;
@@ -10482,42 +10625,44 @@ static void _show_summary_v4(struct rtw89_dev *rtwdev, struct seq_file *m)
dm->error.map.wl_rfk_timeout = bt->rfk_info.map.timeout;
} else {
- seq_printf(m,
- " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d, rpt_cnt=%d, rpt_map=0x%x",
- "[summary]", pfwinfo->cnt_h2c,
- pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h,
- pfwinfo->event[BTF_EVNT_RPT],
- btc->fwinfo.rpt_en_map);
- seq_puts(m, " (WL FW report invalid!!)\n");
+ p += scnprintf(p, end - p,
+ " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d, rpt_cnt=%d, rpt_map=0x%x",
+ "[summary]", pfwinfo->cnt_h2c,
+ pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h,
+ pfwinfo->event[BTF_EVNT_RPT],
+ btc->fwinfo.rpt_en_map);
+ p += scnprintf(p, end - p, " (WL FW report invalid!!)\n");
}
for (i = 0; i < BTC_NCNT_NUM; i++)
cnt_sum += dm->cnt_notify[i];
- seq_printf(m,
- " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
- "[notify_cnt]", cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
- cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
+ p += scnprintf(p, end - p,
+ " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
+ "[notify_cnt]", cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
+ cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
+
+ p += scnprintf(p, end - p,
+ "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d\n",
+ cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
+ cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
+ cnt[BTC_NCNT_WL_STA]);
- seq_printf(m,
- "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d\n",
- cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
- cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
- cnt[BTC_NCNT_WL_STA]);
+ p += scnprintf(p, end - p,
+ " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
+ "[notify_cnt]", cnt[BTC_NCNT_SCAN_START],
+ cnt[BTC_NCNT_SCAN_FINISH], cnt[BTC_NCNT_SWITCH_BAND],
+ cnt[BTC_NCNT_SPECIAL_PACKET]);
- seq_printf(m,
- " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
- "[notify_cnt]", cnt[BTC_NCNT_SCAN_START],
- cnt[BTC_NCNT_SCAN_FINISH], cnt[BTC_NCNT_SWITCH_BAND],
- cnt[BTC_NCNT_SPECIAL_PACKET]);
+ p += scnprintf(p, end - p,
+ "timer=%d, control=%d, customerize=%d\n",
+ cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CONTROL],
+ cnt[BTC_NCNT_CUSTOMERIZE]);
- seq_printf(m,
- "timer=%d, control=%d, customerize=%d\n",
- cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CONTROL],
- cnt[BTC_NCNT_CUSTOMERIZE]);
+ return p - buf;
}
-static void _show_summary_v5(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_summary_v5(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
@@ -10527,112 +10672,118 @@ static void _show_summary_v5(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_dm *dm = &btc->dm;
struct rtw89_btc_wl_info *wl = &cx->wl;
u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify;
+ char *p = buf, *end = buf + bufsz;
u8 i;
if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
- return;
+ return 0;
- seq_puts(m, "========== [Statistics] ==========\n");
+ p += scnprintf(p, end - p, "========== [Statistics] ==========\n");
pcinfo = &pfwinfo->rpt_ctrl.cinfo;
if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) {
prptctrl = &pfwinfo->rpt_ctrl.finfo.v5;
- seq_printf(m,
- " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ",
- "[summary]", pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
- le16_to_cpu(prptctrl->rpt_info.cnt_h2c),
- pfwinfo->cnt_c2h,
- le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
- le16_to_cpu(prptctrl->rpt_info.len_c2h));
-
- seq_printf(m,
- "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x",
- pfwinfo->event[BTF_EVNT_RPT],
- le16_to_cpu(prptctrl->rpt_info.cnt),
- le32_to_cpu(prptctrl->rpt_info.en));
+ p += scnprintf(p, end - p,
+ " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ",
+ "[summary]", pfwinfo->cnt_h2c,
+ pfwinfo->cnt_h2c_fail,
+ le16_to_cpu(prptctrl->rpt_info.cnt_h2c),
+ pfwinfo->cnt_c2h,
+ le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
+ le16_to_cpu(prptctrl->rpt_info.len_c2h));
+
+ p += scnprintf(p, end - p,
+ "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x",
+ pfwinfo->event[BTF_EVNT_RPT],
+ le16_to_cpu(prptctrl->rpt_info.cnt),
+ le32_to_cpu(prptctrl->rpt_info.en));
if (dm->error.map.wl_fw_hang)
- seq_puts(m, " (WL FW Hang!!)");
- seq_puts(m, "\n");
- seq_printf(m,
- " %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
- "[mailbox]",
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
-
- seq_printf(m,
- "A2DP_empty:%d(stop:%d, tx:%d, ack:%d, nack:%d)\n",
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
-
- seq_printf(m,
- " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]",
- "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
- cx->cnt_wl[BTC_WCNT_RFK_GO],
- cx->cnt_wl[BTC_WCNT_RFK_REJECT],
- cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
-
- seq_printf(m,
- ", bt_rfk[req:%d]",
- le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
-
- seq_printf(m,
- ", AOAC[RF_on:%d/RF_off:%d]",
- le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
- le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
+ p += scnprintf(p, end - p, " (WL FW Hang!!)");
+ p += scnprintf(p, end - p, "\n");
+ p += scnprintf(p, end - p,
+ " %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
+ "[mailbox]",
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
+
+ p += scnprintf(p, end - p,
+ "A2DP_empty:%d(stop:%d, tx:%d, ack:%d, nack:%d)\n",
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
+
+ p += scnprintf(p, end - p,
+ " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]",
+ "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
+ cx->cnt_wl[BTC_WCNT_RFK_GO],
+ cx->cnt_wl[BTC_WCNT_RFK_REJECT],
+ cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
+
+ p += scnprintf(p, end - p,
+ ", bt_rfk[req:%d]",
+ le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
+
+ p += scnprintf(p, end - p,
+ ", AOAC[RF_on:%d/RF_off:%d]",
+ le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
+ le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
} else {
- seq_printf(m,
- " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d",
- "[summary]", pfwinfo->cnt_h2c,
- pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h);
+ p += scnprintf(p, end - p,
+ " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d",
+ "[summary]", pfwinfo->cnt_h2c,
+ pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h);
}
if (!pcinfo->valid || pfwinfo->len_mismch || pfwinfo->fver_mismch ||
pfwinfo->err[BTFRE_EXCEPTION]) {
- seq_puts(m, "\n");
- seq_printf(m,
- " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:"
- "0x%x/ver:0x%x/ex:%d/lps=%d/rf_off=%d]",
- "[ERROR]", pcinfo->valid, pfwinfo->len_mismch,
- pfwinfo->fver_mismch, pfwinfo->err[BTFRE_EXCEPTION],
- wl->status.map.lps, wl->status.map.rf_off);
+ p += scnprintf(p, end - p, "\n");
+ p += scnprintf(p, end - p,
+ " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:"
+ "0x%x/ver:0x%x/ex:%d/lps=%d/rf_off=%d]",
+ "[ERROR]", pcinfo->valid, pfwinfo->len_mismch,
+ pfwinfo->fver_mismch,
+ pfwinfo->err[BTFRE_EXCEPTION],
+ wl->status.map.lps, wl->status.map.rf_off);
}
for (i = 0; i < BTC_NCNT_NUM; i++)
cnt_sum += dm->cnt_notify[i];
- seq_puts(m, "\n");
- seq_printf(m,
- " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
- "[notify_cnt]",
- cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
- cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
+ p += scnprintf(p, end - p, "\n");
+ p += scnprintf(p, end - p,
+ " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
+ "[notify_cnt]",
+ cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
+ cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
+
+ p += scnprintf(p, end - p,
+ "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d",
+ cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
+ cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
+ cnt[BTC_NCNT_WL_STA]);
- seq_printf(m,
- "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d",
- cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
- cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
- cnt[BTC_NCNT_WL_STA]);
+ p += scnprintf(p, end - p, "\n");
+ p += scnprintf(p, end - p,
+ " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
+ "[notify_cnt]",
+ cnt[BTC_NCNT_SCAN_START], cnt[BTC_NCNT_SCAN_FINISH],
+ cnt[BTC_NCNT_SWITCH_BAND],
+ cnt[BTC_NCNT_SPECIAL_PACKET]);
- seq_puts(m, "\n");
- seq_printf(m,
- " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
- "[notify_cnt]",
- cnt[BTC_NCNT_SCAN_START], cnt[BTC_NCNT_SCAN_FINISH],
- cnt[BTC_NCNT_SWITCH_BAND], cnt[BTC_NCNT_SPECIAL_PACKET]);
+ p += scnprintf(p, end - p,
+ "timer=%d, control=%d, customerize=%d",
+ cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CONTROL],
+ cnt[BTC_NCNT_CUSTOMERIZE]);
- seq_printf(m,
- "timer=%d, control=%d, customerize=%d",
- cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CONTROL],
- cnt[BTC_NCNT_CUSTOMERIZE]);
+ return p - buf;
}
-static void _show_summary_v105(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_summary_v105(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc *btc = &rtwdev->btc;
struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo;
@@ -10642,112 +10793,118 @@ static void _show_summary_v105(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_dm *dm = &btc->dm;
struct rtw89_btc_wl_info *wl = &cx->wl;
u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify;
+ char *p = buf, *end = buf + bufsz;
u8 i;
if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
- return;
+ return 0;
- seq_puts(m, "========== [Statistics] ==========\n");
+ p += scnprintf(p, end - p, "========== [Statistics] ==========\n");
pcinfo = &pfwinfo->rpt_ctrl.cinfo;
if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) {
prptctrl = &pfwinfo->rpt_ctrl.finfo.v105;
- seq_printf(m,
- " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ",
- "[summary]", pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
- le16_to_cpu(prptctrl->rpt_info.cnt_h2c),
- pfwinfo->cnt_c2h,
- le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
- le16_to_cpu(prptctrl->rpt_info.len_c2h));
-
- seq_printf(m,
- "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x",
- pfwinfo->event[BTF_EVNT_RPT],
- le16_to_cpu(prptctrl->rpt_info.cnt),
- le32_to_cpu(prptctrl->rpt_info.en));
+ p += scnprintf(p, end - p,
+ " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ",
+ "[summary]", pfwinfo->cnt_h2c,
+ pfwinfo->cnt_h2c_fail,
+ le16_to_cpu(prptctrl->rpt_info.cnt_h2c),
+ pfwinfo->cnt_c2h,
+ le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
+ le16_to_cpu(prptctrl->rpt_info.len_c2h));
+
+ p += scnprintf(p, end - p,
+ "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x",
+ pfwinfo->event[BTF_EVNT_RPT],
+ le16_to_cpu(prptctrl->rpt_info.cnt),
+ le32_to_cpu(prptctrl->rpt_info.en));
if (dm->error.map.wl_fw_hang)
- seq_puts(m, " (WL FW Hang!!)");
- seq_puts(m, "\n");
- seq_printf(m,
- " %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
- "[mailbox]",
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
-
- seq_printf(m,
- "A2DP_empty:%d(stop:%d, tx:%d, ack:%d, nack:%d)\n",
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
-
- seq_printf(m,
- " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]",
- "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
- cx->cnt_wl[BTC_WCNT_RFK_GO],
- cx->cnt_wl[BTC_WCNT_RFK_REJECT],
- cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
-
- seq_printf(m,
- ", bt_rfk[req:%d]",
- le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
-
- seq_printf(m,
- ", AOAC[RF_on:%d/RF_off:%d]",
- le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
- le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
+ p += scnprintf(p, end - p, " (WL FW Hang!!)");
+ p += scnprintf(p, end - p, "\n");
+ p += scnprintf(p, end - p,
+ " %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
+ "[mailbox]",
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
+
+ p += scnprintf(p, end - p,
+ "A2DP_empty:%d(stop:%d, tx:%d, ack:%d, nack:%d)\n",
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
+
+ p += scnprintf(p, end - p,
+ " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]",
+ "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
+ cx->cnt_wl[BTC_WCNT_RFK_GO],
+ cx->cnt_wl[BTC_WCNT_RFK_REJECT],
+ cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]);
+
+ p += scnprintf(p, end - p,
+ ", bt_rfk[req:%d]",
+ le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
+
+ p += scnprintf(p, end - p,
+ ", AOAC[RF_on:%d/RF_off:%d]",
+ le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
+ le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
} else {
- seq_printf(m,
- " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d",
- "[summary]", pfwinfo->cnt_h2c,
- pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h);
+ p += scnprintf(p, end - p,
+ " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d",
+ "[summary]", pfwinfo->cnt_h2c,
+ pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h);
}
if (!pcinfo->valid || pfwinfo->len_mismch || pfwinfo->fver_mismch ||
pfwinfo->err[BTFRE_EXCEPTION]) {
- seq_puts(m, "\n");
- seq_printf(m,
- " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:"
- "0x%x/ver:0x%x/ex:%d/lps=%d/rf_off=%d]",
- "[ERROR]", pcinfo->valid, pfwinfo->len_mismch,
- pfwinfo->fver_mismch, pfwinfo->err[BTFRE_EXCEPTION],
- wl->status.map.lps, wl->status.map.rf_off);
+ p += scnprintf(p, end - p, "\n");
+ p += scnprintf(p, end - p,
+ " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:"
+ "0x%x/ver:0x%x/ex:%d/lps=%d/rf_off=%d]",
+ "[ERROR]", pcinfo->valid, pfwinfo->len_mismch,
+ pfwinfo->fver_mismch,
+ pfwinfo->err[BTFRE_EXCEPTION],
+ wl->status.map.lps, wl->status.map.rf_off);
}
for (i = 0; i < BTC_NCNT_NUM; i++)
cnt_sum += dm->cnt_notify[i];
- seq_puts(m, "\n");
- seq_printf(m,
- " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
- "[notify_cnt]",
- cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
- cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
+ p += scnprintf(p, end - p, "\n");
+ p += scnprintf(p, end - p,
+ " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
+ "[notify_cnt]",
+ cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
+ cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
- seq_printf(m,
- "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d",
- cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
- cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
- cnt[BTC_NCNT_WL_STA]);
+ p += scnprintf(p, end - p,
+ "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d",
+ cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
+ cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
+ cnt[BTC_NCNT_WL_STA]);
- seq_puts(m, "\n");
- seq_printf(m,
- " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
- "[notify_cnt]",
- cnt[BTC_NCNT_SCAN_START], cnt[BTC_NCNT_SCAN_FINISH],
- cnt[BTC_NCNT_SWITCH_BAND], cnt[BTC_NCNT_SPECIAL_PACKET]);
+ p += scnprintf(p, end - p, "\n");
+ p += scnprintf(p, end - p,
+ " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ",
+ "[notify_cnt]",
+ cnt[BTC_NCNT_SCAN_START], cnt[BTC_NCNT_SCAN_FINISH],
+ cnt[BTC_NCNT_SWITCH_BAND],
+ cnt[BTC_NCNT_SPECIAL_PACKET]);
- seq_printf(m,
- "timer=%d, control=%d, customerize=%d",
- cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CONTROL],
- cnt[BTC_NCNT_CUSTOMERIZE]);
+ p += scnprintf(p, end - p,
+ "timer=%d, control=%d, customerize=%d",
+ cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CONTROL],
+ cnt[BTC_NCNT_CUSTOMERIZE]);
+
+ return p - buf;
}
-static void _show_summary_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_summary_v7(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo;
struct rtw89_btc_fbtc_rpt_ctrl_v7 *prptctrl = NULL;
@@ -10756,100 +10913,111 @@ static void _show_summary_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
struct rtw89_btc_wl_info *wl = &cx->wl;
u32 *cnt = rtwdev->btc.dm.cnt_notify;
+ char *p = buf, *end = buf + bufsz;
u32 cnt_sum = 0;
u8 i;
if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
- return;
+ return 0;
- seq_printf(m, "%s", "\n\r========== [Statistics] ==========");
+ p += scnprintf(p, end - p, "%s",
+ "\n\r========== [Statistics] ==========");
pcinfo = &pfwinfo->rpt_ctrl.cinfo;
if (pcinfo->valid && wl->status.map.lps != BTC_LPS_RF_OFF &&
!wl->status.map.rf_off) {
prptctrl = &pfwinfo->rpt_ctrl.finfo.v7;
- seq_printf(m,
- "\n\r %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d),"
- "c2h_cnt=%d(fw_send:%d, len:%d, max:%d), ",
- "[summary]", pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
- le16_to_cpu(prptctrl->rpt_info.cnt_h2c), pfwinfo->cnt_c2h,
- le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
- le16_to_cpu(prptctrl->rpt_info.len_c2h),
- rtwdev->btc.ver->info_buf);
-
- seq_printf(m, "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x",
- pfwinfo->event[BTF_EVNT_RPT],
- le16_to_cpu(prptctrl->rpt_info.cnt),
- le32_to_cpu(prptctrl->rpt_info.en));
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d),"
+ "c2h_cnt=%d(fw_send:%d, len:%d, max:%d), ",
+ "[summary]", pfwinfo->cnt_h2c,
+ pfwinfo->cnt_h2c_fail,
+ le16_to_cpu(prptctrl->rpt_info.cnt_h2c),
+ pfwinfo->cnt_c2h,
+ le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
+ le16_to_cpu(prptctrl->rpt_info.len_c2h),
+ rtwdev->btc.ver->info_buf);
+
+ p += scnprintf(p, end - p,
+ "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x",
+ pfwinfo->event[BTF_EVNT_RPT],
+ le16_to_cpu(prptctrl->rpt_info.cnt),
+ le32_to_cpu(prptctrl->rpt_info.en));
if (dm->error.map.wl_fw_hang)
- seq_puts(m, " (WL FW Hang!!)");
-
- seq_printf(m, "\n\r %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
- "[mailbox]", le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
-
- seq_printf(m, "A2DP_empty:%d(stop:%d/tx:%d/ack:%d/nack:%d)",
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
-
- seq_printf(m,
- "\n\r %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d/time:%dms]",
- "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
- cx->cnt_wl[BTC_WCNT_RFK_GO],
- cx->cnt_wl[BTC_WCNT_RFK_REJECT],
- cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT],
- wl->rfk_info.proc_time);
-
- seq_printf(m, ", bt_rfk[req:%d]",
- le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
-
- seq_printf(m, ", AOAC[RF_on:%d/RF_off:%d]",
- le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
- le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
+ p += scnprintf(p, end - p, " (WL FW Hang!!)");
+
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
+ "[mailbox]",
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
+
+ p += scnprintf(p, end - p,
+ "A2DP_empty:%d(stop:%d/tx:%d/ack:%d/nack:%d)",
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
+
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d/time:%dms]",
+ "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
+ cx->cnt_wl[BTC_WCNT_RFK_GO],
+ cx->cnt_wl[BTC_WCNT_RFK_REJECT],
+ cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT],
+ wl->rfk_info.proc_time);
+
+ p += scnprintf(p, end - p, ", bt_rfk[req:%d]",
+ le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
+
+ p += scnprintf(p, end - p, ", AOAC[RF_on:%d/RF_off:%d]",
+ le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
+ le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
} else {
- seq_printf(m,
- "\n\r %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d (lps=%d/rf_off=%d)",
- "[summary]",
- pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
- pfwinfo->cnt_c2h,
- wl->status.map.lps, wl->status.map.rf_off);
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d (lps=%d/rf_off=%d)",
+ "[summary]",
+ pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
+ pfwinfo->cnt_c2h,
+ wl->status.map.lps, wl->status.map.rf_off);
}
for (i = 0; i < BTC_NCNT_NUM; i++)
cnt_sum += dm->cnt_notify[i];
- seq_printf(m,
- "\n\r %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
- "[notify_cnt]",
- cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
- cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
+ "[notify_cnt]",
+ cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
+ cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
+
+ p += scnprintf(p, end - p,
+ "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d",
+ cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
+ cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
+ cnt[BTC_NCNT_WL_STA]);
- seq_printf(m,
- "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d",
- cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
- cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
- cnt[BTC_NCNT_WL_STA]);
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, switch_chbw=%d, special_pkt=%d, ",
+ "[notify_cnt]",
+ cnt[BTC_NCNT_SCAN_START], cnt[BTC_NCNT_SCAN_FINISH],
+ cnt[BTC_NCNT_SWITCH_BAND], cnt[BTC_NCNT_SWITCH_CHBW],
+ cnt[BTC_NCNT_SPECIAL_PACKET]);
- seq_printf(m,
- "\n\r %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, switch_chbw=%d, special_pkt=%d, ",
- "[notify_cnt]",
- cnt[BTC_NCNT_SCAN_START], cnt[BTC_NCNT_SCAN_FINISH],
- cnt[BTC_NCNT_SWITCH_BAND], cnt[BTC_NCNT_SWITCH_CHBW],
- cnt[BTC_NCNT_SPECIAL_PACKET]);
+ p += scnprintf(p, end - p,
+ "timer=%d, customerize=%d, hub_msg=%d, chg_fw=%d, send_cc=%d",
+ cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CUSTOMERIZE],
+ rtwdev->btc.hubmsg_cnt, cnt[BTC_NCNT_RESUME_DL_FW],
+ cnt[BTC_NCNT_COUNTRYCODE]);
- seq_printf(m, "timer=%d, customerize=%d, hub_msg=%d, chg_fw=%d, send_cc=%d",
- cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CUSTOMERIZE],
- rtwdev->btc.hubmsg_cnt, cnt[BTC_NCNT_RESUME_DL_FW],
- cnt[BTC_NCNT_COUNTRYCODE]);
+ return p - buf;
}
-static void _show_summary_v8(struct rtw89_dev *rtwdev, struct seq_file *m)
+static int _show_summary_v8(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_btc_btf_fwinfo *pfwinfo = &rtwdev->btc.fwinfo;
struct rtw89_btc_rpt_cmn_info *pcinfo = NULL;
@@ -10858,153 +11026,173 @@ static void _show_summary_v8(struct rtw89_dev *rtwdev, struct seq_file *m)
struct rtw89_btc_dm *dm = &rtwdev->btc.dm;
struct rtw89_btc_wl_info *wl = &cx->wl;
u32 *cnt = rtwdev->btc.dm.cnt_notify;
+ char *p = buf, *end = buf + bufsz;
u32 cnt_sum = 0;
u8 i;
if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY))
- return;
+ return 0;
- seq_printf(m, "%s", "\n\r========== [Statistics] ==========");
+ p += scnprintf(p, end - p, "%s",
+ "\n\r========== [Statistics] ==========");
pcinfo = &pfwinfo->rpt_ctrl.cinfo;
if (pcinfo->valid && wl->status.map.lps != BTC_LPS_RF_OFF &&
!wl->status.map.rf_off) {
prptctrl = &pfwinfo->rpt_ctrl.finfo.v8;
- seq_printf(m,
- "\n\r %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d, max:fw-%d/drv-%d), ",
- "[summary]", pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
- le16_to_cpu(prptctrl->rpt_info.cnt_h2c), pfwinfo->cnt_c2h,
- le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
- le16_to_cpu(prptctrl->rpt_info.len_c2h),
- (prptctrl->rpt_len_max_h << 8) + prptctrl->rpt_len_max_l,
- rtwdev->btc.ver->info_buf);
-
- seq_printf(m, "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x",
- pfwinfo->event[BTF_EVNT_RPT],
- le16_to_cpu(prptctrl->rpt_info.cnt),
- le32_to_cpu(prptctrl->rpt_info.en));
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d, max:fw-%d/drv-%d), ",
+ "[summary]", pfwinfo->cnt_h2c,
+ pfwinfo->cnt_h2c_fail,
+ le16_to_cpu(prptctrl->rpt_info.cnt_h2c),
+ pfwinfo->cnt_c2h,
+ le16_to_cpu(prptctrl->rpt_info.cnt_c2h),
+ le16_to_cpu(prptctrl->rpt_info.len_c2h),
+ (prptctrl->rpt_len_max_h << 8) + prptctrl->rpt_len_max_l,
+ rtwdev->btc.ver->info_buf);
+
+ p += scnprintf(p, end - p,
+ "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x",
+ pfwinfo->event[BTF_EVNT_RPT],
+ le16_to_cpu(prptctrl->rpt_info.cnt),
+ le32_to_cpu(prptctrl->rpt_info.en));
if (dm->error.map.wl_fw_hang)
- seq_puts(m, " (WL FW Hang!!)");
-
- seq_printf(m, "\n\r %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
- "[mailbox]", le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
- le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
-
- seq_printf(m, "A2DP_empty:%d(stop:%d/tx:%d/ack:%d/nack:%d)",
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
- le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
-
- seq_printf(m,
- "\n\r %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d/time:%dms]",
- "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
- cx->cnt_wl[BTC_WCNT_RFK_GO],
- cx->cnt_wl[BTC_WCNT_RFK_REJECT],
- cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT],
- wl->rfk_info.proc_time);
-
- seq_printf(m, ", bt_rfk[req:%d]",
- le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
-
- seq_printf(m, ", AOAC[RF_on:%d/RF_off:%d]",
- le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
- le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
+ p += scnprintf(p, end - p, " (WL FW Hang!!)");
+
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : send_ok:%d, send_fail:%d, recv:%d, ",
+ "[mailbox]",
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok),
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail),
+ le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv));
+
+ p += scnprintf(p, end - p,
+ "A2DP_empty:%d(stop:%d/tx:%d/ack:%d/nack:%d)",
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack),
+ le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack));
+
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d/time:%dms]",
+ "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ],
+ cx->cnt_wl[BTC_WCNT_RFK_GO],
+ cx->cnt_wl[BTC_WCNT_RFK_REJECT],
+ cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT],
+ wl->rfk_info.proc_time);
+
+ p += scnprintf(p, end - p, ", bt_rfk[req:%d]",
+ le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ]));
+
+ p += scnprintf(p, end - p, ", AOAC[RF_on:%d/RF_off:%d]",
+ le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on),
+ le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off));
} else {
- seq_printf(m,
- "\n\r %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d (lps=%d/rf_off=%d)",
- "[summary]",
- pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
- pfwinfo->cnt_c2h,
- wl->status.map.lps, wl->status.map.rf_off);
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d (lps=%d/rf_off=%d)",
+ "[summary]",
+ pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail,
+ pfwinfo->cnt_c2h,
+ wl->status.map.lps, wl->status.map.rf_off);
}
for (i = 0; i < BTC_NCNT_NUM; i++)
cnt_sum += dm->cnt_notify[i];
- seq_printf(m,
- "\n\r %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
- "[notify_cnt]",
- cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
- cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ",
+ "[notify_cnt]",
+ cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO],
+ cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]);
- seq_printf(m,
- "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d",
- cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
- cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
- cnt[BTC_NCNT_WL_STA]);
+ p += scnprintf(p, end - p,
+ "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d",
+ cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE],
+ cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK],
+ cnt[BTC_NCNT_WL_STA]);
- seq_printf(m,
- "\n\r %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, switch_chbw=%d, special_pkt=%d, ",
- "[notify_cnt]",
- cnt[BTC_NCNT_SCAN_START], cnt[BTC_NCNT_SCAN_FINISH],
- cnt[BTC_NCNT_SWITCH_BAND], cnt[BTC_NCNT_SWITCH_CHBW],
- cnt[BTC_NCNT_SPECIAL_PACKET]);
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, switch_chbw=%d, special_pkt=%d, ",
+ "[notify_cnt]",
+ cnt[BTC_NCNT_SCAN_START], cnt[BTC_NCNT_SCAN_FINISH],
+ cnt[BTC_NCNT_SWITCH_BAND], cnt[BTC_NCNT_SWITCH_CHBW],
+ cnt[BTC_NCNT_SPECIAL_PACKET]);
- seq_printf(m, "timer=%d, customerize=%d, hub_msg=%d, chg_fw=%d, send_cc=%d",
- cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CUSTOMERIZE],
- rtwdev->btc.hubmsg_cnt, cnt[BTC_NCNT_RESUME_DL_FW],
- cnt[BTC_NCNT_COUNTRYCODE]);
+ p += scnprintf(p, end - p,
+ "timer=%d, customerize=%d, hub_msg=%d, chg_fw=%d, send_cc=%d",
+ cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CUSTOMERIZE],
+ rtwdev->btc.hubmsg_cnt, cnt[BTC_NCNT_RESUME_DL_FW],
+ cnt[BTC_NCNT_COUNTRYCODE]);
+
+ return p - buf;
}
-void rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m)
+ssize_t rtw89_btc_dump_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_fw_suit *fw_suit = &rtwdev->fw.normal;
struct rtw89_btc *btc = &rtwdev->btc;
const struct rtw89_btc_ver *ver = btc->ver;
struct rtw89_btc_cx *cx = &btc->cx;
struct rtw89_btc_bt_info *bt = &cx->bt;
-
- seq_puts(m, "=========================================\n");
- seq_printf(m, "WL FW / BT FW %d.%d.%d.%d / NA\n",
- fw_suit->major_ver, fw_suit->minor_ver,
- fw_suit->sub_ver, fw_suit->sub_idex);
- seq_printf(m, "manual %d\n", btc->manual_ctrl);
-
- seq_puts(m, "=========================================\n");
-
- seq_printf(m, "\n\r %-15s : raw_data[%02x %02x %02x %02x %02x %02x] (type:%s/cnt:%d/same:%d)",
- "[bt_info]",
- bt->raw_info[2], bt->raw_info[3],
- bt->raw_info[4], bt->raw_info[5],
- bt->raw_info[6], bt->raw_info[7],
- bt->raw_info[0] == BTC_BTINFO_AUTO ? "auto" : "reply",
- cx->cnt_bt[BTC_BCNT_INFOUPDATE],
- cx->cnt_bt[BTC_BCNT_INFOSAME]);
-
- seq_puts(m, "\n=========================================\n");
-
- _show_cx_info(rtwdev, m);
- _show_wl_info(rtwdev, m);
- _show_bt_info(rtwdev, m);
- _show_dm_info(rtwdev, m);
- _show_fw_dm_msg(rtwdev, m);
+ char *p = buf, *end = buf + bufsz;
+
+ p += scnprintf(p, end - p,
+ "=========================================\n");
+ p += scnprintf(p, end - p,
+ "WL FW / BT FW %d.%d.%d.%d / NA\n",
+ fw_suit->major_ver, fw_suit->minor_ver,
+ fw_suit->sub_ver, fw_suit->sub_idex);
+ p += scnprintf(p, end - p, "manual %d\n",
+ btc->manual_ctrl);
+
+ p += scnprintf(p, end - p,
+ "=========================================\n");
+
+ p += scnprintf(p, end - p,
+ "\n\r %-15s : raw_data[%02x %02x %02x %02x %02x %02x] (type:%s/cnt:%d/same:%d)",
+ "[bt_info]",
+ bt->raw_info[2], bt->raw_info[3],
+ bt->raw_info[4], bt->raw_info[5],
+ bt->raw_info[6], bt->raw_info[7],
+ bt->raw_info[0] == BTC_BTINFO_AUTO ? "auto" : "reply",
+ cx->cnt_bt[BTC_BCNT_INFOUPDATE],
+ cx->cnt_bt[BTC_BCNT_INFOSAME]);
+
+ p += scnprintf(p, end - p,
+ "\n=========================================\n");
+
+ p += _show_cx_info(rtwdev, p, end - p);
+ p += _show_wl_info(rtwdev, p, end - p);
+ p += _show_bt_info(rtwdev, p, end - p);
+ p += _show_dm_info(rtwdev, p, end - p);
+ p += _show_fw_dm_msg(rtwdev, p, end - p);
if (ver->fcxmreg == 1)
- _show_mreg_v1(rtwdev, m);
+ p += _show_mreg_v1(rtwdev, p, end - p);
else if (ver->fcxmreg == 2)
- _show_mreg_v2(rtwdev, m);
+ p += _show_mreg_v2(rtwdev, p, end - p);
else if (ver->fcxmreg == 7)
- _show_mreg_v7(rtwdev, m);
+ p += _show_mreg_v7(rtwdev, p, end - p);
- _show_gpio_dbg(rtwdev, m);
+ p += _show_gpio_dbg(rtwdev, p, end - p);
if (ver->fcxbtcrpt == 1)
- _show_summary_v1(rtwdev, m);
+ p += _show_summary_v1(rtwdev, p, end - p);
else if (ver->fcxbtcrpt == 4)
- _show_summary_v4(rtwdev, m);
+ p += _show_summary_v4(rtwdev, p, end - p);
else if (ver->fcxbtcrpt == 5)
- _show_summary_v5(rtwdev, m);
+ p += _show_summary_v5(rtwdev, p, end - p);
else if (ver->fcxbtcrpt == 105)
- _show_summary_v105(rtwdev, m);
+ p += _show_summary_v105(rtwdev, p, end - p);
else if (ver->fcxbtcrpt == 7)
- _show_summary_v7(rtwdev, m);
+ p += _show_summary_v7(rtwdev, p, end - p);
else if (ver->fcxbtcrpt == 8)
- _show_summary_v8(rtwdev, m);
+ p += _show_summary_v8(rtwdev, p, end - p);
+
+ return p - buf;
}
void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev)
@@ -11037,3 +11225,24 @@ out:
rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC] use version def[%d] = 0x%08x\n",
(int)(btc->ver - rtw89_btc_ver_defs), btc->ver->fw_ver_code);
}
+
+void rtw89_btc_ntfy_preserve_bt_time(struct rtw89_dev *rtwdev, u32 ms)
+{
+ struct rtw89_btc_bt_link_info *bt_linfo = &rtwdev->btc.cx.bt.link_info;
+ struct rtw89_btc_bt_a2dp_desc a2dp = bt_linfo->a2dp_desc;
+
+ if (test_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags))
+ return;
+
+ if (!a2dp.exist)
+ return;
+
+ fsleep(ms * 1000);
+}
+EXPORT_SYMBOL(rtw89_btc_ntfy_preserve_bt_time);
+
+void rtw89_btc_ntfy_conn_rfk(struct rtw89_dev *rtwdev, bool state)
+{
+ rtwdev->btc.cx.wl.rfk_info.con_rfk = state;
+}
+EXPORT_SYMBOL(rtw89_btc_ntfy_conn_rfk);
diff --git a/drivers/net/wireless/realtek/rtw89/coex.h b/drivers/net/wireless/realtek/rtw89/coex.h
index dbdb56e063ef..e3a1fcd79620 100644
--- a/drivers/net/wireless/realtek/rtw89/coex.h
+++ b/drivers/net/wireless/realtek/rtw89/coex.h
@@ -267,10 +267,10 @@ void rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx);
void rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band);
void rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev,
enum btc_pkt_type pkt_type);
-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_eapol_packet_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_btc_ntfy_arp_packet_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_btc_ntfy_dhcp_packet_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_btc_ntfy_icmp_packet_work(struct wiphy *wiphy, struct wiphy_work *work);
void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link,
struct rtw89_sta_link *rtwsta_link,
@@ -282,14 +282,16 @@ void rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map,
void rtw89_btc_ntfy_wl_sta(struct rtw89_dev *rtwdev);
void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
u32 len, u8 class, u8 func);
-void rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m);
-void rtw89_coex_act1_work(struct work_struct *work);
-void rtw89_coex_bt_devinfo_work(struct work_struct *work);
-void rtw89_coex_rfk_chk_work(struct work_struct *work);
+ssize_t rtw89_btc_dump_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz);
+void rtw89_coex_act1_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_coex_bt_devinfo_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_coex_rfk_chk_work(struct wiphy *wiphy, struct wiphy_work *work);
void rtw89_coex_power_on(struct rtw89_dev *rtwdev);
void rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type);
void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type);
void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev);
+void rtw89_btc_ntfy_preserve_bt_time(struct rtw89_dev *rtwdev, u32 ms);
+void rtw89_btc_ntfy_conn_rfk(struct rtw89_dev *rtwdev, bool state);
static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev,
enum rtw89_phy_idx phy_idx,
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index 85f739f1173d..cc9b014457ac 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -913,16 +913,17 @@ static enum btc_pkt_type
rtw89_core_tx_btc_spec_pkt_notify(struct rtw89_dev *rtwdev,
struct rtw89_core_tx_request *tx_req)
{
+ struct wiphy *wiphy = rtwdev->hw->wiphy;
struct sk_buff *skb = tx_req->skb;
struct udphdr *udphdr;
if (IEEE80211_SKB_CB(skb)->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO) {
- ieee80211_queue_work(rtwdev->hw, &rtwdev->btc.eapol_notify_work);
+ wiphy_work_queue(wiphy, &rtwdev->btc.eapol_notify_work);
return PACKET_EAPOL;
}
if (skb->protocol == htons(ETH_P_ARP)) {
- ieee80211_queue_work(rtwdev->hw, &rtwdev->btc.arp_notify_work);
+ wiphy_work_queue(wiphy, &rtwdev->btc.arp_notify_work);
return PACKET_ARP;
}
@@ -932,14 +933,14 @@ rtw89_core_tx_btc_spec_pkt_notify(struct rtw89_dev *rtwdev,
if (((udphdr->source == htons(67) && udphdr->dest == htons(68)) ||
(udphdr->source == htons(68) && udphdr->dest == htons(67))) &&
skb->len > 282) {
- ieee80211_queue_work(rtwdev->hw, &rtwdev->btc.dhcp_notify_work);
+ wiphy_work_queue(wiphy, &rtwdev->btc.dhcp_notify_work);
return PACKET_DHCP;
}
}
if (skb->protocol == htons(ETH_P_IP) &&
ip_hdr(skb)->protocol == IPPROTO_ICMP) {
- ieee80211_queue_work(rtwdev->hw, &rtwdev->btc.icmp_notify_work);
+ wiphy_work_queue(wiphy, &rtwdev->btc.icmp_notify_work);
return PACKET_ICMP;
}
@@ -2071,17 +2072,17 @@ static void rtw89_stats_trigger_frame(struct rtw89_dev *rtwdev,
}
}
-static void rtw89_cancel_6ghz_probe_work(struct work_struct *work)
+static void rtw89_cancel_6ghz_probe_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
cancel_6ghz_probe_work);
struct list_head *pkt_list = rtwdev->scan_info.pkt_list;
struct rtw89_pktofld_info *info;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
if (!rtwdev->scanning)
- goto out;
+ return;
list_for_each_entry(info, &pkt_list[NL80211_BAND_6GHZ], list) {
if (!info->cancel || !test_bit(info->id, rtwdev->pkt_offload))
@@ -2094,9 +2095,6 @@ static void rtw89_cancel_6ghz_probe_work(struct work_struct *work)
* since if during scanning, pkt_list is accessed in bottom half.
*/
}
-
-out:
- mutex_unlock(&rtwdev->mutex);
}
static void rtw89_core_cancel_6ghz_probe_tx(struct rtw89_dev *rtwdev,
@@ -2131,7 +2129,7 @@ static void rtw89_core_cancel_6ghz_probe_tx(struct rtw89_dev *rtwdev,
}
if (queue_work)
- ieee80211_queue_work(rtwdev->hw, &rtwdev->cancel_6ghz_probe_work);
+ wiphy_work_queue(rtwdev->hw->wiphy, &rtwdev->cancel_6ghz_probe_work);
}
static void rtw89_vif_sync_bcn_tsf(struct rtw89_vif_link *rtwvif_link,
@@ -2194,8 +2192,11 @@ static void rtw89_vif_rx_stats_iter(void *data, u8 *mac,
}
pkt_stat->beacon_nr++;
- if (phy_ppdu)
+ if (phy_ppdu) {
ewma_rssi_add(&rtwdev->phystat.bcn_rssi, phy_ppdu->rssi_avg);
+ if (!test_bit(RTW89_FLAG_LOW_POWER_MODE, rtwdev->flags))
+ rtwvif_link->bcn_bw_idx = phy_ppdu->bw_idx;
+ }
pkt_stat->beacon_rate = desc_info->data_rate;
}
@@ -2381,6 +2382,49 @@ static void rtw89_core_validate_rx_signal(struct ieee80211_rx_status *rx_status)
rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
}
+static void rtw89_core_update_rx_freq_from_ie(struct rtw89_dev *rtwdev,
+ struct sk_buff *skb,
+ struct ieee80211_rx_status *rx_status)
+{
+ struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
+ size_t hdr_len, ielen;
+ u8 *variable;
+ int chan;
+
+ if (!rtwdev->chip->rx_freq_frome_ie)
+ return;
+
+ if (!rtwdev->scanning)
+ return;
+
+ if (ieee80211_is_beacon(mgmt->frame_control)) {
+ variable = mgmt->u.beacon.variable;
+ hdr_len = offsetof(struct ieee80211_mgmt,
+ u.beacon.variable);
+ } else if (ieee80211_is_probe_resp(mgmt->frame_control)) {
+ variable = mgmt->u.probe_resp.variable;
+ hdr_len = offsetof(struct ieee80211_mgmt,
+ u.probe_resp.variable);
+ } else {
+ return;
+ }
+
+ if (skb->len > hdr_len)
+ ielen = skb->len - hdr_len;
+ else
+ return;
+
+ /* The parsing code for both 2GHz and 5GHz bands is the same in this
+ * function.
+ */
+ chan = cfg80211_get_ies_channel_number(variable, ielen, NL80211_BAND_2GHZ);
+ if (chan == -1)
+ return;
+
+ rx_status->band = chan > 14 ? RTW89_BAND_5G : RTW89_BAND_2G;
+ rx_status->freq = ieee80211_channel_to_frequency(chan, rx_status->band);
+}
+
static void rtw89_core_rx_to_mac80211(struct rtw89_dev *rtwdev,
struct rtw89_rx_phy_ppdu *phy_ppdu,
struct rtw89_rx_desc_info *desc_info,
@@ -2398,6 +2442,7 @@ static void rtw89_core_rx_to_mac80211(struct rtw89_dev *rtwdev,
rtw89_core_update_rx_status_by_ppdu(rtwdev, rx_status, phy_ppdu);
rtw89_core_update_radiotap(rtwdev, skb_ppdu, rx_status);
rtw89_core_validate_rx_signal(rx_status);
+ rtw89_core_update_rx_freq_from_ie(rtwdev, skb_ppdu, rx_status);
/* In low power mode, it does RX in thread context. */
local_bh_disable();
@@ -3143,13 +3188,14 @@ static void rtw89_core_txq_schedule(struct rtw89_dev *rtwdev, u8 ac, bool *reinv
ieee80211_txq_schedule_end(hw, ac);
}
-static void rtw89_ips_work(struct work_struct *work)
+static void rtw89_ips_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
ips_work);
- mutex_lock(&rtwdev->mutex);
+
+ lockdep_assert_wiphy(wiphy);
+
rtw89_enter_ips_by_hwflags(rtwdev);
- mutex_unlock(&rtwdev->mutex);
}
static void rtw89_core_txq_work(struct work_struct *w)
@@ -3291,7 +3337,7 @@ void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
u32 reg;
int ret;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
rtw89_leave_ips_by_hwflags(rtwdev);
rtw89_leave_lps(rtwdev);
@@ -3330,9 +3376,9 @@ void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
rtw89_write32_clr(rtwdev, reg, B_AX_A_UC_CAM_MATCH | B_AX_A_BC_CAM_MATCH);
ieee80211_ready_on_channel(hw);
- cancel_delayed_work(&rtwvif->roc.roc_work);
- ieee80211_queue_delayed_work(hw, &rtwvif->roc.roc_work,
- msecs_to_jiffies(rtwvif->roc.duration));
+ wiphy_delayed_work_cancel(hw->wiphy, &rtwvif->roc.roc_work);
+ wiphy_delayed_work_queue(hw->wiphy, &rtwvif->roc.roc_work,
+ msecs_to_jiffies(rtwvif->roc.duration));
}
void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
@@ -3345,7 +3391,7 @@ void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
u32 reg;
int ret;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
ieee80211_remain_on_channel_expired(hw);
@@ -3377,18 +3423,18 @@ void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
queue_work(rtwdev->txq_wq, &rtwdev->txq_work);
if (hw->conf.flags & IEEE80211_CONF_IDLE)
- ieee80211_queue_delayed_work(hw, &roc->roc_work,
- msecs_to_jiffies(RTW89_ROC_IDLE_TIMEOUT));
+ wiphy_delayed_work_queue(hw->wiphy, &roc->roc_work,
+ msecs_to_jiffies(RTW89_ROC_IDLE_TIMEOUT));
}
-void rtw89_roc_work(struct work_struct *work)
+void rtw89_roc_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_vif *rtwvif = container_of(work, struct rtw89_vif,
roc.roc_work.work);
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
struct rtw89_roc *roc = &rtwvif->roc;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
switch (roc->state) {
case RTW89_ROC_IDLE:
@@ -3401,8 +3447,6 @@ void rtw89_roc_work(struct work_struct *work)
default:
break;
}
-
- mutex_unlock(&rtwdev->mutex);
}
static enum rtw89_tfc_lv rtw89_get_traffic_level(struct rtw89_dev *rtwdev,
@@ -3533,26 +3577,26 @@ void rtw89_traffic_stats_init(struct rtw89_dev *rtwdev,
ewma_tp_init(&stats->rx_ewma_tp);
}
-static void rtw89_track_work(struct work_struct *work)
+static void rtw89_track_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
track_work.work);
bool tfc_changed;
+ lockdep_assert_wiphy(wiphy);
+
if (test_bit(RTW89_FLAG_FORBIDDEN_TRACK_WROK, rtwdev->flags))
return;
- mutex_lock(&rtwdev->mutex);
-
if (!test_bit(RTW89_FLAG_RUNNING, rtwdev->flags))
- goto out;
+ return;
- ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->track_work,
- RTW89_TRACK_WORK_PERIOD);
+ wiphy_delayed_work_queue(wiphy, &rtwdev->track_work,
+ RTW89_TRACK_WORK_PERIOD);
tfc_changed = rtw89_traffic_stats_track(rtwdev);
if (rtwdev->scanning)
- goto out;
+ return;
rtw89_leave_lps(rtwdev);
@@ -3577,9 +3621,6 @@ static void rtw89_track_work(struct work_struct *work)
if (rtwdev->lps_enabled && !rtwdev->btc.lps)
rtw89_enter_lps_track(rtwdev);
-
-out:
- mutex_unlock(&rtwdev->mutex);
}
u8 rtw89_core_acquire_bit_map(unsigned long *addr, unsigned long size)
@@ -3613,7 +3654,7 @@ int rtw89_core_acquire_sta_ba_entry(struct rtw89_dev *rtwdev,
u8 idx;
int i;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
idx = rtw89_core_acquire_bit_map(cam_info->ba_cam_map, chip->bacam_num);
if (idx == chip->bacam_num) {
@@ -3657,7 +3698,7 @@ int rtw89_core_release_sta_ba_entry(struct rtw89_dev *rtwdev,
struct rtw89_ba_cam_entry *entry = NULL, *tmp;
u8 idx;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
list_for_each_entry_safe(entry, tmp, &rtwsta_link->ba_cam_list, list) {
if (entry->tid != tid)
@@ -4432,26 +4473,26 @@ static void rtw89_core_ppdu_sts_init(struct rtw89_dev *rtwdev)
{
int i;
- for (i = 0; i < RTW89_PHY_MAX; i++)
+ for (i = 0; i < RTW89_PHY_NUM; i++)
skb_queue_head_init(&rtwdev->ppdu_sts.rx_queue[i]);
- for (i = 0; i < RTW89_PHY_MAX; i++)
+ for (i = 0; i < RTW89_PHY_NUM; i++)
rtwdev->ppdu_sts.curr_rx_ppdu_cnt[i] = U8_MAX;
}
-void rtw89_core_update_beacon_work(struct work_struct *work)
+void rtw89_core_update_beacon_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev;
struct rtw89_vif_link *rtwvif_link = container_of(work, struct rtw89_vif_link,
update_beacon_work);
+ lockdep_assert_wiphy(wiphy);
+
if (rtwvif_link->net_type != RTW89_NET_TYPE_AP_MODE)
return;
rtwdev = rtwvif_link->rtwvif->rtwdev;
- mutex_lock(&rtwdev->mutex);
rtw89_chip_h2c_update_beacon(rtwdev, rtwvif_link);
- mutex_unlock(&rtwdev->mutex);
}
int rtw89_wait_for_cond(struct rtw89_wait_info *wait, unsigned int cond)
@@ -4560,16 +4601,14 @@ int rtw89_core_start(struct rtw89_dev *rtwdev)
rtw89_mac_cfg_phy_rpt_bands(rtwdev, true);
rtw89_mac_update_rts_threshold(rtwdev);
- rtw89_tas_reset(rtwdev);
-
ret = rtw89_hci_start(rtwdev);
if (ret) {
rtw89_err(rtwdev, "failed to start hci\n");
return ret;
}
- ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->track_work,
- RTW89_TRACK_WORK_PERIOD);
+ wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->track_work,
+ RTW89_TRACK_WORK_PERIOD);
set_bit(RTW89_FLAG_RUNNING, rtwdev->flags);
@@ -4583,8 +4622,11 @@ int rtw89_core_start(struct rtw89_dev *rtwdev)
void rtw89_core_stop(struct rtw89_dev *rtwdev)
{
+ struct wiphy *wiphy = rtwdev->hw->wiphy;
struct rtw89_btc *btc = &rtwdev->btc;
+ lockdep_assert_wiphy(wiphy);
+
/* Prvent to stop twice; enter_ips and ops_stop */
if (!test_bit(RTW89_FLAG_RUNNING, rtwdev->flags))
return;
@@ -4593,25 +4635,21 @@ void rtw89_core_stop(struct rtw89_dev *rtwdev)
clear_bit(RTW89_FLAG_RUNNING, rtwdev->flags);
- mutex_unlock(&rtwdev->mutex);
-
- cancel_work_sync(&rtwdev->c2h_work);
- cancel_work_sync(&rtwdev->cancel_6ghz_probe_work);
- cancel_work_sync(&btc->eapol_notify_work);
- cancel_work_sync(&btc->arp_notify_work);
- cancel_work_sync(&btc->dhcp_notify_work);
- cancel_work_sync(&btc->icmp_notify_work);
+ wiphy_work_cancel(wiphy, &rtwdev->c2h_work);
+ wiphy_work_cancel(wiphy, &rtwdev->cancel_6ghz_probe_work);
+ wiphy_work_cancel(wiphy, &btc->eapol_notify_work);
+ wiphy_work_cancel(wiphy, &btc->arp_notify_work);
+ wiphy_work_cancel(wiphy, &btc->dhcp_notify_work);
+ wiphy_work_cancel(wiphy, &btc->icmp_notify_work);
cancel_delayed_work_sync(&rtwdev->txq_reinvoke_work);
- cancel_delayed_work_sync(&rtwdev->track_work);
- cancel_delayed_work_sync(&rtwdev->chanctx_work);
- cancel_delayed_work_sync(&rtwdev->coex_act1_work);
- cancel_delayed_work_sync(&rtwdev->coex_bt_devinfo_work);
- cancel_delayed_work_sync(&rtwdev->coex_rfk_chk_work);
- cancel_delayed_work_sync(&rtwdev->cfo_track_work);
+ wiphy_delayed_work_cancel(wiphy, &rtwdev->track_work);
+ wiphy_delayed_work_cancel(wiphy, &rtwdev->chanctx_work);
+ wiphy_delayed_work_cancel(wiphy, &rtwdev->coex_act1_work);
+ wiphy_delayed_work_cancel(wiphy, &rtwdev->coex_bt_devinfo_work);
+ wiphy_delayed_work_cancel(wiphy, &rtwdev->coex_rfk_chk_work);
+ wiphy_delayed_work_cancel(wiphy, &rtwdev->cfo_track_work);
cancel_delayed_work_sync(&rtwdev->forbid_ba_work);
- cancel_delayed_work_sync(&rtwdev->antdiv_work);
-
- mutex_lock(&rtwdev->mutex);
+ wiphy_delayed_work_cancel(wiphy, &rtwdev->antdiv_work);
rtw89_btc_ntfy_poweroff(rtwdev);
rtw89_hci_flush_queues(rtwdev, BIT(rtwdev->hw->queues) - 1, true);
@@ -4825,20 +4863,19 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)
INIT_WORK(&rtwdev->ba_work, rtw89_core_ba_work);
INIT_WORK(&rtwdev->txq_work, rtw89_core_txq_work);
INIT_DELAYED_WORK(&rtwdev->txq_reinvoke_work, rtw89_core_txq_reinvoke_work);
- INIT_DELAYED_WORK(&rtwdev->track_work, rtw89_track_work);
- INIT_DELAYED_WORK(&rtwdev->chanctx_work, rtw89_chanctx_work);
- INIT_DELAYED_WORK(&rtwdev->coex_act1_work, rtw89_coex_act1_work);
- INIT_DELAYED_WORK(&rtwdev->coex_bt_devinfo_work, rtw89_coex_bt_devinfo_work);
- INIT_DELAYED_WORK(&rtwdev->coex_rfk_chk_work, rtw89_coex_rfk_chk_work);
- INIT_DELAYED_WORK(&rtwdev->cfo_track_work, rtw89_phy_cfo_track_work);
+ wiphy_delayed_work_init(&rtwdev->track_work, rtw89_track_work);
+ wiphy_delayed_work_init(&rtwdev->chanctx_work, rtw89_chanctx_work);
+ wiphy_delayed_work_init(&rtwdev->coex_act1_work, rtw89_coex_act1_work);
+ wiphy_delayed_work_init(&rtwdev->coex_bt_devinfo_work, rtw89_coex_bt_devinfo_work);
+ wiphy_delayed_work_init(&rtwdev->coex_rfk_chk_work, rtw89_coex_rfk_chk_work);
+ wiphy_delayed_work_init(&rtwdev->cfo_track_work, rtw89_phy_cfo_track_work);
INIT_DELAYED_WORK(&rtwdev->forbid_ba_work, rtw89_forbid_ba_work);
- INIT_DELAYED_WORK(&rtwdev->antdiv_work, rtw89_phy_antdiv_work);
+ wiphy_delayed_work_init(&rtwdev->antdiv_work, rtw89_phy_antdiv_work);
rtwdev->txq_wq = alloc_workqueue("rtw89_tx_wq", WQ_UNBOUND | WQ_HIGHPRI, 0);
if (!rtwdev->txq_wq)
return -ENOMEM;
spin_lock_init(&rtwdev->ba_lock);
spin_lock_init(&rtwdev->rpwm_lock);
- mutex_init(&rtwdev->mutex);
mutex_init(&rtwdev->rf_mutex);
rtwdev->total_sta_assoc = 0;
@@ -4847,10 +4884,10 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)
rtw89_init_wait(&rtwdev->wow.wait);
rtw89_init_wait(&rtwdev->mac.ps_wait);
- INIT_WORK(&rtwdev->c2h_work, rtw89_fw_c2h_work);
- INIT_WORK(&rtwdev->ips_work, rtw89_ips_work);
+ wiphy_work_init(&rtwdev->c2h_work, rtw89_fw_c2h_work);
+ wiphy_work_init(&rtwdev->ips_work, rtw89_ips_work);
+ wiphy_work_init(&rtwdev->cancel_6ghz_probe_work, rtw89_cancel_6ghz_probe_work);
INIT_WORK(&rtwdev->load_firmware_work, rtw89_load_firmware_work);
- INIT_WORK(&rtwdev->cancel_6ghz_probe_work, rtw89_cancel_6ghz_probe_work);
skb_queue_head_init(&rtwdev->c2h_queue);
rtw89_core_ppdu_sts_init(rtwdev);
@@ -4867,10 +4904,13 @@ int rtw89_core_init(struct rtw89_dev *rtwdev)
rtwdev->mlo_dbcc_mode = MLO_2_PLUS_0_1RF;
}
- INIT_WORK(&btc->eapol_notify_work, rtw89_btc_ntfy_eapol_packet_work);
- INIT_WORK(&btc->arp_notify_work, rtw89_btc_ntfy_arp_packet_work);
- INIT_WORK(&btc->dhcp_notify_work, rtw89_btc_ntfy_dhcp_packet_work);
- INIT_WORK(&btc->icmp_notify_work, rtw89_btc_ntfy_icmp_packet_work);
+ rtwdev->bbs[RTW89_PHY_0].phy_idx = RTW89_PHY_0;
+ rtwdev->bbs[RTW89_PHY_1].phy_idx = RTW89_PHY_1;
+
+ wiphy_work_init(&btc->eapol_notify_work, rtw89_btc_ntfy_eapol_packet_work);
+ wiphy_work_init(&btc->arp_notify_work, rtw89_btc_ntfy_arp_packet_work);
+ wiphy_work_init(&btc->dhcp_notify_work, rtw89_btc_ntfy_dhcp_packet_work);
+ wiphy_work_init(&btc->icmp_notify_work, rtw89_btc_ntfy_icmp_packet_work);
init_completion(&rtwdev->fw.req.completion);
init_completion(&rtwdev->rfk_wait.completion);
@@ -4890,11 +4930,10 @@ void rtw89_core_deinit(struct rtw89_dev *rtwdev)
{
rtw89_ser_deinit(rtwdev);
rtw89_unload_firmware(rtwdev);
- rtw89_fw_free_all_early_h2c(rtwdev);
+ __rtw89_fw_free_all_early_h2c(rtwdev);
destroy_workqueue(rtwdev->txq_wq);
mutex_destroy(&rtwdev->rf_mutex);
- mutex_destroy(&rtwdev->mutex);
}
EXPORT_SYMBOL(rtw89_core_deinit);
@@ -4903,6 +4942,7 @@ void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwv
{
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
rtwvif_link->chanctx_idx);
+ struct rtw89_bb_ctx *bb = rtw89_get_bb_ctx(rtwdev, rtwvif_link->phy_idx);
rtwdev->scanning = true;
rtw89_leave_lps(rtwdev);
@@ -4913,7 +4953,8 @@ void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwv
rtw89_btc_ntfy_scan_start(rtwdev, rtwvif_link->phy_idx, chan->band_type);
rtw89_chip_rfk_scan(rtwdev, rtwvif_link, true);
rtw89_hci_recalc_int_mit(rtwdev);
- rtw89_phy_config_edcca(rtwdev, true);
+ rtw89_phy_config_edcca(rtwdev, bb, true);
+ rtw89_tas_scan(rtwdev, true);
rtw89_fw_h2c_cam(rtwdev, rtwvif_link, NULL, mac_addr);
}
@@ -4922,6 +4963,7 @@ void rtw89_core_scan_complete(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link, bool hw_scan)
{
struct ieee80211_bss_conf *bss_conf;
+ struct rtw89_bb_ctx *bb;
if (!rtwvif_link)
return;
@@ -4937,12 +4979,15 @@ void rtw89_core_scan_complete(struct rtw89_dev *rtwdev,
rtw89_chip_rfk_scan(rtwdev, rtwvif_link, false);
rtw89_btc_ntfy_scan_finish(rtwdev, rtwvif_link->phy_idx);
- rtw89_phy_config_edcca(rtwdev, false);
+ bb = rtw89_get_bb_ctx(rtwdev, rtwvif_link->phy_idx);
+ rtw89_phy_config_edcca(rtwdev, bb, false);
+ rtw89_tas_scan(rtwdev, false);
rtwdev->scanning = false;
- rtwdev->dig.bypass_dig = true;
+ rtw89_for_each_active_bb(rtwdev, bb)
+ bb->dig.bypass_dig = true;
if (hw_scan && (rtwdev->hw->conf.flags & IEEE80211_CONF_IDLE))
- ieee80211_queue_work(rtwdev->hw, &rtwdev->ips_work);
+ wiphy_work_queue(rtwdev->hw->wiphy, &rtwdev->ips_work);
}
static void rtw89_read_chip_ver(struct rtw89_dev *rtwdev)
@@ -5042,8 +5087,6 @@ static int rtw89_chip_efuse_info_setup(struct rtw89_dev *rtwdev)
rtw89_hci_mac_pre_deinit(rtwdev);
- rtw89_mac_pwr_off(rtwdev);
-
return 0;
}
@@ -5124,36 +5167,45 @@ int rtw89_chip_info_setup(struct rtw89_dev *rtwdev)
rtw89_read_chip_ver(rtwdev);
+ ret = rtw89_mac_pwr_on(rtwdev);
+ if (ret) {
+ rtw89_err(rtwdev, "failed to power on\n");
+ return ret;
+ }
+
ret = rtw89_wait_firmware_completion(rtwdev);
if (ret) {
rtw89_err(rtwdev, "failed to wait firmware completion\n");
- return ret;
+ goto out;
}
ret = rtw89_fw_recognize(rtwdev);
if (ret) {
rtw89_err(rtwdev, "failed to recognize firmware\n");
- return ret;
+ goto out;
}
ret = rtw89_chip_efuse_info_setup(rtwdev);
if (ret)
- return ret;
+ goto out;
ret = rtw89_fw_recognize_elements(rtwdev);
if (ret) {
rtw89_err(rtwdev, "failed to recognize firmware elements\n");
- return ret;
+ goto out;
}
ret = rtw89_chip_board_info_setup(rtwdev);
if (ret)
- return ret;
+ goto out;
rtw89_core_setup_rfe_parms(rtwdev);
rtwdev->ps_mode = rtw89_update_ps_mode(rtwdev);
- return 0;
+out:
+ rtw89_mac_pwr_off(rtwdev);
+
+ return ret;
}
EXPORT_SYMBOL(rtw89_chip_info_setup);
@@ -5296,7 +5348,7 @@ static int rtw89_core_register_hw(struct rtw89_dev *rtwdev)
goto err_free_supported_band;
}
- ret = rtw89_regd_init(rtwdev, rtw89_regd_notifier);
+ ret = rtw89_regd_init_hint(rtwdev);
if (ret) {
rtw89_err(rtwdev, "failed to init regd\n");
goto err_unregister_hw;
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index ff4894c7fa8a..4be05d6cad18 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -17,11 +17,13 @@ struct rtw89_dev;
struct rtw89_pci_info;
struct rtw89_mac_gen_def;
struct rtw89_phy_gen_def;
+struct rtw89_fw_blacklist;
struct rtw89_efuse_block_cfg;
struct rtw89_h2c_rf_tssi;
struct rtw89_fw_txpwr_track_cfg;
struct rtw89_phy_rfk_log_fmt;
struct rtw89_debugfs;
+struct rtw89_regd_data;
extern const struct ieee80211_ops rtw89_ops;
@@ -718,6 +720,7 @@ enum rtw89_ofdma_type {
RTW89_OFDMA_NUM,
};
+/* neither insert new in the middle, nor change any given definition */
enum rtw89_regulation_type {
RTW89_WW = 0,
RTW89_ETSI = 1,
@@ -826,7 +829,7 @@ enum rtw89_mac_idx {
enum rtw89_phy_idx {
RTW89_PHY_0 = 0,
RTW89_PHY_1 = 1,
- RTW89_PHY_MAX
+ RTW89_PHY_NUM,
};
#define __RTW89_MLD_MAX_LINK_NUM 2
@@ -1540,16 +1543,16 @@ struct rtw89_btc_u8_sta_chg {
};
struct rtw89_btc_wl_scan_info {
- u8 band[RTW89_PHY_MAX];
+ u8 band[RTW89_PHY_NUM];
u8 phy_map;
u8 rsvd;
};
struct rtw89_btc_wl_dbcc_info {
- u8 op_band[RTW89_PHY_MAX]; /* op band in each phy */
- u8 scan_band[RTW89_PHY_MAX]; /* scan band in each phy */
- u8 real_band[RTW89_PHY_MAX];
- u8 role[RTW89_PHY_MAX]; /* role in each phy */
+ u8 op_band[RTW89_PHY_NUM]; /* op band in each phy */
+ u8 scan_band[RTW89_PHY_NUM]; /* scan band in each phy */
+ u8 real_band[RTW89_PHY_NUM];
+ u8 role[RTW89_PHY_NUM]; /* role in each phy */
};
struct rtw89_btc_wl_active_role {
@@ -1761,7 +1764,8 @@ struct rtw89_btc_wl_rfk_info {
u32 phy_map: 2;
u32 band: 2;
u32 type: 8;
- u32 rsvd: 14;
+ u32 con_rfk: 1;
+ u32 rsvd: 13;
u32 start_time;
u32 proc_time;
@@ -1898,7 +1902,7 @@ struct rtw89_btc_wl_info {
u8 cn_report;
u8 coex_mode;
u8 pta_req_mac;
- u8 bt_polut_type[RTW89_PHY_MAX]; /* BT polluted WL-Tx type for phy0/1 */
+ u8 bt_polut_type[RTW89_PHY_NUM]; /* BT polluted WL-Tx type for phy0/1 */
bool is_5g_hi_channel;
bool pta_reg_mac_chg;
@@ -2230,7 +2234,7 @@ struct rtw89_btc_fbtc_rpt_ctrl_v4 {
struct rtw89_btc_fbtc_rpt_ctrl_wl_fw_info wl_fw_info;
struct rtw89_btc_fbtc_rpt_ctrl_bt_mailbox bt_mbx_info;
__le32 bt_cnt[BTC_BCNT_STA_MAX];
- struct rtw89_mac_ax_gnt gnt_val[RTW89_PHY_MAX];
+ struct rtw89_mac_ax_gnt gnt_val[RTW89_PHY_NUM];
} __packed;
struct rtw89_btc_fbtc_rpt_ctrl_v5 {
@@ -2238,7 +2242,7 @@ struct rtw89_btc_fbtc_rpt_ctrl_v5 {
u8 rsvd;
__le16 rsvd1;
- u8 gnt_val[RTW89_PHY_MAX][4];
+ u8 gnt_val[RTW89_PHY_NUM][4];
__le16 bt_cnt[BTC_BCNT_STA_MAX];
struct rtw89_btc_fbtc_rpt_ctrl_info_v5 rpt_info;
@@ -2250,7 +2254,7 @@ struct rtw89_btc_fbtc_rpt_ctrl_v105 {
u8 rsvd;
__le16 rsvd1;
- u8 gnt_val[RTW89_PHY_MAX][4];
+ u8 gnt_val[RTW89_PHY_NUM][4];
__le16 bt_cnt[BTC_BCNT_STA_MAX_V105];
struct rtw89_btc_fbtc_rpt_ctrl_info_v5 rpt_info;
@@ -2263,7 +2267,7 @@ struct rtw89_btc_fbtc_rpt_ctrl_v7 {
u8 rsvd1;
u8 rsvd2;
- u8 gnt_val[RTW89_PHY_MAX][4];
+ u8 gnt_val[RTW89_PHY_NUM][4];
__le16 bt_cnt[BTC_BCNT_STA_MAX_V105];
struct rtw89_btc_fbtc_rpt_ctrl_info_v8 rpt_info;
@@ -2276,7 +2280,7 @@ struct rtw89_btc_fbtc_rpt_ctrl_v8 {
u8 rpt_len_max_l; /* BTC_RPT_MAX bit0~7 */
u8 rpt_len_max_h; /* BTC_RPT_MAX bit8~15 */
- u8 gnt_val[RTW89_PHY_MAX][4];
+ u8 gnt_val[RTW89_PHY_NUM][4];
__le16 bt_cnt[BTC_BCNT_STA_MAX_V105];
struct rtw89_btc_fbtc_rpt_ctrl_info_v8 rpt_info;
@@ -3040,6 +3044,7 @@ struct rtw89_btc_rpt_cmn_info {
union rtw89_btc_fbtc_btafh_info {
struct rtw89_btc_fbtc_btafh v1;
struct rtw89_btc_fbtc_btafh_v2 v2;
+ struct rtw89_btc_fbtc_btafh_v7 v7;
};
struct rtw89_btc_report_ctrl_state {
@@ -3174,10 +3179,10 @@ struct rtw89_btc {
struct rtw89_btc_btf_fwinfo fwinfo;
struct rtw89_btc_dbg dbg;
- struct work_struct eapol_notify_work;
- struct work_struct arp_notify_work;
- struct work_struct dhcp_notify_work;
- struct work_struct icmp_notify_work;
+ struct wiphy_work eapol_notify_work;
+ struct wiphy_work arp_notify_work;
+ struct wiphy_work dhcp_notify_work;
+ struct wiphy_work icmp_notify_work;
u32 bt_req_len;
@@ -3444,7 +3449,7 @@ enum rtw89_roc_state {
struct rtw89_roc {
struct ieee80211_channel chan;
- struct delayed_work roc_work;
+ struct wiphy_delayed_work roc_work;
enum ieee80211_roc_type type;
enum rtw89_roc_state state;
int duration;
@@ -3498,6 +3503,7 @@ struct rtw89_vif_link {
u8 self_role;
u8 wmm;
u8 bcn_hit_cond;
+ u8 bcn_bw_idx;
u8 hit_rule;
u8 last_noa_nr;
u64 sync_bcn_tsf;
@@ -3514,7 +3520,7 @@ struct rtw89_vif_link {
bool pre_pwr_diff_en;
bool pwr_diff_en;
u8 def_tri_idx;
- struct work_struct update_beacon_work;
+ struct wiphy_work update_beacon_work;
struct rtw89_addr_cam_entry addr_cam;
struct rtw89_bssid_cam_entry bssid_cam;
struct ieee80211_tx_queue_params tx_params[IEEE80211_NUM_ACS];
@@ -3672,6 +3678,8 @@ struct rtw89_chip_ops {
int (*h2c_ampdu_cmac_tbl)(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link,
struct rtw89_sta_link *rtwsta_link);
+ int (*h2c_txtime_cmac_tbl)(struct rtw89_dev *rtwdev,
+ struct rtw89_sta_link *rtwsta_link);
int (*h2c_default_dmac_tbl)(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link,
struct rtw89_sta_link *rtwsta_link);
@@ -4189,10 +4197,12 @@ struct rtw89_edcca_regs {
u32 edcca_p_mask;
u32 ppdu_level;
u32 ppdu_mask;
- u32 rpt_a;
- u32 rpt_b;
- u32 rpt_sel;
- u32 rpt_sel_mask;
+ struct rtw89_edcca_p_regs {
+ u32 rpt_a;
+ u32 rpt_b;
+ u32 rpt_sel;
+ u32 rpt_sel_mask;
+ } p[RTW89_PHY_NUM];
u32 rpt_sel_be;
u32 rpt_sel_be_mask;
u32 tx_collision_t2r_st;
@@ -4231,6 +4241,7 @@ enum rtw89_chanctx_state {
enum rtw89_chanctx_callbacks {
RTW89_CHANCTX_CALLBACK_PLACEHOLDER,
RTW89_CHANCTX_CALLBACK_RFK,
+ RTW89_CHANCTX_CALLBACK_TAS,
NUM_OF_RTW89_CHANCTX_CALLBACKS,
};
@@ -4251,6 +4262,7 @@ struct rtw89_chip_info {
bool try_ce_fw;
u8 bbmcu_nr;
u32 needed_fw_elms;
+ const struct rtw89_fw_blacklist *fw_blacklist;
u32 fifo_size;
bool small_fifo_size;
u32 dle_scc_rsvd_size;
@@ -4271,10 +4283,13 @@ struct rtw89_chip_info {
bool support_unii4;
bool support_rnr;
bool support_ant_gain;
+ bool support_tas;
bool ul_tb_waveform_ctrl;
bool ul_tb_pwr_diff;
+ bool rx_freq_frome_ie;
bool hw_sec_hdr;
bool hw_mgmt_tx_encrypt;
+ bool hw_tkip_crypto;
u8 rf_path_num;
u8 tx_nss;
u8 rx_nss;
@@ -4478,6 +4493,7 @@ enum rtw89_fw_feature {
RTW89_FW_FEATURE_CH_INFO_BE_V0,
RTW89_FW_FEATURE_LPS_CH_INFO,
RTW89_FW_FEATURE_NO_PHYCAP_P1,
+ RTW89_FW_FEATURE_NO_POWER_DIFFERENCE,
};
struct rtw89_fw_suit {
@@ -4536,6 +4552,7 @@ struct rtw89_fw_elm_info {
struct rtw89_phy_table *rf_nctl;
struct rtw89_fw_txpwr_track_cfg *txpwr_trk;
struct rtw89_phy_rfk_log_fmt *rfk_log_fmt;
+ const struct rtw89_regd_data *regd;
};
enum rtw89_fw_mss_dev_type {
@@ -4651,6 +4668,7 @@ enum rtw89_ant_gain_domain_type {
struct rtw89_ant_gain_info {
s8 offset[RTW89_ANT_GAIN_CHAIN_NUM][RTW89_ANT_GAIN_SUBBAND_NR];
u32 regd_enabled;
+ bool block_country;
};
struct rtw89_6ghz_span {
@@ -4666,18 +4684,29 @@ struct rtw89_6ghz_span {
enum rtw89_tas_state {
RTW89_TAS_STATE_DPR_OFF,
RTW89_TAS_STATE_DPR_ON,
- RTW89_TAS_STATE_DPR_FORBID,
+ RTW89_TAS_STATE_STATIC_SAR,
};
-#define RTW89_TAS_MAX_WINDOW 50
+#define RTW89_TAS_TX_RATIO_WINDOW 6
+#define RTW89_TAS_TXPWR_WINDOW 180
struct rtw89_tas_info {
- s16 txpwr_history[RTW89_TAS_MAX_WINDOW];
- s32 total_txpwr;
- u8 cur_idx;
- s8 dpr_gap;
- s8 delta;
+ u16 tx_ratio_history[RTW89_TAS_TX_RATIO_WINDOW];
+ u64 txpwr_history[RTW89_TAS_TXPWR_WINDOW];
+ u8 txpwr_head_idx;
+ u8 txpwr_tail_idx;
+ u8 tx_ratio_idx;
+ u16 total_tx_ratio;
+ u64 total_txpwr;
+ u64 instant_txpwr;
+ u32 window_size;
+ s8 dpr_on_threshold;
+ s8 dpr_off_threshold;
+ enum rtw89_tas_state backup_state;
enum rtw89_tas_state state;
+ bool keep_history;
+ bool block_regd;
bool enable;
+ bool pause;
};
struct rtw89_chanctx_cfg {
@@ -4735,6 +4764,7 @@ struct rtw89_edcca_bak {
enum rtw89_dm_type {
RTW89_DM_DYNAMIC_EDCCA,
RTW89_DM_THERMAL_PROTECT,
+ RTW89_DM_TAS,
};
#define RTW89_THERMAL_PROT_LV_MAX 5
@@ -4762,12 +4792,11 @@ struct rtw89_hal {
struct rtw89_chanctx chanctx[NUM_OF_RTW89_CHANCTX];
struct cfg80211_chan_def roc_chandef;
- bool entity_active[RTW89_PHY_MAX];
+ bool entity_active[RTW89_PHY_NUM];
bool entity_pause;
enum rtw89_entity_mode entity_mode;
struct rtw89_entity_mgnt entity_mgnt;
- struct rtw89_edcca_bak edcca_bak;
u32 disabled_dm_bitmap; /* bitmap of enum rtw89_dm_type */
u8 thermal_prot_th;
@@ -4973,7 +5002,7 @@ struct rtw89_dpk_bkup_para {
struct rtw89_dpk_info {
bool is_dpk_enable;
bool is_dpk_reload_en;
- u8 dpk_gs[RTW89_PHY_MAX];
+ u8 dpk_gs[RTW89_PHY_NUM];
u16 dc_i[RTW89_DPK_RF_PATH][RTW89_DPK_BKUP_NUM];
u16 dc_q[RTW89_DPK_RF_PATH][RTW89_DPK_BKUP_NUM];
u8 corr_val[RTW89_DPK_RF_PATH][RTW89_DPK_BKUP_NUM];
@@ -5135,7 +5164,7 @@ struct rtw89_tssi_info {
u32 alignment_backup_by_ch[RF_PATH_MAX][TSSI_MAX_CH_NUM][TSSI_ALIMK_VALUE_NUM];
u32 alignment_value[RF_PATH_MAX][TSSI_ALIMK_MAX][TSSI_ALIMK_VALUE_NUM];
bool alignment_done[RF_PATH_MAX][TSSI_ALIMK_MAX];
- u32 tssi_alimk_time;
+ u64 tssi_alimk_time;
};
struct rtw89_power_trim_info {
@@ -5146,9 +5175,27 @@ struct rtw89_power_trim_info {
u8 pad_bias_trim[RF_PATH_MAX];
};
+enum rtw89_regd_func {
+ RTW89_REGD_FUNC_TAS = 0, /* TAS (Time Average SAR) */
+ RTW89_REGD_FUNC_DAG = 1, /* DAG (Dynamic Antenna Gain) */
+
+ NUM_OF_RTW89_REGD_FUNC,
+};
+
struct rtw89_regd {
char alpha2[3];
u8 txpwr_regd[RTW89_BAND_NUM];
+ DECLARE_BITMAP(func_bitmap, NUM_OF_RTW89_REGD_FUNC);
+};
+
+struct rtw89_regd_data {
+ unsigned int nr;
+ struct rtw89_regd map[] __counted_by(nr);
+};
+
+struct rtw89_regd_ctrl {
+ unsigned int nr;
+ const struct rtw89_regd *map;
};
#define RTW89_REGD_MAX_COUNTRY_NUM U8_MAX
@@ -5156,6 +5203,7 @@ struct rtw89_regd {
#define RTW89_5GHZ_UNII4_START_INDEX 25
struct rtw89_regulatory_info {
+ struct rtw89_regd_ctrl ctrl;
const struct rtw89_regd *regd;
enum rtw89_reg_6ghz_power reg_6ghz_power;
struct rtw89_reg_6ghz_tpe reg_6ghz_tpe;
@@ -5299,8 +5347,8 @@ struct rtw89_lps_parm {
};
struct rtw89_ppdu_sts_info {
- struct sk_buff_head rx_queue[RTW89_PHY_MAX];
- u8 curr_rx_ppdu_cnt[RTW89_PHY_MAX];
+ struct sk_buff_head rx_queue[RTW89_PHY_NUM];
+ u8 curr_rx_ppdu_cnt[RTW89_PHY_NUM];
};
struct rtw89_early_h2c {
@@ -5419,8 +5467,8 @@ struct rtw89_phy_efuse_gain {
bool offset_valid;
bool comp_valid;
s8 offset[RF_PATH_MAX][RTW89_GAIN_OFFSET_NR]; /* S(8, 0) */
- s8 offset_base[RTW89_PHY_MAX]; /* S(8, 4) */
- s8 rssi_base[RTW89_PHY_MAX]; /* S(8, 4) */
+ s8 offset_base[RTW89_PHY_NUM]; /* S(8, 4) */
+ s8 rssi_base[RTW89_PHY_NUM]; /* S(8, 4) */
s8 comp[RF_PATH_MAX][RTW89_SUBBAND_NR]; /* S(8, 0) */
};
@@ -5629,8 +5677,6 @@ struct rtw89_dev {
struct rtw89_sta_link __rcu *assoc_link_on_macid[RTW89_MAX_MAC_ID_NUM];
refcount_t refcount_ap_info;
- /* ensures exclusive access from mac80211 callbacks */
- struct mutex mutex;
struct list_head rtwvifs_list;
/* used to protect rf read write */
struct mutex rf_mutex;
@@ -5650,10 +5696,10 @@ struct rtw89_dev {
struct rtw89_cam_info cam_info;
struct sk_buff_head c2h_queue;
- struct work_struct c2h_work;
- struct work_struct ips_work;
+ struct wiphy_work c2h_work;
+ struct wiphy_work ips_work;
+ struct wiphy_work cancel_6ghz_probe_work;
struct work_struct load_firmware_work;
- struct work_struct cancel_6ghz_probe_work;
struct list_head early_h2c_list;
@@ -5682,9 +5728,6 @@ struct rtw89_dev {
struct rtw89_power_trim_info pwr_trim;
struct rtw89_cfo_tracking_info cfo_tracking;
- struct rtw89_env_monitor_info env_monitor;
- struct rtw89_dig_info dig;
- struct rtw89_phy_ch_info ch_info;
union {
struct rtw89_phy_bb_gain_info ax;
struct rtw89_phy_bb_gain_info_be be;
@@ -5693,15 +5736,22 @@ struct rtw89_dev {
struct rtw89_phy_ul_tb_info ul_tb_info;
struct rtw89_antdiv_info antdiv;
- struct delayed_work track_work;
- struct delayed_work chanctx_work;
- struct delayed_work coex_act1_work;
- struct delayed_work coex_bt_devinfo_work;
- struct delayed_work coex_rfk_chk_work;
- struct delayed_work cfo_track_work;
+ struct rtw89_bb_ctx {
+ enum rtw89_phy_idx phy_idx;
+ struct rtw89_env_monitor_info env_monitor;
+ struct rtw89_dig_info dig;
+ struct rtw89_phy_ch_info ch_info;
+ struct rtw89_edcca_bak edcca_bak;
+ } bbs[RTW89_PHY_NUM];
+
+ struct wiphy_delayed_work track_work;
+ struct wiphy_delayed_work chanctx_work;
+ struct wiphy_delayed_work coex_act1_work;
+ struct wiphy_delayed_work coex_bt_devinfo_work;
+ struct wiphy_delayed_work coex_rfk_chk_work;
+ struct wiphy_delayed_work cfo_track_work;
struct delayed_work forbid_ba_work;
- struct delayed_work roc_work;
- struct delayed_work antdiv_work;
+ struct wiphy_delayed_work antdiv_work;
struct rtw89_ppdu_sts_info ppdu_sts;
u8 total_sta_assoc;
bool scanning;
@@ -6978,6 +7028,48 @@ static inline bool rtw89_is_mlo_1_1(struct rtw89_dev *rtwdev)
}
}
+static inline u8 rtw89_get_active_phy_bitmap(struct rtw89_dev *rtwdev)
+{
+ if (!rtwdev->dbcc_en)
+ return BIT(RTW89_PHY_0);
+
+ switch (rtwdev->mlo_dbcc_mode) {
+ case MLO_0_PLUS_2_1RF:
+ case MLO_0_PLUS_2_2RF:
+ return BIT(RTW89_PHY_1);
+ case MLO_1_PLUS_1_1RF:
+ case MLO_1_PLUS_1_2RF:
+ case MLO_2_PLUS_2_2RF:
+ case DBCC_LEGACY:
+ return BIT(RTW89_PHY_0) | BIT(RTW89_PHY_1);
+ case MLO_2_PLUS_0_1RF:
+ case MLO_2_PLUS_0_2RF:
+ default:
+ return BIT(RTW89_PHY_0);
+ }
+}
+
+#define rtw89_for_each_active_bb(rtwdev, bb) \
+ for (u8 __active_bb_bitmap = rtw89_get_active_phy_bitmap(rtwdev), \
+ __phy_idx = 0; __phy_idx < RTW89_PHY_NUM; __phy_idx++) \
+ if (__active_bb_bitmap & BIT(__phy_idx) && \
+ (bb = &rtwdev->bbs[__phy_idx]))
+
+#define rtw89_for_each_capab_bb(rtwdev, bb) \
+ for (u8 __phy_idx_max = rtwdev->dbcc_en ? RTW89_PHY_1 : RTW89_PHY_0, \
+ __phy_idx = 0; __phy_idx <= __phy_idx_max; __phy_idx++) \
+ if ((bb = &rtwdev->bbs[__phy_idx]))
+
+static inline
+struct rtw89_bb_ctx *rtw89_get_bb_ctx(struct rtw89_dev *rtwdev,
+ enum rtw89_phy_idx phy_idx)
+{
+ if (phy_idx >= RTW89_PHY_NUM)
+ return &rtwdev->bbs[RTW89_PHY_0];
+
+ return &rtwdev->bbs[phy_idx];
+}
+
static inline bool rtw89_is_rtl885xb(struct rtw89_dev *rtwdev)
{
enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
@@ -7092,9 +7184,7 @@ void rtw89_chip_cfg_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link);
bool rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate, u16 *bitrate);
int rtw89_regd_setup(struct rtw89_dev *rtwdev);
-int rtw89_regd_init(struct rtw89_dev *rtwdev,
- void (*reg_notifier)(struct wiphy *wiphy, struct regulatory_request *request));
-void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request);
+int rtw89_regd_init_hint(struct rtw89_dev *rtwdev);
void rtw89_traffic_stats_init(struct rtw89_dev *rtwdev,
struct rtw89_traffic_stats *stats);
int rtw89_wait_for_cond(struct rtw89_wait_info *wait, unsigned int cond);
@@ -7102,8 +7192,8 @@ void rtw89_complete_cond(struct rtw89_wait_info *wait, unsigned int cond,
const struct rtw89_completion_data *data);
int rtw89_core_start(struct rtw89_dev *rtwdev);
void rtw89_core_stop(struct rtw89_dev *rtwdev);
-void rtw89_core_update_beacon_work(struct work_struct *work);
-void rtw89_roc_work(struct work_struct *work);
+void rtw89_core_update_beacon_work(struct wiphy *wiphy, struct wiphy_work *work);
+void rtw89_roc_work(struct wiphy *wiphy, struct wiphy_work *work);
void rtw89_roc_start(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
void rtw89_roc_end(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
void rtw89_core_scan_start(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
diff --git a/drivers/net/wireless/realtek/rtw89/debug.c b/drivers/net/wireless/realtek/rtw89/debug.c
index 09fa977a6e6d..f2c5753fd386 100644
--- a/drivers/net/wireless/realtek/rtw89/debug.c
+++ b/drivers/net/wireless/realtek/rtw89/debug.c
@@ -13,6 +13,7 @@
#include "ps.h"
#include "reg.h"
#include "sar.h"
+#include "util.h"
#ifdef CONFIG_RTW89_DEBUGMSG
unsigned int rtw89_debug_mask;
@@ -22,11 +23,21 @@ MODULE_PARM_DESC(debug_mask, "Debugging mask");
#endif
#ifdef CONFIG_RTW89_DEBUGFS
+struct rtw89_debugfs_priv_opt {
+ bool rlock:1;
+ bool wlock:1;
+ size_t rsize;
+};
+
struct rtw89_debugfs_priv {
struct rtw89_dev *rtwdev;
- int (*cb_read)(struct seq_file *m, void *v);
- ssize_t (*cb_write)(struct file *filp, const char __user *buffer,
- size_t count, loff_t *loff);
+ ssize_t (*cb_read)(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz);
+ ssize_t (*cb_write)(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count);
+ struct rtw89_debugfs_priv_opt opt;
union {
u32 cb_data;
struct {
@@ -51,6 +62,8 @@ struct rtw89_debugfs_priv {
u8 sel;
} mac_mem;
};
+ ssize_t rused;
+ char *rbuf;
};
struct rtw89_debugfs {
@@ -74,6 +87,28 @@ struct rtw89_debugfs {
struct rtw89_debugfs_priv disable_dm;
};
+struct rtw89_debugfs_iter_data {
+ char *buf;
+ size_t bufsz;
+ int written_sz;
+};
+
+static void rtw89_debugfs_iter_data_setup(struct rtw89_debugfs_iter_data *iter_data,
+ char *buf, size_t bufsz)
+{
+ iter_data->buf = buf;
+ iter_data->bufsz = bufsz;
+ iter_data->written_sz = 0;
+}
+
+static void rtw89_debugfs_iter_data_next(struct rtw89_debugfs_iter_data *iter_data,
+ char *buf, size_t bufsz, int written_sz)
+{
+ iter_data->buf = buf;
+ iter_data->bufsz = bufsz;
+ iter_data->written_sz += written_sz;
+}
+
static const u16 rtw89_rate_info_bw_to_mhz_map[] = {
[RATE_INFO_BW_20] = 20,
[RATE_INFO_BW_40] = 40,
@@ -90,84 +125,122 @@ static u16 rtw89_rate_info_bw_to_mhz(enum rate_info_bw bw)
return 0;
}
-static int rtw89_debugfs_single_show(struct seq_file *m, void *v)
+static ssize_t rtw89_debugfs_file_read_helper(struct wiphy *wiphy, struct file *file,
+ char *buf, size_t bufsz, void *data)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
+ struct rtw89_debugfs_priv *debugfs_priv = data;
+ struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
+ ssize_t n;
- return debugfs_priv->cb_read(m, v);
+ n = debugfs_priv->cb_read(rtwdev, debugfs_priv, buf, bufsz);
+ rtw89_might_trailing_ellipsis(buf, bufsz, n);
+
+ return n;
}
-static ssize_t rtw89_debugfs_single_write(struct file *filp,
- const char __user *buffer,
- size_t count, loff_t *loff)
+static ssize_t rtw89_debugfs_file_read(struct file *file, char __user *userbuf,
+ size_t count, loff_t *ppos)
{
- struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
+ struct rtw89_debugfs_priv *debugfs_priv = file->private_data;
+ struct rtw89_debugfs_priv_opt *opt = &debugfs_priv->opt;
+ struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
+ size_t bufsz = opt->rsize ? opt->rsize : PAGE_SIZE;
+ char *buf;
+ ssize_t n;
- return debugfs_priv->cb_write(filp, buffer, count, loff);
-}
+ if (!debugfs_priv->rbuf)
+ debugfs_priv->rbuf = devm_kzalloc(rtwdev->dev, bufsz, GFP_KERNEL);
-static ssize_t rtw89_debugfs_seq_file_write(struct file *filp,
- const char __user *buffer,
- size_t count, loff_t *loff)
-{
- struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
- struct rtw89_debugfs_priv *debugfs_priv = seqpriv->private;
+ buf = debugfs_priv->rbuf;
+ if (!buf)
+ return -ENOMEM;
+
+ if (*ppos) {
+ n = debugfs_priv->rused;
+ goto out;
+ }
+
+ if (opt->rlock) {
+ n = wiphy_locked_debugfs_read(rtwdev->hw->wiphy, file, buf, bufsz,
+ userbuf, count, ppos,
+ rtw89_debugfs_file_read_helper,
+ debugfs_priv);
+ debugfs_priv->rused = n;
- return debugfs_priv->cb_write(filp, buffer, count, loff);
+ return n;
+ }
+
+ n = rtw89_debugfs_file_read_helper(rtwdev->hw->wiphy, file, buf, bufsz,
+ debugfs_priv);
+ debugfs_priv->rused = n;
+
+out:
+ return simple_read_from_buffer(userbuf, count, ppos, buf, n);
}
-static int rtw89_debugfs_single_open(struct inode *inode, struct file *filp)
+static ssize_t rtw89_debugfs_file_write_helper(struct wiphy *wiphy, struct file *file,
+ char *buf, size_t count, void *data)
{
- return single_open(filp, rtw89_debugfs_single_show, inode->i_private);
+ struct rtw89_debugfs_priv *debugfs_priv = data;
+ struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
+
+ return debugfs_priv->cb_write(rtwdev, debugfs_priv, buf, count);
}
-static int rtw89_debugfs_close(struct inode *inode, struct file *filp)
+static ssize_t rtw89_debugfs_file_write(struct file *file,
+ const char __user *userbuf,
+ size_t count, loff_t *loff)
{
- return 0;
+ struct rtw89_debugfs_priv *debugfs_priv = file->private_data;
+ struct rtw89_debugfs_priv_opt *opt = &debugfs_priv->opt;
+ struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
+ char *buf __free(kfree) = kmalloc(count + 1, GFP_KERNEL);
+ ssize_t n;
+
+ if (!buf)
+ return -ENOMEM;
+
+ if (opt->wlock) {
+ n = wiphy_locked_debugfs_write(rtwdev->hw->wiphy,
+ file, buf, count + 1,
+ userbuf, count,
+ rtw89_debugfs_file_write_helper,
+ debugfs_priv);
+ return n;
+ }
+
+ if (copy_from_user(buf, userbuf, count))
+ return -EFAULT;
+
+ buf[count] = '\0';
+
+ return debugfs_priv->cb_write(rtwdev, debugfs_priv, buf, count);
}
-static const struct file_operations file_ops_single_r = {
- .owner = THIS_MODULE,
- .open = rtw89_debugfs_single_open,
- .read = seq_read,
- .llseek = seq_lseek,
- .release = single_release,
+static const struct debugfs_short_fops file_ops_single_r = {
+ .read = rtw89_debugfs_file_read,
+ .llseek = generic_file_llseek,
};
-static const struct file_operations file_ops_common_rw = {
- .owner = THIS_MODULE,
- .open = rtw89_debugfs_single_open,
- .release = single_release,
- .read = seq_read,
- .llseek = seq_lseek,
- .write = rtw89_debugfs_seq_file_write,
+static const struct debugfs_short_fops file_ops_common_rw = {
+ .read = rtw89_debugfs_file_read,
+ .write = rtw89_debugfs_file_write,
+ .llseek = generic_file_llseek,
};
-static const struct file_operations file_ops_single_w = {
- .owner = THIS_MODULE,
- .write = rtw89_debugfs_single_write,
- .open = simple_open,
- .release = rtw89_debugfs_close,
+static const struct debugfs_short_fops file_ops_single_w = {
+ .write = rtw89_debugfs_file_write,
+ .llseek = generic_file_llseek,
};
static ssize_t
-rtw89_debug_priv_read_reg_select(struct file *filp,
- const char __user *user_buf,
- size_t count, loff_t *loff)
+rtw89_debug_priv_read_reg_select(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct seq_file *m = (struct seq_file *)filp->private_data;
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
- char buf[32];
- size_t buf_size;
u32 addr, len;
int num;
- buf_size = min(count, sizeof(buf) - 1);
- if (copy_from_user(buf, user_buf, buf_size))
- return -EFAULT;
-
- buf[buf_size] = '\0';
num = sscanf(buf, "%x %x", &addr, &len);
if (num != 2) {
rtw89_info(rtwdev, "invalid format: <addr> <len>\n");
@@ -182,11 +255,13 @@ rtw89_debug_priv_read_reg_select(struct file *filp,
return count;
}
-static int rtw89_debug_priv_read_reg_get(struct seq_file *m, void *v)
+static
+ssize_t rtw89_debug_priv_read_reg_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
- u32 addr, end, data, k;
+ char *p = buf, *end = buf + bufsz;
+ u32 addr, addr_end, data, k;
u32 len;
len = debugfs_priv->read_reg.len;
@@ -210,41 +285,34 @@ static int rtw89_debug_priv_read_reg_get(struct seq_file *m, void *v)
return -EINVAL;
}
- seq_printf(m, "get %d bytes at 0x%08x=0x%08x\n", len, addr, data);
+ p += scnprintf(p, end - p, "get %d bytes at 0x%08x=0x%08x\n", len,
+ addr, data);
- return 0;
+ return p - buf;
ndata:
- end = addr + len;
+ addr_end = addr + len;
- for (; addr < end; addr += 16) {
- seq_printf(m, "%08xh : ", 0x18600000 + addr);
+ for (; addr < addr_end; addr += 16) {
+ p += scnprintf(p, end - p, "%08xh : ", 0x18600000 + addr);
for (k = 0; k < 16; k += 4) {
data = rtw89_read32(rtwdev, addr + k);
- seq_printf(m, "%08x ", data);
+ p += scnprintf(p, end - p, "%08x ", data);
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
- return 0;
+ return p - buf;
}
-static ssize_t rtw89_debug_priv_write_reg_set(struct file *filp,
- const char __user *user_buf,
- size_t count, loff_t *loff)
+static
+ssize_t rtw89_debug_priv_write_reg_set(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
- char buf[32];
- size_t buf_size;
u32 addr, val, len;
int num;
- buf_size = min(count, sizeof(buf) - 1);
- if (copy_from_user(buf, user_buf, buf_size))
- return -EFAULT;
-
- buf[buf_size] = '\0';
num = sscanf(buf, "%x %x %x", &addr, &val, &len);
if (num != 3) {
rtw89_info(rtwdev, "invalid format: <addr> <val> <len>\n");
@@ -273,24 +341,14 @@ static ssize_t rtw89_debug_priv_write_reg_set(struct file *filp,
}
static ssize_t
-rtw89_debug_priv_read_rf_select(struct file *filp,
- const char __user *user_buf,
- size_t count, loff_t *loff)
+rtw89_debug_priv_read_rf_select(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct seq_file *m = (struct seq_file *)filp->private_data;
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
- char buf[32];
- size_t buf_size;
u32 addr, mask;
u8 path;
int num;
- buf_size = min(count, sizeof(buf) - 1);
- if (copy_from_user(buf, user_buf, buf_size))
- return -EFAULT;
-
- buf[buf_size] = '\0';
num = sscanf(buf, "%hhd %x %x", &path, &addr, &mask);
if (num != 3) {
rtw89_info(rtwdev, "invalid format: <path> <addr> <mask>\n");
@@ -310,10 +368,12 @@ rtw89_debug_priv_read_rf_select(struct file *filp,
return count;
}
-static int rtw89_debug_priv_read_rf_get(struct seq_file *m, void *v)
+static
+ssize_t rtw89_debug_priv_read_rf_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
+ char *p = buf, *end = buf + bufsz;
u32 addr, data, mask;
u8 path;
@@ -323,28 +383,21 @@ static int rtw89_debug_priv_read_rf_get(struct seq_file *m, void *v)
data = rtw89_read_rf(rtwdev, path, addr, mask);
- seq_printf(m, "path %d, rf register 0x%08x=0x%08x\n", path, addr, data);
+ p += scnprintf(p, end - p, "path %d, rf register 0x%08x=0x%08x\n",
+ path, addr, data);
- return 0;
+ return p - buf;
}
-static ssize_t rtw89_debug_priv_write_rf_set(struct file *filp,
- const char __user *user_buf,
- size_t count, loff_t *loff)
+static
+ssize_t rtw89_debug_priv_write_rf_set(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
- char buf[32];
- size_t buf_size;
u32 addr, val, mask;
u8 path;
int num;
- buf_size = min(count, sizeof(buf) - 1);
- if (copy_from_user(buf, user_buf, buf_size))
- return -EFAULT;
-
- buf[buf_size] = '\0';
num = sscanf(buf, "%hhd %x %x %x", &path, &addr, &mask, &val);
if (num != 4) {
rtw89_info(rtwdev, "invalid format: <path> <addr> <mask> <val>\n");
@@ -363,29 +416,31 @@ static ssize_t rtw89_debug_priv_write_rf_set(struct file *filp,
return count;
}
-static int rtw89_debug_priv_rf_reg_dump_get(struct seq_file *m, void *v)
+static
+ssize_t rtw89_debug_priv_rf_reg_dump_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
const struct rtw89_chip_info *chip = rtwdev->chip;
+ char *p = buf, *end = buf + bufsz;
u32 addr, offset, data;
u8 path;
for (path = 0; path < chip->rf_path_num; path++) {
- seq_printf(m, "RF path %d:\n\n", path);
+ p += scnprintf(p, end - p, "RF path %d:\n\n", path);
for (addr = 0; addr < 0x100; addr += 4) {
- seq_printf(m, "0x%08x: ", addr);
+ p += scnprintf(p, end - p, "0x%08x: ", addr);
for (offset = 0; offset < 4; offset++) {
data = rtw89_read_rf(rtwdev, path,
addr + offset, RFREG_MASK);
- seq_printf(m, "0x%05x ", data);
+ p += scnprintf(p, end - p, "0x%05x ", data);
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
- return 0;
+ return p - buf;
}
struct txpwr_ent {
@@ -704,56 +759,71 @@ static const struct txpwr_map __txpwr_map_lmt_ru_be = {
};
static unsigned int
-__print_txpwr_ent(struct seq_file *m, const struct txpwr_ent *ent,
- const s8 *buf, const unsigned int cur)
+__print_txpwr_ent(char *buf, size_t bufsz, const struct txpwr_ent *ent,
+ const s8 *bufp, const unsigned int cur, unsigned int *ate)
{
+ char *p = buf, *end = buf + bufsz;
unsigned int cnt, i;
+ unsigned int eaten;
char *fmt;
if (ent->nested) {
- for (cnt = 0, i = 0; i < ent->len; i++)
- cnt += __print_txpwr_ent(m, ent->ptr + i, buf,
- cur + cnt);
- return cnt;
+ for (cnt = 0, i = 0; i < ent->len; i++, cnt += eaten)
+ p += __print_txpwr_ent(p, end - p, ent->ptr + i, bufp,
+ cur + cnt, &eaten);
+ *ate = cnt;
+ goto out;
}
switch (ent->len) {
case 0:
- seq_printf(m, "\t<< %s >>\n", ent->txt);
- return 0;
+ p += scnprintf(p, end - p, "\t<< %s >>\n", ent->txt);
+ *ate = 0;
+ goto out;
case 2:
fmt = "%s\t| %3d, %3d,\t\tdBm\n";
- seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1]);
- return 2;
+ p += scnprintf(p, end - p, fmt, ent->txt, bufp[cur],
+ bufp[cur + 1]);
+ *ate = 2;
+ goto out;
case 4:
fmt = "%s\t| %3d, %3d, %3d, %3d,\tdBm\n";
- seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1],
- buf[cur + 2], buf[cur + 3]);
- return 4;
+ p += scnprintf(p, end - p, fmt, ent->txt, bufp[cur],
+ bufp[cur + 1],
+ bufp[cur + 2], bufp[cur + 3]);
+ *ate = 4;
+ goto out;
case 8:
fmt = "%s\t| %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d,\tdBm\n";
- seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1],
- buf[cur + 2], buf[cur + 3], buf[cur + 4],
- buf[cur + 5], buf[cur + 6], buf[cur + 7]);
- return 8;
+ p += scnprintf(p, end - p, fmt, ent->txt, bufp[cur],
+ bufp[cur + 1],
+ bufp[cur + 2], bufp[cur + 3], bufp[cur + 4],
+ bufp[cur + 5], bufp[cur + 6], bufp[cur + 7]);
+ *ate = 8;
+ goto out;
default:
return 0;
}
+
+out:
+ return p - buf;
}
-static int __print_txpwr_map(struct seq_file *m, struct rtw89_dev *rtwdev,
- const struct txpwr_map *map)
+static ssize_t __print_txpwr_map(struct rtw89_dev *rtwdev, char *buf, size_t bufsz,
+ const struct txpwr_map *map)
{
u8 fct = rtwdev->chip->txpwr_factor_mac;
u8 path_num = rtwdev->chip->rf_path_num;
+ char *p = buf, *end = buf + bufsz;
unsigned int cur, i;
+ unsigned int eaten;
u32 max_valid_addr;
u32 val, addr;
- s8 *buf, tmp;
+ s8 *bufp, tmp;
int ret;
- buf = vzalloc(map->addr_to - map->addr_from + 4);
- if (!buf)
+ bufp = vzalloc(map->addr_to - map->addr_from + 4);
+ if (!bufp)
return -ENOMEM;
if (path_num == 1)
@@ -773,31 +843,32 @@ static int __print_txpwr_map(struct seq_file *m, struct rtw89_dev *rtwdev,
for (i = 0; i < 4; i++, val >>= 8) {
/* signed 7 bits, and reserved BIT(7) */
tmp = sign_extend32(val, 6);
- buf[cur + i] = tmp >> fct;
+ bufp[cur + i] = tmp >> fct;
}
}
- for (cur = 0, i = 0; i < map->size; i++)
- cur += __print_txpwr_ent(m, &map->ent[i], buf, cur);
+ for (cur = 0, i = 0; i < map->size; i++, cur += eaten)
+ p += __print_txpwr_ent(p, end - p, &map->ent[i], bufp, cur, &eaten);
- vfree(buf);
- return 0;
+ vfree(bufp);
+ return p - buf;
}
#define case_REGD(_regd) \
case RTW89_ ## _regd: \
- seq_puts(m, #_regd "\n"); \
+ p += scnprintf(p, end - p, #_regd "\n"); \
break
-static void __print_regd(struct seq_file *m, struct rtw89_dev *rtwdev,
- const struct rtw89_chan *chan)
+static int __print_regd(struct rtw89_dev *rtwdev, char *buf, size_t bufsz,
+ const struct rtw89_chan *chan)
{
+ char *p = buf, *end = buf + bufsz;
u8 band = chan->band_type;
u8 regd = rtw89_regd_get(rtwdev, band);
switch (regd) {
default:
- seq_printf(m, "UNKNOWN: %d\n", regd);
+ p += scnprintf(p, end - p, "UNKNOWN: %d\n", regd);
break;
case_REGD(WW);
case_REGD(ETSI);
@@ -816,6 +887,8 @@ static void __print_regd(struct seq_file *m, struct rtw89_dev *rtwdev,
case_REGD(UK);
case_REGD(THAILAND);
}
+
+ return p - buf;
}
#undef case_REGD
@@ -844,96 +917,93 @@ static const struct dbgfs_txpwr_table *dbgfs_txpwr_tables[RTW89_CHIP_GEN_NUM] =
};
static
-void rtw89_debug_priv_txpwr_table_get_regd(struct seq_file *m,
- struct rtw89_dev *rtwdev,
- const struct rtw89_chan *chan)
+int rtw89_debug_priv_txpwr_table_get_regd(struct rtw89_dev *rtwdev,
+ char *buf, size_t bufsz,
+ const struct rtw89_chan *chan)
{
const struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
const struct rtw89_reg_6ghz_tpe *tpe6 = &regulatory->reg_6ghz_tpe;
+ char *p = buf, *end = buf + bufsz;
- seq_printf(m, "[Chanctx] band %u, ch %u, bw %u\n",
- chan->band_type, chan->channel, chan->band_width);
+ p += scnprintf(p, end - p, "[Chanctx] band %u, ch %u, bw %u\n",
+ chan->band_type, chan->channel, chan->band_width);
- seq_puts(m, "[Regulatory] ");
- __print_regd(m, rtwdev, chan);
+ p += scnprintf(p, end - p, "[Regulatory] ");
+ p += __print_regd(rtwdev, p, end - p, chan);
if (chan->band_type == RTW89_BAND_6G) {
- seq_printf(m, "[reg6_pwr_type] %u\n", regulatory->reg_6ghz_power);
+ p += scnprintf(p, end - p, "[reg6_pwr_type] %u\n",
+ regulatory->reg_6ghz_power);
if (tpe6->valid)
- seq_printf(m, "[TPE] %d dBm\n", tpe6->constraint);
+ p += scnprintf(p, end - p, "[TPE] %d dBm\n",
+ tpe6->constraint);
}
+
+ return p - buf;
}
-static int rtw89_debug_priv_txpwr_table_get(struct seq_file *m, void *v)
+static
+ssize_t rtw89_debug_priv_txpwr_table_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
enum rtw89_chip_gen chip_gen = rtwdev->chip->chip_gen;
const struct dbgfs_txpwr_table *tbl;
const struct rtw89_chan *chan;
- int ret = 0;
+ char *p = buf, *end = buf + bufsz;
+ ssize_t n;
+
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
- mutex_lock(&rtwdev->mutex);
rtw89_leave_ps_mode(rtwdev);
chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
- rtw89_debug_priv_txpwr_table_get_regd(m, rtwdev, chan);
+ p += rtw89_debug_priv_txpwr_table_get_regd(rtwdev, p, end - p, chan);
- seq_puts(m, "[SAR]\n");
- rtw89_print_sar(m, rtwdev, chan->freq);
+ p += scnprintf(p, end - p, "[SAR]\n");
+ p += rtw89_print_sar(rtwdev, p, end - p, chan->freq);
- seq_puts(m, "[TAS]\n");
- rtw89_print_tas(m, rtwdev);
+ p += scnprintf(p, end - p, "[TAS]\n");
+ p += rtw89_print_tas(rtwdev, p, end - p);
- seq_puts(m, "[DAG]\n");
- rtw89_print_ant_gain(m, rtwdev, chan);
+ p += scnprintf(p, end - p, "[DAG]\n");
+ p += rtw89_print_ant_gain(rtwdev, p, end - p, chan);
tbl = dbgfs_txpwr_tables[chip_gen];
- if (!tbl) {
- ret = -EOPNOTSUPP;
- goto err;
- }
-
- seq_puts(m, "\n[TX power byrate]\n");
- ret = __print_txpwr_map(m, rtwdev, tbl->byr);
- if (ret)
- goto err;
-
- seq_puts(m, "\n[TX power limit]\n");
- ret = __print_txpwr_map(m, rtwdev, tbl->lmt);
- if (ret)
- goto err;
-
- seq_puts(m, "\n[TX power limit_ru]\n");
- ret = __print_txpwr_map(m, rtwdev, tbl->lmt_ru);
- if (ret)
- goto err;
+ if (!tbl)
+ return -EOPNOTSUPP;
-err:
- mutex_unlock(&rtwdev->mutex);
- return ret;
+ p += scnprintf(p, end - p, "\n[TX power byrate]\n");
+ n = __print_txpwr_map(rtwdev, p, end - p, tbl->byr);
+ if (n < 0)
+ return n;
+ p += n;
+
+ p += scnprintf(p, end - p, "\n[TX power limit]\n");
+ n = __print_txpwr_map(rtwdev, p, end - p, tbl->lmt);
+ if (n < 0)
+ return n;
+ p += n;
+
+ p += scnprintf(p, end - p, "\n[TX power limit_ru]\n");
+ n = __print_txpwr_map(rtwdev, p, end - p, tbl->lmt_ru);
+ if (n < 0)
+ return n;
+ p += n;
+
+ return p - buf;
}
static ssize_t
-rtw89_debug_priv_mac_reg_dump_select(struct file *filp,
- const char __user *user_buf,
- size_t count, loff_t *loff)
+rtw89_debug_priv_mac_reg_dump_select(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct seq_file *m = (struct seq_file *)filp->private_data;
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
const struct rtw89_chip_info *chip = rtwdev->chip;
- char buf[32];
- size_t buf_size;
int sel;
int ret;
- buf_size = min(count, sizeof(buf) - 1);
- if (copy_from_user(buf, user_buf, buf_size))
- return -EFAULT;
-
- buf[buf_size] = '\0';
ret = kstrtoint(buf, 0, &sel);
if (ret)
return ret;
@@ -957,99 +1027,91 @@ rtw89_debug_priv_mac_reg_dump_select(struct file *filp,
#define RTW89_MAC_PAGE_SIZE 0x100
-static int rtw89_debug_priv_mac_reg_dump_get(struct seq_file *m, void *v)
+static
+ssize_t rtw89_debug_priv_mac_reg_dump_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
enum rtw89_debug_mac_reg_sel reg_sel = debugfs_priv->cb_data;
- u32 start, end;
+ char *p = buf, *end = buf + bufsz;
+ u32 start, end_addr;
u32 i, j, k, page;
u32 val;
switch (reg_sel) {
case RTW89_DBG_SEL_MAC_00:
- seq_puts(m, "Debug selected MAC page 0x00\n");
+ p += scnprintf(p, end - p, "Debug selected MAC page 0x00\n");
start = 0x000;
- end = 0x014;
+ end_addr = 0x014;
break;
case RTW89_DBG_SEL_MAC_30:
- seq_puts(m, "Debug selected MAC page 0x30\n");
+ p += scnprintf(p, end - p, "Debug selected MAC page 0x30\n");
start = 0x030;
- end = 0x033;
+ end_addr = 0x033;
break;
case RTW89_DBG_SEL_MAC_40:
- seq_puts(m, "Debug selected MAC page 0x40\n");
+ p += scnprintf(p, end - p, "Debug selected MAC page 0x40\n");
start = 0x040;
- end = 0x07f;
+ end_addr = 0x07f;
break;
case RTW89_DBG_SEL_MAC_80:
- seq_puts(m, "Debug selected MAC page 0x80\n");
+ p += scnprintf(p, end - p, "Debug selected MAC page 0x80\n");
start = 0x080;
- end = 0x09f;
+ end_addr = 0x09f;
break;
case RTW89_DBG_SEL_MAC_C0:
- seq_puts(m, "Debug selected MAC page 0xc0\n");
+ p += scnprintf(p, end - p, "Debug selected MAC page 0xc0\n");
start = 0x0c0;
- end = 0x0df;
+ end_addr = 0x0df;
break;
case RTW89_DBG_SEL_MAC_E0:
- seq_puts(m, "Debug selected MAC page 0xe0\n");
+ p += scnprintf(p, end - p, "Debug selected MAC page 0xe0\n");
start = 0x0e0;
- end = 0x0ff;
+ end_addr = 0x0ff;
break;
case RTW89_DBG_SEL_BB:
- seq_puts(m, "Debug selected BB register\n");
+ p += scnprintf(p, end - p, "Debug selected BB register\n");
start = 0x100;
- end = 0x17f;
+ end_addr = 0x17f;
break;
case RTW89_DBG_SEL_IQK:
- seq_puts(m, "Debug selected IQK register\n");
+ p += scnprintf(p, end - p, "Debug selected IQK register\n");
start = 0x180;
- end = 0x1bf;
+ end_addr = 0x1bf;
break;
case RTW89_DBG_SEL_RFC:
- seq_puts(m, "Debug selected RFC register\n");
+ p += scnprintf(p, end - p, "Debug selected RFC register\n");
start = 0x1c0;
- end = 0x1ff;
+ end_addr = 0x1ff;
break;
default:
- seq_puts(m, "Selected invalid register page\n");
+ p += scnprintf(p, end - p, "Selected invalid register page\n");
return -EINVAL;
}
- for (i = start; i <= end; i++) {
+ for (i = start; i <= end_addr; i++) {
page = i << 8;
for (j = page; j < page + RTW89_MAC_PAGE_SIZE; j += 16) {
- seq_printf(m, "%08xh : ", 0x18600000 + j);
+ p += scnprintf(p, end - p, "%08xh : ", 0x18600000 + j);
for (k = 0; k < 4; k++) {
val = rtw89_read32(rtwdev, j + (k << 2));
- seq_printf(m, "%08x ", val);
+ p += scnprintf(p, end - p, "%08x ", val);
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
}
- return 0;
+ return p - buf;
}
static ssize_t
-rtw89_debug_priv_mac_mem_dump_select(struct file *filp,
- const char __user *user_buf,
- size_t count, loff_t *loff)
+rtw89_debug_priv_mac_mem_dump_select(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct seq_file *m = (struct seq_file *)filp->private_data;
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
- char buf[32];
- size_t buf_size;
u32 sel, start_addr, len;
int num;
- buf_size = min(count, sizeof(buf) - 1);
- if (copy_from_user(buf, user_buf, buf_size))
- return -EFAULT;
-
- buf[buf_size] = '\0';
num = sscanf(buf, "%x %x %x", &sel, &start_addr, &len);
if (num != 3) {
rtw89_info(rtwdev, "invalid format: <sel> <start> <len>\n");
@@ -1066,15 +1128,16 @@ rtw89_debug_priv_mac_mem_dump_select(struct file *filp,
return count;
}
-static void rtw89_debug_dump_mac_mem(struct seq_file *m,
- struct rtw89_dev *rtwdev,
- u8 sel, u32 start_addr, u32 len)
+static int rtw89_debug_dump_mac_mem(struct rtw89_dev *rtwdev,
+ char *buf, size_t bufsz,
+ u8 sel, u32 start_addr, u32 len)
{
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
u32 filter_model_addr = mac->filter_model_addr;
u32 indir_access_addr = mac->indir_access_addr;
u32 base_addr, start_page, residue;
- u32 i, j, p, pages;
+ char *p = buf, *end = buf + bufsz;
+ u32 i, j, pp, pages;
u32 dump_len, remain;
u32 val;
@@ -1085,32 +1148,37 @@ static void rtw89_debug_dump_mac_mem(struct seq_file *m,
base_addr = mac->mem_base_addrs[sel];
base_addr += start_page * MAC_MEM_DUMP_PAGE_SIZE;
- for (p = 0; p < pages; p++) {
+ for (pp = 0; pp < pages; pp++) {
dump_len = min_t(u32, remain, MAC_MEM_DUMP_PAGE_SIZE);
rtw89_write32(rtwdev, filter_model_addr, base_addr);
for (i = indir_access_addr + residue;
i < indir_access_addr + dump_len;) {
- seq_printf(m, "%08xh:", i);
+ p += scnprintf(p, end - p, "%08xh:", i);
for (j = 0;
j < 4 && i < indir_access_addr + dump_len;
j++, i += 4) {
val = rtw89_read32(rtwdev, i);
- seq_printf(m, " %08x", val);
+ p += scnprintf(p, end - p, " %08x", val);
remain -= 4;
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
}
base_addr += MAC_MEM_DUMP_PAGE_SIZE;
}
+
+ return p - buf;
}
-static int
-rtw89_debug_priv_mac_mem_dump_get(struct seq_file *m, void *v)
+static ssize_t
+rtw89_debug_priv_mac_mem_dump_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
+ char *p = buf, *end = buf + bufsz;
bool grant_read = false;
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
if (debugfs_priv->mac_mem.sel >= RTW89_MAC_MEM_NUM)
return -ENOENT;
@@ -1127,40 +1195,28 @@ rtw89_debug_priv_mac_mem_dump_get(struct seq_file *m, void *v)
}
}
- mutex_lock(&rtwdev->mutex);
rtw89_leave_ps_mode(rtwdev);
if (grant_read)
rtw89_write32_set(rtwdev, R_AX_TCR1, B_AX_TCR_FORCE_READ_TXDFIFO);
- rtw89_debug_dump_mac_mem(m, rtwdev,
- debugfs_priv->mac_mem.sel,
- debugfs_priv->mac_mem.start,
- debugfs_priv->mac_mem.len);
+ p += rtw89_debug_dump_mac_mem(rtwdev, p, end - p,
+ debugfs_priv->mac_mem.sel,
+ debugfs_priv->mac_mem.start,
+ debugfs_priv->mac_mem.len);
if (grant_read)
rtw89_write32_clr(rtwdev, R_AX_TCR1, B_AX_TCR_FORCE_READ_TXDFIFO);
- mutex_unlock(&rtwdev->mutex);
- return 0;
+ return p - buf;
}
static ssize_t
-rtw89_debug_priv_mac_dbg_port_dump_select(struct file *filp,
- const char __user *user_buf,
- size_t count, loff_t *loff)
+rtw89_debug_priv_mac_dbg_port_dump_select(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct seq_file *m = (struct seq_file *)filp->private_data;
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
- char buf[32];
- size_t buf_size;
int sel, set;
int num;
bool enable;
- buf_size = min(count, sizeof(buf) - 1);
- if (copy_from_user(buf, user_buf, buf_size))
- return -EFAULT;
-
- buf[buf_size] = '\0';
num = sscanf(buf, "%d %d", &sel, &set);
if (num != 2) {
rtw89_info(rtwdev, "invalid format: <sel> <set>\n");
@@ -1196,13 +1252,13 @@ rtw89_debug_priv_mac_dbg_port_dump_select(struct file *filp,
}
static int rtw89_debug_mac_dump_ss_dbg(struct rtw89_dev *rtwdev,
- struct seq_file *m)
+ char *buf, size_t bufsz)
{
return 0;
}
static int rtw89_debug_mac_dump_dle_dbg(struct rtw89_dev *rtwdev,
- struct seq_file *m)
+ char *buf, size_t bufsz)
{
#define DLE_DFI_DUMP(__type, __target, __sel) \
({ \
@@ -1231,7 +1287,7 @@ static int rtw89_debug_mac_dump_dle_dbg(struct rtw89_dev *rtwdev,
__data; \
})
-#define DLE_DFI_FREE_PAGE_DUMP(__m, __type) \
+#define DLE_DFI_FREE_PAGE_DUMP(__p, __end, __type) \
({ \
u32 __freepg, __pubpg; \
u32 __freepg_head, __freepg_tail, __pubpg_num; \
@@ -1241,24 +1297,25 @@ static int rtw89_debug_mac_dump_dle_dbg(struct rtw89_dev *rtwdev,
__freepg_head = FIELD_GET(B_AX_DLE_FREE_HEADPG, __freepg); \
__freepg_tail = FIELD_GET(B_AX_DLE_FREE_TAILPG, __freepg); \
__pubpg_num = FIELD_GET(B_AX_DLE_PUB_PGNUM, __pubpg); \
- seq_printf(__m, "[%s] freepg head: %d\n", \
- #__type, __freepg_head); \
- seq_printf(__m, "[%s] freepg tail: %d\n", \
- #__type, __freepg_tail); \
- seq_printf(__m, "[%s] pubpg num : %d\n", \
- #__type, __pubpg_num); \
+ __p += scnprintf(__p, __end - __p, "[%s] freepg head: %d\n", \
+ #__type, __freepg_head); \
+ __p += scnprintf(__p, __end - __p, "[%s] freepg tail: %d\n", \
+ #__type, __freepg_tail); \
+ __p += scnprintf(__p, __end - __p, "[%s] pubpg num : %d\n", \
+ #__type, __pubpg_num); \
})
-#define case_QUOTA(__m, __type, __id) \
+#define case_QUOTA(__p, __end, __type, __id) \
case __type##_QTAID_##__id: \
- val32 = DLE_DFI_DUMP(__type, QUOTA, __type##_QTAID_##__id); \
+ val32 = DLE_DFI_DUMP(__type, QUOTA, __type##_QTAID_##__id); \
rsv_pgnum = FIELD_GET(B_AX_DLE_RSV_PGNUM, val32); \
use_pgnum = FIELD_GET(B_AX_DLE_USE_PGNUM, val32); \
- seq_printf(__m, "[%s][%s] rsv_pgnum: %d\n", \
- #__type, #__id, rsv_pgnum); \
- seq_printf(__m, "[%s][%s] use_pgnum: %d\n", \
- #__type, #__id, use_pgnum); \
+ __p += scnprintf(__p, __end - __p, "[%s][%s] rsv_pgnum: %d\n", \
+ #__type, #__id, rsv_pgnum); \
+ __p += scnprintf(__p, __end - __p, "[%s][%s] use_pgnum: %d\n", \
+ #__type, #__id, use_pgnum); \
break
+ char *p = buf, *end = buf + bufsz;
u32 quota_id;
u32 val32;
u16 rsv_pgnum, use_pgnum;
@@ -1266,38 +1323,39 @@ static int rtw89_debug_mac_dump_dle_dbg(struct rtw89_dev *rtwdev,
ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL);
if (ret) {
- seq_puts(m, "[DLE] : DMAC not enabled\n");
- return ret;
+ p += scnprintf(p, end - p, "[DLE] : DMAC not enabled\n");
+ goto out;
}
- DLE_DFI_FREE_PAGE_DUMP(m, WDE);
- DLE_DFI_FREE_PAGE_DUMP(m, PLE);
+ DLE_DFI_FREE_PAGE_DUMP(p, end, WDE);
+ DLE_DFI_FREE_PAGE_DUMP(p, end, PLE);
for (quota_id = 0; quota_id <= WDE_QTAID_CPUIO; quota_id++) {
switch (quota_id) {
- case_QUOTA(m, WDE, HOST_IF);
- case_QUOTA(m, WDE, WLAN_CPU);
- case_QUOTA(m, WDE, DATA_CPU);
- case_QUOTA(m, WDE, PKTIN);
- case_QUOTA(m, WDE, CPUIO);
+ case_QUOTA(p, end, WDE, HOST_IF);
+ case_QUOTA(p, end, WDE, WLAN_CPU);
+ case_QUOTA(p, end, WDE, DATA_CPU);
+ case_QUOTA(p, end, WDE, PKTIN);
+ case_QUOTA(p, end, WDE, CPUIO);
}
}
for (quota_id = 0; quota_id <= PLE_QTAID_CPUIO; quota_id++) {
switch (quota_id) {
- case_QUOTA(m, PLE, B0_TXPL);
- case_QUOTA(m, PLE, B1_TXPL);
- case_QUOTA(m, PLE, C2H);
- case_QUOTA(m, PLE, H2C);
- case_QUOTA(m, PLE, WLAN_CPU);
- case_QUOTA(m, PLE, MPDU);
- case_QUOTA(m, PLE, CMAC0_RX);
- case_QUOTA(m, PLE, CMAC1_RX);
- case_QUOTA(m, PLE, CMAC1_BBRPT);
- case_QUOTA(m, PLE, WDRLS);
- case_QUOTA(m, PLE, CPUIO);
+ case_QUOTA(p, end, PLE, B0_TXPL);
+ case_QUOTA(p, end, PLE, B1_TXPL);
+ case_QUOTA(p, end, PLE, C2H);
+ case_QUOTA(p, end, PLE, H2C);
+ case_QUOTA(p, end, PLE, WLAN_CPU);
+ case_QUOTA(p, end, PLE, MPDU);
+ case_QUOTA(p, end, PLE, CMAC0_RX);
+ case_QUOTA(p, end, PLE, CMAC1_RX);
+ case_QUOTA(p, end, PLE, CMAC1_BBRPT);
+ case_QUOTA(p, end, PLE, WDRLS);
+ case_QUOTA(p, end, PLE, CPUIO);
}
}
- return 0;
+out:
+ return p - buf;
#undef case_QUOTA
#undef DLE_DFI_DUMP
@@ -1305,73 +1363,88 @@ static int rtw89_debug_mac_dump_dle_dbg(struct rtw89_dev *rtwdev,
}
static int rtw89_debug_mac_dump_dmac_dbg(struct rtw89_dev *rtwdev,
- struct seq_file *m)
+ char *buf, size_t bufsz)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
+ char *p = buf, *end = buf + bufsz;
u32 dmac_err;
int i, ret;
ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL);
if (ret) {
- seq_puts(m, "[DMAC] : DMAC not enabled\n");
- return ret;
+ p += scnprintf(p, end - p, "[DMAC] : DMAC not enabled\n");
+ goto out;
}
dmac_err = rtw89_read32(rtwdev, R_AX_DMAC_ERR_ISR);
- seq_printf(m, "R_AX_DMAC_ERR_ISR=0x%08x\n", dmac_err);
- seq_printf(m, "R_AX_DMAC_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_DMAC_ERR_IMR));
+ p += scnprintf(p, end - p, "R_AX_DMAC_ERR_ISR=0x%08x\n", dmac_err);
+ p += scnprintf(p, end - p, "R_AX_DMAC_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_DMAC_ERR_IMR));
if (dmac_err) {
- seq_printf(m, "R_AX_WDE_ERR_FLAG_CFG=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WDE_ERR_FLAG_CFG_NUM1));
- seq_printf(m, "R_AX_PLE_ERR_FLAG_CFG=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_CFG_NUM1));
+ p += scnprintf(p, end - p, "R_AX_WDE_ERR_FLAG_CFG=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WDE_ERR_FLAG_CFG_NUM1));
+ p += scnprintf(p, end - p, "R_AX_PLE_ERR_FLAG_CFG=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_CFG_NUM1));
if (chip->chip_id == RTL8852C) {
- seq_printf(m, "R_AX_PLE_ERRFLAG_MSG=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PLE_ERRFLAG_MSG));
- seq_printf(m, "R_AX_WDE_ERRFLAG_MSG=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WDE_ERRFLAG_MSG));
- seq_printf(m, "R_AX_PLE_DBGERR_LOCKEN=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PLE_DBGERR_LOCKEN));
- seq_printf(m, "R_AX_PLE_DBGERR_STS=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PLE_DBGERR_STS));
+ p += scnprintf(p, end - p,
+ "R_AX_PLE_ERRFLAG_MSG=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PLE_ERRFLAG_MSG));
+ p += scnprintf(p, end - p,
+ "R_AX_WDE_ERRFLAG_MSG=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WDE_ERRFLAG_MSG));
+ p += scnprintf(p, end - p,
+ "R_AX_PLE_DBGERR_LOCKEN=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PLE_DBGERR_LOCKEN));
+ p += scnprintf(p, end - p,
+ "R_AX_PLE_DBGERR_STS=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PLE_DBGERR_STS));
}
}
if (dmac_err & B_AX_WDRLS_ERR_FLAG) {
- seq_printf(m, "R_AX_WDRLS_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WDRLS_ERR_IMR));
- seq_printf(m, "R_AX_WDRLS_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WDRLS_ERR_ISR));
+ p += scnprintf(p, end - p, "R_AX_WDRLS_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WDRLS_ERR_IMR));
+ p += scnprintf(p, end - p, "R_AX_WDRLS_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WDRLS_ERR_ISR));
if (chip->chip_id == RTL8852C)
- seq_printf(m, "R_AX_RPQ_RXBD_IDX=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_RPQ_RXBD_IDX_V1));
+ p += scnprintf(p, end - p,
+ "R_AX_RPQ_RXBD_IDX=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_RPQ_RXBD_IDX_V1));
else
- seq_printf(m, "R_AX_RPQ_RXBD_IDX=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_RPQ_RXBD_IDX));
+ p += scnprintf(p, end - p,
+ "R_AX_RPQ_RXBD_IDX=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_RPQ_RXBD_IDX));
}
if (dmac_err & B_AX_WSEC_ERR_FLAG) {
if (chip->chip_id == RTL8852C) {
- seq_printf(m, "R_AX_SEC_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_ERROR_FLAG_IMR));
- seq_printf(m, "R_AX_SEC_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_ERROR_FLAG));
- seq_printf(m, "R_AX_SEC_ENG_CTRL=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL));
- seq_printf(m, "R_AX_SEC_MPDU_PROC=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC));
- seq_printf(m, "R_AX_SEC_CAM_ACCESS=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS));
- seq_printf(m, "R_AX_SEC_CAM_RDATA=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA));
- seq_printf(m, "R_AX_SEC_DEBUG1=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_DEBUG1));
- seq_printf(m, "R_AX_SEC_TX_DEBUG=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG));
- seq_printf(m, "R_AX_SEC_RX_DEBUG=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_ERROR_FLAG_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_ERROR_FLAG));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_ENG_CTRL=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_MPDU_PROC=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_CAM_ACCESS=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_CAM_RDATA=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA));
+ p += scnprintf(p, end - p, "R_AX_SEC_DEBUG1=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_DEBUG1));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_TX_DEBUG=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_RX_DEBUG=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG));
rtw89_write32_mask(rtwdev, R_AX_DBG_CTRL,
B_AX_DBG_SEL0, 0x8B);
@@ -1382,187 +1455,229 @@ static int rtw89_debug_mac_dump_dmac_dbg(struct rtw89_dev *rtwdev,
for (i = 0; i < 0x10; i++) {
rtw89_write32_mask(rtwdev, R_AX_SEC_ENG_CTRL,
B_AX_SEC_DBG_PORT_FIELD_MASK, i);
- seq_printf(m, "sel=%x,R_AX_SEC_DEBUG2=0x%08x\n",
- i, rtw89_read32(rtwdev, R_AX_SEC_DEBUG2));
+ p += scnprintf(p, end - p,
+ "sel=%x,R_AX_SEC_DEBUG2=0x%08x\n",
+ i,
+ rtw89_read32(rtwdev, R_AX_SEC_DEBUG2));
}
} else {
- seq_printf(m, "R_AX_SEC_ERR_IMR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_DEBUG));
- seq_printf(m, "R_AX_SEC_ENG_CTRL=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL));
- seq_printf(m, "R_AX_SEC_MPDU_PROC=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC));
- seq_printf(m, "R_AX_SEC_CAM_ACCESS=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS));
- seq_printf(m, "R_AX_SEC_CAM_RDATA=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA));
- seq_printf(m, "R_AX_SEC_CAM_WDATA=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_CAM_WDATA));
- seq_printf(m, "R_AX_SEC_TX_DEBUG=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG));
- seq_printf(m, "R_AX_SEC_RX_DEBUG=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG));
- seq_printf(m, "R_AX_SEC_TRX_PKT_CNT=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_TRX_PKT_CNT));
- seq_printf(m, "R_AX_SEC_TRX_BLK_CNT=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_SEC_TRX_BLK_CNT));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_ERR_IMR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_DEBUG));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_ENG_CTRL=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_ENG_CTRL));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_MPDU_PROC=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_MPDU_PROC));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_CAM_ACCESS=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_CAM_ACCESS));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_CAM_RDATA=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_CAM_RDATA));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_CAM_WDATA=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_CAM_WDATA));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_TX_DEBUG=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_TX_DEBUG));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_RX_DEBUG=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_RX_DEBUG));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_TRX_PKT_CNT=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_TRX_PKT_CNT));
+ p += scnprintf(p, end - p,
+ "R_AX_SEC_TRX_BLK_CNT=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_SEC_TRX_BLK_CNT));
}
}
if (dmac_err & B_AX_MPDU_ERR_FLAG) {
- seq_printf(m, "R_AX_MPDU_TX_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_IMR));
- seq_printf(m, "R_AX_MPDU_TX_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_ISR));
- seq_printf(m, "R_AX_MPDU_RX_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_IMR));
- seq_printf(m, "R_AX_MPDU_RX_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_ISR));
+ p += scnprintf(p, end - p, "R_AX_MPDU_TX_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_IMR));
+ p += scnprintf(p, end - p, "R_AX_MPDU_TX_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_ISR));
+ p += scnprintf(p, end - p, "R_AX_MPDU_RX_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_IMR));
+ p += scnprintf(p, end - p, "R_AX_MPDU_RX_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_ISR));
}
if (dmac_err & B_AX_STA_SCHEDULER_ERR_FLAG) {
- seq_printf(m, "R_AX_STA_SCHEDULER_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_IMR));
- seq_printf(m, "R_AX_STA_SCHEDULER_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_STA_SCHEDULER_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_STA_SCHEDULER_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_ISR));
}
if (dmac_err & B_AX_WDE_DLE_ERR_FLAG) {
- seq_printf(m, "R_AX_WDE_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WDE_ERR_IMR));
- seq_printf(m, "R_AX_WDE_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR));
- seq_printf(m, "R_AX_PLE_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PLE_ERR_IMR));
- seq_printf(m, "R_AX_PLE_ERR_FLAG_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR));
+ p += scnprintf(p, end - p, "R_AX_WDE_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WDE_ERR_IMR));
+ p += scnprintf(p, end - p, "R_AX_WDE_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR));
+ p += scnprintf(p, end - p, "R_AX_PLE_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PLE_ERR_IMR));
+ p += scnprintf(p, end - p, "R_AX_PLE_ERR_FLAG_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR));
}
if (dmac_err & B_AX_TXPKTCTRL_ERR_FLAG) {
if (chip->chip_id == RTL8852C) {
- seq_printf(m, "R_AX_TXPKTCTL_B0_ERRFLAG_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_TXPKTCTL_B0_ERRFLAG_IMR));
- seq_printf(m, "R_AX_TXPKTCTL_B0_ERRFLAG_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_TXPKTCTL_B0_ERRFLAG_ISR));
- seq_printf(m, "R_AX_TXPKTCTL_B1_ERRFLAG_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_TXPKTCTL_B1_ERRFLAG_IMR));
- seq_printf(m, "R_AX_TXPKTCTL_B1_ERRFLAG_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_TXPKTCTL_B1_ERRFLAG_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_TXPKTCTL_B0_ERRFLAG_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B0_ERRFLAG_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_TXPKTCTL_B0_ERRFLAG_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B0_ERRFLAG_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_TXPKTCTL_B1_ERRFLAG_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B1_ERRFLAG_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_TXPKTCTL_B1_ERRFLAG_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_TXPKTCTL_B1_ERRFLAG_ISR));
} else {
- seq_printf(m, "R_AX_TXPKTCTL_ERR_IMR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR));
- seq_printf(m, "R_AX_TXPKTCTL_ERR_IMR_ISR_B1=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR_B1));
+ p += scnprintf(p, end - p,
+ "R_AX_TXPKTCTL_ERR_IMR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_TXPKTCTL_ERR_IMR_ISR_B1=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR_B1));
}
}
if (dmac_err & B_AX_PLE_DLE_ERR_FLAG) {
- seq_printf(m, "R_AX_WDE_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WDE_ERR_IMR));
- seq_printf(m, "R_AX_WDE_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR));
- seq_printf(m, "R_AX_PLE_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PLE_ERR_IMR));
- seq_printf(m, "R_AX_PLE_ERR_FLAG_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR));
- seq_printf(m, "R_AX_WD_CPUQ_OP_0=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_0));
- seq_printf(m, "R_AX_WD_CPUQ_OP_1=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_1));
- seq_printf(m, "R_AX_WD_CPUQ_OP_2=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_2));
- seq_printf(m, "R_AX_WD_CPUQ_OP_STATUS=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_STATUS));
- seq_printf(m, "R_AX_PL_CPUQ_OP_0=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_0));
- seq_printf(m, "R_AX_PL_CPUQ_OP_1=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_1));
- seq_printf(m, "R_AX_PL_CPUQ_OP_2=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_2));
- seq_printf(m, "R_AX_PL_CPUQ_OP_STATUS=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_STATUS));
+ p += scnprintf(p, end - p, "R_AX_WDE_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WDE_ERR_IMR));
+ p += scnprintf(p, end - p, "R_AX_WDE_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR));
+ p += scnprintf(p, end - p, "R_AX_PLE_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PLE_ERR_IMR));
+ p += scnprintf(p, end - p, "R_AX_PLE_ERR_FLAG_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR));
+ p += scnprintf(p, end - p, "R_AX_WD_CPUQ_OP_0=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_0));
+ p += scnprintf(p, end - p, "R_AX_WD_CPUQ_OP_1=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_1));
+ p += scnprintf(p, end - p, "R_AX_WD_CPUQ_OP_2=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_2));
+ p += scnprintf(p, end - p, "R_AX_WD_CPUQ_OP_STATUS=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_WD_CPUQ_OP_STATUS));
+ p += scnprintf(p, end - p, "R_AX_PL_CPUQ_OP_0=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_0));
+ p += scnprintf(p, end - p, "R_AX_PL_CPUQ_OP_1=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_1));
+ p += scnprintf(p, end - p, "R_AX_PL_CPUQ_OP_2=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_2));
+ p += scnprintf(p, end - p, "R_AX_PL_CPUQ_OP_STATUS=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PL_CPUQ_OP_STATUS));
if (chip->chip_id == RTL8852C) {
- seq_printf(m, "R_AX_RX_CTRL0=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_RX_CTRL0));
- seq_printf(m, "R_AX_RX_CTRL1=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_RX_CTRL1));
- seq_printf(m, "R_AX_RX_CTRL2=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_RX_CTRL2));
+ p += scnprintf(p, end - p, "R_AX_RX_CTRL0=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_RX_CTRL0));
+ p += scnprintf(p, end - p, "R_AX_RX_CTRL1=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_RX_CTRL1));
+ p += scnprintf(p, end - p, "R_AX_RX_CTRL2=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_RX_CTRL2));
} else {
- seq_printf(m, "R_AX_RXDMA_PKT_INFO_0=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_0));
- seq_printf(m, "R_AX_RXDMA_PKT_INFO_1=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_1));
- seq_printf(m, "R_AX_RXDMA_PKT_INFO_2=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_2));
+ p += scnprintf(p, end - p,
+ "R_AX_RXDMA_PKT_INFO_0=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_0));
+ p += scnprintf(p, end - p,
+ "R_AX_RXDMA_PKT_INFO_1=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_1));
+ p += scnprintf(p, end - p,
+ "R_AX_RXDMA_PKT_INFO_2=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_RXDMA_PKT_INFO_2));
}
}
if (dmac_err & B_AX_PKTIN_ERR_FLAG) {
- seq_printf(m, "R_AX_PKTIN_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PKTIN_ERR_IMR));
- seq_printf(m, "R_AX_PKTIN_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_PKTIN_ERR_ISR));
+ p += scnprintf(p, end - p, "R_AX_PKTIN_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PKTIN_ERR_IMR));
+ p += scnprintf(p, end - p, "R_AX_PKTIN_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_PKTIN_ERR_ISR));
}
if (dmac_err & B_AX_DISPATCH_ERR_FLAG) {
- seq_printf(m, "R_AX_HOST_DISPATCHER_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_IMR));
- seq_printf(m, "R_AX_HOST_DISPATCHER_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_ISR));
- seq_printf(m, "R_AX_CPU_DISPATCHER_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_IMR));
- seq_printf(m, "R_AX_CPU_DISPATCHER_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_ISR));
- seq_printf(m, "R_AX_OTHER_DISPATCHER_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_IMR));
- seq_printf(m, "R_AX_OTHER_DISPATCHER_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_HOST_DISPATCHER_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_HOST_DISPATCHER_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_CPU_DISPATCHER_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_CPU_DISPATCHER_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_OTHER_DISPATCHER_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_OTHER_DISPATCHER_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_ISR));
}
if (dmac_err & B_AX_BBRPT_ERR_FLAG) {
if (chip->chip_id == RTL8852C) {
- seq_printf(m, "R_AX_BBRPT_COM_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR));
- seq_printf(m, "R_AX_BBRPT_COM_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_ISR));
- seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_ISR));
- seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR));
- seq_printf(m, "R_AX_BBRPT_DFS_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR));
- seq_printf(m, "R_AX_BBRPT_DFS_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_COM_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_COM_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_CHINFO_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_CHINFO_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_DFS_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_DFS_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_ISR));
} else {
- seq_printf(m, "R_AX_BBRPT_COM_ERR_IMR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR_ISR));
- seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_ISR));
- seq_printf(m, "R_AX_BBRPT_CHINFO_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR));
- seq_printf(m, "R_AX_BBRPT_DFS_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR));
- seq_printf(m, "R_AX_BBRPT_DFS_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_COM_ERR_IMR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_CHINFO_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_ISR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_CHINFO_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_DFS_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR));
+ p += scnprintf(p, end - p,
+ "R_AX_BBRPT_DFS_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_ISR));
}
}
if (dmac_err & B_AX_HAXIDMA_ERR_FLAG && chip->chip_id == RTL8852C) {
- seq_printf(m, "R_AX_HAXIDMA_ERR_IMR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_HAXI_IDCT_MSK));
- seq_printf(m, "R_AX_HAXIDMA_ERR_ISR=0x%08x\n",
- rtw89_read32(rtwdev, R_AX_HAXI_IDCT));
+ p += scnprintf(p, end - p, "R_AX_HAXIDMA_ERR_IMR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_HAXI_IDCT_MSK));
+ p += scnprintf(p, end - p, "R_AX_HAXIDMA_ERR_ISR=0x%08x\n",
+ rtw89_read32(rtwdev, R_AX_HAXI_IDCT));
}
- return 0;
+out:
+ return p - buf;
}
static int rtw89_debug_mac_dump_cmac_err(struct rtw89_dev *rtwdev,
- struct seq_file *m,
+ char *buf, size_t bufsz,
enum rtw89_mac_idx band)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
+ char *p = buf, *end = buf + bufsz;
u32 offset = 0;
u32 cmac_err;
int ret;
@@ -1570,96 +1685,127 @@ static int rtw89_debug_mac_dump_cmac_err(struct rtw89_dev *rtwdev,
ret = rtw89_mac_check_mac_en(rtwdev, band, RTW89_CMAC_SEL);
if (ret) {
if (band)
- seq_puts(m, "[CMAC] : CMAC1 not enabled\n");
+ p += scnprintf(p, end - p,
+ "[CMAC] : CMAC1 not enabled\n");
else
- seq_puts(m, "[CMAC] : CMAC0 not enabled\n");
- return ret;
+ p += scnprintf(p, end - p,
+ "[CMAC] : CMAC0 not enabled\n");
+ goto out;
}
if (band)
offset = RTW89_MAC_AX_BAND_REG_OFFSET;
cmac_err = rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR + offset);
- seq_printf(m, "R_AX_CMAC_ERR_ISR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR + offset));
- seq_printf(m, "R_AX_CMAC_FUNC_EN [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_CMAC_FUNC_EN + offset));
- seq_printf(m, "R_AX_CK_EN [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_CK_EN + offset));
+ p += scnprintf(p, end - p, "R_AX_CMAC_ERR_ISR [%d]=0x%08x\n", band,
+ rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR + offset));
+ p += scnprintf(p, end - p, "R_AX_CMAC_FUNC_EN [%d]=0x%08x\n", band,
+ rtw89_read32(rtwdev, R_AX_CMAC_FUNC_EN + offset));
+ p += scnprintf(p, end - p, "R_AX_CK_EN [%d]=0x%08x\n", band,
+ rtw89_read32(rtwdev, R_AX_CK_EN + offset));
if (cmac_err & B_AX_SCHEDULE_TOP_ERR_IND) {
- seq_printf(m, "R_AX_SCHEDULE_ERR_IMR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_IMR + offset));
- seq_printf(m, "R_AX_SCHEDULE_ERR_ISR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_SCHEDULE_ERR_IMR [%d]=0x%08x\n", band,
+ rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_IMR + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_SCHEDULE_ERR_ISR [%d]=0x%08x\n", band,
+ rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR + offset));
}
if (cmac_err & B_AX_PTCL_TOP_ERR_IND) {
- seq_printf(m, "R_AX_PTCL_IMR0 [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_PTCL_IMR0 + offset));
- seq_printf(m, "R_AX_PTCL_ISR0 [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_PTCL_ISR0 + offset));
+ p += scnprintf(p, end - p, "R_AX_PTCL_IMR0 [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev, R_AX_PTCL_IMR0 + offset));
+ p += scnprintf(p, end - p, "R_AX_PTCL_ISR0 [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev, R_AX_PTCL_ISR0 + offset));
}
if (cmac_err & B_AX_DMA_TOP_ERR_IND) {
if (chip->chip_id == RTL8852C) {
- seq_printf(m, "R_AX_RX_ERR_FLAG [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_RX_ERR_FLAG + offset));
- seq_printf(m, "R_AX_RX_ERR_FLAG_IMR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_RX_ERR_FLAG_IMR + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_RX_ERR_FLAG [%d]=0x%08x\n", band,
+ rtw89_read32(rtwdev, R_AX_RX_ERR_FLAG + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_RX_ERR_FLAG_IMR [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev, R_AX_RX_ERR_FLAG_IMR + offset));
} else {
- seq_printf(m, "R_AX_DLE_CTRL [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_DLE_CTRL + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_DLE_CTRL [%d]=0x%08x\n", band,
+ rtw89_read32(rtwdev, R_AX_DLE_CTRL + offset));
}
}
if (cmac_err & B_AX_DMA_TOP_ERR_IND || cmac_err & B_AX_WMAC_RX_ERR_IND) {
if (chip->chip_id == RTL8852C) {
- seq_printf(m, "R_AX_PHYINFO_ERR_ISR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR + offset));
- seq_printf(m, "R_AX_PHYINFO_ERR_IMR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_PHYINFO_ERR_ISR [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_PHYINFO_ERR_IMR [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR + offset));
} else {
- seq_printf(m, "R_AX_PHYINFO_ERR_IMR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_PHYINFO_ERR_IMR [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_IMR + offset));
}
}
if (cmac_err & B_AX_TXPWR_CTRL_ERR_IND) {
- seq_printf(m, "R_AX_TXPWR_IMR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_TXPWR_IMR + offset));
- seq_printf(m, "R_AX_TXPWR_ISR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_TXPWR_ISR + offset));
+ p += scnprintf(p, end - p, "R_AX_TXPWR_IMR [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev, R_AX_TXPWR_IMR + offset));
+ p += scnprintf(p, end - p, "R_AX_TXPWR_ISR [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev, R_AX_TXPWR_ISR + offset));
}
if (cmac_err & B_AX_WMAC_TX_ERR_IND) {
if (chip->chip_id == RTL8852C) {
- seq_printf(m, "R_AX_TRXPTCL_ERROR_INDICA [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_TRXPTCL_ERROR_INDICA + offset));
- seq_printf(m, "R_AX_TRXPTCL_ERROR_INDICA_MASK [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_TRXPTCL_ERROR_INDICA_MASK + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_TRXPTCL_ERROR_INDICA [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev,
+ R_AX_TRXPTCL_ERROR_INDICA + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_TRXPTCL_ERROR_INDICA_MASK [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev,
+ R_AX_TRXPTCL_ERROR_INDICA_MASK + offset));
} else {
- seq_printf(m, "R_AX_TMAC_ERR_IMR_ISR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_TMAC_ERR_IMR_ISR [%d]=0x%08x\n",
+ band,
+ rtw89_read32(rtwdev,
+ R_AX_TMAC_ERR_IMR_ISR + offset));
}
- seq_printf(m, "R_AX_DBGSEL_TRXPTCL [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL + offset));
+ p += scnprintf(p, end - p,
+ "R_AX_DBGSEL_TRXPTCL [%d]=0x%08x\n", band,
+ rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL + offset));
}
- seq_printf(m, "R_AX_CMAC_ERR_IMR [%d]=0x%08x\n", band,
- rtw89_read32(rtwdev, R_AX_CMAC_ERR_IMR + offset));
+ p += scnprintf(p, end - p, "R_AX_CMAC_ERR_IMR [%d]=0x%08x\n", band,
+ rtw89_read32(rtwdev, R_AX_CMAC_ERR_IMR + offset));
- return 0;
+out:
+ return p - buf;
}
static int rtw89_debug_mac_dump_cmac_dbg(struct rtw89_dev *rtwdev,
- struct seq_file *m)
+ char *buf, size_t bufsz)
{
- rtw89_debug_mac_dump_cmac_err(rtwdev, m, RTW89_MAC_0);
+ char *p = buf, *end = buf + bufsz;
+
+ p += rtw89_debug_mac_dump_cmac_err(rtwdev, p, end - p, RTW89_MAC_0);
if (rtwdev->dbcc_en)
- rtw89_debug_mac_dump_cmac_err(rtwdev, m, RTW89_MAC_1);
+ p += rtw89_debug_mac_dump_cmac_err(rtwdev, p, end - p, RTW89_MAC_1);
- return 0;
+ return p - buf;
}
static const struct rtw89_mac_dbg_port_info dbg_port_ptcl_c0 = {
@@ -2465,11 +2611,12 @@ static const struct rtw89_mac_dbg_port_info dbg_port_pcie_misc2 = {
.rd_msk = B_AX_DEBUG_ST_MASK
};
-static const struct rtw89_mac_dbg_port_info *
-rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
- struct rtw89_dev *rtwdev, u32 sel)
+static int
+rtw89_debug_mac_dbg_port_sel(struct rtw89_dev *rtwdev, char *buf, size_t bufsz,
+ u32 sel, const struct rtw89_mac_dbg_port_info **ppinfo)
{
- const struct rtw89_mac_dbg_port_info *info;
+ const struct rtw89_mac_dbg_port_info *info = NULL;
+ char *p = buf, *end = buf + bufsz;
u32 index;
u32 val32;
u16 val16;
@@ -2481,28 +2628,28 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val16 = rtw89_read16(rtwdev, R_AX_PTCL_DBG);
val16 |= B_AX_PTCL_DBG_EN;
rtw89_write16(rtwdev, R_AX_PTCL_DBG, val16);
- seq_puts(m, "Enable PTCL C0 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable PTCL C0 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_PTCL_C1:
info = &dbg_port_ptcl_c1;
val16 = rtw89_read16(rtwdev, R_AX_PTCL_DBG_C1);
val16 |= B_AX_PTCL_DBG_EN;
rtw89_write16(rtwdev, R_AX_PTCL_DBG_C1, val16);
- seq_puts(m, "Enable PTCL C1 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable PTCL C1 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_SCH_C0:
info = &dbg_port_sch_c0;
val32 = rtw89_read32(rtwdev, R_AX_SCH_DBG_SEL);
val32 |= B_AX_SCH_DBG_EN;
rtw89_write32(rtwdev, R_AX_SCH_DBG_SEL, val32);
- seq_puts(m, "Enable SCH C0 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable SCH C0 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_SCH_C1:
info = &dbg_port_sch_c1;
val32 = rtw89_read32(rtwdev, R_AX_SCH_DBG_SEL_C1);
val32 |= B_AX_SCH_DBG_EN;
rtw89_write32(rtwdev, R_AX_SCH_DBG_SEL_C1, val32);
- seq_puts(m, "Enable SCH C1 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable SCH C1 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_TMAC_C0:
info = &dbg_port_tmac_c0;
@@ -2519,7 +2666,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
- seq_puts(m, "Enable TMAC C0 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable TMAC C0 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_TMAC_C1:
info = &dbg_port_tmac_c1;
@@ -2536,7 +2683,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
- seq_puts(m, "Enable TMAC C1 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable TMAC C1 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_RMAC_C0:
info = &dbg_port_rmac_c0;
@@ -2558,7 +2705,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val8 = u8_replace_bits(val8, RMAC_CMAC_DBG_SEL,
B_AX_DBGSEL_TRXPTCL_MASK);
rtw89_write8(rtwdev, R_AX_DBGSEL_TRXPTCL, val8);
- seq_puts(m, "Enable RMAC C0 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable RMAC C0 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_RMAC_C1:
info = &dbg_port_rmac_c1;
@@ -2580,23 +2727,23 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val8 = u8_replace_bits(val8, RMAC_CMAC_DBG_SEL,
B_AX_DBGSEL_TRXPTCL_MASK);
rtw89_write8(rtwdev, R_AX_DBGSEL_TRXPTCL_C1, val8);
- seq_puts(m, "Enable RMAC C1 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable RMAC C1 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_RMACST_C0:
info = &dbg_port_rmacst_c0;
- seq_puts(m, "Enable RMAC state C0 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable RMAC state C0 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_RMACST_C1:
info = &dbg_port_rmacst_c1;
- seq_puts(m, "Enable RMAC state C1 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable RMAC state C1 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_RMAC_PLCP_C0:
info = &dbg_port_rmac_plcp_c0;
- seq_puts(m, "Enable RMAC PLCP C0 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable RMAC PLCP C0 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_RMAC_PLCP_C1:
info = &dbg_port_rmac_plcp_c1;
- seq_puts(m, "Enable RMAC PLCP C1 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable RMAC PLCP C1 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_TRXPTCL_C0:
info = &dbg_port_trxptcl_c0;
@@ -2608,7 +2755,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
- seq_puts(m, "Enable TRXPTCL C0 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable TRXPTCL C0 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_TRXPTCL_C1:
info = &dbg_port_trxptcl_c1;
@@ -2620,131 +2767,137 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
- seq_puts(m, "Enable TRXPTCL C1 dbgport.\n");
+ p += scnprintf(p, end - p, "Enable TRXPTCL C1 dbgport.\n");
break;
case RTW89_DBG_PORT_SEL_TX_INFOL_C0:
info = &dbg_port_tx_infol_c0;
val32 = rtw89_read32(rtwdev, R_AX_TCR1);
val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
rtw89_write32(rtwdev, R_AX_TCR1, val32);
- seq_puts(m, "Enable tx infol dump.\n");
+ p += scnprintf(p, end - p, "Enable tx infol dump.\n");
break;
case RTW89_DBG_PORT_SEL_TX_INFOH_C0:
info = &dbg_port_tx_infoh_c0;
val32 = rtw89_read32(rtwdev, R_AX_TCR1);
val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
rtw89_write32(rtwdev, R_AX_TCR1, val32);
- seq_puts(m, "Enable tx infoh dump.\n");
+ p += scnprintf(p, end - p, "Enable tx infoh dump.\n");
break;
case RTW89_DBG_PORT_SEL_TX_INFOL_C1:
info = &dbg_port_tx_infol_c1;
val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
- seq_puts(m, "Enable tx infol dump.\n");
+ p += scnprintf(p, end - p, "Enable tx infol dump.\n");
break;
case RTW89_DBG_PORT_SEL_TX_INFOH_C1:
info = &dbg_port_tx_infoh_c1;
val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
- seq_puts(m, "Enable tx infoh dump.\n");
+ p += scnprintf(p, end - p, "Enable tx infoh dump.\n");
break;
case RTW89_DBG_PORT_SEL_TXTF_INFOL_C0:
info = &dbg_port_txtf_infol_c0;
val32 = rtw89_read32(rtwdev, R_AX_TCR1);
val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
rtw89_write32(rtwdev, R_AX_TCR1, val32);
- seq_puts(m, "Enable tx tf infol dump.\n");
+ p += scnprintf(p, end - p, "Enable tx tf infol dump.\n");
break;
case RTW89_DBG_PORT_SEL_TXTF_INFOH_C0:
info = &dbg_port_txtf_infoh_c0;
val32 = rtw89_read32(rtwdev, R_AX_TCR1);
val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
rtw89_write32(rtwdev, R_AX_TCR1, val32);
- seq_puts(m, "Enable tx tf infoh dump.\n");
+ p += scnprintf(p, end - p, "Enable tx tf infoh dump.\n");
break;
case RTW89_DBG_PORT_SEL_TXTF_INFOL_C1:
info = &dbg_port_txtf_infol_c1;
val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
- seq_puts(m, "Enable tx tf infol dump.\n");
+ p += scnprintf(p, end - p, "Enable tx tf infol dump.\n");
break;
case RTW89_DBG_PORT_SEL_TXTF_INFOH_C1:
info = &dbg_port_txtf_infoh_c1;
val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
- seq_puts(m, "Enable tx tf infoh dump.\n");
+ p += scnprintf(p, end - p, "Enable tx tf infoh dump.\n");
break;
case RTW89_DBG_PORT_SEL_WDE_BUFMGN_FREEPG:
info = &dbg_port_wde_bufmgn_freepg;
- seq_puts(m, "Enable wde bufmgn freepg dump.\n");
+ p += scnprintf(p, end - p, "Enable wde bufmgn freepg dump.\n");
break;
case RTW89_DBG_PORT_SEL_WDE_BUFMGN_QUOTA:
info = &dbg_port_wde_bufmgn_quota;
- seq_puts(m, "Enable wde bufmgn quota dump.\n");
+ p += scnprintf(p, end - p, "Enable wde bufmgn quota dump.\n");
break;
case RTW89_DBG_PORT_SEL_WDE_BUFMGN_PAGELLT:
info = &dbg_port_wde_bufmgn_pagellt;
- seq_puts(m, "Enable wde bufmgn pagellt dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable wde bufmgn pagellt dump.\n");
break;
case RTW89_DBG_PORT_SEL_WDE_BUFMGN_PKTINFO:
info = &dbg_port_wde_bufmgn_pktinfo;
- seq_puts(m, "Enable wde bufmgn pktinfo dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable wde bufmgn pktinfo dump.\n");
break;
case RTW89_DBG_PORT_SEL_WDE_QUEMGN_PREPKT:
info = &dbg_port_wde_quemgn_prepkt;
- seq_puts(m, "Enable wde quemgn prepkt dump.\n");
+ p += scnprintf(p, end - p, "Enable wde quemgn prepkt dump.\n");
break;
case RTW89_DBG_PORT_SEL_WDE_QUEMGN_NXTPKT:
info = &dbg_port_wde_quemgn_nxtpkt;
- seq_puts(m, "Enable wde quemgn nxtpkt dump.\n");
+ p += scnprintf(p, end - p, "Enable wde quemgn nxtpkt dump.\n");
break;
case RTW89_DBG_PORT_SEL_WDE_QUEMGN_QLNKTBL:
info = &dbg_port_wde_quemgn_qlnktbl;
- seq_puts(m, "Enable wde quemgn qlnktbl dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable wde quemgn qlnktbl dump.\n");
break;
case RTW89_DBG_PORT_SEL_WDE_QUEMGN_QEMPTY:
info = &dbg_port_wde_quemgn_qempty;
- seq_puts(m, "Enable wde quemgn qempty dump.\n");
+ p += scnprintf(p, end - p, "Enable wde quemgn qempty dump.\n");
break;
case RTW89_DBG_PORT_SEL_PLE_BUFMGN_FREEPG:
info = &dbg_port_ple_bufmgn_freepg;
- seq_puts(m, "Enable ple bufmgn freepg dump.\n");
+ p += scnprintf(p, end - p, "Enable ple bufmgn freepg dump.\n");
break;
case RTW89_DBG_PORT_SEL_PLE_BUFMGN_QUOTA:
info = &dbg_port_ple_bufmgn_quota;
- seq_puts(m, "Enable ple bufmgn quota dump.\n");
+ p += scnprintf(p, end - p, "Enable ple bufmgn quota dump.\n");
break;
case RTW89_DBG_PORT_SEL_PLE_BUFMGN_PAGELLT:
info = &dbg_port_ple_bufmgn_pagellt;
- seq_puts(m, "Enable ple bufmgn pagellt dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable ple bufmgn pagellt dump.\n");
break;
case RTW89_DBG_PORT_SEL_PLE_BUFMGN_PKTINFO:
info = &dbg_port_ple_bufmgn_pktinfo;
- seq_puts(m, "Enable ple bufmgn pktinfo dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable ple bufmgn pktinfo dump.\n");
break;
case RTW89_DBG_PORT_SEL_PLE_QUEMGN_PREPKT:
info = &dbg_port_ple_quemgn_prepkt;
- seq_puts(m, "Enable ple quemgn prepkt dump.\n");
+ p += scnprintf(p, end - p, "Enable ple quemgn prepkt dump.\n");
break;
case RTW89_DBG_PORT_SEL_PLE_QUEMGN_NXTPKT:
info = &dbg_port_ple_quemgn_nxtpkt;
- seq_puts(m, "Enable ple quemgn nxtpkt dump.\n");
+ p += scnprintf(p, end - p, "Enable ple quemgn nxtpkt dump.\n");
break;
case RTW89_DBG_PORT_SEL_PLE_QUEMGN_QLNKTBL:
info = &dbg_port_ple_quemgn_qlnktbl;
- seq_puts(m, "Enable ple quemgn qlnktbl dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable ple quemgn qlnktbl dump.\n");
break;
case RTW89_DBG_PORT_SEL_PLE_QUEMGN_QEMPTY:
info = &dbg_port_ple_quemgn_qempty;
- seq_puts(m, "Enable ple quemgn qempty dump.\n");
+ p += scnprintf(p, end - p, "Enable ple quemgn qempty dump.\n");
break;
case RTW89_DBG_PORT_SEL_PKTINFO:
info = &dbg_port_pktinfo;
- seq_puts(m, "Enable pktinfo dump.\n");
+ p += scnprintf(p, end - p, "Enable pktinfo dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_TX0:
rtw89_write32_mask(rtwdev, R_AX_DBG_CTRL,
@@ -2763,7 +2916,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 0);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, index);
- seq_printf(m, "Enable Dispatcher hdt tx%x dump.\n", index);
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt tx%x dump.\n", index);
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_TX6:
info = &dbg_port_dspt_hdt_tx6;
@@ -2771,7 +2925,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 0);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 6);
- seq_puts(m, "Enable Dispatcher hdt tx6 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt tx6 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_TX7:
info = &dbg_port_dspt_hdt_tx7;
@@ -2779,7 +2934,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 0);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 7);
- seq_puts(m, "Enable Dispatcher hdt tx7 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt tx7 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_TX8:
info = &dbg_port_dspt_hdt_tx8;
@@ -2787,7 +2943,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 0);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 8);
- seq_puts(m, "Enable Dispatcher hdt tx8 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt tx8 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_TX9:
case RTW89_DBG_PORT_SEL_DSPT_HDT_TXA:
@@ -2799,7 +2956,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 0);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, index);
- seq_printf(m, "Enable Dispatcher hdt tx%x dump.\n", index);
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt tx%x dump.\n", index);
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_TXD:
info = &dbg_port_dspt_hdt_txD;
@@ -2807,7 +2965,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 0);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 0xD);
- seq_puts(m, "Enable Dispatcher hdt txD dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt txD dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_TX0:
info = &dbg_port_dspt_cdt_tx0;
@@ -2815,7 +2974,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 1);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 0);
- seq_puts(m, "Enable Dispatcher cdt tx0 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt tx0 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_TX1:
info = &dbg_port_dspt_cdt_tx1;
@@ -2823,7 +2983,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 1);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 1);
- seq_puts(m, "Enable Dispatcher cdt tx1 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt tx1 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_TX3:
info = &dbg_port_dspt_cdt_tx3;
@@ -2831,7 +2992,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 1);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 3);
- seq_puts(m, "Enable Dispatcher cdt tx3 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt tx3 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_TX4:
info = &dbg_port_dspt_cdt_tx4;
@@ -2839,7 +3001,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 1);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 4);
- seq_puts(m, "Enable Dispatcher cdt tx4 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt tx4 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_TX5:
case RTW89_DBG_PORT_SEL_DSPT_CDT_TX6:
@@ -2851,7 +3014,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 1);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, index);
- seq_printf(m, "Enable Dispatcher cdt tx%x dump.\n", index);
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt tx%x dump.\n", index);
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_TX9:
info = &dbg_port_dspt_cdt_tx9;
@@ -2859,7 +3023,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 1);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 9);
- seq_puts(m, "Enable Dispatcher cdt tx9 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt tx9 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_TXA:
case RTW89_DBG_PORT_SEL_DSPT_CDT_TXB:
@@ -2870,7 +3035,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 1);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, index);
- seq_printf(m, "Enable Dispatcher cdt tx%x dump.\n", index);
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt tx%x dump.\n", index);
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_RX0:
info = &dbg_port_dspt_hdt_rx0;
@@ -2878,7 +3044,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 2);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 0);
- seq_puts(m, "Enable Dispatcher hdt rx0 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt rx0 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_RX1:
case RTW89_DBG_PORT_SEL_DSPT_HDT_RX2:
@@ -2888,7 +3055,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 2);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, index);
- seq_printf(m, "Enable Dispatcher hdt rx%x dump.\n", index);
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt rx%x dump.\n", index);
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_RX3:
info = &dbg_port_dspt_hdt_rx3;
@@ -2896,7 +3064,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 2);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 3);
- seq_puts(m, "Enable Dispatcher hdt rx3 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt rx3 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_RX4:
info = &dbg_port_dspt_hdt_rx4;
@@ -2904,7 +3073,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 2);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 4);
- seq_puts(m, "Enable Dispatcher hdt rx4 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt rx4 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_HDT_RX5:
info = &dbg_port_dspt_hdt_rx5;
@@ -2912,7 +3082,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 2);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 5);
- seq_puts(m, "Enable Dispatcher hdt rx5 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher hdt rx5 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_0:
info = &dbg_port_dspt_cdt_rx_p0_0;
@@ -2920,7 +3091,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 3);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 0);
- seq_puts(m, "Enable Dispatcher cdt rx part0 0 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt rx part0 0 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0:
case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_1:
@@ -2929,7 +3101,8 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 3);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 1);
- seq_puts(m, "Enable Dispatcher cdt rx part0 1 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt rx part0 1 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P0_2:
info = &dbg_port_dspt_cdt_rx_p0_2;
@@ -2937,43 +3110,50 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
B_AX_DISPATCHER_INTN_SEL_MASK, 3);
rtw89_write16_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_CH_SEL_MASK, 2);
- seq_puts(m, "Enable Dispatcher cdt rx part0 2 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt rx part0 2 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_CDT_RX_P1:
info = &dbg_port_dspt_cdt_rx_p1;
rtw89_write8_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_INTN_SEL_MASK, 3);
- seq_puts(m, "Enable Dispatcher cdt rx part1 dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher cdt rx part1 dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_STF_CTRL:
info = &dbg_port_dspt_stf_ctrl;
rtw89_write8_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_INTN_SEL_MASK, 4);
- seq_puts(m, "Enable Dispatcher stf control dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher stf control dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_ADDR_CTRL:
info = &dbg_port_dspt_addr_ctrl;
rtw89_write8_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_INTN_SEL_MASK, 5);
- seq_puts(m, "Enable Dispatcher addr control dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher addr control dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_WDE_INTF:
info = &dbg_port_dspt_wde_intf;
rtw89_write8_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_INTN_SEL_MASK, 6);
- seq_puts(m, "Enable Dispatcher wde interface dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher wde interface dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_PLE_INTF:
info = &dbg_port_dspt_ple_intf;
rtw89_write8_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_INTN_SEL_MASK, 7);
- seq_puts(m, "Enable Dispatcher ple interface dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher ple interface dump.\n");
break;
case RTW89_DBG_PORT_SEL_DSPT_FLOW_CTRL:
info = &dbg_port_dspt_flow_ctrl;
rtw89_write8_mask(rtwdev, info->sel_addr,
B_AX_DISPATCHER_INTN_SEL_MASK, 8);
- seq_puts(m, "Enable Dispatcher flow control dump.\n");
+ p += scnprintf(p, end - p,
+ "Enable Dispatcher flow control dump.\n");
break;
case RTW89_DBG_PORT_SEL_PCIE_TXDMA:
info = &dbg_port_pcie_txdma;
@@ -2981,7 +3161,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val32 = u32_replace_bits(val32, PCIE_TXDMA_DBG_SEL, B_AX_DBG_SEL0);
val32 = u32_replace_bits(val32, PCIE_TXDMA_DBG_SEL, B_AX_DBG_SEL1);
rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
- seq_puts(m, "Enable pcie txdma dump.\n");
+ p += scnprintf(p, end - p, "Enable pcie txdma dump.\n");
break;
case RTW89_DBG_PORT_SEL_PCIE_RXDMA:
info = &dbg_port_pcie_rxdma;
@@ -2989,7 +3169,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val32 = u32_replace_bits(val32, PCIE_RXDMA_DBG_SEL, B_AX_DBG_SEL0);
val32 = u32_replace_bits(val32, PCIE_RXDMA_DBG_SEL, B_AX_DBG_SEL1);
rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
- seq_puts(m, "Enable pcie rxdma dump.\n");
+ p += scnprintf(p, end - p, "Enable pcie rxdma dump.\n");
break;
case RTW89_DBG_PORT_SEL_PCIE_CVT:
info = &dbg_port_pcie_cvt;
@@ -2997,7 +3177,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val32 = u32_replace_bits(val32, PCIE_CVT_DBG_SEL, B_AX_DBG_SEL0);
val32 = u32_replace_bits(val32, PCIE_CVT_DBG_SEL, B_AX_DBG_SEL1);
rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
- seq_puts(m, "Enable pcie cvt dump.\n");
+ p += scnprintf(p, end - p, "Enable pcie cvt dump.\n");
break;
case RTW89_DBG_PORT_SEL_PCIE_CXPL:
info = &dbg_port_pcie_cxpl;
@@ -3005,7 +3185,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val32 = u32_replace_bits(val32, PCIE_CXPL_DBG_SEL, B_AX_DBG_SEL0);
val32 = u32_replace_bits(val32, PCIE_CXPL_DBG_SEL, B_AX_DBG_SEL1);
rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
- seq_puts(m, "Enable pcie cxpl dump.\n");
+ p += scnprintf(p, end - p, "Enable pcie cxpl dump.\n");
break;
case RTW89_DBG_PORT_SEL_PCIE_IO:
info = &dbg_port_pcie_io;
@@ -3013,7 +3193,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val32 = u32_replace_bits(val32, PCIE_IO_DBG_SEL, B_AX_DBG_SEL0);
val32 = u32_replace_bits(val32, PCIE_IO_DBG_SEL, B_AX_DBG_SEL1);
rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
- seq_puts(m, "Enable pcie io dump.\n");
+ p += scnprintf(p, end - p, "Enable pcie io dump.\n");
break;
case RTW89_DBG_PORT_SEL_PCIE_MISC:
info = &dbg_port_pcie_misc;
@@ -3021,7 +3201,7 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val32 = u32_replace_bits(val32, PCIE_MISC_DBG_SEL, B_AX_DBG_SEL0);
val32 = u32_replace_bits(val32, PCIE_MISC_DBG_SEL, B_AX_DBG_SEL1);
rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
- seq_puts(m, "Enable pcie misc dump.\n");
+ p += scnprintf(p, end - p, "Enable pcie misc dump.\n");
break;
case RTW89_DBG_PORT_SEL_PCIE_MISC2:
info = &dbg_port_pcie_misc2;
@@ -3029,14 +3209,16 @@ rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
val16 = u16_replace_bits(val16, PCIE_MISC2_DBG_SEL,
B_AX_PCIE_DBG_SEL_MASK);
rtw89_write16(rtwdev, R_AX_PCIE_DBG_CTRL, val16);
- seq_puts(m, "Enable pcie misc2 dump.\n");
+ p += scnprintf(p, end - p, "Enable pcie misc2 dump.\n");
break;
default:
- seq_puts(m, "Dbg port select err\n");
- return NULL;
+ p += scnprintf(p, end - p, "Dbg port select err\n");
+ break;
}
- return info;
+ *ppinfo = info;
+
+ return p - buf;
}
static bool is_dbg_port_valid(struct rtw89_dev *rtwdev, u32 sel)
@@ -3070,23 +3252,25 @@ static bool is_dbg_port_valid(struct rtw89_dev *rtwdev, u32 sel)
}
static int rtw89_debug_mac_dbg_port_dump(struct rtw89_dev *rtwdev,
- struct seq_file *m, u32 sel)
+ char *buf, size_t bufsz, u32 sel)
{
- const struct rtw89_mac_dbg_port_info *info;
- u8 val8;
- u16 val16;
+ const struct rtw89_mac_dbg_port_info *info = NULL;
+ char *p = buf, *end = buf + bufsz;
u32 val32;
+ u16 val16;
+ u8 val8;
u32 i;
- info = rtw89_debug_mac_dbg_port_sel(m, rtwdev, sel);
+ p += rtw89_debug_mac_dbg_port_sel(rtwdev, p, end - p, sel, &info);
+
if (!info) {
rtw89_err(rtwdev, "failed to select debug port %d\n", sel);
- return -EINVAL;
+ goto out;
}
#define case_DBG_SEL(__sel) \
case RTW89_DBG_PORT_SEL_##__sel: \
- seq_puts(m, "Dump debug port " #__sel ":\n"); \
+ p += scnprintf(p, end - p, "Dump debug port " #__sel ":\n"); \
break
switch (sel) {
@@ -3182,8 +3366,8 @@ static int rtw89_debug_mac_dbg_port_dump(struct rtw89_dev *rtwdev,
#undef case_DBG_SEL
- seq_printf(m, "Sel addr = 0x%X\n", info->sel_addr);
- seq_printf(m, "Read addr = 0x%X\n", info->rd_addr);
+ p += scnprintf(p, end - p, "Sel addr = 0x%X\n", info->sel_addr);
+ p += scnprintf(p, end - p, "Read addr = 0x%X\n", info->rd_addr);
for (i = info->srt; i <= info->end; i++) {
switch (info->sel_byte) {
@@ -3191,17 +3375,17 @@ static int rtw89_debug_mac_dbg_port_dump(struct rtw89_dev *rtwdev,
default:
rtw89_write8_mask(rtwdev, info->sel_addr,
info->sel_msk, i);
- seq_printf(m, "0x%02X: ", i);
+ p += scnprintf(p, end - p, "0x%02X: ", i);
break;
case 2:
rtw89_write16_mask(rtwdev, info->sel_addr,
info->sel_msk, i);
- seq_printf(m, "0x%04X: ", i);
+ p += scnprintf(p, end - p, "0x%04X: ", i);
break;
case 4:
rtw89_write32_mask(rtwdev, info->sel_addr,
info->sel_msk, i);
- seq_printf(m, "0x%04X: ", i);
+ p += scnprintf(p, end - p, "0x%04X: ", i);
break;
}
@@ -3212,77 +3396,75 @@ static int rtw89_debug_mac_dbg_port_dump(struct rtw89_dev *rtwdev,
default:
val8 = rtw89_read8_mask(rtwdev,
info->rd_addr, info->rd_msk);
- seq_printf(m, "0x%02X\n", val8);
+ p += scnprintf(p, end - p, "0x%02X\n", val8);
break;
case 2:
val16 = rtw89_read16_mask(rtwdev,
info->rd_addr, info->rd_msk);
- seq_printf(m, "0x%04X\n", val16);
+ p += scnprintf(p, end - p, "0x%04X\n", val16);
break;
case 4:
val32 = rtw89_read32_mask(rtwdev,
info->rd_addr, info->rd_msk);
- seq_printf(m, "0x%08X\n", val32);
+ p += scnprintf(p, end - p, "0x%08X\n", val32);
break;
}
}
- return 0;
+out:
+ return p - buf;
}
static int rtw89_debug_mac_dump_dbg_port(struct rtw89_dev *rtwdev,
- struct seq_file *m)
+ char *buf, size_t bufsz)
{
+ char *p = buf, *end = buf + bufsz;
+ ssize_t n;
u32 sel;
- int ret = 0;
for (sel = RTW89_DBG_PORT_SEL_PTCL_C0;
sel < RTW89_DBG_PORT_SEL_LAST; sel++) {
if (!is_dbg_port_valid(rtwdev, sel))
continue;
- ret = rtw89_debug_mac_dbg_port_dump(rtwdev, m, sel);
- if (ret) {
+ n = rtw89_debug_mac_dbg_port_dump(rtwdev, p, end - p, sel);
+ if (n < 0) {
rtw89_err(rtwdev,
"failed to dump debug port %d\n", sel);
break;
}
+ p += n;
}
- return ret;
+ return p - buf;
}
-static int
-rtw89_debug_priv_mac_dbg_port_dump_get(struct seq_file *m, void *v)
+static ssize_t
+rtw89_debug_priv_mac_dbg_port_dump_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
+ char *p = buf, *end = buf + bufsz;
if (debugfs_priv->dbgpkg_en.ss_dbg)
- rtw89_debug_mac_dump_ss_dbg(rtwdev, m);
+ p += rtw89_debug_mac_dump_ss_dbg(rtwdev, p, end - p);
if (debugfs_priv->dbgpkg_en.dle_dbg)
- rtw89_debug_mac_dump_dle_dbg(rtwdev, m);
+ p += rtw89_debug_mac_dump_dle_dbg(rtwdev, p, end - p);
if (debugfs_priv->dbgpkg_en.dmac_dbg)
- rtw89_debug_mac_dump_dmac_dbg(rtwdev, m);
+ p += rtw89_debug_mac_dump_dmac_dbg(rtwdev, p, end - p);
if (debugfs_priv->dbgpkg_en.cmac_dbg)
- rtw89_debug_mac_dump_cmac_dbg(rtwdev, m);
+ p += rtw89_debug_mac_dump_cmac_dbg(rtwdev, p, end - p);
if (debugfs_priv->dbgpkg_en.dbg_port)
- rtw89_debug_mac_dump_dbg_port(rtwdev, m);
+ p += rtw89_debug_mac_dump_dbg_port(rtwdev, p, end - p);
- return 0;
+ return p - buf;
};
-static u8 *rtw89_hex2bin_user(struct rtw89_dev *rtwdev,
- const char __user *user_buf, size_t count)
+static u8 *rtw89_hex2bin(struct rtw89_dev *rtwdev, const char *buf, size_t count)
{
- char *buf;
u8 *bin;
int num;
int err = 0;
- buf = memdup_user(user_buf, count);
- if (IS_ERR(buf))
- return buf;
-
num = count / 2;
bin = kmalloc(num, GFP_KERNEL);
if (!bin) {
@@ -3297,22 +3479,18 @@ static u8 *rtw89_hex2bin_user(struct rtw89_dev *rtwdev,
}
out:
- kfree(buf);
-
return err ? ERR_PTR(err) : bin;
}
-static ssize_t rtw89_debug_priv_send_h2c_set(struct file *filp,
- const char __user *user_buf,
- size_t count, loff_t *loff)
+static ssize_t rtw89_debug_priv_send_h2c_set(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
u8 *h2c;
int ret;
u16 h2c_len = count / 2;
- h2c = rtw89_hex2bin_user(rtwdev, user_buf, count);
+ h2c = rtw89_hex2bin(rtwdev, buf, count);
if (IS_ERR(h2c))
return -EFAULT;
@@ -3323,34 +3501,36 @@ static ssize_t rtw89_debug_priv_send_h2c_set(struct file *filp,
return ret ? ret : count;
}
-static int
-rtw89_debug_priv_early_h2c_get(struct seq_file *m, void *v)
+static ssize_t
+rtw89_debug_priv_early_h2c_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
struct rtw89_early_h2c *early_h2c;
+ char *p = buf, *end = buf + bufsz;
int seq = 0;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
list_for_each_entry(early_h2c, &rtwdev->early_h2c_list, list)
- seq_printf(m, "%d: %*ph\n", ++seq, early_h2c->h2c_len, early_h2c->h2c);
- mutex_unlock(&rtwdev->mutex);
+ p += scnprintf(p, end - p, "%d: %*ph\n", ++seq,
+ early_h2c->h2c_len, early_h2c->h2c);
- return 0;
+ return p - buf;
}
static ssize_t
-rtw89_debug_priv_early_h2c_set(struct file *filp, const char __user *user_buf,
- size_t count, loff_t *loff)
+rtw89_debug_priv_early_h2c_set(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct seq_file *m = (struct seq_file *)filp->private_data;
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
struct rtw89_early_h2c *early_h2c;
u8 *h2c;
u16 h2c_len = count / 2;
- h2c = rtw89_hex2bin_user(rtwdev, user_buf, count);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
+ h2c = rtw89_hex2bin(rtwdev, buf, count);
if (IS_ERR(h2c))
return -EFAULT;
@@ -3369,9 +3549,7 @@ rtw89_debug_priv_early_h2c_set(struct file *filp, const char __user *user_buf,
early_h2c->h2c = h2c;
early_h2c->h2c_len = h2c_len;
- mutex_lock(&rtwdev->mutex);
list_add_tail(&early_h2c->list, &rtwdev->early_h2c_list);
- mutex_unlock(&rtwdev->mutex);
out:
return count;
@@ -3404,15 +3582,16 @@ static int rtw89_dbg_trigger_ctrl_error(struct rtw89_dev *rtwdev)
return 0;
}
-static int
-rtw89_debug_priv_fw_crash_get(struct seq_file *m, void *v)
+static ssize_t
+rtw89_debug_priv_fw_crash_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
+ char *p = buf, *end = buf + bufsz;
- seq_printf(m, "%d\n",
- test_bit(RTW89_FLAG_CRASH_SIMULATING, rtwdev->flags));
- return 0;
+ p += scnprintf(p, end - p, "%d\n",
+ test_bit(RTW89_FLAG_CRASH_SIMULATING, rtwdev->flags));
+ return p - buf;
}
enum rtw89_dbg_crash_simulation_type {
@@ -3421,17 +3600,17 @@ enum rtw89_dbg_crash_simulation_type {
};
static ssize_t
-rtw89_debug_priv_fw_crash_set(struct file *filp, const char __user *user_buf,
- size_t count, loff_t *loff)
+rtw89_debug_priv_fw_crash_set(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct seq_file *m = (struct seq_file *)filp->private_data;
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
int (*sim)(struct rtw89_dev *rtwdev);
u8 crash_type;
int ret;
- ret = kstrtou8_from_user(user_buf, count, 0, &crash_type);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
+ ret = kstrtou8(buf, 0, &crash_type);
if (ret)
return -EINVAL;
@@ -3448,10 +3627,8 @@ rtw89_debug_priv_fw_crash_set(struct file *filp, const char __user *user_buf,
return -EINVAL;
}
- mutex_lock(&rtwdev->mutex);
set_bit(RTW89_FLAG_CRASH_SIMULATING, rtwdev->flags);
ret = sim(rtwdev);
- mutex_unlock(&rtwdev->mutex);
if (ret)
return ret;
@@ -3459,27 +3636,22 @@ rtw89_debug_priv_fw_crash_set(struct file *filp, const char __user *user_buf,
return count;
}
-static int rtw89_debug_priv_btc_info_get(struct seq_file *m, void *v)
+static ssize_t rtw89_debug_priv_btc_info_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
-
- rtw89_btc_dump_info(rtwdev, m);
-
- return 0;
+ return rtw89_btc_dump_info(rtwdev, buf, bufsz);
}
-static ssize_t rtw89_debug_priv_btc_manual_set(struct file *filp,
- const char __user *user_buf,
- size_t count, loff_t *loff)
+static ssize_t rtw89_debug_priv_btc_manual_set(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
struct rtw89_btc *btc = &rtwdev->btc;
const struct rtw89_btc_ver *ver = btc->ver;
int ret;
- ret = kstrtobool_from_user(user_buf, count, &btc->manual_ctrl);
+ ret = kstrtobool(buf, &btc->manual_ctrl);
if (ret)
return ret;
@@ -3491,31 +3663,29 @@ static ssize_t rtw89_debug_priv_btc_manual_set(struct file *filp,
return count;
}
-static ssize_t rtw89_debug_priv_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 rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
struct rtw89_fw_log *log = &rtwdev->fw.log;
bool fw_log_manual;
- if (kstrtobool_from_user(user_buf, count, &fw_log_manual))
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
+ if (kstrtobool(buf, &fw_log_manual))
goto out;
- mutex_lock(&rtwdev->mutex);
log->enable = fw_log_manual;
if (log->enable)
rtw89_fw_log_prepare(rtwdev);
rtw89_fw_h2c_fw_log(rtwdev, fw_log_manual);
- mutex_unlock(&rtwdev->mutex);
out:
return count;
}
-static void rtw89_sta_link_info_get_iter(struct seq_file *m,
- struct rtw89_dev *rtwdev,
- struct rtw89_sta_link *rtwsta_link)
+static int rtw89_sta_link_info_get_iter(struct rtw89_dev *rtwdev,
+ char *buf, size_t bufsz,
+ struct rtw89_sta_link *rtwsta_link)
{
static const char * const he_gi_str[] = {
[NL80211_RATE_INFO_HE_GI_0_8] = "0.8",
@@ -3533,6 +3703,7 @@ static void rtw89_sta_link_info_get_iter(struct seq_file *m,
u8 ant_num = hal->ant_diversity ? 2 : rtwdev->chip->rf_path_num;
bool ant_asterisk = hal->tx_path_diversity || hal->ant_diversity;
struct ieee80211_link_sta *link_sta;
+ char *p = buf, *end = buf + bufsz;
u8 evm_min, evm_max, evm_1ss;
u16 max_rc_amsdu_len;
u8 rssi;
@@ -3546,107 +3717,136 @@ static void rtw89_sta_link_info_get_iter(struct seq_file *m,
rcu_read_unlock();
- seq_printf(m, "TX rate [%u, %u]: ", rtwsta_link->mac_id, rtwsta_link->link_id);
+ p += scnprintf(p, end - p, "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,
- rate->flags & RATE_INFO_FLAGS_SHORT_GI ? " SGI" : "");
+ p += scnprintf(p, end - p, "HT MCS-%d%s", rate->mcs,
+ rate->flags & RATE_INFO_FLAGS_SHORT_GI ? " SGI" : "");
else if (rate->flags & RATE_INFO_FLAGS_VHT_MCS)
- seq_printf(m, "VHT %dSS MCS-%d%s", rate->nss, rate->mcs,
- rate->flags & RATE_INFO_FLAGS_SHORT_GI ? " SGI" : "");
+ p += scnprintf(p, end - p, "VHT %dSS MCS-%d%s", rate->nss,
+ rate->mcs,
+ rate->flags & RATE_INFO_FLAGS_SHORT_GI ? " SGI" : "");
else if (rate->flags & RATE_INFO_FLAGS_HE_MCS)
- seq_printf(m, "HE %dSS MCS-%d GI:%s", rate->nss, rate->mcs,
- rate->he_gi <= NL80211_RATE_INFO_HE_GI_3_2 ?
- he_gi_str[rate->he_gi] : "N/A");
+ p += scnprintf(p, end - p, "HE %dSS MCS-%d GI:%s", rate->nss,
+ rate->mcs,
+ rate->he_gi <= NL80211_RATE_INFO_HE_GI_3_2 ?
+ he_gi_str[rate->he_gi] : "N/A");
else if (rate->flags & RATE_INFO_FLAGS_EHT_MCS)
- seq_printf(m, "EHT %dSS MCS-%d GI:%s", rate->nss, rate->mcs,
- rate->eht_gi < ARRAY_SIZE(eht_gi_str) ?
- eht_gi_str[rate->eht_gi] : "N/A");
+ p += scnprintf(p, end - p, "EHT %dSS MCS-%d GI:%s", rate->nss,
+ rate->mcs,
+ rate->eht_gi < ARRAY_SIZE(eht_gi_str) ?
+ eht_gi_str[rate->eht_gi] : "N/A");
else
- seq_printf(m, "Legacy %d", rate->legacy);
- 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, " (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 [%u, %u]: ", rtwsta_link->mac_id, rtwsta_link->link_id);
+ p += scnprintf(p, end - p, "Legacy %d", rate->legacy);
+ p += scnprintf(p, end - p, "%s",
+ rtwsta_link->ra_report.might_fallback_legacy ? " FB_G" : "");
+ p += scnprintf(p, end - p, " BW:%u",
+ rtw89_rate_info_bw_to_mhz(rate->bw));
+ p += scnprintf(p, end - p, " (hw_rate=0x%x)",
+ rtwsta_link->ra_report.hw_rate);
+ p += scnprintf(p, end - p, " ==> agg_wait=%d (%d)\n",
+ rtwsta_link->max_agg_wait,
+ max_rc_amsdu_len);
+
+ p += scnprintf(p, end - p, "RX rate [%u, %u]: ", rtwsta_link->mac_id,
+ rtwsta_link->link_id);
switch (status->encoding) {
case RX_ENC_LEGACY:
- seq_printf(m, "Legacy %d", status->rate_idx +
- (status->band != NL80211_BAND_2GHZ ? 4 : 0));
+ p += scnprintf(p, end - p, "Legacy %d", status->rate_idx +
+ (status->band != NL80211_BAND_2GHZ ? 4 : 0));
break;
case RX_ENC_HT:
- seq_printf(m, "HT MCS-%d%s", status->rate_idx,
- status->enc_flags & RX_ENC_FLAG_SHORT_GI ? " SGI" : "");
+ p += scnprintf(p, end - p, "HT MCS-%d%s", status->rate_idx,
+ status->enc_flags & RX_ENC_FLAG_SHORT_GI ? " SGI" : "");
break;
case RX_ENC_VHT:
- seq_printf(m, "VHT %dSS MCS-%d%s", status->nss, status->rate_idx,
- status->enc_flags & RX_ENC_FLAG_SHORT_GI ? " SGI" : "");
+ p += scnprintf(p, end - p, "VHT %dSS MCS-%d%s", status->nss,
+ status->rate_idx,
+ status->enc_flags & RX_ENC_FLAG_SHORT_GI ? " SGI" : "");
break;
case RX_ENC_HE:
- seq_printf(m, "HE %dSS MCS-%d GI:%s", status->nss, status->rate_idx,
- status->he_gi <= NL80211_RATE_INFO_HE_GI_3_2 ?
- he_gi_str[status->he_gi] : "N/A");
+ p += scnprintf(p, end - p, "HE %dSS MCS-%d GI:%s",
+ status->nss, status->rate_idx,
+ status->he_gi <= NL80211_RATE_INFO_HE_GI_3_2 ?
+ he_gi_str[status->he_gi] : "N/A");
break;
case RX_ENC_EHT:
- seq_printf(m, "EHT %dSS MCS-%d GI:%s", status->nss, status->rate_idx,
- status->eht.gi < ARRAY_SIZE(eht_gi_str) ?
- eht_gi_str[status->eht.gi] : "N/A");
+ p += scnprintf(p, end - p, "EHT %dSS MCS-%d GI:%s",
+ status->nss, status->rate_idx,
+ status->eht.gi < ARRAY_SIZE(eht_gi_str) ?
+ eht_gi_str[status->eht.gi] : "N/A");
break;
}
- seq_printf(m, " BW:%u", rtw89_rate_info_bw_to_mhz(status->bw));
- seq_printf(m, " (hw_rate=0x%x)\n", rtwsta_link->rx_hw_rate);
+ p += scnprintf(p, end - p, " BW:%u",
+ rtw89_rate_info_bw_to_mhz(status->bw));
+ p += scnprintf(p, end - p, " (hw_rate=0x%x)\n",
+ rtwsta_link->rx_hw_rate);
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_link->prev_rssi);
+ p += scnprintf(p, end - p, "RSSI: %d dBm (raw=%d, prev=%d) [",
+ RTW89_RSSI_RAW_TO_DBM(rssi), rssi,
+ rtwsta_link->prev_rssi);
for (i = 0; i < ant_num; 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 ? "" : ", ");
+ p += scnprintf(p, end - p, "%d%s%s",
+ RTW89_RSSI_RAW_TO_DBM(rssi),
+ ant_asterisk && (hal->antenna_tx & BIT(i)) ? "*" : "",
+ i + 1 == ant_num ? "" : ", ");
}
- seq_puts(m, "]\n");
+ p += scnprintf(p, end - p, "]\n");
evm_1ss = ewma_evm_read(&rtwsta_link->evm_1ss);
- seq_printf(m, "EVM: [%2u.%02u, ", evm_1ss >> 2, (evm_1ss & 0x3) * 25);
+ p += scnprintf(p, end - p, "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_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,
- evm_max >> 2, (evm_max & 0x3) * 25);
+ p += scnprintf(p, end - p, "%s(%2u.%02u, %2u.%02u)",
+ i == 0 ? "" : " ",
+ evm_min >> 2, (evm_min & 0x3) * 25,
+ evm_max >> 2, (evm_max & 0x3) * 25);
}
- seq_puts(m, "]\t");
+ p += scnprintf(p, end - p, "]\t");
snr = ewma_snr_read(&rtwsta_link->avg_snr);
- seq_printf(m, "SNR: %u\n", snr);
+ p += scnprintf(p, end - p, "SNR: %u\n", snr);
+
+ return p - buf;
}
static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
{
- struct seq_file *m = (struct seq_file *)data;
+ struct rtw89_debugfs_iter_data *iter_data =
+ (struct rtw89_debugfs_iter_data *)data;
struct rtw89_sta *rtwsta = sta_to_rtwsta(sta);
struct rtw89_dev *rtwdev = rtwsta->rtwdev;
struct rtw89_sta_link *rtwsta_link;
+ size_t bufsz = iter_data->bufsz;
+ char *buf = iter_data->buf;
+ char *p = buf, *end = buf + bufsz;
unsigned int link_id;
rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id)
- rtw89_sta_link_info_get_iter(m, rtwdev, rtwsta_link);
+ p += rtw89_sta_link_info_get_iter(rtwdev, p, end - p, rtwsta_link);
+
+ rtw89_debugfs_iter_data_next(iter_data, p, end - p, p - buf);
}
-static void
-rtw89_debug_append_rx_rate(struct seq_file *m, struct rtw89_pkt_stat *pkt_stat,
+static int
+rtw89_debug_append_rx_rate(char *buf, size_t bufsz, struct rtw89_pkt_stat *pkt_stat,
enum rtw89_hw_rate first_rate, int len)
{
+ char *p = buf, *end = buf + bufsz;
int i;
for (i = 0; i < len; i++)
- seq_printf(m, "%s%u", i == 0 ? "" : ", ",
- pkt_stat->rx_rate_cnt[first_rate + i]);
+ p += scnprintf(p, end - p, "%s%u", i == 0 ? "" : ", ",
+ pkt_stat->rx_rate_cnt[first_rate + i]);
+
+ return p - buf;
}
#define FIRST_RATE_SAME(rate) {RTW89_HW_RATE_ ## rate, RTW89_HW_RATE_ ## rate}
@@ -3671,34 +3871,40 @@ static const struct rtw89_rx_rate_cnt_info {
{FIRST_RATE_GEV1(EHT_NSS2_MCS0), 14, 0, "EHT 2SS:"},
};
-static int rtw89_debug_priv_phy_info_get(struct seq_file *m, void *v)
+static ssize_t rtw89_debug_priv_phy_info_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
struct rtw89_traffic_stats *stats = &rtwdev->stats;
struct rtw89_pkt_stat *pkt_stat = &rtwdev->phystat.last_pkt_stat;
const struct rtw89_chip_info *chip = rtwdev->chip;
+ struct rtw89_debugfs_iter_data iter_data;
const struct rtw89_rx_rate_cnt_info *info;
struct rtw89_hal *hal = &rtwdev->hal;
+ char *p = buf, *end = buf + bufsz;
enum rtw89_hw_rate first_rate;
u8 rssi;
int i;
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);
+ p += scnprintf(p, end - p, "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 (%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);
-
- seq_puts(m, "RX count:\n");
+ p += scnprintf(p, end - p, ", duty: %d%%",
+ 100 - hal->thermal_prot_lv * RTW89_THERMAL_PROT_STEP);
+ p += scnprintf(p, end - p, "), RX: %u [%u] Mbps (lv: %d)\n",
+ stats->rx_throughput, stats->rx_throughput_raw,
+ stats->rx_tfc_lv);
+ p += scnprintf(p, end - p, "Beacon: %u (%d dBm), TF: %u\n",
+ pkt_stat->beacon_nr,
+ RTW89_RSSI_RAW_TO_DBM(rssi), stats->rx_tf_periodic);
+ p += scnprintf(p, end - p, "Avg packet length: TX=%u, RX=%u\n",
+ stats->tx_avg_len,
+ stats->rx_avg_len);
+
+ p += scnprintf(p, end - p, "RX count:\n");
for (i = 0; i < ARRAY_SIZE(rtw89_rx_rate_cnt_infos); i++) {
info = &rtw89_rx_rate_cnt_infos[i];
@@ -3706,189 +3912,238 @@ static int rtw89_debug_priv_phy_info_get(struct seq_file *m, void *v)
if (first_rate >= RTW89_HW_RATE_NR)
continue;
- seq_printf(m, "%10s [", info->rate_mode);
- rtw89_debug_append_rx_rate(m, pkt_stat,
- first_rate, info->len);
+ p += scnprintf(p, end - p, "%10s [", info->rate_mode);
+ p += rtw89_debug_append_rx_rate(p, end - p, pkt_stat,
+ first_rate, info->len);
if (info->ext) {
- seq_puts(m, "][");
- rtw89_debug_append_rx_rate(m, pkt_stat,
- first_rate + info->len, info->ext);
+ p += scnprintf(p, end - p, "][");
+ p += rtw89_debug_append_rx_rate(p, end - p, pkt_stat,
+ first_rate + info->len, info->ext);
}
- seq_puts(m, "]\n");
+ p += scnprintf(p, end - p, "]\n");
}
- ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_sta_info_get_iter, m);
+ rtw89_debugfs_iter_data_setup(&iter_data, p, end - p);
+ ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_sta_info_get_iter, &iter_data);
+ p += iter_data.written_sz;
- return 0;
+ return p - buf;
}
-static void rtw89_dump_addr_cam(struct seq_file *m,
- struct rtw89_dev *rtwdev,
- struct rtw89_addr_cam_entry *addr_cam)
+static int rtw89_dump_addr_cam(struct rtw89_dev *rtwdev,
+ char *buf, size_t bufsz,
+ struct rtw89_addr_cam_entry *addr_cam)
{
struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
const struct rtw89_sec_cam_entry *sec_entry;
+ char *p = buf, *end = buf + bufsz;
u8 sec_cam_idx;
int i;
- seq_printf(m, "\taddr_cam_idx=%u\n", addr_cam->addr_cam_idx);
- seq_printf(m, "\t-> bssid_cam_idx=%u\n", addr_cam->bssid_cam_idx);
- seq_printf(m, "\tsec_cam_bitmap=%*ph\n", (int)sizeof(addr_cam->sec_cam_map),
- addr_cam->sec_cam_map);
+ p += scnprintf(p, end - p, "\taddr_cam_idx=%u\n",
+ addr_cam->addr_cam_idx);
+ p += scnprintf(p, end - p, "\t-> bssid_cam_idx=%u\n",
+ addr_cam->bssid_cam_idx);
+ p += scnprintf(p, end - p, "\tsec_cam_bitmap=%*ph\n",
+ (int)sizeof(addr_cam->sec_cam_map),
+ addr_cam->sec_cam_map);
for_each_set_bit(i, addr_cam->sec_cam_map, RTW89_SEC_CAM_IN_ADDR_CAM) {
sec_cam_idx = addr_cam->sec_ent[i];
sec_entry = cam_info->sec_entries[sec_cam_idx];
if (!sec_entry)
continue;
- seq_printf(m, "\tsec[%d]: sec_cam_idx %u", i, sec_entry->sec_cam_idx);
+ p += scnprintf(p, end - p, "\tsec[%d]: sec_cam_idx %u", i,
+ sec_entry->sec_cam_idx);
if (sec_entry->ext_key)
- seq_printf(m, ", %u", sec_entry->sec_cam_idx + 1);
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, ", %u",
+ sec_entry->sec_cam_idx + 1);
+ p += scnprintf(p, end - p, "\n");
}
+
+ return p - buf;
}
-__printf(3, 4)
-static void rtw89_dump_pkt_offload(struct seq_file *m, struct list_head *pkt_list,
- const char *fmt, ...)
+__printf(4, 5)
+static int rtw89_dump_pkt_offload(char *buf, size_t bufsz, struct list_head *pkt_list,
+ const char *fmt, ...)
{
+ char *p = buf, *end = buf + bufsz;
struct rtw89_pktofld_info *info;
struct va_format vaf;
va_list args;
if (list_empty(pkt_list))
- return;
+ return 0;
va_start(args, fmt);
vaf.va = &args;
vaf.fmt = fmt;
- seq_printf(m, "%pV", &vaf);
+ p += scnprintf(p, end - p, "%pV", &vaf);
va_end(args);
list_for_each_entry(info, pkt_list, list)
- seq_printf(m, "%d ", info->id);
+ p += scnprintf(p, end - p, "%d ", info->id);
+
+ p += scnprintf(p, end - p, "\n");
- seq_puts(m, "\n");
+ return p - buf;
}
-static void rtw89_vif_link_ids_get(struct seq_file *m, u8 *mac,
- struct rtw89_dev *rtwdev,
- struct rtw89_vif_link *rtwvif_link)
+static int rtw89_vif_link_ids_get(struct rtw89_dev *rtwdev,
+ char *buf, size_t bufsz, u8 *mac,
+ 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]: ");
+ char *p = buf, *end = buf + bufsz;
+
+ p += scnprintf(p, end - p, " [%u] %pM\n", rtwvif_link->mac_id,
+ rtwvif_link->mac_addr);
+ p += scnprintf(p, end - p, "\tlink_id=%u\n", rtwvif_link->link_id);
+ p += scnprintf(p, end - p, "\tbssid_cam_idx=%u\n",
+ bssid_cam->bssid_cam_idx);
+ p += rtw89_dump_addr_cam(rtwdev, p, end - p, &rtwvif_link->addr_cam);
+ p += rtw89_dump_pkt_offload(p, end - p, &rtwvif_link->general_pkt_list,
+ "\tpkt_ofld[GENERAL]: ");
+
+ return p - buf;
}
static
void rtw89_vif_ids_get_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
{
- struct seq_file *m = (struct seq_file *)data;
+ struct rtw89_debugfs_iter_data *iter_data =
+ (struct rtw89_debugfs_iter_data *)data;
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
struct rtw89_vif_link *rtwvif_link;
+ size_t bufsz = iter_data->bufsz;
+ char *buf = iter_data->buf;
+ char *p = buf, *end = buf + bufsz;
unsigned int link_id;
- seq_printf(m, "VIF %pM\n", rtwvif->mac_addr);
+ p += scnprintf(p, end - p, "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);
+ p += rtw89_vif_link_ids_get(rtwdev, p, end - p, mac, rtwvif_link);
+
+ rtw89_debugfs_iter_data_next(iter_data, p, end - p, p - buf);
}
-static void rtw89_dump_ba_cam(struct seq_file *m, struct rtw89_dev *rtwdev,
- struct rtw89_sta_link *rtwsta_link)
+static int rtw89_dump_ba_cam(struct rtw89_dev *rtwdev,
+ char *buf, size_t bufsz,
+ struct rtw89_sta_link *rtwsta_link)
{
struct rtw89_ba_cam_entry *entry;
+ char *p = buf, *end = buf + bufsz;
bool first = true;
list_for_each_entry(entry, &rtwsta_link->ba_cam_list, list) {
if (first) {
- seq_puts(m, "\tba_cam ");
+ p += scnprintf(p, end - p, "\tba_cam ");
first = false;
} else {
- seq_puts(m, ", ");
+ p += scnprintf(p, end - p, ", ");
}
- seq_printf(m, "tid[%u]=%d", entry->tid,
- (int)(entry - rtwdev->cam_info.ba_cam_entry));
+ p += scnprintf(p, end - p, "tid[%u]=%d", entry->tid,
+ (int)(entry - rtwdev->cam_info.ba_cam_entry));
}
- seq_puts(m, "\n");
+ p += scnprintf(p, end - p, "\n");
+
+ return p - buf;
}
-static void rtw89_sta_link_ids_get(struct seq_file *m,
- struct rtw89_dev *rtwdev,
- struct rtw89_sta_link *rtwsta_link)
+static int rtw89_sta_link_ids_get(struct rtw89_dev *rtwdev,
+ char *buf, size_t bufsz,
+ struct rtw89_sta_link *rtwsta_link)
{
struct ieee80211_link_sta *link_sta;
+ char *p = buf, *end = buf + bufsz;
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);
+ p += scnprintf(p, end - p, " [%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);
+ p += scnprintf(p, end - p, "\tlink_id=%u\n", rtwsta_link->link_id);
+ p += rtw89_dump_addr_cam(rtwdev, p, end - p, &rtwsta_link->addr_cam);
+ p += rtw89_dump_ba_cam(rtwdev, p, end - p, rtwsta_link);
+
+ return p - buf;
}
static void rtw89_sta_ids_get_iter(void *data, struct ieee80211_sta *sta)
{
- struct seq_file *m = (struct seq_file *)data;
+ struct rtw89_debugfs_iter_data *iter_data =
+ (struct rtw89_debugfs_iter_data *)data;
struct rtw89_sta *rtwsta = sta_to_rtwsta(sta);
struct rtw89_dev *rtwdev = rtwsta->rtwdev;
struct rtw89_sta_link *rtwsta_link;
+ size_t bufsz = iter_data->bufsz;
+ char *buf = iter_data->buf;
+ char *p = buf, *end = buf + bufsz;
unsigned int link_id;
- seq_printf(m, "STA %pM %s\n", sta->addr, sta->tdls ? "(TDLS)" : "");
+ p += scnprintf(p, end - p, "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);
+ p += rtw89_sta_link_ids_get(rtwdev, p, end - p, rtwsta_link);
+
+ rtw89_debugfs_iter_data_next(iter_data, p, end - p, p - buf);
}
-static int rtw89_debug_priv_stations_get(struct seq_file *m, void *v)
+static ssize_t rtw89_debug_priv_stations_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
+ struct rtw89_debugfs_iter_data iter_data;
+ char *p = buf, *end = buf + bufsz;
u8 idx;
- mutex_lock(&rtwdev->mutex);
-
- seq_puts(m, "map:\n");
- seq_printf(m, "\tmac_id: %*ph\n", (int)sizeof(rtwdev->mac_id_map),
- rtwdev->mac_id_map);
- seq_printf(m, "\taddr_cam: %*ph\n", (int)sizeof(cam_info->addr_cam_map),
- cam_info->addr_cam_map);
- seq_printf(m, "\tbssid_cam: %*ph\n", (int)sizeof(cam_info->bssid_cam_map),
- cam_info->bssid_cam_map);
- seq_printf(m, "\tsec_cam: %*ph\n", (int)sizeof(cam_info->sec_cam_map),
- cam_info->sec_cam_map);
- seq_printf(m, "\tba_cam: %*ph\n", (int)sizeof(cam_info->ba_cam_map),
- cam_info->ba_cam_map);
- seq_printf(m, "\tpkt_ofld: %*ph\n", (int)sizeof(rtwdev->pkt_offload),
- rtwdev->pkt_offload);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
+ p += scnprintf(p, end - p, "map:\n");
+ p += scnprintf(p, end - p, "\tmac_id: %*ph\n",
+ (int)sizeof(rtwdev->mac_id_map),
+ rtwdev->mac_id_map);
+ p += scnprintf(p, end - p, "\taddr_cam: %*ph\n",
+ (int)sizeof(cam_info->addr_cam_map),
+ cam_info->addr_cam_map);
+ p += scnprintf(p, end - p, "\tbssid_cam: %*ph\n",
+ (int)sizeof(cam_info->bssid_cam_map),
+ cam_info->bssid_cam_map);
+ p += scnprintf(p, end - p, "\tsec_cam: %*ph\n",
+ (int)sizeof(cam_info->sec_cam_map),
+ cam_info->sec_cam_map);
+ p += scnprintf(p, end - p, "\tba_cam: %*ph\n",
+ (int)sizeof(cam_info->ba_cam_map),
+ cam_info->ba_cam_map);
+ p += scnprintf(p, end - p, "\tpkt_ofld: %*ph\n",
+ (int)sizeof(rtwdev->pkt_offload),
+ rtwdev->pkt_offload);
for (idx = NL80211_BAND_2GHZ; idx < NUM_NL80211_BANDS; idx++) {
if (!(rtwdev->chip->support_bands & BIT(idx)))
continue;
- rtw89_dump_pkt_offload(m, &rtwdev->scan_info.pkt_list[idx],
- "\t\t[SCAN %u]: ", idx);
+ p += rtw89_dump_pkt_offload(p, end - p, &rtwdev->scan_info.pkt_list[idx],
+ "\t\t[SCAN %u]: ", idx);
}
+ rtw89_debugfs_iter_data_setup(&iter_data, p, end - p);
ieee80211_iterate_active_interfaces_atomic(rtwdev->hw,
- IEEE80211_IFACE_ITER_NORMAL, rtw89_vif_ids_get_iter, m);
+ IEEE80211_IFACE_ITER_NORMAL, rtw89_vif_ids_get_iter, &iter_data);
+ p += iter_data.written_sz;
- ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_sta_ids_get_iter, m);
+ rtw89_debugfs_iter_data_setup(&iter_data, p, end - p);
+ ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_sta_ids_get_iter, &iter_data);
+ p += iter_data.written_sz;
- mutex_unlock(&rtwdev->mutex);
-
- return 0;
+ return p - buf;
}
#define DM_INFO(type) {RTW89_DM_ ## type, #type}
@@ -3899,43 +4154,45 @@ static const struct rtw89_disabled_dm_info {
} rtw89_disabled_dm_infos[] = {
DM_INFO(DYNAMIC_EDCCA),
DM_INFO(THERMAL_PROTECT),
+ DM_INFO(TAS),
};
-static int
-rtw89_debug_priv_disable_dm_get(struct seq_file *m, void *v)
+static ssize_t
+rtw89_debug_priv_disable_dm_get(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ char *buf, size_t bufsz)
{
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
const struct rtw89_disabled_dm_info *info;
struct rtw89_hal *hal = &rtwdev->hal;
+ char *p = buf, *end = buf + bufsz;
u32 disabled;
int i;
- seq_printf(m, "Disabled DM: 0x%x\n", hal->disabled_dm_bitmap);
+ p += scnprintf(p, end - p, "Disabled DM: 0x%x\n",
+ hal->disabled_dm_bitmap);
for (i = 0; i < ARRAY_SIZE(rtw89_disabled_dm_infos); i++) {
info = &rtw89_disabled_dm_infos[i];
disabled = BIT(info->type) & hal->disabled_dm_bitmap;
- seq_printf(m, "[%d] %s: %c\n", info->type, info->name,
- disabled ? 'X' : 'O');
+ p += scnprintf(p, end - p, "[%d] %s: %c\n", info->type,
+ info->name,
+ disabled ? 'X' : 'O');
}
- return 0;
+ return p - buf;
}
static ssize_t
-rtw89_debug_priv_disable_dm_set(struct file *filp, const char __user *user_buf,
- size_t count, loff_t *loff)
+rtw89_debug_priv_disable_dm_set(struct rtw89_dev *rtwdev,
+ struct rtw89_debugfs_priv *debugfs_priv,
+ const char *buf, size_t count)
{
- struct seq_file *m = (struct seq_file *)filp->private_data;
- struct rtw89_debugfs_priv *debugfs_priv = m->private;
- struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
struct rtw89_hal *hal = &rtwdev->hal;
u32 conf;
int ret;
- ret = kstrtou32_from_user(user_buf, count, 0, &conf);
+ ret = kstrtou32(buf, 0, &conf);
if (ret)
return -EINVAL;
@@ -3944,46 +4201,62 @@ rtw89_debug_priv_disable_dm_set(struct file *filp, const char __user *user_buf,
return count;
}
-#define rtw89_debug_priv_get(name) \
+#define rtw89_debug_priv_get(name, opts...) \
{ \
.cb_read = rtw89_debug_priv_ ##name## _get, \
+ .opt = { opts }, \
}
-#define rtw89_debug_priv_set(name) \
+#define rtw89_debug_priv_set(name, opts...) \
{ \
.cb_write = rtw89_debug_priv_ ##name## _set, \
+ .opt = { opts }, \
}
-#define rtw89_debug_priv_select_and_get(name) \
+#define rtw89_debug_priv_select_and_get(name, opts...) \
{ \
.cb_write = rtw89_debug_priv_ ##name## _select, \
.cb_read = rtw89_debug_priv_ ##name## _get, \
+ .opt = { opts }, \
}
-#define rtw89_debug_priv_set_and_get(name) \
+#define rtw89_debug_priv_set_and_get(name, opts...) \
{ \
.cb_write = rtw89_debug_priv_ ##name## _set, \
.cb_read = rtw89_debug_priv_ ##name## _get, \
+ .opt = { opts }, \
}
+#define RSIZE_8K .rsize = 0x2000
+#define RSIZE_12K .rsize = 0x3000
+#define RSIZE_16K .rsize = 0x4000
+#define RSIZE_20K .rsize = 0x5000
+#define RSIZE_32K .rsize = 0x8000
+#define RSIZE_64K .rsize = 0x10000
+#define RSIZE_128K .rsize = 0x20000
+#define RSIZE_1M .rsize = 0x100000
+#define RLOCK .rlock = 1
+#define WLOCK .wlock = 1
+#define RWLOCK RLOCK, WLOCK
+
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),
+ .rf_reg_dump = rtw89_debug_priv_get(rf_reg_dump, RSIZE_8K),
+ .txpwr_table = rtw89_debug_priv_get(txpwr_table, RSIZE_20K, RLOCK),
+ .mac_reg_dump = rtw89_debug_priv_select_and_get(mac_reg_dump, RSIZE_128K),
+ .mac_mem_dump = rtw89_debug_priv_select_and_get(mac_mem_dump, RSIZE_16K, RLOCK),
+ .mac_dbg_port_dump = rtw89_debug_priv_select_and_get(mac_dbg_port_dump, RSIZE_1M),
.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),
+ .early_h2c = rtw89_debug_priv_set_and_get(early_h2c, RWLOCK),
+ .fw_crash = rtw89_debug_priv_set_and_get(fw_crash, WLOCK),
+ .btc_info = rtw89_debug_priv_get(btc_info, RSIZE_12K),
.btc_manual = rtw89_debug_priv_set(btc_manual),
- .fw_log_manual = rtw89_debug_priv_set(fw_log_manual),
+ .fw_log_manual = rtw89_debug_priv_set(fw_log_manual, WLOCK),
.phy_info = rtw89_debug_priv_get(phy_info),
- .stations = rtw89_debug_priv_get(stations),
+ .stations = rtw89_debug_priv_get(stations, RLOCK),
.disable_dm = rtw89_debug_priv_set_and_get(disable_dm),
};
diff --git a/drivers/net/wireless/realtek/rtw89/fw.c b/drivers/net/wireless/realtek/rtw89/fw.c
index 5d4ad23cc3bd..8643b17866f8 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.c
+++ b/drivers/net/wireless/realtek/rtw89/fw.c
@@ -38,6 +38,16 @@ struct rtw89_arp_rsp {
static const u8 mss_signature[] = {0x4D, 0x53, 0x53, 0x4B, 0x50, 0x4F, 0x4F, 0x4C};
+const struct rtw89_fw_blacklist rtw89_fw_blacklist_default = {
+ .ver = 0x00,
+ .list = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ },
+};
+EXPORT_SYMBOL(rtw89_fw_blacklist_default);
+
union rtw89_fw_element_arg {
size_t offset;
enum rtw89_rf_path rf_path;
@@ -314,7 +324,7 @@ static int __parse_formatted_mssc(struct rtw89_dev *rtwdev,
if (!sec->secure_boot)
goto out;
- sb_sel_ver = le32_to_cpu(section_content->sb_sel_ver.v);
+ sb_sel_ver = get_unaligned_le32(&section_content->sb_sel_ver.v);
if (sb_sel_ver && sb_sel_ver != sec->sb_sel_mgn)
goto ignore;
@@ -344,6 +354,46 @@ ignore:
return 0;
}
+static int __check_secure_blacklist(struct rtw89_dev *rtwdev,
+ struct rtw89_fw_bin_info *info,
+ struct rtw89_fw_hdr_section_info *section_info,
+ const void *content)
+{
+ const struct rtw89_fw_blacklist *chip_blacklist = rtwdev->chip->fw_blacklist;
+ const union rtw89_fw_section_mssc_content *section_content = content;
+ struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
+ u8 byte_idx;
+ u8 bit_mask;
+
+ if (!sec->secure_boot)
+ return 0;
+
+ if (!info->secure_section_exist || section_info->ignore)
+ return 0;
+
+ if (!chip_blacklist) {
+ rtw89_warn(rtwdev, "chip no blacklist for secure firmware\n");
+ return -ENOENT;
+ }
+
+ byte_idx = section_content->blacklist.bit_in_chip_list >> 3;
+ bit_mask = BIT(section_content->blacklist.bit_in_chip_list & 0x7);
+
+ if (section_content->blacklist.ver > chip_blacklist->ver) {
+ rtw89_warn(rtwdev, "chip blacklist out of date (%u, %u)\n",
+ section_content->blacklist.ver, chip_blacklist->ver);
+ return -EINVAL;
+ }
+
+ if (chip_blacklist->list[byte_idx] & bit_mask) {
+ rtw89_warn(rtwdev, "firmware %u in chip blacklist\n",
+ section_content->blacklist.ver);
+ return -EPERM;
+ }
+
+ return 0;
+}
+
static int __parse_security_section(struct rtw89_dev *rtwdev,
struct rtw89_fw_bin_info *info,
struct rtw89_fw_hdr_section_info *section_info,
@@ -364,8 +414,11 @@ static int __parse_security_section(struct rtw89_dev *rtwdev,
*mssc_len += section_info->mssc * FWDL_SECURITY_CHKSUM_LEN;
if (sec->secure_boot) {
- if (sec->mss_idx >= section_info->mssc)
+ if (sec->mss_idx >= section_info->mssc) {
+ rtw89_err(rtwdev, "unexpected MSS %d >= %d\n",
+ sec->mss_idx, section_info->mssc);
return -EFAULT;
+ }
section_info->key_addr = content + section_info->len +
sec->mss_idx * FWDL_SECURITY_SIGLEN;
section_info->key_len = FWDL_SECURITY_SIGLEN;
@@ -374,6 +427,9 @@ static int __parse_security_section(struct rtw89_dev *rtwdev,
info->secure_section_exist = true;
}
+ ret = __check_secure_blacklist(rtwdev, info, section_info, content);
+ WARN_ONCE(ret, "Current firmware in blacklist. Please update firmware.\n");
+
return 0;
}
@@ -490,18 +546,61 @@ static int rtw89_fw_hdr_parser(struct rtw89_dev *rtwdev,
}
static
+const struct rtw89_mfw_hdr *rtw89_mfw_get_hdr_ptr(struct rtw89_dev *rtwdev,
+ const struct firmware *firmware)
+{
+ const struct rtw89_mfw_hdr *mfw_hdr;
+
+ if (sizeof(*mfw_hdr) > firmware->size)
+ return NULL;
+
+ mfw_hdr = (const struct rtw89_mfw_hdr *)firmware->data;
+
+ if (mfw_hdr->sig != RTW89_MFW_SIG)
+ return NULL;
+
+ return mfw_hdr;
+}
+
+static int rtw89_mfw_validate_hdr(struct rtw89_dev *rtwdev,
+ const struct firmware *firmware,
+ const struct rtw89_mfw_hdr *mfw_hdr)
+{
+ const void *mfw = firmware->data;
+ u32 mfw_len = firmware->size;
+ u8 fw_nr = mfw_hdr->fw_nr;
+ const void *ptr;
+
+ if (fw_nr == 0) {
+ rtw89_err(rtwdev, "mfw header has no fw entry\n");
+ return -ENOENT;
+ }
+
+ ptr = &mfw_hdr->info[fw_nr];
+
+ if (ptr > mfw + mfw_len) {
+ rtw89_err(rtwdev, "mfw header out of address\n");
+ return -EFAULT;
+ }
+
+ return 0;
+}
+
+static
int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
struct rtw89_fw_suit *fw_suit, bool nowarn)
{
struct rtw89_fw_info *fw_info = &rtwdev->fw;
const struct firmware *firmware = fw_info->req.firmware;
+ const struct rtw89_mfw_info *mfw_info = NULL, *tmp;
+ const struct rtw89_mfw_hdr *mfw_hdr;
const u8 *mfw = firmware->data;
u32 mfw_len = firmware->size;
- const struct rtw89_mfw_hdr *mfw_hdr = (const struct rtw89_mfw_hdr *)mfw;
- const struct rtw89_mfw_info *mfw_info = NULL, *tmp;
+ int ret;
int i;
- if (mfw_hdr->sig != RTW89_MFW_SIG) {
+ mfw_hdr = rtw89_mfw_get_hdr_ptr(rtwdev, firmware);
+ if (!mfw_hdr) {
rtw89_debug(rtwdev, RTW89_DBG_FW, "use legacy firmware\n");
/* legacy firmware support normal type only */
if (type != RTW89_FW_NORMAL)
@@ -511,6 +610,10 @@ int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
return 0;
}
+ ret = rtw89_mfw_validate_hdr(rtwdev, firmware, mfw_hdr);
+ if (ret)
+ return ret;
+
for (i = 0; i < mfw_hdr->fw_nr; i++) {
tmp = &mfw_hdr->info[i];
if (tmp->type != type)
@@ -540,6 +643,12 @@ int rtw89_mfw_recognize(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
found:
fw_suit->data = mfw + le32_to_cpu(mfw_info->shift);
fw_suit->size = le32_to_cpu(mfw_info->size);
+
+ if (fw_suit->data + fw_suit->size > mfw + mfw_len) {
+ rtw89_err(rtwdev, "fw_suit %d out of address\n", type);
+ return -EFAULT;
+ }
+
return 0;
}
@@ -547,16 +656,21 @@ static u32 rtw89_mfw_get_size(struct rtw89_dev *rtwdev)
{
struct rtw89_fw_info *fw_info = &rtwdev->fw;
const struct firmware *firmware = fw_info->req.firmware;
- const struct rtw89_mfw_hdr *mfw_hdr =
- (const struct rtw89_mfw_hdr *)firmware->data;
const struct rtw89_mfw_info *mfw_info;
+ const struct rtw89_mfw_hdr *mfw_hdr;
u32 size;
+ int ret;
- if (mfw_hdr->sig != RTW89_MFW_SIG) {
+ mfw_hdr = rtw89_mfw_get_hdr_ptr(rtwdev, firmware);
+ if (!mfw_hdr) {
rtw89_warn(rtwdev, "not mfw format\n");
return 0;
}
+ ret = rtw89_mfw_validate_hdr(rtwdev, firmware, mfw_hdr);
+ if (ret)
+ return ret;
+
mfw_info = &mfw_hdr->info[mfw_hdr->fw_nr - 1];
size = le32_to_cpu(mfw_info->shift) + le32_to_cpu(mfw_info->size);
@@ -735,6 +849,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
__CFG_FW_FEAT(RTL8922A, lt, 0, 35, 47, 0, CH_INFO_BE_V0),
__CFG_FW_FEAT(RTL8922A, lt, 0, 35, 49, 0, RFK_PRE_NOTIFY_V1),
__CFG_FW_FEAT(RTL8922A, lt, 0, 35, 51, 0, NO_PHYCAP_P1),
+ __CFG_FW_FEAT(RTL8922A, lt, 0, 35, 64, 0, NO_POWER_DIFFERENCE),
};
static void rtw89_fw_iterate_feature_cfg(struct rtw89_fw_info *fw,
@@ -988,7 +1103,7 @@ int rtw89_build_txpwr_trk_tbl_from_elm(struct rtw89_dev *rtwdev,
bitmap = le32_to_cpu(elm->u.txpwr_trk.bitmap);
if ((bitmap & needed_bitmap) != needed_bitmap) {
- rtw89_warn(rtwdev, "needed txpwr trk bitmap %08x but %0x8x\n",
+ rtw89_warn(rtwdev, "needed txpwr trk bitmap %08x but %08x\n",
needed_bitmap, bitmap);
return -ENOENT;
}
@@ -1056,6 +1171,101 @@ allocated:
return 0;
}
+static bool rtw89_regd_entcpy(struct rtw89_regd *regd, const void *cursor,
+ u8 cursor_size)
+{
+ /* fill default values if needed for backward compatibility */
+ struct rtw89_fw_regd_entry entry = {
+ .rule_2ghz = RTW89_NA,
+ .rule_5ghz = RTW89_NA,
+ .rule_6ghz = RTW89_NA,
+ .fmap = cpu_to_le32(0x0),
+ };
+ u8 valid_size = min_t(u8, sizeof(entry), cursor_size);
+ unsigned int i;
+ u32 fmap;
+
+ memcpy(&entry, cursor, valid_size);
+ memset(regd, 0, sizeof(*regd));
+
+ regd->alpha2[0] = entry.alpha2_0;
+ regd->alpha2[1] = entry.alpha2_1;
+ regd->alpha2[2] = '\0';
+
+ /* also need to consider forward compatibility */
+ regd->txpwr_regd[RTW89_BAND_2G] = entry.rule_2ghz < RTW89_REGD_NUM ?
+ entry.rule_2ghz : RTW89_NA;
+ regd->txpwr_regd[RTW89_BAND_5G] = entry.rule_5ghz < RTW89_REGD_NUM ?
+ entry.rule_5ghz : RTW89_NA;
+ regd->txpwr_regd[RTW89_BAND_6G] = entry.rule_6ghz < RTW89_REGD_NUM ?
+ entry.rule_6ghz : RTW89_NA;
+
+ BUILD_BUG_ON(sizeof(fmap) != sizeof(entry.fmap));
+ BUILD_BUG_ON(sizeof(fmap) * 8 < NUM_OF_RTW89_REGD_FUNC);
+
+ fmap = le32_to_cpu(entry.fmap);
+ for (i = 0; i < NUM_OF_RTW89_REGD_FUNC; i++) {
+ if (fmap & BIT(i))
+ set_bit(i, regd->func_bitmap);
+ }
+
+ return true;
+}
+
+#define rtw89_for_each_in_regd_element(regd, element) \
+ for (const void *cursor = (element)->content, \
+ *end = (element)->content + \
+ le32_to_cpu((element)->num_ents) * (element)->ent_sz; \
+ cursor < end; cursor += (element)->ent_sz) \
+ if (rtw89_regd_entcpy(regd, cursor, (element)->ent_sz))
+
+static
+int rtw89_recognize_regd_from_elm(struct rtw89_dev *rtwdev,
+ const struct rtw89_fw_element_hdr *elm,
+ const union rtw89_fw_element_arg arg)
+{
+ const struct __rtw89_fw_regd_element *regd_elm = &elm->u.regd;
+ struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
+ u32 num_ents = le32_to_cpu(regd_elm->num_ents);
+ struct rtw89_regd_data *p;
+ struct rtw89_regd regd;
+ u32 i = 0;
+
+ if (num_ents > RTW89_REGD_MAX_COUNTRY_NUM) {
+ rtw89_warn(rtwdev,
+ "regd element ents (%d) are over max num (%d)\n",
+ num_ents, RTW89_REGD_MAX_COUNTRY_NUM);
+ rtw89_warn(rtwdev,
+ "regd element ignore and take another/common\n");
+ return 1;
+ }
+
+ if (elm_info->regd) {
+ rtw89_debug(rtwdev, RTW89_DBG_REGD,
+ "regd element take the latter\n");
+ devm_kfree(rtwdev->dev, elm_info->regd);
+ elm_info->regd = NULL;
+ }
+
+ p = devm_kzalloc(rtwdev->dev, struct_size(p, map, num_ents), GFP_KERNEL);
+ if (!p)
+ return -ENOMEM;
+
+ p->nr = num_ents;
+ rtw89_for_each_in_regd_element(&regd, regd_elm)
+ p->map[i++] = regd;
+
+ if (i != num_ents) {
+ rtw89_err(rtwdev, "regd element has %d invalid ents\n",
+ num_ents - i);
+ devm_kfree(rtwdev->dev, p);
+ return -EINVAL;
+ }
+
+ elm_info->regd = p;
+ return 0;
+}
+
static const struct rtw89_fw_element_handler __fw_element_handlers[] = {
[RTW89_FW_ELEMENT_ID_BBMCU0] = {__rtw89_fw_recognize_from_elm,
{ .fw_type = RTW89_FW_BBMCU0 }, NULL},
@@ -1114,6 +1324,9 @@ static const struct rtw89_fw_element_handler __fw_element_handlers[] = {
[RTW89_FW_ELEMENT_ID_RFKLOG_FMT] = {
rtw89_build_rfk_log_fmt_from_elm, {}, NULL,
},
+ [RTW89_FW_ELEMENT_ID_REGD] = {
+ rtw89_recognize_regd_from_elm, {}, "REGD",
+ },
};
int rtw89_fw_recognize_elements(struct rtw89_dev *rtwdev)
@@ -1322,7 +1535,6 @@ static int __rtw89_fw_download_hdr(struct rtw89_dev *rtwdev,
ret = rtw89_h2c_tx(rtwdev, skb, false);
if (ret) {
rtw89_err(rtwdev, "failed to send h2c\n");
- ret = -1;
goto fail;
}
@@ -1409,7 +1621,6 @@ static int __rtw89_fw_download_main(struct rtw89_dev *rtwdev,
ret = rtw89_h2c_tx(rtwdev, skb, true);
if (ret) {
rtw89_err(rtwdev, "failed to send h2c\n");
- ret = -1;
goto fail;
}
@@ -2697,7 +2908,9 @@ int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
{
const struct rtw89_phy_bb_gain_info_be *gain = &rtwdev->bb_gain.be;
struct rtw89_pkt_stat *pkt_stat = &rtwdev->phystat.cur_pkt_stat;
+ static const u8 bcn_bw_ofst[] = {0, 0, 0, 3, 6, 9, 0, 12};
const struct rtw89_chip_info *chip = rtwdev->chip;
+ struct rtw89_efuse *efuse = &rtwdev->efuse;
struct rtw89_h2c_lps_ml_cmn_info *h2c;
struct rtw89_vif_link *rtwvif_link;
const struct rtw89_chan *chan;
@@ -2705,6 +2918,7 @@ int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
u32 len = sizeof(*h2c);
unsigned int link_id;
struct sk_buff *skb;
+ u8 beacon_bw_ofst;
u8 gain_band;
u32 done;
u8 path;
@@ -2722,9 +2936,10 @@ int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
skb_put(skb, len);
h2c = (struct rtw89_h2c_lps_ml_cmn_info *)skb->data;
- h2c->fmt_id = 0x1;
+ h2c->fmt_id = 0x3;
h2c->mlo_dbcc_mode = cpu_to_le32(rtwdev->mlo_dbcc_mode);
+ h2c->rfe_type = efuse->rfe_type;
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id) {
path = rtwvif_link->phy_idx == RTW89_PHY_1 ? RF_PATH_B : RF_PATH_A;
@@ -2745,9 +2960,21 @@ int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
h2c->tia_gain[rtwvif_link->phy_idx][i] =
cpu_to_le16(gain->tia_gain[gain_band][bw_idx][path][i]);
}
+
+ if (rtwvif_link->bcn_bw_idx < ARRAY_SIZE(bcn_bw_ofst)) {
+ beacon_bw_ofst = bcn_bw_ofst[rtwvif_link->bcn_bw_idx];
+ h2c->dup_bcn_ofst[rtwvif_link->phy_idx] = beacon_bw_ofst;
+ }
+
memcpy(h2c->lna_gain[rtwvif_link->phy_idx],
gain->lna_gain[gain_band][bw_idx][path],
LNA_GAIN_NUM);
+ memcpy(h2c->tia_lna_op1db[rtwvif_link->phy_idx],
+ gain->tia_lna_op1db[gain_band][bw_idx][path],
+ LNA_GAIN_NUM + 1);
+ memcpy(h2c->lna_op1db[rtwvif_link->phy_idx],
+ gain->lna_op1db[gain_band][bw_idx][path],
+ LNA_GAIN_NUM);
}
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
@@ -3281,9 +3508,10 @@ int rtw89_fw_h2c_assoc_cmac_tbl_g7(struct rtw89_dev *rtwdev,
CCTLINFO_G7_W5_NOMINAL_PKT_PADDING3 |
CCTLINFO_G7_W5_NOMINAL_PKT_PADDING4);
- h2c->w6 = le32_encode_bits(vif->type == NL80211_IFTYPE_STATION ? 1 : 0,
+ h2c->w6 = le32_encode_bits(vif->cfg.aid, CCTLINFO_G7_W6_AID12_PAID) |
+ le32_encode_bits(vif->type == NL80211_IFTYPE_STATION ? 1 : 0,
CCTLINFO_G7_W6_ULDL);
- h2c->m6 = cpu_to_le32(CCTLINFO_G7_W6_ULDL);
+ h2c->m6 = cpu_to_le32(CCTLINFO_G7_W6_AID12_PAID | CCTLINFO_G7_W6_ULDL);
if (rtwsta_link) {
h2c->w8 = le32_encode_bits(link_sta->he_cap.has_he,
@@ -3419,6 +3647,61 @@ fail:
return ret;
}
+EXPORT_SYMBOL(rtw89_fw_h2c_txtime_cmac_tbl);
+
+int rtw89_fw_h2c_txtime_cmac_tbl_g7(struct rtw89_dev *rtwdev,
+ struct rtw89_sta_link *rtwsta_link)
+{
+ struct rtw89_h2c_cctlinfo_ud_g7 *h2c;
+ u32 len = sizeof(*h2c);
+ struct sk_buff *skb;
+ int ret;
+
+ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
+ if (!skb) {
+ rtw89_err(rtwdev, "failed to alloc skb for txtime_cmac_g7\n");
+ return -ENOMEM;
+ }
+ skb_put(skb, len);
+ h2c = (struct rtw89_h2c_cctlinfo_ud_g7 *)skb->data;
+
+ h2c->c0 = le32_encode_bits(rtwsta_link->mac_id, CCTLINFO_G7_C0_MACID) |
+ le32_encode_bits(1, CCTLINFO_G7_C0_OP);
+
+ if (rtwsta_link->cctl_tx_time) {
+ h2c->w3 |= le32_encode_bits(1, CCTLINFO_G7_W3_AMPDU_TIME_SEL);
+ h2c->m3 |= cpu_to_le32(CCTLINFO_G7_W3_AMPDU_TIME_SEL);
+
+ h2c->w2 |= le32_encode_bits(rtwsta_link->ampdu_max_time,
+ CCTLINFO_G7_W2_AMPDU_MAX_TIME);
+ h2c->m2 |= cpu_to_le32(CCTLINFO_G7_W2_AMPDU_MAX_TIME);
+ }
+ if (rtwsta_link->cctl_tx_retry_limit) {
+ h2c->w2 |= le32_encode_bits(1, CCTLINFO_G7_W2_DATA_TXCNT_LMT_SEL) |
+ le32_encode_bits(rtwsta_link->data_tx_cnt_lmt,
+ CCTLINFO_G7_W2_DATA_TX_CNT_LMT);
+ h2c->m2 |= cpu_to_le32(CCTLINFO_G7_W2_DATA_TXCNT_LMT_SEL |
+ CCTLINFO_G7_W2_DATA_TX_CNT_LMT);
+ }
+
+ rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
+ H2C_CAT_MAC, H2C_CL_MAC_FR_EXCHG,
+ H2C_FUNC_MAC_CCTLINFO_UD_G7, 0, 1,
+ len);
+
+ ret = rtw89_h2c_tx(rtwdev, skb, false);
+ if (ret) {
+ rtw89_err(rtwdev, "failed to send h2c\n");
+ goto fail;
+ }
+
+ return 0;
+fail:
+ dev_kfree_skb_any(skb);
+
+ return ret;
+}
+EXPORT_SYMBOL(rtw89_fw_h2c_txtime_cmac_tbl_g7);
int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
struct rtw89_sta_link *rtwsta_link)
@@ -3622,14 +3905,15 @@ fail:
}
EXPORT_SYMBOL(rtw89_fw_h2c_update_beacon_be);
-#define H2C_ROLE_MAINTAIN_LEN 4
int rtw89_fw_h2c_role_maintain(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link,
struct rtw89_sta_link *rtwsta_link,
enum rtw89_upd_mode upd_mode)
{
- struct sk_buff *skb;
u8 mac_id = rtwsta_link ? rtwsta_link->mac_id : rtwvif_link->mac_id;
+ struct rtw89_h2c_role_maintain *h2c;
+ u32 len = sizeof(*h2c);
+ struct sk_buff *skb;
u8 self_role;
int ret;
@@ -3642,21 +3926,27 @@ int rtw89_fw_h2c_role_maintain(struct rtw89_dev *rtwdev,
self_role = rtwvif_link->self_role;
}
- skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_ROLE_MAINTAIN_LEN);
+ skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
if (!skb) {
rtw89_err(rtwdev, "failed to alloc skb for h2c join\n");
return -ENOMEM;
}
- skb_put(skb, H2C_ROLE_MAINTAIN_LEN);
- SET_FWROLE_MAINTAIN_MACID(skb->data, mac_id);
- SET_FWROLE_MAINTAIN_SELF_ROLE(skb->data, self_role);
- SET_FWROLE_MAINTAIN_UPD_MODE(skb->data, upd_mode);
- SET_FWROLE_MAINTAIN_WIFI_ROLE(skb->data, rtwvif_link->wifi_role);
+ skb_put(skb, len);
+ h2c = (struct rtw89_h2c_role_maintain *)skb->data;
+
+ h2c->w0 = le32_encode_bits(mac_id, RTW89_H2C_ROLE_MAINTAIN_W0_MACID) |
+ le32_encode_bits(self_role, RTW89_H2C_ROLE_MAINTAIN_W0_SELF_ROLE) |
+ le32_encode_bits(upd_mode, RTW89_H2C_ROLE_MAINTAIN_W0_UPD_MODE) |
+ le32_encode_bits(rtwvif_link->wifi_role,
+ RTW89_H2C_ROLE_MAINTAIN_W0_WIFI_ROLE) |
+ le32_encode_bits(rtwvif_link->mac_idx,
+ RTW89_H2C_ROLE_MAINTAIN_W0_BAND) |
+ le32_encode_bits(rtwvif_link->port, RTW89_H2C_ROLE_MAINTAIN_W0_PORT);
rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
H2C_CAT_MAC, H2C_CL_MAC_MEDIA_RPT,
H2C_FUNC_MAC_FWROLE_MAINTAIN, 0, 1,
- H2C_ROLE_MAINTAIN_LEN);
+ len);
ret = rtw89_h2c_tx(rtwdev, skb, false);
if (ret) {
@@ -5311,6 +5601,7 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
u8 macc_role_size = sizeof(*macc_role) * option->num_macc_role;
u8 opch_size = sizeof(*opch) * option->num_opch;
u8 probe_id[NUM_NL80211_BANDS];
+ u8 scan_offload_ver = U8_MAX;
u8 cfg_len = sizeof(*h2c);
unsigned int cond;
u8 ver = U8_MAX;
@@ -5321,6 +5612,11 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
rtw89_scan_get_6g_disabled_chan(rtwdev, option);
+ if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD_BE_V0, &rtwdev->fw)) {
+ cfg_len = offsetofend(typeof(*h2c), w8);
+ scan_offload_ver = 0;
+ }
+
len = cfg_len + macc_role_size + opch_size;
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
if (!skb) {
@@ -5392,10 +5688,8 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_6GHZ);
}
- if (RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD_BE_V0, &rtwdev->fw)) {
- cfg_len = offsetofend(typeof(*h2c), w8);
+ if (scan_offload_ver == 0)
goto flex_member;
- }
h2c->w9 = le32_encode_bits(sizeof(*h2c) / sizeof(h2c->w0),
RTW89_H2C_SCANOFLD_BE_W9_SIZE_CFG) |
@@ -5994,24 +6288,29 @@ void rtw89_fw_send_all_early_h2c(struct rtw89_dev *rtwdev)
{
struct rtw89_early_h2c *early_h2c;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
list_for_each_entry(early_h2c, &rtwdev->early_h2c_list, list) {
rtw89_fw_h2c_raw(rtwdev, early_h2c->h2c, early_h2c->h2c_len);
}
}
-void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev)
+void __rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev)
{
struct rtw89_early_h2c *early_h2c, *tmp;
- mutex_lock(&rtwdev->mutex);
list_for_each_entry_safe(early_h2c, tmp, &rtwdev->early_h2c_list, list) {
list_del(&early_h2c->list);
kfree(early_h2c->h2c);
kfree(early_h2c);
}
- mutex_unlock(&rtwdev->mutex);
+}
+
+void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev)
+{
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
+ __rtw89_fw_free_all_early_h2c(rtwdev);
}
static void rtw89_fw_c2h_parse_attr(struct sk_buff *c2h)
@@ -6055,7 +6354,7 @@ void rtw89_fw_c2h_irqsafe(struct rtw89_dev *rtwdev, struct sk_buff *c2h)
enqueue:
skb_queue_tail(&rtwdev->c2h_queue, c2h);
- ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work);
+ wiphy_work_queue(rtwdev->hw->wiphy, &rtwdev->c2h_work);
}
static void rtw89_fw_c2h_cmd_handle(struct rtw89_dev *rtwdev,
@@ -6093,17 +6392,17 @@ static void rtw89_fw_c2h_cmd_handle(struct rtw89_dev *rtwdev,
rtw89_hex_dump(rtwdev, RTW89_DBG_FW, "C2H: ", skb->data, skb->len);
}
-void rtw89_fw_c2h_work(struct work_struct *work)
+void rtw89_fw_c2h_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
c2h_work);
struct sk_buff *skb, *tmp;
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
skb_queue_walk_safe(&rtwdev->c2h_queue, skb, tmp) {
skb_unlink(skb, &rtwdev->c2h_queue);
- mutex_lock(&rtwdev->mutex);
rtw89_fw_c2h_cmd_handle(rtwdev, skb);
- mutex_unlock(&rtwdev->mutex);
dev_kfree_skb_any(skb);
}
}
@@ -6184,7 +6483,7 @@ int rtw89_fw_msg_reg(struct rtw89_dev *rtwdev,
u32 ret;
if (h2c_info && h2c_info->id != RTW89_FWCMD_H2CREG_FUNC_GET_FEATURE)
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
if (!h2c_info && !c2h_info)
return -EINVAL;
diff --git a/drivers/net/wireless/realtek/rtw89/fw.h b/drivers/net/wireless/realtek/rtw89/fw.h
index 2026bc2fd2ac..55255b48bdb7 100644
--- a/drivers/net/wireless/realtek/rtw89/fw.h
+++ b/drivers/net/wireless/realtek/rtw89/fw.h
@@ -664,6 +664,11 @@ struct rtw89_fw_mss_pool_hdr {
union rtw89_fw_section_mssc_content {
struct {
+ u8 pad[0x20];
+ u8 bit_in_chip_list;
+ u8 ver;
+ } __packed blacklist;
+ struct {
u8 pad[58];
__le32 v;
} __packed sb_sel_ver;
@@ -673,6 +678,13 @@ union rtw89_fw_section_mssc_content {
} __packed key_sign_len;
} __packed;
+struct rtw89_fw_blacklist {
+ u8 ver;
+ u8 list[32];
+};
+
+extern const struct rtw89_fw_blacklist rtw89_fw_blacklist_default;
+
static inline void SET_CTRL_INFO_MACID(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 0, val, GENMASK(6, 0));
@@ -1579,25 +1591,17 @@ struct rtw89_h2c_bcn_upd_be {
#define RTW89_H2C_BCN_UPD_BE_W7_ECSA_OFST GENMASK(30, 16)
#define RTW89_H2C_BCN_UPD_BE_W7_PROTECTION_KEY_ID BIT(31)
-static inline void SET_FWROLE_MAINTAIN_MACID(void *h2c, u32 val)
-{
- le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
-}
-
-static inline void SET_FWROLE_MAINTAIN_SELF_ROLE(void *h2c, u32 val)
-{
- le32p_replace_bits((__le32 *)h2c, val, GENMASK(9, 8));
-}
-
-static inline void SET_FWROLE_MAINTAIN_UPD_MODE(void *h2c, u32 val)
-{
- le32p_replace_bits((__le32 *)h2c, val, GENMASK(12, 10));
-}
+struct rtw89_h2c_role_maintain {
+ __le32 w0;
+};
-static inline void SET_FWROLE_MAINTAIN_WIFI_ROLE(void *h2c, u32 val)
-{
- le32p_replace_bits((__le32 *)h2c, val, GENMASK(16, 13));
-}
+#define RTW89_H2C_ROLE_MAINTAIN_W0_MACID GENMASK(7, 0)
+#define RTW89_H2C_ROLE_MAINTAIN_W0_SELF_ROLE GENMASK(9, 8)
+#define RTW89_H2C_ROLE_MAINTAIN_W0_UPD_MODE GENMASK(12, 10)
+#define RTW89_H2C_ROLE_MAINTAIN_W0_WIFI_ROLE GENMASK(16, 13)
+#define RTW89_H2C_ROLE_MAINTAIN_W0_BAND GENMASK(18, 17)
+#define RTW89_H2C_ROLE_MAINTAIN_W0_PORT GENMASK(21, 19)
+#define RTW89_H2C_ROLE_MAINTAIN_W0_MACID_EXT GENMASK(31, 24)
enum rtw89_fw_sta_type { /* value of RTW89_H2C_JOININFO_W1_STA_TYPE */
RTW89_FW_N_AC_STA = 0,
@@ -1801,17 +1805,21 @@ struct rtw89_h2c_lps_ch_info {
struct rtw89_h2c_lps_ml_cmn_info {
u8 fmt_id;
- u8 rsvd0[3];
+ u8 rfe_type;
+ u8 rsvd0[2];
__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 central_ch[RTW89_PHY_NUM];
+ u8 pri_ch[RTW89_PHY_NUM];
+ u8 bw[RTW89_PHY_NUM];
+ u8 band[RTW89_PHY_NUM];
+ u8 bcn_rate_type[RTW89_PHY_NUM];
u8 rsvd1[2];
- __le16 tia_gain[RTW89_PHY_MAX][TIA_GAIN_NUM];
- u8 lna_gain[RTW89_PHY_MAX][LNA_GAIN_NUM];
+ __le16 tia_gain[RTW89_PHY_NUM][TIA_GAIN_NUM];
+ u8 lna_gain[RTW89_PHY_NUM][LNA_GAIN_NUM];
u8 rsvd2[2];
+ u8 tia_lna_op1db[RTW89_PHY_NUM][LNA_GAIN_NUM + 1];
+ u8 lna_op1db[RTW89_PHY_NUM][LNA_GAIN_NUM];
+ u8 dup_bcn_ofst[RTW89_PHY_NUM];
} __packed;
static inline void RTW89_SET_FWCMD_CPU_EXCEPTION_TYPE(void *cmd, u32 val)
@@ -3882,6 +3890,7 @@ enum rtw89_fw_element_id {
RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU = 17,
RTW89_FW_ELEMENT_ID_TXPWR_TRK = 18,
RTW89_FW_ELEMENT_ID_RFKLOG_FMT = 19,
+ RTW89_FW_ELEMENT_ID_REGD = 20,
RTW89_FW_ELEMENT_ID_NUM,
};
@@ -3925,6 +3934,15 @@ struct __rtw89_fw_txpwr_element {
u8 content[];
} __packed;
+struct __rtw89_fw_regd_element {
+ u8 rsvd0;
+ u8 rsvd1;
+ u8 rsvd2;
+ u8 ent_sz;
+ __le32 num_ents;
+ u8 content[];
+} __packed;
+
enum rtw89_fw_txpwr_trk_type {
__RTW89_FW_TXPWR_TRK_TYPE_6GHZ_START = 0,
RTW89_FW_TXPWR_TRK_TYPE_6GB_N = 0,
@@ -4016,6 +4034,7 @@ struct rtw89_fw_element_hdr {
__le16 offset[];
} __packed rfk_log_fmt;
struct __rtw89_fw_txpwr_element txpwr;
+ struct __rtw89_fw_regd_element regd;
} __packed u;
} __packed;
@@ -4524,6 +4543,12 @@ struct rtw89_c2h_rfk_report {
u8 version;
} __packed;
+struct rtw89_c2h_rf_tas_info {
+ struct rtw89_c2h_hdr hdr;
+ __le32 cur_idx;
+ __le16 txpwr_history[20];
+} __packed;
+
#define RTW89_FW_RSVD_PLE_SIZE 0x800
#define RTW89_FW_BACKTRACE_INFO_SIZE 8
@@ -4573,6 +4598,8 @@ int rtw89_fw_h2c_ampdu_cmac_tbl_g7(struct rtw89_dev *rtwdev,
struct rtw89_sta_link *rtwsta_link);
int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
struct rtw89_sta_link *rtwsta_link);
+int rtw89_fw_h2c_txtime_cmac_tbl_g7(struct rtw89_dev *rtwdev,
+ struct rtw89_sta_link *rtwsta_link);
int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
struct rtw89_sta_link *rtwsta_link);
int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
@@ -4588,7 +4615,7 @@ int rtw89_fw_h2c_dctl_sec_cam_v2(struct rtw89_dev *rtwdev,
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);
+void rtw89_fw_c2h_work(struct wiphy *wiphy, struct wiphy_work *work);
int rtw89_fw_h2c_role_maintain(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link,
struct rtw89_sta_link *rtwsta_link,
@@ -4654,6 +4681,7 @@ int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev,
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);
void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev);
int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
u8 macid);
@@ -4854,6 +4882,15 @@ static inline int rtw89_chip_h2c_ampdu_cmac_tbl(struct rtw89_dev *rtwdev,
}
static inline
+int rtw89_chip_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
+ struct rtw89_sta_link *rtwsta_link)
+{
+ const struct rtw89_chip_info *chip = rtwdev->chip;
+
+ return chip->ops->h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
+}
+
+static inline
int rtw89_chip_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
bool valid, struct ieee80211_ampdu_params *params)
{
@@ -4874,6 +4911,18 @@ int rtw89_chip_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
return 0;
}
+/* Must consider compatibility; don't insert new in the mid.
+ * Fill each field's default value in rtw89_regd_entcpy().
+ */
+struct rtw89_fw_regd_entry {
+ u8 alpha2_0;
+ u8 alpha2_1;
+ u8 rule_2ghz;
+ u8 rule_5ghz;
+ u8 rule_6ghz;
+ __le32 fmap;
+} __packed;
+
/* must consider compatibility; don't insert new in the mid */
struct rtw89_fw_txpwr_byrate_entry {
u8 band;
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index a37c6d525d6f..b4841f948ec1 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -1495,6 +1495,21 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
#undef PWR_ACT
}
+int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev)
+{
+ int ret;
+
+ ret = rtw89_mac_power_switch(rtwdev, true);
+ if (ret) {
+ rtw89_mac_power_switch(rtwdev, false);
+ ret = rtw89_mac_power_switch(rtwdev, true);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
void rtw89_mac_pwr_off(struct rtw89_dev *rtwdev)
{
rtw89_mac_power_switch(rtwdev, false);
@@ -3996,14 +4011,6 @@ int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb)
{
int ret;
- ret = rtw89_mac_power_switch(rtwdev, true);
- if (ret) {
- rtw89_mac_power_switch(rtwdev, false);
- ret = rtw89_mac_power_switch(rtwdev, true);
- if (ret)
- return ret;
- }
-
rtw89_mac_ctrl_hci_dma_trx(rtwdev, true);
if (include_bb) {
@@ -4036,6 +4043,10 @@ int rtw89_mac_init(struct rtw89_dev *rtwdev)
bool include_bb = !!chip->bbmcu_nr;
int ret;
+ ret = rtw89_mac_pwr_on(rtwdev);
+ if (ret)
+ return ret;
+
ret = rtw89_mac_partial_init(rtwdev, include_bb);
if (ret)
goto fail;
@@ -4067,7 +4078,7 @@ int rtw89_mac_init(struct rtw89_dev *rtwdev)
return ret;
fail:
- rtw89_mac_power_switch(rtwdev, false);
+ rtw89_mac_pwr_off(rtwdev);
return ret;
}
@@ -4826,6 +4837,32 @@ void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev,
rtw89_write32_set(rtwdev, reg, mac->narrow_bw_ru_dis.mask);
}
+void rtw89_mac_set_he_tb(struct rtw89_dev *rtwdev,
+ struct rtw89_vif_link *rtwvif_link)
+{
+ struct ieee80211_bss_conf *bss_conf;
+ bool set;
+ u32 reg;
+
+ if (rtwdev->chip->chip_gen != RTW89_CHIP_BE)
+ return;
+
+ rcu_read_lock();
+
+ bss_conf = rtw89_vif_rcu_dereference_link(rtwvif_link, true);
+ set = bss_conf->he_support && !bss_conf->eht_support;
+
+ rcu_read_unlock();
+
+ reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CLIENT_OM_CTRL,
+ rtwvif_link->mac_idx);
+
+ if (set)
+ rtw89_write32_set(rtwdev, reg, B_BE_TRIG_DIS_EHTTB);
+ else
+ rtw89_write32_clr(rtwdev, reg, B_BE_TRIG_DIS_EHTTB);
+}
+
void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link)
{
rtw89_mac_port_cfg_func_sw(rtwdev, rtwvif_link);
@@ -6031,7 +6068,7 @@ int rtw89_mac_cfg_ctrl_path_v1(struct rtw89_dev *rtwdev, bool wl)
if (wl)
return 0;
- for (i = 0; i < RTW89_PHY_MAX; i++) {
+ for (i = 0; i < RTW89_PHY_NUM; i++) {
g[i].gnt_bt_sw_en = 1;
g[i].gnt_bt = 1;
g[i].gnt_wl_sw_en = 1;
@@ -6422,6 +6459,7 @@ __rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_
u32 tx_time)
{
#define MAC_AX_DFLT_TX_TIME 5280
+ const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
u8 mac_idx = rtwsta_link->rtwvif_link->mac_idx;
u32 max_tx_time = tx_time == 0 ? MAC_AX_DFLT_TX_TIME : tx_time;
u32 reg;
@@ -6429,7 +6467,7 @@ __rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_
if (rtwsta_link->cctl_tx_time) {
rtwsta_link->ampdu_max_time = (max_tx_time - 512) >> 9;
- ret = rtw89_fw_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
+ ret = rtw89_chip_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
} else {
ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL);
if (ret) {
@@ -6437,8 +6475,8 @@ __rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_
return ret;
}
- reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_AMPDU_AGG_LIMIT, mac_idx);
- rtw89_write32_mask(rtwdev, reg, B_AX_AMPDU_MAX_TIME_MASK,
+ reg = rtw89_mac_reg_by_idx(rtwdev, mac->agg_limit.addr, mac_idx);
+ rtw89_write32_mask(rtwdev, reg, mac->agg_limit.mask,
max_tx_time >> 5);
}
@@ -6464,6 +6502,7 @@ int rtw89_mac_set_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwst
int rtw89_mac_get_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_link,
u32 *tx_time)
{
+ const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
u8 mac_idx = rtwsta_link->rtwvif_link->mac_idx;
u32 reg;
int ret = 0;
@@ -6477,8 +6516,8 @@ int rtw89_mac_get_tx_time(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwst
return ret;
}
- reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_AMPDU_AGG_LIMIT, mac_idx);
- *tx_time = rtw89_read32_mask(rtwdev, reg, B_AX_AMPDU_MAX_TIME_MASK) << 5;
+ reg = rtw89_mac_reg_by_idx(rtwdev, mac->agg_limit.addr, mac_idx);
+ *tx_time = rtw89_read32_mask(rtwdev, reg, mac->agg_limit.mask) << 5;
}
return ret;
@@ -6494,9 +6533,9 @@ int rtw89_mac_set_tx_retry_limit(struct rtw89_dev *rtwdev,
if (!resume) {
rtwsta_link->cctl_tx_retry_limit = true;
- ret = rtw89_fw_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
+ ret = rtw89_chip_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
} else {
- ret = rtw89_fw_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
+ ret = rtw89_chip_h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
rtwsta_link->cctl_tx_retry_limit = false;
}
@@ -6506,6 +6545,7 @@ int rtw89_mac_set_tx_retry_limit(struct rtw89_dev *rtwdev,
int rtw89_mac_get_tx_retry_limit(struct rtw89_dev *rtwdev,
struct rtw89_sta_link *rtwsta_link, u8 *tx_retry)
{
+ const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
u8 mac_idx = rtwsta_link->rtwvif_link->mac_idx;
u32 reg;
int ret = 0;
@@ -6519,8 +6559,8 @@ int rtw89_mac_get_tx_retry_limit(struct rtw89_dev *rtwdev,
return ret;
}
- reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_TXCNT, mac_idx);
- *tx_retry = rtw89_read32_mask(rtwdev, reg, B_AX_L_TXCNT_LMT_MASK);
+ reg = rtw89_mac_reg_by_idx(rtwdev, mac->txcnt_limit.addr, mac_idx);
+ *tx_retry = rtw89_read32_mask(rtwdev, reg, mac->txcnt_limit.mask);
}
return ret;
@@ -6798,6 +6838,8 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
.mask = B_AX_RXTRIG_RU26_DIS,
},
.wow_ctrl = {.addr = R_AX_WOW_CTRL, .mask = B_AX_WOW_WOWEN,},
+ .agg_limit = {.addr = R_AX_AMPDU_AGG_LIMIT, .mask = B_AX_AMPDU_MAX_TIME_MASK,},
+ .txcnt_limit = {.addr = R_AX_TXCNT, .mask = B_AX_L_TXCNT_LMT_MASK,},
.check_mac_en = rtw89_mac_check_mac_en_ax,
.sys_init = sys_init_ax,
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
index 8edea96d037f..fd7935d24501 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.h
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
@@ -964,6 +964,8 @@ struct rtw89_mac_gen_def {
struct rtw89_reg_def bfee_ctrl;
struct rtw89_reg_def narrow_bw_ru_dis;
struct rtw89_reg_def wow_ctrl;
+ struct rtw89_reg_def agg_limit;
+ struct rtw89_reg_def txcnt_limit;
int (*check_mac_en)(struct rtw89_dev *rtwdev, u8 band,
enum rtw89_mac_hwmod_sel sel);
@@ -1145,6 +1147,7 @@ rtw89_write32_port_set(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_l
rtw89_write32_set(rtwdev, reg, bit);
}
+int rtw89_mac_pwr_on(struct rtw89_dev *rtwdev);
void rtw89_mac_pwr_off(struct rtw89_dev *rtwdev);
int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb);
int rtw89_mac_init(struct rtw89_dev *rtwdev);
@@ -1185,6 +1188,8 @@ void rtw89_mac_port_cfg_rx_sync(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link, bool en);
void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link);
+void rtw89_mac_set_he_tb(struct rtw89_dev *rtwdev,
+ 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_link *vif);
diff --git a/drivers/net/wireless/realtek/rtw89/mac80211.c b/drivers/net/wireless/realtek/rtw89/mac80211.c
index b3669e0074df..4fded07d0bee 100644
--- a/drivers/net/wireless/realtek/rtw89/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw89/mac80211.c
@@ -57,32 +57,30 @@ static void rtw89_ops_wake_tx_queue(struct ieee80211_hw *hw,
static int rtw89_ops_start(struct ieee80211_hw *hw)
{
struct rtw89_dev *rtwdev = hw->priv;
- int ret;
- mutex_lock(&rtwdev->mutex);
- ret = rtw89_core_start(rtwdev);
- mutex_unlock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
- return ret;
+ return rtw89_core_start(rtwdev);
}
static void rtw89_ops_stop(struct ieee80211_hw *hw, bool suspend)
{
struct rtw89_dev *rtwdev = hw->priv;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_core_stop(rtwdev);
- mutex_unlock(&rtwdev->mutex);
}
static int rtw89_ops_config(struct ieee80211_hw *hw, u32 changed)
{
struct rtw89_dev *rtwdev = hw->priv;
+ lockdep_assert_wiphy(hw->wiphy);
+
/* let previous ips work finish to ensure we don't leave ips twice */
- cancel_work_sync(&rtwdev->ips_work);
+ wiphy_work_cancel(hw->wiphy, &rtwdev->ips_work);
- mutex_lock(&rtwdev->mutex);
rtw89_leave_ps_mode(rtwdev);
if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
@@ -100,8 +98,6 @@ static int rtw89_ops_config(struct ieee80211_hw *hw, u32 changed)
!rtwdev->scanning)
rtw89_enter_ips(rtwdev);
- mutex_unlock(&rtwdev->mutex);
-
return 0;
}
@@ -115,7 +111,7 @@ static int __rtw89_ops_add_iface_link(struct rtw89_dev *rtwdev,
rtw89_vif_type_mapping(rtwvif_link, false);
- INIT_WORK(&rtwvif_link->update_beacon_work, rtw89_core_update_beacon_work);
+ wiphy_work_init(&rtwvif_link->update_beacon_work, rtw89_core_update_beacon_work);
INIT_LIST_HEAD(&rtwvif_link->general_pkt_list);
rtwvif_link->hit_rule = 0;
@@ -142,9 +138,9 @@ static int __rtw89_ops_add_iface_link(struct rtw89_dev *rtwdev,
static void __rtw89_ops_remove_iface_link(struct rtw89_dev *rtwdev,
struct rtw89_vif_link *rtwvif_link)
{
- mutex_unlock(&rtwdev->mutex);
- cancel_work_sync(&rtwvif_link->update_beacon_work);
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
+ wiphy_work_cancel(rtwdev->hw->wiphy, &rtwvif_link->update_beacon_work);
rtw89_leave_ps_mode(rtwdev);
@@ -162,11 +158,11 @@ static int rtw89_ops_add_interface(struct ieee80211_hw *hw,
u8 mac_id, port;
int ret = 0;
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_debug(rtwdev, RTW89_DBG_STATE, "add vif %pM type %d, p2p %d\n",
vif->addr, vif->type, vif->p2p);
- mutex_lock(&rtwdev->mutex);
-
rtw89_leave_ips_by_hwflags(rtwdev);
if (RTW89_CHK_FW_FEATURE(BEACON_FILTER, &rtwdev->fw))
@@ -174,10 +170,8 @@ static int rtw89_ops_add_interface(struct ieee80211_hw *hw,
IEEE80211_VIF_SUPPORTS_CQM_RSSI;
mac_id = rtw89_acquire_mac_id(rtwdev);
- if (mac_id == RTW89_MAX_MAC_ID_NUM) {
- ret = -ENOSPC;
- goto err;
- }
+ if (mac_id == RTW89_MAX_MAC_ID_NUM)
+ return -ENOSPC;
port = rtw89_core_acquire_bit_map(rtwdev->hw_port, RTW89_PORT_NUM);
if (port == RTW89_PORT_NUM) {
@@ -198,7 +192,7 @@ static int rtw89_ops_add_interface(struct ieee80211_hw *hw,
rtwvif->offchan = false;
rtwvif->roc.state = RTW89_ROC_IDLE;
- INIT_DELAYED_WORK(&rtwvif->roc.roc_work, rtw89_roc_work);
+ wiphy_delayed_work_init(&rtwvif->roc.roc_work, rtw89_roc_work);
rtw89_traffic_stats_init(rtwdev, &rtwvif->stats);
@@ -213,8 +207,6 @@ static int rtw89_ops_add_interface(struct ieee80211_hw *hw,
goto unset_link;
rtw89_recalc_lps(rtwdev);
-
- mutex_unlock(&rtwdev->mutex);
return 0;
unset_link:
@@ -224,8 +216,6 @@ release_port:
rtw89_core_release_bit_map(rtwdev->hw_port, port);
release_macid:
rtw89_release_mac_id(rtwdev, mac_id);
-err:
- mutex_unlock(&rtwdev->mutex);
return ret;
}
@@ -239,12 +229,12 @@ static void rtw89_ops_remove_interface(struct ieee80211_hw *hw,
u8 port = rtw89_vif_get_main_port(rtwvif);
struct rtw89_vif_link *rtwvif_link;
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_debug(rtwdev, RTW89_DBG_STATE, "remove vif %pM type %d p2p %d\n",
vif->addr, vif->type, vif->p2p);
- cancel_delayed_work_sync(&rtwvif->roc.roc_work);
-
- mutex_lock(&rtwdev->mutex);
+ wiphy_delayed_work_cancel(hw->wiphy, &rtwvif->roc.roc_work);
rtwvif_link = rtwvif->links[RTW89_VIF_IDLE_LINK_ID];
if (unlikely(!rtwvif_link)) {
@@ -265,8 +255,6 @@ bottom:
rtw89_recalc_lps(rtwdev);
rtw89_enter_ips_by_hwflags(rtwdev);
-
- mutex_unlock(&rtwdev->mutex);
}
static int rtw89_ops_change_interface(struct ieee80211_hw *hw,
@@ -304,7 +292,8 @@ static void rtw89_ops_configure_filter(struct ieee80211_hw *hw,
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
u32 rx_fltr;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_leave_ps_mode(rtwdev);
*new_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_FCSFAIL |
@@ -367,14 +356,11 @@ static void rtw89_ops_configure_filter(struct ieee80211_hw *hw,
B_AX_RX_FLTR_CFG_MASK,
rx_fltr);
if (!rtwdev->dbcc_en)
- goto out;
+ return;
rtw89_write32_mask(rtwdev,
rtw89_mac_reg_by_idx(rtwdev, mac->rx_fltr, RTW89_MAC_1),
B_AX_RX_FLTR_CFG_MASK,
rx_fltr);
-
-out:
- mutex_unlock(&rtwdev->mutex);
}
static const u8 ac_to_fw_idx[IEEE80211_NUM_ACS] = {
@@ -670,6 +656,7 @@ static void __rtw89_ops_bss_link_assoc(struct rtw89_dev *rtwdev,
rtw89_chip_cfg_txpwr_ul_tb_offset(rtwdev, rtwvif_link);
rtw89_mac_port_update(rtwdev, rtwvif_link);
rtw89_mac_set_he_obss_narrow_bw_ru(rtwdev, rtwvif_link);
+ rtw89_mac_set_he_tb(rtwdev, rtwvif_link);
}
static void __rtw89_ops_bss_assoc(struct rtw89_dev *rtwdev,
@@ -689,7 +676,8 @@ static void rtw89_ops_vif_cfg_changed(struct ieee80211_hw *hw,
struct rtw89_dev *rtwdev = hw->priv;
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_leave_ps_mode(rtwdev);
if (changed & BSS_CHANGED_ASSOC) {
@@ -712,8 +700,6 @@ static void rtw89_ops_vif_cfg_changed(struct ieee80211_hw *hw,
if (changed & BSS_CHANGED_ARP_FILTER)
rtwvif->ip_addr = vif->cfg.arp_addr_list[0];
-
- mutex_unlock(&rtwdev->mutex);
}
static void rtw89_ops_link_info_changed(struct ieee80211_hw *hw,
@@ -725,7 +711,8 @@ static void rtw89_ops_link_info_changed(struct ieee80211_hw *hw,
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
struct rtw89_vif_link *rtwvif_link;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_leave_ps_mode(rtwdev);
rtwvif_link = rtwvif->links[conf->link_id];
@@ -733,7 +720,7 @@ static void rtw89_ops_link_info_changed(struct ieee80211_hw *hw,
rtw89_err(rtwdev,
"%s: rtwvif link (link_id %u) is not active\n",
__func__, conf->link_id);
- goto out;
+ return;
}
if (changed & BSS_CHANGED_BSSID) {
@@ -763,9 +750,6 @@ static void rtw89_ops_link_info_changed(struct ieee80211_hw *hw,
if (changed & BSS_CHANGED_TPE)
rtw89_reg_6ghz_recalc(rtwdev, rtwvif_link, true);
-
-out:
- mutex_unlock(&rtwdev->mutex);
}
static int rtw89_ops_start_ap(struct ieee80211_hw *hw,
@@ -778,22 +762,19 @@ static int rtw89_ops_start_ap(struct ieee80211_hw *hw,
const struct rtw89_chan *chan;
int ret = 0;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
rtwvif_link = rtwvif->links[link_conf->link_id];
if (unlikely(!rtwvif_link)) {
rtw89_err(rtwdev,
"%s: rtwvif link (link_id %u) is not active\n",
__func__, link_conf->link_id);
- ret = -ENOLINK;
- goto out;
+ return -ENOLINK;
}
chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx);
- if (chan->band_type == RTW89_BAND_6G) {
- mutex_unlock(&rtwdev->mutex);
+ if (chan->band_type == RTW89_BAND_6G)
return -EOPNOTSUPP;
- }
if (rtwdev->scanning)
rtw89_hw_scan_abort(rtwdev, rtwdev->scan_info.scanning_vif);
@@ -810,15 +791,12 @@ static int rtw89_ops_start_ap(struct ieee80211_hw *hw,
if (RTW89_CHK_FW_FEATURE(NOTIFY_AP_INFO, &rtwdev->fw)) {
ret = rtw89_fw_h2c_ap_info_refcount(rtwdev, true);
if (ret)
- goto out;
+ return ret;
}
rtw89_queue_chanctx_work(rtwdev);
-out:
- mutex_unlock(&rtwdev->mutex);
-
- return ret;
+ return 0;
}
static
@@ -829,14 +807,14 @@ void rtw89_ops_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
struct rtw89_vif_link *rtwvif_link;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
rtwvif_link = rtwvif->links[link_conf->link_id];
if (unlikely(!rtwvif_link)) {
rtw89_err(rtwdev,
"%s: rtwvif link (link_id %u) is not active\n",
__func__, link_conf->link_id);
- goto out;
+ return;
}
if (RTW89_CHK_FW_FEATURE(NOTIFY_AP_INFO, &rtwdev->fw))
@@ -845,22 +823,18 @@ void rtw89_ops_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
rtw89_mac_stop_ap(rtwdev, rtwvif_link);
rtw89_chip_h2c_assoc_cmac_tbl(rtwdev, rtwvif_link, NULL);
rtw89_fw_h2c_join_info(rtwdev, rtwvif_link, NULL, true);
-
-out:
- mutex_unlock(&rtwdev->mutex);
}
static int rtw89_ops_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
bool set)
{
- struct rtw89_dev *rtwdev = hw->priv;
struct rtw89_sta *rtwsta = sta_to_rtwsta(sta);
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
struct rtw89_vif_link *rtwvif_link;
unsigned int link_id;
rtw89_vif_for_each_link(rtwvif, rtwvif_link, link_id)
- ieee80211_queue_work(rtwdev->hw, &rtwvif_link->update_beacon_work);
+ wiphy_work_queue(hw->wiphy, &rtwvif_link->update_beacon_work);
return 0;
}
@@ -873,9 +847,9 @@ static int rtw89_ops_conf_tx(struct ieee80211_hw *hw,
struct rtw89_dev *rtwdev = hw->priv;
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
struct rtw89_vif_link *rtwvif_link;
- int ret = 0;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_leave_ps_mode(rtwdev);
rtwvif_link = rtwvif->links[link_id];
@@ -883,17 +857,13 @@ static int rtw89_ops_conf_tx(struct ieee80211_hw *hw,
rtw89_err(rtwdev,
"%s: rtwvif link (link_id %u) is not active\n",
__func__, link_id);
- ret = -ENOLINK;
- goto out;
+ return -ENOLINK;
}
rtwvif_link->tx_params[ac] = *params;
__rtw89_conf_tx(rtwdev, rtwvif_link, ac);
-out:
- mutex_unlock(&rtwdev->mutex);
-
- return ret;
+ return 0;
}
static int __rtw89_ops_sta_state(struct ieee80211_hw *hw,
@@ -937,14 +907,11 @@ static int rtw89_ops_sta_state(struct ieee80211_hw *hw,
enum ieee80211_sta_state new_state)
{
struct rtw89_dev *rtwdev = hw->priv;
- int ret;
- mutex_lock(&rtwdev->mutex);
- rtw89_leave_ps_mode(rtwdev);
- ret = __rtw89_ops_sta_state(hw, vif, sta, old_state, new_state);
- mutex_unlock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
- return ret;
+ rtw89_leave_ps_mode(rtwdev);
+ return __rtw89_ops_sta_state(hw, vif, sta, old_state, new_state);
}
static int rtw89_ops_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
@@ -953,9 +920,10 @@ static int rtw89_ops_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
struct ieee80211_key_conf *key)
{
struct rtw89_dev *rtwdev = hw->priv;
- int ret = 0;
+ int ret;
+
+ lockdep_assert_wiphy(hw->wiphy);
- mutex_lock(&rtwdev->mutex);
rtw89_leave_ps_mode(rtwdev);
switch (cmd) {
@@ -964,7 +932,7 @@ static int rtw89_ops_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
ret = rtw89_cam_sec_key_add(rtwdev, vif, sta, key);
if (ret && ret != -EOPNOTSUPP) {
rtw89_err(rtwdev, "failed to add key to sec cam\n");
- goto out;
+ return ret;
}
break;
case DISABLE_KEY:
@@ -974,14 +942,11 @@ static int rtw89_ops_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
ret = rtw89_cam_sec_key_del(rtwdev, vif, sta, key, true);
if (ret) {
rtw89_err(rtwdev, "failed to remove key from sec cam\n");
- goto out;
+ return ret;
}
break;
}
-out:
- mutex_unlock(&rtwdev->mutex);
-
return ret;
}
@@ -997,38 +962,32 @@ static int rtw89_ops_ampdu_action(struct ieee80211_hw *hw,
struct ieee80211_txq *txq = sta->txq[tid];
struct rtw89_txq *rtwtxq = (struct rtw89_txq *)txq->drv_priv;
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
switch (params->action) {
case IEEE80211_AMPDU_TX_START:
return IEEE80211_AMPDU_TX_START_IMMEDIATE;
case IEEE80211_AMPDU_TX_STOP_CONT:
case IEEE80211_AMPDU_TX_STOP_FLUSH:
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
- mutex_lock(&rtwdev->mutex);
clear_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags);
clear_bit(tid, rtwsta->ampdu_map);
rtw89_chip_h2c_ampdu_cmac_tbl(rtwdev, rtwvif, rtwsta);
- mutex_unlock(&rtwdev->mutex);
ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
break;
case IEEE80211_AMPDU_TX_OPERATIONAL:
- mutex_lock(&rtwdev->mutex);
set_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags);
rtwsta->ampdu_params[tid].agg_num = params->buf_size;
rtwsta->ampdu_params[tid].amsdu = params->amsdu;
set_bit(tid, rtwsta->ampdu_map);
rtw89_leave_ps_mode(rtwdev);
rtw89_chip_h2c_ampdu_cmac_tbl(rtwdev, rtwvif, rtwsta);
- mutex_unlock(&rtwdev->mutex);
break;
case IEEE80211_AMPDU_RX_START:
- mutex_lock(&rtwdev->mutex);
rtw89_chip_h2c_ba_cam(rtwdev, rtwsta, true, params);
- mutex_unlock(&rtwdev->mutex);
break;
case IEEE80211_AMPDU_RX_STOP:
- mutex_lock(&rtwdev->mutex);
rtw89_chip_h2c_ba_cam(rtwdev, rtwsta, false, params);
- mutex_unlock(&rtwdev->mutex);
break;
default:
WARN_ON(1);
@@ -1042,11 +1001,11 @@ static int rtw89_ops_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
{
struct rtw89_dev *rtwdev = hw->priv;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_leave_ps_mode(rtwdev);
if (test_bit(RTW89_FLAG_POWERON, rtwdev->flags))
rtw89_mac_update_rts_threshold(rtwdev);
- mutex_unlock(&rtwdev->mutex);
return 0;
}
@@ -1086,7 +1045,8 @@ static void rtw89_ops_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
{
struct rtw89_dev *rtwdev = hw->priv;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_leave_lps(rtwdev);
rtw89_hci_flush_queues(rtwdev, queues, drop);
@@ -1094,8 +1054,6 @@ static void rtw89_ops_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
__rtw89_drop_packets(rtwdev, vif);
else
rtw89_mac_flush_txq(rtwdev, queues, drop);
-
- mutex_unlock(&rtwdev->mutex);
}
struct rtw89_iter_bitrate_mask_data {
@@ -1142,10 +1100,10 @@ static int rtw89_ops_set_bitrate_mask(struct ieee80211_hw *hw,
{
struct rtw89_dev *rtwdev = hw->priv;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_phy_rate_pattern_vif(rtwdev, vif, mask);
rtw89_ra_mask_info_update(rtwdev, vif, mask);
- mutex_unlock(&rtwdev->mutex);
return 0;
}
@@ -1156,6 +1114,8 @@ int rtw89_ops_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
struct rtw89_dev *rtwdev = hw->priv;
struct rtw89_hal *hal = &rtwdev->hal;
+ lockdep_assert_wiphy(hw->wiphy);
+
if (hal->ant_diversity) {
if (tx_ant != rx_ant || hweight32(tx_ant) != 1)
return -EINVAL;
@@ -1163,12 +1123,10 @@ int rtw89_ops_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
return -EINVAL;
}
- mutex_lock(&rtwdev->mutex);
hal->antenna_tx = tx_ant;
hal->antenna_rx = rx_ant;
hal->tx_path_diversity = false;
hal->ant_diversity_fixed = true;
- mutex_unlock(&rtwdev->mutex);
return 0;
}
@@ -1193,18 +1151,15 @@ static void rtw89_ops_sw_scan_start(struct ieee80211_hw *hw,
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
struct rtw89_vif_link *rtwvif_link;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
rtwvif_link = rtw89_vif_get_link_inst(rtwvif, 0);
if (unlikely(!rtwvif_link)) {
rtw89_err(rtwdev, "sw scan start: find no link on HW-0\n");
- goto out;
+ return;
}
rtw89_core_scan_start(rtwdev, rtwvif_link, mac_addr, false);
-
-out:
- mutex_unlock(&rtwdev->mutex);
}
static void rtw89_ops_sw_scan_complete(struct ieee80211_hw *hw,
@@ -1214,18 +1169,15 @@ static void rtw89_ops_sw_scan_complete(struct ieee80211_hw *hw,
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
struct rtw89_vif_link *rtwvif_link;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
rtwvif_link = rtw89_vif_get_link_inst(rtwvif, 0);
if (unlikely(!rtwvif_link)) {
rtw89_err(rtwdev, "sw scan complete: find no link on HW-0\n");
- goto out;
+ return;
}
rtw89_core_scan_complete(rtwdev, rtwvif_link, false);
-
-out:
- mutex_unlock(&rtwdev->mutex);
}
static void rtw89_ops_reconfig_complete(struct ieee80211_hw *hw,
@@ -1245,21 +1197,18 @@ static int rtw89_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct rtw89_vif_link *rtwvif_link;
int ret;
+ lockdep_assert_wiphy(hw->wiphy);
+
if (!RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw))
return 1;
- mutex_lock(&rtwdev->mutex);
-
- if (rtwdev->scanning || rtwvif->offchan) {
- ret = -EBUSY;
- goto out;
- }
+ if (rtwdev->scanning || rtwvif->offchan)
+ return -EBUSY;
rtwvif_link = rtw89_vif_get_link_inst(rtwvif, 0);
if (unlikely(!rtwvif_link)) {
rtw89_err(rtwdev, "hw scan: find no link on HW-0\n");
- ret = -ENOLINK;
- goto out;
+ return -ENOLINK;
}
rtw89_hw_scan_start(rtwdev, rtwvif_link, req);
@@ -1269,9 +1218,6 @@ static int rtw89_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
rtw89_err(rtwdev, "HW scan failed with status: %d\n", ret);
}
-out:
- mutex_unlock(&rtwdev->mutex);
-
return ret;
}
@@ -1282,24 +1228,21 @@ static void rtw89_ops_cancel_hw_scan(struct ieee80211_hw *hw,
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
struct rtw89_vif_link *rtwvif_link;
+ lockdep_assert_wiphy(hw->wiphy);
+
if (!RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD, &rtwdev->fw))
return;
- mutex_lock(&rtwdev->mutex);
-
if (!rtwdev->scanning)
- goto out;
+ return;
rtwvif_link = rtw89_vif_get_link_inst(rtwvif, 0);
if (unlikely(!rtwvif_link)) {
rtw89_err(rtwdev, "cancel hw scan: find no link on HW-0\n");
- goto out;
+ return;
}
rtw89_hw_scan_abort(rtwdev, rtwvif_link);
-
-out:
- mutex_unlock(&rtwdev->mutex);
}
static void rtw89_ops_sta_rc_update(struct ieee80211_hw *hw,
@@ -1322,13 +1265,10 @@ static int rtw89_ops_add_chanctx(struct ieee80211_hw *hw,
struct ieee80211_chanctx_conf *ctx)
{
struct rtw89_dev *rtwdev = hw->priv;
- int ret;
- mutex_lock(&rtwdev->mutex);
- ret = rtw89_chanctx_ops_add(rtwdev, ctx);
- mutex_unlock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
- return ret;
+ return rtw89_chanctx_ops_add(rtwdev, ctx);
}
static void rtw89_ops_remove_chanctx(struct ieee80211_hw *hw,
@@ -1336,9 +1276,9 @@ static void rtw89_ops_remove_chanctx(struct ieee80211_hw *hw,
{
struct rtw89_dev *rtwdev = hw->priv;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_chanctx_ops_remove(rtwdev, ctx);
- mutex_unlock(&rtwdev->mutex);
}
static void rtw89_ops_change_chanctx(struct ieee80211_hw *hw,
@@ -1347,9 +1287,9 @@ static void rtw89_ops_change_chanctx(struct ieee80211_hw *hw,
{
struct rtw89_dev *rtwdev = hw->priv;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
rtw89_chanctx_ops_change(rtwdev, ctx, changed);
- mutex_unlock(&rtwdev->mutex);
}
static int rtw89_ops_assign_vif_chanctx(struct ieee80211_hw *hw,
@@ -1360,25 +1300,18 @@ static int rtw89_ops_assign_vif_chanctx(struct ieee80211_hw *hw,
struct rtw89_dev *rtwdev = hw->priv;
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
struct rtw89_vif_link *rtwvif_link;
- int ret;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
rtwvif_link = rtwvif->links[link_conf->link_id];
if (unlikely(!rtwvif_link)) {
rtw89_err(rtwdev,
"%s: rtwvif link (link_id %u) is not active\n",
__func__, link_conf->link_id);
- ret = -ENOLINK;
- goto out;
+ return -ENOLINK;
}
- ret = rtw89_chanctx_ops_assign_vif(rtwdev, rtwvif_link, ctx);
-
-out:
- mutex_unlock(&rtwdev->mutex);
-
- return ret;
+ return rtw89_chanctx_ops_assign_vif(rtwdev, rtwvif_link, ctx);
}
static void rtw89_ops_unassign_vif_chanctx(struct ieee80211_hw *hw,
@@ -1390,11 +1323,10 @@ static void rtw89_ops_unassign_vif_chanctx(struct ieee80211_hw *hw,
struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
struct rtw89_vif_link *rtwvif_link;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
rtwvif_link = rtwvif->links[link_conf->link_id];
if (unlikely(!rtwvif_link)) {
- mutex_unlock(&rtwdev->mutex);
rtw89_err(rtwdev,
"%s: rtwvif link (link_id %u) is not active\n",
__func__, link_conf->link_id);
@@ -1402,7 +1334,6 @@ static void rtw89_ops_unassign_vif_chanctx(struct ieee80211_hw *hw,
}
rtw89_chanctx_ops_unassign_vif(rtwdev, rtwvif_link, ctx);
- mutex_unlock(&rtwdev->mutex);
}
static int rtw89_ops_remain_on_channel(struct ieee80211_hw *hw,
@@ -1415,13 +1346,12 @@ static int rtw89_ops_remain_on_channel(struct ieee80211_hw *hw,
struct rtw89_vif *rtwvif = vif_to_rtwvif_safe(vif);
struct rtw89_roc *roc = &rtwvif->roc;
+ lockdep_assert_wiphy(hw->wiphy);
+
if (!rtwvif)
return -EINVAL;
- mutex_lock(&rtwdev->mutex);
-
if (roc->state != RTW89_ROC_IDLE) {
- mutex_unlock(&rtwdev->mutex);
return -EBUSY;
}
@@ -1439,8 +1369,6 @@ static int rtw89_ops_remain_on_channel(struct ieee80211_hw *hw,
rtw89_roc_start(rtwdev, rtwvif);
- mutex_unlock(&rtwdev->mutex);
-
return 0;
}
@@ -1450,14 +1378,14 @@ static int rtw89_ops_cancel_remain_on_channel(struct ieee80211_hw *hw,
struct rtw89_dev *rtwdev = hw->priv;
struct rtw89_vif *rtwvif = vif_to_rtwvif_safe(vif);
+ lockdep_assert_wiphy(hw->wiphy);
+
if (!rtwvif)
return -EINVAL;
- cancel_delayed_work_sync(&rtwvif->roc.roc_work);
+ wiphy_delayed_work_cancel(hw->wiphy, &rtwvif->roc.roc_work);
- mutex_lock(&rtwdev->mutex);
rtw89_roc_end(rtwdev, rtwvif);
- mutex_unlock(&rtwdev->mutex);
return 0;
}
@@ -1478,14 +1406,14 @@ static int rtw89_ops_set_tid_config(struct ieee80211_hw *hw,
{
struct rtw89_dev *rtwdev = hw->priv;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
if (sta)
rtw89_core_set_tid_config(rtwdev, sta, tid_config);
else
ieee80211_iterate_stations_atomic(rtwdev->hw,
rtw89_set_tid_config_iter,
tid_config);
- mutex_unlock(&rtwdev->mutex);
return 0;
}
@@ -1509,7 +1437,7 @@ static bool rtw89_ops_can_activate_links(struct ieee80211_hw *hw,
{
struct rtw89_dev *rtwdev = hw->priv;
- guard(mutex)(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
return rtw89_can_work_on_links(rtwdev, vif, active_links);
}
@@ -1571,7 +1499,7 @@ int rtw89_ops_change_vif_links(struct ieee80211_hw *hw,
int ret = 0;
int i;
- guard(mutex)(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
rtw89_debug(rtwdev, RTW89_DBG_STATE,
"%s: old_links (0x%08x) -> new_links (0x%08x)\n",
@@ -1720,7 +1648,7 @@ int rtw89_ops_change_sta_links(struct ieee80211_hw *hw,
unsigned long set_links = new_links & ~old_links;
int ret = 0;
- guard(mutex)(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
rtw89_debug(rtwdev, RTW89_DBG_STATE,
"%s: old_links (0x%08x) -> new_links (0x%08x)\n",
@@ -1750,13 +1678,12 @@ static int rtw89_ops_suspend(struct ieee80211_hw *hw,
struct rtw89_dev *rtwdev = hw->priv;
int ret;
+ lockdep_assert_wiphy(hw->wiphy);
+
set_bit(RTW89_FLAG_FORBIDDEN_TRACK_WROK, rtwdev->flags);
- cancel_delayed_work_sync(&rtwdev->track_work);
+ wiphy_delayed_work_cancel(hw->wiphy, &rtwdev->track_work);
- mutex_lock(&rtwdev->mutex);
ret = rtw89_wow_suspend(rtwdev, wowlan);
- mutex_unlock(&rtwdev->mutex);
-
if (ret) {
rtw89_warn(rtwdev, "failed to suspend for wow %d\n", ret);
clear_bit(RTW89_FLAG_FORBIDDEN_TRACK_WROK, rtwdev->flags);
@@ -1771,15 +1698,15 @@ static int rtw89_ops_resume(struct ieee80211_hw *hw)
struct rtw89_dev *rtwdev = hw->priv;
int ret;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
+
ret = rtw89_wow_resume(rtwdev);
if (ret)
rtw89_warn(rtwdev, "failed to resume for wow %d\n", ret);
- mutex_unlock(&rtwdev->mutex);
clear_bit(RTW89_FLAG_FORBIDDEN_TRACK_WROK, rtwdev->flags);
- ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->track_work,
- RTW89_TRACK_WORK_PERIOD);
+ wiphy_delayed_work_queue(hw->wiphy, &rtwdev->track_work,
+ RTW89_TRACK_WORK_PERIOD);
return ret ? 1 : 0;
}
@@ -1799,18 +1726,16 @@ static void rtw89_set_rekey_data(struct ieee80211_hw *hw,
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
struct rtw89_wow_gtk_info *gtk_info = &rtw_wow->gtk_info;
+ lockdep_assert_wiphy(hw->wiphy);
+
if (data->kek_len > sizeof(gtk_info->kek) ||
data->kck_len > sizeof(gtk_info->kck)) {
rtw89_warn(rtwdev, "kek or kck length over fw limit\n");
return;
}
- mutex_lock(&rtwdev->mutex);
-
memcpy(gtk_info->kek, data->kek, data->kek_len);
memcpy(gtk_info->kck, data->kck, data->kck_len);
-
- mutex_unlock(&rtwdev->mutex);
}
#endif
@@ -1818,16 +1743,13 @@ static void rtw89_ops_rfkill_poll(struct ieee80211_hw *hw)
{
struct rtw89_dev *rtwdev = hw->priv;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(hw->wiphy);
/* wl_disable GPIO get floating when entering LPS */
if (test_bit(RTW89_FLAG_RUNNING, rtwdev->flags))
- goto out;
+ return;
rtw89_core_rfkill_poll(rtwdev, false);
-
-out:
- mutex_unlock(&rtwdev->mutex);
}
const struct ieee80211_ops rtw89_ops = {
diff --git a/drivers/net/wireless/realtek/rtw89/mac_be.c b/drivers/net/wireless/realtek/rtw89/mac_be.c
index 2dbdeae904ad..99b82dc85ea3 100644
--- a/drivers/net/wireless/realtek/rtw89/mac_be.c
+++ b/drivers/net/wireless/realtek/rtw89/mac_be.c
@@ -708,8 +708,8 @@ static int sec_eng_init_be(struct rtw89_dev *rtwdev)
val32 |= B_BE_CLK_EN_CGCMP | B_BE_CLK_EN_WAPI | B_BE_CLK_EN_WEP_TKIP |
B_BE_SEC_TX_ENC | B_BE_SEC_RX_DEC |
B_BE_MC_DEC | B_BE_BC_DEC |
- B_BE_BMC_MGNT_DEC | B_BE_UC_MGNT_DEC;
- val32 &= ~B_BE_SEC_PRE_ENQUE_TX;
+ B_BE_BMC_MGNT_DEC | B_BE_UC_MGNT_DEC |
+ B_BE_SEC_PRE_ENQUE_TX;
rtw89_write32(rtwdev, R_BE_SEC_ENG_CTRL, val32);
rtw89_write32_set(rtwdev, R_BE_SEC_MPDU_PROC, B_BE_APPEND_ICV | B_BE_APPEND_MIC);
@@ -1865,7 +1865,7 @@ int rtw89_mac_cfg_ctrl_path_v2(struct rtw89_dev *rtwdev, bool wl)
if (wl)
return 0;
- for (i = 0; i < RTW89_PHY_MAX; i++) {
+ for (i = 0; i < RTW89_PHY_NUM; i++) {
g[i].gnt_bt_sw_en = 1;
g[i].gnt_bt = 1;
g[i].gnt_wl_sw_en = 1;
@@ -2585,6 +2585,8 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
.mask = B_BE_RXTRIG_RU26_DIS,
},
.wow_ctrl = {.addr = R_BE_WOW_CTRL, .mask = B_BE_WOW_WOWEN,},
+ .agg_limit = {.addr = R_BE_AMPDU_AGG_LIMIT, .mask = B_BE_AMPDU_MAX_TIME_MASK,},
+ .txcnt_limit = {.addr = R_BE_TXCNT, .mask = B_BE_L_TXCNT_LMT_MASK,},
.check_mac_en = rtw89_mac_check_mac_en_be,
.sys_init = sys_init_be,
diff --git a/drivers/net/wireless/realtek/rtw89/pci.h b/drivers/net/wireless/realtek/rtw89/pci.h
index 4d11c3dd60a5..79fef5f90140 100644
--- a/drivers/net/wireless/realtek/rtw89/pci.h
+++ b/drivers/net/wireless/realtek/rtw89/pci.h
@@ -455,34 +455,36 @@
#define B_BE_RX0DMA_INT_EN BIT(0)
#define R_BE_HAXI_HISR00 0xB0B4
-#define B_BE_RDU_CH6_INT BIT(28)
-#define B_BE_RDU_CH5_INT BIT(27)
-#define B_BE_RDU_CH4_INT BIT(26)
-#define B_BE_RDU_CH2_INT BIT(25)
-#define B_BE_RDU_CH1_INT BIT(24)
-#define B_BE_RDU_CH0_INT BIT(23)
-#define B_BE_RXDMA_STUCK_INT BIT(22)
-#define B_BE_TXDMA_STUCK_INT BIT(21)
-#define B_BE_TXDMA_CH14_INT BIT(20)
-#define B_BE_TXDMA_CH13_INT BIT(19)
-#define B_BE_TXDMA_CH12_INT BIT(18)
-#define B_BE_TXDMA_CH11_INT BIT(17)
-#define B_BE_TXDMA_CH10_INT BIT(16)
-#define B_BE_TXDMA_CH9_INT BIT(15)
-#define B_BE_TXDMA_CH8_INT BIT(14)
-#define B_BE_TXDMA_CH7_INT BIT(13)
-#define B_BE_TXDMA_CH6_INT BIT(12)
-#define B_BE_TXDMA_CH5_INT BIT(11)
-#define B_BE_TXDMA_CH4_INT BIT(10)
-#define B_BE_TXDMA_CH3_INT BIT(9)
-#define B_BE_TXDMA_CH2_INT BIT(8)
-#define B_BE_TXDMA_CH1_INT BIT(7)
-#define B_BE_TXDMA_CH0_INT BIT(6)
-#define B_BE_RPQ1DMA_INT BIT(5)
-#define B_BE_RX1P1DMA_INT BIT(4)
+#define B_BE_RDU_CH5_INT_V1 BIT(30)
+#define B_BE_RDU_CH4_INT_V1 BIT(29)
+#define B_BE_RDU_CH3_INT_V1 BIT(28)
+#define B_BE_RDU_CH2_INT_V1 BIT(27)
+#define B_BE_RDU_CH1_INT_V1 BIT(26)
+#define B_BE_RDU_CH0_INT_V1 BIT(25)
+#define B_BE_RXDMA_STUCK_INT_V1 BIT(24)
+#define B_BE_TXDMA_STUCK_INT_V1 BIT(23)
+#define B_BE_TXDMA_CH14_INT_V1 BIT(22)
+#define B_BE_TXDMA_CH13_INT_V1 BIT(21)
+#define B_BE_TXDMA_CH12_INT_V1 BIT(20)
+#define B_BE_TXDMA_CH11_INT_V1 BIT(19)
+#define B_BE_TXDMA_CH10_INT_V1 BIT(18)
+#define B_BE_TXDMA_CH9_INT_V1 BIT(17)
+#define B_BE_TXDMA_CH8_INT_V1 BIT(16)
+#define B_BE_TXDMA_CH7_INT_V1 BIT(15)
+#define B_BE_TXDMA_CH6_INT_V1 BIT(14)
+#define B_BE_TXDMA_CH5_INT_V1 BIT(13)
+#define B_BE_TXDMA_CH4_INT_V1 BIT(12)
+#define B_BE_TXDMA_CH3_INT_V1 BIT(11)
+#define B_BE_TXDMA_CH2_INT_V1 BIT(10)
+#define B_BE_TXDMA_CH1_INT_V1 BIT(9)
+#define B_BE_TXDMA_CH0_INT_V1 BIT(8)
+#define B_BE_RX1P1DMA_INT_V1 BIT(7)
+#define B_BE_RX0P1DMA_INT_V1 BIT(6)
+#define B_BE_RO1DMA_INT BIT(5)
+#define B_BE_RP1DMA_INT BIT(4)
#define B_BE_RX1DMA_INT BIT(3)
-#define B_BE_RPQ0DMA_INT BIT(2)
-#define B_BE_RX0P1DMA_INT BIT(1)
+#define B_BE_RO0DMA_INT BIT(2)
+#define B_BE_RP0DMA_INT BIT(1)
#define B_BE_RX0DMA_INT BIT(0)
/* TX/RX */
diff --git a/drivers/net/wireless/realtek/rtw89/pci_be.c b/drivers/net/wireless/realtek/rtw89/pci_be.c
index cd39eebe8186..12e6a0cbb889 100644
--- a/drivers/net/wireless/realtek/rtw89/pci_be.c
+++ b/drivers/net/wireless/realtek/rtw89/pci_be.c
@@ -666,7 +666,7 @@ SIMPLE_DEV_PM_OPS(rtw89_pm_ops_be, rtw89_pci_suspend_be, rtw89_pci_resume_be);
EXPORT_SYMBOL(rtw89_pm_ops_be);
const struct rtw89_pci_gen_def rtw89_pci_gen_be = {
- .isr_rdu = B_BE_RDU_CH1_INT | B_BE_RDU_CH0_INT,
+ .isr_rdu = B_BE_RDU_CH1_INT_V1 | B_BE_RDU_CH0_INT_V1,
.isr_halt_c2h = B_BE_HALT_C2H_INT,
.isr_wdt_timeout = B_BE_WDT_TIMEOUT_INT,
.isr_clear_rpq = {R_BE_PCIE_DMA_ISR, B_BE_PCIE_RX_RPQ0_ISR_V1},
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
index c7c05f7fda1d..f4eee642e5ce 100644
--- a/drivers/net/wireless/realtek/rtw89/phy.c
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
@@ -2044,12 +2044,15 @@ static s8 rtw89_phy_ant_gain_offset(struct rtw89_dev *rtwdev, u8 band, u32 cente
if (!chip->support_ant_gain)
return 0;
- if (!(ant_gain->regd_enabled & BIT(regd)))
+ if (ant_gain->block_country || !(ant_gain->regd_enabled & BIT(regd)))
return 0;
offset_patha = rtw89_phy_ant_gain_query(rtwdev, RF_PATH_A, center_freq);
offset_pathb = rtw89_phy_ant_gain_query(rtwdev, RF_PATH_B, center_freq);
+ if (RTW89_CHK_FW_FEATURE(NO_POWER_DIFFERENCE, &rtwdev->fw))
+ return min(offset_patha, offset_pathb);
+
return max(offset_patha, offset_pathb);
}
@@ -2057,10 +2060,17 @@ s16 rtw89_phy_ant_gain_pwr_offset(struct rtw89_dev *rtwdev,
const struct rtw89_chan *chan)
{
struct rtw89_ant_gain_info *ant_gain = &rtwdev->ant_gain;
+ const struct rtw89_chip_info *chip = rtwdev->chip;
u8 regd = rtw89_regd_get(rtwdev, chan->band_type);
s8 offset_patha, offset_pathb;
- if (!(ant_gain->regd_enabled & BIT(regd)))
+ if (!chip->support_ant_gain)
+ return 0;
+
+ if (ant_gain->block_country || !(ant_gain->regd_enabled & BIT(regd)))
+ return 0;
+
+ if (RTW89_CHK_FW_FEATURE(NO_POWER_DIFFERENCE, &rtwdev->fw))
return 0;
offset_patha = rtw89_phy_ant_gain_query(rtwdev, RF_PATH_A, chan->freq);
@@ -2070,24 +2080,29 @@ s16 rtw89_phy_ant_gain_pwr_offset(struct rtw89_dev *rtwdev,
}
EXPORT_SYMBOL(rtw89_phy_ant_gain_pwr_offset);
-void rtw89_print_ant_gain(struct seq_file *m, struct rtw89_dev *rtwdev,
- const struct rtw89_chan *chan)
+int rtw89_print_ant_gain(struct rtw89_dev *rtwdev, char *buf, size_t bufsz,
+ const struct rtw89_chan *chan)
{
struct rtw89_ant_gain_info *ant_gain = &rtwdev->ant_gain;
const struct rtw89_chip_info *chip = rtwdev->chip;
u8 regd = rtw89_regd_get(rtwdev, chan->band_type);
+ char *p = buf, *end = buf + bufsz;
s8 offset_patha, offset_pathb;
- if (!chip->support_ant_gain || !(ant_gain->regd_enabled & BIT(regd))) {
- seq_puts(m, "no DAG is applied\n");
- return;
+ if (!(chip->support_ant_gain && (ant_gain->regd_enabled & BIT(regd))) ||
+ ant_gain->block_country) {
+ p += scnprintf(p, end - p, "no DAG is applied\n");
+ goto out;
}
offset_patha = rtw89_phy_ant_gain_query(rtwdev, RF_PATH_A, chan->freq);
offset_pathb = rtw89_phy_ant_gain_query(rtwdev, RF_PATH_B, chan->freq);
- seq_printf(m, "ChainA offset: %d dBm\n", offset_patha);
- seq_printf(m, "ChainB offset: %d dBm\n", offset_pathb);
+ p += scnprintf(p, end - p, "ChainA offset: %d dBm\n", offset_patha);
+ p += scnprintf(p, end - p, "ChainB offset: %d dBm\n", offset_pathb);
+
+out:
+ return p - buf;
}
static const u8 rtw89_rs_idx_num_ax[] = {
@@ -3455,6 +3470,30 @@ rtw89_phy_c2h_rfk_report_state(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u3
static void
rtw89_phy_c2h_rfk_log_tas_pwr(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len)
{
+ const struct rtw89_c2h_rf_tas_info *rf_tas =
+ (const struct rtw89_c2h_rf_tas_info *)c2h->data;
+ const enum rtw89_sar_sources src = rtwdev->sar.src;
+ struct rtw89_tas_info *tas = &rtwdev->tas;
+ u64 linear = 0;
+ u32 i, cur_idx;
+ s16 txpwr;
+
+ if (!tas->enable || src == RTW89_SAR_SOURCE_NONE)
+ return;
+
+ cur_idx = le32_to_cpu(rf_tas->cur_idx);
+ for (i = 0; i < cur_idx; i++) {
+ txpwr = (s16)le16_to_cpu(rf_tas->txpwr_history[i]);
+ linear += rtw89_db_quarter_to_linear(txpwr);
+
+ rtw89_debug(rtwdev, RTW89_DBG_SAR,
+ "tas: index: %u, txpwr: %d\n", i, txpwr);
+ }
+
+ if (cur_idx == 0)
+ tas->instant_txpwr = rtw89_db_to_linear(0);
+ else
+ tas->instant_txpwr = DIV_ROUND_DOWN_ULL(linear, cur_idx);
}
static
@@ -4600,7 +4639,7 @@ static void rtw89_phy_cfo_dm(struct rtw89_dev *rtwdev)
cfo->dcfo_avg = 0;
rtw89_debug(rtwdev, RTW89_DBG_CFO, "CFO:total_sta_assoc=%d\n",
rtwdev->total_sta_assoc);
- if (rtwdev->total_sta_assoc == 0) {
+ if (rtwdev->total_sta_assoc == 0 || rtw89_is_mlo_1_1(rtwdev)) {
rtw89_phy_cfo_reset(rtwdev);
return;
}
@@ -4651,29 +4690,28 @@ static void rtw89_phy_cfo_dm(struct rtw89_dev *rtwdev)
rtw89_phy_cfo_statistics_reset(rtwdev);
}
-void rtw89_phy_cfo_track_work(struct work_struct *work)
+void rtw89_phy_cfo_track_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
cfo_track_work.work);
struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
+
if (!cfo->cfo_trig_by_timer_en)
- goto out;
+ return;
rtw89_leave_ps_mode(rtwdev);
rtw89_phy_cfo_dm(rtwdev);
- ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->cfo_track_work,
- msecs_to_jiffies(cfo->cfo_timer_ms));
-out:
- mutex_unlock(&rtwdev->mutex);
+ wiphy_delayed_work_queue(wiphy, &rtwdev->cfo_track_work,
+ msecs_to_jiffies(cfo->cfo_timer_ms));
}
static void rtw89_phy_cfo_start_work(struct rtw89_dev *rtwdev)
{
struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking;
- ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->cfo_track_work,
- msecs_to_jiffies(cfo->cfo_timer_ms));
+ wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->cfo_track_work,
+ msecs_to_jiffies(cfo->cfo_timer_ms));
}
void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev)
@@ -5115,7 +5153,6 @@ static void rtw89_phy_stat_thermal_update(struct rtw89_dev *rtwdev)
struct rtw89_phy_iter_rssi_data {
struct rtw89_dev *rtwdev;
- struct rtw89_phy_ch_info *ch_info;
bool rssi_changed;
};
@@ -5123,10 +5160,15 @@ static
void __rtw89_phy_stat_rssi_update_iter(struct rtw89_sta_link *rtwsta_link,
struct rtw89_phy_iter_rssi_data *rssi_data)
{
- struct rtw89_phy_ch_info *ch_info = rssi_data->ch_info;
+ struct rtw89_vif_link *rtwvif_link = rtwsta_link->rtwvif_link;
+ struct rtw89_dev *rtwdev = rssi_data->rtwdev;
+ struct rtw89_phy_ch_info *ch_info;
+ struct rtw89_bb_ctx *bb;
unsigned long rssi_curr;
rssi_curr = ewma_rssi_read(&rtwsta_link->avg_rssi);
+ bb = rtw89_get_bb_ctx(rtwdev, rtwvif_link->phy_idx);
+ ch_info = &bb->ch_info;
if (rssi_curr < ch_info->rssi_min) {
ch_info->rssi_min = rssi_curr;
@@ -5157,11 +5199,13 @@ static void rtw89_phy_stat_rssi_update_iter(void *data,
static void rtw89_phy_stat_rssi_update(struct rtw89_dev *rtwdev)
{
- struct rtw89_phy_iter_rssi_data rssi_data = {0};
+ struct rtw89_phy_iter_rssi_data rssi_data = {};
+ struct rtw89_bb_ctx *bb;
rssi_data.rtwdev = rtwdev;
- rssi_data.ch_info = &rtwdev->ch_info;
- rssi_data.ch_info->rssi_min = U8_MAX;
+ rtw89_for_each_active_bb(rtwdev, bb)
+ bb->ch_info.rssi_min = U8_MAX;
+
ieee80211_iterate_stations_atomic(rtwdev->hw,
rtw89_phy_stat_rssi_update_iter,
&rssi_data);
@@ -5199,24 +5243,27 @@ void rtw89_phy_stat_track(struct rtw89_dev *rtwdev)
memset(&phystat->cur_pkt_stat, 0, sizeof(phystat->cur_pkt_stat));
}
-static u16 rtw89_phy_ccx_us_to_idx(struct rtw89_dev *rtwdev, u32 time_us)
+static u16 rtw89_phy_ccx_us_to_idx(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, u32 time_us)
{
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
return time_us >> (ilog2(CCX_US_BASE_RATIO) + env->ccx_unit_idx);
}
-static u32 rtw89_phy_ccx_idx_to_us(struct rtw89_dev *rtwdev, u16 idx)
+static u32 rtw89_phy_ccx_idx_to_us(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, u16 idx)
{
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
return idx << (ilog2(CCX_US_BASE_RATIO) + env->ccx_unit_idx);
}
-static void rtw89_phy_ccx_top_setting_init(struct rtw89_dev *rtwdev)
+static void rtw89_phy_ccx_top_setting_init(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
const struct rtw89_ccx_regs *ccx = phy->ccx;
env->ccx_manual_ctrl = false;
@@ -5225,17 +5272,20 @@ static void rtw89_phy_ccx_top_setting_init(struct rtw89_dev *rtwdev)
env->ccx_period = 0;
env->ccx_unit_idx = RTW89_CCX_32_US;
- rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->en_mask, 1);
- rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->trig_opt_mask, 1);
- rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 1);
- rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->edcca_opt_mask,
- RTW89_CCX_EDCCA_BW20_0);
+ rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->en_mask, 1, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->trig_opt_mask, 1,
+ bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 1,
+ bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->edcca_opt_mask,
+ RTW89_CCX_EDCCA_BW20_0, bb->phy_idx);
}
-static u16 rtw89_phy_ccx_get_report(struct rtw89_dev *rtwdev, u16 report,
- u16 score)
+static u16 rtw89_phy_ccx_get_report(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb,
+ u16 report, u16 score)
{
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
u32 numer = 0;
u16 ret = 0;
@@ -5275,9 +5325,10 @@ static void rtw89_phy_ccx_ms_to_period_unit(struct rtw89_dev *rtwdev,
*period, *unit_idx);
}
-static void rtw89_phy_ccx_racing_release(struct rtw89_dev *rtwdev)
+static void rtw89_phy_ccx_racing_release(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK,
"lv:(%d)->(0)\n", env->ccx_rac_lv);
@@ -5288,9 +5339,10 @@ static void rtw89_phy_ccx_racing_release(struct rtw89_dev *rtwdev)
}
static bool rtw89_phy_ifs_clm_th_update_check(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb,
struct rtw89_ccx_para_info *para)
{
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
bool is_update = env->ifs_clm_app != para->ifs_clm_app;
u8 i = 0;
u16 *ifs_th_l = env->ifs_clm_th_l;
@@ -5325,12 +5377,12 @@ static bool rtw89_phy_ifs_clm_th_update_check(struct rtw89_dev *rtwdev,
*/
ifs_th_l[IFS_CLM_TH_START_IDX] = 0;
ifs_th_h_us[IFS_CLM_TH_START_IDX] = ifs_th0_us;
- ifs_th_h[IFS_CLM_TH_START_IDX] = rtw89_phy_ccx_us_to_idx(rtwdev,
+ ifs_th_h[IFS_CLM_TH_START_IDX] = rtw89_phy_ccx_us_to_idx(rtwdev, bb,
ifs_th0_us);
for (i = 1; i < RTW89_IFS_CLM_NUM; i++) {
ifs_th_l[i] = ifs_th_h[i - 1] + 1;
ifs_th_h_us[i] = ifs_th_h_us[i - 1] * ifs_th_times;
- ifs_th_h[i] = rtw89_phy_ccx_us_to_idx(rtwdev, ifs_th_h_us[i]);
+ ifs_th_h[i] = rtw89_phy_ccx_us_to_idx(rtwdev, bb, ifs_th_h_us[i]);
}
ifs_update_finished:
@@ -5341,30 +5393,31 @@ ifs_update_finished:
return is_update;
}
-static void rtw89_phy_ifs_clm_set_th_reg(struct rtw89_dev *rtwdev)
+static void rtw89_phy_ifs_clm_set_th_reg(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
const struct rtw89_ccx_regs *ccx = phy->ccx;
u8 i = 0;
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_th_l_mask,
- env->ifs_clm_th_l[0]);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_th_l_mask,
- env->ifs_clm_th_l[1]);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_th_l_mask,
- env->ifs_clm_th_l[2]);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_th_l_mask,
- env->ifs_clm_th_l[3]);
-
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_th_h_mask,
- env->ifs_clm_th_h[0]);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_th_h_mask,
- env->ifs_clm_th_h[1]);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_th_h_mask,
- env->ifs_clm_th_h[2]);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_th_h_mask,
- env->ifs_clm_th_h[3]);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_th_l_mask,
+ env->ifs_clm_th_l[0], bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_th_l_mask,
+ env->ifs_clm_th_l[1], bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_th_l_mask,
+ env->ifs_clm_th_l[2], bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_th_l_mask,
+ env->ifs_clm_th_l[3], bb->phy_idx);
+
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_th_h_mask,
+ env->ifs_clm_th_h[0], bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_th_h_mask,
+ env->ifs_clm_th_h[1], bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_th_h_mask,
+ env->ifs_clm_th_h[2], bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_th_h_mask,
+ env->ifs_clm_th_h[3], bb->phy_idx);
for (i = 0; i < RTW89_IFS_CLM_NUM; i++)
rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK,
@@ -5372,31 +5425,38 @@ static void rtw89_phy_ifs_clm_set_th_reg(struct rtw89_dev *rtwdev)
i + 1, env->ifs_clm_th_l[i], env->ifs_clm_th_h[i]);
}
-static void rtw89_phy_ifs_clm_setting_init(struct rtw89_dev *rtwdev)
+static void rtw89_phy_ifs_clm_setting_init(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
const struct rtw89_ccx_regs *ccx = phy->ccx;
- struct rtw89_ccx_para_info para = {0};
+ struct rtw89_ccx_para_info para = {};
env->ifs_clm_app = RTW89_IFS_CLM_BACKGROUND;
env->ifs_clm_mntr_time = 0;
para.ifs_clm_app = RTW89_IFS_CLM_INIT;
- if (rtw89_phy_ifs_clm_th_update_check(rtwdev, &para))
- rtw89_phy_ifs_clm_set_th_reg(rtwdev);
+ if (rtw89_phy_ifs_clm_th_update_check(rtwdev, bb, &para))
+ rtw89_phy_ifs_clm_set_th_reg(rtwdev, bb);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_collect_en_mask, true);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_en_mask, true);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_en_mask, true);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_en_mask, true);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_en_mask, true);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_collect_en_mask, true,
+ bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_en_mask, true,
+ bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_en_mask, true,
+ bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_en_mask, true,
+ bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_en_mask, true,
+ bb->phy_idx);
}
static int rtw89_phy_ccx_racing_ctrl(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb,
enum rtw89_env_racing_lv level)
{
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
int ret = 0;
if (level >= RTW89_RAC_MAX_NUM) {
@@ -5425,56 +5485,62 @@ static int rtw89_phy_ccx_racing_ctrl(struct rtw89_dev *rtwdev,
return ret;
}
-static void rtw89_phy_ccx_trigger(struct rtw89_dev *rtwdev)
+static void rtw89_phy_ccx_trigger(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
const struct rtw89_ccx_regs *ccx = phy->ccx;
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_clm_cnt_clear_mask, 0);
- rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 0);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_clm_cnt_clear_mask, 1);
- rtw89_phy_set_phy_regs(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 1);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_clm_cnt_clear_mask, 0,
+ bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 0,
+ bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_clm_cnt_clear_mask, 1,
+ bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 1,
+ bb->phy_idx);
env->ccx_ongoing = true;
}
-static void rtw89_phy_ifs_clm_get_utility(struct rtw89_dev *rtwdev)
+static void rtw89_phy_ifs_clm_get_utility(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
u8 i = 0;
u32 res = 0;
env->ifs_clm_tx_ratio =
- rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_tx, PERCENT);
+ rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_tx, PERCENT);
env->ifs_clm_edcca_excl_cca_ratio =
- rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_edcca_excl_cca,
+ rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_edcca_excl_cca,
PERCENT);
env->ifs_clm_cck_fa_ratio =
- rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_cckfa, PERCENT);
+ rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_cckfa, PERCENT);
env->ifs_clm_ofdm_fa_ratio =
- rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_ofdmfa, PERCENT);
+ rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_ofdmfa, PERCENT);
env->ifs_clm_cck_cca_excl_fa_ratio =
- rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_cckcca_excl_fa,
+ rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_cckcca_excl_fa,
PERCENT);
env->ifs_clm_ofdm_cca_excl_fa_ratio =
- rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_ofdmcca_excl_fa,
+ rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_ofdmcca_excl_fa,
PERCENT);
env->ifs_clm_cck_fa_permil =
- rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_cckfa, PERMIL);
+ rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_cckfa, PERMIL);
env->ifs_clm_ofdm_fa_permil =
- rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_ofdmfa, PERMIL);
+ rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_ofdmfa, PERMIL);
for (i = 0; i < RTW89_IFS_CLM_NUM; i++) {
if (env->ifs_clm_his[i] > ENV_MNTR_IFSCLM_HIS_MAX) {
env->ifs_clm_ifs_avg[i] = ENV_MNTR_FAIL_DWORD;
} else {
env->ifs_clm_ifs_avg[i] =
- rtw89_phy_ccx_idx_to_us(rtwdev,
+ rtw89_phy_ccx_idx_to_us(rtwdev, bb,
env->ifs_clm_avg[i]);
}
- res = rtw89_phy_ccx_idx_to_us(rtwdev, env->ifs_clm_cca[i]);
+ res = rtw89_phy_ccx_idx_to_us(rtwdev, bb, env->ifs_clm_cca[i]);
res += env->ifs_clm_his[i] >> 1;
if (env->ifs_clm_his[i])
res /= env->ifs_clm_his[i];
@@ -5504,81 +5570,82 @@ static void rtw89_phy_ifs_clm_get_utility(struct rtw89_dev *rtwdev)
env->ifs_clm_cca_avg[i]);
}
-static bool rtw89_phy_ifs_clm_get_result(struct rtw89_dev *rtwdev)
+static bool rtw89_phy_ifs_clm_get_result(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
const struct rtw89_ccx_regs *ccx = phy->ccx;
u8 i = 0;
- if (rtw89_phy_read32_mask(rtwdev, ccx->ifs_total_addr,
- ccx->ifs_cnt_done_mask) == 0) {
+ if (rtw89_phy_read32_idx(rtwdev, ccx->ifs_total_addr,
+ ccx->ifs_cnt_done_mask, bb->phy_idx) == 0) {
rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK,
"Get IFS_CLM report Fail\n");
return false;
}
env->ifs_clm_tx =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_tx_cnt_addr,
- ccx->ifs_clm_tx_cnt_msk);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_tx_cnt_addr,
+ ccx->ifs_clm_tx_cnt_msk, bb->phy_idx);
env->ifs_clm_edcca_excl_cca =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_tx_cnt_addr,
- ccx->ifs_clm_edcca_excl_cca_fa_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_tx_cnt_addr,
+ ccx->ifs_clm_edcca_excl_cca_fa_mask, bb->phy_idx);
env->ifs_clm_cckcca_excl_fa =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_cca_addr,
- ccx->ifs_clm_cckcca_excl_fa_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_cca_addr,
+ ccx->ifs_clm_cckcca_excl_fa_mask, bb->phy_idx);
env->ifs_clm_ofdmcca_excl_fa =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_cca_addr,
- ccx->ifs_clm_ofdmcca_excl_fa_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_cca_addr,
+ ccx->ifs_clm_ofdmcca_excl_fa_mask, bb->phy_idx);
env->ifs_clm_cckfa =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_fa_addr,
- ccx->ifs_clm_cck_fa_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_fa_addr,
+ ccx->ifs_clm_cck_fa_mask, bb->phy_idx);
env->ifs_clm_ofdmfa =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_clm_fa_addr,
- ccx->ifs_clm_ofdm_fa_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_fa_addr,
+ ccx->ifs_clm_ofdm_fa_mask, bb->phy_idx);
env->ifs_clm_his[0] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_his_addr,
- ccx->ifs_t1_his_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_his_addr,
+ ccx->ifs_t1_his_mask, bb->phy_idx);
env->ifs_clm_his[1] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_his_addr,
- ccx->ifs_t2_his_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_his_addr,
+ ccx->ifs_t2_his_mask, bb->phy_idx);
env->ifs_clm_his[2] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_his_addr,
- ccx->ifs_t3_his_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_his_addr,
+ ccx->ifs_t3_his_mask, bb->phy_idx);
env->ifs_clm_his[3] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_his_addr,
- ccx->ifs_t4_his_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_his_addr,
+ ccx->ifs_t4_his_mask, bb->phy_idx);
env->ifs_clm_avg[0] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_avg_l_addr,
- ccx->ifs_t1_avg_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_avg_l_addr,
+ ccx->ifs_t1_avg_mask, bb->phy_idx);
env->ifs_clm_avg[1] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_avg_l_addr,
- ccx->ifs_t2_avg_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_avg_l_addr,
+ ccx->ifs_t2_avg_mask, bb->phy_idx);
env->ifs_clm_avg[2] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_avg_h_addr,
- ccx->ifs_t3_avg_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_avg_h_addr,
+ ccx->ifs_t3_avg_mask, bb->phy_idx);
env->ifs_clm_avg[3] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_avg_h_addr,
- ccx->ifs_t4_avg_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_avg_h_addr,
+ ccx->ifs_t4_avg_mask, bb->phy_idx);
env->ifs_clm_cca[0] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_cca_l_addr,
- ccx->ifs_t1_cca_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_cca_l_addr,
+ ccx->ifs_t1_cca_mask, bb->phy_idx);
env->ifs_clm_cca[1] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_cca_l_addr,
- ccx->ifs_t2_cca_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_cca_l_addr,
+ ccx->ifs_t2_cca_mask, bb->phy_idx);
env->ifs_clm_cca[2] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_cca_h_addr,
- ccx->ifs_t3_cca_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_cca_h_addr,
+ ccx->ifs_t3_cca_mask, bb->phy_idx);
env->ifs_clm_cca[3] =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_cca_h_addr,
- ccx->ifs_t4_cca_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_cca_h_addr,
+ ccx->ifs_t4_cca_mask, bb->phy_idx);
env->ifs_clm_total_ifs =
- rtw89_phy_read32_mask(rtwdev, ccx->ifs_total_addr,
- ccx->ifs_total_mask);
+ rtw89_phy_read32_idx(rtwdev, ccx->ifs_total_addr,
+ ccx->ifs_total_mask, bb->phy_idx);
rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, "IFS-CLM total_ifs = %d\n",
env->ifs_clm_total_ifs);
@@ -5598,16 +5665,17 @@ static bool rtw89_phy_ifs_clm_get_result(struct rtw89_dev *rtwdev)
"T%d:[%d, %d, %d]\n", i + 1, env->ifs_clm_his[i],
env->ifs_clm_avg[i], env->ifs_clm_cca[i]);
- rtw89_phy_ifs_clm_get_utility(rtwdev);
+ rtw89_phy_ifs_clm_get_utility(rtwdev, bb);
return true;
}
static int rtw89_phy_ifs_clm_set(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb,
struct rtw89_ccx_para_info *para)
{
const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def;
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
const struct rtw89_ccx_regs *ccx = phy->ccx;
u32 period = 0;
u32 unit_idx = 0;
@@ -5618,17 +5686,17 @@ static int rtw89_phy_ifs_clm_set(struct rtw89_dev *rtwdev,
return -EINVAL;
}
- if (rtw89_phy_ccx_racing_ctrl(rtwdev, para->rac_lv))
+ if (rtw89_phy_ccx_racing_ctrl(rtwdev, bb, para->rac_lv))
return -EINVAL;
if (para->mntr_time != env->ifs_clm_mntr_time) {
rtw89_phy_ccx_ms_to_period_unit(rtwdev, para->mntr_time,
&period, &unit_idx);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_cnt_addr,
- ccx->ifs_clm_period_mask, period);
- rtw89_phy_set_phy_regs(rtwdev, ccx->ifs_cnt_addr,
- ccx->ifs_clm_cnt_unit_mask,
- unit_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_cnt_addr,
+ ccx->ifs_clm_period_mask, period, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, ccx->ifs_cnt_addr,
+ ccx->ifs_clm_cnt_unit_mask,
+ unit_idx, bb->phy_idx);
rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK,
"Update IFS-CLM time ((%d)) -> ((%d))\n",
@@ -5639,18 +5707,19 @@ static int rtw89_phy_ifs_clm_set(struct rtw89_dev *rtwdev,
env->ccx_unit_idx = (u8)unit_idx;
}
- if (rtw89_phy_ifs_clm_th_update_check(rtwdev, para)) {
+ if (rtw89_phy_ifs_clm_th_update_check(rtwdev, bb, para)) {
env->ifs_clm_app = para->ifs_clm_app;
- rtw89_phy_ifs_clm_set_th_reg(rtwdev);
+ rtw89_phy_ifs_clm_set_th_reg(rtwdev, bb);
}
return 0;
}
-void rtw89_phy_env_monitor_track(struct rtw89_dev *rtwdev)
+static void __rtw89_phy_env_monitor_track(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
- struct rtw89_ccx_para_info para = {0};
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
+ struct rtw89_ccx_para_info para = {};
u8 chk_result = RTW89_PHY_ENV_MON_CCX_FAIL;
env->ccx_watchdog_result = RTW89_PHY_ENV_MON_CCX_FAIL;
@@ -5660,25 +5729,36 @@ void rtw89_phy_env_monitor_track(struct rtw89_dev *rtwdev)
return;
}
+ rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK,
+ "BB-%d env_monitor track\n", bb->phy_idx);
+
/* only ifs_clm for now */
- if (rtw89_phy_ifs_clm_get_result(rtwdev))
+ if (rtw89_phy_ifs_clm_get_result(rtwdev, bb))
env->ccx_watchdog_result |= RTW89_PHY_ENV_MON_IFS_CLM;
- rtw89_phy_ccx_racing_release(rtwdev);
+ rtw89_phy_ccx_racing_release(rtwdev, bb);
para.mntr_time = 1900;
para.rac_lv = RTW89_RAC_LV_1;
para.ifs_clm_app = RTW89_IFS_CLM_BACKGROUND;
- if (rtw89_phy_ifs_clm_set(rtwdev, &para) == 0)
+ if (rtw89_phy_ifs_clm_set(rtwdev, bb, &para) == 0)
chk_result |= RTW89_PHY_ENV_MON_IFS_CLM;
if (chk_result)
- rtw89_phy_ccx_trigger(rtwdev);
+ rtw89_phy_ccx_trigger(rtwdev, bb);
rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK,
"get_result=0x%x, chk_result:0x%x\n",
env->ccx_watchdog_result, chk_result);
}
+void rtw89_phy_env_monitor_track(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_bb_ctx *bb;
+
+ rtw89_for_each_active_bb(rtwdev, bb)
+ __rtw89_phy_env_monitor_track(rtwdev, bb);
+}
+
static bool rtw89_physts_ie_page_valid(enum rtw89_phy_status_bitmap *ie_page)
{
if (*ie_page >= RTW89_PHYSTS_BITMAP_NUM ||
@@ -5799,11 +5879,12 @@ static void rtw89_physts_parsing_init(struct rtw89_dev *rtwdev)
__rtw89_physts_parsing_init(rtwdev, RTW89_PHY_1);
}
-static void rtw89_phy_dig_read_gain_table(struct rtw89_dev *rtwdev, int type)
+static void rtw89_phy_dig_read_gain_table(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, int type)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
- struct rtw89_dig_info *dig = &rtwdev->dig;
const struct rtw89_phy_dig_gain_cfg *cfg;
+ struct rtw89_dig_info *dig = &bb->dig;
const char *msg;
u8 i;
s8 gain_base;
@@ -5840,8 +5921,8 @@ static void rtw89_phy_dig_read_gain_table(struct rtw89_dev *rtwdev, int type)
}
for (i = 0; i < cfg->size; i++) {
- tmp = rtw89_phy_read32_mask(rtwdev, cfg->table[i].addr,
- cfg->table[i].mask);
+ tmp = rtw89_phy_read32_idx(rtwdev, cfg->table[i].addr,
+ cfg->table[i].mask, bb->phy_idx);
tmp >>= DIG_GAIN_SHIFT;
gain_arr[i] = sign_extend32(tmp, U4_MAX_BIT) + gain_base;
gain_base += DIG_GAIN;
@@ -5851,25 +5932,26 @@ static void rtw89_phy_dig_read_gain_table(struct rtw89_dev *rtwdev, int type)
}
}
-static void rtw89_phy_dig_update_gain_para(struct rtw89_dev *rtwdev)
+static void rtw89_phy_dig_update_gain_para(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
- struct rtw89_dig_info *dig = &rtwdev->dig;
+ struct rtw89_dig_info *dig = &bb->dig;
u32 tmp;
u8 i;
if (!rtwdev->hal.support_igi)
return;
- tmp = rtw89_phy_read32_mask(rtwdev, R_PATH0_IB_PKPW,
- B_PATH0_IB_PKPW_MSK);
+ tmp = rtw89_phy_read32_idx(rtwdev, R_PATH0_IB_PKPW,
+ B_PATH0_IB_PKPW_MSK, bb->phy_idx);
dig->ib_pkpwr = sign_extend32(tmp >> DIG_GAIN_SHIFT, U8_MAX_BIT);
- dig->ib_pbk = rtw89_phy_read32_mask(rtwdev, R_PATH0_IB_PBK,
- B_PATH0_IB_PBK_MSK);
+ dig->ib_pbk = rtw89_phy_read32_idx(rtwdev, R_PATH0_IB_PBK,
+ B_PATH0_IB_PBK_MSK, bb->phy_idx);
rtw89_debug(rtwdev, RTW89_DBG_DIG, "ib_pkpwr=%d, ib_pbk=%d\n",
dig->ib_pkpwr, dig->ib_pbk);
for (i = RTW89_DIG_GAIN_LNA_G; i < RTW89_DIG_GAIN_MAX; i++)
- rtw89_phy_dig_read_gain_table(rtwdev, i);
+ rtw89_phy_dig_read_gain_table(rtwdev, bb, i);
}
static const u8 rssi_nolink = 22;
@@ -5878,10 +5960,11 @@ static const u16 fa_th_2g[FA_TH_NUM] = {22, 44, 66, 88};
static const u16 fa_th_5g[FA_TH_NUM] = {4, 8, 12, 16};
static const u16 fa_th_nolink[FA_TH_NUM] = {196, 352, 440, 528};
-static void rtw89_phy_dig_update_rssi_info(struct rtw89_dev *rtwdev)
+static void rtw89_phy_dig_update_rssi_info(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
- struct rtw89_phy_ch_info *ch_info = &rtwdev->ch_info;
- struct rtw89_dig_info *dig = &rtwdev->dig;
+ struct rtw89_phy_ch_info *ch_info = &bb->ch_info;
+ struct rtw89_dig_info *dig = &bb->dig;
bool is_linked = rtwdev->total_sta_assoc > 0;
if (is_linked) {
@@ -5892,10 +5975,11 @@ static void rtw89_phy_dig_update_rssi_info(struct rtw89_dev *rtwdev)
}
}
-static void rtw89_phy_dig_update_para(struct rtw89_dev *rtwdev)
+static void rtw89_phy_dig_update_para(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
- struct rtw89_dig_info *dig = &rtwdev->dig;
- const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
+ const struct rtw89_chan *chan = rtw89_mgnt_chan_get(rtwdev, bb->phy_idx);
+ struct rtw89_dig_info *dig = &bb->dig;
bool is_linked = rtwdev->total_sta_assoc > 0;
const u16 *fa_th_src = NULL;
@@ -5924,9 +6008,10 @@ static const u8 pd_low_th_offset = 16, dynamic_igi_min = 0x20;
static const u8 igi_max_performance_mode = 0x5a;
static const u8 dynamic_pd_threshold_max;
-static void rtw89_phy_dig_para_reset(struct rtw89_dev *rtwdev)
+static void rtw89_phy_dig_para_reset(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
- struct rtw89_dig_info *dig = &rtwdev->dig;
+ struct rtw89_dig_info *dig = &bb->dig;
dig->cur_gaincode.lna_idx = LNA_IDX_MAX;
dig->cur_gaincode.tia_idx = TIA_IDX_MAX;
@@ -5942,15 +6027,27 @@ static void rtw89_phy_dig_para_reset(struct rtw89_dev *rtwdev)
dig->is_linked_pre = false;
}
+static void __rtw89_phy_dig_init(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
+{
+ rtw89_debug(rtwdev, RTW89_DBG_DIG, "BB-%d dig_init\n", bb->phy_idx);
+
+ rtw89_phy_dig_update_gain_para(rtwdev, bb);
+ rtw89_phy_dig_reset(rtwdev, bb);
+}
+
static void rtw89_phy_dig_init(struct rtw89_dev *rtwdev)
{
- rtw89_phy_dig_update_gain_para(rtwdev);
- rtw89_phy_dig_reset(rtwdev);
+ struct rtw89_bb_ctx *bb;
+
+ rtw89_for_each_capab_bb(rtwdev, bb)
+ __rtw89_phy_dig_init(rtwdev, bb);
}
-static u8 rtw89_phy_dig_lna_idx_by_rssi(struct rtw89_dev *rtwdev, u8 rssi)
+static u8 rtw89_phy_dig_lna_idx_by_rssi(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, u8 rssi)
{
- struct rtw89_dig_info *dig = &rtwdev->dig;
+ struct rtw89_dig_info *dig = &bb->dig;
u8 lna_idx;
if (rssi < dig->igi_rssi_th[0])
@@ -5969,9 +6066,10 @@ static u8 rtw89_phy_dig_lna_idx_by_rssi(struct rtw89_dev *rtwdev, u8 rssi)
return lna_idx;
}
-static u8 rtw89_phy_dig_tia_idx_by_rssi(struct rtw89_dev *rtwdev, u8 rssi)
+static u8 rtw89_phy_dig_tia_idx_by_rssi(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, u8 rssi)
{
- struct rtw89_dig_info *dig = &rtwdev->dig;
+ struct rtw89_dig_info *dig = &bb->dig;
u8 tia_idx;
if (rssi < dig->igi_rssi_th[0])
@@ -5984,10 +6082,11 @@ static u8 rtw89_phy_dig_tia_idx_by_rssi(struct rtw89_dev *rtwdev, u8 rssi)
#define IB_PBK_BASE 110
#define WB_RSSI_BASE 10
-static u8 rtw89_phy_dig_rxb_idx_by_rssi(struct rtw89_dev *rtwdev, u8 rssi,
+static u8 rtw89_phy_dig_rxb_idx_by_rssi(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, u8 rssi,
struct rtw89_agc_gaincode_set *set)
{
- struct rtw89_dig_info *dig = &rtwdev->dig;
+ struct rtw89_dig_info *dig = &bb->dig;
s8 lna_gain = dig->lna_gain[set->lna_idx];
s8 tia_gain = dig->tia_gain[set->tia_idx];
s32 wb_rssi = rssi + lna_gain + tia_gain;
@@ -6003,12 +6102,13 @@ static u8 rtw89_phy_dig_rxb_idx_by_rssi(struct rtw89_dev *rtwdev, u8 rssi,
return rxb_idx;
}
-static void rtw89_phy_dig_gaincode_by_rssi(struct rtw89_dev *rtwdev, u8 rssi,
+static void rtw89_phy_dig_gaincode_by_rssi(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, u8 rssi,
struct rtw89_agc_gaincode_set *set)
{
- set->lna_idx = rtw89_phy_dig_lna_idx_by_rssi(rtwdev, rssi);
- set->tia_idx = rtw89_phy_dig_tia_idx_by_rssi(rtwdev, rssi);
- set->rxb_idx = rtw89_phy_dig_rxb_idx_by_rssi(rtwdev, rssi, set);
+ set->lna_idx = rtw89_phy_dig_lna_idx_by_rssi(rtwdev, bb, rssi);
+ set->tia_idx = rtw89_phy_dig_tia_idx_by_rssi(rtwdev, bb, rssi);
+ set->rxb_idx = rtw89_phy_dig_rxb_idx_by_rssi(rtwdev, bb, rssi, set);
rtw89_debug(rtwdev, RTW89_DBG_DIG,
"final_rssi=%03d, (lna,tia,rab)=(%d,%d,%02d)\n",
@@ -6017,10 +6117,11 @@ static void rtw89_phy_dig_gaincode_by_rssi(struct rtw89_dev *rtwdev, u8 rssi,
#define IGI_OFFSET_MAX 25
#define IGI_OFFSET_MUL 2
-static void rtw89_phy_dig_igi_offset_by_env(struct rtw89_dev *rtwdev)
+static void rtw89_phy_dig_igi_offset_by_env(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
- struct rtw89_dig_info *dig = &rtwdev->dig;
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
+ struct rtw89_dig_info *dig = &bb->dig;
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
enum rtw89_dig_noisy_level noisy_lv;
u8 igi_offset = dig->fa_rssi_ofst;
u16 fa_ratio = 0;
@@ -6057,92 +6158,99 @@ static void rtw89_phy_dig_igi_offset_by_env(struct rtw89_dev *rtwdev)
noisy_lv, igi_offset);
}
-static void rtw89_phy_dig_set_lna_idx(struct rtw89_dev *rtwdev, u8 lna_idx)
+static void rtw89_phy_dig_set_lna_idx(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, u8 lna_idx)
{
const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs;
- rtw89_phy_write32_mask(rtwdev, dig_regs->p0_lna_init.addr,
- dig_regs->p0_lna_init.mask, lna_idx);
- rtw89_phy_write32_mask(rtwdev, dig_regs->p1_lna_init.addr,
- dig_regs->p1_lna_init.mask, lna_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->p0_lna_init.addr,
+ dig_regs->p0_lna_init.mask, lna_idx, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->p1_lna_init.addr,
+ dig_regs->p1_lna_init.mask, lna_idx, bb->phy_idx);
}
-static void rtw89_phy_dig_set_tia_idx(struct rtw89_dev *rtwdev, u8 tia_idx)
+static void rtw89_phy_dig_set_tia_idx(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, u8 tia_idx)
{
const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs;
- rtw89_phy_write32_mask(rtwdev, dig_regs->p0_tia_init.addr,
- dig_regs->p0_tia_init.mask, tia_idx);
- rtw89_phy_write32_mask(rtwdev, dig_regs->p1_tia_init.addr,
- dig_regs->p1_tia_init.mask, tia_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->p0_tia_init.addr,
+ dig_regs->p0_tia_init.mask, tia_idx, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->p1_tia_init.addr,
+ dig_regs->p1_tia_init.mask, tia_idx, bb->phy_idx);
}
-static void rtw89_phy_dig_set_rxb_idx(struct rtw89_dev *rtwdev, u8 rxb_idx)
+static void rtw89_phy_dig_set_rxb_idx(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, u8 rxb_idx)
{
const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs;
- rtw89_phy_write32_mask(rtwdev, dig_regs->p0_rxb_init.addr,
- dig_regs->p0_rxb_init.mask, rxb_idx);
- rtw89_phy_write32_mask(rtwdev, dig_regs->p1_rxb_init.addr,
- dig_regs->p1_rxb_init.mask, rxb_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->p0_rxb_init.addr,
+ dig_regs->p0_rxb_init.mask, rxb_idx, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->p1_rxb_init.addr,
+ dig_regs->p1_rxb_init.mask, rxb_idx, bb->phy_idx);
}
static void rtw89_phy_dig_set_igi_cr(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb,
const struct rtw89_agc_gaincode_set set)
{
if (!rtwdev->hal.support_igi)
return;
- rtw89_phy_dig_set_lna_idx(rtwdev, set.lna_idx);
- rtw89_phy_dig_set_tia_idx(rtwdev, set.tia_idx);
- rtw89_phy_dig_set_rxb_idx(rtwdev, set.rxb_idx);
+ rtw89_phy_dig_set_lna_idx(rtwdev, bb, set.lna_idx);
+ rtw89_phy_dig_set_tia_idx(rtwdev, bb, set.tia_idx);
+ rtw89_phy_dig_set_rxb_idx(rtwdev, bb, set.rxb_idx);
rtw89_debug(rtwdev, RTW89_DBG_DIG, "Set (lna,tia,rxb)=((%d,%d,%02d))\n",
set.lna_idx, set.tia_idx, set.rxb_idx);
}
static void rtw89_phy_dig_sdagc_follow_pagc_config(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb,
bool enable)
{
const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs;
- rtw89_phy_write32_mask(rtwdev, dig_regs->p0_p20_pagcugc_en.addr,
- dig_regs->p0_p20_pagcugc_en.mask, enable);
- rtw89_phy_write32_mask(rtwdev, dig_regs->p0_s20_pagcugc_en.addr,
- dig_regs->p0_s20_pagcugc_en.mask, enable);
- rtw89_phy_write32_mask(rtwdev, dig_regs->p1_p20_pagcugc_en.addr,
- dig_regs->p1_p20_pagcugc_en.mask, enable);
- rtw89_phy_write32_mask(rtwdev, dig_regs->p1_s20_pagcugc_en.addr,
- dig_regs->p1_s20_pagcugc_en.mask, enable);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->p0_p20_pagcugc_en.addr,
+ dig_regs->p0_p20_pagcugc_en.mask, enable, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->p0_s20_pagcugc_en.addr,
+ dig_regs->p0_s20_pagcugc_en.mask, enable, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->p1_p20_pagcugc_en.addr,
+ dig_regs->p1_p20_pagcugc_en.mask, enable, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->p1_s20_pagcugc_en.addr,
+ dig_regs->p1_s20_pagcugc_en.mask, enable, bb->phy_idx);
rtw89_debug(rtwdev, RTW89_DBG_DIG, "sdagc_follow_pagc=%d\n", enable);
}
-static void rtw89_phy_dig_config_igi(struct rtw89_dev *rtwdev)
+static void rtw89_phy_dig_config_igi(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
- struct rtw89_dig_info *dig = &rtwdev->dig;
+ struct rtw89_dig_info *dig = &bb->dig;
if (!rtwdev->hal.support_igi)
return;
if (dig->force_gaincode_idx_en) {
- rtw89_phy_dig_set_igi_cr(rtwdev, dig->force_gaincode);
+ rtw89_phy_dig_set_igi_cr(rtwdev, bb, dig->force_gaincode);
rtw89_debug(rtwdev, RTW89_DBG_DIG,
"Force gaincode index enabled.\n");
} else {
- rtw89_phy_dig_gaincode_by_rssi(rtwdev, dig->igi_fa_rssi,
+ rtw89_phy_dig_gaincode_by_rssi(rtwdev, bb, dig->igi_fa_rssi,
&dig->cur_gaincode);
- rtw89_phy_dig_set_igi_cr(rtwdev, dig->cur_gaincode);
+ rtw89_phy_dig_set_igi_cr(rtwdev, bb, dig->cur_gaincode);
}
}
-static void rtw89_phy_dig_dyn_pd_th(struct rtw89_dev *rtwdev, u8 rssi,
- bool enable)
+static void rtw89_phy_dig_dyn_pd_th(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb,
+ u8 rssi, bool enable)
{
- const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
+ const struct rtw89_chan *chan = rtw89_mgnt_chan_get(rtwdev, bb->phy_idx);
const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs;
enum rtw89_bandwidth cbw = chan->band_width;
- struct rtw89_dig_info *dig = &rtwdev->dig;
+ struct rtw89_dig_info *dig = &bb->dig;
u8 final_rssi = 0, under_region = dig->pd_low_th_ofst;
u8 ofdm_cca_th;
s8 cck_cca_th;
@@ -6184,10 +6292,10 @@ static void rtw89_phy_dig_dyn_pd_th(struct rtw89_dev *rtwdev, u8 rssi,
"Dynamic PD th disabled, Set PD_low_bd=0\n");
}
- rtw89_phy_write32_mask(rtwdev, dig_regs->seg0_pd_reg,
- dig_regs->pd_lower_bound_mask, pd_val);
- rtw89_phy_write32_mask(rtwdev, dig_regs->seg0_pd_reg,
- dig_regs->pd_spatial_reuse_en, enable);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->seg0_pd_reg,
+ dig_regs->pd_lower_bound_mask, pd_val, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->seg0_pd_reg,
+ dig_regs->pd_spatial_reuse_en, enable, bb->phy_idx);
if (!rtwdev->hal.support_cckpd)
return;
@@ -6199,29 +6307,29 @@ static void rtw89_phy_dig_dyn_pd_th(struct rtw89_dev *rtwdev, u8 rssi,
"igi=%d, cck_ccaTH=%d, backoff=%d, cck_PD_low=((%d))dB\n",
final_rssi, cck_cca_th, under_region, pd_val);
- rtw89_phy_write32_mask(rtwdev, dig_regs->bmode_pd_reg,
- dig_regs->bmode_cca_rssi_limit_en, enable);
- rtw89_phy_write32_mask(rtwdev, dig_regs->bmode_pd_lower_bound_reg,
- dig_regs->bmode_rssi_nocca_low_th_mask, pd_val);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->bmode_pd_reg,
+ dig_regs->bmode_cca_rssi_limit_en, enable, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, dig_regs->bmode_pd_lower_bound_reg,
+ dig_regs->bmode_rssi_nocca_low_th_mask, pd_val, bb->phy_idx);
}
-void rtw89_phy_dig_reset(struct rtw89_dev *rtwdev)
+void rtw89_phy_dig_reset(struct rtw89_dev *rtwdev, struct rtw89_bb_ctx *bb)
{
- struct rtw89_dig_info *dig = &rtwdev->dig;
+ struct rtw89_dig_info *dig = &bb->dig;
dig->bypass_dig = false;
- rtw89_phy_dig_para_reset(rtwdev);
- rtw89_phy_dig_set_igi_cr(rtwdev, dig->force_gaincode);
- rtw89_phy_dig_dyn_pd_th(rtwdev, rssi_nolink, false);
- rtw89_phy_dig_sdagc_follow_pagc_config(rtwdev, false);
- rtw89_phy_dig_update_para(rtwdev);
+ rtw89_phy_dig_para_reset(rtwdev, bb);
+ rtw89_phy_dig_set_igi_cr(rtwdev, bb, dig->force_gaincode);
+ rtw89_phy_dig_dyn_pd_th(rtwdev, bb, rssi_nolink, false);
+ rtw89_phy_dig_sdagc_follow_pagc_config(rtwdev, bb, false);
+ rtw89_phy_dig_update_para(rtwdev, bb);
}
#define IGI_RSSI_MIN 10
#define ABS_IGI_MIN 0xc
-void rtw89_phy_dig(struct rtw89_dev *rtwdev)
+static void __rtw89_phy_dig(struct rtw89_dev *rtwdev, struct rtw89_bb_ctx *bb)
{
- struct rtw89_dig_info *dig = &rtwdev->dig;
+ struct rtw89_dig_info *dig = &bb->dig;
bool is_linked = rtwdev->total_sta_assoc > 0;
u8 igi_min;
@@ -6230,20 +6338,22 @@ void rtw89_phy_dig(struct rtw89_dev *rtwdev)
return;
}
- rtw89_phy_dig_update_rssi_info(rtwdev);
+ rtw89_debug(rtwdev, RTW89_DBG_DIG, "BB-%d dig track\n", bb->phy_idx);
+
+ rtw89_phy_dig_update_rssi_info(rtwdev, bb);
if (!dig->is_linked_pre && is_linked) {
rtw89_debug(rtwdev, RTW89_DBG_DIG, "First connected\n");
- rtw89_phy_dig_update_para(rtwdev);
+ rtw89_phy_dig_update_para(rtwdev, bb);
dig->igi_fa_rssi = dig->igi_rssi;
} else if (dig->is_linked_pre && !is_linked) {
rtw89_debug(rtwdev, RTW89_DBG_DIG, "First disconnected\n");
- rtw89_phy_dig_update_para(rtwdev);
+ rtw89_phy_dig_update_para(rtwdev, bb);
dig->igi_fa_rssi = dig->igi_rssi;
}
dig->is_linked_pre = is_linked;
- rtw89_phy_dig_igi_offset_by_env(rtwdev);
+ rtw89_phy_dig_igi_offset_by_env(rtwdev, bb);
igi_min = max_t(int, dig->igi_rssi - IGI_RSSI_MIN, 0);
dig->dyn_igi_max = min(igi_min + IGI_OFFSET_MAX, igi_max_performance_mode);
@@ -6262,14 +6372,22 @@ void rtw89_phy_dig(struct rtw89_dev *rtwdev)
dig->igi_rssi, dig->dyn_igi_max, dig->dyn_igi_min,
dig->igi_fa_rssi);
- rtw89_phy_dig_config_igi(rtwdev);
+ rtw89_phy_dig_config_igi(rtwdev, bb);
- rtw89_phy_dig_dyn_pd_th(rtwdev, dig->igi_fa_rssi, dig->dyn_pd_th_en);
+ rtw89_phy_dig_dyn_pd_th(rtwdev, bb, dig->igi_fa_rssi, dig->dyn_pd_th_en);
if (dig->dyn_pd_th_en && dig->igi_fa_rssi > dig->dyn_pd_th_max)
- rtw89_phy_dig_sdagc_follow_pagc_config(rtwdev, true);
+ rtw89_phy_dig_sdagc_follow_pagc_config(rtwdev, bb, true);
else
- rtw89_phy_dig_sdagc_follow_pagc_config(rtwdev, false);
+ rtw89_phy_dig_sdagc_follow_pagc_config(rtwdev, bb, false);
+}
+
+void rtw89_phy_dig(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_bb_ctx *bb;
+
+ rtw89_for_each_active_bb(rtwdev, bb)
+ __rtw89_phy_dig(rtwdev, bb);
}
static void __rtw89_phy_tx_path_div_sta_iter(struct rtw89_dev *rtwdev,
@@ -6443,17 +6561,17 @@ static void rtw89_phy_antdiv_training_state(struct rtw89_dev *rtwdev)
}
antdiv->training_count++;
- ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->antdiv_work,
- state_period);
+ wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->antdiv_work,
+ state_period);
}
-void rtw89_phy_antdiv_work(struct work_struct *work)
+void rtw89_phy_antdiv_work(struct wiphy *wiphy, struct wiphy_work *work)
{
struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev,
antdiv_work.work);
struct rtw89_antdiv_info *antdiv = &rtwdev->antdiv;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(wiphy);
if (antdiv->training_count <= ANTDIV_TRAINNING_CNT) {
rtw89_phy_antdiv_training_state(rtwdev);
@@ -6461,8 +6579,6 @@ void rtw89_phy_antdiv_work(struct work_struct *work)
rtw89_phy_antdiv_decision_state(rtwdev);
rtw89_phy_antdiv_set_ant(rtwdev);
}
-
- mutex_unlock(&rtwdev->mutex);
}
void rtw89_phy_antdiv_track(struct rtw89_dev *rtwdev)
@@ -6483,19 +6599,34 @@ void rtw89_phy_antdiv_track(struct rtw89_dev *rtwdev)
return;
antdiv->training_count = 0;
- ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->antdiv_work, 0);
+ wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->antdiv_work, 0);
+}
+
+static void __rtw89_phy_env_monitor_init(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
+{
+ rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK,
+ "BB-%d env_monitor init\n", bb->phy_idx);
+
+ rtw89_phy_ccx_top_setting_init(rtwdev, bb);
+ rtw89_phy_ifs_clm_setting_init(rtwdev, bb);
}
static void rtw89_phy_env_monitor_init(struct rtw89_dev *rtwdev)
{
- rtw89_phy_ccx_top_setting_init(rtwdev);
- rtw89_phy_ifs_clm_setting_init(rtwdev);
+ struct rtw89_bb_ctx *bb;
+
+ rtw89_for_each_capab_bb(rtwdev, bb)
+ __rtw89_phy_env_monitor_init(rtwdev, bb);
}
-static void rtw89_phy_edcca_init(struct rtw89_dev *rtwdev)
+static void __rtw89_phy_edcca_init(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
const struct rtw89_edcca_regs *edcca_regs = rtwdev->chip->edcca_regs;
- struct rtw89_edcca_bak *edcca_bak = &rtwdev->hal.edcca_bak;
+ struct rtw89_edcca_bak *edcca_bak = &bb->edcca_bak;
+
+ rtw89_debug(rtwdev, RTW89_DBG_EDCCA, "BB-%d edcca init\n", bb->phy_idx);
memset(edcca_bak, 0, sizeof(*edcca_bak));
@@ -6511,8 +6642,16 @@ static void rtw89_phy_edcca_init(struct rtw89_dev *rtwdev)
rtw89_phy_set_phy_regs(rtwdev, R_DFS_FFT_CG, B_DFS_FFT_EN, 1);
}
- rtw89_phy_write32_mask(rtwdev, edcca_regs->tx_collision_t2r_st,
- edcca_regs->tx_collision_t2r_st_mask, 0x29);
+ rtw89_phy_write32_idx(rtwdev, edcca_regs->tx_collision_t2r_st,
+ edcca_regs->tx_collision_t2r_st_mask, 0x29, bb->phy_idx);
+}
+
+static void rtw89_phy_edcca_init(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_bb_ctx *bb;
+
+ rtw89_for_each_capab_bb(rtwdev, bb)
+ __rtw89_phy_edcca_init(rtwdev, bb);
}
void rtw89_phy_dm_init(struct rtw89_dev *rtwdev)
@@ -6875,44 +7014,46 @@ void rtw89_decode_chan_idx(struct rtw89_dev *rtwdev, u8 chan_idx,
}
EXPORT_SYMBOL(rtw89_decode_chan_idx);
-void rtw89_phy_config_edcca(struct rtw89_dev *rtwdev, bool scan)
+void rtw89_phy_config_edcca(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, bool scan)
{
const struct rtw89_edcca_regs *edcca_regs = rtwdev->chip->edcca_regs;
- struct rtw89_edcca_bak *edcca_bak = &rtwdev->hal.edcca_bak;
+ struct rtw89_edcca_bak *edcca_bak = &bb->edcca_bak;
if (scan) {
edcca_bak->a =
- rtw89_phy_read32_mask(rtwdev, edcca_regs->edcca_level,
- edcca_regs->edcca_mask);
+ rtw89_phy_read32_idx(rtwdev, edcca_regs->edcca_level,
+ edcca_regs->edcca_mask, bb->phy_idx);
edcca_bak->p =
- rtw89_phy_read32_mask(rtwdev, edcca_regs->edcca_level,
- edcca_regs->edcca_p_mask);
+ rtw89_phy_read32_idx(rtwdev, edcca_regs->edcca_level,
+ edcca_regs->edcca_p_mask, bb->phy_idx);
edcca_bak->ppdu =
- rtw89_phy_read32_mask(rtwdev, edcca_regs->ppdu_level,
- edcca_regs->ppdu_mask);
-
- rtw89_phy_write32_mask(rtwdev, edcca_regs->edcca_level,
- edcca_regs->edcca_mask, EDCCA_MAX);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->edcca_level,
- edcca_regs->edcca_p_mask, EDCCA_MAX);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->ppdu_level,
- edcca_regs->ppdu_mask, EDCCA_MAX);
+ rtw89_phy_read32_idx(rtwdev, edcca_regs->ppdu_level,
+ edcca_regs->ppdu_mask, bb->phy_idx);
+
+ rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level,
+ edcca_regs->edcca_mask, EDCCA_MAX, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level,
+ edcca_regs->edcca_p_mask, EDCCA_MAX, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, edcca_regs->ppdu_level,
+ edcca_regs->ppdu_mask, EDCCA_MAX, bb->phy_idx);
} else {
- rtw89_phy_write32_mask(rtwdev, edcca_regs->edcca_level,
- edcca_regs->edcca_mask,
- edcca_bak->a);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->edcca_level,
- edcca_regs->edcca_p_mask,
- edcca_bak->p);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->ppdu_level,
- edcca_regs->ppdu_mask,
- edcca_bak->ppdu);
+ rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level,
+ edcca_regs->edcca_mask,
+ edcca_bak->a, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level,
+ edcca_regs->edcca_p_mask,
+ edcca_bak->p, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, edcca_regs->ppdu_level,
+ edcca_regs->ppdu_mask,
+ edcca_bak->ppdu, bb->phy_idx);
}
}
-static void rtw89_phy_edcca_log(struct rtw89_dev *rtwdev)
+static void rtw89_phy_edcca_log(struct rtw89_dev *rtwdev, struct rtw89_bb_ctx *bb)
{
const struct rtw89_edcca_regs *edcca_regs = rtwdev->chip->edcca_regs;
+ const struct rtw89_edcca_p_regs *edcca_p_regs;
bool flag_fb, flag_p20, flag_s20, flag_s40, flag_s80;
s8 pwdb_fb, pwdb_p20, pwdb_s20, pwdb_s40, pwdb_s80;
u8 path, per20_bitmap;
@@ -6922,13 +7063,18 @@ static void rtw89_phy_edcca_log(struct rtw89_dev *rtwdev)
if (!rtw89_debug_is_enabled(rtwdev, RTW89_DBG_EDCCA))
return;
+ if (bb->phy_idx == RTW89_PHY_1)
+ edcca_p_regs = &edcca_regs->p[RTW89_PHY_1];
+ else
+ edcca_p_regs = &edcca_regs->p[RTW89_PHY_0];
+
if (rtwdev->chip->chip_id == RTL8922A)
rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel_be,
edcca_regs->rpt_sel_be_mask, 0);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel,
- edcca_regs->rpt_sel_mask, 0);
- tmp = rtw89_phy_read32(rtwdev, edcca_regs->rpt_b);
+ rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel,
+ edcca_p_regs->rpt_sel_mask, 0);
+ tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_b);
path = u32_get_bits(tmp, B_EDCCA_RPT_B_PATH_MASK);
flag_s80 = u32_get_bits(tmp, B_EDCCA_RPT_B_S80);
flag_s40 = u32_get_bits(tmp, B_EDCCA_RPT_B_S40);
@@ -6939,19 +7085,19 @@ static void rtw89_phy_edcca_log(struct rtw89_dev *rtwdev)
pwdb_p20 = u32_get_bits(tmp, MASKBYTE2);
pwdb_fb = u32_get_bits(tmp, MASKBYTE3);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel,
- edcca_regs->rpt_sel_mask, 4);
- tmp = rtw89_phy_read32(rtwdev, edcca_regs->rpt_b);
+ rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel,
+ edcca_p_regs->rpt_sel_mask, 4);
+ tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_b);
pwdb_s80 = u32_get_bits(tmp, MASKBYTE1);
pwdb_s40 = u32_get_bits(tmp, MASKBYTE2);
- per20_bitmap = rtw89_phy_read32_mask(rtwdev, edcca_regs->rpt_a,
+ per20_bitmap = rtw89_phy_read32_mask(rtwdev, edcca_p_regs->rpt_a,
MASKBYTE0);
if (rtwdev->chip->chip_id == RTL8922A) {
rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel_be,
edcca_regs->rpt_sel_be_mask, 4);
- tmp = rtw89_phy_read32(rtwdev, edcca_regs->rpt_b);
+ tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_b);
pwdb[0] = u32_get_bits(tmp, MASKBYTE3);
pwdb[1] = u32_get_bits(tmp, MASKBYTE2);
pwdb[2] = u32_get_bits(tmp, MASKBYTE1);
@@ -6959,33 +7105,33 @@ static void rtw89_phy_edcca_log(struct rtw89_dev *rtwdev)
rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel_be,
edcca_regs->rpt_sel_be_mask, 5);
- tmp = rtw89_phy_read32(rtwdev, edcca_regs->rpt_b);
+ tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_b);
pwdb[4] = u32_get_bits(tmp, MASKBYTE3);
pwdb[5] = u32_get_bits(tmp, MASKBYTE2);
pwdb[6] = u32_get_bits(tmp, MASKBYTE1);
pwdb[7] = u32_get_bits(tmp, MASKBYTE0);
} else {
- rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel,
- edcca_regs->rpt_sel_mask, 0);
- tmp = rtw89_phy_read32(rtwdev, edcca_regs->rpt_a);
+ rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel,
+ edcca_p_regs->rpt_sel_mask, 0);
+ tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_a);
pwdb[0] = u32_get_bits(tmp, MASKBYTE3);
pwdb[1] = u32_get_bits(tmp, MASKBYTE2);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel,
- edcca_regs->rpt_sel_mask, 1);
- tmp = rtw89_phy_read32(rtwdev, edcca_regs->rpt_a);
+ rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel,
+ edcca_p_regs->rpt_sel_mask, 1);
+ tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_a);
pwdb[2] = u32_get_bits(tmp, MASKBYTE3);
pwdb[3] = u32_get_bits(tmp, MASKBYTE2);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel,
- edcca_regs->rpt_sel_mask, 2);
- tmp = rtw89_phy_read32(rtwdev, edcca_regs->rpt_a);
+ rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel,
+ edcca_p_regs->rpt_sel_mask, 2);
+ tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_a);
pwdb[4] = u32_get_bits(tmp, MASKBYTE3);
pwdb[5] = u32_get_bits(tmp, MASKBYTE2);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel,
- edcca_regs->rpt_sel_mask, 3);
- tmp = rtw89_phy_read32(rtwdev, edcca_regs->rpt_a);
+ rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel,
+ edcca_p_regs->rpt_sel_mask, 3);
+ tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_a);
pwdb[6] = u32_get_bits(tmp, MASKBYTE3);
pwdb[7] = u32_get_bits(tmp, MASKBYTE2);
}
@@ -7007,9 +7153,10 @@ static void rtw89_phy_edcca_log(struct rtw89_dev *rtwdev)
pwdb_fb, pwdb_p20, pwdb_s20, pwdb_s40, pwdb_s80);
}
-static u8 rtw89_phy_edcca_get_thre_by_rssi(struct rtw89_dev *rtwdev)
+static u8 rtw89_phy_edcca_get_thre_by_rssi(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb)
{
- struct rtw89_phy_ch_info *ch_info = &rtwdev->ch_info;
+ struct rtw89_phy_ch_info *ch_info = &bb->ch_info;
bool is_linked = rtwdev->total_sta_assoc > 0;
u8 rssi_min = ch_info->rssi_min >> 1;
u8 edcca_thre;
@@ -7025,13 +7172,13 @@ static u8 rtw89_phy_edcca_get_thre_by_rssi(struct rtw89_dev *rtwdev)
return edcca_thre;
}
-void rtw89_phy_edcca_thre_calc(struct rtw89_dev *rtwdev)
+void rtw89_phy_edcca_thre_calc(struct rtw89_dev *rtwdev, struct rtw89_bb_ctx *bb)
{
const struct rtw89_edcca_regs *edcca_regs = rtwdev->chip->edcca_regs;
- struct rtw89_edcca_bak *edcca_bak = &rtwdev->hal.edcca_bak;
+ struct rtw89_edcca_bak *edcca_bak = &bb->edcca_bak;
u8 th;
- th = rtw89_phy_edcca_get_thre_by_rssi(rtwdev);
+ th = rtw89_phy_edcca_get_thre_by_rssi(rtwdev, bb);
if (th == edcca_bak->th_old)
return;
@@ -7040,23 +7187,33 @@ void rtw89_phy_edcca_thre_calc(struct rtw89_dev *rtwdev)
rtw89_debug(rtwdev, RTW89_DBG_EDCCA,
"[EDCCA]: Normal Mode, EDCCA_th = %d\n", th);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->edcca_level,
- edcca_regs->edcca_mask, th);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->edcca_level,
- edcca_regs->edcca_p_mask, th);
- rtw89_phy_write32_mask(rtwdev, edcca_regs->ppdu_level,
- edcca_regs->ppdu_mask, th);
+ rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level,
+ edcca_regs->edcca_mask, th, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level,
+ edcca_regs->edcca_p_mask, th, bb->phy_idx);
+ rtw89_phy_write32_idx(rtwdev, edcca_regs->ppdu_level,
+ edcca_regs->ppdu_mask, th, bb->phy_idx);
+}
+
+static
+void __rtw89_phy_edcca_track(struct rtw89_dev *rtwdev, struct rtw89_bb_ctx *bb)
+{
+ rtw89_debug(rtwdev, RTW89_DBG_EDCCA, "BB-%d edcca track\n", bb->phy_idx);
+
+ rtw89_phy_edcca_thre_calc(rtwdev, bb);
+ rtw89_phy_edcca_log(rtwdev, bb);
}
void rtw89_phy_edcca_track(struct rtw89_dev *rtwdev)
{
struct rtw89_hal *hal = &rtwdev->hal;
+ struct rtw89_bb_ctx *bb;
if (hal->disabled_dm_bitmap & BIT(RTW89_DM_DYNAMIC_EDCCA))
return;
- rtw89_phy_edcca_thre_calc(rtwdev);
- rtw89_phy_edcca_log(rtwdev);
+ rtw89_for_each_active_bb(rtwdev, bb)
+ __rtw89_phy_edcca_track(rtwdev, bb);
}
enum rtw89_rf_path_bit rtw89_phy_get_kpath(struct rtw89_dev *rtwdev,
diff --git a/drivers/net/wireless/realtek/rtw89/phy.h b/drivers/net/wireless/realtek/rtw89/phy.h
index 08b635c93ac3..518a100375fb 100644
--- a/drivers/net/wireless/realtek/rtw89/phy.h
+++ b/drivers/net/wireless/realtek/rtw89/phy.h
@@ -835,8 +835,8 @@ s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev, u8 band, u8 bw,
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);
+int rtw89_print_ant_gain(struct rtw89_dev *rtwdev, char *buf, size_t bufsz,
+ 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,
@@ -914,6 +914,13 @@ static inline s8 rtw89_phy_txpwr_rf_to_bb(struct rtw89_dev *rtwdev, s8 txpwr_rf)
return txpwr_rf << (chip->txpwr_factor_bb - chip->txpwr_factor_rf);
}
+static inline s8 rtw89_phy_txpwr_bb_to_rf(struct rtw89_dev *rtwdev, s8 txpwr_bb)
+{
+ const struct rtw89_chip_info *chip = rtwdev->chip;
+
+ return txpwr_bb >> (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;
@@ -978,20 +985,20 @@ void rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl(struct rtw89_dev *rtwdev,
const struct rtw89_chan *chan,
struct rtw89_h2c_rf_tssi *h2c);
void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev);
-void rtw89_phy_cfo_track_work(struct work_struct *work);
+void rtw89_phy_cfo_track_work(struct wiphy *wiphy, struct wiphy_work *work);
void rtw89_phy_cfo_parse(struct rtw89_dev *rtwdev, s16 cfo_val,
struct rtw89_rx_phy_ppdu *phy_ppdu);
void rtw89_phy_stat_track(struct rtw89_dev *rtwdev);
void rtw89_phy_env_monitor_track(struct rtw89_dev *rtwdev);
void rtw89_phy_set_phy_regs(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
u32 val);
-void rtw89_phy_dig_reset(struct rtw89_dev *rtwdev);
+void rtw89_phy_dig_reset(struct rtw89_dev *rtwdev, struct rtw89_bb_ctx *bb);
void rtw89_phy_dig(struct rtw89_dev *rtwdev);
void rtw89_phy_tx_path_div_track(struct rtw89_dev *rtwdev);
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_antdiv_work(struct wiphy *wiphy, struct wiphy_work *work);
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,
@@ -1002,9 +1009,10 @@ 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,
u8 *ch, enum nl80211_band *band);
-void rtw89_phy_config_edcca(struct rtw89_dev *rtwdev, bool scan);
+void rtw89_phy_config_edcca(struct rtw89_dev *rtwdev,
+ struct rtw89_bb_ctx *bb, bool scan);
void rtw89_phy_edcca_track(struct rtw89_dev *rtwdev);
-void rtw89_phy_edcca_thre_calc(struct rtw89_dev *rtwdev);
+void rtw89_phy_edcca_thre_calc(struct rtw89_dev *rtwdev, struct rtw89_bb_ctx *bb);
enum rtw89_rf_path_bit rtw89_phy_get_kpath(struct rtw89_dev *rtwdev,
enum rtw89_phy_idx phy_idx);
enum rtw89_rf_path rtw89_phy_get_syn_sel(struct rtw89_dev *rtwdev,
diff --git a/drivers/net/wireless/realtek/rtw89/ps.c b/drivers/net/wireless/realtek/rtw89/ps.c
index 96ea04d90cd3..ac46a7baa00d 100644
--- a/drivers/net/wireless/realtek/rtw89/ps.c
+++ b/drivers/net/wireless/realtek/rtw89/ps.c
@@ -113,7 +113,7 @@ static void __rtw89_leave_lps(struct rtw89_dev *rtwdev,
void rtw89_leave_ps_mode(struct rtw89_dev *rtwdev)
{
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
__rtw89_leave_ps_mode(rtwdev);
}
@@ -125,7 +125,7 @@ void rtw89_enter_lps(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
bool can_ps_mode = true;
unsigned int link_id;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
if (test_and_set_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags))
return;
@@ -162,7 +162,7 @@ void rtw89_leave_lps(struct rtw89_dev *rtwdev)
struct rtw89_vif *rtwvif;
unsigned int link_id;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
if (!test_and_clear_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags))
return;
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
index 10d0efa7a58e..c776954ad360 100644
--- a/drivers/net/wireless/realtek/rtw89/reg.h
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
@@ -6618,6 +6618,13 @@
#define B_BE_RTS_LIMIT_IN_OFDM6 BIT(1)
#define B_BE_CHECK_CCK_EN BIT(0)
+#define R_BE_TXCNT 0x1082C
+#define R_BE_TXCNT_C1 0x1482C
+#define B_BE_ADD_TXCNT_BY BIT(31)
+#define B_BE_TOTAL_TC_OPT BIT(30)
+#define B_BE_S_TXCNT_LMT_MASK GENMASK(29, 24)
+#define B_BE_L_TXCNT_LMT_MASK GENMASK(21, 16)
+
#define R_BE_MBSSID_DROP_0 0x1083C
#define R_BE_MBSSID_DROP_0_C1 0x1483C
#define B_BE_GI_LTF_FB_SEL BIT(30)
@@ -7095,6 +7102,10 @@
#define B_BE_MACLBK_RDY_NUM_MASK GENMASK(7, 3)
#define B_BE_MACLBK_EN BIT(0)
+#define R_BE_CLIENT_OM_CTRL 0x11040
+#define R_BE_CLIENT_OM_CTRL_C1 0x15040
+#define B_BE_TRIG_DIS_EHTTB BIT(24)
+
#define R_BE_WMAC_NAV_CTL 0x11080
#define R_BE_WMAC_NAV_CTL_C1 0x15080
#define B_BE_WMAC_NAV_UPPER_EN BIT(26)
@@ -8157,6 +8168,8 @@
#define B_EDCCA_RPT_B_S40 BIT(4)
#define B_EDCCA_RPT_B_S80 BIT(3)
#define B_EDCCA_RPT_B_PATH_MASK GENMASK(2, 1)
+#define R_EDCCA_RPT_P1_A 0x1740
+#define R_EDCCA_RPT_P1_B 0x1744
#define R_SWSI_V1 0x174C
#define B_SWSI_W_BUSY_V1 BIT(24)
#define B_SWSI_R_BUSY_V1 BIT(25)
@@ -8222,6 +8235,7 @@
#define B_TXCKEN_FORCE_ALL GENMASK(24, 0)
#define R_EDCCA_RPT_SEL 0x20CC
#define B_EDCCA_RPT_SEL_MSK GENMASK(2, 0)
+#define B_EDCCA_RPT_SEL_P1_MSK GENMASK(5, 3)
#define R_ADC_FIFO 0x20fc
#define B_ADC_FIFO_RST GENMASK(31, 24)
#define B_ADC_FIFO_RXK GENMASK(31, 16)
@@ -8291,6 +8305,8 @@
#define B_P1_EN_SOUND_WO_NDP BIT(1)
#define R_EDCCA_RPT_A_BE 0x2E38
#define R_EDCCA_RPT_B_BE 0x2E3C
+#define R_EDCCA_RPT_P1_A_BE 0x2E40
+#define R_EDCCA_RPT_P1_B_BE 0x2E44
#define R_S1_HW_SI_DIS 0x3200
#define B_S1_HW_SI_DIS_W_R_TRIG GENMASK(30, 28)
#define R_P1_RXCK 0x32A0
@@ -9169,6 +9185,16 @@
#define B_IQKINF2_FCNT GENMASK(23, 16)
#define B_IQKINF2_KCNT GENMASK(15, 8)
#define B_IQKINF2_NCTLV GENMASK(7, 0)
+#define R_TXAGC_REF_DBM_RF1_P0 0xBC04
+#define B_TXAGC_OFDM_REF_DBM_RF1_P0 GENMASK(10, 2)
+#define B_TXAGC_CCK_REF_DBM_RF1_P0 GENMASK(19, 11)
+#define R_TSSI_K_RF1_P0 0xBC28
+#define B_TSSI_K_OFDM_RF1_P0 GENMASK(9, 0)
+#define R_TXAGC_REF_DBM_RF1_P1 0xBD04
+#define B_TXAGC_OFDM_REF_DBM_RF1_P1 GENMASK(10, 2)
+#define B_TXAGC_CCK_REF_DBM_RF1_P1 GENMASK(19, 11)
+#define R_TSSI_K_RF1_P1 0xBD28
+#define B_TSSI_K_OFDM_RF1_P1 GENMASK(9, 0)
#define R_RFK_ST 0xBFF8
#define R_DCOF0 0xC000
#define B_DCOF0_RST BIT(17)
@@ -9338,16 +9364,18 @@
#define R_TSSI_MAP_OFST_P1 0xE720
#define B_TSSI_MAP_OFST_OFDM GENMASK(17, 9)
#define B_TSSI_MAP_OFST_CCK GENMASK(26, 18)
-#define R_TXAGC_REF0_P0 0xE628
-#define R_TXAGC_REF0_P1 0xE728
-#define B_TXAGC_REF0_OFDM_DBM GENMASK(8, 0)
-#define B_TXAGC_REF0_CCK_DBM GENMASK(17, 9)
-#define B_TXAGC_REF0_OFDM_CW GENMASK(26, 18)
-#define R_TXAGC_REF1_P0 0xE62C
-#define R_TXAGC_REF1_P1 0xE72C
-#define B_TXAGC_REF1_CCK_CW GENMASK(8, 0)
+#define R_TXAGC_REF_DBM_P0 0xE628
+#define B_TXAGC_OFDM_REF_DBM_P0 GENMASK(8, 0)
+#define B_TXAGC_CCK_REF_DBM_P0 GENMASK(17, 9)
+#define R_TSSI_K_P0 0xE6A0
+#define B_TSSI_K_OFDM_P0 GENMASK(29, 20)
#define R_TXPWR_RSTB 0xE70C
#define B_TXPWR_RSTB BIT(16)
+#define R_TXAGC_REF_DBM_P1 0xE728
+#define B_TXAGC_OFDM_REF_DBM_P1 GENMASK(8, 0)
+#define B_TXAGC_CCK_REF_DBM_P1 GENMASK(17, 9)
+#define R_TSSI_K_P1 0xE7A0
+#define B_TSSI_K_OFDM_P1 GENMASK(29, 20)
/* WiFi CPU local domain */
#define R_AX_WDT_CTRL 0x0040
diff --git a/drivers/net/wireless/realtek/rtw89/regd.c b/drivers/net/wireless/realtek/rtw89/regd.c
index 80b2f74589eb..655323a79608 100644
--- a/drivers/net/wireless/realtek/rtw89/regd.c
+++ b/drivers/net/wireless/realtek/rtw89/regd.c
@@ -7,257 +7,266 @@
#include "ps.h"
#include "util.h"
-#define COUNTRY_REGD(_alpha2, _txpwr_regd...) \
- {.alpha2 = (_alpha2), \
- .txpwr_regd = {_txpwr_regd}, \
+static
+void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request);
+
+#define COUNTRY_REGD(_alpha2, _rule_2ghz, _rule_5ghz, _rule_6ghz, _fmap) \
+ { \
+ .alpha2 = _alpha2, \
+ .txpwr_regd[RTW89_BAND_2G] = _rule_2ghz, \
+ .txpwr_regd[RTW89_BAND_5G] = _rule_5ghz, \
+ .txpwr_regd[RTW89_BAND_6G] = _rule_6ghz, \
+ .func_bitmap = { _fmap, }, \
}
+static_assert(BITS_PER_TYPE(unsigned long) >= NUM_OF_RTW89_REGD_FUNC);
+
static const struct rtw89_regd rtw89_ww_regd =
- COUNTRY_REGD("00", RTW89_WW, RTW89_WW, RTW89_WW);
+ COUNTRY_REGD("00", RTW89_WW, RTW89_WW, RTW89_WW, 0x0);
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_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),
- COUNTRY_REGD("CR", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("EC", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("SV", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("GT", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("HN", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("MX", RTW89_MEXICO, RTW89_MEXICO, RTW89_FCC),
- COUNTRY_REGD("NI", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("PA", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("PY", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("PE", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("US", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- 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_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),
- COUNTRY_REGD("CZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("DK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("EE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("FI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("FR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("DE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("GR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("HU", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("IS", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("IE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("IT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("LV", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("LI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("LT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("LU", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("MT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("MC", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("NL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("NO", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("PL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("PT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("SK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("SI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("ES", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("SE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("CH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("GB", RTW89_UK, RTW89_UK, RTW89_UK),
- COUNTRY_REGD("AL", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("AZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("BH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- 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_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),
- COUNTRY_REGD("JO", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("KZ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("KE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- 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_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_ETSI),
- COUNTRY_REGD("NA", 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),
- COUNTRY_REGD("SA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("SN", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("RS", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("ME", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("ZA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("TR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- 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_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),
- COUNTRY_REGD("HK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("IN", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- 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_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_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),
- COUNTRY_REGD("PG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("CA", RTW89_IC, RTW89_IC, RTW89_IC),
- COUNTRY_REGD("JP", RTW89_MKK, RTW89_MKK, RTW89_MKK),
- COUNTRY_REGD("JM", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("AN", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("TT", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("TN", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("AF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("DZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("AS", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("AD", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("AO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("AI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("AQ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("AG", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("AM", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("AW", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("BS", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("BB", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("BY", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("BZ", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("BJ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("BM", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("BT", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("BW", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("BV", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("IO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("VG", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("BN", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("BF", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("MM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("BI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("CM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("CV", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("KY", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("CF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- 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_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),
- COUNTRY_REGD("DM", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("GQ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("ER", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("ET", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("FK", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("FO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("FJ", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("GF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("PF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- 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_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_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),
- COUNTRY_REGD("GY", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("HT", RTW89_FCC, RTW89_FCC, RTW89_FCC),
- COUNTRY_REGD("HM", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
- COUNTRY_REGD("VA", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("IM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("JE", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- 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_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_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_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),
- COUNTRY_REGD("NR", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("NP", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("NC", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- 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_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_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),
- COUNTRY_REGD("SM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("ST", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("SC", RTW89_FCC, RTW89_FCC, RTW89_NA),
- COUNTRY_REGD("SL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- COUNTRY_REGD("SB", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- COUNTRY_REGD("SO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- 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_ETSI),
- COUNTRY_REGD("TJ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
- 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),
- COUNTRY_REGD("TM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
- 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_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),
+ COUNTRY_REGD("AR", RTW89_MEXICO, RTW89_MEXICO, RTW89_FCC, 0x0),
+ COUNTRY_REGD("BO", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("BR", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("CL", RTW89_CHILE, RTW89_CHILE, RTW89_CHILE, 0x0),
+ COUNTRY_REGD("CO", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("CR", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("EC", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("SV", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("GT", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("HN", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("MX", RTW89_MEXICO, RTW89_MEXICO, RTW89_FCC, 0x0),
+ COUNTRY_REGD("NI", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("PA", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("PY", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("PE", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("US", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x1),
+ COUNTRY_REGD("UY", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("VE", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("PR", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("DO", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("AT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("BE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("CY", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("CZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("DK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("EE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("FI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("FR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("DE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("GR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("HU", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("IS", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("IE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("IT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("LV", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("LI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("LT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("LU", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("MT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("MC", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("NL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("NO", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("PL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("PT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("SK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("SI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("ES", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("SE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("CH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("GB", RTW89_UK, RTW89_UK, RTW89_UK, 0x0),
+ COUNTRY_REGD("AL", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("AZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("BH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("BA", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("BG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("HR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("EG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("GH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("IQ", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("IL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("JO", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("KZ", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("KE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("KW", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("KG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("LB", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("LS", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("MK", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("MA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("MZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("NA", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("NG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("OM", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("QA", RTW89_QATAR, RTW89_QATAR, RTW89_QATAR, 0x0),
+ COUNTRY_REGD("RO", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x2),
+ COUNTRY_REGD("RU", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("SA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("SN", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("RS", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("ME", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("ZA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("TR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("UA", RTW89_UKRAINE, RTW89_UKRAINE, RTW89_UKRAINE, 0x0),
+ COUNTRY_REGD("AE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("YE", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("ZW", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("BD", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("KH", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("CN", RTW89_CN, RTW89_CN, RTW89_CN, 0x0),
+ COUNTRY_REGD("HK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("IN", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("ID", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("KR", RTW89_KCC, RTW89_KCC, RTW89_KCC, 0x1),
+ COUNTRY_REGD("MY", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("PK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("PH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("SG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("LK", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("TW", RTW89_FCC, RTW89_FCC, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("TH", RTW89_THAILAND, RTW89_THAILAND, RTW89_THAILAND, 0x0),
+ COUNTRY_REGD("VN", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("AU", RTW89_ACMA, RTW89_ACMA, RTW89_ACMA, 0x0),
+ COUNTRY_REGD("NZ", RTW89_ACMA, RTW89_ACMA, RTW89_ACMA, 0x0),
+ COUNTRY_REGD("PG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("CA", RTW89_IC, RTW89_IC, RTW89_IC, 0x1),
+ COUNTRY_REGD("JP", RTW89_MKK, RTW89_MKK, RTW89_MKK, 0x0),
+ COUNTRY_REGD("JM", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("AN", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("TT", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("TN", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("AF", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("DZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("AS", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("AD", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("AO", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("AI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("AQ", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("AG", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("AM", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("AW", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("BS", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("BB", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("BY", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("BZ", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("BJ", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("BM", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("BT", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("BW", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("BV", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("IO", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("VG", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("BN", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("BF", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("MM", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("BI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("CM", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("CV", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("KY", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("CF", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("TD", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("CX", RTW89_ACMA, RTW89_ACMA, RTW89_NA, 0x0),
+ COUNTRY_REGD("CC", RTW89_ACMA, RTW89_ACMA, RTW89_NA, 0x0),
+ COUNTRY_REGD("KM", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("CG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("CD", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("CK", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("CI", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("DJ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("DM", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("GQ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("ER", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("ET", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("FK", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("FO", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("FJ", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("GF", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("PF", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("TF", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("GA", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("GM", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("GE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("GI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("GL", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("GD", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("GP", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("GU", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("GG", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("GN", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("GW", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("GY", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("HT", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("HM", RTW89_ACMA, RTW89_ACMA, RTW89_NA, 0x0),
+ COUNTRY_REGD("VA", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("IM", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("JE", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("KI", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("XK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("LA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("LR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("LY", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("MO", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("MG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("MW", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("MV", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("ML", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("MH", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("MQ", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("MR", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("MU", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("YT", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("FM", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("MD", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("MN", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("MS", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("NR", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("NP", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("NC", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("NE", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("NU", RTW89_ACMA, RTW89_ACMA, RTW89_NA, 0x0),
+ COUNTRY_REGD("NF", RTW89_ACMA, RTW89_ACMA, RTW89_NA, 0x0),
+ COUNTRY_REGD("MP", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("PW", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("RE", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("RW", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("SH", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("KN", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("LC", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("MF", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("SX", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("PM", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("VC", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("WS", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("SM", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("ST", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("SC", RTW89_FCC, RTW89_FCC, RTW89_NA, 0x0),
+ COUNTRY_REGD("SL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("SB", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("SO", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("GS", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("SR", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("SJ", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("SZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("TJ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("TZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("TG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("TK", RTW89_ACMA, RTW89_ACMA, RTW89_NA, 0x0),
+ COUNTRY_REGD("TO", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("TM", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("TC", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("TV", RTW89_ETSI, RTW89_NA, RTW89_NA, 0x0),
+ COUNTRY_REGD("UG", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("VI", RTW89_FCC, RTW89_FCC, RTW89_FCC, 0x0),
+ COUNTRY_REGD("UZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI, 0x0),
+ COUNTRY_REGD("VU", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("WF", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("EH", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("ZM", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("CU", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("IR", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("SY", RTW89_ETSI, RTW89_NA, RTW89_NA, 0x0),
+ COUNTRY_REGD("SD", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
+ COUNTRY_REGD("PS", RTW89_ETSI, RTW89_ETSI, RTW89_NA, 0x0),
};
static const char rtw89_alpha2_list_eu[][3] = {
@@ -295,13 +304,16 @@ static const char rtw89_alpha2_list_eu[][3] = {
"RO",
};
-static const struct rtw89_regd *rtw89_regd_find_reg_by_name(const char *alpha2)
+static const struct rtw89_regd *rtw89_regd_find_reg_by_name(struct rtw89_dev *rtwdev,
+ const char *alpha2)
{
+ struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
+ const struct rtw89_regd_ctrl *regd_ctrl = &regulatory->ctrl;
u32 i;
- for (i = 0; i < ARRAY_SIZE(rtw89_regd_map); i++) {
- if (!memcmp(rtw89_regd_map[i].alpha2, alpha2, 2))
- return &rtw89_regd_map[i];
+ for (i = 0; i < regd_ctrl->nr; i++) {
+ if (!memcmp(regd_ctrl->map[i].alpha2, alpha2, 2))
+ return &regd_ctrl->map[i];
}
return &rtw89_ww_regd;
@@ -312,22 +324,25 @@ static bool rtw89_regd_is_ww(const struct rtw89_regd *regd)
return regd == &rtw89_ww_regd;
}
-static u8 rtw89_regd_get_index(const struct rtw89_regd *regd)
+static u8 rtw89_regd_get_index(struct rtw89_dev *rtwdev, const struct rtw89_regd *regd)
{
+ struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
+ const struct rtw89_regd_ctrl *regd_ctrl = &regulatory->ctrl;
+
BUILD_BUG_ON(ARRAY_SIZE(rtw89_regd_map) > RTW89_REGD_MAX_COUNTRY_NUM);
if (rtw89_regd_is_ww(regd))
return RTW89_REGD_MAX_COUNTRY_NUM;
- return regd - rtw89_regd_map;
+ return regd - regd_ctrl->map;
}
-static u8 rtw89_regd_get_index_by_name(const char *alpha2)
+static u8 rtw89_regd_get_index_by_name(struct rtw89_dev *rtwdev, const char *alpha2)
{
const struct rtw89_regd *regd;
- regd = rtw89_regd_find_reg_by_name(alpha2);
- return rtw89_regd_get_index(regd);
+ regd = rtw89_regd_find_reg_by_name(rtwdev, alpha2);
+ return rtw89_regd_get_index(rtwdev, regd);
}
#define rtw89_debug_regd(_dev, _regd, _desc, _argv...) \
@@ -345,6 +360,7 @@ static void rtw89_regd_setup_unii4(struct rtw89_dev *rtwdev,
struct wiphy *wiphy)
{
struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
+ const struct rtw89_regd_ctrl *regd_ctrl = &regulatory->ctrl;
const struct rtw89_chip_info *chip = rtwdev->chip;
struct ieee80211_supported_band *sband;
struct rtw89_acpi_dsm_result res = {};
@@ -382,8 +398,8 @@ static void rtw89_regd_setup_unii4(struct rtw89_dev *rtwdev,
"acpi: eval if allow unii-4: 0x%x\n", val);
bottom:
- for (i = 0; i < ARRAY_SIZE(rtw89_regd_map); i++) {
- const struct rtw89_regd *regd = &rtw89_regd_map[i];
+ for (i = 0; i < regd_ctrl->nr; i++) {
+ const struct rtw89_regd *regd = &regd_ctrl->map[i];
switch (regd->txpwr_regd[RTW89_BAND_5G]) {
case RTW89_FCC:
@@ -406,7 +422,7 @@ static void __rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev, bool block,
struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
u8 index;
- index = rtw89_regd_get_index_by_name(alpha2);
+ index = rtw89_regd_get_index_by_name(rtwdev, alpha2);
if (index == RTW89_REGD_MAX_COUNTRY_NUM) {
rtw89_debug(rtwdev, RTW89_DBG_REGD, "%s: unknown alpha2 %c%c\n",
__func__, alpha2[0], alpha2[1]);
@@ -474,6 +490,7 @@ out:
static void rtw89_regd_setup_policy_6ghz_sp(struct rtw89_dev *rtwdev)
{
struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
+ const struct rtw89_regd_ctrl *regd_ctrl = &regulatory->ctrl;
const struct rtw89_acpi_policy_6ghz_sp *ptr;
struct rtw89_acpi_dsm_result res = {};
bool enable_by_us;
@@ -505,8 +522,8 @@ static void rtw89_regd_setup_policy_6ghz_sp(struct rtw89_dev *rtwdev)
enable_by_us = u8_get_bits(ptr->conf, RTW89_ACPI_CONF_6GHZ_SP_US);
- for (i = 0; i < ARRAY_SIZE(rtw89_regd_map); i++) {
- const struct rtw89_regd *tmp = &rtw89_regd_map[i];
+ for (i = 0; i < regd_ctrl->nr; i++) {
+ const struct rtw89_regd *tmp = &regd_ctrl->map[i];
if (enable_by_us && memcmp(tmp->alpha2, "US", 2) == 0)
clear_bit(i, regulatory->block_6ghz_sp);
@@ -573,8 +590,21 @@ bottom:
int rtw89_regd_setup(struct rtw89_dev *rtwdev)
{
+ struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
+ struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info;
+ const struct rtw89_regd_data *regd_data = elm_info->regd;
struct wiphy *wiphy = rtwdev->hw->wiphy;
+ if (regd_data) {
+ regulatory->ctrl.nr = regd_data->nr;
+ regulatory->ctrl.map = regd_data->map;
+ } else {
+ regulatory->ctrl.nr = ARRAY_SIZE(rtw89_regd_map);
+ regulatory->ctrl.map = rtw89_regd_map;
+ }
+
+ regulatory->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
+
if (!wiphy)
return -EINVAL;
@@ -585,21 +615,16 @@ int rtw89_regd_setup(struct rtw89_dev *rtwdev)
return 0;
}
-int rtw89_regd_init(struct rtw89_dev *rtwdev,
- void (*reg_notifier)(struct wiphy *wiphy,
- struct regulatory_request *request))
+int rtw89_regd_init_hint(struct rtw89_dev *rtwdev)
{
- struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
const struct rtw89_regd *chip_regd;
struct wiphy *wiphy = rtwdev->hw->wiphy;
int ret;
- regulatory->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
-
if (!wiphy)
return -EINVAL;
- chip_regd = rtw89_regd_find_reg_by_name(rtwdev->efuse.country_code);
+ chip_regd = rtw89_regd_find_reg_by_name(rtwdev, rtwdev->efuse.country_code);
if (!rtw89_regd_is_ww(chip_regd)) {
rtwdev->regulatory.regd = chip_regd;
/* Ignore country ie if there is a country domain programmed in chip */
@@ -637,7 +662,7 @@ static void rtw89_regd_apply_policy_unii4(struct rtw89_dev *rtwdev,
if (!chip->support_unii4)
return;
- index = rtw89_regd_get_index(regd);
+ index = rtw89_regd_get_index(rtwdev, regd);
if (index != RTW89_REGD_MAX_COUNTRY_NUM &&
!test_bit(index, regulatory->block_unii4))
return;
@@ -655,7 +680,7 @@ static bool regd_is_6ghz_blocked(struct rtw89_dev *rtwdev)
const struct rtw89_regd *regd = regulatory->regd;
u8 index;
- index = rtw89_regd_get_index(regd);
+ index = rtw89_regd_get_index(rtwdev, regd);
if (index != RTW89_REGD_MAX_COUNTRY_NUM &&
!test_bit(index, regulatory->block_6ghz))
return false;
@@ -696,11 +721,36 @@ static void rtw89_regd_apply_policy_6ghz(struct rtw89_dev *rtwdev,
sband->channels[i].flags |= IEEE80211_CHAN_DISABLED;
}
+static void rtw89_regd_apply_policy_tas(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
+ const struct rtw89_regd *regd = regulatory->regd;
+ struct rtw89_tas_info *tas = &rtwdev->tas;
+
+ if (!tas->enable)
+ return;
+
+ tas->block_regd = !test_bit(RTW89_REGD_FUNC_TAS, regd->func_bitmap);
+}
+
+static void rtw89_regd_apply_policy_ant_gain(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
+ struct rtw89_ant_gain_info *ant_gain = &rtwdev->ant_gain;
+ const struct rtw89_chip_info *chip = rtwdev->chip;
+ const struct rtw89_regd *regd = regulatory->regd;
+
+ if (!chip->support_ant_gain)
+ return;
+
+ ant_gain->block_country = !test_bit(RTW89_REGD_FUNC_DAG, regd->func_bitmap);
+}
+
static void rtw89_regd_notifier_apply(struct rtw89_dev *rtwdev,
struct wiphy *wiphy,
struct regulatory_request *request)
{
- rtwdev->regulatory.regd = rtw89_regd_find_reg_by_name(request->alpha2);
+ rtwdev->regulatory.regd = rtw89_regd_find_reg_by_name(rtwdev, request->alpha2);
/* This notification might be set from the system of distros,
* and it does not expect the regulatory will be modified by
* connecting to an AP (i.e. country ie).
@@ -713,14 +763,17 @@ static void rtw89_regd_notifier_apply(struct rtw89_dev *rtwdev,
rtw89_regd_apply_policy_unii4(rtwdev, wiphy);
rtw89_regd_apply_policy_6ghz(rtwdev, wiphy);
+ rtw89_regd_apply_policy_tas(rtwdev);
+ rtw89_regd_apply_policy_ant_gain(rtwdev);
}
+static
void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request)
{
struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
struct rtw89_dev *rtwdev = hw->priv;
- mutex_lock(&rtwdev->mutex);
+ wiphy_lock(wiphy);
rtw89_leave_ps_mode(rtwdev);
if (wiphy->regd) {
@@ -736,7 +789,7 @@ void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request
rtw89_core_set_chip_txpwr(rtwdev);
exit:
- mutex_unlock(&rtwdev->mutex);
+ wiphy_unlock(wiphy);
}
/* Maximum Transmit Power field (@raw) can be EIRP or PSD.
@@ -925,7 +978,7 @@ static bool __rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev)
sel = RTW89_REG_6GHZ_POWER_DFLT;
if (sel == RTW89_REG_6GHZ_POWER_STD) {
- index = rtw89_regd_get_index(regd);
+ index = rtw89_regd_get_index(rtwdev, regd);
if (index == RTW89_REGD_MAX_COUNTRY_NUM ||
test_bit(index, regulatory->block_6ghz_sp)) {
rtw89_debug(rtwdev, RTW89_DBG_REGD,
@@ -986,7 +1039,7 @@ int rtw89_reg_6ghz_recalc(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvi
unsigned int changed = 0;
int ret;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
/* The result of reg_6ghz_tpe may depend on reg_6ghz_power type,
* so must do reg_6ghz_tpe_recalc() after reg_6ghz_power_recalc().
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
index c56f70267882..0d482cd57f6e 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
@@ -224,10 +224,17 @@ static const struct rtw89_edcca_regs rtw8851b_edcca_regs = {
.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,
+ .p = {{
+ .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,
+ }, {
+ .rpt_a = R_EDCCA_RPT_P1_A,
+ .rpt_b = R_EDCCA_RPT_P1_B,
+ .rpt_sel = R_EDCCA_RPT_SEL,
+ .rpt_sel_mask = B_EDCCA_RPT_SEL_P1_MSK,
+ }},
.tx_collision_t2r_st = R_TX_COLLISION_T2R_ST,
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
};
@@ -1596,10 +1603,16 @@ static void rtw8851b_rfk_channel(struct rtw89_dev *rtwdev,
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
+ rtw89_btc_ntfy_conn_rfk(rtwdev, true);
+
rtw8851b_rx_dck(rtwdev, phy_idx, chanctx_idx);
rtw8851b_iqk(rtwdev, phy_idx, chanctx_idx);
+ rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);
rtw8851b_tssi(rtwdev, phy_idx, true, chanctx_idx);
+ rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);
rtw8851b_dpk(rtwdev, phy_idx, chanctx_idx);
+
+ rtw89_btc_ntfy_conn_rfk(rtwdev, false);
}
static void rtw8851b_rfk_band_changed(struct rtw89_dev *rtwdev,
@@ -2410,6 +2423,7 @@ static const struct rtw89_chip_ops rtw8851b_chip_ops = {
.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_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl,
.h2c_default_dmac_tbl = NULL,
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
@@ -2445,6 +2459,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
.try_ce_fw = true,
.bbmcu_nr = 0,
.needed_fw_elms = 0,
+ .fw_blacklist = NULL,
.fifo_size = 196608,
.small_fifo_size = true,
.dle_scc_rsvd_size = 98304,
@@ -2483,10 +2498,13 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
BIT(NL80211_CHAN_WIDTH_80),
.support_unii4 = true,
.support_ant_gain = false,
+ .support_tas = false,
.ul_tb_waveform_ctrl = true,
.ul_tb_pwr_diff = false,
+ .rx_freq_frome_ie = true,
.hw_sec_hdr = false,
.hw_mgmt_tx_encrypt = false,
+ .hw_tkip_crypto = false,
.rf_path_num = 1,
.tx_nss = 1,
.rx_nss = 1,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
index 9bd2842c27d5..286334e26c84 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
@@ -522,10 +522,17 @@ static const struct rtw89_edcca_regs rtw8852a_edcca_regs = {
.edcca_p_mask = B_EDCCA_LVL_MSK1,
.ppdu_level = R_SEG0R_EDCCA_LVL,
.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,
+ .p = {{
+ .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,
+ }, {
+ .rpt_a = R_EDCCA_RPT_P1_A,
+ .rpt_b = R_EDCCA_RPT_P1_B,
+ .rpt_sel = R_EDCCA_RPT_SEL,
+ .rpt_sel_mask = B_EDCCA_RPT_SEL_P1_MSK,
+ }},
.tx_collision_t2r_st = R_TX_COLLISION_T2R_ST,
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
};
@@ -1356,10 +1363,16 @@ static void rtw8852a_rfk_channel(struct rtw89_dev *rtwdev,
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
+ rtw89_btc_ntfy_conn_rfk(rtwdev, true);
+
rtw8852a_rx_dck(rtwdev, phy_idx, true, chanctx_idx);
rtw8852a_iqk(rtwdev, phy_idx, chanctx_idx);
+ rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);
rtw8852a_tssi(rtwdev, phy_idx, chanctx_idx);
+ rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);
rtw8852a_dpk(rtwdev, phy_idx, chanctx_idx);
+
+ rtw89_btc_ntfy_conn_rfk(rtwdev, false);
}
static void rtw8852a_rfk_band_changed(struct rtw89_dev *rtwdev,
@@ -2136,6 +2149,7 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
.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_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl,
.h2c_default_dmac_tbl = NULL,
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
@@ -2162,6 +2176,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
.try_ce_fw = false,
.bbmcu_nr = 0,
.needed_fw_elms = 0,
+ .fw_blacklist = NULL,
.fifo_size = 458752,
.small_fifo_size = false,
.dle_scc_rsvd_size = 0,
@@ -2201,10 +2216,13 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
BIT(NL80211_CHAN_WIDTH_80),
.support_unii4 = false,
.support_ant_gain = false,
+ .support_tas = false,
.ul_tb_waveform_ctrl = false,
.ul_tb_pwr_diff = false,
+ .rx_freq_frome_ie = true,
.hw_sec_hdr = false,
.hw_mgmt_tx_encrypt = false,
+ .hw_tkip_crypto = false,
.rf_path_num = 2,
.tx_nss = 2,
.rx_nss = 2,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b.c b/drivers/net/wireless/realtek/rtw89/rtw8852b.c
index dfb2bf61b0b8..eceb4fb9880d 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852b.c
@@ -189,10 +189,17 @@ static const struct rtw89_edcca_regs rtw8852b_edcca_regs = {
.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,
+ .p = {{
+ .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,
+ }, {
+ .rpt_a = R_EDCCA_RPT_P1_A,
+ .rpt_b = R_EDCCA_RPT_P1_B,
+ .rpt_sel = R_EDCCA_RPT_SEL,
+ .rpt_sel_mask = B_EDCCA_RPT_SEL_P1_MSK,
+ }},
.tx_collision_t2r_st = R_TX_COLLISION_T2R_ST,
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
};
@@ -568,10 +575,16 @@ static void rtw8852b_rfk_channel(struct rtw89_dev *rtwdev,
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
+ rtw89_btc_ntfy_conn_rfk(rtwdev, true);
+
rtw8852b_rx_dck(rtwdev, phy_idx, chanctx_idx);
rtw8852b_iqk(rtwdev, phy_idx, chanctx_idx);
+ rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);
rtw8852b_tssi(rtwdev, phy_idx, true, chanctx_idx);
+ rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);
rtw8852b_dpk(rtwdev, phy_idx, chanctx_idx);
+
+ rtw89_btc_ntfy_conn_rfk(rtwdev, false);
}
static void rtw8852b_rfk_band_changed(struct rtw89_dev *rtwdev,
@@ -763,6 +776,7 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {
.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_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl,
.h2c_default_dmac_tbl = NULL,
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
@@ -798,6 +812,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
.try_ce_fw = true,
.bbmcu_nr = 0,
.needed_fw_elms = 0,
+ .fw_blacklist = &rtw89_fw_blacklist_default,
.fifo_size = 196608,
.small_fifo_size = true,
.dle_scc_rsvd_size = 98304,
@@ -837,10 +852,13 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
BIT(NL80211_CHAN_WIDTH_80),
.support_unii4 = true,
.support_ant_gain = true,
+ .support_tas = false,
.ul_tb_waveform_ctrl = true,
.ul_tb_pwr_diff = false,
+ .rx_freq_frome_ie = true,
.hw_sec_hdr = false,
.hw_mgmt_tx_encrypt = false,
+ .hw_tkip_crypto = false,
.rf_path_num = 2,
.tx_nss = 2,
.rx_nss = 2,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b_common.c b/drivers/net/wireless/realtek/rtw89/rtw8852b_common.c
index 0e094ce9c9b0..99c9505b3cbd 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852b_common.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852b_common.c
@@ -621,9 +621,9 @@ static void rtw8852bt_ext_loss_avg_update(struct rtw89_dev *rtwdev,
if (ext_loss_a == ext_loss_b) {
ext_loss_avg = ext_loss_a;
} else {
- linear = rtw89_db_2_linear(abs(ext_loss_a - ext_loss_b)) + 1;
- linear = DIV_ROUND_CLOSEST_ULL(linear / 2, 1 << RTW89_LINEAR_FRAC_BITS);
- ext_loss_avg = rtw89_linear_2_db(linear);
+ linear = rtw89_db_to_linear(abs(ext_loss_a - ext_loss_b)) + 1;
+ linear /= 2;
+ ext_loss_avg = rtw89_linear_to_db(linear);
ext_loss_avg += min(ext_loss_a, ext_loss_b);
}
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c
index ef47a5facc83..fbf82d42687b 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c
@@ -3585,9 +3585,10 @@ static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
u8 ch_idx = _tssi_ch_to_idx(rtwdev, channel);
struct rtw8852bx_bb_tssi_bak tssi_bak;
s32 aliment_diff, tssi_cw_default;
- u32 start_time, finish_time;
u32 bb_reg_backup[8] = {0};
+ ktime_t start_time;
const s16 *power;
+ s64 this_time;
u8 band;
bool ok;
u32 tmp;
@@ -3613,7 +3614,7 @@ static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
return;
}
- start_time = ktime_get_ns();
+ start_time = ktime_get();
if (chan->band_type == RTW89_BAND_2G)
power = power_2g;
@@ -3738,12 +3739,12 @@ out:
rtw8852bx_bb_restore_tssi(rtwdev, phy, &tssi_bak);
rtw8852bx_bb_tx_mode_switch(rtwdev, phy, 0);
- finish_time = ktime_get_ns();
- tssi_info->tssi_alimk_time += finish_time - start_time;
+ this_time = ktime_us_delta(ktime_get(), start_time);
+ tssi_info->tssi_alimk_time += this_time;
rtw89_debug(rtwdev, RTW89_DBG_RFK,
- "[TSSI PA K] %s processing time = %d ms\n", __func__,
- tssi_info->tssi_alimk_time);
+ "[TSSI PA K] %s processing time = %lld us (acc = %llu us)\n",
+ __func__, this_time, tssi_info->tssi_alimk_time);
}
void rtw8852b_dpk_init(struct rtw89_dev *rtwdev)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
index bde3e1fb7ca6..bbf37442c492 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
@@ -187,10 +187,17 @@ static const struct rtw89_edcca_regs rtw8852bt_edcca_regs = {
.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,
+ .p = {{
+ .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,
+ }, {
+ .rpt_a = R_EDCCA_RPT_P1_A,
+ .rpt_b = R_EDCCA_RPT_P1_B,
+ .rpt_sel = R_EDCCA_RPT_SEL,
+ .rpt_sel_mask = B_EDCCA_RPT_SEL_P1_MSK,
+ }},
.tx_collision_t2r_st = R_TX_COLLISION_T2R_ST,
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
};
@@ -541,10 +548,16 @@ static void rtw8852bt_rfk_channel(struct rtw89_dev *rtwdev,
enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
+ rtw89_btc_ntfy_conn_rfk(rtwdev, true);
+
rtw8852bt_rx_dck(rtwdev, phy_idx, chanctx_idx);
rtw8852bt_iqk(rtwdev, phy_idx, chanctx_idx);
+ rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);
rtw8852bt_tssi(rtwdev, phy_idx, true, chanctx_idx);
+ rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);
rtw8852bt_dpk(rtwdev, phy_idx, chanctx_idx);
+
+ rtw89_btc_ntfy_conn_rfk(rtwdev, false);
}
static void rtw8852bt_rfk_band_changed(struct rtw89_dev *rtwdev,
@@ -697,6 +710,7 @@ static const struct rtw89_chip_ops rtw8852bt_chip_ops = {
.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_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl,
.h2c_default_dmac_tbl = NULL,
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
@@ -732,6 +746,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
.try_ce_fw = true,
.bbmcu_nr = 0,
.needed_fw_elms = RTW89_AX_GEN_DEF_NEEDED_FW_ELEMENTS_NO_6GHZ,
+ .fw_blacklist = &rtw89_fw_blacklist_default,
.fifo_size = 458752,
.small_fifo_size = true,
.dle_scc_rsvd_size = 98304,
@@ -770,10 +785,13 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
BIT(NL80211_CHAN_WIDTH_80),
.support_unii4 = true,
.support_ant_gain = true,
+ .support_tas = false,
.ul_tb_waveform_ctrl = true,
.ul_tb_pwr_diff = false,
+ .rx_freq_frome_ie = true,
.hw_sec_hdr = false,
.hw_mgmt_tx_encrypt = false,
+ .hw_tkip_crypto = true,
.rf_path_num = 2,
.tx_nss = 2,
.rx_nss = 2,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk.c
index 336a83e1d46b..6e6889eea9a0 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk.c
@@ -3663,9 +3663,10 @@ static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
u8 ch_idx = _tssi_ch_to_idx(rtwdev, channel);
struct rtw8852bx_bb_tssi_bak tssi_bak;
s32 aliment_diff, tssi_cw_default;
- u32 start_time, finish_time;
u32 bb_reg_backup[8] = {};
+ ktime_t start_time;
const s16 *power;
+ s64 this_time;
u8 band;
bool ok;
u32 tmp;
@@ -3675,7 +3676,7 @@ static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
"======> %s channel=%d path=%d\n", __func__, channel,
path);
- start_time = ktime_get_ns();
+ start_time = ktime_get();
if (chan->band_type == RTW89_BAND_2G)
power = power_2g;
@@ -3802,12 +3803,12 @@ out:
rtw8852bx_bb_restore_tssi(rtwdev, phy, &tssi_bak);
rtw8852bx_bb_tx_mode_switch(rtwdev, phy, 0);
- finish_time = ktime_get_ns();
- tssi_info->tssi_alimk_time += finish_time - start_time;
+ this_time = ktime_us_delta(ktime_get(), start_time);
+ tssi_info->tssi_alimk_time += this_time;
rtw89_debug(rtwdev, RTW89_DBG_RFK,
- "[TSSI PA K] %s processing time = %d ms\n", __func__,
- tssi_info->tssi_alimk_time);
+ "[TSSI PA K] %s processing time = %lld us (acc = %llu us)\n",
+ __func__, this_time, tssi_info->tssi_alimk_time);
}
void rtw8852bt_dpk_init(struct rtw89_dev *rtwdev)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
index bc84b15e7826..08bcdf246382 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
@@ -12,6 +12,7 @@
#include "rtw8852c.h"
#include "rtw8852c_rfk.h"
#include "rtw8852c_table.h"
+#include "sar.h"
#include "util.h"
#define RTW8852C_FW_FORMAT_MAX 1
@@ -186,10 +187,17 @@ static const struct rtw89_edcca_regs rtw8852c_edcca_regs = {
.edcca_p_mask = B_EDCCA_LVL_MSK1,
.ppdu_level = R_SEG0R_EDCCA_LVL,
.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,
+ .p = {{
+ .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,
+ }, {
+ .rpt_a = R_EDCCA_RPT_P1_A,
+ .rpt_b = R_EDCCA_RPT_P1_B,
+ .rpt_sel = R_EDCCA_RPT_SEL,
+ .rpt_sel_mask = B_EDCCA_RPT_SEL_P1_MSK,
+ }},
.tx_collision_t2r_st = R_TX_COLLISION_T2R_ST,
.tx_collision_t2r_st_mask = B_TX_COLLISION_T2R_ST_M,
};
@@ -1853,10 +1861,16 @@ static void rtw8852c_rfk_channel(struct rtw89_dev *rtwdev,
enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;
rtw8852c_mcc_get_ch_info(rtwdev, phy_idx);
+ rtw89_btc_ntfy_conn_rfk(rtwdev, true);
+
rtw8852c_rx_dck(rtwdev, phy_idx, false);
rtw8852c_iqk(rtwdev, phy_idx, chanctx_idx);
+ rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);
rtw8852c_tssi(rtwdev, phy_idx, chanctx_idx);
+ rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);
rtw8852c_dpk(rtwdev, phy_idx, chanctx_idx);
+
+ rtw89_btc_ntfy_conn_rfk(rtwdev, false);
rtw89_fw_h2c_rf_ntfy_mcc(rtwdev);
}
@@ -2867,6 +2881,7 @@ static int rtw8852c_mac_disable_bb_rf(struct rtw89_dev *rtwdev)
static const struct rtw89_chanctx_listener rtw8852c_chanctx_listener = {
.callbacks[RTW89_CHANCTX_CALLBACK_RFK] = rtw8852c_rfk_chanctx_cb,
+ .callbacks[RTW89_CHANCTX_CALLBACK_TAS] = rtw89_tas_chanctx_cb,
};
#ifdef CONFIG_PM
@@ -2928,6 +2943,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
.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_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl,
.h2c_default_dmac_tbl = NULL,
.h2c_update_beacon = rtw89_fw_h2c_update_beacon,
.h2c_ba_cam = rtw89_fw_h2c_ba_cam,
@@ -2954,6 +2970,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
.try_ce_fw = false,
.bbmcu_nr = 0,
.needed_fw_elms = 0,
+ .fw_blacklist = &rtw89_fw_blacklist_default,
.fifo_size = 458752,
.small_fifo_size = false,
.dle_scc_rsvd_size = 0,
@@ -2996,10 +3013,13 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
BIT(NL80211_CHAN_WIDTH_160),
.support_unii4 = true,
.support_ant_gain = true,
+ .support_tas = true,
.ul_tb_waveform_ctrl = false,
.ul_tb_pwr_diff = true,
+ .rx_freq_frome_ie = false,
.hw_sec_hdr = true,
.hw_mgmt_tx_encrypt = true,
+ .hw_tkip_crypto = true,
.rf_path_num = 2,
.tx_nss = 2,
.rx_nss = 2,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922a.c b/drivers/net/wireless/realtek/rtw89/rtw8922a.c
index 11d66bfceb15..8082592db84a 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922a.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922a.c
@@ -205,10 +205,17 @@ static const struct rtw89_edcca_regs rtw8922a_edcca_regs = {
.edcca_p_mask = B_EDCCA_LVL_MSK1,
.ppdu_level = R_SEG0R_PPDU_LVL_BE,
.ppdu_mask = B_EDCCA_LVL_MSK1,
- .rpt_a = R_EDCCA_RPT_A_BE,
- .rpt_b = R_EDCCA_RPT_B_BE,
- .rpt_sel = R_EDCCA_RPT_SEL_BE,
- .rpt_sel_mask = B_EDCCA_RPT_SEL_MSK,
+ .p = {{
+ .rpt_a = R_EDCCA_RPT_A_BE,
+ .rpt_b = R_EDCCA_RPT_B_BE,
+ .rpt_sel = R_EDCCA_RPT_SEL_BE,
+ .rpt_sel_mask = B_EDCCA_RPT_SEL_MSK,
+ }, {
+ .rpt_a = R_EDCCA_RPT_P1_A_BE,
+ .rpt_b = R_EDCCA_RPT_P1_B_BE,
+ .rpt_sel = R_EDCCA_RPT_SEL_BE,
+ .rpt_sel_mask = B_EDCCA_RPT_SEL_P1_MSK,
+ }},
.rpt_sel_be = R_EDCCA_RPTREG_SEL_BE,
.rpt_sel_be_mask = B_EDCCA_RPTREG_SEL_BE_MSK,
.tx_collision_t2r_st = R_TX_COLLISION_T2R_ST_BE,
@@ -2149,6 +2156,56 @@ static void rtw8922a_set_txpwr_ref(struct rtw89_dev *rtwdev,
B_BE_PWR_REF_CTRL_CCK, ref_cck);
}
+static const struct rtw89_reg_def rtw8922a_txpwr_ref[][3] = {
+ {{ .addr = R_TXAGC_REF_DBM_P0, .mask = B_TXAGC_OFDM_REF_DBM_P0},
+ { .addr = R_TXAGC_REF_DBM_P0, .mask = B_TXAGC_CCK_REF_DBM_P0},
+ { .addr = R_TSSI_K_P0, .mask = B_TSSI_K_OFDM_P0}
+ },
+ {{ .addr = R_TXAGC_REF_DBM_RF1_P0, .mask = B_TXAGC_OFDM_REF_DBM_RF1_P0},
+ { .addr = R_TXAGC_REF_DBM_RF1_P0, .mask = B_TXAGC_CCK_REF_DBM_RF1_P0},
+ { .addr = R_TSSI_K_RF1_P0, .mask = B_TSSI_K_OFDM_RF1_P0}
+ },
+};
+
+static void rtw8922a_set_txpwr_diff(struct rtw89_dev *rtwdev,
+ const struct rtw89_chan *chan,
+ enum rtw89_phy_idx phy_idx)
+{
+ s16 pwr_ofst = rtw89_phy_ant_gain_pwr_offset(rtwdev, chan);
+ const struct rtw89_chip_info *chip = rtwdev->chip;
+ static const u32 path_ofst[] = {0x0, 0x100};
+ const struct rtw89_reg_def *txpwr_ref;
+ static const s16 tssi_k_base = 0x12;
+ s16 tssi_k_ofst = abs(pwr_ofst) + tssi_k_base;
+ s16 ofst_dec[RF_PATH_NUM_8922A];
+ s16 tssi_k[RF_PATH_NUM_8922A];
+ s16 pwr_ref_ofst;
+ s16 pwr_ref = 0;
+ u8 i;
+
+ if (rtwdev->hal.cv == CHIP_CAV)
+ pwr_ref = 16;
+
+ pwr_ref <<= chip->txpwr_factor_rf;
+ pwr_ref_ofst = pwr_ref - rtw89_phy_txpwr_bb_to_rf(rtwdev, abs(pwr_ofst));
+
+ ofst_dec[RF_PATH_A] = pwr_ofst > 0 ? pwr_ref : pwr_ref_ofst;
+ ofst_dec[RF_PATH_B] = pwr_ofst > 0 ? pwr_ref_ofst : pwr_ref;
+ tssi_k[RF_PATH_A] = pwr_ofst > 0 ? tssi_k_base : tssi_k_ofst;
+ tssi_k[RF_PATH_B] = pwr_ofst > 0 ? tssi_k_ofst : tssi_k_base;
+
+ for (i = 0; i < RF_PATH_NUM_8922A; i++) {
+ txpwr_ref = rtw8922a_txpwr_ref[phy_idx];
+
+ rtw89_phy_write32_mask(rtwdev, txpwr_ref[0].addr + path_ofst[i],
+ txpwr_ref[0].mask, ofst_dec[i]);
+ rtw89_phy_write32_mask(rtwdev, txpwr_ref[1].addr + path_ofst[i],
+ txpwr_ref[1].mask, ofst_dec[i]);
+ rtw89_phy_write32_mask(rtwdev, txpwr_ref[2].addr + path_ofst[i],
+ txpwr_ref[2].mask, tssi_k[i]);
+ }
+}
+
static void rtw8922a_bb_tx_triangular(struct rtw89_dev *rtwdev, bool en,
enum rtw89_phy_idx phy_idx)
{
@@ -2185,6 +2242,8 @@ static void rtw8922a_set_txpwr(struct rtw89_dev *rtwdev,
rtw8922a_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);
+ rtw8922a_set_txpwr_diff(rtwdev, chan, phy_idx);
+ rtw8922a_set_txpwr_ref(rtwdev, phy_idx);
}
static void rtw8922a_set_txpwr_ctrl(struct rtw89_dev *rtwdev,
@@ -2695,6 +2754,7 @@ static const struct rtw89_chip_ops rtw8922a_chip_ops = {
.h2c_default_cmac_tbl = rtw89_fw_h2c_default_cmac_tbl_g7,
.h2c_assoc_cmac_tbl = rtw89_fw_h2c_assoc_cmac_tbl_g7,
.h2c_ampdu_cmac_tbl = rtw89_fw_h2c_ampdu_cmac_tbl_g7,
+ .h2c_txtime_cmac_tbl = rtw89_fw_h2c_txtime_cmac_tbl_g7,
.h2c_default_dmac_tbl = rtw89_fw_h2c_default_dmac_tbl_v2,
.h2c_update_beacon = rtw89_fw_h2c_update_beacon_be,
.h2c_ba_cam = rtw89_fw_h2c_ba_cam_v1,
@@ -2721,6 +2781,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
.try_ce_fw = false,
.bbmcu_nr = 1,
.needed_fw_elms = RTW89_BE_GEN_DEF_NEEDED_FW_ELEMENTS,
+ .fw_blacklist = &rtw89_fw_blacklist_default,
.fifo_size = 589824,
.small_fifo_size = false,
.dle_scc_rsvd_size = 0,
@@ -2760,11 +2821,14 @@ 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,
+ .support_ant_gain = true,
+ .support_tas = false,
.ul_tb_waveform_ctrl = false,
.ul_tb_pwr_diff = false,
+ .rx_freq_frome_ie = false,
.hw_sec_hdr = true,
.hw_mgmt_tx_encrypt = true,
+ .hw_tkip_crypto = true,
.rf_path_num = 2,
.tx_nss = 2,
.rx_nss = 2,
diff --git a/drivers/net/wireless/realtek/rtw89/sar.c b/drivers/net/wireless/realtek/rtw89/sar.c
index 871f45a6508c..0b5af9528702 100644
--- a/drivers/net/wireless/realtek/rtw89/sar.c
+++ b/drivers/net/wireless/realtek/rtw89/sar.c
@@ -7,10 +7,16 @@
#include "phy.h"
#include "reg.h"
#include "sar.h"
+#include "util.h"
#define RTW89_TAS_FACTOR 2 /* unit: 0.25 dBm */
+#define RTW89_TAS_SAR_GAP (1 << RTW89_TAS_FACTOR)
#define RTW89_TAS_DPR_GAP (1 << RTW89_TAS_FACTOR)
#define RTW89_TAS_DELTA (2 << RTW89_TAS_FACTOR)
+#define RTW89_TAS_TX_RATIO_THRESHOLD 70
+#define RTW89_TAS_DFLT_TX_RATIO 80
+#define RTW89_TAS_DPR_ON_OFFSET (RTW89_TAS_DELTA + RTW89_TAS_SAR_GAP)
+#define RTW89_TAS_DPR_OFF_OFFSET (4 << RTW89_TAS_FACTOR)
static enum rtw89_sar_subband rtw89_sar_get_subband(struct rtw89_dev *rtwdev,
u32 center_freq)
@@ -99,7 +105,7 @@ struct rtw89_sar_handler rtw89_sar_handlers[RTW89_SAR_SOURCE_NR] = {
typeof(_dev) _d = (_dev); \
BUILD_BUG_ON(!rtw89_sar_handlers[_s].descr_sar_source); \
BUILD_BUG_ON(!rtw89_sar_handlers[_s].query_sar_config); \
- lockdep_assert_held(&_d->mutex); \
+ lockdep_assert_wiphy(_d->hw->wiphy); \
_d->sar._cfg_name = *(_cfg_data); \
_d->sar.src = _s; \
} while (0)
@@ -117,8 +123,8 @@ static s8 rtw89_txpwr_sar_to_mac(struct rtw89_dev *rtwdev, u8 fct, s32 cfg)
RTW89_SAR_TXPWR_MAC_MAX);
}
-static s8 rtw89_txpwr_tas_to_sar(const struct rtw89_sar_handler *sar_hdl,
- s8 cfg)
+static s32 rtw89_txpwr_tas_to_sar(const struct rtw89_sar_handler *sar_hdl,
+ s32 cfg)
{
const u8 fct = sar_hdl->txpwr_factor_sar;
@@ -128,8 +134,8 @@ static s8 rtw89_txpwr_tas_to_sar(const struct rtw89_sar_handler *sar_hdl,
return cfg >> (RTW89_TAS_FACTOR - fct);
}
-static s8 rtw89_txpwr_sar_to_tas(const struct rtw89_sar_handler *sar_hdl,
- s8 cfg)
+static s32 rtw89_txpwr_sar_to_tas(const struct rtw89_sar_handler *sar_hdl,
+ s32 cfg)
{
const u8 fct = sar_hdl->txpwr_factor_sar;
@@ -139,18 +145,48 @@ static s8 rtw89_txpwr_sar_to_tas(const struct rtw89_sar_handler *sar_hdl,
return cfg << (RTW89_TAS_FACTOR - fct);
}
+static bool rtw89_tas_is_active(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_tas_info *tas = &rtwdev->tas;
+ struct rtw89_vif *rtwvif;
+
+ if (!tas->enable)
+ return false;
+
+ rtw89_for_each_rtwvif(rtwdev, rtwvif) {
+ if (ieee80211_vif_is_mld(rtwvif_to_vif(rtwvif)))
+ return false;
+ }
+
+ return true;
+}
+
+static const char *rtw89_tas_state_str(enum rtw89_tas_state state)
+{
+ switch (state) {
+ case RTW89_TAS_STATE_DPR_OFF:
+ return "DPR OFF";
+ case RTW89_TAS_STATE_DPR_ON:
+ return "DPR ON";
+ case RTW89_TAS_STATE_STATIC_SAR:
+ return "STATIC SAR";
+ default:
+ return NULL;
+ }
+}
+
s8 rtw89_query_sar(struct rtw89_dev *rtwdev, u32 center_freq)
{
const enum rtw89_sar_sources src = rtwdev->sar.src;
/* its members are protected by rtw89_sar_set_src() */
const struct rtw89_sar_handler *sar_hdl = &rtw89_sar_handlers[src];
struct rtw89_tas_info *tas = &rtwdev->tas;
- s8 delta;
+ s32 offset;
int ret;
s32 cfg;
u8 fct;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
if (src == RTW89_SAR_SOURCE_NONE)
return RTW89_SAR_TXPWR_MAC_MAX;
@@ -159,15 +195,17 @@ s8 rtw89_query_sar(struct rtw89_dev *rtwdev, u32 center_freq)
if (ret)
return RTW89_SAR_TXPWR_MAC_MAX;
- if (tas->enable) {
+ if (rtw89_tas_is_active(rtwdev)) {
switch (tas->state) {
case RTW89_TAS_STATE_DPR_OFF:
- return RTW89_SAR_TXPWR_MAC_MAX;
+ offset = rtw89_txpwr_tas_to_sar(sar_hdl, RTW89_TAS_DPR_OFF_OFFSET);
+ cfg += offset;
+ break;
case RTW89_TAS_STATE_DPR_ON:
- delta = rtw89_txpwr_tas_to_sar(sar_hdl, tas->delta);
- cfg -= delta;
+ offset = rtw89_txpwr_tas_to_sar(sar_hdl, RTW89_TAS_DPR_ON_OFFSET);
+ cfg -= offset;
break;
- case RTW89_TAS_STATE_DPR_FORBID:
+ case RTW89_TAS_STATE_STATIC_SAR:
default:
break;
}
@@ -178,72 +216,91 @@ s8 rtw89_query_sar(struct rtw89_dev *rtwdev, u32 center_freq)
return rtw89_txpwr_sar_to_mac(rtwdev, fct, cfg);
}
-void rtw89_print_sar(struct seq_file *m, struct rtw89_dev *rtwdev, u32 center_freq)
+int rtw89_print_sar(struct rtw89_dev *rtwdev, char *buf, size_t bufsz,
+ u32 center_freq)
{
const enum rtw89_sar_sources src = rtwdev->sar.src;
/* its members are protected by rtw89_sar_set_src() */
const struct rtw89_sar_handler *sar_hdl = &rtw89_sar_handlers[src];
const u8 fct_mac = rtwdev->chip->txpwr_factor_mac;
+ char *p = buf, *end = buf + bufsz;
int ret;
s32 cfg;
u8 fct;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
if (src == RTW89_SAR_SOURCE_NONE) {
- seq_puts(m, "no SAR is applied\n");
- return;
+ p += scnprintf(p, end - p, "no SAR is applied\n");
+ goto out;
}
- seq_printf(m, "source: %d (%s)\n", src, sar_hdl->descr_sar_source);
+ p += scnprintf(p, end - p, "source: %d (%s)\n", src,
+ sar_hdl->descr_sar_source);
ret = sar_hdl->query_sar_config(rtwdev, center_freq, &cfg);
if (ret) {
- seq_printf(m, "config: return code: %d\n", ret);
- seq_printf(m, "assign: max setting: %d (unit: 1/%lu dBm)\n",
- RTW89_SAR_TXPWR_MAC_MAX, BIT(fct_mac));
- return;
+ p += scnprintf(p, end - p, "config: return code: %d\n", ret);
+ p += scnprintf(p, end - p,
+ "assign: max setting: %d (unit: 1/%lu dBm)\n",
+ RTW89_SAR_TXPWR_MAC_MAX, BIT(fct_mac));
+ goto out;
}
fct = sar_hdl->txpwr_factor_sar;
- seq_printf(m, "config: %d (unit: 1/%lu dBm)\n", cfg, BIT(fct));
+ p += scnprintf(p, end - p, "config: %d (unit: 1/%lu dBm)\n", cfg,
+ BIT(fct));
+
+out:
+ return p - buf;
}
-void rtw89_print_tas(struct seq_file *m, struct rtw89_dev *rtwdev)
+int rtw89_print_tas(struct rtw89_dev *rtwdev, char *buf, size_t bufsz)
{
struct rtw89_tas_info *tas = &rtwdev->tas;
+ char *p = buf, *end = buf + bufsz;
- if (!tas->enable) {
- seq_puts(m, "no TAS is applied\n");
- return;
+ if (!rtw89_tas_is_active(rtwdev)) {
+ p += scnprintf(p, end - p, "no TAS is applied\n");
+ goto out;
}
- seq_printf(m, "DPR gap: %d\n", tas->dpr_gap);
- seq_printf(m, "TAS delta: %d\n", tas->delta);
+ p += scnprintf(p, end - p, "State: %s\n",
+ rtw89_tas_state_str(tas->state));
+ p += scnprintf(p, end - p, "Average time: %d\n",
+ tas->window_size * 2);
+ p += scnprintf(p, end - p, "SAR gap: %d dBm\n",
+ RTW89_TAS_SAR_GAP >> RTW89_TAS_FACTOR);
+ p += scnprintf(p, end - p, "DPR gap: %d dBm\n",
+ RTW89_TAS_DPR_GAP >> RTW89_TAS_FACTOR);
+ p += scnprintf(p, end - p, "DPR ON offset: %d dBm\n",
+ RTW89_TAS_DPR_ON_OFFSET >> RTW89_TAS_FACTOR);
+ p += scnprintf(p, end - p, "DPR OFF offset: %d dBm\n",
+ RTW89_TAS_DPR_OFF_OFFSET >> RTW89_TAS_FACTOR);
+
+out:
+ return p - buf;
}
static int rtw89_apply_sar_common(struct rtw89_dev *rtwdev,
const struct rtw89_sar_cfg_common *sar)
{
enum rtw89_sar_sources src;
- int ret = 0;
- mutex_lock(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
src = rtwdev->sar.src;
if (src != RTW89_SAR_SOURCE_NONE && src != RTW89_SAR_SOURCE_COMMON) {
rtw89_warn(rtwdev, "SAR source: %d is in use", src);
- ret = -EBUSY;
- goto exit;
+ return -EBUSY;
}
rtw89_sar_set_src(rtwdev, RTW89_SAR_SOURCE_COMMON, cfg_common, sar);
rtw89_core_set_chip_txpwr(rtwdev);
+ rtw89_tas_reset(rtwdev, false);
-exit:
- mutex_unlock(&rtwdev->mutex);
- return ret;
+ return 0;
}
static const struct cfg80211_sar_freq_ranges rtw89_common_sar_freq_ranges[] = {
@@ -279,6 +336,8 @@ int rtw89_ops_set_sar_specs(struct ieee80211_hw *hw,
s32 power;
u32 i, idx;
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
if (sar->type != NL80211_SAR_TYPE_POWER)
return -EINVAL;
@@ -304,65 +363,174 @@ int rtw89_ops_set_sar_specs(struct ieee80211_hw *hw,
return rtw89_apply_sar_common(rtwdev, &sar_common);
}
-static void rtw89_tas_state_update(struct rtw89_dev *rtwdev)
+static bool rtw89_tas_query_sar_config(struct rtw89_dev *rtwdev, s32 *cfg)
{
+ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
const enum rtw89_sar_sources src = rtwdev->sar.src;
/* its members are protected by rtw89_sar_set_src() */
const struct rtw89_sar_handler *sar_hdl = &rtw89_sar_handlers[src];
- struct rtw89_tas_info *tas = &rtwdev->tas;
- s32 txpwr_avg = tas->total_txpwr / RTW89_TAS_MAX_WINDOW / PERCENT;
- s32 dpr_on_threshold, dpr_off_threshold, cfg;
- enum rtw89_tas_state state = tas->state;
- const struct rtw89_chan *chan;
int ret;
- lockdep_assert_held(&rtwdev->mutex);
-
if (src == RTW89_SAR_SOURCE_NONE)
- return;
+ return false;
- chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
- ret = sar_hdl->query_sar_config(rtwdev, chan->freq, &cfg);
+ ret = sar_hdl->query_sar_config(rtwdev, chan->freq, cfg);
if (ret)
+ return false;
+
+ *cfg = rtw89_txpwr_sar_to_tas(sar_hdl, *cfg);
+
+ return true;
+}
+
+static void rtw89_tas_state_update(struct rtw89_dev *rtwdev,
+ enum rtw89_tas_state state)
+{
+ struct rtw89_tas_info *tas = &rtwdev->tas;
+
+ if (tas->state == state)
return;
- cfg = rtw89_txpwr_sar_to_tas(sar_hdl, cfg);
+ rtw89_debug(rtwdev, RTW89_DBG_SAR, "tas: switch state: %s -> %s\n",
+ rtw89_tas_state_str(tas->state), rtw89_tas_state_str(state));
- if (tas->delta >= cfg) {
+ tas->state = state;
+ rtw89_core_set_chip_txpwr(rtwdev);
+}
+
+static u32 rtw89_tas_get_window_size(struct rtw89_dev *rtwdev)
+{
+ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
+ u8 band = chan->band_type;
+ u8 regd = rtw89_regd_get(rtwdev, band);
+
+ switch (regd) {
+ default:
rtw89_debug(rtwdev, RTW89_DBG_SAR,
- "TAS delta exceed SAR limit\n");
- state = RTW89_TAS_STATE_DPR_FORBID;
- goto out;
+ "tas: regd: %u is unhandled\n", regd);
+ fallthrough;
+ case RTW89_IC:
+ case RTW89_KCC:
+ return 180;
+ case RTW89_FCC:
+ switch (band) {
+ case RTW89_BAND_2G:
+ return 50;
+ case RTW89_BAND_5G:
+ return 30;
+ case RTW89_BAND_6G:
+ default:
+ return 15;
+ }
+ break;
+ }
+}
+
+static void rtw89_tas_window_update(struct rtw89_dev *rtwdev)
+{
+ u32 window_size = rtw89_tas_get_window_size(rtwdev);
+ struct rtw89_tas_info *tas = &rtwdev->tas;
+ u64 total_txpwr = 0;
+ u8 head_idx;
+ u32 i, j;
+
+ WARN_ON_ONCE(tas->window_size > RTW89_TAS_TXPWR_WINDOW);
+
+ if (tas->window_size == window_size)
+ return;
+
+ rtw89_debug(rtwdev, RTW89_DBG_SAR, "tas: window update: %u -> %u\n",
+ tas->window_size, window_size);
+
+ head_idx = (tas->txpwr_tail_idx - window_size + 1 + RTW89_TAS_TXPWR_WINDOW) %
+ RTW89_TAS_TXPWR_WINDOW;
+ for (i = 0; i < window_size; i++) {
+ j = (head_idx + i) % RTW89_TAS_TXPWR_WINDOW;
+ total_txpwr += tas->txpwr_history[j];
+ }
+
+ tas->window_size = window_size;
+ tas->total_txpwr = total_txpwr;
+ tas->txpwr_head_idx = head_idx;
+}
+
+static void rtw89_tas_history_update(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_bb_ctx *bb = rtw89_get_bb_ctx(rtwdev, RTW89_PHY_0);
+ struct rtw89_env_monitor_info *env = &bb->env_monitor;
+ struct rtw89_tas_info *tas = &rtwdev->tas;
+ u8 tx_ratio = env->ifs_clm_tx_ratio;
+ u64 instant_txpwr, txpwr;
+
+ /* txpwr in unit of linear(mW) multiply by percentage */
+ if (tx_ratio == 0) {
+ /* special case: idle tx power
+ * use -40 dBm * 100 tx ratio
+ */
+ instant_txpwr = rtw89_db_to_linear(-40);
+ txpwr = instant_txpwr * 100;
+ } else {
+ instant_txpwr = tas->instant_txpwr;
+ txpwr = instant_txpwr * tx_ratio;
}
- dpr_on_threshold = cfg;
- dpr_off_threshold = cfg - tas->dpr_gap;
+ tas->total_txpwr += txpwr - tas->txpwr_history[tas->txpwr_head_idx];
+ tas->total_tx_ratio += tx_ratio - tas->tx_ratio_history[tas->tx_ratio_idx];
+ tas->tx_ratio_history[tas->tx_ratio_idx] = tx_ratio;
+
+ tas->txpwr_head_idx = (tas->txpwr_head_idx + 1) % RTW89_TAS_TXPWR_WINDOW;
+ tas->txpwr_tail_idx = (tas->txpwr_tail_idx + 1) % RTW89_TAS_TXPWR_WINDOW;
+ tas->tx_ratio_idx = (tas->tx_ratio_idx + 1) % RTW89_TAS_TX_RATIO_WINDOW;
+ tas->txpwr_history[tas->txpwr_tail_idx] = txpwr;
+
rtw89_debug(rtwdev, RTW89_DBG_SAR,
- "DPR_ON thold: %d, DPR_OFF thold: %d, txpwr_avg: %d\n",
- dpr_on_threshold, dpr_off_threshold, txpwr_avg);
+ "tas: instant_txpwr: %d, tx_ratio: %u, txpwr: %d\n",
+ rtw89_linear_to_db_quarter(instant_txpwr), tx_ratio,
+ rtw89_linear_to_db_quarter(div_u64(txpwr, PERCENT)));
+}
- if (txpwr_avg >= dpr_on_threshold)
+static void rtw89_tas_rolling_average(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_tas_info *tas = &rtwdev->tas;
+ s32 dpr_on_threshold, dpr_off_threshold;
+ enum rtw89_tas_state state;
+ u16 tx_ratio_avg;
+ s32 txpwr_avg;
+ u64 linear;
+
+ linear = DIV_ROUND_DOWN_ULL(tas->total_txpwr, tas->window_size * PERCENT);
+ txpwr_avg = rtw89_linear_to_db_quarter(linear);
+ tx_ratio_avg = tas->total_tx_ratio / RTW89_TAS_TX_RATIO_WINDOW;
+ dpr_on_threshold = tas->dpr_on_threshold;
+ dpr_off_threshold = tas->dpr_off_threshold;
+
+ rtw89_debug(rtwdev, RTW89_DBG_SAR,
+ "tas: DPR_ON: %d, DPR_OFF: %d, txpwr_avg: %d, tx_ratio_avg: %u\n",
+ dpr_on_threshold, dpr_off_threshold, txpwr_avg, tx_ratio_avg);
+
+ if (tx_ratio_avg >= RTW89_TAS_TX_RATIO_THRESHOLD)
+ state = RTW89_TAS_STATE_STATIC_SAR;
+ else if (txpwr_avg >= dpr_on_threshold)
state = RTW89_TAS_STATE_DPR_ON;
else if (txpwr_avg < dpr_off_threshold)
state = RTW89_TAS_STATE_DPR_OFF;
-
-out:
- if (tas->state == state)
+ else
return;
- rtw89_debug(rtwdev, RTW89_DBG_SAR,
- "TAS old state: %d, new state: %d\n", tas->state, state);
- tas->state = state;
- rtw89_core_set_chip_txpwr(rtwdev);
+ rtw89_tas_state_update(rtwdev, state);
}
void rtw89_tas_init(struct rtw89_dev *rtwdev)
{
+ const struct rtw89_chip_info *chip = rtwdev->chip;
struct rtw89_tas_info *tas = &rtwdev->tas;
struct rtw89_acpi_dsm_result res = {};
int ret;
u8 val;
+ if (!chip->support_tas)
+ return;
+
ret = rtw89_acpi_evaluate_dsm(rtwdev, RTW89_ACPI_DSM_FUNC_TAS_EN, &res);
if (ret) {
rtw89_debug(rtwdev, RTW89_DBG_SAR,
@@ -386,64 +554,116 @@ void rtw89_tas_init(struct rtw89_dev *rtwdev)
rtw89_debug(rtwdev, RTW89_DBG_SAR, "TAS not enable\n");
return;
}
-
- tas->dpr_gap = RTW89_TAS_DPR_GAP;
- tas->delta = RTW89_TAS_DELTA;
}
-void rtw89_tas_reset(struct rtw89_dev *rtwdev)
+void rtw89_tas_reset(struct rtw89_dev *rtwdev, bool force)
{
+ const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_CHANCTX_0);
struct rtw89_tas_info *tas = &rtwdev->tas;
+ u64 linear;
+ s32 cfg;
+ int i;
- if (!tas->enable)
+ if (!rtw89_tas_is_active(rtwdev))
+ return;
+
+ if (!rtw89_tas_query_sar_config(rtwdev, &cfg))
return;
- memset(&tas->txpwr_history, 0, sizeof(tas->txpwr_history));
- tas->total_txpwr = 0;
- tas->cur_idx = 0;
+ tas->dpr_on_threshold = cfg - RTW89_TAS_SAR_GAP;
+ tas->dpr_off_threshold = cfg - RTW89_TAS_SAR_GAP - RTW89_TAS_DPR_GAP;
+
+ /* avoid history reset after new SAR apply */
+ if (!force && tas->keep_history)
+ return;
+
+ linear = rtw89_db_quarter_to_linear(cfg) * RTW89_TAS_DFLT_TX_RATIO;
+ for (i = 0; i < RTW89_TAS_TXPWR_WINDOW; i++)
+ tas->txpwr_history[i] = linear;
+
+ for (i = 0; i < RTW89_TAS_TX_RATIO_WINDOW; i++)
+ tas->tx_ratio_history[i] = RTW89_TAS_DFLT_TX_RATIO;
+
+ tas->total_tx_ratio = RTW89_TAS_DFLT_TX_RATIO * RTW89_TAS_TX_RATIO_WINDOW;
+ tas->total_txpwr = linear * RTW89_TAS_TXPWR_WINDOW;
+ tas->window_size = RTW89_TAS_TXPWR_WINDOW;
+ tas->txpwr_head_idx = 0;
+ tas->txpwr_tail_idx = RTW89_TAS_TXPWR_WINDOW - 1;
+ tas->tx_ratio_idx = 0;
tas->state = RTW89_TAS_STATE_DPR_OFF;
-}
+ tas->backup_state = RTW89_TAS_STATE_DPR_OFF;
+ tas->keep_history = true;
-static const struct rtw89_reg_def txpwr_regs[] = {
- {R_PATH0_TXPWR, B_PATH0_TXPWR},
- {R_PATH1_TXPWR, B_PATH1_TXPWR},
-};
+ rtw89_debug(rtwdev, RTW89_DBG_SAR,
+ "tas: band: %u, freq: %u\n", chan->band_type, chan->freq);
+}
void rtw89_tas_track(struct rtw89_dev *rtwdev)
{
- struct rtw89_env_monitor_info *env = &rtwdev->env_monitor;
- const enum rtw89_sar_sources src = rtwdev->sar.src;
- u8 max_nss_num = rtwdev->chip->rf_path_num;
struct rtw89_tas_info *tas = &rtwdev->tas;
- s16 tmp, txpwr, instant_txpwr = 0;
- u32 val;
- int i;
+ struct rtw89_hal *hal = &rtwdev->hal;
+ s32 cfg;
- if (!tas->enable || src == RTW89_SAR_SOURCE_NONE)
+ if (hal->disabled_dm_bitmap & BIT(RTW89_DM_TAS))
return;
- if (env->ccx_watchdog_result != RTW89_PHY_ENV_MON_IFS_CLM)
+ if (!rtw89_tas_is_active(rtwdev))
return;
- for (i = 0; i < max_nss_num; i++) {
- val = rtw89_phy_read32_mask(rtwdev, txpwr_regs[i].addr,
- txpwr_regs[i].mask);
- tmp = sign_extend32(val, 8);
- if (tmp <= 0)
- return;
- instant_txpwr += tmp;
+ if (!rtw89_tas_query_sar_config(rtwdev, &cfg) || tas->block_regd) {
+ rtw89_tas_state_update(rtwdev, RTW89_TAS_STATE_STATIC_SAR);
+ return;
}
- instant_txpwr /= max_nss_num;
- /* in unit of 0.25 dBm multiply by percentage */
- txpwr = instant_txpwr * env->ifs_clm_tx_ratio;
- tas->total_txpwr += txpwr - tas->txpwr_history[tas->cur_idx];
- tas->txpwr_history[tas->cur_idx] = txpwr;
- rtw89_debug(rtwdev, RTW89_DBG_SAR,
- "instant_txpwr: %d, tx_ratio: %d, txpwr: %d\n",
- instant_txpwr, env->ifs_clm_tx_ratio, txpwr);
+ if (tas->pause)
+ return;
- tas->cur_idx = (tas->cur_idx + 1) % RTW89_TAS_MAX_WINDOW;
+ rtw89_tas_window_update(rtwdev);
+ rtw89_tas_history_update(rtwdev);
+ rtw89_tas_rolling_average(rtwdev);
+}
- rtw89_tas_state_update(rtwdev);
+void rtw89_tas_scan(struct rtw89_dev *rtwdev, bool start)
+{
+ struct rtw89_tas_info *tas = &rtwdev->tas;
+ s32 cfg;
+
+ if (!rtw89_tas_is_active(rtwdev))
+ return;
+
+ if (!rtw89_tas_query_sar_config(rtwdev, &cfg))
+ return;
+
+ if (start) {
+ tas->backup_state = tas->state;
+ rtw89_tas_state_update(rtwdev, RTW89_TAS_STATE_STATIC_SAR);
+ } else {
+ rtw89_tas_state_update(rtwdev, tas->backup_state);
+ }
+}
+
+void rtw89_tas_chanctx_cb(struct rtw89_dev *rtwdev,
+ enum rtw89_chanctx_state state)
+{
+ struct rtw89_tas_info *tas = &rtwdev->tas;
+ s32 cfg;
+
+ if (!rtw89_tas_is_active(rtwdev))
+ return;
+
+ if (!rtw89_tas_query_sar_config(rtwdev, &cfg))
+ return;
+
+ switch (state) {
+ case RTW89_CHANCTX_STATE_MCC_START:
+ tas->pause = true;
+ rtw89_tas_state_update(rtwdev, RTW89_TAS_STATE_STATIC_SAR);
+ break;
+ case RTW89_CHANCTX_STATE_MCC_STOP:
+ tas->pause = false;
+ break;
+ default:
+ break;
+ }
}
+EXPORT_SYMBOL(rtw89_tas_chanctx_cb);
diff --git a/drivers/net/wireless/realtek/rtw89/sar.h b/drivers/net/wireless/realtek/rtw89/sar.h
index 4ae081d2d3b4..0df1661db9a8 100644
--- a/drivers/net/wireless/realtek/rtw89/sar.h
+++ b/drivers/net/wireless/realtek/rtw89/sar.h
@@ -19,12 +19,16 @@ struct rtw89_sar_handler {
extern const struct cfg80211_sar_capa rtw89_sar_capa;
s8 rtw89_query_sar(struct rtw89_dev *rtwdev, u32 center_freq);
-void rtw89_print_sar(struct seq_file *m, struct rtw89_dev *rtwdev, u32 center_freq);
-void rtw89_print_tas(struct seq_file *m, struct rtw89_dev *rtwdev);
+int rtw89_print_sar(struct rtw89_dev *rtwdev, char *buf, size_t bufsz,
+ u32 center_freq);
+int rtw89_print_tas(struct rtw89_dev *rtwdev, char *buf, size_t bufsz);
int rtw89_ops_set_sar_specs(struct ieee80211_hw *hw,
const struct cfg80211_sar_specs *sar);
void rtw89_tas_init(struct rtw89_dev *rtwdev);
-void rtw89_tas_reset(struct rtw89_dev *rtwdev);
+void rtw89_tas_reset(struct rtw89_dev *rtwdev, bool force);
void rtw89_tas_track(struct rtw89_dev *rtwdev);
+void rtw89_tas_scan(struct rtw89_dev *rtwdev, bool start);
+void rtw89_tas_chanctx_cb(struct rtw89_dev *rtwdev,
+ enum rtw89_chanctx_state state);
#endif
diff --git a/drivers/net/wireless/realtek/rtw89/ser.c b/drivers/net/wireless/realtek/rtw89/ser.c
index 26a944d3b672..0740e303680c 100644
--- a/drivers/net/wireless/realtek/rtw89/ser.c
+++ b/drivers/net/wireless/realtek/rtw89/ser.c
@@ -156,9 +156,9 @@ static void ser_state_run(struct rtw89_ser *ser, u8 evt)
rtw89_debug(rtwdev, RTW89_DBG_SER, "ser: %s receive %s\n",
ser_st_name(ser), ser_ev_name(ser, evt));
- mutex_lock(&rtwdev->mutex);
+ wiphy_lock(rtwdev->hw->wiphy);
rtw89_leave_lps(rtwdev);
- mutex_unlock(&rtwdev->mutex);
+ wiphy_unlock(rtwdev->hw->wiphy);
ser->st_tbl[ser->state].st_func(ser, evt);
}
@@ -483,10 +483,13 @@ static void ser_l1_reset_pre_st_hdl(struct rtw89_ser *ser, u8 evt)
static void ser_reset_trx_st_hdl(struct rtw89_ser *ser, u8 evt)
{
struct rtw89_dev *rtwdev = container_of(ser, struct rtw89_dev, ser);
+ struct wiphy *wiphy = rtwdev->hw->wiphy;
switch (evt) {
case SER_EV_STATE_IN:
- cancel_delayed_work_sync(&rtwdev->track_work);
+ wiphy_lock(wiphy);
+ wiphy_delayed_work_cancel(wiphy, &rtwdev->track_work);
+ wiphy_unlock(wiphy);
drv_stop_tx(ser);
if (hal_stop_dma(ser)) {
@@ -517,8 +520,8 @@ static void ser_reset_trx_st_hdl(struct rtw89_ser *ser, u8 evt)
hal_enable_dma(ser);
drv_resume_rx(ser);
drv_resume_tx(ser);
- ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->track_work,
- RTW89_TRACK_WORK_PERIOD);
+ wiphy_delayed_work_queue(wiphy, &rtwdev->track_work,
+ RTW89_TRACK_WORK_PERIOD);
break;
default:
@@ -708,9 +711,9 @@ static void ser_l2_reset_st_hdl(struct rtw89_ser *ser, u8 evt)
switch (evt) {
case SER_EV_STATE_IN:
- mutex_lock(&rtwdev->mutex);
+ wiphy_lock(rtwdev->hw->wiphy);
ser_l2_reset_st_pre_hdl(ser);
- mutex_unlock(&rtwdev->mutex);
+ wiphy_unlock(rtwdev->hw->wiphy);
ieee80211_restart_hw(rtwdev->hw);
ser_set_alarm(ser, SER_RECFG_TIMEOUT, SER_EV_L2_RECFG_TIMEOUT);
diff --git a/drivers/net/wireless/realtek/rtw89/util.c b/drivers/net/wireless/realtek/rtw89/util.c
index e71956ce9853..073714db26f2 100644
--- a/drivers/net/wireless/realtek/rtw89/util.c
+++ b/drivers/net/wireless/realtek/rtw89/util.c
@@ -4,103 +4,159 @@
#include "util.h"
-#define FRAC_ROWS 3
-#define FRAC_ROW_MAX (FRAC_ROWS - 1)
-#define NORM_ROW_MIN FRAC_ROWS
-
-static const u32 db_invert_table[12][8] = {
- /* rows 0~2 in unit of U(32,3) */
- {10, 13, 16, 20, 25, 32, 40, 50},
- {64, 80, 101, 128, 160, 201, 256, 318},
- {401, 505, 635, 800, 1007, 1268, 1596, 2010},
- /* rows 3~11 in unit of U(32,0) */
- {316, 398, 501, 631, 794, 1000, 1259, 1585},
- {1995, 2512, 3162, 3981, 5012, 6310, 7943, 10000},
- {12589, 15849, 19953, 25119, 31623, 39811, 50119, 63098},
- {79433, 100000, 125893, 158489, 199526, 251189, 316228, 398107},
- {501187, 630957, 794328, 1000000, 1258925, 1584893, 1995262, 2511886},
- {3162278, 3981072, 5011872, 6309573, 7943282, 1000000, 12589254,
- 15848932},
- {19952623, 25118864, 31622777, 39810717, 50118723, 63095734, 79432823,
- 100000000},
- {125892541, 158489319, 199526232, 251188643, 316227766, 398107171,
- 501187234, 630957345},
- {794328235, 1000000000, 1258925412, 1584893192, 1995262315, 2511886432U,
- 3162277660U, 3981071706U},
+#define RTW89_DBM_QUARTER_FACTOR 2
+#define RTW89_MIN_DBM (-41.25 * (1 << RTW89_DBM_QUARTER_FACTOR))
+#define RTW89_MAX_DBM (96 * (1 << RTW89_DBM_QUARTER_FACTOR))
+#define RTW89_DB_INVERT_TABLE_OFFSET (-RTW89_MIN_DBM)
+
+static const u64 db_invert_table[] = {
+ /* in unit of 0.000001 */
+ 75, 79, 84, 89, 94, 100, 106, 112, 119, 126, 133, 141, 150, 158, 168, 178, 188,
+ 200, 211, 224, 237, 251, 266, 282, 299, 316, 335, 355, 376, 398, 422, 447, 473,
+ 501, 531, 562, 596, 631, 668, 708, 750, 794, 841, 891, 944, 1000, 1059, 1122, 1189,
+ 1259, 1334, 1413, 1496, 1585, 1679, 1778, 1884, 1995, 2113, 2239, 2371, 2512, 2661,
+ 2818, 2985, 3162, 3350, 3548, 3758, 3981, 4217, 4467, 4732, 5012, 5309, 5623, 5957,
+ 6310, 6683, 7079, 7499, 7943, 8414, 8913, 9441, 10000, 10593, 11220, 11885, 12589,
+ 13335, 14125, 14962, 15849, 16788, 17783, 18836, 19953, 21135, 22387, 23714, 25119,
+ 26607, 28184, 29854, 31623, 33497, 35481, 37584, 39811, 42170, 44668, 47315, 50119,
+ 53088, 56234, 59566, 63096, 66834, 70795, 74989, 79433, 84140, 89125, 94406, 100000,
+ 105925, 112202, 118850, 125893, 133352, 141254, 149624, 158489, 167880, 177828,
+ 188365, 199526, 211349, 223872, 237137, 251189, 266073, 281838, 298538, 316228,
+ 334965, 354813, 375837, 398107, 421697, 446684, 473151, 501187, 530884, 562341,
+ 595662, 630957, 668344, 707946, 749894, 794328, 841395, 891251, 944061, 1000000,
+ 1059254, 1122018, 1188502, 1258925, 1333521, 1412538, 1496236, 1584893, 1678804,
+ 1778279, 1883649, 1995262, 2113489, 2238721, 2371374, 2511886, 2660725, 2818383,
+ 2985383, 3162278, 3349654, 3548134, 3758374, 3981072, 4216965, 4466836, 4731513,
+ 5011872, 5308844, 5623413, 5956621, 6309573, 6683439, 7079458, 7498942, 7943282,
+ 8413951, 8912509, 9440609, 10000000, 10592537, 11220185, 11885022, 12589254,
+ 13335214, 14125375, 14962357, 15848932, 16788040, 17782794, 18836491, 19952623,
+ 21134890, 22387211, 23713737, 25118864, 26607251, 28183829, 29853826, 31622777,
+ 33496544, 35481339, 37583740, 39810717, 42169650, 44668359, 47315126, 50118723,
+ 53088444, 56234133, 59566214, 63095734, 66834392, 70794578, 74989421, 79432823,
+ 84139514, 89125094, 94406088, 100000000, 105925373, 112201845, 118850223, 125892541,
+ 133352143, 141253754, 149623566, 158489319, 167880402, 177827941, 188364909, 199526231,
+ 211348904, 223872114, 237137371, 251188643, 266072506, 281838293, 298538262, 316227766,
+ 334965439, 354813389, 375837404, 398107171, 421696503, 446683592, 473151259, 501187234,
+ 530884444, 562341325, 595662144, 630957344, 668343918, 707945784, 749894209, 794328235,
+ 841395142, 891250938, 944060876, 1000000000, 1059253725, 1122018454, 1188502227,
+ 1258925412, 1333521432, 1412537545, 1496235656, 1584893192, 1678804018, 1778279410,
+ 1883649089, 1995262315, 2113489040, 2238721139, 2371373706, 2511886432, 2660725060,
+ 2818382931, 2985382619, 3162277660, 3349654392, 3548133892, 3758374043, 3981071706,
+ 4216965034, 4466835922ULL, 4731512590ULL, 5011872336ULL, 5308844442ULL, 5623413252ULL,
+ 5956621435ULL, 6309573445ULL, 6683439176ULL, 7079457844ULL, 7498942093ULL,
+ 7943282347ULL, 8413951416ULL, 8912509381ULL, 9440608763ULL, 10000000000ULL,
+ 10592537252ULL, 11220184543ULL, 11885022274ULL, 12589254118ULL, 13335214322ULL,
+ 14125375446ULL, 14962356561ULL, 15848931925ULL, 16788040181ULL, 17782794100ULL,
+ 18836490895ULL, 19952623150ULL, 21134890398ULL, 22387211386ULL, 23713737057ULL,
+ 25118864315ULL, 26607250598ULL, 28183829313ULL, 29853826189ULL, 31622776602ULL,
+ 33496543916ULL, 35481338923ULL, 37583740429ULL, 39810717055ULL, 42169650343ULL,
+ 44668359215ULL, 47315125896ULL, 50118723363ULL, 53088444423ULL, 56234132519ULL,
+ 59566214353ULL, 63095734448ULL, 66834391757ULL, 70794578438ULL, 74989420933ULL,
+ 79432823472ULL, 84139514165ULL, 89125093813ULL, 94406087629ULL, 100000000000ULL,
+ 105925372518ULL, 112201845430ULL, 118850222744ULL, 125892541179ULL, 133352143216ULL,
+ 141253754462ULL, 149623565609ULL, 158489319246ULL, 167880401812ULL, 177827941004ULL,
+ 188364908949ULL, 199526231497ULL, 211348903984ULL, 223872113857ULL, 237137370566ULL,
+ 251188643151ULL, 266072505980ULL, 281838293126ULL, 298538261892ULL, 316227766017ULL,
+ 334965439158ULL, 354813389234ULL, 375837404288ULL, 398107170553ULL, 421696503429ULL,
+ 446683592151ULL, 473151258961ULL, 501187233627ULL, 530884444231ULL, 562341325190ULL,
+ 595662143529ULL, 630957344480ULL, 668343917569ULL, 707945784384ULL, 749894209332ULL,
+ 794328234724ULL, 841395141645ULL, 891250938134ULL, 944060876286ULL, 1000000000000ULL,
+ 1059253725177ULL, 1122018454302ULL, 1188502227437ULL, 1258925411794ULL,
+ 1333521432163ULL, 1412537544623ULL, 1496235656094ULL, 1584893192461ULL,
+ 1678804018123ULL, 1778279410039ULL, 1883649089490ULL, 1995262314969ULL,
+ 2113489039837ULL, 2238721138568ULL, 2371373705662ULL, 2511886431510ULL,
+ 2660725059799ULL, 2818382931264ULL, 2985382618918ULL, 3162277660168ULL,
+ 3349654391578ULL, 3548133892336ULL, 3758374042884ULL, 3981071705535ULL,
+ 4216965034286ULL, 4466835921510ULL, 4731512589615ULL, 5011872336273ULL,
+ 5308844442310ULL, 5623413251904ULL, 5956621435290ULL, 6309573444802ULL,
+ 6683439175686ULL, 7079457843841ULL, 7498942093325ULL, 7943282347243ULL,
+ 8413951416452ULL, 8912509381337ULL, 9440608762859ULL, 10000000000000ULL,
+ 10592537251773ULL, 11220184543020ULL, 11885022274370ULL, 12589254117942ULL,
+ 13335214321633ULL, 14125375446228ULL, 14962356560944ULL, 15848931924611ULL,
+ 16788040181226ULL, 17782794100389ULL, 18836490894898ULL, 19952623149689ULL,
+ 21134890398367ULL, 22387211385683ULL, 23713737056617ULL, 25118864315096ULL,
+ 26607250597988ULL, 28183829312645ULL, 29853826189180ULL, 31622776601684ULL,
+ 33496543915783ULL, 35481338923358ULL, 37583740428845ULL, 39810717055350ULL,
+ 42169650342858ULL, 44668359215096ULL, 47315125896148ULL, 50118723362727ULL,
+ 53088444423099ULL, 56234132519035ULL, 59566214352901ULL, 63095734448019ULL,
+ 66834391756862ULL, 70794578438414ULL, 74989420933246ULL, 79432823472428ULL,
+ 84139514164520ULL, 89125093813375ULL, 94406087628593ULL, 100000000000000ULL,
+ 105925372517729ULL, 112201845430197ULL, 118850222743702ULL, 125892541179417ULL,
+ 133352143216332ULL, 141253754462276ULL, 149623565609444ULL, 158489319246111ULL,
+ 167880401812256ULL, 177827941003893ULL, 188364908948981ULL, 199526231496888ULL,
+ 211348903983664ULL, 223872113856834ULL, 237137370566166ULL, 251188643150958ULL,
+ 266072505979882ULL, 281838293126446ULL, 298538261891796ULL, 316227766016838ULL,
+ 334965439157829ULL, 354813389233577ULL, 375837404288444ULL, 398107170553497ULL,
+ 421696503428583ULL, 446683592150964ULL, 473151258961482ULL, 501187233627272ULL,
+ 530884444230989ULL, 562341325190350ULL, 595662143529011ULL, 630957344480196ULL,
+ 668343917568615ULL, 707945784384138ULL, 749894209332456ULL, 794328234724284ULL,
+ 841395141645198ULL, 891250938133745ULL, 944060876285923ULL, 1000000000000000ULL,
+ 1059253725177290ULL, 1122018454301970ULL, 1188502227437020ULL, 1258925411794170ULL,
+ 1333521432163330ULL, 1412537544622760ULL, 1496235656094440ULL, 1584893192461110ULL,
+ 1678804018122560ULL, 1778279410038920ULL, 1883649089489810ULL, 1995262314968890ULL,
+ 2113489039836650ULL, 2238721138568340ULL, 2371373705661660ULL, 2511886431509590ULL,
+ 2660725059798820ULL, 2818382931264460ULL, 2985382618917960ULL, 3162277660168380ULL,
+ 3349654391578280ULL, 3548133892335770ULL, 3758374042884440ULL, 3981071705534970ULL
};
-u32 rtw89_linear_2_db(u64 val)
+s32 rtw89_linear_to_db_quarter(u64 val)
{
- u8 i, j;
- u32 dB;
-
- for (i = 0; i < 12; i++) {
- for (j = 0; j < 8; j++) {
- if (i <= FRAC_ROW_MAX &&
- (val << RTW89_LINEAR_FRAC_BITS) <= db_invert_table[i][j])
- goto cnt;
- else if (i > FRAC_ROW_MAX && val <= db_invert_table[i][j])
- goto cnt;
- }
- }
+ int r = ARRAY_SIZE(db_invert_table) - 1;
+ int l = 0;
+ int m;
- return 96; /* maximum 96 dB */
+ while (l <= r) {
+ m = l + (r - l) / 2;
-cnt:
- /* special cases */
- if (j == 0 && i == 0)
- goto end;
+ if (db_invert_table[m] == val)
+ return m - (s32)RTW89_DB_INVERT_TABLE_OFFSET;
- if (i == NORM_ROW_MIN && j == 0) {
- if (db_invert_table[NORM_ROW_MIN][0] - val >
- val - (db_invert_table[FRAC_ROW_MAX][7] >> RTW89_LINEAR_FRAC_BITS)) {
- i = FRAC_ROW_MAX;
- j = 7;
- }
- goto end;
+ if (db_invert_table[m] > val)
+ r = m - 1;
+ else
+ l = m + 1;
}
- if (i <= FRAC_ROW_MAX)
- val <<= RTW89_LINEAR_FRAC_BITS;
-
- /* compare difference to get precise dB */
- if (j == 0) {
- if (db_invert_table[i][j] - val >
- val - db_invert_table[i - 1][7]) {
- i--;
- j = 7;
- }
- } else {
- if (db_invert_table[i][j] - val >
- val - db_invert_table[i][j - 1]) {
- j--;
- }
- }
-end:
- dB = (i << 3) + j + 1;
+ if (l >= ARRAY_SIZE(db_invert_table))
+ return RTW89_MAX_DBM;
+ else if (r < 0)
+ return RTW89_MIN_DBM;
+ else if (val - db_invert_table[r] <= db_invert_table[l] - val)
+ return r - (s32)RTW89_DB_INVERT_TABLE_OFFSET;
+ else
+ return l - (s32)RTW89_DB_INVERT_TABLE_OFFSET;
+}
+EXPORT_SYMBOL(rtw89_linear_to_db_quarter);
- return dB;
+s32 rtw89_linear_to_db(u64 val)
+{
+ return rtw89_linear_to_db_quarter(val) >> RTW89_DBM_QUARTER_FACTOR;
}
-EXPORT_SYMBOL(rtw89_linear_2_db);
+EXPORT_SYMBOL(rtw89_linear_to_db);
-u64 rtw89_db_2_linear(u32 db)
+u64 rtw89_db_quarter_to_linear(s32 db)
{
- u64 linear;
- u8 i, j;
+ /* supported range -41.25 to 96 dBm, in unit of 0.25 dBm */
+ db = clamp_t(s32, db, RTW89_MIN_DBM, RTW89_MAX_DBM);
+ db += (s32)RTW89_DB_INVERT_TABLE_OFFSET;
- if (db > 96)
- db = 96;
- else if (db < 1)
- return 1;
+ return db_invert_table[db];
+}
+EXPORT_SYMBOL(rtw89_db_quarter_to_linear);
- i = (db - 1) >> 3;
- j = (db - 1) & 0x7;
+u64 rtw89_db_to_linear(s32 db)
+{
+ return rtw89_db_quarter_to_linear(db << RTW89_DBM_QUARTER_FACTOR);
+}
+EXPORT_SYMBOL(rtw89_db_to_linear);
- linear = db_invert_table[i][j];
+void rtw89_might_trailing_ellipsis(char *buf, size_t size, ssize_t used)
+{
+ static const char ellipsis[] = "...";
- if (i >= NORM_ROW_MIN)
- linear = linear << RTW89_LINEAR_FRAC_BITS;
+ /* length of null terminiator isn't included in 'used' */
+ if (used + 1 < size || size < sizeof(ellipsis))
+ return;
- return linear;
+ memcpy(buf + size - sizeof(ellipsis), ellipsis, sizeof(ellipsis));
}
-EXPORT_SYMBOL(rtw89_db_2_linear);
diff --git a/drivers/net/wireless/realtek/rtw89/util.h b/drivers/net/wireless/realtek/rtw89/util.h
index e669544cafd3..bd08495301e4 100644
--- a/drivers/net/wireless/realtek/rtw89/util.h
+++ b/drivers/net/wireless/realtek/rtw89/util.h
@@ -6,13 +6,11 @@
#include "core.h"
-#define RTW89_LINEAR_FRAC_BITS 3
-
#define rtw89_iterate_vifs_bh(rtwdev, iterator, data) \
ieee80211_iterate_active_interfaces_atomic((rtwdev)->hw, \
IEEE80211_IFACE_ITER_NORMAL, iterator, data)
-/* call this function with rtwdev->mutex is held */
+/* call this function with wiphy mutex is held */
#define rtw89_for_each_rtwvif(rtwdev, rtwvif) \
list_for_each_entry(rtwvif, &(rtwdev)->rtwvifs_list, list)
@@ -25,7 +23,7 @@ static inline bool rtw89_rtwvif_in_list(struct rtw89_dev *rtwdev,
{
struct rtw89_vif *rtwvif;
- lockdep_assert_held(&rtwdev->mutex);
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
rtw89_for_each_rtwvif(rtwdev, rtwvif)
if (rtwvif == new)
@@ -75,7 +73,10 @@ static inline void ether_addr_copy_mask(u8 *dst, const u8 *src, u8 mask)
}
}
-u32 rtw89_linear_2_db(u64 linear);
-u64 rtw89_db_2_linear(u32 db);
+s32 rtw89_linear_to_db_quarter(u64 val);
+s32 rtw89_linear_to_db(u64 val);
+u64 rtw89_db_quarter_to_linear(s32 db);
+u64 rtw89_db_to_linear(s32 db);
+void rtw89_might_trailing_ellipsis(char *buf, size_t size, ssize_t used);
#endif
diff --git a/drivers/net/wireless/realtek/rtw89/wow.c b/drivers/net/wireless/realtek/rtw89/wow.c
index 01754d031bb4..17eee58503cb 100644
--- a/drivers/net/wireless/realtek/rtw89/wow.c
+++ b/drivers/net/wireless/realtek/rtw89/wow.c
@@ -604,6 +604,8 @@ static struct ieee80211_key_conf *rtw89_wow_gtk_rekey(struct rtw89_dev *rtwdev,
struct ieee80211_key_conf *key;
u8 sz;
+ lockdep_assert_wiphy(rtwdev->hw->wiphy);
+
cipher_info = rtw89_cipher_alg_recognize(cipher);
sz = struct_size(rekey_conf, key, cipher_info->len);
rekey_conf = kmalloc(sz, GFP_KERNEL);
@@ -616,15 +618,10 @@ static struct ieee80211_key_conf *rtw89_wow_gtk_rekey(struct rtw89_dev *rtwdev,
memcpy(rekey_conf->key, gtk,
flex_array_size(rekey_conf, key, cipher_info->len));
- /* ieee80211_gtk_rekey_add() will call set_key(), therefore we
- * need to unlock mutex
- */
- mutex_unlock(&rtwdev->mutex);
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);
if (IS_ERR(key)) {