Kalle Valo says:
authorJakub Kicinski <kuba@kernel.org>
Sat, 29 Oct 2022 01:31:39 +0000 (18:31 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 29 Oct 2022 01:31:40 +0000 (18:31 -0700)
====================
pull-request: wireless-next-2022-10-28

First set of patches v6.2. mac80211 refactoring continues for Wi-Fi 7.
All mac80211 driver are now converted to use internal TX queues, this
might cause some regressions so we wanted to do this early in the
cycle.

Note: wireless tree was merged[1] to wireless-next to avoid some
conflicts with mac80211 patches between the trees. Unfortunately there
are still two smaller conflicts in net/mac80211/util.c which Stephen
also reported[2]. In the first conflict initialise scratch_len to
"params->scratch_len ?: 3 * params->len" (note number 3, not 2!) and
in the second conflict take the version which uses elems->scratch_pos.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git/commit/?id=dfd2d876b3fda1790bc0239ba4c6967e25d16e91
[2] https://lore.kernel.org/all/20221020032340.5cf101c0@canb.auug.org.au/

mac80211
 - preparation for Wi-Fi 7 Multi-Link Operation (MLO) continues
 - add API to show the link STAs in debugfs
 - all mac80211 drivers are now using mac80211 internal TX queues (iTXQs)

rtw89
 - support 8852BE

rtl8xxxu
 - support RTL8188FU

brmfmac
 - support two station interfaces concurrently

bcma
 - support SPROM rev 11
====================

Link: https://lore.kernel.org/r/20221028132943.304ECC433B5@smtp.kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
122 files changed:
drivers/bcma/driver_gpio.c
drivers/bcma/sprom.c
drivers/net/wireless/admtek/adm8211.c
drivers/net/wireless/ath/ar5523/ar5523.c
drivers/net/wireless/ath/ath11k/mac.c
drivers/net/wireless/ath/ath5k/mac80211-ops.c
drivers/net/wireless/ath/ath9k/htc_drv_main.c
drivers/net/wireless/ath/carl9170/main.c
drivers/net/wireless/ath/wcn36xx/main.c
drivers/net/wireless/atmel/at76c50x-usb.c
drivers/net/wireless/atmel/atmel.c
drivers/net/wireless/broadcom/b43/main.c
drivers/net/wireless/broadcom/b43legacy/main.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
drivers/net/wireless/intel/iwlegacy/3945-mac.c
drivers/net/wireless/intel/iwlegacy/4965-mac.c
drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c
drivers/net/wireless/intersil/p54/main.c
drivers/net/wireless/mac80211_hwsim.c
drivers/net/wireless/marvell/libertas_tf/main.c
drivers/net/wireless/marvell/mwl8k.c
drivers/net/wireless/mediatek/mt7601u/main.c
drivers/net/wireless/purelifi/plfxlc/mac.c
drivers/net/wireless/ralink/rt2x00/rt2400pci.c
drivers/net/wireless/ralink/rt2x00/rt2500pci.c
drivers/net/wireless/ralink/rt2x00/rt2500usb.c
drivers/net/wireless/ralink/rt2x00/rt2800pci.c
drivers/net/wireless/ralink/rt2x00/rt2800soc.c
drivers/net/wireless/ralink/rt2x00/rt2800usb.c
drivers/net/wireless/ralink/rt2x00/rt61pci.c
drivers/net/wireless/ralink/rt2x00/rt73usb.c
drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c
drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c
drivers/net/wireless/realtek/rtl8xxxu/Kconfig
drivers/net/wireless/realtek/rtl8xxxu/Makefile
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c [new file with mode: 0644]
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192c.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
drivers/net/wireless/realtek/rtlwifi/core.c
drivers/net/wireless/realtek/rtw89/Kconfig
drivers/net/wireless/realtek/rtw89/Makefile
drivers/net/wireless/realtek/rtw89/coex.c
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/debug.c
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/fw.h
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/phy.c
drivers/net/wireless/realtek/rtw89/phy.h
drivers/net/wireless/realtek/rtw89/reg.h
drivers/net/wireless/realtek/rtw89/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852a.h
drivers/net/wireless/realtek/rtw89/rtw8852b.c
drivers/net/wireless/realtek/rtw89/rtw8852b.h [new file with mode: 0644]
drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c [new file with mode: 0644]
drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.h [new file with mode: 0644]
drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.c [new file with mode: 0644]
drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.h [new file with mode: 0644]
drivers/net/wireless/realtek/rtw89/rtw8852b_table.c [new file with mode: 0644]
drivers/net/wireless/realtek/rtw89/rtw8852b_table.h [new file with mode: 0644]
drivers/net/wireless/realtek/rtw89/rtw8852be.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c
drivers/net/wireless/realtek/rtw89/rtw8852c.h
drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c
drivers/net/wireless/realtek/rtw89/rtw8852c_table.c
drivers/net/wireless/rsi/rsi_91x_mac80211.c
drivers/net/wireless/silabs/wfx/main.c
drivers/net/wireless/st/cw1200/main.c
drivers/net/wireless/ti/wl1251/main.c
drivers/net/wireless/ti/wlcore/main.c
drivers/net/wireless/zydas/zd1211rw/zd_mac.c
drivers/staging/vt6655/device_main.c
drivers/staging/vt6656/main_usb.c
include/linux/ieee80211.h
include/net/cfg80211.h
include/net/mac80211.h
include/uapi/linux/nl80211.h
net/mac80211/agg-rx.c
net/mac80211/agg-tx.c
net/mac80211/cfg.c
net/mac80211/debugfs.c
net/mac80211/debugfs_netdev.c
net/mac80211/debugfs_sta.c
net/mac80211/debugfs_sta.h
net/mac80211/driver-ops.c
net/mac80211/driver-ops.h
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/link.c
net/mac80211/main.c
net/mac80211/mlme.c
net/mac80211/rc80211_minstrel_ht.c
net/mac80211/rc80211_minstrel_ht.h
net/mac80211/rx.c
net/mac80211/sta_info.c
net/mac80211/sta_info.h
net/mac80211/tdls.c
net/mac80211/tx.c
net/mac80211/util.c
net/mac80211/wme.c
net/mac80211/wme.h
net/wireless/core.h
net/wireless/mlme.c
net/wireless/nl80211.c
net/wireless/nl80211.h
net/wireless/sme.c
net/wireless/util.c

index 65fb9bad1577aaea2065e96bd6d78edefb9a1689..5f90bac6bb09e97c8ab1642f2747d34ae37f855e 100644 (file)
@@ -82,6 +82,7 @@ static void bcma_gpio_irq_unmask(struct irq_data *d)
        int gpio = irqd_to_hwirq(d);
        u32 val = bcma_chipco_gpio_in(cc, BIT(gpio));
 
+       gpiochip_enable_irq(gc, gpio);
        bcma_chipco_gpio_polarity(cc, BIT(gpio), val);
        bcma_chipco_gpio_intmask(cc, BIT(gpio), BIT(gpio));
 }
@@ -93,12 +94,15 @@ static void bcma_gpio_irq_mask(struct irq_data *d)
        int gpio = irqd_to_hwirq(d);
 
        bcma_chipco_gpio_intmask(cc, BIT(gpio), 0);
+       gpiochip_disable_irq(gc, gpio);
 }
 
-static struct irq_chip bcma_gpio_irq_chip = {
+static const struct irq_chip bcma_gpio_irq_chip = {
        .name           = "BCMA-GPIO",
        .irq_mask       = bcma_gpio_irq_mask,
        .irq_unmask     = bcma_gpio_irq_unmask,
+       .flags          = IRQCHIP_IMMUTABLE,
+       GPIOCHIP_IRQ_RESOURCE_HELPERS,
 };
 
 static irqreturn_t bcma_gpio_irq_handler(int irq, void *dev_id)
@@ -139,7 +143,7 @@ static int bcma_gpio_irq_init(struct bcma_drv_cc *cc)
        bcma_chipco_gpio_intmask(cc, ~0, 0);
        bcma_cc_set32(cc, BCMA_CC_IRQMASK, BCMA_CC_IRQ_GPIO);
 
-       girq->chip = &bcma_gpio_irq_chip;
+       gpio_irq_chip_set_chip(girq, &bcma_gpio_irq_chip);
        /* This will let us handle the parent IRQ in the driver */
        girq->parent_handler = NULL;
        girq->num_parents = 0;
index 3da01f173c63745a2fab261b5e1d6a08fb01fd3a..e668ad7963fc258476e21367acfc7da3f920deee 100644 (file)
@@ -165,7 +165,7 @@ static int bcma_sprom_valid(struct bcma_bus *bus, const u16 *sprom,
                return err;
 
        revision = sprom[words - 1] & SSB_SPROM_REVISION_REV;
-       if (revision != 8 && revision != 9 && revision != 10) {
+       if (revision < 8 || revision > 11) {
                pr_err("Unsupported SPROM revision: %d\n", revision);
                return -ENOENT;
        }
index 6bee16b207d1fff8136c2856ef9a2ea49a48468d..2fceea9f655071eed4a069fa65fdee8f67776dbd 100644 (file)
@@ -1760,6 +1760,7 @@ static int adm8211_alloc_rings(struct ieee80211_hw *dev)
 
 static const struct ieee80211_ops adm8211_ops = {
        .tx                     = adm8211_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = adm8211_start,
        .stop                   = adm8211_stop,
        .add_interface          = adm8211_add_interface,
index 6f937d2cc1263e7c73ca6ddc2c2c8b5dcfdd8b09..a184c09d2f0fc9a8ee67a6345634ba6fae97b1fd 100644 (file)
@@ -1355,6 +1355,7 @@ static const struct ieee80211_ops ar5523_ops = {
        .start                  = ar5523_start,
        .stop                   = ar5523_stop,
        .tx                     = ar5523_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .set_rts_threshold      = ar5523_set_rts_threshold,
        .add_interface          = ar5523_add_interface,
        .remove_interface       = ar5523_remove_interface,
index 2d1e3fd9b526c16c190bcc02af249261e624aece..3cbcbb93a1a7a1c6556b15c794f51ad5ea056933 100644 (file)
@@ -8539,6 +8539,7 @@ err_fallback:
 
 static const struct ieee80211_ops ath11k_ops = {
        .tx                             = ath11k_mac_op_tx,
+       .wake_tx_queue                  = ieee80211_handle_wake_tx_queue,
        .start                          = ath11k_mac_op_start,
        .stop                           = ath11k_mac_op_stop,
        .reconfig_complete              = ath11k_mac_op_reconfig_complete,
index ed5d2160a72a2ac43be35ebd5d7403ebac061732..11ed30d6b595a22dc214d7299106f1fa6bad0b3c 100644 (file)
@@ -781,6 +781,7 @@ static int ath5k_set_ringparam(struct ieee80211_hw *hw, u32 tx, u32 rx)
 
 const struct ieee80211_ops ath5k_hw_ops = {
        .tx                     = ath5k_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = ath5k_start,
        .stop                   = ath5k_stop,
        .add_interface          = ath5k_add_interface,
index 61875c45366b74ff4c40ef9a4b7e2d23ab1f43bc..51766de5ec3b687b4588450ef5aeb97733bcd3f0 100644 (file)
@@ -1870,6 +1870,7 @@ static void ath9k_htc_channel_switch_beacon(struct ieee80211_hw *hw,
 
 struct ieee80211_ops ath9k_htc_ops = {
        .tx                 = ath9k_htc_tx,
+       .wake_tx_queue      = ieee80211_handle_wake_tx_queue,
        .start              = ath9k_htc_start,
        .stop               = ath9k_htc_stop,
        .add_interface      = ath9k_htc_add_interface,
index 1540e9827f483f066f42dcf9c77bd9ec98c836c3..524327d24964c1ba25452b06e9ad2589281e18f6 100644 (file)
@@ -1715,6 +1715,7 @@ static const struct ieee80211_ops carl9170_ops = {
        .start                  = carl9170_op_start,
        .stop                   = carl9170_op_stop,
        .tx                     = carl9170_op_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .flush                  = carl9170_op_flush,
        .add_interface          = carl9170_op_add_interface,
        .remove_interface       = carl9170_op_remove_interface,
index 6b8d2889d73f4406fe3b925cd720377ee740ba8c..3b79cc1c7c5b03d006566bd328d0f76c6eddcb87 100644 (file)
@@ -1361,6 +1361,7 @@ static const struct ieee80211_ops wcn36xx_ops = {
        .prepare_multicast      = wcn36xx_prepare_multicast,
        .configure_filter       = wcn36xx_configure_filter,
        .tx                     = wcn36xx_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .set_key                = wcn36xx_set_key,
        .hw_scan                = wcn36xx_hw_scan,
        .cancel_hw_scan         = wcn36xx_cancel_hw_scan,
index 24e609c1f5231f552cf62c43e9f2dba9a15174f4..009bca34ece30ec5dfbdfc1b4c0028d1672971b5 100644 (file)
@@ -2179,6 +2179,7 @@ static int at76_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 
 static const struct ieee80211_ops at76_ops = {
        .tx = at76_mac80211_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .add_interface = at76_add_interface,
        .remove_interface = at76_remove_interface,
        .config = at76_config,
index 45d079b933844a783b4069a959318770a58a9e38..ed430b91e2aaba919a0b2ae17fa5d70a4990e253 100644 (file)
@@ -1643,9 +1643,10 @@ EXPORT_SYMBOL(stop_atmel_card);
 
 static int atmel_set_essid(struct net_device *dev,
                           struct iw_request_info *info,
-                          struct iw_point *dwrq,
+                          union iwreq_data *wrqu,
                           char *extra)
 {
+       struct iw_point *dwrq = &wrqu->essid;
        struct atmel_private *priv = netdev_priv(dev);
 
        /* Check if we asked for `any' */
@@ -1671,9 +1672,10 @@ static int atmel_set_essid(struct net_device *dev,
 
 static int atmel_get_essid(struct net_device *dev,
                           struct iw_request_info *info,
-                          struct iw_point *dwrq,
+                          union iwreq_data *wrqu,
                           char *extra)
 {
+       struct iw_point *dwrq = &wrqu->essid;
        struct atmel_private *priv = netdev_priv(dev);
 
        /* Get the current SSID */
@@ -1692,9 +1694,10 @@ static int atmel_get_essid(struct net_device *dev,
 
 static int atmel_get_wap(struct net_device *dev,
                         struct iw_request_info *info,
-                        struct sockaddr *awrq,
+                        union iwreq_data *wrqu,
                         char *extra)
 {
+       struct sockaddr *awrq = &wrqu->ap_addr;
        struct atmel_private *priv = netdev_priv(dev);
        memcpy(awrq->sa_data, priv->CurrentBSSID, ETH_ALEN);
        awrq->sa_family = ARPHRD_ETHER;
@@ -1704,9 +1707,10 @@ static int atmel_get_wap(struct net_device *dev,
 
 static int atmel_set_encode(struct net_device *dev,
                            struct iw_request_info *info,
-                           struct iw_point *dwrq,
+                           union iwreq_data *wrqu,
                            char *extra)
 {
+       struct iw_point *dwrq = &wrqu->encoding;
        struct atmel_private *priv = netdev_priv(dev);
 
        /* Basic checking: do we have a key to set ?
@@ -1793,9 +1797,10 @@ static int atmel_set_encode(struct net_device *dev,
 
 static int atmel_get_encode(struct net_device *dev,
                            struct iw_request_info *info,
-                           struct iw_point *dwrq,
+                           union iwreq_data *wrqu,
                            char *extra)
 {
+       struct iw_point *dwrq = &wrqu->encoding;
        struct atmel_private *priv = netdev_priv(dev);
        int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
 
@@ -2003,18 +2008,19 @@ static int atmel_get_auth(struct net_device *dev,
 
 static int atmel_get_name(struct net_device *dev,
                          struct iw_request_info *info,
-                         char *cwrq,
+                         union iwreq_data *wrqu,
                          char *extra)
 {
-       strcpy(cwrq, "IEEE 802.11-DS");
+       strcpy(wrqu->name, "IEEE 802.11-DS");
        return 0;
 }
 
 static int atmel_set_rate(struct net_device *dev,
                          struct iw_request_info *info,
-                         struct iw_param *vwrq,
+                         union iwreq_data *wrqu,
                          char *extra)
 {
+       struct iw_param *vwrq = &wrqu->bitrate;
        struct atmel_private *priv = netdev_priv(dev);
 
        if (vwrq->fixed == 0) {
@@ -2053,9 +2059,10 @@ static int atmel_set_rate(struct net_device *dev,
 
 static int atmel_set_mode(struct net_device *dev,
                          struct iw_request_info *info,
-                         __u32 *uwrq,
+                         union iwreq_data *wrqu,
                          char *extra)
 {
+       __u32 *uwrq = &wrqu->mode;
        struct atmel_private *priv = netdev_priv(dev);
 
        if (*uwrq != IW_MODE_ADHOC && *uwrq != IW_MODE_INFRA)
@@ -2067,9 +2074,10 @@ static int atmel_set_mode(struct net_device *dev,
 
 static int atmel_get_mode(struct net_device *dev,
                          struct iw_request_info *info,
-                         __u32 *uwrq,
+                         union iwreq_data *wrqu,
                          char *extra)
 {
+       __u32 *uwrq = &wrqu->mode;
        struct atmel_private *priv = netdev_priv(dev);
 
        *uwrq = priv->operating_mode;
@@ -2078,9 +2086,10 @@ static int atmel_get_mode(struct net_device *dev,
 
 static int atmel_get_rate(struct net_device *dev,
                         struct iw_request_info *info,
-                        struct iw_param *vwrq,
+                        union iwreq_data *wrqu,
                         char *extra)
 {
+       struct iw_param *vwrq = &wrqu->bitrate;
        struct atmel_private *priv = netdev_priv(dev);
 
        if (priv->auto_tx_rate) {
@@ -2108,9 +2117,10 @@ static int atmel_get_rate(struct net_device *dev,
 
 static int atmel_set_power(struct net_device *dev,
                           struct iw_request_info *info,
-                          struct iw_param *vwrq,
+                          union iwreq_data *wrqu,
                           char *extra)
 {
+       struct iw_param *vwrq = &wrqu->power;
        struct atmel_private *priv = netdev_priv(dev);
        priv->power_mode = vwrq->disabled ? 0 : 1;
        return -EINPROGRESS;
@@ -2118,9 +2128,10 @@ static int atmel_set_power(struct net_device *dev,
 
 static int atmel_get_power(struct net_device *dev,
                           struct iw_request_info *info,
-                          struct iw_param *vwrq,
+                          union iwreq_data *wrqu,
                           char *extra)
 {
+       struct iw_param *vwrq = &wrqu->power;
        struct atmel_private *priv = netdev_priv(dev);
        vwrq->disabled = priv->power_mode ? 0 : 1;
        vwrq->flags = IW_POWER_ON;
@@ -2129,9 +2140,10 @@ static int atmel_get_power(struct net_device *dev,
 
 static int atmel_set_retry(struct net_device *dev,
                           struct iw_request_info *info,
-                          struct iw_param *vwrq,
+                          union iwreq_data *wrqu,
                           char *extra)
 {
+       struct iw_param *vwrq = &wrqu->retry;
        struct atmel_private *priv = netdev_priv(dev);
 
        if (!vwrq->disabled && (vwrq->flags & IW_RETRY_LIMIT)) {
@@ -2152,9 +2164,10 @@ static int atmel_set_retry(struct net_device *dev,
 
 static int atmel_get_retry(struct net_device *dev,
                           struct iw_request_info *info,
-                          struct iw_param *vwrq,
+                          union iwreq_data *wrqu,
                           char *extra)
 {
+       struct iw_param *vwrq = &wrqu->retry;
        struct atmel_private *priv = netdev_priv(dev);
 
        vwrq->disabled = 0;      /* Can't be disabled */
@@ -2175,9 +2188,10 @@ static int atmel_get_retry(struct net_device *dev,
 
 static int atmel_set_rts(struct net_device *dev,
                         struct iw_request_info *info,
-                        struct iw_param *vwrq,
+                        union iwreq_data *wrqu,
                         char *extra)
 {
+       struct iw_param *vwrq = &wrqu->rts;
        struct atmel_private *priv = netdev_priv(dev);
        int rthr = vwrq->value;
 
@@ -2193,9 +2207,10 @@ static int atmel_set_rts(struct net_device *dev,
 
 static int atmel_get_rts(struct net_device *dev,
                         struct iw_request_info *info,
-                        struct iw_param *vwrq,
+                        union iwreq_data *wrqu,
                         char *extra)
 {
+       struct iw_param *vwrq = &wrqu->rts;
        struct atmel_private *priv = netdev_priv(dev);
 
        vwrq->value = priv->rts_threshold;
@@ -2207,9 +2222,10 @@ static int atmel_get_rts(struct net_device *dev,
 
 static int atmel_set_frag(struct net_device *dev,
                          struct iw_request_info *info,
-                         struct iw_param *vwrq,
+                         union iwreq_data *wrqu,
                          char *extra)
 {
+       struct iw_param *vwrq = &wrqu->frag;
        struct atmel_private *priv = netdev_priv(dev);
        int fthr = vwrq->value;
 
@@ -2226,9 +2242,10 @@ static int atmel_set_frag(struct net_device *dev,
 
 static int atmel_get_frag(struct net_device *dev,
                          struct iw_request_info *info,
-                         struct iw_param *vwrq,
+                         union iwreq_data *wrqu,
                          char *extra)
 {
+       struct iw_param *vwrq = &wrqu->frag;
        struct atmel_private *priv = netdev_priv(dev);
 
        vwrq->value = priv->frag_threshold;
@@ -2240,9 +2257,10 @@ static int atmel_get_frag(struct net_device *dev,
 
 static int atmel_set_freq(struct net_device *dev,
                          struct iw_request_info *info,
-                         struct iw_freq *fwrq,
+                         union iwreq_data *wrqu,
                          char *extra)
 {
+       struct iw_freq *fwrq = &wrqu->freq;
        struct atmel_private *priv = netdev_priv(dev);
        int rc = -EINPROGRESS;          /* Call commit handler */
 
@@ -2270,9 +2288,10 @@ static int atmel_set_freq(struct net_device *dev,
 
 static int atmel_get_freq(struct net_device *dev,
                          struct iw_request_info *info,
-                         struct iw_freq *fwrq,
+                         union iwreq_data *wrqu,
                          char *extra)
 {
+       struct iw_freq *fwrq = &wrqu->freq;
        struct atmel_private *priv = netdev_priv(dev);
 
        fwrq->m = priv->channel;
@@ -2282,7 +2301,7 @@ static int atmel_get_freq(struct net_device *dev,
 
 static int atmel_set_scan(struct net_device *dev,
                          struct iw_request_info *info,
-                         struct iw_point *dwrq,
+                         union iwreq_data *dwrq,
                          char *extra)
 {
        struct atmel_private *priv = netdev_priv(dev);
@@ -2320,9 +2339,10 @@ static int atmel_set_scan(struct net_device *dev,
 
 static int atmel_get_scan(struct net_device *dev,
                          struct iw_request_info *info,
-                         struct iw_point *dwrq,
+                         union iwreq_data *wrqu,
                          char *extra)
 {
+       struct iw_point *dwrq = &wrqu->data;
        struct atmel_private *priv = netdev_priv(dev);
        int i;
        char *current_ev = extra;
@@ -2391,9 +2411,10 @@ static int atmel_get_scan(struct net_device *dev,
 
 static int atmel_get_range(struct net_device *dev,
                           struct iw_request_info *info,
-                          struct iw_point *dwrq,
+                          union iwreq_data *wrqu,
                           char *extra)
 {
+       struct iw_point *dwrq = &wrqu->data;
        struct atmel_private *priv = netdev_priv(dev);
        struct iw_range *range = (struct iw_range *) extra;
        int k, i, j;
@@ -2465,9 +2486,10 @@ static int atmel_get_range(struct net_device *dev,
 
 static int atmel_set_wap(struct net_device *dev,
                         struct iw_request_info *info,
-                        struct sockaddr *awrq,
+                        union iwreq_data *wrqu,
                         char *extra)
 {
+       struct sockaddr *awrq = &wrqu->ap_addr;
        struct atmel_private *priv = netdev_priv(dev);
        int i;
        static const u8 any[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
@@ -2507,7 +2529,7 @@ static int atmel_set_wap(struct net_device *dev,
 
 static int atmel_config_commit(struct net_device *dev,
                               struct iw_request_info *info,    /* NULL */
-                              void *zwrq,                      /* NULL */
+                              union iwreq_data *zwrq,          /* NULL */
                               char *extra)                     /* NULL */
 {
        return atmel_open(dev);
@@ -2515,66 +2537,40 @@ static int atmel_config_commit(struct net_device *dev,
 
 static const iw_handler atmel_handler[] =
 {
-       (iw_handler) atmel_config_commit,       /* SIOCSIWCOMMIT */
-       (iw_handler) atmel_get_name,            /* SIOCGIWNAME */
-       (iw_handler) NULL,                      /* SIOCSIWNWID */
-       (iw_handler) NULL,                      /* SIOCGIWNWID */
-       (iw_handler) atmel_set_freq,            /* SIOCSIWFREQ */
-       (iw_handler) atmel_get_freq,            /* SIOCGIWFREQ */
-       (iw_handler) atmel_set_mode,            /* SIOCSIWMODE */
-       (iw_handler) atmel_get_mode,            /* SIOCGIWMODE */
-       (iw_handler) NULL,                      /* SIOCSIWSENS */
-       (iw_handler) NULL,                      /* SIOCGIWSENS */
-       (iw_handler) NULL,                      /* SIOCSIWRANGE */
-       (iw_handler) atmel_get_range,           /* SIOCGIWRANGE */
-       (iw_handler) NULL,                      /* SIOCSIWPRIV */
-       (iw_handler) NULL,                      /* SIOCGIWPRIV */
-       (iw_handler) NULL,                      /* SIOCSIWSTATS */
-       (iw_handler) NULL,                      /* SIOCGIWSTATS */
-       (iw_handler) NULL,                      /* SIOCSIWSPY */
-       (iw_handler) NULL,                      /* SIOCGIWSPY */
-       (iw_handler) NULL,                      /* -- hole -- */
-       (iw_handler) NULL,                      /* -- hole -- */
-       (iw_handler) atmel_set_wap,             /* SIOCSIWAP */
-       (iw_handler) atmel_get_wap,             /* SIOCGIWAP */
-       (iw_handler) NULL,                      /* -- hole -- */
-       (iw_handler) NULL,                      /* SIOCGIWAPLIST */
-       (iw_handler) atmel_set_scan,            /* SIOCSIWSCAN */
-       (iw_handler) atmel_get_scan,            /* SIOCGIWSCAN */
-       (iw_handler) atmel_set_essid,           /* SIOCSIWESSID */
-       (iw_handler) atmel_get_essid,           /* SIOCGIWESSID */
-       (iw_handler) NULL,                      /* SIOCSIWNICKN */
-       (iw_handler) NULL,                      /* SIOCGIWNICKN */
-       (iw_handler) NULL,                      /* -- hole -- */
-       (iw_handler) NULL,                      /* -- hole -- */
-       (iw_handler) atmel_set_rate,            /* SIOCSIWRATE */
-       (iw_handler) atmel_get_rate,            /* SIOCGIWRATE */
-       (iw_handler) atmel_set_rts,             /* SIOCSIWRTS */
-       (iw_handler) atmel_get_rts,             /* SIOCGIWRTS */
-       (iw_handler) atmel_set_frag,            /* SIOCSIWFRAG */
-       (iw_handler) atmel_get_frag,            /* SIOCGIWFRAG */
-       (iw_handler) NULL,                      /* SIOCSIWTXPOW */
-       (iw_handler) NULL,                      /* SIOCGIWTXPOW */
-       (iw_handler) atmel_set_retry,           /* SIOCSIWRETRY */
-       (iw_handler) atmel_get_retry,           /* SIOCGIWRETRY */
-       (iw_handler) atmel_set_encode,          /* SIOCSIWENCODE */
-       (iw_handler) atmel_get_encode,          /* SIOCGIWENCODE */
-       (iw_handler) atmel_set_power,           /* SIOCSIWPOWER */
-       (iw_handler) atmel_get_power,           /* SIOCGIWPOWER */
-       (iw_handler) NULL,                      /* -- hole -- */
-       (iw_handler) NULL,                      /* -- hole -- */
-       (iw_handler) NULL,                      /* SIOCSIWGENIE */
-       (iw_handler) NULL,                      /* SIOCGIWGENIE */
-       (iw_handler) atmel_set_auth,            /* SIOCSIWAUTH */
-       (iw_handler) atmel_get_auth,            /* SIOCGIWAUTH */
-       (iw_handler) atmel_set_encodeext,       /* SIOCSIWENCODEEXT */
-       (iw_handler) atmel_get_encodeext,       /* SIOCGIWENCODEEXT */
-       (iw_handler) NULL,                      /* SIOCSIWPMKSA */
+       IW_HANDLER(SIOCSIWCOMMIT,       atmel_config_commit),
+       IW_HANDLER(SIOCGIWNAME,         atmel_get_name),
+       IW_HANDLER(SIOCSIWFREQ,         atmel_set_freq),
+       IW_HANDLER(SIOCGIWFREQ,         atmel_get_freq),
+       IW_HANDLER(SIOCSIWMODE,         atmel_set_mode),
+       IW_HANDLER(SIOCGIWMODE,         atmel_get_mode),
+       IW_HANDLER(SIOCGIWRANGE,        atmel_get_range),
+       IW_HANDLER(SIOCSIWAP,           atmel_set_wap),
+       IW_HANDLER(SIOCGIWAP,           atmel_get_wap),
+       IW_HANDLER(SIOCSIWSCAN,         atmel_set_scan),
+       IW_HANDLER(SIOCGIWSCAN,         atmel_get_scan),
+       IW_HANDLER(SIOCSIWESSID,        atmel_set_essid),
+       IW_HANDLER(SIOCGIWESSID,        atmel_get_essid),
+       IW_HANDLER(SIOCSIWRATE,         atmel_set_rate),
+       IW_HANDLER(SIOCGIWRATE,         atmel_get_rate),
+       IW_HANDLER(SIOCSIWRTS,          atmel_set_rts),
+       IW_HANDLER(SIOCGIWRTS,          atmel_get_rts),
+       IW_HANDLER(SIOCSIWFRAG,         atmel_set_frag),
+       IW_HANDLER(SIOCGIWFRAG,         atmel_get_frag),
+       IW_HANDLER(SIOCSIWRETRY,        atmel_set_retry),
+       IW_HANDLER(SIOCGIWRETRY,        atmel_get_retry),
+       IW_HANDLER(SIOCSIWENCODE,       atmel_set_encode),
+       IW_HANDLER(SIOCGIWENCODE,       atmel_get_encode),
+       IW_HANDLER(SIOCSIWPOWER,        atmel_set_power),
+       IW_HANDLER(SIOCGIWPOWER,        atmel_get_power),
+       IW_HANDLER(SIOCSIWAUTH,         atmel_set_auth),
+       IW_HANDLER(SIOCGIWAUTH,         atmel_get_auth),
+       IW_HANDLER(SIOCSIWENCODEEXT,    atmel_set_encodeext),
+       IW_HANDLER(SIOCGIWENCODEEXT,    atmel_get_encodeext),
 };
 
 static const iw_handler atmel_private_handler[] =
 {
-       NULL,                           /* SIOCIWFIRSTPRIV */
+       IW_HANDLER(SIOCIWFIRSTPRIV,     NULL),
 };
 
 struct atmel_priv_ioctl {
@@ -2614,8 +2610,8 @@ static const struct iw_handler_def atmel_handler_def = {
        .num_standard   = ARRAY_SIZE(atmel_handler),
        .num_private    = ARRAY_SIZE(atmel_private_handler),
        .num_private_args = ARRAY_SIZE(atmel_private_args),
-       .standard       = (iw_handler *) atmel_handler,
-       .private        = (iw_handler *) atmel_private_handler,
+       .standard       = atmel_handler,
+       .private        = atmel_private_handler,
        .private_args   = (struct iw_priv_args *) atmel_private_args,
        .get_wireless_stats = atmel_get_wireless_stats
 };
index b2539a916fd040c7fbe4c877caf33483864261a8..298febbdffc01d054096718ce885691a70970b9a 100644 (file)
@@ -5171,6 +5171,7 @@ static int b43_op_get_survey(struct ieee80211_hw *hw, int idx,
 
 static const struct ieee80211_ops b43_hw_ops = {
        .tx                     = b43_op_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .conf_tx                = b43_op_conf_tx,
        .add_interface          = b43_op_add_interface,
        .remove_interface       = b43_op_remove_interface,
index 4022c544aefe837323fe7bad15a7a6d7053e168b..760136638a95619d8321eb0d3fd454b6d2b0d6c7 100644 (file)
@@ -3532,6 +3532,7 @@ static int b43legacy_op_get_survey(struct ieee80211_hw *hw, int idx,
 
 static const struct ieee80211_ops b43legacy_hw_ops = {
        .tx                     = b43legacy_op_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .conf_tx                = b43legacy_op_conf_tx,
        .add_interface          = b43legacy_op_add_interface,
        .remove_interface       = b43legacy_op_remove_interface,
index 2208ab3aa79598b3d122333b2958c1acc5375f78..60f5645aead3adae8749444096a3c35345ec2825 100644 (file)
 #define BRCMF_NROF_COMMON_MSGRINGS     (BRCMF_NROF_H2D_COMMON_MSGRINGS + \
                                         BRCMF_NROF_D2H_COMMON_MSGRINGS)
 
+/* The interval to poll console */
+#define BRCMF_CONSOLE  10
+
+/* The maximum console interval value (5 mins) */
+#define MAX_CONSOLE_INTERVAL   (5 * 60)
+
 /* The level of bus communication with the dongle */
 enum brcmf_bus_state {
        BRCMF_BUS_DOWN,         /* Not ready for frame transfers */
index dfcfb333336906d9941ad3b968c91dd1519cb7c1..3f2336062217cd890baf1b249b9a1e17c447f341 100644 (file)
 
 #define BRCMF_PS_MAX_TIMEOUT_MS                2000
 
+/* Dump obss definitions */
+#define ACS_MSRMNT_DELAY               80
+#define CHAN_NOISE_DUMMY               (-80)
+#define OBSS_TOKEN_IDX                 15
+#define IBSS_TOKEN_IDX                 15
+#define TX_TOKEN_IDX                   14
+#define CTG_TOKEN_IDX                  13
+#define PKT_TOKEN_IDX                  15
+#define IDLE_TOKEN_IDX                 12
+
 #define BRCMF_ASSOC_PARAMS_FIXED_SIZE \
        (sizeof(struct brcmf_assoc_params_le) - sizeof(u16))
 
+struct brcmf_dump_survey {
+       u32 obss;
+       u32 ibss;
+       u32 no_ctg;
+       u32 no_pckt;
+       u32 tx;
+       u32 idle;
+};
+
+struct cca_stats_n_flags {
+       u32 msrmnt_time; /* Time for Measurement (msec) */
+       u32 msrmnt_done; /* flag set when measurement complete */
+       char buf[1];
+};
+
+struct cca_msrmnt_query {
+       u32 msrmnt_query;
+       u32 time_req;
+};
+
 static bool check_vif_up(struct brcmf_cfg80211_vif *vif)
 {
        if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) {
@@ -234,6 +264,48 @@ struct parsed_vndr_ies {
        struct parsed_vndr_ie_info ie_info[VNDR_IE_PARSE_LIMIT];
 };
 
+#define WL_INTERFACE_CREATE_VER_1              1
+#define WL_INTERFACE_CREATE_VER_2              2
+#define WL_INTERFACE_CREATE_VER_3              3
+#define WL_INTERFACE_CREATE_VER_MAX            WL_INTERFACE_CREATE_VER_3
+
+#define WL_INTERFACE_MAC_DONT_USE      0x0
+#define WL_INTERFACE_MAC_USE           0x2
+
+#define WL_INTERFACE_CREATE_STA                0x0
+#define WL_INTERFACE_CREATE_AP         0x1
+
+struct wl_interface_create_v1 {
+       u16     ver;                    /* structure version */
+       u32     flags;                  /* flags for operation */
+       u8      mac_addr[ETH_ALEN];     /* MAC address */
+       u32     wlc_index;              /* optional for wlc index */
+};
+
+struct wl_interface_create_v2 {
+       u16     ver;                    /* structure version */
+       u8      pad1[2];
+       u32     flags;                  /* flags for operation */
+       u8      mac_addr[ETH_ALEN];     /* MAC address */
+       u8      iftype;                 /* type of interface created */
+       u8      pad2;
+       u32     wlc_index;              /* optional for wlc index */
+};
+
+struct wl_interface_create_v3 {
+       u16 ver;                        /* structure version */
+       u16 len;                        /* length of structure + data */
+       u16 fixed_len;                  /* length of structure */
+       u8 iftype;                      /* type of interface created */
+       u8 wlc_index;                   /* optional for wlc index */
+       u32 flags;                      /* flags for operation */
+       u8 mac_addr[ETH_ALEN];          /* MAC address */
+       u8 bssid[ETH_ALEN];             /* optional for BSSID */
+       u8 if_index;                    /* interface index request */
+       u8 pad[3];
+       u8 data[];                      /* Optional for specific data */
+};
+
 static u8 nl80211_band_to_fwil(enum nl80211_band band)
 {
        switch (band) {
@@ -521,40 +593,228 @@ static int brcmf_get_first_free_bsscfgidx(struct brcmf_pub *drvr)
        return -ENOMEM;
 }
 
+static void brcmf_set_vif_sta_macaddr(struct brcmf_if *ifp, u8 *mac_addr)
+{
+       u8 mac_idx = ifp->drvr->sta_mac_idx;
+
+       /* set difference MAC address with locally administered bit */
+       memcpy(mac_addr, ifp->mac_addr, ETH_ALEN);
+       mac_addr[0] |= 0x02;
+       mac_addr[3] ^= mac_idx ? 0xC0 : 0xA0;
+       mac_idx++;
+       mac_idx = mac_idx % 2;
+       ifp->drvr->sta_mac_idx = mac_idx;
+}
+
+static int brcmf_cfg80211_request_sta_if(struct brcmf_if *ifp, u8 *macaddr)
+{
+       struct wl_interface_create_v1 iface_v1;
+       struct wl_interface_create_v2 iface_v2;
+       struct wl_interface_create_v3 iface_v3;
+       u32 iface_create_ver;
+       int err;
+
+       /* interface_create version 1 */
+       memset(&iface_v1, 0, sizeof(iface_v1));
+       iface_v1.ver = WL_INTERFACE_CREATE_VER_1;
+       iface_v1.flags = WL_INTERFACE_CREATE_STA |
+                        WL_INTERFACE_MAC_USE;
+       if (!is_zero_ether_addr(macaddr))
+               memcpy(iface_v1.mac_addr, macaddr, ETH_ALEN);
+       else
+               brcmf_set_vif_sta_macaddr(ifp, iface_v1.mac_addr);
+
+       err = brcmf_fil_iovar_data_get(ifp, "interface_create",
+                                      &iface_v1,
+                                      sizeof(iface_v1));
+       if (err) {
+               brcmf_info("failed to create interface(v1), err=%d\n",
+                          err);
+       } else {
+               brcmf_dbg(INFO, "interface created(v1)\n");
+               return 0;
+       }
+
+       /* interface_create version 2 */
+       memset(&iface_v2, 0, sizeof(iface_v2));
+       iface_v2.ver = WL_INTERFACE_CREATE_VER_2;
+       iface_v2.flags = WL_INTERFACE_MAC_USE;
+       iface_v2.iftype = WL_INTERFACE_CREATE_STA;
+       if (!is_zero_ether_addr(macaddr))
+               memcpy(iface_v2.mac_addr, macaddr, ETH_ALEN);
+       else
+               brcmf_set_vif_sta_macaddr(ifp, iface_v2.mac_addr);
+
+       err = brcmf_fil_iovar_data_get(ifp, "interface_create",
+                                      &iface_v2,
+                                      sizeof(iface_v2));
+       if (err) {
+               brcmf_info("failed to create interface(v2), err=%d\n",
+                          err);
+       } else {
+               brcmf_dbg(INFO, "interface created(v2)\n");
+               return 0;
+       }
+
+       /* interface_create version 3+ */
+       /* get supported version from firmware side */
+       iface_create_ver = 0;
+       err = brcmf_fil_bsscfg_int_get(ifp, "interface_create",
+                                      &iface_create_ver);
+       if (err) {
+               brcmf_err("fail to get supported version, err=%d\n", err);
+               return -EOPNOTSUPP;
+       }
+
+       switch (iface_create_ver) {
+       case WL_INTERFACE_CREATE_VER_3:
+               memset(&iface_v3, 0, sizeof(iface_v3));
+               iface_v3.ver = WL_INTERFACE_CREATE_VER_3;
+               iface_v3.flags = WL_INTERFACE_MAC_USE;
+               iface_v3.iftype = WL_INTERFACE_CREATE_STA;
+               if (!is_zero_ether_addr(macaddr))
+                       memcpy(iface_v3.mac_addr, macaddr, ETH_ALEN);
+               else
+                       brcmf_set_vif_sta_macaddr(ifp, iface_v3.mac_addr);
+
+               err = brcmf_fil_iovar_data_get(ifp, "interface_create",
+                                              &iface_v3,
+                                              sizeof(iface_v3));
+
+               if (!err)
+                       brcmf_dbg(INFO, "interface created(v3)\n");
+               break;
+       default:
+               brcmf_err("not support interface create(v%d)\n",
+                         iface_create_ver);
+               err = -EOPNOTSUPP;
+               break;
+       }
+
+       if (err) {
+               brcmf_info("station interface creation failed (%d)\n",
+                          err);
+               return -EIO;
+       }
+
+       return 0;
+}
+
 static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp)
 {
+       struct wl_interface_create_v1 iface_v1;
+       struct wl_interface_create_v2 iface_v2;
+       struct wl_interface_create_v3 iface_v3;
+       u32 iface_create_ver;
        struct brcmf_pub *drvr = ifp->drvr;
        struct brcmf_mbss_ssid_le mbss_ssid_le;
        int bsscfgidx;
        int err;
 
-       memset(&mbss_ssid_le, 0, sizeof(mbss_ssid_le));
-       bsscfgidx = brcmf_get_first_free_bsscfgidx(ifp->drvr);
-       if (bsscfgidx < 0)
-               return bsscfgidx;
+       /* interface_create version 1 */
+       memset(&iface_v1, 0, sizeof(iface_v1));
+       iface_v1.ver = WL_INTERFACE_CREATE_VER_1;
+       iface_v1.flags = WL_INTERFACE_CREATE_AP |
+                        WL_INTERFACE_MAC_USE;
 
-       mbss_ssid_le.bsscfgidx = cpu_to_le32(bsscfgidx);
-       mbss_ssid_le.SSID_len = cpu_to_le32(5);
-       sprintf(mbss_ssid_le.SSID, "ssid%d" , bsscfgidx);
+       brcmf_set_vif_sta_macaddr(ifp, iface_v1.mac_addr);
 
-       err = brcmf_fil_bsscfg_data_set(ifp, "bsscfg:ssid", &mbss_ssid_le,
-                                       sizeof(mbss_ssid_le));
-       if (err < 0)
-               bphy_err(drvr, "setting ssid failed %d\n", err);
+       err = brcmf_fil_iovar_data_get(ifp, "interface_create",
+                                      &iface_v1,
+                                      sizeof(iface_v1));
+       if (err) {
+               brcmf_info("failed to create interface(v1), err=%d\n",
+                          err);
+       } else {
+               brcmf_dbg(INFO, "interface created(v1)\n");
+               return 0;
+       }
+
+       /* interface_create version 2 */
+       memset(&iface_v2, 0, sizeof(iface_v2));
+       iface_v2.ver = WL_INTERFACE_CREATE_VER_2;
+       iface_v2.flags = WL_INTERFACE_MAC_USE;
+       iface_v2.iftype = WL_INTERFACE_CREATE_AP;
+
+       brcmf_set_vif_sta_macaddr(ifp, iface_v2.mac_addr);
+
+       err = brcmf_fil_iovar_data_get(ifp, "interface_create",
+                                      &iface_v2,
+                                      sizeof(iface_v2));
+       if (err) {
+               brcmf_info("failed to create interface(v2), err=%d\n",
+                          err);
+       } else {
+               brcmf_dbg(INFO, "interface created(v2)\n");
+               return 0;
+       }
+
+       /* interface_create version 3+ */
+       /* get supported version from firmware side */
+       iface_create_ver = 0;
+       err = brcmf_fil_bsscfg_int_get(ifp, "interface_create",
+                                      &iface_create_ver);
+       if (err) {
+               brcmf_err("fail to get supported version, err=%d\n", err);
+               return -EOPNOTSUPP;
+       }
+
+       switch (iface_create_ver) {
+       case WL_INTERFACE_CREATE_VER_3:
+               memset(&iface_v3, 0, sizeof(iface_v3));
+               iface_v3.ver = WL_INTERFACE_CREATE_VER_3;
+               iface_v3.flags = WL_INTERFACE_MAC_USE;
+               iface_v3.iftype = WL_INTERFACE_CREATE_AP;
+               brcmf_set_vif_sta_macaddr(ifp, iface_v3.mac_addr);
+
+               err = brcmf_fil_iovar_data_get(ifp, "interface_create",
+                                              &iface_v3,
+                                              sizeof(iface_v3));
+
+               if (!err)
+                       brcmf_dbg(INFO, "interface created(v3)\n");
+               break;
+       default:
+               brcmf_err("not support interface create(v%d)\n",
+                         iface_create_ver);
+               err = -EOPNOTSUPP;
+               break;
+       }
+
+       if (err) {
+               brcmf_info("Does not support interface_create (%d)\n",
+                          err);
+               memset(&mbss_ssid_le, 0, sizeof(mbss_ssid_le));
+               bsscfgidx = brcmf_get_first_free_bsscfgidx(ifp->drvr);
+               if (bsscfgidx < 0)
+                       return bsscfgidx;
+
+               mbss_ssid_le.bsscfgidx = cpu_to_le32(bsscfgidx);
+               mbss_ssid_le.SSID_len = cpu_to_le32(5);
+               sprintf(mbss_ssid_le.SSID, "ssid%d", bsscfgidx);
+
+               err = brcmf_fil_bsscfg_data_set(ifp, "bsscfg:ssid", &mbss_ssid_le,
+                                               sizeof(mbss_ssid_le));
+
+               if (err < 0)
+                       bphy_err(drvr, "setting ssid failed %d\n", err);
+       }
 
        return err;
 }
 
 /**
- * brcmf_ap_add_vif() - create a new AP virtual interface for multiple BSS
+ * brcmf_apsta_add_vif() - create a new AP or STA virtual interface
  *
  * @wiphy: wiphy device of new interface.
  * @name: name of the new interface.
- * @params: contains mac address for AP device.
+ * @params: contains mac address for AP or STA device.
+ * @type: interface type.
  */
 static
-struct wireless_dev *brcmf_ap_add_vif(struct wiphy *wiphy, const char *name,
-                                     struct vif_params *params)
+struct wireless_dev *brcmf_apsta_add_vif(struct wiphy *wiphy, const char *name,
+                                        struct vif_params *params,
+                                        enum nl80211_iftype type)
 {
        struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
        struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
@@ -562,18 +822,24 @@ struct wireless_dev *brcmf_ap_add_vif(struct wiphy *wiphy, const char *name,
        struct brcmf_cfg80211_vif *vif;
        int err;
 
+       if (type != NL80211_IFTYPE_STATION && type != NL80211_IFTYPE_AP)
+               return ERR_PTR(-EINVAL);
+
        if (brcmf_cfg80211_vif_event_armed(cfg))
                return ERR_PTR(-EBUSY);
 
        brcmf_dbg(INFO, "Adding vif \"%s\"\n", name);
 
-       vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP);
+       vif = brcmf_alloc_vif(cfg, type);
        if (IS_ERR(vif))
                return (struct wireless_dev *)vif;
 
        brcmf_cfg80211_arm_vif_event(cfg, vif);
 
-       err = brcmf_cfg80211_request_ap_if(ifp);
+       if (type == NL80211_IFTYPE_STATION)
+               err = brcmf_cfg80211_request_sta_if(ifp, params->macaddr);
+       else
+               err = brcmf_cfg80211_request_ap_if(ifp);
        if (err) {
                brcmf_cfg80211_arm_vif_event(cfg, NULL);
                goto fail;
@@ -720,15 +986,15 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
        }
        switch (type) {
        case NL80211_IFTYPE_ADHOC:
-       case NL80211_IFTYPE_STATION:
        case NL80211_IFTYPE_AP_VLAN:
        case NL80211_IFTYPE_WDS:
        case NL80211_IFTYPE_MESH_POINT:
                return ERR_PTR(-EOPNOTSUPP);
        case NL80211_IFTYPE_MONITOR:
                return brcmf_mon_add_vif(wiphy, name);
+       case NL80211_IFTYPE_STATION:
        case NL80211_IFTYPE_AP:
-               wdev = brcmf_ap_add_vif(wiphy, name, params);
+               wdev = brcmf_apsta_add_vif(wiphy, name, params, type);
                break;
        case NL80211_IFTYPE_P2P_CLIENT:
        case NL80211_IFTYPE_P2P_GO:
@@ -848,8 +1114,8 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
        return err;
 }
 
-static int brcmf_cfg80211_del_ap_iface(struct wiphy *wiphy,
-                                      struct wireless_dev *wdev)
+static int brcmf_cfg80211_del_apsta_iface(struct wiphy *wiphy,
+                                         struct wireless_dev *wdev)
 {
        struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
        struct net_device *ndev = wdev->netdev;
@@ -906,15 +1172,15 @@ int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
 
        switch (wdev->iftype) {
        case NL80211_IFTYPE_ADHOC:
-       case NL80211_IFTYPE_STATION:
        case NL80211_IFTYPE_AP_VLAN:
        case NL80211_IFTYPE_WDS:
        case NL80211_IFTYPE_MESH_POINT:
                return -EOPNOTSUPP;
        case NL80211_IFTYPE_MONITOR:
                return brcmf_mon_del_vif(wiphy, wdev);
+       case NL80211_IFTYPE_STATION:
        case NL80211_IFTYPE_AP:
-               return brcmf_cfg80211_del_ap_iface(wiphy, wdev);
+               return brcmf_cfg80211_del_apsta_iface(wiphy, wdev);
        case NL80211_IFTYPE_P2P_CLIENT:
        case NL80211_IFTYPE_P2P_GO:
        case NL80211_IFTYPE_P2P_DEVICE:
@@ -6002,7 +6268,7 @@ done:
        brcmf_dbg(CONN, "Report roaming result\n");
 
        if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft) {
-               cfg80211_port_authorized(ndev, profile->bssid, GFP_KERNEL);
+               cfg80211_port_authorized(ndev, profile->bssid, NULL, 0, GFP_KERNEL);
                brcmf_dbg(CONN, "Report port authorized\n");
        }
 
@@ -6973,7 +7239,7 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] = {
  *
  * p2p, mchan, and mbss:
  *
- *     #STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
+ *     #STA <= 2, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
  *     #STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
  *     #AP <= 4, matching BI, channels = 1, 4 total
  *
@@ -7019,7 +7285,7 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
                goto err;
 
        combo[c].num_different_channels = 1 + (rsdb || (p2p && mchan));
-       c0_limits[i].max = 1;
+       c0_limits[i].max = 1 + (p2p && mchan);
        c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
        if (mon_flag) {
                c0_limits[i].max = 1;
@@ -7525,6 +7791,231 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
        return 0;
 }
 
+static int
+brcmf_parse_dump_obss(char *buf, struct brcmf_dump_survey *survey)
+{
+       int i;
+       char *token;
+       char delim[] = "\n ";
+       unsigned long val;
+       int err = 0;
+
+       token = strsep(&buf, delim);
+       while (token) {
+               if (!strcmp(token, "OBSS")) {
+                       for (i = 0; i < OBSS_TOKEN_IDX; i++)
+                               token = strsep(&buf, delim);
+                       err = kstrtoul(token, 10, &val);
+                       if (err)
+                               break;
+                       survey->obss = val;
+               }
+
+               if (!strcmp(token, "IBSS")) {
+                       for (i = 0; i < IBSS_TOKEN_IDX; i++)
+                               token = strsep(&buf, delim);
+                       err = kstrtoul(token, 10, &val);
+                       if (err)
+                               break;
+                       survey->ibss = val;
+               }
+
+               if (!strcmp(token, "TXDur")) {
+                       for (i = 0; i < TX_TOKEN_IDX; i++)
+                               token = strsep(&buf, delim);
+                       err = kstrtoul(token, 10, &val);
+                       if (err)
+                               break;
+                       survey->tx = val;
+               }
+
+               if (!strcmp(token, "Category")) {
+                       for (i = 0; i < CTG_TOKEN_IDX; i++)
+                               token = strsep(&buf, delim);
+                       err = kstrtoul(token, 10, &val);
+                       if (err)
+                               break;
+                       survey->no_ctg = val;
+               }
+
+               if (!strcmp(token, "Packet")) {
+                       for (i = 0; i < PKT_TOKEN_IDX; i++)
+                               token = strsep(&buf, delim);
+                       err = kstrtoul(token, 10, &val);
+                       if (err)
+                               break;
+                       survey->no_pckt = val;
+               }
+
+               if (!strcmp(token, "Opp(time):")) {
+                       for (i = 0; i < IDLE_TOKEN_IDX; i++)
+                               token = strsep(&buf, delim);
+                       err = kstrtoul(token, 10, &val);
+                       if (err)
+                               break;
+                       survey->idle = val;
+               }
+
+               token = strsep(&buf, delim);
+       }
+
+       return err;
+}
+
+static int
+brcmf_dump_obss(struct brcmf_if *ifp, struct cca_msrmnt_query req,
+               struct brcmf_dump_survey *survey)
+{
+       struct cca_stats_n_flags *results;
+       char *buf;
+       int err;
+
+       buf = kzalloc(sizeof(char) * BRCMF_DCMD_MEDLEN, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+
+       memcpy(buf, &req, sizeof(struct cca_msrmnt_query));
+       err = brcmf_fil_iovar_data_get(ifp, "dump_obss",
+                                      buf, BRCMF_DCMD_MEDLEN);
+       if (err) {
+               brcmf_err("dump_obss error (%d)\n", err);
+               err = -EINVAL;
+               goto exit;
+       }
+       results = (struct cca_stats_n_flags *)(buf);
+
+       if (req.msrmnt_query)
+               brcmf_parse_dump_obss(results->buf, survey);
+
+exit:
+       kfree(buf);
+       return err;
+}
+
+static s32
+cfg80211_set_channel(struct wiphy *wiphy, struct net_device *dev,
+                    struct ieee80211_channel *chan,
+                    enum nl80211_channel_type channel_type)
+{
+       u16 chspec = 0;
+       int err = 0;
+       struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
+       struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
+
+       /* set_channel */
+       chspec = channel_to_chanspec(&cfg->d11inf, chan);
+       if (chspec != INVCHANSPEC) {
+               err = brcmf_fil_iovar_int_set(ifp, "chanspec", chspec);
+               if (err) {
+                       brcmf_err("set chanspec 0x%04x fail, reason %d\n", chspec, err);
+                       err = -EINVAL;
+               }
+       } else {
+               brcmf_err("failed to convert host chanspec to fw chanspec\n");
+               err = -EINVAL;
+       }
+
+       return err;
+}
+
+static int
+brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev,
+                          int idx, struct survey_info *info)
+{
+       struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
+       struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
+       struct brcmf_dump_survey survey = {};
+       struct ieee80211_supported_band *band;
+       struct ieee80211_channel *chan;
+       struct cca_msrmnt_query req;
+       u32 noise;
+       int err;
+
+       brcmf_dbg(TRACE, "Enter: channel idx=%d\n", idx);
+
+       /* Do not run survey when VIF in CONNECTING / CONNECTED states */
+       if ((test_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state)) ||
+           (test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state))) {
+               return -EBUSY;
+       }
+
+       band = wiphy->bands[NL80211_BAND_2GHZ];
+       if (band && idx >= band->n_channels) {
+               idx -= band->n_channels;
+               band = NULL;
+       }
+
+       if (!band || idx >= band->n_channels) {
+               band = wiphy->bands[NL80211_BAND_5GHZ];
+               if (idx >= band->n_channels)
+                       return -ENOENT;
+       }
+
+       /* Setting current channel to the requested channel */
+       chan = &band->channels[idx];
+       err = cfg80211_set_channel(wiphy, ndev, chan, NL80211_CHAN_HT20);
+       if (err) {
+               info->channel = chan;
+               info->filled = 0;
+               return 0;
+       }
+
+       /* Disable mpc */
+       brcmf_set_mpc(ifp, 0);
+
+       /* Set interface up, explicitly. */
+       err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
+       if (err) {
+               brcmf_err("set interface up failed, err = %d\n", err);
+               goto exit;
+       }
+
+       /* Get noise value */
+       err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PHY_NOISE, &noise);
+       if (err) {
+               brcmf_err("Get Phy Noise failed, use dummy value\n");
+               noise = CHAN_NOISE_DUMMY;
+       }
+
+       /* Start Measurement for obss stats on current channel */
+       req.msrmnt_query = 0;
+       req.time_req = ACS_MSRMNT_DELAY;
+       err = brcmf_dump_obss(ifp, req, &survey);
+       if (err)
+               goto exit;
+
+       /* Add 10 ms for IOVAR completion */
+       msleep(ACS_MSRMNT_DELAY + 10);
+
+       /* Issue IOVAR to collect measurement results */
+       req.msrmnt_query = 1;
+       err = brcmf_dump_obss(ifp, req, &survey);
+       if (err)
+               goto exit;
+
+       info->channel = chan;
+       info->noise = noise;
+       info->time = ACS_MSRMNT_DELAY;
+       info->time_busy = ACS_MSRMNT_DELAY - survey.idle;
+       info->time_rx = survey.obss + survey.ibss + survey.no_ctg +
+               survey.no_pckt;
+       info->time_tx = survey.tx;
+       info->filled = SURVEY_INFO_NOISE_DBM | SURVEY_INFO_TIME |
+               SURVEY_INFO_TIME_BUSY | SURVEY_INFO_TIME_RX |
+               SURVEY_INFO_TIME_TX;
+
+       brcmf_dbg(INFO, "OBSS dump: channel %d: survey duration %d\n",
+                 ieee80211_frequency_to_channel(chan->center_freq),
+                 ACS_MSRMNT_DELAY);
+       brcmf_dbg(INFO, "noise(%d) busy(%llu) rx(%llu) tx(%llu)\n",
+                 info->noise, info->time_busy, info->time_rx, info->time_tx);
+
+exit:
+       if (!brcmf_is_apmode(ifp->vif))
+               brcmf_set_mpc(ifp, 1);
+       return err;
+}
+
 static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
                                        struct regulatory_request *req)
 {
@@ -7676,6 +8167,9 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
        if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
                ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
 #endif
+       if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_DUMP_OBSS))
+               ops->dump_survey = brcmf_cfg80211_dump_survey;
+
        err = wiphy_register(wiphy);
        if (err < 0) {
                bphy_err(drvr, "Could not register wiphy device (%d)\n", err);
index 595ae3ae561ef20d69da0388813adfbd963ef560..d354f79fd0ac10684742c034be2b0782520ebb6f 100644 (file)
@@ -1399,7 +1399,8 @@ void brcmf_fw_crashed(struct device *dev)
 
        brcmf_dev_coredump(dev);
 
-       schedule_work(&drvr->bus_reset);
+       if (drvr->bus_reset.func)
+               schedule_work(&drvr->bus_reset);
 }
 
 void brcmf_detach(struct device *dev)
index 340346c122d3278db69524ca237fd90dbe480a1a..2e71b5c2a9751d5b04e6c55a84761cf915d72cd0 100644 (file)
@@ -136,6 +136,7 @@ struct brcmf_pub {
        struct work_struct bus_reset;
 
        u8 clmver[BRCMF_DCMD_SMLEN];
+       u8 sta_mac_idx;
 };
 
 /* forward declarations */
index 2c2f3e026c136672f714605bf2f632c6953052f5..10bac865d724352bc7ebc03567d1be41237664ec 100644 (file)
@@ -143,7 +143,7 @@ static void brcmf_feat_iovar_int_get(struct brcmf_if *ifp,
        ifp->fwil_fwerr = true;
 
        err = brcmf_fil_iovar_int_get(ifp, name, &data);
-       if (err == 0) {
+       if (err != -BRCMF_FW_UNSUPPORTED) {
                brcmf_dbg(INFO, "enabling feature: %s\n", brcmf_feat_names[id]);
                ifp->drvr->feat_flags |= BIT(id);
        } else {
@@ -281,6 +281,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
        brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_RSDB, "rsdb_mode");
        brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_TDLS, "tdls_enable");
        brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MFP, "mfp");
+       brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_DUMP_OBSS, "dump_obss");
 
        pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER;
        err = brcmf_fil_iovar_data_get(ifp, "pfn_macaddr", &pfn_mac,
index d1f4257af696b4e6e90c283cdafc0e6b64e66da5..f1b086a69d735ca857092d2797e8ccd81b98cf1a 100644 (file)
@@ -29,6 +29,7 @@
  * DOT11H: firmware supports 802.11h
  * SAE: simultaneous authentication of equals
  * FWAUTH: Firmware authenticator
+ * DUMP_OBSS: Firmware has capable to dump obss info to support ACS
  */
 #define BRCMF_FEAT_LIST \
        BRCMF_FEAT_DEF(MBSS) \
@@ -51,7 +52,8 @@
        BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
        BRCMF_FEAT_DEF(DOT11H) \
        BRCMF_FEAT_DEF(SAE) \
-       BRCMF_FEAT_DEF(FWAUTH)
+       BRCMF_FEAT_DEF(FWAUTH) \
+       BRCMF_FEAT_DEF(DUMP_OBSS)
 
 /*
  * Quirks:
index 80083f9ea311621b0501fe3faffed8fb55eeafdb..cf564adc612a2841938d3941dcd12a4e27ff71e2 100644 (file)
@@ -12,6 +12,8 @@
 #include <linux/interrupt.h>
 #include <linux/bcma/bcma.h>
 #include <linux/sched.h>
+#include <linux/sched/signal.h>
+#include <linux/kthread.h>
 #include <linux/io.h>
 #include <asm/unaligned.h>
 
@@ -340,6 +342,11 @@ struct brcmf_pciedev_info {
                          u16 value);
        struct brcmf_mp_device *settings;
        struct brcmf_otp_params otp;
+#ifdef DEBUG
+       u32 console_interval;
+       bool console_active;
+       struct timer_list timer;
+#endif
 };
 
 struct brcmf_pcie_ringbuf {
@@ -440,6 +447,9 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
                             struct brcmf_fw_request *fwreq);
 static struct brcmf_fw_request *
 brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo);
+static void
+brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active);
+static void brcmf_pcie_debugfs_create(struct device *dev);
 
 static u16
 brcmf_pcie_read_reg16(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
@@ -1218,6 +1228,10 @@ static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
                                BRCMF_NROF_H2D_COMMON_MSGRINGS;
                max_completionrings = BRCMF_NROF_D2H_COMMON_MSGRINGS;
        }
+       if (max_flowrings > 256) {
+               brcmf_err(bus, "invalid max_flowrings(%d)\n", max_flowrings);
+               return -EIO;
+       }
 
        if (devinfo->dma_idx_sz != 0) {
                bufsz = (max_submissionrings + max_completionrings) *
@@ -1413,6 +1427,11 @@ fail:
 
 static void brcmf_pcie_down(struct device *dev)
 {
+       struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+       struct brcmf_pciedev *pcie_bus_dev = bus_if->bus_priv.pcie;
+       struct brcmf_pciedev_info *devinfo = pcie_bus_dev->devinfo;
+
+       brcmf_pcie_fwcon_timer(devinfo, false);
 }
 
 static int brcmf_pcie_preinit(struct device *dev)
@@ -1547,6 +1566,7 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
        .get_memdump = brcmf_pcie_get_memdump,
        .get_blob = brcmf_pcie_get_blob,
        .reset = brcmf_pcie_reset,
+       .debugfs_create = brcmf_pcie_debugfs_create,
 };
 
 
@@ -2048,13 +2068,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
        struct brcmf_commonring **flowrings;
        u32 i, nvram_len;
 
+       bus = dev_get_drvdata(dev);
+       pcie_bus_dev = bus->bus_priv.pcie;
+       devinfo = pcie_bus_dev->devinfo;
+
        /* check firmware loading result */
        if (ret)
                goto fail;
 
-       bus = dev_get_drvdata(dev);
-       pcie_bus_dev = bus->bus_priv.pcie;
-       devinfo = pcie_bus_dev->devinfo;
        brcmf_pcie_attach(devinfo);
 
        fw = fwreq->items[BRCMF_PCIE_FW_CODE].binary;
@@ -2123,9 +2144,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
 
        brcmf_pcie_bus_console_read(devinfo, false);
 
+       brcmf_pcie_fwcon_timer(devinfo, true);
+
        return;
 
 fail:
+       brcmf_err(bus, "Dongle setup failed\n");
+       brcmf_pcie_bus_console_read(devinfo, true);
+       brcmf_fw_crashed(dev);
        device_release_driver(dev);
 }
 
@@ -2197,6 +2223,105 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
        return fwreq;
 }
 
+#ifdef DEBUG
+static void
+brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active)
+{
+       if (!active) {
+               if (devinfo->console_active) {
+                       del_timer_sync(&devinfo->timer);
+                       devinfo->console_active = false;
+               }
+               return;
+       }
+
+       /* don't start the timer */
+       if (devinfo->state != BRCMFMAC_PCIE_STATE_UP ||
+           !devinfo->console_interval || !BRCMF_FWCON_ON())
+               return;
+
+       if (!devinfo->console_active) {
+               devinfo->timer.expires = jiffies + devinfo->console_interval;
+               add_timer(&devinfo->timer);
+               devinfo->console_active = true;
+       } else {
+               /* Reschedule the timer */
+               mod_timer(&devinfo->timer, jiffies + devinfo->console_interval);
+       }
+}
+
+static void
+brcmf_pcie_fwcon(struct timer_list *t)
+{
+       struct brcmf_pciedev_info *devinfo = from_timer(devinfo, t, timer);
+
+       if (!devinfo->console_active)
+               return;
+
+       brcmf_pcie_bus_console_read(devinfo, false);
+
+       /* Reschedule the timer if console interval is not zero */
+       mod_timer(&devinfo->timer, jiffies + devinfo->console_interval);
+}
+
+static int brcmf_pcie_console_interval_get(void *data, u64 *val)
+{
+       struct brcmf_pciedev_info *devinfo = data;
+
+       *val = devinfo->console_interval;
+
+       return 0;
+}
+
+static int brcmf_pcie_console_interval_set(void *data, u64 val)
+{
+       struct brcmf_pciedev_info *devinfo = data;
+
+       if (val > MAX_CONSOLE_INTERVAL)
+               return -EINVAL;
+
+       devinfo->console_interval = val;
+
+       if (!val && devinfo->console_active)
+               brcmf_pcie_fwcon_timer(devinfo, false);
+       else if (val)
+               brcmf_pcie_fwcon_timer(devinfo, true);
+
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(brcmf_pcie_console_interval_fops,
+                       brcmf_pcie_console_interval_get,
+                       brcmf_pcie_console_interval_set,
+                       "%llu\n");
+
+static void brcmf_pcie_debugfs_create(struct device *dev)
+{
+       struct brcmf_bus *bus_if = dev_get_drvdata(dev);
+       struct brcmf_pub *drvr = bus_if->drvr;
+       struct brcmf_pciedev *pcie_bus_dev = bus_if->bus_priv.pcie;
+       struct brcmf_pciedev_info *devinfo = pcie_bus_dev->devinfo;
+       struct dentry *dentry = brcmf_debugfs_get_devdir(drvr);
+
+       if (IS_ERR_OR_NULL(dentry))
+               return;
+
+       devinfo->console_interval = BRCMF_CONSOLE;
+
+       debugfs_create_file("console_interval", 0644, dentry, devinfo,
+                           &brcmf_pcie_console_interval_fops);
+}
+
+#else
+void brcmf_pcie_fwcon_timer(struct brcmf_pciedev_info *devinfo, bool active)
+{
+}
+
+static void brcmf_pcie_debugfs_create(struct device *dev)
+{
+}
+#endif
+
 static int
 brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
@@ -2278,6 +2403,11 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto fail_brcmf;
        }
 
+#ifdef DEBUG
+       /* Set up the fwcon timer */
+       timer_setup(&devinfo->timer, brcmf_pcie_fwcon, 0);
+#endif
+
        fwreq = brcmf_pcie_prepare_fw_request(devinfo);
        if (!fwreq) {
                ret = -ENOMEM;
@@ -2323,6 +2453,7 @@ brcmf_pcie_remove(struct pci_dev *pdev)
 
        devinfo = bus->bus_priv.pcie->devinfo;
        brcmf_pcie_bus_console_read(devinfo, false);
+       brcmf_pcie_fwcon_timer(devinfo, false);
 
        devinfo->state = BRCMFMAC_PCIE_STATE_DOWN;
        if (devinfo->ci)
@@ -2366,6 +2497,7 @@ static int brcmf_pcie_pm_enter_D3(struct device *dev)
        bus = dev_get_drvdata(dev);
        devinfo = bus->bus_priv.pcie->devinfo;
 
+       brcmf_pcie_fwcon_timer(devinfo, false);
        brcmf_bus_change_state(bus, BRCMF_BUS_DOWN);
 
        devinfo->mbdata_completed = false;
@@ -2409,6 +2541,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev)
                brcmf_bus_change_state(bus, BRCMF_BUS_UP);
                brcmf_pcie_intr_enable(devinfo);
                brcmf_pcie_hostready(devinfo);
+               brcmf_pcie_fwcon_timer(devinfo, true);
                return 0;
        }
 
index 465d95d837592f9c15b0effa12737ab0dcc66db8..deb0199fcf8c7892294d4cd59cdde12e6a6425b2 100644 (file)
@@ -135,8 +135,6 @@ struct rte_console {
 
 #define BRCMF_FIRSTREAD        (1 << 6)
 
-#define BRCMF_CONSOLE  10      /* watchdog interval to poll console */
-
 /* SBSDIO_DEVICE_CTL */
 
 /* 1: device will assert busy signal when receiving CMD53 */
index a4034d44609b27c94e16f0d7d95501a076f104af..a8333e6adbdafbe3ccc6cf7e6c8efe6246f44c99 100644 (file)
@@ -962,6 +962,7 @@ static int brcms_ops_beacon_set_tim(struct ieee80211_hw *hw,
 
 static const struct ieee80211_ops brcms_ops = {
        .tx = brcms_ops_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .start = brcms_ops_start,
        .stop = brcms_ops_stop,
        .add_interface = brcms_ops_add_interface,
index 7352d5b2095f48c3f39a22cb44e2c7f86bd56433..c4503308f3b0ce65301d2a831228b89ccfdaff54 100644 (file)
@@ -3435,6 +3435,7 @@ static const struct attribute_group il3945_attribute_group = {
 
 static struct ieee80211_ops il3945_mac_ops __ro_after_init = {
        .tx = il3945_mac_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .start = il3945_mac_start,
        .stop = il3945_mac_stop,
        .add_interface = il_mac_add_interface,
index 943de47170c70cb3f34ad074963e94d0ce34a4b1..721b4042b4bf710de67eb0233fd218f5c0250a25 100644 (file)
@@ -6304,6 +6304,7 @@ il4965_tx_queue_set_status(struct il_priv *il, struct il_tx_queue *txq,
 
 static const struct ieee80211_ops il4965_mac_ops = {
        .tx = il4965_mac_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .start = il4965_mac_start,
        .stop = il4965_mac_stop,
        .add_interface = il_mac_add_interface,
index f4070fddc8c739e37fd157ac6a70bd661ed3260f..b1939ff275b51f8bcf5d0dec9af9aba644843589 100644 (file)
@@ -1571,6 +1571,7 @@ static void iwlagn_mac_sta_notify(struct ieee80211_hw *hw,
 
 const struct ieee80211_ops iwlagn_hw_ops = {
        .tx = iwlagn_mac_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .start = iwlagn_mac_start,
        .stop = iwlagn_mac_stop,
 #ifdef CONFIG_PM_SLEEP
index e127453ab51ad40d46e4a82e0b751194229e1d9f..c6084683aedded35a29b5fe433fadbf6850f3ca4 100644 (file)
@@ -705,6 +705,7 @@ static void p54_set_coverage_class(struct ieee80211_hw *dev,
 
 static const struct ieee80211_ops p54_ops = {
        .tx                     = p54_tx_80211,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = p54_start,
        .stop                   = p54_stop,
        .add_interface          = p54_add_interface,
index a40636c90ec365975284bdc4ace553d97f22a857..1927fc8111ffbdc56bd45d774b2cebef922d6ca9 100644 (file)
@@ -3104,6 +3104,7 @@ static int mac80211_hwsim_change_sta_links(struct ieee80211_hw *hw,
 
 #define HWSIM_COMMON_OPS                                       \
        .tx = mac80211_hwsim_tx,                                \
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,        \
        .start = mac80211_hwsim_start,                          \
        .stop = mac80211_hwsim_stop,                            \
        .add_interface = mac80211_hwsim_add_interface,          \
index 74c4942b9a5a0051af06d33d37b549663c83f453..199d33ed3bb960b809ea9a6910220f00aaca31f5 100644 (file)
@@ -474,6 +474,7 @@ static int lbtf_op_get_survey(struct ieee80211_hw *hw, int idx,
 
 static const struct ieee80211_ops lbtf_ops = {
        .tx                     = lbtf_op_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = lbtf_op_start,
        .stop                   = lbtf_op_stop,
        .add_interface          = lbtf_op_add_interface,
index 4dc7e2e53b81e142cfbc1f6017aa46b59be69d3d..13bcb123d122347cc76f0aac3ed4ed2015d5c88c 100644 (file)
@@ -5611,6 +5611,7 @@ static void mwl8k_sw_scan_complete(struct ieee80211_hw *hw,
 
 static const struct ieee80211_ops mwl8k_ops = {
        .tx                     = mwl8k_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = mwl8k_start,
        .stop                   = mwl8k_stop,
        .add_interface          = mwl8k_add_interface,
index 6c9c7a61c5c9878fbfa600cedb645280007fddcb..c8d332456a6bf8b9ae279d64a4856d89a6687a57 100644 (file)
@@ -406,6 +406,7 @@ out:
 
 const struct ieee80211_ops mt7601u_ops = {
        .tx = mt7601u_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .start = mt7601u_start,
        .stop = mt7601u_stop,
        .add_interface = mt7601u_add_interface,
index d3cdffbded693f37b3c21ab68d4b94e5084d0ac3..94ee831b5de353c585873218acff7dfc7a08148f 100644 (file)
@@ -686,6 +686,7 @@ static int plfxlc_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
 
 static const struct ieee80211_ops plfxlc_ops = {
        .tx = plfxlc_op_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .start = plfxlc_op_start,
        .stop = plfxlc_op_stop,
        .add_interface = plfxlc_op_add_interface,
index 273c5eac336203edccbf39cf1808f070d134716c..bb5685826c18a48c9e6d30becce864e75f19925d 100644 (file)
@@ -1706,6 +1706,7 @@ static int rt2400pci_tx_last_beacon(struct ieee80211_hw *hw)
 
 static const struct ieee80211_ops rt2400pci_mac80211_ops = {
        .tx                     = rt2x00mac_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = rt2x00mac_start,
        .stop                   = rt2x00mac_stop,
        .add_interface          = rt2x00mac_add_interface,
index 8faa0a80e73a667603b805c73b24b8bb1fdb9567..43d2c1931d2b1d5fb4d348e011ef277f7607b929 100644 (file)
@@ -2004,6 +2004,7 @@ static int rt2500pci_tx_last_beacon(struct ieee80211_hw *hw)
 
 static const struct ieee80211_ops rt2500pci_mac80211_ops = {
        .tx                     = rt2x00mac_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = rt2x00mac_start,
        .stop                   = rt2x00mac_stop,
        .add_interface          = rt2x00mac_add_interface,
index bb5ed6630645823e5232c18545d4fd8a0848af9b..a2696e24ae2b3a95fd86e7d8fae40f4d6677c4be 100644 (file)
@@ -1795,6 +1795,7 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev)
 
 static const struct ieee80211_ops rt2500usb_mac80211_ops = {
        .tx                     = rt2x00mac_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = rt2x00mac_start,
        .stop                   = rt2x00mac_stop,
        .add_interface          = rt2x00mac_add_interface,
index 1fde0e767ce3901ad3fb43b0e7233bb7fe9174bf..dcb56f708a5fc55bc00f1c31a59f85f760576c03 100644 (file)
@@ -288,6 +288,7 @@ static int rt2800pci_read_eeprom(struct rt2x00_dev *rt2x00dev)
 
 static const struct ieee80211_ops rt2800pci_mac80211_ops = {
        .tx                     = rt2x00mac_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = rt2x00mac_start,
        .stop                   = rt2x00mac_stop,
        .add_interface          = rt2x00mac_add_interface,
index bbfe1425c0ee5b62095c189207d554f51f350d4d..7118d4f9038ddf09c5b1026d2a0cbbcc03caf827 100644 (file)
@@ -133,6 +133,7 @@ static int rt2800soc_write_firmware(struct rt2x00_dev *rt2x00dev,
 
 static const struct ieee80211_ops rt2800soc_mac80211_ops = {
        .tx                     = rt2x00mac_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = rt2x00mac_start,
        .stop                   = rt2x00mac_stop,
        .add_interface          = rt2x00mac_add_interface,
index a3ffd1b0c9bc6c18edbc143cc7448b8dfc2d422d..b2a8e75a901b4100addf98c59f824c15f384c9cf 100644 (file)
@@ -630,6 +630,7 @@ static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev)
 
 static const struct ieee80211_ops rt2800usb_mac80211_ops = {
        .tx                     = rt2x00mac_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = rt2x00mac_start,
        .stop                   = rt2x00mac_stop,
        .add_interface          = rt2x00mac_add_interface,
index d92f9eb07dc99b8aabcddb97f28bb54766930dfd..b1679a8e4610ba04bfccf350705c38a27eed2647 100644 (file)
@@ -2873,6 +2873,7 @@ static u64 rt61pci_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 
 static const struct ieee80211_ops rt61pci_mac80211_ops = {
        .tx                     = rt2x00mac_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = rt2x00mac_start,
        .stop                   = rt2x00mac_stop,
        .add_interface          = rt2x00mac_add_interface,
index e3269fd7c59e3ddd0faa96bf647044e4c2366271..e2f4f40cb7eeb14756a69792d575209ba4f2e920 100644 (file)
@@ -2292,6 +2292,7 @@ static u64 rt73usb_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 
 static const struct ieee80211_ops rt73usb_mac80211_ops = {
        .tx                     = rt2x00mac_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = rt2x00mac_start,
        .stop                   = rt2x00mac_stop,
        .add_interface          = rt2x00mac_add_interface,
index cdfe08078c57536ead87a8c2bc6ce997ef2f1923..f6c25a52b69a967145f2adcb0446f67b333feeeb 100644 (file)
@@ -1608,6 +1608,7 @@ static void rtl8180_configure_filter(struct ieee80211_hw *dev,
 
 static const struct ieee80211_ops rtl8180_ops = {
        .tx                     = rtl8180_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = rtl8180_start,
        .stop                   = rtl8180_stop,
        .add_interface          = rtl8180_add_interface,
index c0f6e9c6d03e8a126959ef4913c09f9bf9639fc7..04945f905d6d065ea6696c6d352fd852aebeec4e 100644 (file)
@@ -1378,6 +1378,7 @@ static int rtl8187_conf_tx(struct ieee80211_hw *dev,
 
 static const struct ieee80211_ops rtl8187_ops = {
        .tx                     = rtl8187_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = rtl8187_start,
        .stop                   = rtl8187_stop,
        .add_interface          = rtl8187_add_interface,
index a263507a77a67311c39e357b0d75efa173fb90d8..631d078278be132597bf40accfdd911ff658b9ab 100644 (file)
@@ -3,13 +3,14 @@
 # RTL8XXXU Wireless LAN device configuration
 #
 config RTL8XXXU
-       tristate "RTL8723AU/RTL8188[CR]U/RTL819[12]CU (mac80211) support"
+       tristate "Realtek 802.11n USB wireless chips support"
        depends on MAC80211 && USB
        help
          This is an alternative driver for various Realtek RTL8XXX
          parts written to utilize the Linux mac80211 stack.
          The driver is known to work with a number of RTL8723AU,
-         RL8188CU, RTL8188RU, RTL8191CU, and RTL8192CU devices
+         RL8188CU, RTL8188RU, RTL8191CU, RTL8192CU, RTL8723BU, RTL8192EU,
+         and RTL8188FU devices.
 
          This driver is under development and has a limited feature
          set. In particular it does not yet support 40MHz channels
@@ -22,7 +23,7 @@ config RTL8XXXU
          but you will need to control which module you wish to load.
 
          To compile this driver as a module, choose M here: the module will
-         be called r8xxxu.  If unsure, say N.
+         be called rtl8xxxu.  If unsure, say N.
 
 config RTL8XXXU_UNTESTED
        bool "Include support for untested Realtek 8xxx USB devices (EXPERIMENTAL)"
index b278f8697cc08f547392c1f3b05a8a024f836e26..c4ad5325f5e71c0bdfa85776bc956b350966a78c 100644 (file)
@@ -2,4 +2,4 @@
 obj-$(CONFIG_RTL8XXXU) += rtl8xxxu.o
 
 rtl8xxxu-y     := rtl8xxxu_core.o rtl8xxxu_8192e.o rtl8xxxu_8723b.o \
-                  rtl8xxxu_8723a.o rtl8xxxu_8192c.o
+                  rtl8xxxu_8723a.o rtl8xxxu_8192c.o rtl8xxxu_8188f.o
index 782b089a2e1ba9ad2710858be2f1b8a92fc9ff56..ad3f32f4c6e77490e43aa564a0440b489107637d 100644 (file)
@@ -35,6 +35,7 @@
 #define REALTEK_USB_CMD_IDX            0x00
 
 #define TX_TOTAL_PAGE_NUM              0xf8
+#define TX_TOTAL_PAGE_NUM_8188F                0xf7
 #define TX_TOTAL_PAGE_NUM_8192E                0xf3
 #define TX_TOTAL_PAGE_NUM_8723B                0xf7
 /* (HPQ + LPQ + NPQ + PUBQ) = TX_TOTAL_PAGE_NUM */
 #define TX_PAGE_NUM_LO_PQ              0x02
 #define TX_PAGE_NUM_NORM_PQ            0x02
 
+#define TX_PAGE_NUM_PUBQ_8188F         0xe5
+#define TX_PAGE_NUM_HI_PQ_8188F                0x0c
+#define TX_PAGE_NUM_LO_PQ_8188F                0x02
+#define TX_PAGE_NUM_NORM_PQ_8188F      0x02
+
 #define TX_PAGE_NUM_PUBQ_8192E         0xe7
 #define TX_PAGE_NUM_HI_PQ_8192E                0x08
 #define TX_PAGE_NUM_LO_PQ_8192E                0x0c
@@ -859,6 +865,50 @@ struct rtl8192eu_efuse {
        u8 res12[0xc3];
 };
 
+struct rtl8188fu_efuse_tx_power {
+       u8 cck_base[6];
+       u8 ht40_base[5];
+       /* a: ofdm; b: ht20 */
+       struct rtl8723au_idx ht20_ofdm_1s_diff;
+};
+
+struct rtl8188fu_efuse {
+       __le16 rtl_id;
+       u8 res0[0x0e];
+       struct rtl8188fu_efuse_tx_power tx_power_index_A;       /* 0x10 */
+       u8 res1[0x9c];                  /* 0x1c */
+       u8 channel_plan;                /* 0xb8 */
+       u8 xtal_k;
+       u8 thermal_meter;
+       u8 iqk_lck;
+       u8 res2[5];
+       u8 rf_board_option;
+       u8 rf_feature_option;
+       u8 rf_bt_setting;
+       u8 eeprom_version;
+       u8 eeprom_customer_id;
+       u8 res3[2];
+       u8 kfree_thermal_k_on;
+       u8 rf_antenna_option;           /* 0xc9 */
+       u8 rfe_option;
+       u8 country_code;
+       u8 res4[4];
+       u8 vid;                         /* 0xd0 */
+       u8 res5[1];
+       u8 pid;                         /* 0xd2 */
+       u8 res6[1];
+       u8 usb_optional_function;
+       u8 res7[2];
+       u8 mac_addr[ETH_ALEN];          /* 0xd7 */
+       u8 res8[2];
+       u8 vendor_name[7];
+       u8 res9[2];
+       u8 device_name[7];              /* 0xe8 */
+       u8 res10[0x41];
+       u8 unknown[0x0d];               /* 0x130 */
+       u8 res11[0xc3];
+};
+
 struct rtl8xxxu_reg8val {
        u16 reg;
        u8 val;
@@ -1368,6 +1418,7 @@ struct rtl8xxxu_priv {
                struct rtl8723bu_efuse efuse8723bu;
                struct rtl8192cu_efuse efuse8192;
                struct rtl8192eu_efuse efuse8192eu;
+               struct rtl8188fu_efuse efuse8188fu;
        } efuse_wifi;
        u32 adda_backup[RTL8XXXU_ADDA_REGS];
        u32 mac_backup[RTL8XXXU_MAC_REGS];
@@ -1414,6 +1465,7 @@ struct rtl8xxxu_fileops {
        void (*init_phy_bb) (struct rtl8xxxu_priv *priv);
        int (*init_phy_rf) (struct rtl8xxxu_priv *priv);
        void (*phy_init_antenna_selection) (struct rtl8xxxu_priv *priv);
+       void (*phy_lc_calibrate) (struct rtl8xxxu_priv *priv);
        void (*phy_iq_calibrate) (struct rtl8xxxu_priv *priv);
        void (*config_channel) (struct ieee80211_hw *hw);
        int (*parse_rx_desc) (struct rtl8xxxu_priv *priv, struct sk_buff *skb);
@@ -1448,7 +1500,7 @@ struct rtl8xxxu_fileops {
        u16 trxff_boundary;
        u8 pbp_rx;
        u8 pbp_tx;
-       struct rtl8xxxu_reg8val *mactable;
+       const struct rtl8xxxu_reg8val *mactable;
        u8 total_page_num;
        u8 page_num_hi;
        u8 page_num_lo;
@@ -1457,7 +1509,7 @@ struct rtl8xxxu_fileops {
 
 extern int rtl8xxxu_debug;
 
-extern struct rtl8xxxu_reg8val rtl8xxxu_gen1_mac_init_table[];
+extern const struct rtl8xxxu_reg8val rtl8xxxu_gen1_mac_init_table[];
 extern const u32 rtl8xxxu_iqk_phy_iq_bb_reg[];
 u8 rtl8xxxu_read8(struct rtl8xxxu_priv *priv, u16 addr);
 u16 rtl8xxxu_read16(struct rtl8xxxu_priv *priv, u16 addr);
@@ -1486,16 +1538,18 @@ void rtl8xxxu_fill_iqk_matrix_a(struct rtl8xxxu_priv *priv, bool iqk_ok,
 void rtl8xxxu_fill_iqk_matrix_b(struct rtl8xxxu_priv *priv, bool iqk_ok,
                                int result[][8], int candidate, bool tx_only);
 int rtl8xxxu_init_phy_rf(struct rtl8xxxu_priv *priv,
-                        struct rtl8xxxu_rfregval *table,
+                        const struct rtl8xxxu_rfregval *table,
                         enum rtl8xxxu_rfpath path);
 int rtl8xxxu_init_phy_regs(struct rtl8xxxu_priv *priv,
-                          struct rtl8xxxu_reg32val *array);
+                          const struct rtl8xxxu_reg32val *array);
 int rtl8xxxu_load_firmware(struct rtl8xxxu_priv *priv, char *fw_name);
 void rtl8xxxu_firmware_self_reset(struct rtl8xxxu_priv *priv);
 void rtl8xxxu_power_off(struct rtl8xxxu_priv *priv);
+int rtl8xxxu_read_efuse8(struct rtl8xxxu_priv *priv, u16 offset, u8 *data);
 void rtl8xxxu_reset_8051(struct rtl8xxxu_priv *priv);
 int rtl8xxxu_auto_llt_table(struct rtl8xxxu_priv *priv);
 void rtl8xxxu_gen2_prepare_calibrate(struct rtl8xxxu_priv *priv, u8 start);
+void rtl8723a_phy_lc_calibrate(struct rtl8xxxu_priv *priv);
 int rtl8xxxu_flush_fifo(struct rtl8xxxu_priv *priv);
 int rtl8xxxu_gen2_h2c_cmd(struct rtl8xxxu_priv *priv,
                          struct h2c_cmd *h2c, int len);
@@ -1539,7 +1593,9 @@ void rtl8xxxu_fill_txdesc_v2(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
                             u32 rts_rate);
 void rtl8723bu_set_ps_tdma(struct rtl8xxxu_priv *priv,
                           u8 arg1, u8 arg2, u8 arg3, u8 arg4, u8 arg5);
+void rtl8723bu_phy_init_antenna_selection(struct rtl8xxxu_priv *priv);
 
+extern struct rtl8xxxu_fileops rtl8188fu_fops;
 extern struct rtl8xxxu_fileops rtl8192cu_fops;
 extern struct rtl8xxxu_fileops rtl8192eu_fops;
 extern struct rtl8xxxu_fileops rtl8723au_fops;
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
new file mode 100644 (file)
index 0000000..0025bb3
--- /dev/null
@@ -0,0 +1,1679 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * RTL8XXXU mac80211 USB driver - 8188f specific subdriver
+ *
+ * Copyright (c) 2022 Bitterblue Smith <rtl8821cerfe2@gmail.com>
+ *
+ * Portions copied from existing rtl8xxxu code:
+ * Copyright (c) 2014 - 2017 Jes Sorensen <Jes.Sorensen@gmail.com>
+ *
+ * Portions, notably calibration code:
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <linux/list.h>
+#include <linux/usb.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/wireless.h>
+#include <linux/firmware.h>
+#include <linux/moduleparam.h>
+#include <net/mac80211.h>
+#include "rtl8xxxu.h"
+#include "rtl8xxxu_regs.h"
+
+static const struct rtl8xxxu_reg8val rtl8188f_mac_init_table[] = {
+       {0x024, 0xDF}, {0x025, 0x07}, {0x02B, 0x1C}, {0x283, 0x20},
+       {0x421, 0x0F}, {0x428, 0x0A}, {0x429, 0x10}, {0x430, 0x00},
+       {0x431, 0x00}, {0x432, 0x00}, {0x433, 0x01}, {0x434, 0x04},
+       {0x435, 0x05}, {0x436, 0x07}, {0x437, 0x08}, {0x43C, 0x04},
+       {0x43D, 0x05}, {0x43E, 0x07}, {0x43F, 0x08}, {0x440, 0x5D},
+       {0x441, 0x01}, {0x442, 0x00}, {0x444, 0x10}, {0x445, 0x00},
+       {0x446, 0x00}, {0x447, 0x00}, {0x448, 0x00}, {0x449, 0xF0},
+       {0x44A, 0x0F}, {0x44B, 0x3E}, {0x44C, 0x10}, {0x44D, 0x00},
+       {0x44E, 0x00}, {0x44F, 0x00}, {0x450, 0x00}, {0x451, 0xF0},
+       {0x452, 0x0F}, {0x453, 0x00}, {0x456, 0x5E}, {0x460, 0x44},
+       {0x461, 0x44}, {0x4BC, 0xC0}, {0x4C8, 0xFF}, {0x4C9, 0x08},
+       {0x4CC, 0xFF}, {0x4CD, 0xFF}, {0x4CE, 0x01}, {0x500, 0x26},
+       {0x501, 0xA2}, {0x502, 0x2F}, {0x503, 0x00}, {0x504, 0x28},
+       {0x505, 0xA3}, {0x506, 0x5E}, {0x507, 0x00}, {0x508, 0x2B},
+       {0x509, 0xA4}, {0x50A, 0x5E}, {0x50B, 0x00}, {0x50C, 0x4F},
+       {0x50D, 0xA4}, {0x50E, 0x00}, {0x50F, 0x00}, {0x512, 0x1C},
+       {0x514, 0x0A}, {0x516, 0x0A}, {0x525, 0x4F}, {0x550, 0x10},
+       {0x551, 0x10}, {0x559, 0x02}, {0x55C, 0x28}, {0x55D, 0xFF},
+       {0x605, 0x30}, {0x608, 0x0E}, {0x609, 0x2A}, {0x620, 0xFF},
+       {0x621, 0xFF}, {0x622, 0xFF}, {0x623, 0xFF}, {0x624, 0xFF},
+       {0x625, 0xFF}, {0x626, 0xFF}, {0x627, 0xFF}, {0x638, 0x28},
+       {0x63C, 0x0A}, {0x63D, 0x0A}, {0x63E, 0x0E}, {0x63F, 0x0E},
+       {0x640, 0x40}, {0x642, 0x40}, {0x643, 0x00}, {0x652, 0xC8},
+       {0x66E, 0x05}, {0x700, 0x21}, {0x701, 0x43}, {0x702, 0x65},
+       {0x703, 0x87}, {0x708, 0x21}, {0x709, 0x43}, {0x70A, 0x65},
+       {0x70B, 0x87},
+       {0xffff, 0xff},
+};
+
+static const struct rtl8xxxu_reg32val rtl8188fu_phy_init_table[] = {
+       {0x800, 0x80045700}, {0x804, 0x00000001},
+       {0x808, 0x0000FC00}, {0x80C, 0x0000000A},
+       {0x810, 0x10001331}, {0x814, 0x020C3D10},
+       {0x818, 0x00200385}, {0x81C, 0x00000000},
+       {0x820, 0x01000100}, {0x824, 0x00390204},
+       {0x828, 0x00000000}, {0x82C, 0x00000000},
+       {0x830, 0x00000000}, {0x834, 0x00000000},
+       {0x838, 0x00000000}, {0x83C, 0x00000000},
+       {0x840, 0x00010000}, {0x844, 0x00000000},
+       {0x848, 0x00000000}, {0x84C, 0x00000000},
+       {0x850, 0x00030000}, {0x854, 0x00000000},
+       {0x858, 0x569A569A}, {0x85C, 0x569A569A},
+       {0x860, 0x00000130}, {0x864, 0x00000000},
+       {0x868, 0x00000000}, {0x86C, 0x27272700},
+       {0x870, 0x00000000}, {0x874, 0x25004000},
+       {0x878, 0x00000808}, {0x87C, 0x004F0201},
+       {0x880, 0xB0000B1E}, {0x884, 0x00000007},
+       {0x888, 0x00000000}, {0x88C, 0xCCC000C0},
+       {0x890, 0x00000800}, {0x894, 0xFFFFFFFE},
+       {0x898, 0x40302010}, {0x89C, 0x00706050},
+       {0x900, 0x00000000}, {0x904, 0x00000023},
+       {0x908, 0x00000000}, {0x90C, 0x81121111},
+       {0x910, 0x00000002}, {0x914, 0x00000201},
+       {0x948, 0x99000000}, {0x94C, 0x00000010},
+       {0x950, 0x20003000}, {0x954, 0x4A880000},
+       {0x958, 0x4BC5D87A}, {0x95C, 0x04EB9B79},
+       {0x96C, 0x00000003}, {0xA00, 0x00D047C8},
+       {0xA04, 0x80FF800C}, {0xA08, 0x8C898300},
+       {0xA0C, 0x2E7F120F}, {0xA10, 0x9500BB78},
+       {0xA14, 0x1114D028}, {0xA18, 0x00881117},
+       {0xA1C, 0x89140F00}, {0xA20, 0xD1D80000},
+       {0xA24, 0x5A7DA0BD}, {0xA28, 0x0000223B},
+       {0xA2C, 0x00D30000}, {0xA70, 0x101FBF00},
+       {0xA74, 0x00000007}, {0xA78, 0x00000900},
+       {0xA7C, 0x225B0606}, {0xA80, 0x218075B1},
+       {0xA84, 0x00120000}, {0xA88, 0x040C0000},
+       {0xA8C, 0x12345678}, {0xA90, 0xABCDEF00},
+       {0xA94, 0x001B1B89}, {0xA98, 0x05100000},
+       {0xA9C, 0x3F000000}, {0xAA0, 0x00000000},
+       {0xB2C, 0x00000000}, {0xC00, 0x48071D40},
+       {0xC04, 0x03A05611}, {0xC08, 0x000000E4},
+       {0xC0C, 0x6C6C6C6C}, {0xC10, 0x18800000},
+       {0xC14, 0x40000100}, {0xC18, 0x08800000},
+       {0xC1C, 0x40000100}, {0xC20, 0x00000000},
+       {0xC24, 0x00000000}, {0xC28, 0x00000000},
+       {0xC2C, 0x00000000}, {0xC30, 0x69E9CC4A},
+       {0xC34, 0x31000040}, {0xC38, 0x21688080},
+       {0xC3C, 0x00001714}, {0xC40, 0x1F78403F},
+       {0xC44, 0x00010036}, {0xC48, 0xEC020107},
+       {0xC4C, 0x007F037F}, {0xC50, 0x69553420},
+       {0xC54, 0x43BC0094}, {0xC58, 0x00013169},
+       {0xC5C, 0x00250492}, {0xC60, 0x00000000},
+       {0xC64, 0x7112848B}, {0xC68, 0x47C07BFF},
+       {0xC6C, 0x00000036}, {0xC70, 0x2C7F000D},
+       {0xC74, 0x020600DB}, {0xC78, 0x0000001F},
+       {0xC7C, 0x00B91612}, {0xC80, 0x390000E4},
+       {0xC84, 0x11F60000},
+       {0xC88, 0x40000100}, {0xC8C, 0x20200000},
+       {0xC90, 0x00091521}, {0xC94, 0x00000000},
+       {0xC98, 0x00121820}, {0xC9C, 0x00007F7F},
+       {0xCA0, 0x00000000}, {0xCA4, 0x000300A0},
+       {0xCA8, 0x00000000}, {0xCAC, 0x00000000},
+       {0xCB0, 0x00000000}, {0xCB4, 0x00000000},
+       {0xCB8, 0x00000000}, {0xCBC, 0x28000000},
+       {0xCC0, 0x00000000}, {0xCC4, 0x00000000},
+       {0xCC8, 0x00000000}, {0xCCC, 0x00000000},
+       {0xCD0, 0x00000000}, {0xCD4, 0x00000000},
+       {0xCD8, 0x64B22427}, {0xCDC, 0x00766932},
+       {0xCE0, 0x00222222}, {0xCE4, 0x10000000},
+       {0xCE8, 0x37644302}, {0xCEC, 0x2F97D40C},
+       {0xD00, 0x04030740}, {0xD04, 0x40020401},
+       {0xD08, 0x0000907F}, {0xD0C, 0x20010201},
+       {0xD10, 0xA0633333}, {0xD14, 0x3333BC53},
+       {0xD18, 0x7A8F5B6F}, {0xD2C, 0xCB979975},
+       {0xD30, 0x00000000}, {0xD34, 0x80608000},
+       {0xD38, 0x98000000}, {0xD3C, 0x40127353},
+       {0xD40, 0x00000000}, {0xD44, 0x00000000},
+       {0xD48, 0x00000000}, {0xD4C, 0x00000000},
+       {0xD50, 0x6437140A}, {0xD54, 0x00000000},
+       {0xD58, 0x00000282}, {0xD5C, 0x30032064},
+       {0xD60, 0x4653DE68}, {0xD64, 0x04518A3C},
+       {0xD68, 0x00002101}, {0xD6C, 0x2A201C16},
+       {0xD70, 0x1812362E}, {0xD74, 0x322C2220},
+       {0xD78, 0x000E3C24}, {0xE00, 0x2D2D2D2D},
+       {0xE04, 0x2D2D2D2D}, {0xE08, 0x0390272D},
+       {0xE10, 0x2D2D2D2D}, {0xE14, 0x2D2D2D2D},
+       {0xE18, 0x2D2D2D2D}, {0xE1C, 0x2D2D2D2D},
+       {0xE28, 0x00000000}, {0xE30, 0x1000DC1F},
+       {0xE34, 0x10008C1F}, {0xE38, 0x02140102},
+       {0xE3C, 0x681604C2}, {0xE40, 0x01007C00},
+       {0xE44, 0x01004800}, {0xE48, 0xFB000000},
+       {0xE4C, 0x000028D1}, {0xE50, 0x1000DC1F},
+       {0xE54, 0x10008C1F}, {0xE58, 0x02140102},
+       {0xE5C, 0x28160D05}, {0xE60, 0x00000008},
+       {0xE60, 0x021400A0}, {0xE64, 0x281600A0},
+       {0xE6C, 0x01C00010}, {0xE70, 0x01C00010},
+       {0xE74, 0x02000010}, {0xE78, 0x02000010},
+       {0xE7C, 0x02000010}, {0xE80, 0x02000010},
+       {0xE84, 0x01C00010}, {0xE88, 0x02000010},
+       {0xE8C, 0x01C00010}, {0xED0, 0x01C00010},
+       {0xED4, 0x01C00010}, {0xED8, 0x01C00010},
+       {0xEDC, 0x00000010}, {0xEE0, 0x00000010},
+       {0xEEC, 0x03C00010}, {0xF14, 0x00000003},
+       {0xF4C, 0x00000000}, {0xF00, 0x00000300},
+       {0xffff, 0xffffffff},
+};
+
+static const struct rtl8xxxu_reg32val rtl8188f_agc_table[] = {
+       {0xC78, 0xFC000001}, {0xC78, 0xFB010001},
+       {0xC78, 0xFA020001}, {0xC78, 0xF9030001},
+       {0xC78, 0xF8040001}, {0xC78, 0xF7050001},
+       {0xC78, 0xF6060001}, {0xC78, 0xF5070001},
+       {0xC78, 0xF4080001}, {0xC78, 0xF3090001},
+       {0xC78, 0xF20A0001}, {0xC78, 0xF10B0001},
+       {0xC78, 0xF00C0001}, {0xC78, 0xEF0D0001},
+       {0xC78, 0xEE0E0001}, {0xC78, 0xED0F0001},
+       {0xC78, 0xEC100001}, {0xC78, 0xEB110001},
+       {0xC78, 0xEA120001}, {0xC78, 0xE9130001},
+       {0xC78, 0xE8140001}, {0xC78, 0xE7150001},
+       {0xC78, 0xE6160001}, {0xC78, 0xE5170001},
+       {0xC78, 0xE4180001}, {0xC78, 0xE3190001},
+       {0xC78, 0xE21A0001}, {0xC78, 0xE11B0001},
+       {0xC78, 0xE01C0001}, {0xC78, 0xC21D0001},
+       {0xC78, 0xC11E0001}, {0xC78, 0xC01F0001},
+       {0xC78, 0xA5200001}, {0xC78, 0xA4210001},
+       {0xC78, 0xA3220001}, {0xC78, 0xA2230001},
+       {0xC78, 0xA1240001}, {0xC78, 0xA0250001},
+       {0xC78, 0x65260001}, {0xC78, 0x64270001},
+       {0xC78, 0x63280001}, {0xC78, 0x62290001},
+       {0xC78, 0x612A0001}, {0xC78, 0x442B0001},
+       {0xC78, 0x432C0001}, {0xC78, 0x422D0001},
+       {0xC78, 0x412E0001}, {0xC78, 0x402F0001},
+       {0xC78, 0x21300001}, {0xC78, 0x20310001},
+       {0xC78, 0x05320001}, {0xC78, 0x04330001},
+       {0xC78, 0x03340001}, {0xC78, 0x02350001},
+       {0xC78, 0x01360001}, {0xC78, 0x00370001},
+       {0xC78, 0x00380001}, {0xC78, 0x00390001},
+       {0xC78, 0x003A0001}, {0xC78, 0x003B0001},
+       {0xC78, 0x003C0001}, {0xC78, 0x003D0001},
+       {0xC78, 0x003E0001}, {0xC78, 0x003F0001},
+       {0xC50, 0x69553422}, {0xC50, 0x69553420},
+       {0xffff, 0xffffffff}
+};
+
+static const struct rtl8xxxu_rfregval rtl8188fu_radioa_init_table[] = {
+       {0x00, 0x00030000}, {0x08, 0x00008400},
+       {0x18, 0x00000407}, {0x19, 0x00000012},
+       {0x1B, 0x00001C6C},
+       {0x1E, 0x00080009}, {0x1F, 0x00000880},
+       {0x2F, 0x0001A060}, {0x3F, 0x00028000},
+       {0x42, 0x000060C0}, {0x57, 0x000D0000},
+       {0x58, 0x000C0160}, {0x67, 0x00001552},
+       {0x83, 0x00000000}, {0xB0, 0x000FF9F0},
+       {0xB1, 0x00022218}, {0xB2, 0x00034C00},
+       {0xB4, 0x0004484B}, {0xB5, 0x0000112A},
+       {0xB6, 0x0000053E}, {0xB7, 0x00010408},
+       {0xB8, 0x00010200}, {0xB9, 0x00080001},
+       {0xBA, 0x00040001}, {0xBB, 0x00000400},
+       {0xBF, 0x000C0000}, {0xC2, 0x00002400},
+       {0xC3, 0x00000009}, {0xC4, 0x00040C91},
+       {0xC5, 0x00099999}, {0xC6, 0x000000A3},
+       {0xC7, 0x0008F820}, {0xC8, 0x00076C06},
+       {0xC9, 0x00000000}, {0xCA, 0x00080000},
+       {0xDF, 0x00000180}, {0xEF, 0x000001A0},
+       {0x51, 0x000E8333}, {0x52, 0x000FAC2C},
+       {0x53, 0x00000103}, {0x56, 0x000517F0},
+       {0x35, 0x00000099}, {0x35, 0x00000199},
+       {0x35, 0x00000299}, {0x36, 0x00000064},
+       {0x36, 0x00008064}, {0x36, 0x00010064},
+       {0x36, 0x00018064}, {0x18, 0x00000C07},
+       {0x5A, 0x00048000}, {0x19, 0x000739D0},
+       {0x34, 0x0000ADD6}, {0x34, 0x00009DD3},
+       {0x34, 0x00008CF4}, {0x34, 0x00007CF1},
+       {0x34, 0x00006CEE}, {0x34, 0x00005CEB},
+       {0x34, 0x00004CCE}, {0x34, 0x00003CCB},
+       {0x34, 0x00002CC8}, {0x34, 0x00001C4B},
+       {0x34, 0x00000C48},
+       {0x00, 0x00030159}, {0x84, 0x00048000},
+       {0x86, 0x0000002A}, {0x87, 0x00000025},
+       {0x8E, 0x00065540}, {0x8F, 0x00088000},
+       {0xEF, 0x000020A0}, {0x3B, 0x000F0F00},
+       {0x3B, 0x000E0B00}, {0x3B, 0x000D0900},
+       {0x3B, 0x000C0700}, {0x3B, 0x000B0600},
+       {0x3B, 0x000A0400}, {0x3B, 0x00090200},
+       {0x3B, 0x00080000}, {0x3B, 0x0007BF00},
+       {0x3B, 0x00060B00}, {0x3B, 0x0005C900},
+       {0x3B, 0x00040700}, {0x3B, 0x00030600},
+       {0x3B, 0x0002D500}, {0x3B, 0x00010200},
+       {0x3B, 0x0000E000}, {0xEF, 0x000000A0},
+       {0xEF, 0x00000010}, {0x3B, 0x0000C0A8},
+       {0x3B, 0x00010400}, {0xEF, 0x00000000},
+       {0xEF, 0x00080000}, {0x30, 0x00010000},
+       {0x31, 0x0000000F}, {0x32, 0x00007EFE},
+       {0xEF, 0x00000000}, {0x00, 0x00010159},
+       {0x18, 0x0000FC07}, {0xFE, 0x00000000},
+       {0xFE, 0x00000000}, {0x1F, 0x00080003},
+       {0xFE, 0x00000000}, {0xFE, 0x00000000},
+       {0x1E, 0x00000001}, {0x1F, 0x00080000},
+       {0x00, 0x00033D95},
+       {0xff, 0xffffffff}
+};
+
+static const struct rtl8xxxu_rfregval rtl8188fu_cut_b_radioa_init_table[] = {
+       {0x00, 0x00030000}, {0x08, 0x00008400},
+       {0x18, 0x00000407}, {0x19, 0x00000012},
+       {0x1B, 0x00001C6C},
+       {0x1E, 0x00080009}, {0x1F, 0x00000880},
+       {0x2F, 0x0001A060}, {0x3F, 0x00028000},
+       {0x42, 0x000060C0}, {0x57, 0x000D0000},
+       {0x58, 0x000C0160}, {0x67, 0x00001552},
+       {0x83, 0x00000000}, {0xB0, 0x000FF9F0},
+       {0xB1, 0x00022218}, {0xB2, 0x00034C00},
+       {0xB4, 0x0004484B}, {0xB5, 0x0000112A},
+       {0xB6, 0x0000053E}, {0xB7, 0x00010408},
+       {0xB8, 0x00010200}, {0xB9, 0x00080001},
+       {0xBA, 0x00040001}, {0xBB, 0x00000400},
+       {0xBF, 0x000C0000}, {0xC2, 0x00002400},
+       {0xC3, 0x00000009}, {0xC4, 0x00040C91},
+       {0xC5, 0x00099999}, {0xC6, 0x000000A3},
+       {0xC7, 0x0008F820}, {0xC8, 0x00076C06},
+       {0xC9, 0x00000000}, {0xCA, 0x00080000},
+       {0xDF, 0x00000180}, {0xEF, 0x000001A0},
+       {0x51, 0x000E8231}, {0x52, 0x000FAC2C},
+       {0x53, 0x00000141}, {0x56, 0x000517F0},
+       {0x35, 0x00000090}, {0x35, 0x00000190},
+       {0x35, 0x00000290}, {0x36, 0x00001064},
+       {0x36, 0x00009064}, {0x36, 0x00011064},
+       {0x36, 0x00019064}, {0x18, 0x00000C07},
+       {0x5A, 0x00048000}, {0x19, 0x000739D0},
+       {0x34, 0x0000ADD2}, {0x34, 0x00009DD0},
+       {0x34, 0x00008CF3}, {0x34, 0x00007CF0},
+       {0x34, 0x00006CED}, {0x34, 0x00005CD2},
+       {0x34, 0x00004CCF}, {0x34, 0x00003CCC},
+       {0x34, 0x00002CC9}, {0x34, 0x00001C4C},
+       {0x34, 0x00000C49},
+       {0x00, 0x00030159}, {0x84, 0x00048000},
+       {0x86, 0x0000002A}, {0x87, 0x00000025},
+       {0x8E, 0x00065540}, {0x8F, 0x00088000},
+       {0xEF, 0x000020A0}, {0x3B, 0x000F0F00},
+       {0x3B, 0x000E0B00}, {0x3B, 0x000D0900},
+       {0x3B, 0x000C0700}, {0x3B, 0x000B0600},
+       {0x3B, 0x000A0400}, {0x3B, 0x00090200},
+       {0x3B, 0x00080000}, {0x3B, 0x0007BF00},
+       {0x3B, 0x00060B00}, {0x3B, 0x0005C900},
+       {0x3B, 0x00040700}, {0x3B, 0x00030600},
+       {0x3B, 0x0002D500}, {0x3B, 0x00010200},
+       {0x3B, 0x0000E000}, {0xEF, 0x000000A0},
+       {0xEF, 0x00000010}, {0x3B, 0x0000C0A8},
+       {0x3B, 0x00010400}, {0xEF, 0x00000000},
+       {0xEF, 0x00080000}, {0x30, 0x00010000},
+       {0x31, 0x0000000F}, {0x32, 0x00007EFE},
+       {0xEF, 0x00000000}, {0x00, 0x00010159},
+       {0x18, 0x0000FC07}, {0xFE, 0x00000000},
+       {0xFE, 0x00000000}, {0x1F, 0x00080003},
+       {0xFE, 0x00000000}, {0xFE, 0x00000000},
+       {0x1E, 0x00000001}, {0x1F, 0x00080000},
+       {0x00, 0x00033D95},
+       {0xff, 0xffffffff}
+};
+
+static void rtl8xxxu_8188f_channel_to_group(int channel, int *group, int *cck_group)
+{
+       if (channel < 3)
+               *group = 0;
+       else if (channel < 6)
+               *group = 1;
+       else if (channel < 9)
+               *group = 2;
+       else if (channel < 12)
+               *group = 3;
+       else
+               *group = 4;
+
+       if (channel == 14)
+               *cck_group = 5;
+       else
+               *cck_group = *group;
+}
+
+static void
+rtl8188f_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
+{
+       u32 val32, ofdm, mcs;
+       u8 cck, ofdmbase, mcsbase;
+       int group, cck_group;
+
+       rtl8xxxu_8188f_channel_to_group(channel, &group, &cck_group);
+
+       cck = priv->cck_tx_power_index_A[cck_group];
+
+       val32 = rtl8xxxu_read32(priv, REG_TX_AGC_A_CCK1_MCS32);
+       val32 &= 0xffff00ff;
+       val32 |= (cck << 8);
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_CCK1_MCS32, val32);
+
+       val32 = rtl8xxxu_read32(priv, REG_TX_AGC_B_CCK11_A_CCK2_11);
+       val32 &= 0xff;
+       val32 |= ((cck << 8) | (cck << 16) | (cck << 24));
+       rtl8xxxu_write32(priv, REG_TX_AGC_B_CCK11_A_CCK2_11, val32);
+
+       ofdmbase = priv->ht40_1s_tx_power_index_A[group];
+       ofdmbase += priv->ofdm_tx_power_diff[0].a;
+       ofdm = ofdmbase | ofdmbase << 8 | ofdmbase << 16 | ofdmbase << 24;
+
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_RATE18_06, ofdm);
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_RATE54_24, ofdm);
+
+       mcsbase = priv->ht40_1s_tx_power_index_A[group];
+       if (ht40)
+               /* This diff is always 0 - not used in 8188FU. */
+               mcsbase += priv->ht40_tx_power_diff[0].a;
+       else
+               mcsbase += priv->ht20_tx_power_diff[0].a;
+       mcs = mcsbase | mcsbase << 8 | mcsbase << 16 | mcsbase << 24;
+
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS03_MCS00, mcs);
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS07_MCS04, mcs);
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS11_MCS08, mcs);
+       rtl8xxxu_write32(priv, REG_TX_AGC_A_MCS15_MCS12, mcs);
+}
+
+/* A workaround to eliminate the 2400MHz, 2440MHz, 2480MHz spur of 8188F. */
+static void rtl8188f_spur_calibration(struct rtl8xxxu_priv *priv, u8 channel)
+{
+       static const u32 frequencies[14 + 1] = {
+               [5] = 0xFCCD,
+               [6] = 0xFC4D,
+               [7] = 0xFFCD,
+               [8] = 0xFF4D,
+               [11] = 0xFDCD,
+               [13] = 0xFCCD,
+               [14] = 0xFF9A
+       };
+
+       static const u32 reg_d40[14 + 1] = {
+               [5] = 0x06000000,
+               [6] = 0x00000600,
+               [13] = 0x06000000
+       };
+
+       static const u32 reg_d44[14 + 1] = {
+               [11] = 0x04000000
+       };
+
+       static const u32 reg_d4c[14 + 1] = {
+               [7] = 0x06000000,
+               [8] = 0x00000380,
+               [14] = 0x00180000
+       };
+
+       const u8 threshold = 0x16;
+       bool do_notch, hw_ctrl, sw_ctrl, hw_ctrl_s1 = 0, sw_ctrl_s1 = 0;
+       u32 val32, initial_gain, reg948;
+
+       val32 = rtl8xxxu_read32(priv, REG_OFDM0_RX_D_SYNC_PATH);
+       val32 |= GENMASK(28, 24);
+       rtl8xxxu_write32(priv, REG_OFDM0_RX_D_SYNC_PATH, val32);
+
+       /* enable notch filter */
+       val32 = rtl8xxxu_read32(priv, REG_OFDM0_RX_D_SYNC_PATH);
+       val32 |= BIT(9);
+       rtl8xxxu_write32(priv, REG_OFDM0_RX_D_SYNC_PATH, val32);
+
+       if (channel <= 14 && frequencies[channel] > 0) {
+               reg948 = rtl8xxxu_read32(priv, REG_S0S1_PATH_SWITCH);
+               hw_ctrl = reg948 & BIT(6);
+               sw_ctrl = !hw_ctrl;
+
+               if (hw_ctrl) {
+                       val32 = rtl8xxxu_read32(priv, REG_FPGA0_XB_RF_INT_OE);
+                       val32 &= GENMASK(5, 3);
+                       hw_ctrl_s1 = val32 == BIT(3);
+               } else if (sw_ctrl) {
+                       sw_ctrl_s1 = !(reg948 & BIT(9));
+               }
+
+               if (hw_ctrl_s1 || sw_ctrl_s1) {
+                       initial_gain = rtl8xxxu_read32(priv, REG_OFDM0_XA_AGC_CORE1);
+
+                       /* Disable CCK block */
+                       val32 = rtl8xxxu_read32(priv, REG_FPGA0_RF_MODE);
+                       val32 &= ~FPGA_RF_MODE_CCK;
+                       rtl8xxxu_write32(priv, REG_FPGA0_RF_MODE, val32);
+
+                       val32 = initial_gain & ~OFDM0_X_AGC_CORE1_IGI_MASK;
+                       val32 |= 0x30;
+                       rtl8xxxu_write32(priv, REG_OFDM0_XA_AGC_CORE1, val32);
+
+                       /* disable 3-wire */
+                       rtl8xxxu_write32(priv, REG_FPGA0_ANALOG4, 0xccf000c0);
+
+                       /* Setup PSD */
+                       rtl8xxxu_write32(priv, REG_FPGA0_PSD_FUNC, frequencies[channel]);
+
+                       /* Start PSD */
+                       rtl8xxxu_write32(priv, REG_FPGA0_PSD_FUNC, 0x400000 | frequencies[channel]);
+
+                       msleep(30);
+
+                       do_notch = rtl8xxxu_read32(priv, REG_FPGA0_PSD_REPORT) >= threshold;
+
+                       /* turn off PSD */
+                       rtl8xxxu_write32(priv, REG_FPGA0_PSD_FUNC, frequencies[channel]);
+
+                       /* enable 3-wire */
+                       rtl8xxxu_write32(priv, REG_FPGA0_ANALOG4, 0xccc000c0);
+
+                       /* Enable CCK block */
+                       val32 = rtl8xxxu_read32(priv, REG_FPGA0_RF_MODE);
+                       val32 |= FPGA_RF_MODE_CCK;
+                       rtl8xxxu_write32(priv, REG_FPGA0_RF_MODE, val32);
+
+                       rtl8xxxu_write32(priv, REG_OFDM0_XA_AGC_CORE1, initial_gain);
+
+                       if (do_notch) {
+                               rtl8xxxu_write32(priv, REG_OFDM1_CSI_FIX_MASK1, reg_d40[channel]);
+                               rtl8xxxu_write32(priv, REG_OFDM1_CSI_FIX_MASK2, reg_d44[channel]);
+                               rtl8xxxu_write32(priv, 0xd48, 0x0);
+                               rtl8xxxu_write32(priv, 0xd4c, reg_d4c[channel]);
+
+                               /* enable CSI mask */
+                               val32 = rtl8xxxu_read32(priv, REG_OFDM1_CFO_TRACKING);
+                               val32 |= BIT(28);
+                               rtl8xxxu_write32(priv, REG_OFDM1_CFO_TRACKING, val32);
+
+                               return;
+                       }
+               }
+       }
+
+       /* disable CSI mask function */
+       val32 = rtl8xxxu_read32(priv, REG_OFDM1_CFO_TRACKING);
+       val32 &= ~BIT(28);
+       rtl8xxxu_write32(priv, REG_OFDM1_CFO_TRACKING, val32);
+}
+
+static void rtl8188fu_config_channel(struct ieee80211_hw *hw)
+{
+       struct rtl8xxxu_priv *priv = hw->priv;
+       u32 val32;
+       u8 channel, subchannel;
+       bool sec_ch_above;
+
+       channel = (u8)hw->conf.chandef.chan->hw_value;
+
+       /* Set channel */
+       val32 = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_MODE_AG);
+       val32 &= ~MODE_AG_CHANNEL_MASK;
+       val32 |= channel;
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_MODE_AG, val32);
+
+       /* Spur calibration */
+       rtl8188f_spur_calibration(priv, channel);
+
+       /* Set bandwidth mode */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_RF_MODE);
+       val32 &= ~FPGA_RF_MODE;
+       val32 |= hw->conf.chandef.width == NL80211_CHAN_WIDTH_40;
+       rtl8xxxu_write32(priv, REG_FPGA0_RF_MODE, val32);
+
+       val32 = rtl8xxxu_read32(priv, REG_FPGA1_RF_MODE);
+       val32 &= ~FPGA_RF_MODE;
+       val32 |= hw->conf.chandef.width == NL80211_CHAN_WIDTH_40;
+       rtl8xxxu_write32(priv, REG_FPGA1_RF_MODE, val32);
+
+       /* RXADC CLK */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_RF_MODE);
+       val32 |= GENMASK(10, 8);
+       rtl8xxxu_write32(priv, REG_FPGA0_RF_MODE, val32);
+
+       /* TXDAC CLK */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_RF_MODE);
+       val32 |= BIT(14) | BIT(12);
+       val32 &= ~BIT(13);
+       rtl8xxxu_write32(priv, REG_FPGA0_RF_MODE, val32);
+
+       /* small BW */
+       val32 = rtl8xxxu_read32(priv, REG_OFDM0_TX_PSDO_NOISE_WEIGHT);
+       val32 &= ~GENMASK(31, 30);
+       rtl8xxxu_write32(priv, REG_OFDM0_TX_PSDO_NOISE_WEIGHT, val32);
+
+       /* adc buffer clk */
+       val32 = rtl8xxxu_read32(priv, REG_OFDM0_TX_PSDO_NOISE_WEIGHT);
+       val32 &= ~BIT(29);
+       val32 |= BIT(28);
+       rtl8xxxu_write32(priv, REG_OFDM0_TX_PSDO_NOISE_WEIGHT, val32);
+
+       /* adc buffer clk */
+       val32 = rtl8xxxu_read32(priv, REG_OFDM0_XA_RX_AFE);
+       val32 &= ~BIT(29);
+       val32 |= BIT(28);
+       rtl8xxxu_write32(priv, REG_OFDM0_XA_RX_AFE, val32);
+
+       val32 = rtl8xxxu_read32(priv, REG_OFDM_RX_DFIR);
+       val32 &= ~BIT(19);
+       rtl8xxxu_write32(priv, REG_OFDM_RX_DFIR, val32);
+
+       val32 = rtl8xxxu_read32(priv, REG_OFDM_RX_DFIR);
+       val32 &= ~GENMASK(23, 20);
+       val32 |= BIT(21);
+       if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_20 ||
+           hw->conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
+               val32 |= BIT(20);
+       else if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_40)
+               val32 |= BIT(22);
+       rtl8xxxu_write32(priv, REG_OFDM_RX_DFIR, val32);
+
+       if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_40) {
+               if (hw->conf.chandef.center_freq1 >
+                   hw->conf.chandef.chan->center_freq) {
+                       sec_ch_above = 1;
+                       channel += 2;
+               } else {
+                       sec_ch_above = 0;
+                       channel -= 2;
+               }
+
+               /* Set Control channel to upper or lower. */
+               val32 = rtl8xxxu_read32(priv, REG_CCK0_SYSTEM);
+               val32 &= ~CCK0_SIDEBAND;
+               if (!sec_ch_above)
+                       val32 |= CCK0_SIDEBAND;
+               rtl8xxxu_write32(priv, REG_CCK0_SYSTEM, val32);
+
+               val32 = rtl8xxxu_read32(priv, REG_DATA_SUBCHANNEL);
+               val32 &= ~GENMASK(3, 0);
+               if (sec_ch_above)
+                       subchannel = 2;
+               else
+                       subchannel = 1;
+               val32 |= subchannel;
+               rtl8xxxu_write32(priv, REG_DATA_SUBCHANNEL, val32);
+
+               val32 = rtl8xxxu_read32(priv, REG_RESPONSE_RATE_SET);
+               val32 &= ~RSR_RSC_BANDWIDTH_40M;
+               rtl8xxxu_write32(priv, REG_RESPONSE_RATE_SET, val32);
+       }
+
+       /* RF TRX_BW */
+       val32 = channel;
+       if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_20 ||
+           hw->conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
+               val32 |= MODE_AG_BW_20MHZ_8723B;
+       else if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_40)
+               val32 |= MODE_AG_BW_40MHZ_8723B;
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_MODE_AG, val32);
+
+       /* FILTER BW&RC Corner (ACPR) */
+       if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_20 ||
+           hw->conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
+               val32 = 0x00065;
+       else if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_40)
+               val32 = 0x00025;
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RXG_MIX_SWBW, val32);
+
+       if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_20 ||
+           hw->conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
+               val32 = 0x0;
+       else if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_40)
+               val32 = 0x01000;
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RX_BB2, val32);
+
+       /* RC Corner */
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_DF, 0x00140);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RX_G2, 0x01c6c);
+}
+
+static void rtl8188fu_init_aggregation(struct rtl8xxxu_priv *priv)
+{
+       u8 agg_ctrl, rxdma_mode, usb_tx_agg_desc_num = 6;
+       u32 agg_rx, val32;
+
+       /* TX aggregation */
+       val32 = rtl8xxxu_read32(priv, REG_DWBCN0_CTRL_8188F);
+       val32 &= ~(0xf << 4);
+       val32 |= usb_tx_agg_desc_num << 4;
+       rtl8xxxu_write32(priv, REG_DWBCN0_CTRL_8188F, val32);
+       rtl8xxxu_write8(priv, REG_DWBCN1_CTRL_8723B, usb_tx_agg_desc_num << 1);
+
+       /* RX aggregation */
+       agg_ctrl = rtl8xxxu_read8(priv, REG_TRXDMA_CTRL);
+       agg_ctrl &= ~TRXDMA_CTRL_RXDMA_AGG_EN;
+
+       agg_rx = rtl8xxxu_read32(priv, REG_RXDMA_AGG_PG_TH);
+       agg_rx &= ~RXDMA_USB_AGG_ENABLE;
+       agg_rx &= ~0xFF0F; /* reset agg size and timeout */
+
+       rxdma_mode = rtl8xxxu_read8(priv, REG_RXDMA_PRO_8723B);
+       rxdma_mode &= ~BIT(1);
+
+       rtl8xxxu_write8(priv, REG_TRXDMA_CTRL, agg_ctrl);
+       rtl8xxxu_write32(priv, REG_RXDMA_AGG_PG_TH, agg_rx);
+       rtl8xxxu_write8(priv, REG_RXDMA_PRO_8723B, rxdma_mode);
+}
+
+static void rtl8188fu_init_statistics(struct rtl8xxxu_priv *priv)
+{
+       u32 val32;
+
+       /* Time duration for NHM unit: 4us, 0xc350=200ms */
+       rtl8xxxu_write16(priv, REG_NHM_TIMER_8723B + 2, 0xc350);
+       rtl8xxxu_write16(priv, REG_NHM_TH9_TH10_8723B + 2, 0xffff);
+       rtl8xxxu_write32(priv, REG_NHM_TH3_TO_TH0_8723B, 0xffffff50);
+       rtl8xxxu_write32(priv, REG_NHM_TH7_TO_TH4_8723B, 0xffffffff);
+
+       /* TH8 */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 |= 0xff;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       /* Enable CCK */
+       val32 = rtl8xxxu_read32(priv, REG_NHM_TH9_TH10_8723B);
+       val32 &= ~(BIT(8) | BIT(9) | BIT(10));
+       val32 |= BIT(8);
+       rtl8xxxu_write32(priv, REG_NHM_TH9_TH10_8723B, val32);
+
+       /* Max power amongst all RX antennas */
+       val32 = rtl8xxxu_read32(priv, REG_OFDM0_FA_RSTC);
+       val32 |= BIT(7);
+       rtl8xxxu_write32(priv, REG_OFDM0_FA_RSTC, val32);
+}
+
+static int rtl8188fu_parse_efuse(struct rtl8xxxu_priv *priv)
+{
+       struct rtl8188fu_efuse *efuse = &priv->efuse_wifi.efuse8188fu;
+       int i;
+
+       if (efuse->rtl_id != cpu_to_le16(0x8129))
+               return -EINVAL;
+
+       ether_addr_copy(priv->mac_addr, efuse->mac_addr);
+
+       memcpy(priv->cck_tx_power_index_A, efuse->tx_power_index_A.cck_base,
+              sizeof(efuse->tx_power_index_A.cck_base));
+
+       memcpy(priv->ht40_1s_tx_power_index_A,
+              efuse->tx_power_index_A.ht40_base,
+              sizeof(efuse->tx_power_index_A.ht40_base));
+
+       priv->ofdm_tx_power_diff[0].a = efuse->tx_power_index_A.ht20_ofdm_1s_diff.a;
+       priv->ht20_tx_power_diff[0].a = efuse->tx_power_index_A.ht20_ofdm_1s_diff.b;
+
+       priv->xtalk = efuse->xtal_k & 0x3f;
+
+       dev_info(&priv->udev->dev, "Vendor: %.7s\n", efuse->vendor_name);
+       dev_info(&priv->udev->dev, "Product: %.7s\n", efuse->device_name);
+
+       if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) {
+               unsigned char *raw = priv->efuse_wifi.raw;
+
+               dev_info(&priv->udev->dev,
+                        "%s: dumping efuse (0x%02zx bytes):\n",
+                        __func__, sizeof(struct rtl8188fu_efuse));
+               for (i = 0; i < sizeof(struct rtl8188fu_efuse); i += 8)
+                       dev_info(&priv->udev->dev, "%02x: %8ph\n", i, &raw[i]);
+       }
+
+       return 0;
+}
+
+static int rtl8188fu_load_firmware(struct rtl8xxxu_priv *priv)
+{
+       char *fw_name;
+       int ret;
+
+       fw_name = "rtlwifi/rtl8188fufw.bin";
+
+       ret = rtl8xxxu_load_firmware(priv, fw_name);
+
+       return ret;
+}
+
+static void rtl8188fu_init_phy_bb(struct rtl8xxxu_priv *priv)
+{
+       u8 val8;
+       u16 val16;
+       u32 val32;
+
+       /* Enable BB and RF */
+       val16 = rtl8xxxu_read16(priv, REG_SYS_FUNC);
+       val16 |= SYS_FUNC_BB_GLB_RSTN | SYS_FUNC_BBRSTB | SYS_FUNC_DIO_RF;
+       rtl8xxxu_write16(priv, REG_SYS_FUNC, val16);
+
+       /*
+        * Per vendor driver, run power sequence before init of RF
+        */
+       val8 = RF_ENABLE | RF_RSTB | RF_SDMRSTB;
+       rtl8xxxu_write8(priv, REG_RF_CTRL, val8);
+
+       usleep_range(10, 20);
+
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_IQADJ_G1, 0x780);
+
+       val8 = SYS_FUNC_BB_GLB_RSTN | SYS_FUNC_BBRSTB | SYS_FUNC_USBA | SYS_FUNC_USBD;
+       rtl8xxxu_write8(priv, REG_SYS_FUNC, val8);
+
+       rtl8xxxu_init_phy_regs(priv, rtl8188fu_phy_init_table);
+       rtl8xxxu_init_phy_regs(priv, rtl8188f_agc_table);
+
+       val32 = rtl8xxxu_read32(priv, REG_AFE_XTAL_CTRL);
+       val8 = priv->xtalk;
+       val32 &= ~0x007FF800;
+       val32 |= ((val8 | (val8 << 6)) << 11);
+       rtl8xxxu_write32(priv, REG_AFE_XTAL_CTRL, val32);
+}
+
+static int rtl8188fu_init_phy_rf(struct rtl8xxxu_priv *priv)
+{
+       int ret;
+
+       if (priv->chip_cut == 1)
+               ret = rtl8xxxu_init_phy_rf(priv, rtl8188fu_cut_b_radioa_init_table, RF_A);
+       else
+               ret = rtl8xxxu_init_phy_rf(priv, rtl8188fu_radioa_init_table, RF_A);
+
+       return ret;
+}
+
+static void rtl8188f_phy_lc_calibrate(struct rtl8xxxu_priv *priv)
+{
+       u32 val32;
+       u32 rf_amode, lstf;
+       int i;
+
+       /* Check continuous TX and Packet TX */
+       lstf = rtl8xxxu_read32(priv, REG_OFDM1_LSTF);
+
+       if (lstf & OFDM_LSTF_MASK) {
+               /* Disable all continuous TX */
+               val32 = lstf & ~OFDM_LSTF_MASK;
+               rtl8xxxu_write32(priv, REG_OFDM1_LSTF, val32);
+       } else {
+               /* Deal with Packet TX case */
+               /* block all queues */
+               rtl8xxxu_write8(priv, REG_TXPAUSE, 0xff);
+       }
+
+       /* Read original RF mode Path A */
+       rf_amode = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_MODE_AG);
+
+       /* Start LC calibration */
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_MODE_AG, rf_amode | 0x08000);
+
+       for (i = 0; i < 100; i++) {
+               if ((rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_MODE_AG) & 0x08000) == 0)
+                       break;
+               msleep(10);
+       }
+
+       if (i == 100)
+               dev_warn(&priv->udev->dev, "LC calibration timed out.\n");
+
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_MODE_AG, rf_amode);
+
+       /* Restore original parameters */
+       if (lstf & OFDM_LSTF_MASK)
+               rtl8xxxu_write32(priv, REG_OFDM1_LSTF, lstf);
+       else /*  Deal with Packet TX case */
+               rtl8xxxu_write8(priv, REG_TXPAUSE, 0x00);
+}
+
+static int rtl8188fu_iqk_path_a(struct rtl8xxxu_priv *priv, u32 *lok_result)
+{
+       u32 reg_eac, reg_e94, reg_e9c, val32;
+       int result = 0;
+
+       /*
+        * Leave IQK mode
+        */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0x000000ff;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       /*
+        * Enable path A PA in TX IQK mode
+        */
+       val32 = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_WE_LUT);
+       val32 |= 0x80000;
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_WE_LUT, val32);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK_OS, 0x20000);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G1, 0x0000f);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G2, 0x07ff7);
+
+       /* PA,PAD gain adjust */
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_DF, 0x980);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_56, 0x5102a);
+
+       /* enter IQK mode */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0x000000ff;
+       val32 |= 0x80800000;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       /* path-A IQK setting */
+       rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x18008c1c);
+       rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x38008c1c);
+
+       rtl8xxxu_write32(priv, REG_TX_IQK_PI_A, 0x821403ff);
+       rtl8xxxu_write32(priv, REG_RX_IQK_PI_A, 0x28160000);
+
+       /* LO calibration setting */
+       rtl8xxxu_write32(priv, REG_IQK_AGC_RSP, 0x00462911);
+
+       /* One shot, path A LOK & IQK */
+       rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf9000000);
+       rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf8000000);
+
+       mdelay(25);
+
+       /*
+        * Leave IQK mode
+        */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0x000000ff;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_DF, 0x180);
+
+       /* save LOK result */
+       *lok_result = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_TXM_IDAC);
+
+       /* Check failed */
+       reg_eac = rtl8xxxu_read32(priv, REG_RX_POWER_AFTER_IQK_A_2);
+       reg_e94 = rtl8xxxu_read32(priv, REG_TX_POWER_BEFORE_IQK_A);
+       reg_e9c = rtl8xxxu_read32(priv, REG_TX_POWER_AFTER_IQK_A);
+
+       if (!(reg_eac & BIT(28)) &&
+           ((reg_e94 & 0x03ff0000) != 0x01420000) &&
+           ((reg_e9c & 0x03ff0000) != 0x00420000))
+               result |= 0x01;
+
+       return result;
+}
+
+static int rtl8188fu_rx_iqk_path_a(struct rtl8xxxu_priv *priv, u32 lok_result)
+{
+       u32 reg_ea4, reg_eac, reg_e94, reg_e9c, val32;
+       int result = 0;
+
+       /*
+        * Leave IQK mode
+        */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0x000000ff;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       /*
+        * Enable path A PA in TX IQK mode
+        */
+       val32 = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_WE_LUT);
+       val32 |= 0x80000;
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_WE_LUT, val32);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK_OS, 0x30000);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G1, 0x0000f);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G2, 0xf1173);
+
+       /* PA,PAD gain adjust */
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_DF, 0x980);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_56, 0x5102a);
+
+       /*
+        * Enter IQK mode
+        */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0x000000ff;
+       val32 |= 0x80800000;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       /*
+        * Tx IQK setting
+        */
+       rtl8xxxu_write32(priv, REG_TX_IQK, 0x01007c00);
+       rtl8xxxu_write32(priv, REG_RX_IQK, 0x01004800);
+
+       /* path-A IQK setting */
+       rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x10008c1c);
+       rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x30008c1c);
+
+       rtl8xxxu_write32(priv, REG_TX_IQK_PI_A, 0x82160fff);
+       rtl8xxxu_write32(priv, REG_RX_IQK_PI_A, 0x28160000);
+
+       /* LO calibration setting */
+       rtl8xxxu_write32(priv, REG_IQK_AGC_RSP, 0x00462911);
+
+       /* One shot, path A LOK & IQK */
+       rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf9000000);
+       rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf8000000);
+
+       mdelay(25);
+
+       /*
+        * Leave IQK mode
+        */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0x000000ff;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_DF, 0x180);
+
+       /* Check failed */
+       reg_eac = rtl8xxxu_read32(priv, REG_RX_POWER_AFTER_IQK_A_2);
+       reg_e94 = rtl8xxxu_read32(priv, REG_TX_POWER_BEFORE_IQK_A);
+       reg_e9c = rtl8xxxu_read32(priv, REG_TX_POWER_AFTER_IQK_A);
+
+       if (!(reg_eac & BIT(28)) &&
+           ((reg_e94 & 0x03ff0000) != 0x01420000) &&
+           ((reg_e9c & 0x03ff0000) != 0x00420000))
+               result |= 0x01;
+       else /* If TX not OK, ignore RX */
+               goto out;
+
+       val32 = 0x80007c00 | (reg_e94 & 0x3ff0000) |
+               ((reg_e9c & 0x3ff0000) >> 16);
+       rtl8xxxu_write32(priv, REG_TX_IQK, val32);
+
+       /*
+        * Modify RX IQK mode table
+        */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0x000000ff;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       val32 = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_WE_LUT);
+       val32 |= 0x80000;
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_WE_LUT, val32);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK_OS, 0x30000);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G1, 0x0000f);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G2, 0xf7ff2);
+
+       /*
+        * PA, PAD setting
+        */
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_DF, 0x980);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_56, 0x51000);
+
+       /*
+        * Enter IQK mode
+        */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0x000000ff;
+       val32 |= 0x80800000;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       /*
+        * RX IQK setting
+        */
+       rtl8xxxu_write32(priv, REG_RX_IQK, 0x01004800);
+
+       /* path-A IQK setting */
+       rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x30008c1c);
+       rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x10008c1c);
+
+       rtl8xxxu_write32(priv, REG_TX_IQK_PI_A, 0x82160000);
+       rtl8xxxu_write32(priv, REG_RX_IQK_PI_A, 0x281613ff);
+
+       /* LO calibration setting */
+       rtl8xxxu_write32(priv, REG_IQK_AGC_RSP, 0x0046a911);
+
+       /* One shot, path A LOK & IQK */
+       rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf9000000);
+       rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf8000000);
+
+       mdelay(25);
+
+       /*
+        * Leave IQK mode
+        */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0x000000ff;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_DF, 0x180);
+
+       /* reload LOK value */
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXM_IDAC, lok_result);
+
+       /* Check failed */
+       reg_eac = rtl8xxxu_read32(priv, REG_RX_POWER_AFTER_IQK_A_2);
+       reg_ea4 = rtl8xxxu_read32(priv, REG_RX_POWER_BEFORE_IQK_A_2);
+
+       if (!(reg_eac & BIT(27)) &&
+           ((reg_ea4 & 0x03ff0000) != 0x01320000) &&
+           ((reg_eac & 0x03ff0000) != 0x00360000))
+               result |= 0x02;
+
+out:
+       return result;
+}
+
+static void rtl8188fu_phy_iqcalibrate(struct rtl8xxxu_priv *priv,
+                                     int result[][8], int t)
+{
+       struct device *dev = &priv->udev->dev;
+       u32 i, val32, rx_initial_gain, lok_result;
+       u32 path_sel_bb, path_sel_rf;
+       int path_a_ok;
+       int retry = 2;
+       static const u32 adda_regs[RTL8XXXU_ADDA_REGS] = {
+               REG_FPGA0_XCD_SWITCH_CTRL, REG_BLUETOOTH,
+               REG_RX_WAIT_CCA, REG_TX_CCK_RFON,
+               REG_TX_CCK_BBON, REG_TX_OFDM_RFON,
+               REG_TX_OFDM_BBON, REG_TX_TO_RX,
+               REG_TX_TO_TX, REG_RX_CCK,
+               REG_RX_OFDM, REG_RX_WAIT_RIFS,
+               REG_RX_TO_RX, REG_STANDBY,
+               REG_SLEEP, REG_PMPD_ANAEN
+       };
+       static const u32 iqk_mac_regs[RTL8XXXU_MAC_REGS] = {
+               REG_TXPAUSE, REG_BEACON_CTRL,
+               REG_BEACON_CTRL_1, REG_GPIO_MUXCFG
+       };
+       static const u32 iqk_bb_regs[RTL8XXXU_BB_REGS] = {
+               REG_OFDM0_TRX_PATH_ENABLE, REG_OFDM0_TR_MUX_PAR,
+               REG_FPGA0_XCD_RF_SW_CTRL, REG_CONFIG_ANT_A, REG_CONFIG_ANT_B,
+               REG_FPGA0_XAB_RF_SW_CTRL, REG_FPGA0_XA_RF_INT_OE,
+               REG_FPGA0_XB_RF_INT_OE, REG_FPGA0_RF_MODE
+       };
+
+       /*
+        * Note: IQ calibration must be performed after loading
+        *       PHY_REG.txt , and radio_a, radio_b.txt
+        */
+
+       rx_initial_gain = rtl8xxxu_read32(priv, REG_OFDM0_XA_AGC_CORE1);
+
+       if (t == 0) {
+               /* Save ADDA parameters, turn Path A ADDA on */
+               rtl8xxxu_save_regs(priv, adda_regs, priv->adda_backup,
+                                  RTL8XXXU_ADDA_REGS);
+               rtl8xxxu_save_mac_regs(priv, iqk_mac_regs, priv->mac_backup);
+               rtl8xxxu_save_regs(priv, iqk_bb_regs,
+                                  priv->bb_backup, RTL8XXXU_BB_REGS);
+       }
+
+       rtl8xxxu_path_adda_on(priv, adda_regs, true);
+
+       if (t == 0) {
+               val32 = rtl8xxxu_read32(priv, REG_FPGA0_XA_HSSI_PARM1);
+               priv->pi_enabled = val32 & FPGA0_HSSI_PARM1_PI;
+       }
+
+       /* save RF path */
+       path_sel_bb = rtl8xxxu_read32(priv, REG_S0S1_PATH_SWITCH);
+       path_sel_rf = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_S0S1);
+
+       /* BB setting */
+       rtl8xxxu_write32(priv, REG_OFDM0_TRX_PATH_ENABLE, 0x03a05600);
+       rtl8xxxu_write32(priv, REG_OFDM0_TR_MUX_PAR, 0x000800e4);
+       rtl8xxxu_write32(priv, REG_FPGA0_XCD_RF_SW_CTRL, 0x25204000);
+
+       /* MAC settings */
+       val32 = rtl8xxxu_read32(priv, REG_TX_PTCL_CTRL);
+       val32 |= 0x00ff0000;
+       rtl8xxxu_write32(priv, REG_TX_PTCL_CTRL, val32);
+
+       /* IQ calibration setting */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0xff;
+       val32 |= 0x80800000;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+       rtl8xxxu_write32(priv, REG_TX_IQK, 0x01007c00);
+       rtl8xxxu_write32(priv, REG_RX_IQK, 0x01004800);
+
+       for (i = 0; i < retry; i++) {
+               path_a_ok = rtl8188fu_iqk_path_a(priv, &lok_result);
+               if (path_a_ok == 0x01) {
+                       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+                       val32 &= 0xff;
+                       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+                       val32 = rtl8xxxu_read32(priv,
+                                               REG_TX_POWER_BEFORE_IQK_A);
+                       result[t][0] = (val32 >> 16) & 0x3ff;
+
+                       val32 = rtl8xxxu_read32(priv,
+                                               REG_TX_POWER_AFTER_IQK_A);
+                       result[t][1] = (val32 >> 16) & 0x3ff;
+                       break;
+               }
+       }
+
+       for (i = 0; i < retry; i++) {
+               path_a_ok = rtl8188fu_rx_iqk_path_a(priv, lok_result);
+               if (path_a_ok == 0x03) {
+                       val32 = rtl8xxxu_read32(priv,
+                                               REG_RX_POWER_BEFORE_IQK_A_2);
+                       result[t][2] = (val32 >> 16) & 0x3ff;
+
+                       val32 = rtl8xxxu_read32(priv,
+                                               REG_RX_POWER_AFTER_IQK_A_2);
+                       result[t][3] = (val32 >> 16) & 0x3ff;
+                       break;
+               }
+       }
+
+       if (!path_a_ok)
+               dev_dbg(dev, "%s: Path A IQK failed!\n", __func__);
+
+       /* Back to BB mode, load original value */
+       val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK);
+       val32 &= 0xff;
+       rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32);
+
+       if (t == 0)
+               return;
+
+       if (!priv->pi_enabled) {
+               /*
+                * Switch back BB to SI mode after finishing
+                * IQ Calibration
+                */
+               val32 = 0x01000000;
+               rtl8xxxu_write32(priv, REG_FPGA0_XA_HSSI_PARM1, val32);
+               rtl8xxxu_write32(priv, REG_FPGA0_XB_HSSI_PARM1, val32);
+       }
+
+       /* Reload ADDA power saving parameters */
+       rtl8xxxu_restore_regs(priv, adda_regs, priv->adda_backup,
+                             RTL8XXXU_ADDA_REGS);
+
+       /* Reload MAC parameters */
+       rtl8xxxu_restore_mac_regs(priv, iqk_mac_regs, priv->mac_backup);
+
+       /* Reload BB parameters */
+       rtl8xxxu_restore_regs(priv, iqk_bb_regs,
+                             priv->bb_backup, RTL8XXXU_BB_REGS);
+
+       /* Reload RF path */
+       rtl8xxxu_write32(priv, REG_S0S1_PATH_SWITCH, path_sel_bb);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_S0S1, path_sel_rf);
+
+       /* Restore RX initial gain */
+       val32 = rtl8xxxu_read32(priv, REG_OFDM0_XA_AGC_CORE1);
+       val32 &= 0xffffff00;
+       val32 |= 0x50;
+       rtl8xxxu_write32(priv, REG_OFDM0_XA_AGC_CORE1, val32);
+       val32 = rtl8xxxu_read32(priv, REG_OFDM0_XA_AGC_CORE1);
+       val32 &= 0xffffff00;
+       val32 |= rx_initial_gain & 0xff;
+       rtl8xxxu_write32(priv, REG_OFDM0_XA_AGC_CORE1, val32);
+
+       /* Load 0xe30 IQC default value */
+       rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x01008c00);
+       rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x01008c00);
+}
+
+static void rtl8188fu_phy_iq_calibrate(struct rtl8xxxu_priv *priv)
+{
+       struct device *dev = &priv->udev->dev;
+       int result[4][8]; /* last is final result */
+       int i, candidate;
+       bool path_a_ok;
+       u32 reg_e94, reg_e9c, reg_ea4, reg_eac;
+       u32 reg_eb4, reg_ebc, reg_ec4, reg_ecc;
+       s32 reg_tmp = 0;
+       bool simu;
+       u32 path_sel_bb, path_sel_rf;
+
+       /* Save RF path */
+       path_sel_bb = rtl8xxxu_read32(priv, REG_S0S1_PATH_SWITCH);
+       path_sel_rf = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_S0S1);
+
+       memset(result, 0, sizeof(result));
+       candidate = -1;
+
+       path_a_ok = false;
+
+       for (i = 0; i < 3; i++) {
+               rtl8188fu_phy_iqcalibrate(priv, result, i);
+
+               if (i == 1) {
+                       simu = rtl8xxxu_gen2_simularity_compare(priv, result, 0, 1);
+                       if (simu) {
+                               candidate = 0;
+                               break;
+                       }
+               }
+
+               if (i == 2) {
+                       simu = rtl8xxxu_gen2_simularity_compare(priv, result, 0, 2);
+                       if (simu) {
+                               candidate = 0;
+                               break;
+                       }
+
+                       simu = rtl8xxxu_gen2_simularity_compare(priv, result, 1, 2);
+                       if (simu) {
+                               candidate = 1;
+                       } else {
+                               for (i = 0; i < 8; i++)
+                                       reg_tmp += result[3][i];
+
+                               if (reg_tmp)
+                                       candidate = 3;
+                               else
+                                       candidate = -1;
+                       }
+               }
+       }
+
+       for (i = 0; i < 4; i++) {
+               reg_e94 = result[i][0];
+               reg_e9c = result[i][1];
+               reg_ea4 = result[i][2];
+               reg_eac = result[i][3];
+               reg_eb4 = result[i][4];
+               reg_ebc = result[i][5];
+               reg_ec4 = result[i][6];
+               reg_ecc = result[i][7];
+       }
+
+       if (candidate >= 0) {
+               reg_e94 = result[candidate][0];
+               priv->rege94 =  reg_e94;
+               reg_e9c = result[candidate][1];
+               priv->rege9c = reg_e9c;
+               reg_ea4 = result[candidate][2];
+               reg_eac = result[candidate][3];
+               reg_eb4 = result[candidate][4];
+               priv->regeb4 = reg_eb4;
+               reg_ebc = result[candidate][5];
+               priv->regebc = reg_ebc;
+               reg_ec4 = result[candidate][6];
+               reg_ecc = result[candidate][7];
+               dev_dbg(dev, "%s: candidate is %x\n", __func__, candidate);
+               dev_dbg(dev,
+                       "%s: e94 =%x e9c=%x ea4=%x eac=%x eb4=%x ebc=%x ec4=%x ecc=%x\n",
+                       __func__, reg_e94, reg_e9c,
+                       reg_ea4, reg_eac, reg_eb4, reg_ebc, reg_ec4, reg_ecc);
+               path_a_ok = true;
+       } else {
+               reg_e94 = reg_eb4 = priv->rege94 = priv->regeb4 = 0x100;
+               reg_e9c = reg_ebc = priv->rege9c = priv->regebc = 0x0;
+       }
+
+       if (reg_e94 && candidate >= 0)
+               rtl8xxxu_fill_iqk_matrix_a(priv, path_a_ok, result,
+                                          candidate, (reg_ea4 == 0));
+
+       rtl8xxxu_save_regs(priv, rtl8xxxu_iqk_phy_iq_bb_reg,
+                          priv->bb_recovery_backup, RTL8XXXU_BB_REGS);
+
+       rtl8xxxu_write32(priv, REG_S0S1_PATH_SWITCH, path_sel_bb);
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_S0S1, path_sel_rf);
+}
+
+static void rtl8188f_disabled_to_emu(struct rtl8xxxu_priv *priv)
+{
+       u16 val8;
+
+       /* 0x04[12:11] = 2b'01enable WL suspend */
+       val8 = rtl8xxxu_read8(priv, REG_APS_FSMCO + 1);
+       val8 &= ~((APS_FSMCO_PCIE | APS_FSMCO_HW_SUSPEND) >> 8);
+       rtl8xxxu_write8(priv, REG_APS_FSMCO + 1, val8);
+
+       /* 0xC4[4] <= 1, turn off USB APHY LDO under suspend mode */
+       val8 = rtl8xxxu_read8(priv, 0xc4);
+       val8 &= ~BIT(4);
+       rtl8xxxu_write8(priv, 0xc4, val8);
+}
+
+static int rtl8188f_emu_to_active(struct rtl8xxxu_priv *priv)
+{
+       u8 val8;
+       u32 val32;
+       int count, ret = 0;
+
+       /* Disable SW LPS */
+       val8 = rtl8xxxu_read8(priv, REG_APS_FSMCO + 1);
+       val8 &= ~(APS_FSMCO_SW_LPS >> 8);
+       rtl8xxxu_write8(priv, REG_APS_FSMCO + 1, val8);
+
+       /* wait till 0x04[17] = 1 power ready */
+       for (count = RTL8XXXU_MAX_REG_POLL; count; count--) {
+               val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO);
+               if (val32 & BIT(17))
+                       break;
+
+               udelay(10);
+       }
+
+       if (!count) {
+               ret = -EBUSY;
+               goto exit;
+       }
+
+       /* Disable HWPDN */
+       val8 = rtl8xxxu_read8(priv, REG_APS_FSMCO + 1);
+       val8 &= ~(APS_FSMCO_HW_POWERDOWN >> 8);
+       rtl8xxxu_write8(priv, REG_APS_FSMCO + 1, val8);
+
+       /* Disable WL suspend */
+       val8 = rtl8xxxu_read8(priv, REG_APS_FSMCO + 1);
+       val8 &= ~(APS_FSMCO_HW_SUSPEND >> 8);
+       rtl8xxxu_write8(priv, REG_APS_FSMCO + 1, val8);
+
+       /* set, then poll until 0 */
+       val8 = rtl8xxxu_read8(priv, REG_APS_FSMCO + 1);
+       val8 |= APS_FSMCO_MAC_ENABLE >> 8;
+       rtl8xxxu_write8(priv, REG_APS_FSMCO + 1, val8);
+
+       for (count = RTL8XXXU_MAX_REG_POLL; count; count--) {
+               val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO);
+               if ((val32 & APS_FSMCO_MAC_ENABLE) == 0) {
+                       ret = 0;
+                       break;
+               }
+               udelay(10);
+       }
+
+       if (!count) {
+               ret = -EBUSY;
+               goto exit;
+       }
+
+       /* 0x27<=35 to reduce RF noise */
+       val8 = rtl8xxxu_write8(priv, 0x27, 0x35);
+exit:
+       return ret;
+}
+
+static int rtl8188fu_active_to_emu(struct rtl8xxxu_priv *priv)
+{
+       u8 val8;
+       u32 val32;
+       int count, ret = 0;
+
+       /* Turn off RF */
+       rtl8xxxu_write8(priv, REG_RF_CTRL, 0);
+
+       /* 0x4C[23] = 0x4E[7] = 0, switch DPDT_SEL_P output from register 0x65[2] */
+       val8 = rtl8xxxu_read8(priv, 0x4e);
+       val8 &= ~BIT(7);
+       rtl8xxxu_write8(priv, 0x4e, val8);
+
+       /* 0x27 <= 34, xtal_qsel = 0 to xtal bring up */
+       rtl8xxxu_write8(priv, 0x27, 0x34);
+
+       /* 0x04[9] = 1 turn off MAC by HW state machine */
+       val8 = rtl8xxxu_read8(priv, REG_APS_FSMCO + 1);
+       val8 |= APS_FSMCO_MAC_OFF >> 8;
+       rtl8xxxu_write8(priv, REG_APS_FSMCO + 1, val8);
+
+       for (count = RTL8XXXU_MAX_REG_POLL; count; count--) {
+               val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO);
+               if ((val32 & APS_FSMCO_MAC_OFF) == 0) {
+                       ret = 0;
+                       break;
+               }
+               udelay(10);
+       }
+
+       if (!count) {
+               ret = -EBUSY;
+               goto exit;
+       }
+
+exit:
+       return ret;
+}
+
+static int rtl8188fu_emu_to_disabled(struct rtl8xxxu_priv *priv)
+{
+       u8 val8;
+
+       /* 0x04[12:11] = 2b'01 enable WL suspend */
+       val8 = rtl8xxxu_read8(priv, REG_APS_FSMCO + 1);
+       val8 &= ~((APS_FSMCO_PCIE | APS_FSMCO_HW_SUSPEND) >> 8);
+       val8 |= APS_FSMCO_HW_SUSPEND >> 8;
+       rtl8xxxu_write8(priv, REG_APS_FSMCO + 1, val8);
+
+       /* 0xC4[4] <= 1, turn off USB APHY LDO under suspend mode */
+       val8 = rtl8xxxu_read8(priv, 0xc4);
+       val8 |= BIT(4);
+       rtl8xxxu_write8(priv, 0xc4, val8);
+
+       return 0;
+}
+
+static int rtl8188fu_active_to_lps(struct rtl8xxxu_priv *priv)
+{
+       struct device *dev = &priv->udev->dev;
+       u8 val8;
+       u16 val16;
+       u32 val32;
+       int retry, retval;
+
+       /* set RPWM IMR */
+       val8 = rtl8xxxu_read8(priv, REG_FTIMR + 1);
+       val8 |= IMR0_CPWM >> 8;
+       rtl8xxxu_write8(priv, REG_FTIMR + 1, val8);
+
+       /* Tx Pause */
+       rtl8xxxu_write8(priv, REG_TXPAUSE, 0xff);
+
+       retry = 100;
+       retval = -EBUSY;
+
+       /*
+        * Poll 32 bit wide REG_SCH_TX_CMD for 0x00000000 to ensure no TX is pending.
+        */
+       do {
+               val32 = rtl8xxxu_read32(priv, REG_SCH_TX_CMD);
+               if (!val32) {
+                       retval = 0;
+                       break;
+               }
+       } while (retry--);
+
+       if (!retry) {
+               dev_warn(dev, "Failed to flush TX queue\n");
+               retval = -EBUSY;
+               goto out;
+       }
+
+       /* Disable CCK and OFDM, clock gated */
+       val8 = rtl8xxxu_read8(priv, REG_SYS_FUNC);
+       val8 &= ~SYS_FUNC_BBRSTB;
+       rtl8xxxu_write8(priv, REG_SYS_FUNC, val8);
+
+       udelay(2);
+
+       /* Whole BB is reset */
+       val8 = rtl8xxxu_read8(priv, REG_SYS_FUNC);
+       val8 &= ~SYS_FUNC_BB_GLB_RSTN;
+       rtl8xxxu_write8(priv, REG_SYS_FUNC, val8);
+
+       /* Reset MAC TRX */
+       val16 = rtl8xxxu_read16(priv, REG_CR);
+       val16 |= 0x3f;
+       val16 &= ~(CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE | CR_SECURITY_ENABLE);
+       rtl8xxxu_write16(priv, REG_CR, val16);
+
+       /* Respond TxOK to scheduler */
+       val8 = rtl8xxxu_read8(priv, REG_DUAL_TSF_RST);
+       val8 |= DUAL_TSF_TX_OK;
+       rtl8xxxu_write8(priv, REG_DUAL_TSF_RST, val8);
+
+out:
+       return retval;
+}
+
+static int rtl8188fu_power_on(struct rtl8xxxu_priv *priv)
+{
+       u16 val16;
+       int ret;
+
+       rtl8188f_disabled_to_emu(priv);
+
+       ret = rtl8188f_emu_to_active(priv);
+       if (ret)
+               goto exit;
+
+       rtl8xxxu_write8(priv, REG_CR, 0);
+
+       val16 = rtl8xxxu_read16(priv, REG_CR);
+
+       val16 |= (CR_HCI_TXDMA_ENABLE | CR_HCI_RXDMA_ENABLE |
+                CR_TXDMA_ENABLE | CR_RXDMA_ENABLE |
+                CR_PROTOCOL_ENABLE | CR_SCHEDULE_ENABLE |
+                CR_SECURITY_ENABLE | CR_CALTIMER_ENABLE);
+       rtl8xxxu_write16(priv, REG_CR, val16);
+
+exit:
+       return ret;
+}
+
+static void rtl8188fu_power_off(struct rtl8xxxu_priv *priv)
+{
+       u8 val8;
+       u16 val16;
+
+       rtl8xxxu_flush_fifo(priv);
+
+       val16 = rtl8xxxu_read16(priv, REG_GPIO_MUXCFG);
+       val16 &= ~BIT(12);
+       rtl8xxxu_write16(priv, REG_GPIO_MUXCFG, val16);
+
+       rtl8xxxu_write32(priv, REG_HISR0, 0xFFFFFFFF);
+       rtl8xxxu_write32(priv, REG_HISR1, 0xFFFFFFFF);
+
+       /* Stop Tx Report Timer. 0x4EC[Bit1]=b'0 */
+       val8 = rtl8xxxu_read8(priv, REG_TX_REPORT_CTRL);
+       val8 &= ~TX_REPORT_CTRL_TIMER_ENABLE;
+       rtl8xxxu_write8(priv, REG_TX_REPORT_CTRL, val8);
+
+       /* Turn off RF */
+       rtl8xxxu_write8(priv, REG_RF_CTRL, 0x00);
+
+       /* Reset Firmware if running in RAM */
+       if (rtl8xxxu_read8(priv, REG_MCU_FW_DL) & MCU_FW_RAM_SEL)
+               rtl8xxxu_firmware_self_reset(priv);
+
+       rtl8188fu_active_to_lps(priv);
+
+       /* Reset MCU */
+       val16 = rtl8xxxu_read16(priv, REG_SYS_FUNC);
+       val16 &= ~SYS_FUNC_CPU_ENABLE;
+       rtl8xxxu_write16(priv, REG_SYS_FUNC, val16);
+
+       /* Reset MCU ready status */
+       rtl8xxxu_write8(priv, REG_MCU_FW_DL, 0x00);
+
+       rtl8188fu_active_to_emu(priv);
+       rtl8188fu_emu_to_disabled(priv);
+}
+
+#define PPG_BB_GAIN_2G_TXA_OFFSET_8188F 0xee
+#define PPG_BB_GAIN_2G_TX_OFFSET_MASK 0x0f
+
+static void rtl8188f_enable_rf(struct rtl8xxxu_priv *priv)
+{
+       u32 val32;
+       u8 pg_pwrtrim = 0xff, val8;
+       s8 bb_gain;
+
+       /* Somehow this is not found in the efuse we read earlier. */
+       rtl8xxxu_read_efuse8(priv, PPG_BB_GAIN_2G_TXA_OFFSET_8188F, &pg_pwrtrim);
+
+       if (pg_pwrtrim != 0xff) {
+               bb_gain = pg_pwrtrim & PPG_BB_GAIN_2G_TX_OFFSET_MASK;
+
+               if (bb_gain == PPG_BB_GAIN_2G_TX_OFFSET_MASK)
+                       bb_gain = 0;
+               else if (bb_gain & 1)
+                       bb_gain = bb_gain >> 1;
+               else
+                       bb_gain = -(bb_gain >> 1);
+
+               val8 = abs(bb_gain);
+               if (bb_gain > 0)
+                       val8 |= BIT(5);
+
+               val32 = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_55);
+               val32 &= ~0xfc000;
+               val32 |= val8 << 14;
+               rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_UNKNOWN_55, val32);
+       }
+
+       rtl8xxxu_write8(priv, REG_RF_CTRL, RF_ENABLE | RF_RSTB | RF_SDMRSTB);
+
+       val32 = rtl8xxxu_read32(priv, REG_OFDM0_TRX_PATH_ENABLE);
+       val32 &= ~(OFDM_RF_PATH_RX_MASK | OFDM_RF_PATH_TX_MASK);
+       val32 |= OFDM_RF_PATH_RX_A | OFDM_RF_PATH_TX_A;
+       rtl8xxxu_write32(priv, REG_OFDM0_TRX_PATH_ENABLE, val32);
+
+       rtl8xxxu_write8(priv, REG_TXPAUSE, 0x00);
+}
+
+static void rtl8188f_disable_rf(struct rtl8xxxu_priv *priv)
+{
+       u32 val32;
+
+       val32 = rtl8xxxu_read32(priv, REG_OFDM0_TRX_PATH_ENABLE);
+       val32 &= ~OFDM_RF_PATH_TX_MASK;
+       rtl8xxxu_write32(priv, REG_OFDM0_TRX_PATH_ENABLE, val32);
+
+       /* Power down RF module */
+       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_AC, 0);
+}
+
+static void rtl8188f_usb_quirks(struct rtl8xxxu_priv *priv)
+{
+       u16 val16;
+       u32 val32;
+
+       val16 = rtl8xxxu_read16(priv, REG_CR);
+       val16 |= (CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE);
+       rtl8xxxu_write16(priv, REG_CR, val16);
+
+       val32 = rtl8xxxu_read32(priv, REG_TXDMA_OFFSET_CHK);
+       val32 |= TXDMA_OFFSET_DROP_DATA_EN;
+       rtl8xxxu_write32(priv, REG_TXDMA_OFFSET_CHK, val32);
+}
+
+struct rtl8xxxu_fileops rtl8188fu_fops = {
+       .parse_efuse = rtl8188fu_parse_efuse,
+       .load_firmware = rtl8188fu_load_firmware,
+       .power_on = rtl8188fu_power_on,
+       .power_off = rtl8188fu_power_off,
+       .reset_8051 = rtl8xxxu_reset_8051,
+       .llt_init = rtl8xxxu_auto_llt_table,
+       .init_phy_bb = rtl8188fu_init_phy_bb,
+       .init_phy_rf = rtl8188fu_init_phy_rf,
+       .phy_init_antenna_selection = rtl8723bu_phy_init_antenna_selection,
+       .phy_lc_calibrate = rtl8188f_phy_lc_calibrate,
+       .phy_iq_calibrate = rtl8188fu_phy_iq_calibrate,
+       .config_channel = rtl8188fu_config_channel,
+       .parse_rx_desc = rtl8xxxu_parse_rxdesc24,
+       .init_aggregation = rtl8188fu_init_aggregation,
+       .init_statistics = rtl8188fu_init_statistics,
+       .enable_rf = rtl8188f_enable_rf,
+       .disable_rf = rtl8188f_disable_rf,
+       .usb_quirks = rtl8188f_usb_quirks,
+       .set_tx_power = rtl8188f_set_tx_power,
+       .update_rate_mask = rtl8xxxu_gen2_update_rate_mask,
+       .report_connect = rtl8xxxu_gen2_report_connect,
+       .fill_txdesc = rtl8xxxu_fill_txdesc_v2,
+       .writeN_block_size = 128,
+       .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc24),
+       .tx_desc_size = sizeof(struct rtl8xxxu_txdesc40),
+       .has_s0s1 = 1,
+       .has_tx_report = 1,
+       .gen2_thermal_meter = 1,
+       .needs_full_init = 1,
+       .adda_1t_init = 0x03c00014,
+       .adda_1t_path_on = 0x03c00014,
+       .trxff_boundary = 0x3f7f,
+       .pbp_rx = PBP_PAGE_SIZE_256,
+       .pbp_tx = PBP_PAGE_SIZE_256,
+       .mactable = rtl8188f_mac_init_table,
+       .total_page_num = TX_TOTAL_PAGE_NUM_8188F,
+       .page_num_hi = TX_PAGE_NUM_HI_PQ_8188F,
+       .page_num_lo = TX_PAGE_NUM_LO_PQ_8188F,
+       .page_num_norm = TX_PAGE_NUM_NORM_PQ_8188F,
+};
index 27c4cb688be436eeca0832641d990a21405df45d..e9bc94edfa79a1c24a22d0f69831f98c3a82d1b6 100644 (file)
@@ -77,7 +77,7 @@ static struct rtl8xxxu_power_base rtl8188r_power_base = {
        .reg_0868 = 0x00020204,
 };
 
-static struct rtl8xxxu_rfregval rtl8192cu_radioa_2t_init_table[] = {
+static const struct rtl8xxxu_rfregval rtl8192cu_radioa_2t_init_table[] = {
        {0x00, 0x00030159}, {0x01, 0x00031284},
        {0x02, 0x00098000}, {0x03, 0x00018c63},
        {0x04, 0x000210e7}, {0x09, 0x0002044f},
@@ -152,7 +152,7 @@ static struct rtl8xxxu_rfregval rtl8192cu_radioa_2t_init_table[] = {
        {0xff, 0xffffffff}
 };
 
-static struct rtl8xxxu_rfregval rtl8192cu_radiob_2t_init_table[] = {
+static const struct rtl8xxxu_rfregval rtl8192cu_radiob_2t_init_table[] = {
        {0x00, 0x00030159}, {0x01, 0x00031284},
        {0x02, 0x00098000}, {0x03, 0x00018c63},
        {0x04, 0x000210e7}, {0x09, 0x0002044f},
@@ -176,7 +176,7 @@ static struct rtl8xxxu_rfregval rtl8192cu_radiob_2t_init_table[] = {
        {0xff, 0xffffffff}
 };
 
-static struct rtl8xxxu_rfregval rtl8192cu_radioa_1t_init_table[] = {
+static const struct rtl8xxxu_rfregval rtl8192cu_radioa_1t_init_table[] = {
        {0x00, 0x00030159}, {0x01, 0x00031284},
        {0x02, 0x00098000}, {0x03, 0x00018c63},
        {0x04, 0x000210e7}, {0x09, 0x0002044f},
@@ -251,7 +251,7 @@ static struct rtl8xxxu_rfregval rtl8192cu_radioa_1t_init_table[] = {
        {0xff, 0xffffffff}
 };
 
-static struct rtl8xxxu_rfregval rtl8188ru_radioa_1t_highpa_table[] = {
+static const struct rtl8xxxu_rfregval rtl8188ru_radioa_1t_highpa_table[] = {
        {0x00, 0x00030159}, {0x01, 0x00031284},
        {0x02, 0x00098000}, {0x03, 0x00018c63},
        {0x04, 0x000210e7}, {0x09, 0x0002044f},
@@ -413,7 +413,7 @@ static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv)
 
 static int rtl8192cu_init_phy_rf(struct rtl8xxxu_priv *priv)
 {
-       struct rtl8xxxu_rfregval *rftable;
+       const struct rtl8xxxu_rfregval *rftable;
        int ret;
 
        if (priv->rtl_chip == RTL8188R) {
@@ -549,6 +549,7 @@ struct rtl8xxxu_fileops rtl8192cu_fops = {
        .llt_init = rtl8xxxu_init_llt_table,
        .init_phy_bb = rtl8xxxu_gen1_init_phy_bb,
        .init_phy_rf = rtl8192cu_init_phy_rf,
+       .phy_lc_calibrate = rtl8723a_phy_lc_calibrate,
        .phy_iq_calibrate = rtl8xxxu_gen1_phy_iq_calibrate,
        .config_channel = rtl8xxxu_gen1_config_channel,
        .parse_rx_desc = rtl8xxxu_parse_rxdesc16,
index b06508d0cdf8f75866a1181d7a6f855016ef2c6b..550290ae9e177c013bc4e53de8b9e58af5956cda 100644 (file)
@@ -32,7 +32,7 @@
 #include "rtl8xxxu.h"
 #include "rtl8xxxu_regs.h"
 
-static struct rtl8xxxu_reg8val rtl8192e_mac_init_table[] = {
+static const struct rtl8xxxu_reg8val rtl8192e_mac_init_table[] = {
        {0x011, 0xeb}, {0x012, 0x07}, {0x014, 0x75}, {0x303, 0xa7},
        {0x428, 0x0a}, {0x429, 0x10}, {0x430, 0x00}, {0x431, 0x00},
        {0x432, 0x00}, {0x433, 0x01}, {0x434, 0x04}, {0x435, 0x05},
@@ -62,7 +62,7 @@ static struct rtl8xxxu_reg8val rtl8192e_mac_init_table[] = {
        {0xffff, 0xff},
 };
 
-static struct rtl8xxxu_reg32val rtl8192eu_phy_init_table[] = {
+static const struct rtl8xxxu_reg32val rtl8192eu_phy_init_table[] = {
        {0x800, 0x80040000}, {0x804, 0x00000003},
        {0x808, 0x0000fc00}, {0x80c, 0x0000000a},
        {0x810, 0x10001331}, {0x814, 0x020c3d10},
@@ -194,7 +194,7 @@ static struct rtl8xxxu_reg32val rtl8192eu_phy_init_table[] = {
        {0xffff, 0xffffffff},
 };
 
-static struct rtl8xxxu_reg32val rtl8xxx_agc_8192eu_std_table[] = {
+static const struct rtl8xxxu_reg32val rtl8xxx_agc_8192eu_std_table[] = {
        {0xc78, 0xfb000001}, {0xc78, 0xfb010001},
        {0xc78, 0xfb020001}, {0xc78, 0xfb030001},
        {0xc78, 0xfb040001}, {0xc78, 0xfb050001},
@@ -263,7 +263,7 @@ static struct rtl8xxxu_reg32val rtl8xxx_agc_8192eu_std_table[] = {
        {0xffff, 0xffffffff}
 };
 
-static struct rtl8xxxu_reg32val rtl8xxx_agc_8192eu_highpa_table[] = {
+static const struct rtl8xxxu_reg32val rtl8xxx_agc_8192eu_highpa_table[] = {
        {0xc78, 0xfa000001}, {0xc78, 0xf9010001},
        {0xc78, 0xf8020001}, {0xc78, 0xf7030001},
        {0xc78, 0xf6040001}, {0xc78, 0xf5050001},
@@ -332,7 +332,7 @@ static struct rtl8xxxu_reg32val rtl8xxx_agc_8192eu_highpa_table[] = {
        {0xffff, 0xffffffff}
 };
 
-static struct rtl8xxxu_rfregval rtl8192eu_radioa_init_table[] = {
+static const struct rtl8xxxu_rfregval rtl8192eu_radioa_init_table[] = {
        {0x7f, 0x00000082}, {0x81, 0x0003fc00},
        {0x00, 0x00030000}, {0x08, 0x00008400},
        {0x18, 0x00000407}, {0x19, 0x00000012},
@@ -412,7 +412,7 @@ static struct rtl8xxxu_rfregval rtl8192eu_radioa_init_table[] = {
        {0xff, 0xffffffff}
 };
 
-static struct rtl8xxxu_rfregval rtl8192eu_radiob_init_table[] = {
+static const struct rtl8xxxu_rfregval rtl8192eu_radiob_init_table[] = {
        {0x7f, 0x00000082}, {0x81, 0x0003fc00},
        {0x00, 0x00030000}, {0x08, 0x00008400},
        {0x18, 0x00000407}, {0x19, 0x00000012},
@@ -1680,6 +1680,7 @@ struct rtl8xxxu_fileops rtl8192eu_fops = {
        .llt_init = rtl8xxxu_auto_llt_table,
        .init_phy_bb = rtl8192eu_init_phy_bb,
        .init_phy_rf = rtl8192eu_init_phy_rf,
+       .phy_lc_calibrate = rtl8723a_phy_lc_calibrate,
        .phy_iq_calibrate = rtl8192eu_phy_iq_calibrate,
        .config_channel = rtl8xxxu_gen2_config_channel,
        .parse_rx_desc = rtl8xxxu_parse_rxdesc24,
index 4f93f88716a9a8d82f5b1299be0062c46fd7f71c..44565bf4c1c215b5a785604971b3ec3deee22f6b 100644 (file)
@@ -54,7 +54,7 @@ static struct rtl8xxxu_power_base rtl8723a_power_base = {
        .reg_0868 = 0x02040608,
 };
 
-static struct rtl8xxxu_rfregval rtl8723au_radioa_1t_init_table[] = {
+static const struct rtl8xxxu_rfregval rtl8723au_radioa_1t_init_table[] = {
        {0x00, 0x00030159}, {0x01, 0x00031284},
        {0x02, 0x00098000}, {0x03, 0x00039c63},
        {0x04, 0x000210e7}, {0x09, 0x0002044f},
@@ -366,6 +366,7 @@ struct rtl8xxxu_fileops rtl8723au_fops = {
        .llt_init = rtl8xxxu_init_llt_table,
        .init_phy_bb = rtl8xxxu_gen1_init_phy_bb,
        .init_phy_rf = rtl8723au_init_phy_rf,
+       .phy_lc_calibrate = rtl8723a_phy_lc_calibrate,
        .phy_iq_calibrate = rtl8xxxu_gen1_phy_iq_calibrate,
        .config_channel = rtl8xxxu_gen1_config_channel,
        .parse_rx_desc = rtl8xxxu_parse_rxdesc16,
index a71e1816e632229f8c22cde48b2eeb41b6b3f834..a27fe06d6f77db48b97ae4a421783a1d7befc870 100644 (file)
@@ -32,7 +32,7 @@
 #include "rtl8xxxu.h"
 #include "rtl8xxxu_regs.h"
 
-static struct rtl8xxxu_reg8val rtl8723b_mac_init_table[] = {
+static const struct rtl8xxxu_reg8val rtl8723b_mac_init_table[] = {
        {0x02f, 0x30}, {0x035, 0x00}, {0x039, 0x08}, {0x04e, 0xe0},
        {0x064, 0x00}, {0x067, 0x20}, {0x428, 0x0a}, {0x429, 0x10},
        {0x430, 0x00}, {0x431, 0x00},
@@ -63,7 +63,7 @@ static struct rtl8xxxu_reg8val rtl8723b_mac_init_table[] = {
        {0xffff, 0xff},
 };
 
-static struct rtl8xxxu_reg32val rtl8723b_phy_1t_init_table[] = {
+static const struct rtl8xxxu_reg32val rtl8723b_phy_1t_init_table[] = {
        {0x800, 0x80040000}, {0x804, 0x00000003},
        {0x808, 0x0000fc00}, {0x80c, 0x0000000a},
        {0x810, 0x10001331}, {0x814, 0x020c3d10},
@@ -164,7 +164,7 @@ static struct rtl8xxxu_reg32val rtl8723b_phy_1t_init_table[] = {
        {0xffff, 0xffffffff},
 };
 
-static struct rtl8xxxu_reg32val rtl8xxx_agc_8723bu_table[] = {
+static const struct rtl8xxxu_reg32val rtl8xxx_agc_8723bu_table[] = {
        {0xc78, 0xfd000001}, {0xc78, 0xfc010001},
        {0xc78, 0xfb020001}, {0xc78, 0xfa030001},
        {0xc78, 0xf9040001}, {0xc78, 0xf8050001},
@@ -235,7 +235,7 @@ static struct rtl8xxxu_reg32val rtl8xxx_agc_8723bu_table[] = {
        {0xffff, 0xffffffff}
 };
 
-static struct rtl8xxxu_rfregval rtl8723bu_radioa_1t_init_table[] = {
+static const struct rtl8xxxu_rfregval rtl8723bu_radioa_1t_init_table[] = {
        {0x00, 0x00010000}, {0xb0, 0x000dffe0},
        {0xfe, 0x00000000}, {0xfe, 0x00000000},
        {0xfe, 0x00000000}, {0xb1, 0x00000018},
@@ -518,7 +518,7 @@ static int rtl8723bu_init_phy_rf(struct rtl8xxxu_priv *priv)
        return ret;
 }
 
-static void rtl8723bu_phy_init_antenna_selection(struct rtl8xxxu_priv *priv)
+void rtl8723bu_phy_init_antenna_selection(struct rtl8xxxu_priv *priv)
 {
        u32 val32;
 
@@ -1650,6 +1650,7 @@ struct rtl8xxxu_fileops rtl8723bu_fops = {
        .init_phy_bb = rtl8723bu_init_phy_bb,
        .init_phy_rf = rtl8723bu_init_phy_rf,
        .phy_init_antenna_selection = rtl8723bu_phy_init_antenna_selection,
+       .phy_lc_calibrate = rtl8723a_phy_lc_calibrate,
        .phy_iq_calibrate = rtl8723bu_phy_iq_calibrate,
        .config_channel = rtl8xxxu_gen2_config_channel,
        .parse_rx_desc = rtl8xxxu_parse_rxdesc24,
index ac641a56efb0988afe057e9d75aa61498fb387cf..65bb4dc8f55575938772e3524e3dd138644922e0 100644 (file)
@@ -52,6 +52,7 @@ MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin");
 MODULE_FIRMWARE("rtlwifi/rtl8192eu_nic.bin");
 MODULE_FIRMWARE("rtlwifi/rtl8723bu_nic.bin");
 MODULE_FIRMWARE("rtlwifi/rtl8723bu_bt.bin");
+MODULE_FIRMWARE("rtlwifi/rtl8188fufw.bin");
 
 module_param_named(debug, rtl8xxxu_debug, int, 0600);
 MODULE_PARM_DESC(debug, "Set debug mask");
@@ -127,7 +128,7 @@ static struct ieee80211_supported_band rtl8xxxu_supported_band = {
        .n_bitrates = ARRAY_SIZE(rtl8xxxu_rates),
 };
 
-struct rtl8xxxu_reg8val rtl8xxxu_gen1_mac_init_table[] = {
+const struct rtl8xxxu_reg8val rtl8xxxu_gen1_mac_init_table[] = {
        {0x420, 0x80}, {0x423, 0x00}, {0x430, 0x00}, {0x431, 0x00},
        {0x432, 0x00}, {0x433, 0x01}, {0x434, 0x04}, {0x435, 0x05},
        {0x436, 0x06}, {0x437, 0x07}, {0x438, 0x00}, {0x439, 0x00},
@@ -152,7 +153,7 @@ struct rtl8xxxu_reg8val rtl8xxxu_gen1_mac_init_table[] = {
        {0x70a, 0x65}, {0x70b, 0x87}, {0xffff, 0xff},
 };
 
-static struct rtl8xxxu_reg32val rtl8723a_phy_1t_init_table[] = {
+static const struct rtl8xxxu_reg32val rtl8723a_phy_1t_init_table[] = {
        {0x800, 0x80040000}, {0x804, 0x00000003},
        {0x808, 0x0000fc00}, {0x80c, 0x0000000a},
        {0x810, 0x10001331}, {0x814, 0x020c3d10},
@@ -250,7 +251,7 @@ static struct rtl8xxxu_reg32val rtl8723a_phy_1t_init_table[] = {
        {0xffff, 0xffffffff},
 };
 
-static struct rtl8xxxu_reg32val rtl8192cu_phy_2t_init_table[] = {
+static const struct rtl8xxxu_reg32val rtl8192cu_phy_2t_init_table[] = {
        {0x024, 0x0011800f}, {0x028, 0x00ffdb83},
        {0x800, 0x80040002}, {0x804, 0x00000003},
        {0x808, 0x0000fc00}, {0x80c, 0x0000000a},
@@ -348,7 +349,7 @@ static struct rtl8xxxu_reg32val rtl8192cu_phy_2t_init_table[] = {
        {0xffff, 0xffffffff},
 };
 
-static struct rtl8xxxu_reg32val rtl8188ru_phy_1t_highpa_table[] = {
+static const struct rtl8xxxu_reg32val rtl8188ru_phy_1t_highpa_table[] = {
        {0x024, 0x0011800f}, {0x028, 0x00ffdb83},
        {0x040, 0x000c0004}, {0x800, 0x80040000},
        {0x804, 0x00000001}, {0x808, 0x0000fc00},
@@ -447,7 +448,7 @@ static struct rtl8xxxu_reg32val rtl8188ru_phy_1t_highpa_table[] = {
        {0xffff, 0xffffffff},
 };
 
-static struct rtl8xxxu_reg32val rtl8xxx_agc_standard_table[] = {
+static const struct rtl8xxxu_reg32val rtl8xxx_agc_standard_table[] = {
        {0xc78, 0x7b000001}, {0xc78, 0x7b010001},
        {0xc78, 0x7b020001}, {0xc78, 0x7b030001},
        {0xc78, 0x7b040001}, {0xc78, 0x7b050001},
@@ -531,7 +532,7 @@ static struct rtl8xxxu_reg32val rtl8xxx_agc_standard_table[] = {
        {0xffff, 0xffffffff}
 };
 
-static struct rtl8xxxu_reg32val rtl8xxx_agc_highpa_table[] = {
+static const struct rtl8xxxu_reg32val rtl8xxx_agc_highpa_table[] = {
        {0xc78, 0x7b000001}, {0xc78, 0x7b010001},
        {0xc78, 0x7b020001}, {0xc78, 0x7b030001},
        {0xc78, 0x7b040001}, {0xc78, 0x7b050001},
@@ -615,7 +616,7 @@ static struct rtl8xxxu_reg32val rtl8xxx_agc_highpa_table[] = {
        {0xffff, 0xffffffff}
 };
 
-static struct rtl8xxxu_rfregs rtl8xxxu_rfregs[] = {
+static const struct rtl8xxxu_rfregs rtl8xxxu_rfregs[] = {
        {       /* RF_A */
                .hssiparm1 = REG_FPGA0_XA_HSSI_PARM1,
                .hssiparm2 = REG_FPGA0_XA_HSSI_PARM2,
@@ -1606,20 +1607,32 @@ static void rtl8xxxu_print_chipinfo(struct rtl8xxxu_priv *priv)
 
 static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
 {
+       const struct usb_device_descriptor *descriptor = &priv->udev->descriptor;
        struct device *dev = &priv->udev->dev;
        struct ieee80211_hw *hw = priv->hw;
-       u32 val32, bonding;
+       u32 val32, bonding, sys_cfg;
        u16 val16;
 
-       val32 = rtl8xxxu_read32(priv, REG_SYS_CFG);
-       priv->chip_cut = (val32 & SYS_CFG_CHIP_VERSION_MASK) >>
+       sys_cfg = rtl8xxxu_read32(priv, REG_SYS_CFG);
+       priv->chip_cut = (sys_cfg & SYS_CFG_CHIP_VERSION_MASK) >>
                SYS_CFG_CHIP_VERSION_SHIFT;
-       if (val32 & SYS_CFG_TRP_VAUX_EN) {
+       if (sys_cfg & SYS_CFG_TRP_VAUX_EN) {
                dev_info(dev, "Unsupported test chip\n");
                return -ENOTSUPP;
        }
 
-       if (val32 & SYS_CFG_BT_FUNC) {
+       if (descriptor->idVendor == USB_VENDOR_ID_REALTEK &&
+           descriptor->idProduct == 0xf179) {
+               sprintf(priv->chip_name, "8188FU");
+               priv->rtl_chip = RTL8188F;
+               priv->rf_paths = 1;
+               priv->rx_paths = 1;
+               priv->tx_paths = 1;
+               priv->has_wifi = 1;
+               goto skip_complicated_chip_detection;
+       }
+
+       if (sys_cfg & SYS_CFG_BT_FUNC) {
                if (priv->chip_cut >= 3) {
                        sprintf(priv->chip_name, "8723BU");
                        priv->rtl_chip = RTL8723B;
@@ -1641,7 +1654,7 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
                if (val32 & MULTI_GPS_FUNC_EN)
                        priv->has_gps = 1;
                priv->is_multi_func = 1;
-       } else if (val32 & SYS_CFG_TYPE_ID) {
+       } else if (sys_cfg & SYS_CFG_TYPE_ID) {
                bonding = rtl8xxxu_read32(priv, REG_HPON_FSM);
                bonding &= HPON_FSM_BONDING_MASK;
                if (priv->fops->tx_desc_size ==
@@ -1685,14 +1698,17 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
                priv->has_wifi = 1;
        }
 
+skip_complicated_chip_detection:
+
        hw->wiphy->available_antennas_tx = BIT(priv->tx_paths) - 1;
        hw->wiphy->available_antennas_rx = BIT(priv->rx_paths) - 1;
 
        switch (priv->rtl_chip) {
        case RTL8188E:
+       case RTL8188F:
        case RTL8192E:
        case RTL8723B:
-               switch (val32 & SYS_CFG_VENDOR_EXT_MASK) {
+               switch (sys_cfg & SYS_CFG_VENDOR_EXT_MASK) {
                case SYS_CFG_VENDOR_ID_TSMC:
                        sprintf(priv->chip_vendor, "TSMC");
                        break;
@@ -1709,7 +1725,7 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
                }
                break;
        default:
-               if (val32 & SYS_CFG_VENDOR_ID) {
+               if (sys_cfg & SYS_CFG_VENDOR_ID) {
                        sprintf(priv->chip_vendor, "UMC");
                        priv->vendor_umc = 1;
                } else {
@@ -1720,7 +1736,18 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
        val32 = rtl8xxxu_read32(priv, REG_GPIO_OUTSTS);
        priv->rom_rev = (val32 & GPIO_RF_RL_ID) >> 28;
 
-       val16 = rtl8xxxu_read16(priv, REG_NORMAL_SIE_EP_TX);
+       /*
+        * 8188FU vendor driver doesn't use REG_NORMAL_SIE_EP_TX,
+        * it just decides the queue mapping based on nr_out_eps.
+        * However, reading the register returns "0x321" which
+        * results in a wrong ep_tx_count of 3 and most frames
+        * not being transmitted.
+        */
+       if (priv->rtl_chip == RTL8188F)
+               val16 = 0;
+       else
+               val16 = rtl8xxxu_read16(priv, REG_NORMAL_SIE_EP_TX);
+
        if (val16 & NORMAL_SIE_EP_TX_HIGH_MASK) {
                priv->ep_tx_high_queue = 1;
                priv->ep_tx_count++;
@@ -1763,7 +1790,7 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
        return 0;
 }
 
-static int
+int
 rtl8xxxu_read_efuse8(struct rtl8xxxu_priv *priv, u16 offset, u8 *data)
 {
        int i;
@@ -1979,7 +2006,7 @@ static int rtl8xxxu_start_firmware(struct rtl8xxxu_priv *priv)
        /*
         * Init H2C command
         */
-       if (priv->rtl_chip == RTL8723B)
+       if (priv->rtl_chip == RTL8723B || priv->rtl_chip == RTL8188F)
                rtl8xxxu_write8(priv, REG_HMTFR, 0x0f);
 exit:
        return ret;
@@ -2099,6 +2126,7 @@ int rtl8xxxu_load_firmware(struct rtl8xxxu_priv *priv, char *fw_name)
        case 0x88c0:
        case 0x5300:
        case 0x2300:
+       case 0x88f0:
                break;
        default:
                ret = -EINVAL;
@@ -2145,7 +2173,7 @@ void rtl8xxxu_firmware_self_reset(struct rtl8xxxu_priv *priv)
 static int
 rtl8xxxu_init_mac(struct rtl8xxxu_priv *priv)
 {
-       struct rtl8xxxu_reg8val *array = priv->fops->mactable;
+       const struct rtl8xxxu_reg8val *array = priv->fops->mactable;
        int i, ret;
        u16 reg;
        u8 val;
@@ -2166,14 +2194,16 @@ rtl8xxxu_init_mac(struct rtl8xxxu_priv *priv)
                }
        }
 
-       if (priv->rtl_chip != RTL8723B && priv->rtl_chip != RTL8192E)
+       if (priv->rtl_chip != RTL8723B &&
+           priv->rtl_chip != RTL8192E &&
+           priv->rtl_chip != RTL8188F)
                rtl8xxxu_write8(priv, REG_MAX_AGGR_NUM, 0x0a);
 
        return 0;
 }
 
 int rtl8xxxu_init_phy_regs(struct rtl8xxxu_priv *priv,
-                          struct rtl8xxxu_reg32val *array)
+                          const struct rtl8xxxu_reg32val *array)
 {
        int i, ret;
        u16 reg;
@@ -2338,7 +2368,7 @@ static int rtl8xxxu_init_phy_bb(struct rtl8xxxu_priv *priv)
 }
 
 static int rtl8xxxu_init_rf_regs(struct rtl8xxxu_priv *priv,
-                                struct rtl8xxxu_rfregval *array,
+                                const struct rtl8xxxu_rfregval *array,
                                 enum rtl8xxxu_rfpath path)
 {
        int i, ret;
@@ -2386,7 +2416,7 @@ static int rtl8xxxu_init_rf_regs(struct rtl8xxxu_priv *priv,
 }
 
 int rtl8xxxu_init_phy_rf(struct rtl8xxxu_priv *priv,
-                        struct rtl8xxxu_rfregval *table,
+                        const struct rtl8xxxu_rfregval *table,
                         enum rtl8xxxu_rfpath path)
 {
        u32 val32;
@@ -3427,7 +3457,7 @@ void rtl8xxxu_gen1_phy_iq_calibrate(struct rtl8xxxu_priv *priv)
                           priv->bb_recovery_backup, RTL8XXXU_BB_REGS);
 }
 
-static void rtl8723a_phy_lc_calibrate(struct rtl8xxxu_priv *priv)
+void rtl8723a_phy_lc_calibrate(struct rtl8xxxu_priv *priv)
 {
        u32 val32;
        u32 rf_amode, rf_bmode = 0, lstf;
@@ -4031,6 +4061,9 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
        if (priv->rtl_chip == RTL8192E) {
                rtl8xxxu_write32(priv, REG_HIMR0, 0x00);
                rtl8xxxu_write32(priv, REG_HIMR1, 0x00);
+       } else if (priv->rtl_chip == RTL8188F) {
+               rtl8xxxu_write32(priv, REG_HISR0, 0xffffffff);
+               rtl8xxxu_write32(priv, REG_HISR1, 0xffffffff);
        } else {
                /*
                 * Enable all interrupts - not obvious USB needs to do this
@@ -4050,11 +4083,25 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
                RCR_APPEND_PHYSTAT | RCR_APPEND_ICV | RCR_APPEND_MIC;
        rtl8xxxu_write32(priv, REG_RCR, val32);
 
-       /*
-        * Accept all multicast
-        */
-       rtl8xxxu_write32(priv, REG_MAR, 0xffffffff);
-       rtl8xxxu_write32(priv, REG_MAR + 4, 0xffffffff);
+       if (priv->rtl_chip == RTL8188F) {
+               /* Accept all data frames */
+               rtl8xxxu_write16(priv, REG_RXFLTMAP2, 0xffff);
+
+               /*
+                * Since ADF is removed from RCR, ps-poll will not be indicate to driver,
+                * RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll.
+                */
+               rtl8xxxu_write16(priv, REG_RXFLTMAP1, 0x400);
+
+               /* Accept all management frames */
+               rtl8xxxu_write16(priv, REG_RXFLTMAP0, 0xffff);
+       } else {
+               /*
+                * Accept all multicast
+                */
+               rtl8xxxu_write32(priv, REG_MAR, 0xffffffff);
+               rtl8xxxu_write32(priv, REG_MAR + 4, 0xffffffff);
+       }
 
        /*
         * Init adaptive controls
@@ -4105,14 +4152,17 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
        val16 = BEACON_DISABLE_TSF_UPDATE | (BEACON_DISABLE_TSF_UPDATE << 8);
        rtl8xxxu_write16(priv, REG_BEACON_CTRL, val16);
        rtl8xxxu_write16(priv, REG_TBTT_PROHIBIT, 0x6404);
-       rtl8xxxu_write8(priv, REG_DRIVER_EARLY_INT, DRIVER_EARLY_INT_TIME);
+       if (priv->rtl_chip != RTL8188F)
+               /* Firmware will control REG_DRVERLYINT when power saving is enable, */
+               /* so don't set this register on STA mode. */
+               rtl8xxxu_write8(priv, REG_DRIVER_EARLY_INT, DRIVER_EARLY_INT_TIME);
        rtl8xxxu_write8(priv, REG_BEACON_DMA_TIME, BEACON_DMA_ATIME_INT_TIME);
        rtl8xxxu_write16(priv, REG_BEACON_TCFG, 0x660F);
 
        /*
         * Initialize burst parameters
         */
-       if (priv->rtl_chip == RTL8723B) {
+       if (priv->rtl_chip == RTL8723B || priv->rtl_chip == RTL8188F) {
                /*
                 * For USB high speed set 512B packets
                 */
@@ -4130,13 +4180,26 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
                rtl8xxxu_write8(priv, REG_HT_SINGLE_AMPDU_8723B, val8);
 
                rtl8xxxu_write16(priv, REG_MAX_AGGR_NUM, 0x0c14);
-               rtl8xxxu_write8(priv, REG_AMPDU_MAX_TIME_8723B, 0x5e);
+               if (priv->rtl_chip == RTL8723B)
+                       val8 = 0x5e;
+               else if (priv->rtl_chip == RTL8188F)
+                       val8 = 0x70; /* 0x5e would make it very slow */
+               rtl8xxxu_write8(priv, REG_AMPDU_MAX_TIME_8723B, val8);
                rtl8xxxu_write32(priv, REG_AGGLEN_LMT, 0xffffffff);
                rtl8xxxu_write8(priv, REG_RX_PKT_LIMIT, 0x18);
                rtl8xxxu_write8(priv, REG_PIFS, 0x00);
-               rtl8xxxu_write8(priv, REG_USTIME_TSF_8723B, 0x50);
-               rtl8xxxu_write8(priv, REG_USTIME_EDCA, 0x50);
-
+               if (priv->rtl_chip == RTL8188F) {
+                       rtl8xxxu_write8(priv, REG_FWHW_TXQ_CTRL, FWHW_TXQ_CTRL_AMPDU_RETRY);
+                       rtl8xxxu_write32(priv, REG_FAST_EDCA_CTRL, 0x03086666);
+               }
+               if (priv->rtl_chip == RTL8723B)
+                       val8 = 0x50;
+               else if (priv->rtl_chip == RTL8188F)
+                       val8 = 0x28; /* 0x50 would make the upload slow */
+               rtl8xxxu_write8(priv, REG_USTIME_TSF_8723B, val8);
+               rtl8xxxu_write8(priv, REG_USTIME_EDCA, val8);
+
+               /* to prevent mac is reseted by bus. */
                val8 = rtl8xxxu_read8(priv, REG_RSV_CTRL);
                val8 |= BIT(5) | BIT(6);
                rtl8xxxu_write8(priv, REG_RSV_CTRL, val8);
@@ -4145,6 +4208,11 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
        if (fops->init_aggregation)
                fops->init_aggregation(priv);
 
+       if (priv->rtl_chip == RTL8188F) {
+               rtl8xxxu_write16(priv, REG_PKT_VO_VI_LIFE_TIME, 0x0400); /* unit: 256us. 256ms */
+               rtl8xxxu_write16(priv, REG_PKT_BE_BK_LIFE_TIME, 0x0400); /* unit: 256us. 256ms */
+       }
+
        /*
         * Enable CCK and OFDM block
         */
@@ -4163,7 +4231,7 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
        fops->set_tx_power(priv, 1, false);
 
        /* Let the 8051 take control of antenna setting */
-       if (priv->rtl_chip != RTL8192E) {
+       if (priv->rtl_chip != RTL8192E && priv->rtl_chip != RTL8188F) {
                val8 = rtl8xxxu_read8(priv, REG_LEDCFG2);
                val8 |= LEDCFG2_DPDT_SELECT;
                rtl8xxxu_write8(priv, REG_LEDCFG2, val8);
@@ -4174,7 +4242,8 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
        /* Disable BAR - not sure if this has any effect on USB */
        rtl8xxxu_write32(priv, REG_BAR_MODE_CTRL, 0x0201ffff);
 
-       rtl8xxxu_write16(priv, REG_FAST_EDCA_CTRL, 0);
+       if (priv->rtl_chip != RTL8188F)
+               rtl8xxxu_write16(priv, REG_FAST_EDCA_CTRL, 0);
 
        if (fops->init_statistics)
                fops->init_statistics(priv);
@@ -4191,20 +4260,38 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
                 * Reset USB mode switch setting
                 */
                rtl8xxxu_write8(priv, REG_ACLK_MON, 0x00);
+       } else if (priv->rtl_chip == RTL8188F) {
+               /*
+                * Init GPIO settings for 8188f
+                */
+               val8 = rtl8xxxu_read8(priv, REG_GPIO_MUXCFG);
+               val8 &= ~GPIO_MUXCFG_IO_SEL_ENBT;
+               rtl8xxxu_write8(priv, REG_GPIO_MUXCFG, val8);
        }
 
-       rtl8723a_phy_lc_calibrate(priv);
+       if (priv->rtl_chip == RTL8188F)
+               /* CCK PD */
+               rtl8xxxu_write8(priv, REG_CCK_PD_THRESH, CCK_PD_TYPE1_LV1_TH);
+
+       fops->phy_lc_calibrate(priv);
 
        fops->phy_iq_calibrate(priv);
 
        /*
         * This should enable thermal meter
         */
-       if (fops->gen2_thermal_meter)
-               rtl8xxxu_write_rfreg(priv,
-                                    RF_A, RF6052_REG_T_METER_8723B, 0x37cf8);
-       else
+       if (fops->gen2_thermal_meter) {
+               if (priv->rtl_chip == RTL8188F) {
+                       val32 = rtl8xxxu_read_rfreg(priv, RF_A, RF6052_REG_T_METER_8723B);
+                       val32 |= 0x30000;
+                       rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_T_METER_8723B, val32);
+               } else {
+                       rtl8xxxu_write_rfreg(priv,
+                                            RF_A, RF6052_REG_T_METER_8723B, 0x37cf8);
+               }
+       } else {
                rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_T_METER, 0x60);
+       }
 
        /* Set NAV_UPPER to 30000us */
        val8 = ((30000 + NAV_UPPER_UNIT - 1) / NAV_UPPER_UNIT);
@@ -4389,12 +4476,9 @@ void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
 void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
                                  u8 macid, bool connect)
 {
-#ifdef RTL8XXXU_GEN2_REPORT_CONNECT
        /*
-        * Barry Day reports this causes issues with 8192eu and 8723bu
-        * devices reconnecting. The reason for this is unclear, but
-        * until it is better understood, leave the code in place but
-        * disabled, so it is not lost.
+        * The firmware turns on the rate control when it knows it's
+        * connected to a network.
         */
        struct h2c_cmd h2c;
 
@@ -4407,7 +4491,6 @@ void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
                h2c.media_status_rpt.parm &= ~BIT(0);
 
        rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.media_status_rpt));
-#endif
 }
 
 void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv)
@@ -6561,6 +6644,7 @@ static void rtl8xxxu_stop(struct ieee80211_hw *hw)
 
 static const struct ieee80211_ops rtl8xxxu_ops = {
        .tx = rtl8xxxu_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .add_interface = rtl8xxxu_add_interface,
        .remove_interface = rtl8xxxu_remove_interface,
        .config = rtl8xxxu_config,
@@ -6674,6 +6758,7 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
                case 0x8178:
                case 0x817f:
                case 0x818b:
+               case 0xf179:
                        untested = 0;
                        break;
                }
@@ -6886,6 +6971,9 @@ static const struct usb_device_id dev_table[] = {
        .driver_info = (unsigned long)&rtl8723bu_fops},
 {USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa611, 0xff, 0xff, 0xff),
        .driver_info = (unsigned long)&rtl8723bu_fops},
+/* RTL8188FU */
+{USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0xf179, 0xff, 0xff, 0xff),
+       .driver_info = (unsigned long)&rtl8188fu_fops},
 #ifdef CONFIG_RTL8XXXU_UNTESTED
 /* Still supported by rtlwifi */
 {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8176, 0xff, 0xff, 0xff),
index 438b65ba96405ccd48decf12fb78fbff8db95539..35bde14047937ab52416899edfc8a20f83c2073b 100644 (file)
 #define REG_CAL_TIMER                  0x003c
 #define REG_ACLK_MON                   0x003e
 #define REG_GPIO_MUXCFG                        0x0040
+#define  GPIO_MUXCFG_IO_SEL_ENBT       BIT(5)
 #define REG_GPIO_IO_SEL                        0x0042
 #define REG_MAC_PINMUX_CFG             0x0043
 #define REG_GPIO_PIN_CTRL              0x0044
 #define REG_CPWM                       0x012f
 #define REG_FWIMR                      0x0130
 #define REG_FWISR                      0x0134
+#define REG_FTIMR                      0x0138
 #define REG_PKTBUF_DBG_CTRL            0x0140
 #define REG_PKTBUF_DBG_DATA_L          0x0144
 #define REG_PKTBUF_DBG_DATA_H          0x0148
 
 #define REG_FIFOPAGE                   0x0204
 #define REG_TDECTRL                    0x0208
+
+#define REG_DWBCN0_CTRL_8188F          REG_TDECTRL
+
 #define REG_TXDMA_OFFSET_CHK           0x020c
 #define  TXDMA_OFFSET_DROP_DATA_EN     BIT(9)
 #define REG_TXDMA_STATUS               0x0210
 
 #define REG_FPGA0_XA_LSSI_READBACK     0x08a0  /* Tranceiver LSSI Readback */
 #define REG_FPGA0_XB_LSSI_READBACK     0x08a4
+#define REG_FPGA0_PSD_REPORT           0x08b4
 #define REG_HSPI_XA_READBACK           0x08b8  /* Transceiver A HSPI read */
 #define REG_HSPI_XB_READBACK           0x08bc  /* Transceiver B HSPI read */
 
 #define REG_RFE_PATH_SELECT            0x0940  /* 8723BU */
 #define REG_RFE_BUFFER                 0x0944  /* 8723BU */
 #define REG_S0S1_PATH_SWITCH           0x0948  /* 8723BU */
+#define REG_OFDM_RX_DFIR               0x954
 
 #define REG_CCK0_SYSTEM                        0x0a00
 #define  CCK0_SIDEBAND                 BIT(4)
 #define  CCK0_AFE_RX_ANT_A             0
 #define  CCK0_AFE_RX_ANT_B             (BIT(24) | BIT(26))
 
+#define REG_CCK_PD_THRESH                      0x0a0a
+#define  CCK_PD_TYPE1_LV0_TH           0x40
+#define  CCK_PD_TYPE1_LV1_TH           0x83
+#define  CCK_PD_TYPE1_LV2_TH           0xcd
+#define  CCK_PD_TYPE1_LV3_TH           0xdd
+#define  CCK_PD_TYPE1_LV4_TH           0xed
+
 #define REG_CONFIG_ANT_A               0x0b68
 #define REG_CONFIG_ANT_B               0x0b6c
 
 
 #define REG_OFDM0_FA_RSTC              0x0c0c
 
+#define REG_OFDM0_XA_RX_AFE            0x0c10
 #define REG_OFDM0_XA_RX_IQ_IMBALANCE   0x0c14
 #define REG_OFDM0_XB_RX_IQ_IMBALANCE   0x0c1c
 
 #define  OFDM_LSTF_MASK                        0x70000000
 
 #define REG_OFDM1_TRX_PATH_ENABLE      0x0d04
+#define REG_OFDM1_CFO_TRACKING         0x0d2c
+#define REG_OFDM1_CSI_FIX_MASK1                0x0d40
+#define REG_OFDM1_CSI_FIX_MASK2                0x0d44
 
 #define REG_TX_AGC_A_RATE18_06         0x0e00
 #define REG_TX_AGC_A_RATE54_24         0x0e04
 #define RF6052_REG_UNKNOWN_43          0x43
 #define RF6052_REG_UNKNOWN_55          0x55
 #define RF6052_REG_UNKNOWN_56          0x56
+#define RF6052_REG_RXG_MIX_SWBW                0x87
 #define RF6052_REG_S0S1                        0xb0
 #define RF6052_REG_UNKNOWN_DF          0xdf
 #define RF6052_REG_UNKNOWN_ED          0xed
index ca01270944fe5d272f436298c0618c000c96d9fe..6f10727cdb943eddfc1edb007d382c6e4ef10e8c 100644 (file)
@@ -1912,6 +1912,7 @@ const struct ieee80211_ops rtl_ops = {
        .start = rtl_op_start,
        .stop = rtl_op_stop,
        .tx = rtl_op_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .add_interface = rtl_op_add_interface,
        .remove_interface = rtl_op_remove_interface,
        .change_interface = rtl_op_change_interface,
index 93e09400aac4978696db8a69b98db55050698125..2b20cf8bbf3aa349d771c41059567b046cb5357f 100644 (file)
@@ -19,6 +19,9 @@ config RTW89_PCI
 config RTW89_8852A
        tristate
 
+config RTW89_8852B
+       tristate
+
 config RTW89_8852C
        tristate
 
@@ -33,6 +36,17 @@ config RTW89_8852AE
 
          802.11ax PCIe wireless network (Wi-Fi 6) adapter
 
+config RTW89_8852BE
+       tristate "Realtek 8852BE PCI wireless network (Wi-Fi 6) adapter"
+       depends on PCI
+       select RTW89_CORE
+       select RTW89_PCI
+       select RTW89_8852B
+       help
+         Select this option will enable support for 8852BE chipset
+
+         802.11ax PCIe wireless network (Wi-Fi 6) adapter
+
 config RTW89_8852CE
        tristate "Realtek 8852CE PCI wireless network (Wi-Fi 6E) adapter"
        depends on PCI
index a87f2aff4def2fef672cecb551f9081cfc7f74e2..ec0f5da65d6a1f0903574859c60a2d2d2c0bfd03 100644 (file)
@@ -24,6 +24,15 @@ rtw89_8852a-objs := rtw8852a.o \
 obj-$(CONFIG_RTW89_8852AE) += rtw89_8852ae.o
 rtw89_8852ae-objs := rtw8852ae.o
 
+obj-$(CONFIG_RTW89_8852B) += rtw89_8852b.o
+rtw89_8852b-objs := rtw8852b.o \
+                   rtw8852b_table.o \
+                   rtw8852b_rfk.o \
+                   rtw8852b_rfk_table.o
+
+obj-$(CONFIG_RTW89_8852BE) += rtw89_8852be.o
+rtw89_8852be-objs := rtw8852be.o
+
 obj-$(CONFIG_RTW89_8852C) += rtw89_8852c.o
 rtw89_8852c-objs := rtw8852c.o \
                    rtw8852c_table.o \
index bbdfa9ac203ccdf6bbc75532016a97c1a1998d4e..f21c73310fdb68721282769880f81cdae4999602 100644 (file)
@@ -1809,13 +1809,18 @@ static void _set_rf_trx_para(struct rtw89_dev *rtwdev)
        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;
+       struct rtw89_btc_bt_link_info *b = &bt->link_info;
        struct rtw89_btc_rf_trx_para para;
        u32 wl_stb_chg = 0;
        u8 level_id = 0;
 
        if (!dm->freerun) {
-               dm->trx_para_level = 0;
-               chip->ops->btc_bt_aci_imp(rtwdev);
+               /* fix LNA2 = level-5 for BT ACI issue at BTG */
+               if ((btc->dm.wl_btg_rx && b->profile_cnt.now != 0) ||
+                   dm->bt_only == 1)
+                       dm->trx_para_level = 1;
+               else
+                       dm->trx_para_level = 0;
        }
 
        level_id = (u8)dm->trx_para_level;
index bc2994865372b86043e73d45584ba56f4b79d9a5..a0fa9639b5097a6607a0088065bdded3308620bc 100644 (file)
@@ -1255,6 +1255,9 @@ static int rtw89_core_rx_parse_phy_sts(struct rtw89_dev *rtwdev,
        if (phy_ppdu->ie < RTW89_CCK_PKT)
                return -EINVAL;
 
+       if (!phy_ppdu->to_self)
+               return 0;
+
        pos = (u8 *)phy_ppdu->buf + PHY_STS_HDR_LEN;
        end = (u8 *)phy_ppdu->buf + phy_ppdu->len;
        while (pos < end) {
index db041b32a8c2cf5a7eb0236ca7e4ee09ead21529..90bf7bdb6062807300b97defbbb2fd940d870a7f 100644 (file)
@@ -84,6 +84,7 @@ enum rtw89_subband {
        RTW89_CH_6G_BAND_IDX7, /* Ultra-high */
 
        RTW89_SUBBAND_NR,
+       RTW89_SUBBAND_2GHZ_5GHZ_NR = RTW89_CH_5G_BAND_4 + 1,
 };
 
 enum rtw89_gain_offset {
@@ -490,6 +491,8 @@ enum rtw89_bandwidth_section_num {
        RTW89_BW80_SEC_NUM = 2,
 };
 
+#define RTW89_TXPWR_LMT_PAGE_SIZE 40
+
 struct rtw89_txpwr_limit {
        s8 cck_20m[RTW89_BF_NUM];
        s8 cck_40m[RTW89_BF_NUM];
@@ -504,6 +507,8 @@ struct rtw89_txpwr_limit {
 
 #define RTW89_RU_SEC_NUM 8
 
+#define RTW89_TXPWR_LMT_RU_PAGE_SIZE 24
+
 struct rtw89_txpwr_limit_ru {
        s8 ru26[RTW89_RU_SEC_NUM];
        s8 ru52[RTW89_RU_SEC_NUM];
@@ -2192,6 +2197,7 @@ struct rtw89_sta {
 
 struct rtw89_efuse {
        bool valid;
+       bool power_k_valid;
        u8 xtal_cap;
        u8 addr[ETH_ALEN];
        u8 rfe_type;
@@ -2357,7 +2363,6 @@ struct rtw89_chip_ops {
        void (*btc_set_wl_pri)(struct rtw89_dev *rtwdev, u8 map, bool state);
        void (*btc_set_wl_txpwr_ctrl)(struct rtw89_dev *rtwdev, u32 txpwr_val);
        s8 (*btc_get_bt_rssi)(struct rtw89_dev *rtwdev, s8 val);
-       void (*btc_bt_aci_imp)(struct rtw89_dev *rtwdev);
        void (*btc_update_bt_cnt)(struct rtw89_dev *rtwdev);
        void (*btc_wl_s1_standby)(struct rtw89_dev *rtwdev, bool state);
        void (*btc_set_policy)(struct rtw89_dev *rtwdev, u16 policy_type);
@@ -3044,6 +3049,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];
        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];
@@ -3159,6 +3165,14 @@ struct rtw89_cfo_tracking_info {
        u8 lock_cnt;
 };
 
+enum rtw89_tssi_alimk_band {
+       TSSI_ALIMK_2G = 0,
+       TSSI_ALIMK_5GL,
+       TSSI_ALIMK_5GM,
+       TSSI_ALIMK_5GH,
+       TSSI_ALIMK_MAX
+};
+
 /* 2GL, 2GH, 5GL1, 5GH1, 5GM1, 5GM2, 5GH1, 5GH2 */
 #define TSSI_TRIM_CH_GROUP_NUM 8
 #define TSSI_TRIM_CH_GROUP_NUM_6G 16
@@ -3169,6 +3183,8 @@ struct rtw89_cfo_tracking_info {
 #define TSSI_MCS_6G_CH_GROUP_NUM 32
 #define TSSI_MCS_CH_GROUP_NUM \
        (TSSI_MCS_2G_CH_GROUP_NUM + TSSI_MCS_5G_CH_GROUP_NUM)
+#define TSSI_MAX_CH_NUM 67
+#define TSSI_ALIMK_VALUE_NUM 8
 
 struct rtw89_tssi_info {
        u8 thermal[RF_PATH_MAX];
@@ -3181,6 +3197,11 @@ struct rtw89_tssi_info {
        bool tssi_tracking_check[RF_PATH_MAX];
        u8 default_txagc_offset[RF_PATH_MAX];
        u32 base_thermal[RF_PATH_MAX];
+       bool check_backup_aligmk[RF_PATH_MAX][TSSI_MAX_CH_NUM];
+       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;
 };
 
 struct rtw89_power_trim_info {
@@ -3421,8 +3442,11 @@ struct rtw89_phy_bb_gain_info {
 
 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 comp[RF_PATH_MAX][RTW89_SUBBAND_NR]; /* S(8, 0) */
 };
 
 struct rtw89_dev {
index 730e83d54257ff8c326c32c06da253bcd2e8c337..8f27c883eeabbd754365a854bb0d34f7de52f5e8 100644 (file)
@@ -464,7 +464,7 @@ static const struct txpwr_map __txpwr_map_lmt_ru = {
 };
 
 static u8 __print_txpwr_ent(struct seq_file *m, const struct txpwr_ent *ent,
-                           const u8 *buf, const u8 cur)
+                           const s8 *buf, const u8 cur)
 {
        char *fmt;
 
@@ -493,8 +493,9 @@ static int __print_txpwr_map(struct seq_file *m, struct rtw89_dev *rtwdev,
                             const struct txpwr_map *map)
 {
        u8 fct = rtwdev->chip->txpwr_factor_mac;
-       u8 *buf, cur, i;
        u32 val, addr;
+       s8 *buf, tmp;
+       u8 cur, i;
        int ret;
 
        buf = vzalloc(map->addr_to - map->addr_from + 4);
@@ -507,8 +508,11 @@ static int __print_txpwr_map(struct seq_file *m, struct rtw89_dev *rtwdev,
                        val = MASKDWORD;
 
                cur = addr - map->addr_from;
-               for (i = 0; i < 4; i++, val >>= 8)
-                       buf[cur + i] = FIELD_GET(MASKBYTE0, val) >> fct;
+               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;
+               }
        }
 
        for (cur = 0, i = 0; i < map->size; i++)
@@ -770,13 +774,34 @@ rtw89_debug_priv_mac_mem_dump_get(struct seq_file *m, void *v)
 {
        struct rtw89_debugfs_priv *debugfs_priv = m->private;
        struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
+       bool grant_read = false;
+
+       if (debugfs_priv->mac_mem.sel >= RTW89_MAC_MEM_NUM)
+               return -ENOENT;
+
+       if (rtwdev->chip->chip_id == RTL8852C) {
+               switch (debugfs_priv->mac_mem.sel) {
+               case RTW89_MAC_MEM_TXD_FIFO_0_V1:
+               case RTW89_MAC_MEM_TXD_FIFO_1_V1:
+               case RTW89_MAC_MEM_TXDATA_FIFO_0:
+               case RTW89_MAC_MEM_TXDATA_FIFO_1:
+                       grant_read = true;
+                       break;
+               default:
+                       break;
+               }
+       }
 
        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);
+       if (grant_read)
+               rtw89_write32_clr(rtwdev, R_AX_TCR1, B_AX_TCR_FORCE_READ_TXDFIFO);
        mutex_unlock(&rtwdev->mutex);
 
        return 0;
index d57e3610fb88ec8735fa4cb97805ee59aff4b95b..d21f87e25ae1fdc6e02e3d7a1fef07d0099f147d 100644 (file)
@@ -2565,6 +2565,9 @@ static void rtw89_hw_scan_add_chan(struct rtw89_dev *rtwdev, int chan_type,
                                   struct rtw89_mac_chinfo *ch_info)
 {
        struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
+       struct ieee80211_vif *vif = rtwdev->scan_info.scanning_vif;
+       struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
+       struct cfg80211_scan_request *req = rtwvif->scan_req;
        struct rtw89_pktofld_info *info;
        u8 band, probe_count = 0;
 
@@ -2576,13 +2579,13 @@ static void rtw89_hw_scan_add_chan(struct rtw89_dev *rtwdev, int chan_type,
        ch_info->tx_pwr_idx = 0;
        ch_info->tx_null = false;
        ch_info->pause_data = false;
+       ch_info->probe_id = RTW89_SCANOFLD_PKT_NONE;
 
        if (ssid_num) {
                ch_info->num_pkt = ssid_num;
                band = rtw89_hw_to_nl80211_band(ch_info->ch_band);
 
                list_for_each_entry(info, &scan_info->pkt_list[band], list) {
-                       ch_info->probe_id = info->id;
                        ch_info->pkt_id[probe_count] = info->id;
                        if (++probe_count >= ssid_num)
                                break;
@@ -2591,9 +2594,16 @@ static void rtw89_hw_scan_add_chan(struct rtw89_dev *rtwdev, int chan_type,
                        rtw89_err(rtwdev, "SSID num differs from list len\n");
        }
 
+       if (ch_info->ch_band == RTW89_BAND_6G) {
+               if (ssid_num == 1 && req->ssids[0].ssid_len == 0) {
+                       ch_info->tx_pkt = false;
+                       if (!req->duration_mandatory)
+                               ch_info->period -= RTW89_DWELL_TIME;
+               }
+       }
+
        switch (chan_type) {
        case RTW89_CHAN_OPERATE:
-               ch_info->probe_id = RTW89_SCANOFLD_PKT_NONE;
                ch_info->central_ch = scan_info->op_chan;
                ch_info->pri_ch = scan_info->op_pri_ch;
                ch_info->ch_band = scan_info->op_band;
@@ -2602,8 +2612,9 @@ static void rtw89_hw_scan_add_chan(struct rtw89_dev *rtwdev, int chan_type,
                ch_info->num_pkt = 0;
                break;
        case RTW89_CHAN_DFS:
-               ch_info->period = max_t(u8, ch_info->period,
-                                       RTW89_DFS_CHAN_TIME);
+               if (ch_info->ch_band != RTW89_BAND_6G)
+                       ch_info->period = max_t(u8, ch_info->period,
+                                               RTW89_DFS_CHAN_TIME);
                ch_info->dwell_time = RTW89_DWELL_TIME;
                break;
        case RTW89_CHAN_ACTIVE:
@@ -2637,8 +2648,13 @@ static int rtw89_hw_scan_add_chan_list(struct rtw89_dev *rtwdev,
                        goto out;
                }
 
-               ch_info->period = req->duration_mandatory ?
-                                 req->duration : RTW89_CHANNEL_TIME;
+               if (req->duration_mandatory)
+                       ch_info->period = req->duration;
+               else if (channel->band == NL80211_BAND_6GHZ)
+                       ch_info->period = RTW89_CHANNEL_TIME_6G + RTW89_DWELL_TIME;
+               else
+                       ch_info->period = RTW89_CHANNEL_TIME;
+
                ch_info->ch_band = rtw89_nl80211_to_hw_band(channel->band);
                ch_info->central_ch = channel->hw_value;
                ch_info->pri_ch = channel->hw_value;
@@ -2757,6 +2773,7 @@ void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
 
        if (rtwvif->net_type != RTW89_NET_TYPE_NO_LINK)
                rtw89_store_op_chan(rtwdev, false);
+       rtw89_set_channel(rtwdev);
 }
 
 void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif)
index 0047d5d0e9b193a90ddd727dc532cdb005799be0..6ef392ef9c6fb636d24b02aa2b71f1132091be47 100644 (file)
@@ -197,6 +197,7 @@ struct rtw89_h2creg_sch_tx_en {
 
 #define RTW89_H2C_MAX_SIZE 2048
 #define RTW89_CHANNEL_TIME 45
+#define RTW89_CHANNEL_TIME_6G 20
 #define RTW89_DFS_CHAN_TIME 105
 #define RTW89_OFF_CHAN_TIME 100
 #define RTW89_DWELL_TIME 20
index 0508dfca8edf731e25acb1a3c976c85060b2a495..3531a859d6c8f07e28353fcc6457636f9709336b 100644 (file)
@@ -31,6 +31,8 @@ const u32 rtw89_mac_mem_base_addrs[RTW89_MAC_MEM_NUM] = {
        [RTW89_MAC_MEM_TXDATA_FIFO_1]   = TXDATA_FIFO_1_BASE_ADDR,
        [RTW89_MAC_MEM_CPU_LOCAL]       = CPU_LOCAL_BASE_ADDR,
        [RTW89_MAC_MEM_BSSID_CAM]       = BSSID_CAM_BASE_ADDR,
+       [RTW89_MAC_MEM_TXD_FIFO_0_V1]   = TXD_FIFO_0_BASE_ADDR_V1,
+       [RTW89_MAC_MEM_TXD_FIFO_1_V1]   = TXD_FIFO_1_BASE_ADDR_V1,
 };
 
 static void rtw89_mac_mem_write(struct rtw89_dev *rtwdev, u32 offset,
@@ -4819,6 +4821,7 @@ int rtw89_mac_read_xtal_si(struct rtw89_dev *rtwdev, u8 offset, u8 *val)
 
        return 0;
 }
+EXPORT_SYMBOL(rtw89_mac_read_xtal_si);
 
 static
 void rtw89_mac_pkt_drop_sta(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta)
index 6f4ada1869a17c5d3c09392bc121d8a8df834f3d..a6cbafb75a2b84f49c9bc58b48c2d79c0fb34a80 100644 (file)
@@ -245,6 +245,8 @@ enum rtw89_mac_dbg_port_sel {
 #define        BCN_IE_CAM1_BASE_ADDR           0x188A0000
 #define        TXD_FIFO_0_BASE_ADDR            0x18856200
 #define        TXD_FIFO_1_BASE_ADDR            0x188A1080
+#define        TXD_FIFO_0_BASE_ADDR_V1         0x18856400 /* for 8852C */
+#define        TXD_FIFO_1_BASE_ADDR_V1         0x188A1080 /* for 8852C */
 #define        TXDATA_FIFO_0_BASE_ADDR         0x18856000
 #define        TXDATA_FIFO_1_BASE_ADDR         0x188A1000
 #define        CPU_LOCAL_BASE_ADDR             0x18003000
@@ -271,6 +273,8 @@ enum rtw89_mac_mem_sel {
        RTW89_MAC_MEM_TXDATA_FIFO_1,
        RTW89_MAC_MEM_CPU_LOCAL,
        RTW89_MAC_MEM_BSSID_CAM,
+       RTW89_MAC_MEM_TXD_FIFO_0_V1,
+       RTW89_MAC_MEM_TXD_FIFO_1_V1,
 
        /* keep last */
        RTW89_MAC_MEM_NUM,
@@ -1010,6 +1014,7 @@ enum rtw89_mac_xtal_si_offset {
 #define XTAL_SI_PON_EI         BIT(1)
 #define XTAL_SI_PON_WEI                BIT(0)
        XTAL_SI_SRAM_CTRL = 0xA1,
+#define XTAL_SI_SRAM_DIS       BIT(1)
 #define FULL_BIT_MASK          GENMASK(7, 0)
 };
 
index 6a6bdc652e09e5a037ca0264e89fc3e471b13f3c..35a0d190434a3289322306acd2fcdead19afb3bc 100644 (file)
@@ -1036,6 +1036,7 @@ static void rtw89_phy_config_bb_gain(struct rtw89_dev *rtwdev,
 {
        const struct rtw89_chip_info *chip = rtwdev->chip;
        union rtw89_phy_bb_gain_arg arg = { .addr = reg->addr };
+       struct rtw89_efuse *efuse = &rtwdev->efuse;
 
        if (arg.gain_band >= RTW89_BB_GAIN_BAND_NR)
                return;
@@ -1061,6 +1062,11 @@ static void rtw89_phy_config_bb_gain(struct rtw89_dev *rtwdev,
        case 3:
                rtw89_phy_cfg_bb_gain_op1db(rtwdev, arg, reg->data);
                break;
+       case 4:
+               /* This cfg_type is only used by rfe_type >= 50 with eFEM */
+               if (efuse->rfe_type < 50)
+                       break;
+               fallthrough;
        default:
                rtw89_warn(rtwdev,
                           "bb gain {0x%x:0x%x} with unknown cfg type: %d\n",
@@ -1362,13 +1368,15 @@ static void rtw89_phy_init_rf_nctl(struct rtw89_dev *rtwdev)
        int ret;
 
        /* IQK/DPK clock & reset */
-       rtw89_phy_write32_set(rtwdev, 0x0c60, 0x3);
-       rtw89_phy_write32_set(rtwdev, 0x0c6c, 0x1);
-       rtw89_phy_write32_set(rtwdev, 0x58ac, 0x8000000);
-       rtw89_phy_write32_set(rtwdev, 0x78ac, 0x8000000);
+       rtw89_phy_write32_set(rtwdev, R_IOQ_IQK_DPK, 0x3);
+       rtw89_phy_write32_set(rtwdev, R_GNT_BT_WGT_EN, 0x1);
+       rtw89_phy_write32_set(rtwdev, R_P0_PATH_RST, 0x8000000);
+       rtw89_phy_write32_set(rtwdev, R_P1_PATH_RST, 0x8000000);
+       if (chip->chip_id == RTL8852B)
+               rtw89_phy_write32_set(rtwdev, R_IOQ_IQK_DPK, 0x2);
 
        /* check 0x8080 */
-       rtw89_phy_write32(rtwdev, 0x8000, 0x8);
+       rtw89_phy_write32(rtwdev, R_NCTL_CFG, 0x8);
 
        ret = read_poll_timeout(rtw89_phy_nctl_poll, val, val == 0x4, 10,
                                1000, false, rtwdev);
@@ -1419,6 +1427,15 @@ void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
 }
 EXPORT_SYMBOL(rtw89_phy_write32_idx);
 
+u32 rtw89_phy_read32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
+                        enum rtw89_phy_idx phy_idx)
+{
+       if (rtwdev->dbcc_en && phy_idx == RTW89_PHY_1)
+               addr += rtw89_phy0_phy1_offset(rtwdev, addr);
+       return rtw89_phy_read32_mask(rtwdev, addr, mask);
+}
+EXPORT_SYMBOL(rtw89_phy_read32_idx);
+
 void rtw89_phy_set_phy_regs(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
                            u32 val)
 {
@@ -1443,23 +1460,21 @@ void rtw89_phy_write_reg3_tbl(struct rtw89_dev *rtwdev,
 }
 EXPORT_SYMBOL(rtw89_phy_write_reg3_tbl);
 
-const u8 rtw89_rs_idx_max[] = {
+static const u8 rtw89_rs_idx_max[] = {
        [RTW89_RS_CCK] = RTW89_RATE_CCK_MAX,
        [RTW89_RS_OFDM] = RTW89_RATE_OFDM_MAX,
        [RTW89_RS_MCS] = RTW89_RATE_MCS_MAX,
        [RTW89_RS_HEDCM] = RTW89_RATE_HEDCM_MAX,
        [RTW89_RS_OFFSET] = RTW89_RATE_OFFSET_MAX,
 };
-EXPORT_SYMBOL(rtw89_rs_idx_max);
 
-const u8 rtw89_rs_nss_max[] = {
+static const u8 rtw89_rs_nss_max[] = {
        [RTW89_RS_CCK] = 1,
        [RTW89_RS_OFDM] = 1,
        [RTW89_RS_MCS] = RTW89_NSS_MAX,
        [RTW89_RS_HEDCM] = RTW89_NSS_HEDCM_MAX,
        [RTW89_RS_OFFSET] = 1,
 };
-EXPORT_SYMBOL(rtw89_rs_nss_max);
 
 static const u8 _byr_of_rs[] = {
        [RTW89_RS_CCK] = offsetof(struct rtw89_txpwr_byrate, cck),
@@ -1501,6 +1516,7 @@ EXPORT_SYMBOL(rtw89_phy_load_txpwr_byrate);
        (txpwr_rf) >> (__c->txpwr_factor_rf - __c->txpwr_factor_mac);   \
 })
 
+static
 s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev, u8 band,
                               const struct rtw89_rate_desc *rate_desc)
 {
@@ -1523,7 +1539,6 @@ s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev, u8 band,
 
        return _phy_txpwr_rf_to_mac(rtwdev, byr[idx]);
 }
-EXPORT_SYMBOL(rtw89_phy_read_txpwr_byrate);
 
 static u8 rtw89_channel_6g_to_idx(struct rtw89_dev *rtwdev, u8 channel_6g)
 {
@@ -1783,6 +1798,7 @@ static void rtw89_phy_fill_txpwr_limit_160m(struct rtw89_dev *rtwdev,
                lmt->mcs_40m_2p5[i] = min_t(s8, val_2p5_n[i], val_2p5_p[i]);
 }
 
+static
 void rtw89_phy_fill_txpwr_limit(struct rtw89_dev *rtwdev,
                                const struct rtw89_chan *chan,
                                struct rtw89_txpwr_limit *lmt,
@@ -1813,7 +1829,6 @@ void rtw89_phy_fill_txpwr_limit(struct rtw89_dev *rtwdev,
                break;
        }
 }
-EXPORT_SYMBOL(rtw89_phy_fill_txpwr_limit);
 
 static s8 rtw89_phy_read_txpwr_limit_ru(struct rtw89_dev *rtwdev, u8 band,
                                        u8 ru, u8 ntx, u8 ch)
@@ -1962,6 +1977,7 @@ rtw89_phy_fill_txpwr_limit_ru_160m(struct rtw89_dev *rtwdev,
        }
 }
 
+static
 void rtw89_phy_fill_txpwr_limit_ru(struct rtw89_dev *rtwdev,
                                   const struct rtw89_chan *chan,
                                   struct rtw89_txpwr_limit_ru *lmt_ru,
@@ -1992,7 +2008,161 @@ void rtw89_phy_fill_txpwr_limit_ru(struct rtw89_dev *rtwdev,
                break;
        }
 }
-EXPORT_SYMBOL(rtw89_phy_fill_txpwr_limit_ru);
+
+void rtw89_phy_set_txpwr_byrate(struct rtw89_dev *rtwdev,
+                               const struct rtw89_chan *chan,
+                               enum rtw89_phy_idx phy_idx)
+{
+       static const u8 rs[] = {
+               RTW89_RS_CCK,
+               RTW89_RS_OFDM,
+               RTW89_RS_MCS,
+               RTW89_RS_HEDCM,
+       };
+       struct rtw89_rate_desc cur;
+       u8 band = chan->band_type;
+       u8 ch = chan->channel;
+       u32 addr, val;
+       s8 v[4] = {};
+       u8 i;
+
+       rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
+                   "[TXPWR] set txpwr byrate with ch=%d\n", ch);
+
+       BUILD_BUG_ON(rtw89_rs_idx_max[RTW89_RS_CCK] % 4);
+       BUILD_BUG_ON(rtw89_rs_idx_max[RTW89_RS_OFDM] % 4);
+       BUILD_BUG_ON(rtw89_rs_idx_max[RTW89_RS_MCS] % 4);
+       BUILD_BUG_ON(rtw89_rs_idx_max[RTW89_RS_HEDCM] % 4);
+
+       addr = R_AX_PWR_BY_RATE;
+       for (cur.nss = 0; cur.nss <= RTW89_NSS_2; cur.nss++) {
+               for (i = 0; i < ARRAY_SIZE(rs); i++) {
+                       if (cur.nss >= rtw89_rs_nss_max[rs[i]])
+                               continue;
+
+                       cur.rs = rs[i];
+                       for (cur.idx = 0; cur.idx < rtw89_rs_idx_max[rs[i]];
+                            cur.idx++) {
+                               v[cur.idx % 4] =
+                                       rtw89_phy_read_txpwr_byrate(rtwdev,
+                                                                   band,
+                                                                   &cur);
+
+                               if ((cur.idx + 1) % 4)
+                                       continue;
+
+                               val = FIELD_PREP(GENMASK(7, 0), v[0]) |
+                                     FIELD_PREP(GENMASK(15, 8), v[1]) |
+                                     FIELD_PREP(GENMASK(23, 16), v[2]) |
+                                     FIELD_PREP(GENMASK(31, 24), v[3]);
+
+                               rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr,
+                                                       val);
+                               addr += 4;
+                       }
+               }
+       }
+}
+EXPORT_SYMBOL(rtw89_phy_set_txpwr_byrate);
+
+void rtw89_phy_set_txpwr_offset(struct rtw89_dev *rtwdev,
+                               const struct rtw89_chan *chan,
+                               enum rtw89_phy_idx phy_idx)
+{
+       struct rtw89_rate_desc desc = {
+               .nss = RTW89_NSS_1,
+               .rs = RTW89_RS_OFFSET,
+       };
+       u8 band = chan->band_type;
+       s8 v[RTW89_RATE_OFFSET_MAX] = {};
+       u32 val;
+
+       rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set txpwr offset\n");
+
+       for (desc.idx = 0; desc.idx < RTW89_RATE_OFFSET_MAX; desc.idx++)
+               v[desc.idx] = rtw89_phy_read_txpwr_byrate(rtwdev, band, &desc);
+
+       BUILD_BUG_ON(RTW89_RATE_OFFSET_MAX != 5);
+       val = FIELD_PREP(GENMASK(3, 0), v[0]) |
+             FIELD_PREP(GENMASK(7, 4), v[1]) |
+             FIELD_PREP(GENMASK(11, 8), v[2]) |
+             FIELD_PREP(GENMASK(15, 12), v[3]) |
+             FIELD_PREP(GENMASK(19, 16), v[4]);
+
+       rtw89_mac_txpwr_write32_mask(rtwdev, phy_idx, R_AX_PWR_RATE_OFST_CTRL,
+                                    GENMASK(19, 0), val);
+}
+EXPORT_SYMBOL(rtw89_phy_set_txpwr_offset);
+
+void rtw89_phy_set_txpwr_limit(struct rtw89_dev *rtwdev,
+                              const struct rtw89_chan *chan,
+                              enum rtw89_phy_idx phy_idx)
+{
+       struct rtw89_txpwr_limit lmt;
+       u8 ch = chan->channel;
+       u8 bw = chan->band_width;
+       const s8 *ptr;
+       u32 addr, val;
+       u8 i, j;
+
+       rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
+                   "[TXPWR] set txpwr limit with ch=%d bw=%d\n", ch, bw);
+
+       BUILD_BUG_ON(sizeof(struct rtw89_txpwr_limit) !=
+                    RTW89_TXPWR_LMT_PAGE_SIZE);
+
+       addr = R_AX_PWR_LMT;
+       for (i = 0; i < RTW89_NTX_NUM; i++) {
+               rtw89_phy_fill_txpwr_limit(rtwdev, chan, &lmt, i);
+
+               ptr = (s8 *)&lmt;
+               for (j = 0; j < RTW89_TXPWR_LMT_PAGE_SIZE;
+                    j += 4, addr += 4, ptr += 4) {
+                       val = FIELD_PREP(GENMASK(7, 0), ptr[0]) |
+                             FIELD_PREP(GENMASK(15, 8), ptr[1]) |
+                             FIELD_PREP(GENMASK(23, 16), ptr[2]) |
+                             FIELD_PREP(GENMASK(31, 24), ptr[3]);
+
+                       rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val);
+               }
+       }
+}
+EXPORT_SYMBOL(rtw89_phy_set_txpwr_limit);
+
+void rtw89_phy_set_txpwr_limit_ru(struct rtw89_dev *rtwdev,
+                                 const struct rtw89_chan *chan,
+                                 enum rtw89_phy_idx phy_idx)
+{
+       struct rtw89_txpwr_limit_ru lmt_ru;
+       u8 ch = chan->channel;
+       u8 bw = chan->band_width;
+       const s8 *ptr;
+       u32 addr, val;
+       u8 i, j;
+
+       rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
+                   "[TXPWR] set txpwr limit ru with ch=%d bw=%d\n", ch, bw);
+
+       BUILD_BUG_ON(sizeof(struct rtw89_txpwr_limit_ru) !=
+                    RTW89_TXPWR_LMT_RU_PAGE_SIZE);
+
+       addr = R_AX_PWR_RU_LMT;
+       for (i = 0; i < RTW89_NTX_NUM; i++) {
+               rtw89_phy_fill_txpwr_limit_ru(rtwdev, chan, &lmt_ru, i);
+
+               ptr = (s8 *)&lmt_ru;
+               for (j = 0; j < RTW89_TXPWR_LMT_RU_PAGE_SIZE;
+                    j += 4, addr += 4, ptr += 4) {
+                       val = FIELD_PREP(GENMASK(7, 0), ptr[0]) |
+                             FIELD_PREP(GENMASK(15, 8), ptr[1]) |
+                             FIELD_PREP(GENMASK(23, 16), ptr[2]) |
+                             FIELD_PREP(GENMASK(31, 24), ptr[3]);
+
+                       rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val);
+               }
+       }
+}
+EXPORT_SYMBOL(rtw89_phy_set_txpwr_limit_ru);
 
 struct rtw89_phy_iter_ra_data {
        struct rtw89_dev *rtwdev;
@@ -2106,6 +2276,10 @@ void rtw89_phy_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
                if (func < RTW89_PHY_C2H_FUNC_RA_MAX)
                        handler = rtw89_phy_c2h_ra_handler[func];
                break;
+       case RTW89_PHY_C2H_CLASS_DM:
+               if (func == RTW89_PHY_C2H_DM_FUNC_LOWRT_RTY)
+                       return;
+               fallthrough;
        default:
                rtw89_info(rtwdev, "c2h class %d not support\n", class);
                return;
index ee3bc5e111e1636c91207588169dceaa4eb979df..995c13f6f906c4cbf426b0f5086686578e0f6402 100644 (file)
@@ -114,6 +114,15 @@ enum rtw89_phy_c2h_ra_func {
        RTW89_PHY_C2H_FUNC_RA_MAX,
 };
 
+enum rtw89_phy_c2h_dm_func {
+       RTW89_PHY_C2H_DM_FUNC_FW_TEST,
+       RTW89_PHY_C2H_DM_FUNC_FW_TRIG_TX_RPT,
+       RTW89_PHY_C2H_DM_FUNC_SIGB,
+       RTW89_PHY_C2H_DM_FUNC_LOWRT_RTY,
+       RTW89_PHY_C2H_DM_FUNC_MCC_DIG,
+       RTW89_PHY_C2H_DM_FUNC_NUM,
+};
+
 enum rtw89_phy_c2h_class {
        RTW89_PHY_C2H_CLASS_RUA,
        RTW89_PHY_C2H_CLASS_RA,
@@ -317,9 +326,6 @@ struct rtw89_nbi_reg_def {
        struct rtw89_reg_def notch2_en;
 };
 
-extern const u8 rtw89_rs_idx_max[RTW89_RS_MAX];
-extern const u8 rtw89_rs_nss_max[RTW89_RS_MAX];
-
 static inline void rtw89_phy_write8(struct rtw89_dev *rtwdev,
                                    u32 addr, u8 data)
 {
@@ -377,6 +383,50 @@ static inline u32 rtw89_phy_read32_mask(struct rtw89_dev *rtwdev,
        return rtw89_read32_mask(rtwdev, addr | RTW89_PHY_ADDR_OFFSET, mask);
 }
 
+static inline
+enum rtw89_gain_offset rtw89_subband_to_gain_offset_band_of_ofdm(enum rtw89_subband subband)
+{
+       switch (subband) {
+       default:
+       case RTW89_CH_2G:
+               return RTW89_GAIN_OFFSET_2G_OFDM;
+       case RTW89_CH_5G_BAND_1:
+               return RTW89_GAIN_OFFSET_5G_LOW;
+       case RTW89_CH_5G_BAND_3:
+               return RTW89_GAIN_OFFSET_5G_MID;
+       case RTW89_CH_5G_BAND_4:
+               return RTW89_GAIN_OFFSET_5G_HIGH;
+       }
+}
+
+static inline
+enum rtw89_phy_bb_gain_band rtw89_subband_to_bb_gain_band(enum rtw89_subband subband)
+{
+       switch (subband) {
+       default:
+       case RTW89_CH_2G:
+               return RTW89_BB_GAIN_BAND_2G;
+       case RTW89_CH_5G_BAND_1:
+               return RTW89_BB_GAIN_BAND_5G_L;
+       case RTW89_CH_5G_BAND_3:
+               return RTW89_BB_GAIN_BAND_5G_M;
+       case RTW89_CH_5G_BAND_4:
+               return RTW89_BB_GAIN_BAND_5G_H;
+       case RTW89_CH_6G_BAND_IDX0:
+       case RTW89_CH_6G_BAND_IDX1:
+               return RTW89_BB_GAIN_BAND_6G_L;
+       case RTW89_CH_6G_BAND_IDX2:
+       case RTW89_CH_6G_BAND_IDX3:
+               return RTW89_BB_GAIN_BAND_6G_M;
+       case RTW89_CH_6G_BAND_IDX4:
+       case RTW89_CH_6G_BAND_IDX5:
+               return RTW89_BB_GAIN_BAND_6G_H;
+       case RTW89_CH_6G_BAND_IDX6:
+       case RTW89_CH_6G_BAND_IDX7:
+               return RTW89_BB_GAIN_BAND_6G_UH;
+       }
+}
+
 enum rtw89_rfk_flag {
        RTW89_RFK_F_WRF = 0,
        RTW89_RFK_F_WM = 1,
@@ -458,20 +508,24 @@ void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev,
 void rtw89_phy_dm_init(struct rtw89_dev *rtwdev);
 void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
                           u32 data, enum rtw89_phy_idx phy_idx);
+u32 rtw89_phy_read32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask,
+                        enum rtw89_phy_idx phy_idx);
 void rtw89_phy_load_txpwr_byrate(struct rtw89_dev *rtwdev,
                                 const struct rtw89_txpwr_table *tbl);
-s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev, u8 band,
-                              const struct rtw89_rate_desc *rate_desc);
-void rtw89_phy_fill_txpwr_limit(struct rtw89_dev *rtwdev,
-                               const struct rtw89_chan *chan,
-                               struct rtw89_txpwr_limit *lmt,
-                               u8 ntx);
-void rtw89_phy_fill_txpwr_limit_ru(struct rtw89_dev *rtwdev,
-                                  const struct rtw89_chan *chan,
-                                  struct rtw89_txpwr_limit_ru *lmt_ru,
-                                  u8 ntx);
 s8 rtw89_phy_read_txpwr_limit(struct rtw89_dev *rtwdev, u8 band,
                              u8 bw, u8 ntx, u8 rs, u8 bf, u8 ch);
+void rtw89_phy_set_txpwr_byrate(struct rtw89_dev *rtwdev,
+                               const struct rtw89_chan *chan,
+                               enum rtw89_phy_idx phy_idx);
+void rtw89_phy_set_txpwr_offset(struct rtw89_dev *rtwdev,
+                               const struct rtw89_chan *chan,
+                               enum rtw89_phy_idx phy_idx);
+void rtw89_phy_set_txpwr_limit(struct rtw89_dev *rtwdev,
+                              const struct rtw89_chan *chan,
+                              enum rtw89_phy_idx phy_idx);
+void rtw89_phy_set_txpwr_limit_ru(struct rtw89_dev *rtwdev,
+                                 const struct rtw89_chan *chan,
+                                 enum rtw89_phy_idx phy_idx);
 void rtw89_phy_ra_assoc(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta);
 void rtw89_phy_ra_update(struct rtw89_dev *rtwdev);
 void rtw89_phy_ra_updata_sta(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta,
index ca20bb024b407a9fe6bcea7d62eca4958367ca02..2b938d11d2381fba810f2a811917f713fbd71569 100644 (file)
@@ -34,6 +34,9 @@
 #define R_AX_SYS_CLK_CTRL 0x0008
 #define B_AX_CPU_CLK_EN BIT(14)
 
+#define R_AX_SYS_SWR_CTRL1 0x0010
+#define B_AX_SYM_CTRL_SPS_PWMFREQ BIT(10)
+
 #define R_AX_SYS_ADIE_PAD_PWR_CTRL 0x0018
 #define B_AX_SYM_PADPDN_WL_PTA_1P3 BIT(6)
 #define B_AX_SYM_PADPDN_WL_RFC_1P3 BIT(5)
@@ -42,6 +45,9 @@
 #define B_AX_R_DIS_PRST BIT(6)
 #define B_AX_WLOCK_1C_BIT6 BIT(5)
 
+#define R_AX_AFE_LDO_CTRL 0x0020
+#define B_AX_AON_OFF_PC_EN BIT(23)
+
 #define R_AX_EFUSE_CTRL_1 0x0038
 #define B_AX_EF_PGPD_MASK GENMASK(30, 28)
 #define B_AX_EF_RDT BIT(27)
 #define B_AX_R_AX_BG_LPF BIT(2)
 #define B_AX_R_AX_BG GENMASK(1, 0)
 
+#define R_AX_HCI_LDO_CTRL 0x007A
+#define B_AX_R_AX_VADJ_MASK GENMASK(3, 0)
+
 #define R_AX_PLATFORM_ENABLE 0x0088
 #define B_AX_AXIDMA_EN BIT(3)
 #define B_AX_WCPU_EN BIT(1)
 
 #define R_AX_WLLPS_CTRL 0x0090
 #define B_AX_DIS_WLBT_LPSEN_LOPC BIT(1)
+#define SW_LPS_OPTION 0x0001A0B2
 
 #define R_AX_SCOREBOARD  0x00AC
 #define B_AX_TOGGLE BIT(31)
 
 #define R_AX_GPIO0_7_FUNC_SEL 0x02D0
 
+#define R_AX_EECS_EESK_FUNC_SEL 0x02D8
+#define B_AX_PINMUX_EESK_FUNC_SEL_MASK GENMASK(7, 4)
+
+#define R_AX_LED1_FUNC_SEL 0x02DC
+#define B_AX_PINMUX_EESK_FUNC_SEL_V1_MASK GENMASK(27, 24)
+#define PINMUX_EESK_FUNC_SEL_BT_LOG 0x1
+
 #define R_AX_GPIO0_15_EECS_EESK_LED1_PULL_LOW_EN 0x02E4
 #define B_AX_LED1_PULL_LOW_EN BIT(18)
 #define B_AX_EESK_PULL_LOW_EN BIT(17)
 #define B_AX_USB_HCISYS_PWR_STE_MASK GENMASK(3, 2)
 #define B_AX_PCIE_HCISYS_PWR_STE_MASK GENMASK(1, 0)
 
+#define R_AX_SPS_DIG_OFF_CTRL0 0x0400
+#define B_AX_C3_L1_MASK GENMASK(5, 4)
+#define B_AX_C1_L1_MASK GENMASK(1, 0)
+
 #define R_AX_AFE_OFF_CTRL1 0x0444
 #define B_AX_S1_LDO_VSEL_F_MASK GENMASK(25, 24)
 #define B_AX_S1_LDO2PWRCUT_F BIT(23)
 #define B_AX_DISPATCHER_EN BIT(18)
 #define B_AX_BBRPT_EN BIT(17)
 #define B_AX_MAC_SEC_EN BIT(16)
+#define B_AX_DMACREG_GCKEN BIT(15)
 #define B_AX_MAC_UN_EN BIT(15)
 #define B_AX_H_AXIDMA_EN BIT(14)
 
 
 #define R_AX_PWR_RATE_CTRL 0xD200
 #define R_AX_PWR_RATE_CTRL_C1 0xF200
+#define B_AX_PWR_REF GENMASK(27, 10)
 #define B_AX_FORCE_PWR_BY_RATE_EN BIT(9)
 #define B_AX_FORCE_PWR_BY_RATE_VALUE_MASK GENMASK(8, 0)
 
 #define BTC_BREAK_PARAM 0xf0ffffff
 
 #define R_BTC_BT_COEX_MSK_TABLE 0xDA30
+#define B_BTC_PRI_MASK_RXCCK_V1 BIT(28)
 #define B_BTC_PRI_MASK_TX_RESP_V1 BIT(3)
 
 #define R_AX_BT_COEX_CFG_2 0xDA34
 #define RR_MOD_IQK GENMASK(19, 4)
 #define RR_MOD_DPK GENMASK(19, 5)
 #define RR_MOD_MASK GENMASK(19, 16)
+#define RR_MOD_RGM GENMASK(13, 4)
 #define RR_MOD_V_DOWN 0x0
 #define RR_MOD_V_STANDBY 0x1
+#define RR_TXAGC 0x10001
 #define RR_MOD_V_TX 0x2
 #define RR_MOD_V_RX 0x3
 #define RR_MOD_V_TXIQK 0x4
 #define CFGCH_BAND1_2G 0
 #define CFGCH_BAND1_5G 1
 #define CFGCH_BAND1_6G 3
+#define RR_CFGCH_POW_LCK BIT(15)
+#define RR_CFGCH_TRX_AH BIT(14)
+#define RR_CFGCH_BCN BIT(13)
+#define RR_CFGCH_BW2 BIT(12)
 #define RR_CFGCH_BAND0 GENMASK(9, 8)
 #define CFGCH_BAND0_2G 0
 #define CFGCH_BAND0_5G 1
 #define RR_RXK_PLLEN BIT(5)
 #define RR_LUTWA 0x33
 #define RR_LUTWA_MASK GENMASK(9, 0)
+#define RR_LUTWA_M1 GENMASK(7, 0)
 #define RR_LUTWA_M2 GENMASK(4, 0)
 #define RR_LUTWD1 0x3e
 #define RR_LUTWD0 0x3f
 #define RR_TXGA_TRK_EN BIT(7)
 #define RR_TXGA_LOK_EXT GENMASK(4, 0)
 #define RR_TXGA_LOK_EN BIT(0)
+#define RR_TXGA_V1 0x10055
+#define RR_TXGA_V1_TRK_EN BIT(7)
 #define RR_GAINTX 0x56
 #define RR_GAINTX_ALL GENMASK(15, 0)
 #define RR_GAINTX_PAD GENMASK(9, 5)
 #define RR_TXA2_LDO GENMASK(19, 16)
 #define RR_TRXIQ 0x66
 #define RR_RSV6 0x6d
+#define RR_TXVBUF 0x7c
+#define RR_TXVBUF_DACEN BIT(5)
 #define RR_TXPOW 0x7f
 #define RR_TXPOW_TXA BIT(8)
 #define RR_TXPOW_TXAS BIT(7)
 #define RR_RXBB_VOBUF GENMASK(15, 12)
 #define RR_RXBB_C2G GENMASK(16, 10)
 #define RR_RXBB_C1G GENMASK(9, 8)
+#define RR_RXBB_FATT GENMASK(7, 0)
 #define RR_RXBB_ATTR GENMASK(7, 4)
 #define RR_RXBB_ATTC GENMASK(2, 0)
 #define RR_RXG 0x84
 #define RR_RXAE_IQKMOD GENMASK(3, 0)
 #define RR_RXA 0x8a
 #define RR_RXA_DPK GENMASK(9, 8)
+#define RR_RXA_LNA 0x8b
 #define RR_RXA2 0x8c
+#define RR_RAA2_SWATT GENMASK(15, 9)
 #define RR_RXA2_C1 GENMASK(12, 10)
 #define RR_RXA2_C2 GENMASK(9, 3)
+#define RR_RXA2_CC2 GENMASK(8, 7)
 #define RR_RXA2_IATT GENMASK(7, 4)
+#define RR_RXA2_HATT GENMASK(6, 0)
 #define RR_RXA2_ATT GENMASK(3, 0)
 #define RR_RXIQGEN 0x8d
 #define RR_RXIQGEN_ATTL GENMASK(12, 8)
 #define RR_RXBB2_IDAC GENMASK(11, 9)
 #define RR_RXBB2_EBW GENMASK(6, 5)
 #define RR_XALNA2 0x90
+#define RR_XALNA2_SW2 GENMASK(9, 8)
 #define RR_XALNA2_SW GENMASK(1, 0)
 #define RR_DCK 0x92
 #define RR_DCK_DONE GENMASK(7, 5)
 #define RR_IQGEN_BIAS GENMASK(11, 8)
 #define RR_TXIQK 0x98
 #define RR_TXIQK_ATT2 GENMASK(15, 12)
+#define RR_TXIQK_ATT1 GENMASK(6, 0)
 #define RR_TIA 0x9e
 #define RR_TIA_N6 BIT(8)
 #define RR_MIXER 0x9f
 #define RR_MIXER_GN GENMASK(4, 3)
+#define RR_POW 0xa0
+#define RR_POW_SYN GENMASK(3, 2)
 #define RR_LOGEN 0xa3
 #define RR_LOGEN_RPT GENMASK(19, 16)
+#define RR_SX 0xaf
+#define RR_LDO 0xb1
+#define RR_LDO_SEL GENMASK(8, 6)
+#define RR_VCO 0xb2
+#define RR_LPF 0xb7
+#define RR_LPF_BUSY BIT(8)
 #define RR_XTALX2 0xb8
 #define RR_MALSEL 0xbe
+#define RR_SYNFB 0xc5
+#define RR_SYNFB_LK BIT(15)
+#define RR_LCKST 0xcf
+#define RR_LCKST_BIN BIT(0)
 #define RR_LCK_TRG 0xd3
 #define RR_LCK_TRGSEL BIT(8)
+#define RR_MMD 0xd5
+#define RR_MMD_RST_EN BIT(8)
+#define RR_MMD_RST_SYN BIT(6)
 #define RR_IQKPLL 0xdc
 #define RR_IQKPLL_MOD GENMASK(9, 8)
+#define RR_SYNLUT 0xdd
+#define RR_SYNLUT_MOD BIT(4)
 #define RR_RCKD 0xde
 #define RR_RCKD_POW GENMASK(19, 13)
 #define RR_RCKD_BW BIT(2)
 #define B_ANAPAR_ADCCLK BIT(30)
 #define B_ANAPAR_FLTRST BIT(22)
 #define B_ANAPAR_CRXBB GENMASK(18, 16)
+#define B_ANAPAR_EN BIT(16)
 #define B_ANAPAR_14 GENMASK(15, 0)
 #define R_RFE_E_A2 0x0334
 #define R_RFE_O_SEL_A2 0x0338
 #define R_RFE_SEL0_A2 0x033C
 #define R_RFE_SEL32_A2 0x0340
+#define R_CIRST 0x035c
+#define B_CIRST_SYN GENMASK(11, 10)
 #define R_SWSI_DATA_V1 0x0370
 #define B_SWSI_DATA_VAL_V1 GENMASK(19, 0)
 #define B_SWSI_DATA_ADDR_V1 GENMASK(27, 20)
 #define R_P0_RFMODE 0x12AC
 #define B_P0_RFMODE_ORI_TXRX_FTM_TX GENMASK(31, 4)
 #define B_P0_RFMODE_MUX GENMASK(11, 4)
+#define R_P0_RFMODE_ORI_RX 0x12AC
+#define B_P0_RFMODE_ORI_RX_ALL GENMASK(23, 12)
+#define R_P0_RFMODE_FTM_RX 0x12B0
+#define B_P0_RFMODE_FTM_RX GENMASK(11, 0)
 #define R_P0_NRBW 0x12B8
 #define B_P0_NRBW_DBG BIT(30)
 #define R_S0_RXDC 0x12D4
 #define B_TXAGC_TP GENMASK(2, 0)
 #define R_TSSI_THER 0x1C10
 #define B_TSSI_THER GENMASK(29, 24)
+#define R_TSSI_CWRPT 0x1C18
+#define B_TSSI_CWRPT_RDY BIT(16)
+#define B_TSSI_CWRPT GENMASK(8, 0)
 #define R_TXAGC_BTP 0x1CA0
 #define B_TXAGC_BTP GENMASK(31, 24)
 #define R_TXAGC_BB 0x1C60
 #define B_RXCCA_DIS_V1 BIT(0)
 #define R_RXSC 0x237C
 #define B_RXSC_EN BIT(0)
+#define R_RX_RPL_OFST 0x23AC
+#define B_RX_RPL_OFST_CCK_MASK GENMASK(6, 0)
 #define R_RXSCOBC 0x23B0
 #define B_RXSCOBC_TH GENMASK(18, 0)
 #define R_RXSCOCCK 0x23B4
 #define B_P1_EN_SOUND_WO_NDP BIT(1)
 #define R_S1_HW_SI_DIS 0x3200
 #define B_S1_HW_SI_DIS_W_R_TRIG GENMASK(30, 28)
+#define R_P1_RXCK 0x32A0
+#define B_P1_RXCK_BW3 BIT(30)
+#define B_P1_TXCK_ALL GENMASK(19, 12)
+#define B_P1_RXCK_ON BIT(19)
+#define B_P1_RXCK_VAL GENMASK(18, 16)
 #define R_P1_RFMODE 0x32AC
 #define B_P1_RFMODE_ORI_TXRX_FTM_TX GENMASK(31, 4)
 #define B_P1_RFMODE_MUX GENMASK(11, 4)
+#define R_P1_RFMODE_ORI_RX 0x32AC
+#define B_P1_RFMODE_ORI_RX_ALL GENMASK(23, 12)
+#define R_P1_RFMODE_FTM_RX 0x32B0
+#define B_P1_RFMODE_FTM_RX GENMASK(11, 0)
 #define R_P1_DBGMOD 0x32B8
 #define B_P1_DBGMOD_ON BIT(30)
 #define R_S1_RXDC 0x32D4
 #define R_T2F_GI_COMB 0x4424
 #define B_T2F_GI_COMB_EN BIT(2)
 #define R_BT_DYN_DC_EST_EN 0x441C
+#define R_BT_DYN_DC_EST_EN_V1 0x4420
 #define B_BT_DYN_DC_EST_EN_MSK BIT(31)
+#define R_ASSIGN_SBD_OPT_V1 0x4440
+#define B_ASSIGN_SBD_OPT_EN_V1 BIT(31)
 #define R_ASSIGN_SBD_OPT 0x4450
 #define B_ASSIGN_SBD_OPT_EN BIT(24)
 #define R_DCFO_COMP_S0 0x448C
 #define B_DCFO_WEIGHT_MSK GENMASK(27, 24)
 #define R_DCFO_OPT 0x4494
 #define B_DCFO_OPT_EN BIT(29)
+#define B_TXSHAPE_TRIANGULAR_CFG GENMASK(25, 24)
 #define R_BANDEDGE 0x4498
 #define B_BANDEDGE_EN BIT(30)
+#define R_DPD_BF 0x44a0
+#define B_DPD_BF_OFDM GENMASK(16, 12)
+#define B_DPD_BF_SCA GENMASK(6, 0)
 #define R_TXPATH_SEL 0x458C
 #define B_TXPATH_SEL_MSK GENMASK(31, 28)
 #define R_TXPWR 0x4594
 #define R_2P4G_BAND 0x4970
 #define B_2P4G_BAND_SEL BIT(1)
 #define R_FC0_BW 0x4974
-#define B_FC0_BW_INV GENMASK(6, 0)
+#define R_FC0_BW_V1 0x49C0
 #define B_FC0_BW_SET GENMASK(31, 30)
 #define B_ANT_RX_BT_SEG0 GENMASK(25, 22)
 #define B_ANT_RX_1RCCA_SEG1 GENMASK(21, 18)
 #define B_ANT_RX_1RCCA_SEG0 GENMASK(17, 14)
+#define B_FC0_BW_INV GENMASK(6, 0)
 #define R_CHBW_MOD 0x4978
+#define R_CHBW_MOD_V1 0x49C4
 #define B_BT_SHARE BIT(14)
 #define B_CHBW_MOD_SBW GENMASK(13, 12)
 #define B_CHBW_MOD_PRICH GENMASK(11, 8)
 #define B_ANT_RX_SEG0 GENMASK(3, 0)
+#define R_P0_RPL1 0x49B0
+#define B_P0_RPL1_41_MASK GENMASK(31, 24)
+#define B_P0_RPL1_40_MASK GENMASK(23, 16)
+#define B_P0_RPL1_20_MASK GENMASK(15, 8)
+#define B_P0_RPL1_MASK (B_P0_RPL1_41_MASK | B_P0_RPL1_40_MASK | B_P0_RPL1_20_MASK)
+#define B_P0_RPL1_SHIFT 8
+#define B_P0_RPL1_BIAS_MASK GENMASK(7, 0)
+#define R_P0_RPL2 0x49B4
+#define B_P0_RTL2_8A_MASK GENMASK(31, 24)
+#define B_P0_RTL2_81_MASK GENMASK(23, 16)
+#define B_P0_RTL2_80_MASK GENMASK(15, 8)
+#define B_P0_RTL2_42_MASK GENMASK(7, 0)
+#define R_P0_RPL3 0x49B8
+#define B_P0_RTL3_89_MASK GENMASK(31, 24)
+#define B_P0_RTL3_84_MASK GENMASK(23, 16)
+#define B_P0_RTL3_83_MASK GENMASK(15, 8)
+#define B_P0_RTL3_82_MASK GENMASK(7, 0)
 #define R_PD_BOOST_EN 0x49E8
 #define B_PD_BOOST_EN BIT(7)
 #define R_P1_BACKOFF_IBADC_V1 0x49F0
 #define B_P1_BACKOFF_IBADC_V1 GENMASK(31, 26)
+#define R_P1_RPL1 0x4A00
+#define R_P1_RPL2 0x4A04
+#define R_P1_RPL3 0x4A08
 #define R_BK_FC0_INV_V1 0x4A1C
 #define B_BK_FC0_INV_MSK_V1 GENMASK(18, 0)
 #define R_CCK_FC0_INV_V1 0x4A20
 #define B_P1_AGC_EN BIT(31)
 #define R_PATH1_TIA_INIT_V1 0x4AA8
 #define B_PATH1_TIA_INIT_IDX_MSK_V1 BIT(9)
+#define R_P0_AGC_RSVD 0x4ACC
 #define R_PATH0_RXBB_V1 0x4AD4
 #define B_PATH0_RXBB_MSK_V1 GENMASK(31, 0)
+#define R_P1_AGC_RSVD 0x4AD8
 #define R_PATH1_RXBB_V1 0x4AE0
 #define B_PATH1_RXBB_MSK_V1 GENMASK(31, 0)
 #define R_PATH0_BT_BACKOFF_V1 0x4AE4
 #define B_PATH0_NOTCH2_EN BIT(12)
 #define B_PATH0_NOTCH2_VAL GENMASK(11, 0)
 #define R_PATH0_5MDET 0x4C4C
+#define R_PATH0_5MDET_V1 0x46F8
 #define B_PATH0_5MDET_EN BIT(12)
 #define B_PATH0_5MDET_SB2 BIT(8)
 #define B_PATH0_5MDET_SB0 BIT(6)
 #define B_PATH1_NOTCH2_EN BIT(12)
 #define B_PATH1_NOTCH2_VAL GENMASK(11, 0)
 #define R_PATH1_5MDET 0x4D10
+#define R_PATH1_5MDET_V1 0x47B8
 #define B_PATH1_5MDET_EN BIT(12)
 #define B_PATH1_5MDET_SB2 BIT(8)
 #define B_PATH1_5MDET_SB0 BIT(6)
 #define B_CFO_COMP_VALID_BIT BIT(29)
 #define B_CFO_COMP_WEIGHT_MSK GENMASK(27, 24)
 #define B_CFO_COMP_VAL_MSK GENMASK(11, 0)
+#define R_TSSI_PA_K1 0x5600
+#define R_TSSI_PA_K2 0x5604
+#define R_P0_TSSI_ALIM1 0x5630
+#define B_P0_TSSI_ALIM1 GENMASK(29, 0)
+#define B_P0_TSSI_ALIM11 GENMASK(29, 20)
+#define B_P0_TSSI_ALIM12 GENMASK(19, 10)
+#define B_P0_TSSI_ALIM13 GENMASK(9, 0)
+#define R_P0_TSSI_ALIM3 0x5634
+#define B_P0_TSSI_ALIM31 GENMASK(9, 0)
+#define R_TSSI_PA_K5 0x5638
+#define R_P0_TSSI_ALIM2 0x563c
+#define B_P0_TSSI_ALIM2 GENMASK(29, 0)
+#define R_P0_TSSI_ALIM4 0x5640
+#define R_TSSI_PA_K8 0x5644
 #define R_UPD_CLK 0x5670
 #define B_DAC_VAL BIT(31)
 #define B_ACK_VAL GENMASK(30, 29)
 #define B_TXPWRB_VAL GENMASK(27, 19)
 #define R_DPD_OFT_EN 0x5800
 #define B_DPD_OFT_EN BIT(28)
+#define B_DPD_TSSI_CW GENMASK(26, 18)
+#define B_DPD_PWR_CW GENMASK(17, 9)
+#define B_DPD_REF GENMASK(8, 0)
+#define R_P0_TSSIC 0x5814
+#define B_P0_TSSIC_BYPASS BIT(11)
 #define R_DPD_OFT_ADDR 0x5804
 #define B_DPD_OFT_ADDR GENMASK(31, 27)
 #define R_TXPWRB_H 0x580c
 #define B_P0_TMETER GENMASK(15, 10)
 #define B_P0_TMETER_DIS BIT(16)
 #define B_P0_TMETER_TRK BIT(24)
+#define R_P1_TSSIC 0x7814
+#define B_P1_TSSIC_BYPASS BIT(11)
 #define R_P0_TSSI_TRK 0x5818
 #define B_P0_TSSI_TRK_EN BIT(30)
+#define B_P0_TSSI_RFC GENMASK(28, 27)
 #define B_P0_TSSI_OFT_EN BIT(28)
 #define B_P0_TSSI_OFT GENMASK(7, 0)
 #define R_P0_TSSI_AVG 0x5820
+#define B_P0_TSSI_EN BIT(31)
 #define B_P0_TSSI_AVG GENMASK(15, 12)
 #define R_P0_RFCTM 0x5864
+#define B_P0_RFCTM_EN BIT(29)
 #define B_P0_RFCTM_VAL GENMASK(25, 20)
 #define R_P0_RFCTM_RDY BIT(26)
 #define R_P0_TRSW 0x5868
 #define B_P0_RFM_TX_OPT BIT(6)
 #define B_P0_RFM_BT_EN BIT(5)
 #define B_P0_RFM_OUT GENMASK(4, 0)
+#define R_P0_PATH_RST 0x58AC
 #define R_P0_TXDPD 0x58D4
 #define B_P0_TXDPD GENMASK(31, 28)
 #define R_P0_TXPW_RSTB 0x58DC
 #define B_P0_TXPW_RSTB_MANON BIT(30)
 #define B_P0_TXPW_RSTB_TSSI BIT(31)
 #define R_P0_TSSI_MV_AVG 0x58E4
+#define B_P0_TSSI_MV_MIX GENMASK(19, 11)
 #define B_P0_TSSI_MV_AVG GENMASK(13, 11)
+#define B_P0_TSSI_MV_CLR BIT(14)
 #define R_TXGAIN_SCALE 0x58F0
 #define B_TXGAIN_SCALE_EN BIT(19)
 #define B_TXGAIN_SCALE_OFT GENMASK(31, 24)
 #define B_S0_DACKQ8_K GENMASK(15, 8)
 #define R_RPL_BIAS_COMP1 0x6DF0
 #define B_RPL_BIAS_COMP1_MASK GENMASK(7, 0)
+#define R_P1_TSSI_ALIM1 0x7630
+#define B_P1_TSSI_ALIM1 GENMASK(29, 0)
+#define B_P1_TSSI_ALIM11 GENMASK(29, 20)
+#define B_P1_TSSI_ALIM12 GENMASK(19, 10)
+#define B_P1_TSSI_ALIM13 GENMASK(9, 0)
+#define R_P1_TSSI_ALIM3 0x7634
+#define B_P1_TSSI_ALIM31 GENMASK(9, 0)
+#define R_P1_TSSI_ALIM2 0x763c
+#define B_P1_TSSI_ALIM2 GENMASK(29, 0)
+#define R_P1_TSSIC 0x7814
+#define B_P1_TSSIC_BYPASS BIT(11)
 #define R_P1_TMETER 0x7810
 #define B_P1_TMETER GENMASK(15, 10)
 #define B_P1_TMETER_DIS BIT(16)
 #define B_P1_TMETER_TRK BIT(24)
 #define R_P1_TSSI_TRK 0x7818
 #define B_P1_TSSI_TRK_EN BIT(30)
+#define B_P1_TSSI_RFC GENMASK(28, 27)
 #define B_P1_TSSI_OFT_EN BIT(28)
 #define B_P1_TSSI_OFT GENMASK(7, 0)
 #define R_P1_TSSI_AVG 0x7820
+#define B_P1_TSSI_EN BIT(31)
 #define B_P1_TSSI_AVG GENMASK(15, 12)
 #define R_P1_RFCTM 0x7864
 #define R_P1_RFCTM_RDY BIT(26)
 #define B_P1_RFCTM_VAL GENMASK(25, 20)
+#define B_P1_RFCTM_DEL GENMASK(19, 11)
+#define R_P1_PATH_RST 0x78AC
 #define R_P1_TXPW_RSTB 0x78DC
 #define B_P1_TXPW_RSTB_MANON BIT(30)
 #define B_P1_TXPW_RSTB_TSSI BIT(31)
 #define R_P1_TSSI_MV_AVG 0x78E4
+#define B_P1_TSSI_MV_MIX GENMASK(19, 11)
 #define B_P1_TSSI_MV_AVG GENMASK(13, 11)
+#define B_P1_TSSI_MV_CLR BIT(14)
 #define R_TSSI_THOF 0x7C00
 #define R_S1_DACKI 0x7E00
 #define B_S1_DACKI_AR GENMASK(31, 28)
 #define B_KPATH_CFG_ED GENMASK(21, 20)
 #define R_KIP_RPT1 0x80D4
 #define B_KIP_RPT1_SEL GENMASK(21, 16)
+#define B_KIP_RPT1_SEL_V1 GENMASK(19, 16)
 #define R_SRAM_IQRX 0x80D8
 #define R_GAPK 0x80E0
 #define B_GAPK_ADR BIT(0)
 #define B_PRT_COM_GL GENMASK(7, 4)
 #define B_PRT_COM_CORI GENMASK(7, 0)
 #define B_PRT_COM_RXBB GENMASK(5, 0)
+#define B_PRT_COM_RXBB_V1 GENMASK(4, 0)
 #define B_PRT_COM_DONE BIT(0)
 #define R_COEF_SEL 0x8104
 #define B_COEF_SEL_IQC BIT(0)
 #define B_COEF_SEL_MDPD BIT(8)
 #define R_CFIR_SYS 0x8120
 #define R_IQK_RES 0x8124
+#define B_IQK_RES_K BIT(28)
 #define B_IQK_RES_TXCFIR GENMASK(11, 8)
 #define B_IQK_RES_RXCFIR GENMASK(3, 0)
 #define R_TXIQC 0x8138
 #define B_DPD_LBK BIT(7)
 #define R_DPD_CH0 0x81AC
 #define R_DPD_BND 0x81B4
+#define B_DPD_BND_1 GENMASK(24, 16)
+#define B_DPD_BND_0 GENMASK(8, 0)
 #define R_DPD_CH0A 0x81BC
 #define B_DPD_MEN GENMASK(31, 28)
 #define B_DPD_ORDER GENMASK(26, 24)
+#define B_DPD_ORDER_V1 GENMASK(26, 25)
+#define B_DPD_CFG GENMASK(22, 0)
 #define B_DPD_SEL GENMASK(13, 8)
 #define R_TXAGC_RFK 0x81C4
 #define B_TXAGC_RFK_CH0 GENMASK(5, 0)
 #define R_DPD_COM 0x81C8
+#define B_DPD_COM_OF BIT(15)
 #define R_KIP_IQP 0x81CC
 #define B_KIP_IQP_SW GENMASK(13, 12)
 #define B_KIP_IQP_IQSW GENMASK(5, 0)
 #define B_RPT_PER_TSSI GENMASK(28, 16)
 #define B_RPT_PER_OF GENMASK(15, 8)
 #define B_RPT_PER_TH GENMASK(5, 0)
+#define R_IQRSN 0x8220
+#define B_IQRSN_K1 BIT(28)
+#define B_IQRSN_K2 BIT(16)
 #define R_RXCFIR_P0C0 0x8D40
 #define R_RXCFIR_P0C1 0x8D84
 #define R_RXCFIR_P0C2 0x8DC8
 #define B_DACK_S0P3_OK BIT(2)
 #define R_DACK_DADCK01 0xC084
 #define B_DACK_DADCK01 GENMASK(31, 24)
+#define R_DRCK_FH 0xC094
+#define B_DRCK_LAT BIT(9)
 #define R_DRCK 0xC0C4
 #define B_DRCK_IDLE BIT(9)
 #define B_DRCK_EN BIT(6)
 #define R_DRCK_RES 0xC0C8
 #define B_DRCK_RES GENMASK(19, 15)
 #define B_DRCK_POL BIT(3)
+#define R_DRCK_V1 0xC0CC
+#define B_DRCK_V1_SEL BIT(9)
+#define B_DRCK_V1_KICK BIT(6)
+#define B_DRCK_V1_CV GENMASK(4, 0)
+#define R_DRCK_RS 0xC0D0
+#define B_DRCK_RS_LPS GENMASK(19, 15)
+#define B_DRCK_RS_DONE BIT(3)
 #define R_PATH0_SAMPL_DLY_T_V1 0xC0D4
 #define B_PATH0_SAMPL_DLY_T_MSK_V1 GENMASK(27, 26)
 #define R_P0_CFCH_BW0 0xC0D4
 #define B_P0_CFCH_BW0 GENMASK(27, 26)
 #define R_P0_CFCH_BW1 0xC0D8
+#define B_P0_CFCH_EX BIT(13)
 #define B_P0_CFCH_BW1 GENMASK(8, 5)
+#define R_ADDCK0D 0xC0F0
+#define B_ADDCK0D_VAL2 GENMASK(31, 26)
+#define B_ADDCK0D_VAL GENMASK(25, 16)
 #define R_ADDCK0 0xC0F4
+#define B_ADDCK0_TRG BIT(11)
 #define B_ADDCK0 GENMASK(9, 8)
+#define B_ADDCK0_MAN GENMASK(5, 4)
 #define B_ADDCK0_EN BIT(4)
+#define B_ADDCK0_VAL GENMASK(3, 0)
 #define B_ADDCK0_RST BIT(2)
 #define R_ADDCK0_RL 0xC0F8
 #define B_ADDCK0_RLS GENMASK(29, 28)
 #define R_PATH0_BW_SEL_V1 0xC0D8
 #define B_PATH0_BW_SEL_MSK_V1 GENMASK(8, 5)
 #define R_PATH1_BW_SEL_V1 0xC1D8
+#define B_PATH1_BW_SEL_EX BIT(13)
 #define B_PATH1_BW_SEL_MSK_V1 GENMASK(8, 5)
+#define R_ADDCK1D 0xC1F0
+#define B_ADDCK1D_VAL2 GENMASK(31, 26)
+#define B_ADDCK1D_VAL GENMASK(25, 16)
 #define R_ADDCK1 0xC1F4
+#define B_ADDCK1_TRG BIT(11)
 #define B_ADDCK1 GENMASK(9, 8)
+#define B_ADDCK1_MAN GENMASK(5, 4)
 #define B_ADDCK1_EN BIT(4)
 #define B_ADDCK1_RST BIT(2)
 #define R_ADDCK1_RL 0xC1F8
index 78414768035356bde880c2dfd44414b6fe467382..b5aa8697a0982d30b011240e46766397e2fc12c2 100644 (file)
@@ -1410,151 +1410,14 @@ static void rtw8852a_set_txpwr_ref(struct rtw89_dev *rtwdev,
                                      phy_idx);
 }
 
-static void rtw8852a_set_txpwr_byrate(struct rtw89_dev *rtwdev,
-                                     const struct rtw89_chan *chan,
-                                     enum rtw89_phy_idx phy_idx)
-{
-       u8 band = chan->band_type;
-       u8 ch = chan->channel;
-       static const u8 rs[] = {
-               RTW89_RS_CCK,
-               RTW89_RS_OFDM,
-               RTW89_RS_MCS,
-               RTW89_RS_HEDCM,
-       };
-       s8 tmp;
-       u8 i, j;
-       u32 val, shf, addr = R_AX_PWR_BY_RATE;
-       struct rtw89_rate_desc cur;
-
-       rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
-                   "[TXPWR] set txpwr byrate with ch=%d\n", ch);
-
-       for (cur.nss = 0; cur.nss <= RTW89_NSS_2; cur.nss++) {
-               for (i = 0; i < ARRAY_SIZE(rs); i++) {
-                       if (cur.nss >= rtw89_rs_nss_max[rs[i]])
-                               continue;
-
-                       val = 0;
-                       cur.rs = rs[i];
-
-                       for (j = 0; j < rtw89_rs_idx_max[rs[i]]; j++) {
-                               cur.idx = j;
-                               shf = (j % 4) * 8;
-                               tmp = rtw89_phy_read_txpwr_byrate(rtwdev, band,
-                                                                 &cur);
-                               val |= (tmp << shf);
-
-                               if ((j + 1) % 4)
-                                       continue;
-
-                               rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val);
-                               val = 0;
-                               addr += 4;
-                       }
-               }
-       }
-}
-
-static void rtw8852a_set_txpwr_offset(struct rtw89_dev *rtwdev,
-                                     const struct rtw89_chan *chan,
-                                     enum rtw89_phy_idx phy_idx)
-{
-       u8 band = chan->band_type;
-       struct rtw89_rate_desc desc = {
-               .nss = RTW89_NSS_1,
-               .rs = RTW89_RS_OFFSET,
-       };
-       u32 val = 0;
-       s8 v;
-
-       rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set txpwr offset\n");
-
-       for (desc.idx = 0; desc.idx < RTW89_RATE_OFFSET_MAX; desc.idx++) {
-               v = rtw89_phy_read_txpwr_byrate(rtwdev, band, &desc);
-               val |= ((v & 0xf) << (4 * desc.idx));
-       }
-
-       rtw89_mac_txpwr_write32_mask(rtwdev, phy_idx, R_AX_PWR_RATE_OFST_CTRL,
-                                    GENMASK(19, 0), val);
-}
-
-static void rtw8852a_set_txpwr_limit(struct rtw89_dev *rtwdev,
-                                    const struct rtw89_chan *chan,
-                                    enum rtw89_phy_idx phy_idx)
-{
-#define __MAC_TXPWR_LMT_PAGE_SIZE 40
-       u8 ch = chan->channel;
-       u8 bw = chan->band_width;
-       struct rtw89_txpwr_limit lmt[NTX_NUM_8852A];
-       u32 addr, val;
-       const s8 *ptr;
-       u8 i, j;
-
-       rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
-                   "[TXPWR] set txpwr limit with ch=%d bw=%d\n", ch, bw);
-
-       for (i = 0; i < NTX_NUM_8852A; i++) {
-               rtw89_phy_fill_txpwr_limit(rtwdev, chan, &lmt[i], i);
-
-               for (j = 0; j < __MAC_TXPWR_LMT_PAGE_SIZE; j += 4) {
-                       addr = R_AX_PWR_LMT + j + __MAC_TXPWR_LMT_PAGE_SIZE * i;
-                       ptr = (s8 *)&lmt[i] + j;
-
-                       val = FIELD_PREP(GENMASK(7, 0), ptr[0]) |
-                             FIELD_PREP(GENMASK(15, 8), ptr[1]) |
-                             FIELD_PREP(GENMASK(23, 16), ptr[2]) |
-                             FIELD_PREP(GENMASK(31, 24), ptr[3]);
-
-                       rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val);
-               }
-       }
-#undef __MAC_TXPWR_LMT_PAGE_SIZE
-}
-
-static void rtw8852a_set_txpwr_limit_ru(struct rtw89_dev *rtwdev,
-                                       const struct rtw89_chan *chan,
-                                       enum rtw89_phy_idx phy_idx)
-{
-#define __MAC_TXPWR_LMT_RU_PAGE_SIZE 24
-       u8 ch = chan->channel;
-       u8 bw = chan->band_width;
-       struct rtw89_txpwr_limit_ru lmt_ru[NTX_NUM_8852A];
-       u32 addr, val;
-       const s8 *ptr;
-       u8 i, j;
-
-       rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
-                   "[TXPWR] set txpwr limit ru with ch=%d bw=%d\n", ch, bw);
-
-       for (i = 0; i < NTX_NUM_8852A; i++) {
-               rtw89_phy_fill_txpwr_limit_ru(rtwdev, chan, &lmt_ru[i], i);
-
-               for (j = 0; j < __MAC_TXPWR_LMT_RU_PAGE_SIZE; j += 4) {
-                       addr = R_AX_PWR_RU_LMT + j +
-                              __MAC_TXPWR_LMT_RU_PAGE_SIZE * i;
-                       ptr = (s8 *)&lmt_ru[i] + j;
-
-                       val = FIELD_PREP(GENMASK(7, 0), ptr[0]) |
-                             FIELD_PREP(GENMASK(15, 8), ptr[1]) |
-                             FIELD_PREP(GENMASK(23, 16), ptr[2]) |
-                             FIELD_PREP(GENMASK(31, 24), ptr[3]);
-
-                       rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val);
-               }
-       }
-
-#undef __MAC_TXPWR_LMT_RU_PAGE_SIZE
-}
-
 static void rtw8852a_set_txpwr(struct rtw89_dev *rtwdev,
                               const struct rtw89_chan *chan,
                               enum rtw89_phy_idx phy_idx)
 {
-       rtw8852a_set_txpwr_byrate(rtwdev, chan, phy_idx);
-       rtw8852a_set_txpwr_offset(rtwdev, chan, phy_idx);
-       rtw8852a_set_txpwr_limit(rtwdev, chan, phy_idx);
-       rtw8852a_set_txpwr_limit_ru(rtwdev, chan, phy_idx);
+       rtw89_phy_set_txpwr_byrate(rtwdev, chan, phy_idx);
+       rtw89_phy_set_txpwr_offset(rtwdev, chan, phy_idx);
+       rtw89_phy_set_txpwr_limit(rtwdev, chan, phy_idx);
+       rtw89_phy_set_txpwr_limit_ru(rtwdev, chan, phy_idx);
 }
 
 static void rtw8852a_set_txpwr_ctrl(struct rtw89_dev *rtwdev,
@@ -2007,19 +1870,6 @@ static struct rtw89_btc_fbtc_mreg rtw89_btc_8852a_mon_reg[] = {
        RTW89_DEF_FBTC_MREG(REG_BT_MODEM, 4, 0x178),
 };
 
-static
-void rtw8852a_btc_bt_aci_imp(struct rtw89_dev *rtwdev)
-{
-       struct rtw89_btc *btc = &rtwdev->btc;
-       struct rtw89_btc_dm *dm = &btc->dm;
-       struct rtw89_btc_bt_info *bt = &btc->cx.bt;
-       struct rtw89_btc_bt_link_info *b = &bt->link_info;
-
-       /* fix LNA2 = level-5 for BT ACI issue at BTG */
-       if (btc->dm.wl_btg_rx && b->profile_cnt.now != 0)
-               dm->trx_para_level = 1;
-}
-
 static
 void rtw8852a_btc_update_bt_cnt(struct rtw89_dev *rtwdev)
 {
@@ -2178,7 +2028,6 @@ static const struct rtw89_chip_ops rtw8852a_chip_ops = {
        .btc_set_wl_pri         = rtw8852a_btc_set_wl_pri,
        .btc_set_wl_txpwr_ctrl  = rtw8852a_btc_set_wl_txpwr_ctrl,
        .btc_get_bt_rssi        = rtw8852a_btc_get_bt_rssi,
-       .btc_bt_aci_imp         = rtw8852a_btc_bt_aci_imp,
        .btc_update_bt_cnt      = rtw8852a_btc_update_bt_cnt,
        .btc_wl_s1_standby      = rtw8852a_btc_wl_s1_standby,
        .btc_set_wl_rx_gain     = rtw8852a_btc_set_wl_rx_gain,
index fcff1194c0096d3bcfec643610ae1ff139292a0b..ea82fed7b7bec1c7a84e802841262b6e0abeecf7 100644 (file)
@@ -8,7 +8,6 @@
 #include "core.h"
 
 #define RF_PATH_NUM_8852A 2
-#define NTX_NUM_8852A 2
 
 enum rtw8852a_pmac_mode {
        NONE_TEST,
index 9f9908418ee4e3e296d6e6f99c4401f49670e3b0..0df044b1c392a161c3604633987792ffe5dd1c69 100644 (file)
@@ -2,9 +2,46 @@
 /* Copyright(c) 2019-2022  Realtek Corporation
  */
 
-#include "core.h"
+#include "coex.h"
+#include "fw.h"
 #include "mac.h"
+#include "phy.h"
 #include "reg.h"
+#include "rtw8852b.h"
+#include "rtw8852b_rfk.h"
+#include "rtw8852b_table.h"
+#include "txrx.h"
+
+static const struct rtw89_hfc_ch_cfg rtw8852b_hfc_chcfg_pcie[] = {
+       {5, 343, grp_0}, /* ACH 0 */
+       {5, 343, grp_0}, /* ACH 1 */
+       {5, 343, grp_0}, /* ACH 2 */
+       {5, 343, grp_0}, /* ACH 3 */
+       {0, 0, grp_0}, /* ACH 4 */
+       {0, 0, grp_0}, /* ACH 5 */
+       {0, 0, grp_0}, /* ACH 6 */
+       {0, 0, grp_0}, /* ACH 7 */
+       {4, 344, grp_0}, /* B0MGQ */
+       {4, 344, grp_0}, /* B0HIQ */
+       {0, 0, grp_0}, /* B1MGQ */
+       {0, 0, grp_0}, /* B1HIQ */
+       {40, 0, 0} /* FWCMDQ */
+};
+
+static const struct rtw89_hfc_pub_cfg rtw8852b_hfc_pubcfg_pcie = {
+       448, /* Group 0 */
+       0, /* Group 1 */
+       448, /* Public Max */
+       0 /* WP threshold */
+};
+
+static const struct rtw89_hfc_param_ini rtw8852b_hfc_param_ini_pcie[] = {
+       [RTW89_QTA_SCC] = {rtw8852b_hfc_chcfg_pcie, &rtw8852b_hfc_pubcfg_pcie,
+                          &rtw89_mac_size.hfc_preccfg_pcie, RTW89_HCIFC_POH},
+       [RTW89_QTA_DLFW] = {NULL, NULL, &rtw89_mac_size.hfc_preccfg_pcie,
+                           RTW89_HCIFC_POH},
+       [RTW89_QTA_INVALID] = {NULL},
+};
 
 static const struct rtw89_dle_mem rtw8852b_dle_mem_pcie[] = {
        [RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size6,
@@ -19,6 +56,2268 @@ static const struct rtw89_dle_mem rtw8852b_dle_mem_pcie[] = {
                               NULL},
 };
 
+static const struct rtw89_reg3_def rtw8852b_pmac_ht20_mcs7_tbl[] = {
+       {0x4580, 0x0000ffff, 0x0},
+       {0x4580, 0xffff0000, 0x0},
+       {0x4584, 0x0000ffff, 0x0},
+       {0x4584, 0xffff0000, 0x0},
+       {0x4580, 0x0000ffff, 0x1},
+       {0x4578, 0x00ffffff, 0x2018b},
+       {0x4570, 0x03ffffff, 0x7},
+       {0x4574, 0x03ffffff, 0x32407},
+       {0x45b8, 0x00000010, 0x0},
+       {0x45b8, 0x00000100, 0x0},
+       {0x45b8, 0x00000080, 0x0},
+       {0x45b8, 0x00000008, 0x0},
+       {0x45a0, 0x0000ff00, 0x0},
+       {0x45a0, 0xff000000, 0x1},
+       {0x45a4, 0x0000ff00, 0x2},
+       {0x45a4, 0xff000000, 0x3},
+       {0x45b8, 0x00000020, 0x0},
+       {0x4568, 0xe0000000, 0x0},
+       {0x45b8, 0x00000002, 0x1},
+       {0x456c, 0xe0000000, 0x0},
+       {0x45b4, 0x00006000, 0x0},
+       {0x45b4, 0x00001800, 0x1},
+       {0x45b8, 0x00000040, 0x0},
+       {0x45b8, 0x00000004, 0x0},
+       {0x45b8, 0x00000200, 0x0},
+       {0x4598, 0xf8000000, 0x0},
+       {0x45b8, 0x00100000, 0x0},
+       {0x45a8, 0x00000fc0, 0x0},
+       {0x45b8, 0x00200000, 0x0},
+       {0x45b0, 0x00000038, 0x0},
+       {0x45b0, 0x000001c0, 0x0},
+       {0x45a0, 0x000000ff, 0x0},
+       {0x45b8, 0x00400000, 0x0},
+       {0x4590, 0x000007ff, 0x0},
+       {0x45b0, 0x00000e00, 0x0},
+       {0x45ac, 0x0000001f, 0x0},
+       {0x45b8, 0x00800000, 0x0},
+       {0x45a8, 0x0003f000, 0x0},
+       {0x45b8, 0x01000000, 0x0},
+       {0x45b0, 0x00007000, 0x0},
+       {0x45b0, 0x00038000, 0x0},
+       {0x45a0, 0x00ff0000, 0x0},
+       {0x45b8, 0x02000000, 0x0},
+       {0x4590, 0x003ff800, 0x0},
+       {0x45b0, 0x001c0000, 0x0},
+       {0x45ac, 0x000003e0, 0x0},
+       {0x45b8, 0x04000000, 0x0},
+       {0x45a8, 0x00fc0000, 0x0},
+       {0x45b8, 0x08000000, 0x0},
+       {0x45b0, 0x00e00000, 0x0},
+       {0x45b0, 0x07000000, 0x0},
+       {0x45a4, 0x000000ff, 0x0},
+       {0x45b8, 0x10000000, 0x0},
+       {0x4594, 0x000007ff, 0x0},
+       {0x45b0, 0x38000000, 0x0},
+       {0x45ac, 0x00007c00, 0x0},
+       {0x45b8, 0x20000000, 0x0},
+       {0x45a8, 0x3f000000, 0x0},
+       {0x45b8, 0x40000000, 0x0},
+       {0x45b4, 0x00000007, 0x0},
+       {0x45b4, 0x00000038, 0x0},
+       {0x45a4, 0x00ff0000, 0x0},
+       {0x45b8, 0x80000000, 0x0},
+       {0x4594, 0x003ff800, 0x0},
+       {0x45b4, 0x000001c0, 0x0},
+       {0x4598, 0xf8000000, 0x0},
+       {0x45b8, 0x00100000, 0x0},
+       {0x45a8, 0x00000fc0, 0x7},
+       {0x45b8, 0x00200000, 0x0},
+       {0x45b0, 0x00000038, 0x0},
+       {0x45b0, 0x000001c0, 0x0},
+       {0x45a0, 0x000000ff, 0x0},
+       {0x45b4, 0x06000000, 0x0},
+       {0x45b0, 0x00000007, 0x0},
+       {0x45b8, 0x00080000, 0x0},
+       {0x45a8, 0x0000003f, 0x0},
+       {0x457c, 0xffe00000, 0x1},
+       {0x4530, 0xffffffff, 0x0},
+       {0x4588, 0x00003fff, 0x0},
+       {0x4598, 0x000001ff, 0x0},
+       {0x4534, 0xffffffff, 0x0},
+       {0x4538, 0xffffffff, 0x0},
+       {0x453c, 0xffffffff, 0x0},
+       {0x4588, 0x0fffc000, 0x0},
+       {0x4598, 0x0003fe00, 0x0},
+       {0x4540, 0xffffffff, 0x0},
+       {0x4544, 0xffffffff, 0x0},
+       {0x4548, 0xffffffff, 0x0},
+       {0x458c, 0x00003fff, 0x0},
+       {0x4598, 0x07fc0000, 0x0},
+       {0x454c, 0xffffffff, 0x0},
+       {0x4550, 0xffffffff, 0x0},
+       {0x4554, 0xffffffff, 0x0},
+       {0x458c, 0x0fffc000, 0x0},
+       {0x459c, 0x000001ff, 0x0},
+       {0x4558, 0xffffffff, 0x0},
+       {0x455c, 0xffffffff, 0x0},
+       {0x4530, 0xffffffff, 0x4e790001},
+       {0x4588, 0x00003fff, 0x0},
+       {0x4598, 0x000001ff, 0x1},
+       {0x4534, 0xffffffff, 0x0},
+       {0x4538, 0xffffffff, 0x4b},
+       {0x45ac, 0x38000000, 0x7},
+       {0x4588, 0xf0000000, 0x0},
+       {0x459c, 0x7e000000, 0x0},
+       {0x45b8, 0x00040000, 0x0},
+       {0x45b8, 0x00020000, 0x0},
+       {0x4590, 0xffc00000, 0x0},
+       {0x45b8, 0x00004000, 0x0},
+       {0x4578, 0xff000000, 0x0},
+       {0x45b8, 0x00000400, 0x0},
+       {0x45b8, 0x00000800, 0x0},
+       {0x45b8, 0x00001000, 0x0},
+       {0x45b8, 0x00002000, 0x0},
+       {0x45b4, 0x00018000, 0x0},
+       {0x45ac, 0x07800000, 0x0},
+       {0x45b4, 0x00000600, 0x2},
+       {0x459c, 0x0001fe00, 0x80},
+       {0x45ac, 0x00078000, 0x3},
+       {0x459c, 0x01fe0000, 0x1},
+};
+
+static const struct rtw89_reg3_def rtw8852b_btc_preagc_en_defs[] = {
+       {0x46D0, GENMASK(1, 0), 0x3},
+       {0x4790, GENMASK(1, 0), 0x3},
+       {0x4AD4, GENMASK(31, 0), 0xf},
+       {0x4AE0, GENMASK(31, 0), 0xf},
+       {0x4688, GENMASK(31, 24), 0x80},
+       {0x476C, GENMASK(31, 24), 0x80},
+       {0x4694, GENMASK(7, 0), 0x80},
+       {0x4694, GENMASK(15, 8), 0x80},
+       {0x4778, GENMASK(7, 0), 0x80},
+       {0x4778, GENMASK(15, 8), 0x80},
+       {0x4AE4, GENMASK(23, 0), 0x780D1E},
+       {0x4AEC, GENMASK(23, 0), 0x780D1E},
+       {0x469C, GENMASK(31, 26), 0x34},
+       {0x49F0, GENMASK(31, 26), 0x34},
+};
+
+static DECLARE_PHY_REG3_TBL(rtw8852b_btc_preagc_en_defs);
+
+static const struct rtw89_reg3_def rtw8852b_btc_preagc_dis_defs[] = {
+       {0x46D0, GENMASK(1, 0), 0x0},
+       {0x4790, GENMASK(1, 0), 0x0},
+       {0x4AD4, GENMASK(31, 0), 0x60},
+       {0x4AE0, GENMASK(31, 0), 0x60},
+       {0x4688, GENMASK(31, 24), 0x1a},
+       {0x476C, GENMASK(31, 24), 0x1a},
+       {0x4694, GENMASK(7, 0), 0x2a},
+       {0x4694, GENMASK(15, 8), 0x2a},
+       {0x4778, GENMASK(7, 0), 0x2a},
+       {0x4778, GENMASK(15, 8), 0x2a},
+       {0x4AE4, GENMASK(23, 0), 0x79E99E},
+       {0x4AEC, GENMASK(23, 0), 0x79E99E},
+       {0x469C, GENMASK(31, 26), 0x26},
+       {0x49F0, GENMASK(31, 26), 0x26},
+};
+
+static DECLARE_PHY_REG3_TBL(rtw8852b_btc_preagc_dis_defs);
+
+static const u32 rtw8852b_h2c_regs[RTW89_H2CREG_MAX] = {
+       R_AX_H2CREG_DATA0, R_AX_H2CREG_DATA1,  R_AX_H2CREG_DATA2,
+       R_AX_H2CREG_DATA3
+};
+
+static const u32 rtw8852b_c2h_regs[RTW89_C2HREG_MAX] = {
+       R_AX_C2HREG_DATA0, R_AX_C2HREG_DATA1, R_AX_C2HREG_DATA2,
+       R_AX_C2HREG_DATA3
+};
+
+static const struct rtw89_page_regs rtw8852b_page_regs = {
+       .hci_fc_ctrl    = R_AX_HCI_FC_CTRL,
+       .ch_page_ctrl   = R_AX_CH_PAGE_CTRL,
+       .ach_page_ctrl  = R_AX_ACH0_PAGE_CTRL,
+       .ach_page_info  = R_AX_ACH0_PAGE_INFO,
+       .pub_page_info3 = R_AX_PUB_PAGE_INFO3,
+       .pub_page_ctrl1 = R_AX_PUB_PAGE_CTRL1,
+       .pub_page_ctrl2 = R_AX_PUB_PAGE_CTRL2,
+       .pub_page_info1 = R_AX_PUB_PAGE_INFO1,
+       .pub_page_info2 = R_AX_PUB_PAGE_INFO2,
+       .wp_page_ctrl1  = R_AX_WP_PAGE_CTRL1,
+       .wp_page_ctrl2  = R_AX_WP_PAGE_CTRL2,
+       .wp_page_info1  = R_AX_WP_PAGE_INFO1,
+};
+
+static const struct rtw89_reg_def rtw8852b_dcfo_comp = {
+       R_DCFO_COMP_S0, B_DCFO_COMP_S0_MSK
+};
+
+static const struct rtw89_imr_info rtw8852b_imr_info = {
+       .wdrls_imr_set          = B_AX_WDRLS_IMR_SET,
+       .wsec_imr_reg           = R_AX_SEC_DEBUG,
+       .wsec_imr_set           = B_AX_IMR_ERROR,
+       .mpdu_tx_imr_set        = 0,
+       .mpdu_rx_imr_set        = 0,
+       .sta_sch_imr_set        = B_AX_STA_SCHEDULER_IMR_SET,
+       .txpktctl_imr_b0_reg    = R_AX_TXPKTCTL_ERR_IMR_ISR,
+       .txpktctl_imr_b0_clr    = B_AX_TXPKTCTL_IMR_B0_CLR,
+       .txpktctl_imr_b0_set    = B_AX_TXPKTCTL_IMR_B0_SET,
+       .txpktctl_imr_b1_reg    = R_AX_TXPKTCTL_ERR_IMR_ISR_B1,
+       .txpktctl_imr_b1_clr    = B_AX_TXPKTCTL_IMR_B1_CLR,
+       .txpktctl_imr_b1_set    = B_AX_TXPKTCTL_IMR_B1_SET,
+       .wde_imr_clr            = B_AX_WDE_IMR_CLR,
+       .wde_imr_set            = B_AX_WDE_IMR_SET,
+       .ple_imr_clr            = B_AX_PLE_IMR_CLR,
+       .ple_imr_set            = B_AX_PLE_IMR_SET,
+       .host_disp_imr_clr      = B_AX_HOST_DISP_IMR_CLR,
+       .host_disp_imr_set      = B_AX_HOST_DISP_IMR_SET,
+       .cpu_disp_imr_clr       = B_AX_CPU_DISP_IMR_CLR,
+       .cpu_disp_imr_set       = B_AX_CPU_DISP_IMR_SET,
+       .other_disp_imr_clr     = B_AX_OTHER_DISP_IMR_CLR,
+       .other_disp_imr_set     = 0,
+       .bbrpt_com_err_imr_reg  = R_AX_BBRPT_COM_ERR_IMR_ISR,
+       .bbrpt_chinfo_err_imr_reg = R_AX_BBRPT_CHINFO_ERR_IMR_ISR,
+       .bbrpt_err_imr_set      = 0,
+       .bbrpt_dfs_err_imr_reg  = R_AX_BBRPT_DFS_ERR_IMR_ISR,
+       .ptcl_imr_clr           = B_AX_PTCL_IMR_CLR_ALL,
+       .ptcl_imr_set           = B_AX_PTCL_IMR_SET,
+       .cdma_imr_0_reg         = R_AX_DLE_CTRL,
+       .cdma_imr_0_clr         = B_AX_DLE_IMR_CLR,
+       .cdma_imr_0_set         = B_AX_DLE_IMR_SET,
+       .cdma_imr_1_reg         = 0,
+       .cdma_imr_1_clr         = 0,
+       .cdma_imr_1_set         = 0,
+       .phy_intf_imr_reg       = R_AX_PHYINFO_ERR_IMR,
+       .phy_intf_imr_clr       = 0,
+       .phy_intf_imr_set       = 0,
+       .rmac_imr_reg           = R_AX_RMAC_ERR_ISR,
+       .rmac_imr_clr           = B_AX_RMAC_IMR_CLR,
+       .rmac_imr_set           = B_AX_RMAC_IMR_SET,
+       .tmac_imr_reg           = R_AX_TMAC_ERR_IMR_ISR,
+       .tmac_imr_clr           = B_AX_TMAC_IMR_CLR,
+       .tmac_imr_set           = B_AX_TMAC_IMR_SET,
+};
+
+static const struct rtw89_rrsr_cfgs rtw8852b_rrsr_cfgs = {
+       .ref_rate = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_REF_RATE_SEL, 0},
+       .rsc = {R_AX_TRXPTCL_RRSR_CTL_0, B_AX_WMAC_RESP_RSC_MASK, 2},
+};
+
+static const struct rtw89_dig_regs rtw8852b_dig_regs = {
+       .seg0_pd_reg = R_SEG0R_PD_V1,
+       .pd_lower_bound_mask = B_SEG0R_PD_LOWER_BOUND_MSK,
+       .pd_spatial_reuse_en = B_SEG0R_PD_SPATIAL_REUSE_EN_MSK_V1,
+       .p0_lna_init = {R_PATH0_LNA_INIT_V1, B_PATH0_LNA_INIT_IDX_MSK},
+       .p1_lna_init = {R_PATH1_LNA_INIT_V1, B_PATH1_LNA_INIT_IDX_MSK},
+       .p0_tia_init = {R_PATH0_TIA_INIT_V1, B_PATH0_TIA_INIT_IDX_MSK_V1},
+       .p1_tia_init = {R_PATH1_TIA_INIT_V1, B_PATH1_TIA_INIT_IDX_MSK_V1},
+       .p0_rxb_init = {R_PATH0_RXB_INIT_V1, B_PATH0_RXB_INIT_IDX_MSK_V1},
+       .p1_rxb_init = {R_PATH1_RXB_INIT_V1, B_PATH1_RXB_INIT_IDX_MSK_V1},
+       .p0_p20_pagcugc_en = {R_PATH0_P20_FOLLOW_BY_PAGCUGC_V2,
+                             B_PATH0_P20_FOLLOW_BY_PAGCUGC_EN_MSK},
+       .p0_s20_pagcugc_en = {R_PATH0_S20_FOLLOW_BY_PAGCUGC_V2,
+                             B_PATH0_S20_FOLLOW_BY_PAGCUGC_EN_MSK},
+       .p1_p20_pagcugc_en = {R_PATH1_P20_FOLLOW_BY_PAGCUGC_V2,
+                             B_PATH1_P20_FOLLOW_BY_PAGCUGC_EN_MSK},
+       .p1_s20_pagcugc_en = {R_PATH1_S20_FOLLOW_BY_PAGCUGC_V2,
+                             B_PATH1_S20_FOLLOW_BY_PAGCUGC_EN_MSK},
+};
+
+static const struct rtw89_btc_rf_trx_para rtw89_btc_8852b_rf_ul[] = {
+       {15, 0, 0, 7}, /* 0 -> original */
+       {15, 2, 0, 7}, /* 1 -> for BT-connected ACI issue && BTG co-rx */
+       {15, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
+       {15, 0, 0, 7}, /* 3- >reserved for shared-antenna */
+       {15, 0, 0, 7}, /* 4 ->reserved for shared-antenna */
+       {15, 0, 0, 7}, /* the below id is for non-shared-antenna free-run */
+       {6, 1, 0, 7},
+       {13, 1, 0, 7},
+       {13, 1, 0, 7}
+};
+
+static const struct rtw89_btc_rf_trx_para rtw89_btc_8852b_rf_dl[] = {
+       {15, 0, 0, 7}, /* 0 -> original */
+       {15, 2, 0, 7}, /* 1 -> reserved for shared-antenna */
+       {15, 0, 0, 7}, /* 2 ->reserved for shared-antenna */
+       {15, 0, 0, 7}, /* 3- >reserved for shared-antenna */
+       {15, 0, 0, 7}, /* 4 ->reserved for shared-antenna */
+       {15, 0, 0, 7}, /* the below id is for non-shared-antenna free-run */
+       {15, 1, 0, 7},
+       {15, 1, 0, 7},
+       {15, 1, 0, 7}
+};
+
+static const struct rtw89_btc_fbtc_mreg rtw89_btc_8852b_mon_reg[] = {
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda24),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda28),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda2c),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda30),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda4c),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda10),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda20),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xda34),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xcef4),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0x8424),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xd200),
+       RTW89_DEF_FBTC_MREG(REG_MAC, 4, 0xd220),
+       RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x980),
+       RTW89_DEF_FBTC_MREG(REG_BT_MODEM, 4, 0x178),
+};
+
+static const u8 rtw89_btc_8852b_wl_rssi_thres[BTC_WL_RSSI_THMAX] = {70, 60, 50, 40};
+static const u8 rtw89_btc_8852b_bt_rssi_thres[BTC_BT_RSSI_THMAX] = {50, 40, 30, 20};
+
+static int rtw8852b_pwr_on_func(struct rtw89_dev *rtwdev)
+{
+       u32 val32;
+       u32 ret;
+
+       rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_AFSM_WLSUS_EN |
+                                                   B_AX_AFSM_PCIE_SUS_EN);
+       rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_DIS_WLBT_PDNSUSEN_SOPC);
+       rtw89_write32_set(rtwdev, R_AX_WLLPS_CTRL, B_AX_DIS_WLBT_LPSEN_LOPC);
+       rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APDM_HPDN);
+       rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+
+       ret = read_poll_timeout(rtw89_read32, val32, val32 & B_AX_RDY_SYSPWR,
+                               1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
+       if (ret)
+               return ret;
+
+       rtw89_write32_set(rtwdev, R_AX_AFE_LDO_CTRL, B_AX_AON_OFF_PC_EN);
+       ret = read_poll_timeout(rtw89_read32, val32, val32 & B_AX_AON_OFF_PC_EN,
+                               1000, 20000, false, rtwdev, R_AX_AFE_LDO_CTRL);
+       if (ret)
+               return ret;
+
+       rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_OFF_CTRL0, B_AX_C1_L1_MASK, 0x1);
+       rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_OFF_CTRL0, B_AX_C3_L1_MASK, 0x3);
+       rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
+       rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFN_ONMAC);
+
+       ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFN_ONMAC),
+                               1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
+       if (ret)
+               return ret;
+
+       rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
+       rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
+       rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
+       rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
+
+       rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
+       rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
+
+       rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3);
+
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL,
+                                     XTAL_SI_GND_SHDN_WL, XTAL_SI_GND_SHDN_WL);
+       if (ret)
+               return ret;
+
+       rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_RFC_1P3);
+
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL,
+                                     XTAL_SI_SHDN_WL, XTAL_SI_SHDN_WL);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_WEI,
+                                     XTAL_SI_OFF_WEI);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_EI,
+                                     XTAL_SI_OFF_EI);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_RFC2RF);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_PON_WEI,
+                                     XTAL_SI_PON_WEI);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_PON_EI,
+                                     XTAL_SI_PON_EI);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_SRAM2RFC);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_SRAM_CTRL, 0, XTAL_SI_SRAM_DIS);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_XMD_2, 0, XTAL_SI_LDO_LPS);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_XMD_4, 0, XTAL_SI_LPS_CAP);
+       if (ret)
+               return ret;
+
+       rtw89_write32_set(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
+       rtw89_write32_set(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_ISO_EB2CORE);
+       rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B15);
+
+       fsleep(1000);
+
+       rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B14);
+       rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
+
+       if (!rtwdev->efuse.valid || rtwdev->efuse.power_k_valid)
+               goto func_en;
+
+       rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VOL_L1_MASK, 0x9);
+       rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VREFPFM_L_MASK, 0xA);
+
+       if (rtwdev->hal.cv == CHIP_CBV) {
+               rtw89_write32_set(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
+               rtw89_write16_mask(rtwdev, R_AX_HCI_LDO_CTRL, B_AX_R_AX_VADJ_MASK, 0xA);
+               rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
+       }
+
+func_en:
+       rtw89_write32_set(rtwdev, R_AX_DMAC_FUNC_EN,
+                         B_AX_MAC_FUNC_EN | B_AX_DMAC_FUNC_EN | B_AX_MPDU_PROC_EN |
+                         B_AX_WD_RLS_EN | B_AX_DLE_WDE_EN | B_AX_TXPKT_CTRL_EN |
+                         B_AX_STA_SCH_EN | B_AX_DLE_PLE_EN | B_AX_PKT_BUF_EN |
+                         B_AX_DMAC_TBL_EN | B_AX_PKT_IN_EN | B_AX_DLE_CPUIO_EN |
+                         B_AX_DISPATCHER_EN | B_AX_BBRPT_EN | B_AX_MAC_SEC_EN |
+                         B_AX_DMACREG_GCKEN);
+       rtw89_write32_set(rtwdev, R_AX_CMAC_FUNC_EN,
+                         B_AX_CMAC_EN | B_AX_CMAC_TXEN | B_AX_CMAC_RXEN |
+                         B_AX_FORCE_CMACREG_GCKEN | B_AX_PHYINTF_EN | B_AX_CMAC_DMA_EN |
+                         B_AX_PTCLTOP_EN | B_AX_SCHEDULER_EN | B_AX_TMAC_EN |
+                         B_AX_RMAC_EN);
+
+       rtw89_write32_mask(rtwdev, R_AX_EECS_EESK_FUNC_SEL, B_AX_PINMUX_EESK_FUNC_SEL_MASK,
+                          PINMUX_EESK_FUNC_SEL_BT_LOG);
+
+       return 0;
+}
+
+static int rtw8852b_pwr_off_func(struct rtw89_dev *rtwdev)
+{
+       u32 val32;
+       u32 ret;
+
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_RFC2RF,
+                                     XTAL_SI_RFC2RF);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_EI);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_WEI);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S0, 0, XTAL_SI_RF00);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S1, 0, XTAL_SI_RF10);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_SRAM2RFC,
+                                     XTAL_SI_SRAM2RFC);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_EI);
+       if (ret)
+               return ret;
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_WEI);
+       if (ret)
+               return ret;
+
+       rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
+       rtw89_write8_clr(rtwdev, R_AX_SYS_FUNC_EN, B_AX_FEN_BB_GLB_RSTN | B_AX_FEN_BBRSTB);
+       rtw89_write32_clr(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_RFC_1P3);
+
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_SHDN_WL);
+       if (ret)
+               return ret;
+
+       rtw89_write32_clr(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3);
+
+       ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_GND_SHDN_WL);
+       if (ret)
+               return ret;
+
+       rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
+
+       ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFM_OFFMAC),
+                               1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
+       if (ret)
+               return ret;
+
+       rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
+       rtw89_write32_set(rtwdev, R_AX_SYS_SWR_CTRL1, B_AX_SYM_CTRL_SPS_PWMFREQ);
+       rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_REG_ZCDC_H_MASK, 0x3);
+       rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+
+       return 0;
+}
+
+static void rtw8852be_efuse_parsing(struct rtw89_efuse *efuse,
+                                   struct rtw8852b_efuse *map)
+{
+       ether_addr_copy(efuse->addr, map->e.mac_addr);
+       efuse->rfe_type = map->rfe_type;
+       efuse->xtal_cap = map->xtal_k;
+}
+
+static void rtw8852b_efuse_parsing_tssi(struct rtw89_dev *rtwdev,
+                                       struct rtw8852b_efuse *map)
+{
+       struct rtw89_tssi_info *tssi = &rtwdev->tssi;
+       struct rtw8852b_tssi_offset *ofst[] = {&map->path_a_tssi, &map->path_b_tssi};
+       u8 i, j;
+
+       tssi->thermal[RF_PATH_A] = map->path_a_therm;
+       tssi->thermal[RF_PATH_B] = map->path_b_therm;
+
+       for (i = 0; i < RF_PATH_NUM_8852B; i++) {
+               memcpy(tssi->tssi_cck[i], ofst[i]->cck_tssi,
+                      sizeof(ofst[i]->cck_tssi));
+
+               for (j = 0; j < TSSI_CCK_CH_GROUP_NUM; j++)
+                       rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                                   "[TSSI][EFUSE] path=%d cck[%d]=0x%x\n",
+                                   i, j, tssi->tssi_cck[i][j]);
+
+               memcpy(tssi->tssi_mcs[i], ofst[i]->bw40_tssi,
+                      sizeof(ofst[i]->bw40_tssi));
+               memcpy(tssi->tssi_mcs[i] + TSSI_MCS_2G_CH_GROUP_NUM,
+                      ofst[i]->bw40_1s_tssi_5g, sizeof(ofst[i]->bw40_1s_tssi_5g));
+
+               for (j = 0; j < TSSI_MCS_CH_GROUP_NUM; j++)
+                       rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                                   "[TSSI][EFUSE] path=%d mcs[%d]=0x%x\n",
+                                   i, j, tssi->tssi_mcs[i][j]);
+       }
+}
+
+static bool _decode_efuse_gain(u8 data, s8 *high, s8 *low)
+{
+       if (high)
+               *high = sign_extend32(FIELD_GET(GENMASK(7,  4), data), 3);
+       if (low)
+               *low = sign_extend32(FIELD_GET(GENMASK(3,  0), data), 3);
+
+       return data != 0xff;
+}
+
+static void rtw8852b_efuse_parsing_gain_offset(struct rtw89_dev *rtwdev,
+                                              struct rtw8852b_efuse *map)
+{
+       struct rtw89_phy_efuse_gain *gain = &rtwdev->efuse_gain;
+       bool valid = false;
+
+       valid |= _decode_efuse_gain(map->rx_gain_2g_cck,
+                                   &gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_2G_CCK],
+                                   &gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_2G_CCK]);
+       valid |= _decode_efuse_gain(map->rx_gain_2g_ofdm,
+                                   &gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_2G_OFDM],
+                                   &gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_2G_OFDM]);
+       valid |= _decode_efuse_gain(map->rx_gain_5g_low,
+                                   &gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_5G_LOW],
+                                   &gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_5G_LOW]);
+       valid |= _decode_efuse_gain(map->rx_gain_5g_mid,
+                                   &gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_5G_MID],
+                                   &gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_5G_MID]);
+       valid |= _decode_efuse_gain(map->rx_gain_5g_high,
+                                   &gain->offset[RF_PATH_A][RTW89_GAIN_OFFSET_5G_HIGH],
+                                   &gain->offset[RF_PATH_B][RTW89_GAIN_OFFSET_5G_HIGH]);
+
+       gain->offset_valid = valid;
+}
+
+static int rtw8852b_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map)
+{
+       struct rtw89_efuse *efuse = &rtwdev->efuse;
+       struct rtw8852b_efuse *map;
+
+       map = (struct rtw8852b_efuse *)log_map;
+
+       efuse->country_code[0] = map->country_code[0];
+       efuse->country_code[1] = map->country_code[1];
+       rtw8852b_efuse_parsing_tssi(rtwdev, map);
+       rtw8852b_efuse_parsing_gain_offset(rtwdev, map);
+
+       switch (rtwdev->hci.type) {
+       case RTW89_HCI_TYPE_PCIE:
+               rtw8852be_efuse_parsing(efuse, map);
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);
+
+       return 0;
+}
+
+static void rtw8852b_phycap_parsing_power_cal(struct rtw89_dev *rtwdev, u8 *phycap_map)
+{
+#define PWR_K_CHK_OFFSET 0x5E9
+#define PWR_K_CHK_VALUE 0xAA
+       u32 offset = PWR_K_CHK_OFFSET - rtwdev->chip->phycap_addr;
+
+       if (phycap_map[offset] == PWR_K_CHK_VALUE)
+               rtwdev->efuse.power_k_valid = true;
+}
+
+static void rtw8852b_phycap_parsing_tssi(struct rtw89_dev *rtwdev, u8 *phycap_map)
+{
+       struct rtw89_tssi_info *tssi = &rtwdev->tssi;
+       static const u32 tssi_trim_addr[RF_PATH_NUM_8852B] = {0x5D6, 0x5AB};
+       u32 addr = rtwdev->chip->phycap_addr;
+       bool pg = false;
+       u32 ofst;
+       u8 i, j;
+
+       for (i = 0; i < RF_PATH_NUM_8852B; i++) {
+               for (j = 0; j < TSSI_TRIM_CH_GROUP_NUM; j++) {
+                       /* addrs are in decreasing order */
+                       ofst = tssi_trim_addr[i] - addr - j;
+                       tssi->tssi_trim[i][j] = phycap_map[ofst];
+
+                       if (phycap_map[ofst] != 0xff)
+                               pg = true;
+               }
+       }
+
+       if (!pg) {
+               memset(tssi->tssi_trim, 0, sizeof(tssi->tssi_trim));
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI][TRIM] no PG, set all trim info to 0\n");
+       }
+
+       for (i = 0; i < RF_PATH_NUM_8852B; i++)
+               for (j = 0; j < TSSI_TRIM_CH_GROUP_NUM; j++)
+                       rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                                   "[TSSI] path=%d idx=%d trim=0x%x addr=0x%x\n",
+                                   i, j, tssi->tssi_trim[i][j],
+                                   tssi_trim_addr[i] - j);
+}
+
+static void rtw8852b_phycap_parsing_thermal_trim(struct rtw89_dev *rtwdev,
+                                                u8 *phycap_map)
+{
+       struct rtw89_power_trim_info *info = &rtwdev->pwr_trim;
+       static const u32 thm_trim_addr[RF_PATH_NUM_8852B] = {0x5DF, 0x5DC};
+       u32 addr = rtwdev->chip->phycap_addr;
+       u8 i;
+
+       for (i = 0; i < RF_PATH_NUM_8852B; i++) {
+               info->thermal_trim[i] = phycap_map[thm_trim_addr[i] - addr];
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[THERMAL][TRIM] path=%d thermal_trim=0x%x\n",
+                           i, info->thermal_trim[i]);
+
+               if (info->thermal_trim[i] != 0xff)
+                       info->pg_thermal_trim = true;
+       }
+}
+
+static void rtw8852b_thermal_trim(struct rtw89_dev *rtwdev)
+{
+#define __thm_setting(raw)                             \
+({                                                     \
+       u8 __v = (raw);                                 \
+       ((__v & 0x1) << 3) | ((__v & 0x1f) >> 1);       \
+})
+       struct rtw89_power_trim_info *info = &rtwdev->pwr_trim;
+       u8 i, val;
+
+       if (!info->pg_thermal_trim) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[THERMAL][TRIM] no PG, do nothing\n");
+
+               return;
+       }
+
+       for (i = 0; i < RF_PATH_NUM_8852B; i++) {
+               val = __thm_setting(info->thermal_trim[i]);
+               rtw89_write_rf(rtwdev, i, RR_TM2, RR_TM2_OFF, val);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[THERMAL][TRIM] path=%d thermal_setting=0x%x\n",
+                           i, val);
+       }
+#undef __thm_setting
+}
+
+static void rtw8852b_phycap_parsing_pa_bias_trim(struct rtw89_dev *rtwdev,
+                                                u8 *phycap_map)
+{
+       struct rtw89_power_trim_info *info = &rtwdev->pwr_trim;
+       static const u32 pabias_trim_addr[RF_PATH_NUM_8852B] = {0x5DE, 0x5DB};
+       u32 addr = rtwdev->chip->phycap_addr;
+       u8 i;
+
+       for (i = 0; i < RF_PATH_NUM_8852B; i++) {
+               info->pa_bias_trim[i] = phycap_map[pabias_trim_addr[i] - addr];
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[PA_BIAS][TRIM] path=%d pa_bias_trim=0x%x\n",
+                           i, info->pa_bias_trim[i]);
+
+               if (info->pa_bias_trim[i] != 0xff)
+                       info->pg_pa_bias_trim = true;
+       }
+}
+
+static void rtw8852b_pa_bias_trim(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_power_trim_info *info = &rtwdev->pwr_trim;
+       u8 pabias_2g, pabias_5g;
+       u8 i;
+
+       if (!info->pg_pa_bias_trim) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[PA_BIAS][TRIM] no PG, do nothing\n");
+
+               return;
+       }
+
+       for (i = 0; i < RF_PATH_NUM_8852B; i++) {
+               pabias_2g = FIELD_GET(GENMASK(3, 0), info->pa_bias_trim[i]);
+               pabias_5g = FIELD_GET(GENMASK(7, 4), info->pa_bias_trim[i]);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[PA_BIAS][TRIM] path=%d 2G=0x%x 5G=0x%x\n",
+                           i, pabias_2g, pabias_5g);
+
+               rtw89_write_rf(rtwdev, i, RR_BIASA, RR_BIASA_TXG, pabias_2g);
+               rtw89_write_rf(rtwdev, i, RR_BIASA, RR_BIASA_TXA, pabias_5g);
+       }
+}
+
+static void rtw8852b_phycap_parsing_gain_comp(struct rtw89_dev *rtwdev, u8 *phycap_map)
+{
+       static const u32 comp_addrs[][RTW89_SUBBAND_2GHZ_5GHZ_NR] = {
+               {0x5BB, 0x5BA, 0, 0x5B9, 0x5B8},
+               {0x590, 0x58F, 0, 0x58E, 0x58D},
+       };
+       struct rtw89_phy_efuse_gain *gain = &rtwdev->efuse_gain;
+       u32 phycap_addr = rtwdev->chip->phycap_addr;
+       bool valid = false;
+       int path, i;
+       u8 data;
+
+       for (path = 0; path < 2; path++)
+               for (i = 0; i < RTW89_SUBBAND_2GHZ_5GHZ_NR; i++) {
+                       if (comp_addrs[path][i] == 0)
+                               continue;
+
+                       data = phycap_map[comp_addrs[path][i] - phycap_addr];
+                       valid |= _decode_efuse_gain(data, NULL,
+                                                   &gain->comp[path][i]);
+               }
+
+       gain->comp_valid = valid;
+}
+
+static int rtw8852b_read_phycap(struct rtw89_dev *rtwdev, u8 *phycap_map)
+{
+       rtw8852b_phycap_parsing_power_cal(rtwdev, phycap_map);
+       rtw8852b_phycap_parsing_tssi(rtwdev, phycap_map);
+       rtw8852b_phycap_parsing_thermal_trim(rtwdev, phycap_map);
+       rtw8852b_phycap_parsing_pa_bias_trim(rtwdev, phycap_map);
+       rtw8852b_phycap_parsing_gain_comp(rtwdev, phycap_map);
+
+       return 0;
+}
+
+static void rtw8852b_power_trim(struct rtw89_dev *rtwdev)
+{
+       rtw8852b_thermal_trim(rtwdev);
+       rtw8852b_pa_bias_trim(rtwdev);
+}
+
+static void rtw8852b_set_channel_mac(struct rtw89_dev *rtwdev,
+                                    const struct rtw89_chan *chan,
+                                    u8 mac_idx)
+{
+       u32 rf_mod = rtw89_mac_reg_by_idx(R_AX_WMAC_RFMOD, mac_idx);
+       u32 sub_carr = rtw89_mac_reg_by_idx(R_AX_TX_SUB_CARRIER_VALUE, mac_idx);
+       u32 chk_rate = rtw89_mac_reg_by_idx(R_AX_TXRATE_CHK, mac_idx);
+       u8 txsc20 = 0, txsc40 = 0;
+
+       switch (chan->band_width) {
+       case RTW89_CHANNEL_WIDTH_80:
+               txsc40 = rtw89_phy_get_txsc(rtwdev, chan, RTW89_CHANNEL_WIDTH_40);
+               fallthrough;
+       case RTW89_CHANNEL_WIDTH_40:
+               txsc20 = rtw89_phy_get_txsc(rtwdev, chan, RTW89_CHANNEL_WIDTH_20);
+               break;
+       default:
+               break;
+       }
+
+       switch (chan->band_width) {
+       case RTW89_CHANNEL_WIDTH_80:
+               rtw89_write8_mask(rtwdev, rf_mod, B_AX_WMAC_RFMOD_MASK, BIT(1));
+               rtw89_write32(rtwdev, sub_carr, txsc20 | (txsc40 << 4));
+               break;
+       case RTW89_CHANNEL_WIDTH_40:
+               rtw89_write8_mask(rtwdev, rf_mod, B_AX_WMAC_RFMOD_MASK, BIT(0));
+               rtw89_write32(rtwdev, sub_carr, txsc20);
+               break;
+       case RTW89_CHANNEL_WIDTH_20:
+               rtw89_write8_clr(rtwdev, rf_mod, B_AX_WMAC_RFMOD_MASK);
+               rtw89_write32(rtwdev, sub_carr, 0);
+               break;
+       default:
+               break;
+       }
+
+       if (chan->channel > 14) {
+               rtw89_write8_clr(rtwdev, chk_rate, B_AX_BAND_MODE);
+               rtw89_write8_set(rtwdev, chk_rate,
+                                B_AX_CHECK_CCK_EN | B_AX_RTS_LIMIT_IN_OFDM6);
+       } else {
+               rtw89_write8_set(rtwdev, chk_rate, B_AX_BAND_MODE);
+               rtw89_write8_clr(rtwdev, chk_rate,
+                                B_AX_CHECK_CCK_EN | B_AX_RTS_LIMIT_IN_OFDM6);
+       }
+}
+
+static const u32 rtw8852b_sco_barker_threshold[14] = {
+       0x1cfea, 0x1d0e1, 0x1d1d7, 0x1d2cd, 0x1d3c3, 0x1d4b9, 0x1d5b0, 0x1d6a6,
+       0x1d79c, 0x1d892, 0x1d988, 0x1da7f, 0x1db75, 0x1ddc4
+};
+
+static const u32 rtw8852b_sco_cck_threshold[14] = {
+       0x27de3, 0x27f35, 0x28088, 0x281da, 0x2832d, 0x2847f, 0x285d2, 0x28724,
+       0x28877, 0x289c9, 0x28b1c, 0x28c6e, 0x28dc1, 0x290ed
+};
+
+static void rtw8852b_ctrl_sco_cck(struct rtw89_dev *rtwdev, u8 primary_ch)
+{
+       u8 ch_element = primary_ch - 1;
+
+       rtw89_phy_write32_mask(rtwdev, R_RXSCOBC, B_RXSCOBC_TH,
+                              rtw8852b_sco_barker_threshold[ch_element]);
+       rtw89_phy_write32_mask(rtwdev, R_RXSCOCCK, B_RXSCOCCK_TH,
+                              rtw8852b_sco_cck_threshold[ch_element]);
+}
+
+static u8 rtw8852b_sco_mapping(u8 central_ch)
+{
+       if (central_ch == 1)
+               return 109;
+       else if (central_ch >= 2 && central_ch <= 6)
+               return 108;
+       else if (central_ch >= 7 && central_ch <= 10)
+               return 107;
+       else if (central_ch >= 11 && central_ch <= 14)
+               return 106;
+       else if (central_ch == 36 || central_ch == 38)
+               return 51;
+       else if (central_ch >= 40 && central_ch <= 58)
+               return 50;
+       else if (central_ch >= 60 && central_ch <= 64)
+               return 49;
+       else if (central_ch == 100 || central_ch == 102)
+               return 48;
+       else if (central_ch >= 104 && central_ch <= 126)
+               return 47;
+       else if (central_ch >= 128 && central_ch <= 151)
+               return 46;
+       else if (central_ch >= 153 && central_ch <= 177)
+               return 45;
+       else
+               return 0;
+}
+
+struct rtw8852b_bb_gain {
+       u32 gain_g[BB_PATH_NUM_8852B];
+       u32 gain_a[BB_PATH_NUM_8852B];
+       u32 gain_mask;
+};
+
+static const struct rtw8852b_bb_gain bb_gain_lna[LNA_GAIN_NUM] = {
+       { .gain_g = {0x4678, 0x475C}, .gain_a = {0x45DC, 0x4740},
+         .gain_mask = 0x00ff0000 },
+       { .gain_g = {0x4678, 0x475C}, .gain_a = {0x45DC, 0x4740},
+         .gain_mask = 0xff000000 },
+       { .gain_g = {0x467C, 0x4760}, .gain_a = {0x4660, 0x4744},
+         .gain_mask = 0x000000ff },
+       { .gain_g = {0x467C, 0x4760}, .gain_a = {0x4660, 0x4744},
+         .gain_mask = 0x0000ff00 },
+       { .gain_g = {0x467C, 0x4760}, .gain_a = {0x4660, 0x4744},
+         .gain_mask = 0x00ff0000 },
+       { .gain_g = {0x467C, 0x4760}, .gain_a = {0x4660, 0x4744},
+         .gain_mask = 0xff000000 },
+       { .gain_g = {0x4680, 0x4764}, .gain_a = {0x4664, 0x4748},
+         .gain_mask = 0x000000ff },
+};
+
+static const struct rtw8852b_bb_gain bb_gain_tia[TIA_GAIN_NUM] = {
+       { .gain_g = {0x4680, 0x4764}, .gain_a = {0x4664, 0x4748},
+         .gain_mask = 0x00ff0000 },
+       { .gain_g = {0x4680, 0x4764}, .gain_a = {0x4664, 0x4748},
+         .gain_mask = 0xff000000 },
+};
+
+static void rtw8852b_set_gain_error(struct rtw89_dev *rtwdev,
+                                   enum rtw89_subband subband,
+                                   enum rtw89_rf_path path)
+{
+       const struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain;
+       u8 gain_band = rtw89_subband_to_bb_gain_band(subband);
+       s32 val;
+       u32 reg;
+       u32 mask;
+       int i;
+
+       for (i = 0; i < LNA_GAIN_NUM; i++) {
+               if (subband == RTW89_CH_2G)
+                       reg = bb_gain_lna[i].gain_g[path];
+               else
+                       reg = bb_gain_lna[i].gain_a[path];
+
+               mask = bb_gain_lna[i].gain_mask;
+               val = gain->lna_gain[gain_band][path][i];
+               rtw89_phy_write32_mask(rtwdev, reg, mask, val);
+       }
+
+       for (i = 0; i < TIA_GAIN_NUM; i++) {
+               if (subband == RTW89_CH_2G)
+                       reg = bb_gain_tia[i].gain_g[path];
+               else
+                       reg = bb_gain_tia[i].gain_a[path];
+
+               mask = bb_gain_tia[i].gain_mask;
+               val = gain->tia_gain[gain_band][path][i];
+               rtw89_phy_write32_mask(rtwdev, reg, mask, val);
+       }
+}
+
+static void rtw8852b_set_gain_offset(struct rtw89_dev *rtwdev,
+                                    enum rtw89_subband subband,
+                                    enum rtw89_phy_idx phy_idx)
+{
+       static const u32 gain_err_addr[2] = {R_P0_AGC_RSVD, R_P1_AGC_RSVD};
+       static const u32 rssi_ofst_addr[2] = {R_PATH0_G_TIA1_LNA6_OP1DB_V1,
+                                             R_PATH1_G_TIA1_LNA6_OP1DB_V1};
+       struct rtw89_hal *hal = &rtwdev->hal;
+       struct rtw89_phy_efuse_gain *efuse_gain = &rtwdev->efuse_gain;
+       enum rtw89_gain_offset gain_ofdm_band;
+       s32 offset_a, offset_b;
+       s32 offset_ofdm, offset_cck;
+       s32 tmp;
+       u8 path;
+
+       if (!efuse_gain->comp_valid)
+               goto next;
+
+       for (path = RF_PATH_A; path < BB_PATH_NUM_8852B; path++) {
+               tmp = efuse_gain->comp[path][subband];
+               tmp = clamp_t(s32, tmp << 2, S8_MIN, S8_MAX);
+               rtw89_phy_write32_mask(rtwdev, gain_err_addr[path], MASKBYTE0, tmp);
+       }
+
+next:
+       if (!efuse_gain->offset_valid)
+               return;
+
+       gain_ofdm_band = rtw89_subband_to_gain_offset_band_of_ofdm(subband);
+
+       offset_a = -efuse_gain->offset[RF_PATH_A][gain_ofdm_band];
+       offset_b = -efuse_gain->offset[RF_PATH_B][gain_ofdm_band];
+
+       tmp = -((offset_a << 2) + (efuse_gain->offset_base[RTW89_PHY_0] >> 2));
+       tmp = clamp_t(s32, tmp, S8_MIN, S8_MAX);
+       rtw89_phy_write32_mask(rtwdev, rssi_ofst_addr[RF_PATH_A], B_PATH0_R_G_OFST_MASK, tmp);
+
+       tmp = -((offset_b << 2) + (efuse_gain->offset_base[RTW89_PHY_0] >> 2));
+       tmp = clamp_t(s32, tmp, S8_MIN, S8_MAX);
+       rtw89_phy_write32_mask(rtwdev, rssi_ofst_addr[RF_PATH_B], B_PATH0_R_G_OFST_MASK, tmp);
+
+       if (hal->antenna_rx == RF_B) {
+               offset_ofdm = -efuse_gain->offset[RF_PATH_B][gain_ofdm_band];
+               offset_cck = -efuse_gain->offset[RF_PATH_B][0];
+       } else {
+               offset_ofdm = -efuse_gain->offset[RF_PATH_A][gain_ofdm_band];
+               offset_cck = -efuse_gain->offset[RF_PATH_A][0];
+       }
+
+       tmp = (offset_ofdm << 4) + efuse_gain->offset_base[RTW89_PHY_0];
+       tmp = clamp_t(s32, tmp, S8_MIN, S8_MAX);
+       rtw89_phy_write32_idx(rtwdev, R_P0_RPL1, B_P0_RPL1_BIAS_MASK, tmp, phy_idx);
+
+       tmp = (offset_ofdm << 4) + efuse_gain->rssi_base[RTW89_PHY_0];
+       tmp = clamp_t(s32, tmp, S8_MIN, S8_MAX);
+       rtw89_phy_write32_idx(rtwdev, R_P1_RPL1, B_P0_RPL1_BIAS_MASK, tmp, phy_idx);
+
+       if (subband == RTW89_CH_2G) {
+               tmp = (offset_cck << 3) + (efuse_gain->offset_base[RTW89_PHY_0] >> 1);
+               tmp = clamp_t(s32, tmp, S8_MIN >> 1, S8_MAX >> 1);
+               rtw89_phy_write32_mask(rtwdev, R_RX_RPL_OFST,
+                                      B_RX_RPL_OFST_CCK_MASK, tmp);
+       }
+}
+
+static
+void rtw8852b_set_rxsc_rpl_comp(struct rtw89_dev *rtwdev, enum rtw89_subband subband)
+{
+       const struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain;
+       u8 band = rtw89_subband_to_bb_gain_band(subband);
+       u32 val;
+
+       val = FIELD_PREP(B_P0_RPL1_20_MASK, (gain->rpl_ofst_20[band][RF_PATH_A] +
+                                            gain->rpl_ofst_20[band][RF_PATH_B]) / 2) |
+             FIELD_PREP(B_P0_RPL1_40_MASK, (gain->rpl_ofst_40[band][RF_PATH_A][0] +
+                                            gain->rpl_ofst_40[band][RF_PATH_B][0]) / 2) |
+             FIELD_PREP(B_P0_RPL1_41_MASK, (gain->rpl_ofst_40[band][RF_PATH_A][1] +
+                                            gain->rpl_ofst_40[band][RF_PATH_B][1]) / 2);
+       val >>= B_P0_RPL1_SHIFT;
+       rtw89_phy_write32_mask(rtwdev, R_P0_RPL1, B_P0_RPL1_MASK, val);
+       rtw89_phy_write32_mask(rtwdev, R_P1_RPL1, B_P0_RPL1_MASK, val);
+
+       val = FIELD_PREP(B_P0_RTL2_42_MASK, (gain->rpl_ofst_40[band][RF_PATH_A][2] +
+                                            gain->rpl_ofst_40[band][RF_PATH_B][2]) / 2) |
+             FIELD_PREP(B_P0_RTL2_80_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][0] +
+                                            gain->rpl_ofst_80[band][RF_PATH_B][0]) / 2) |
+             FIELD_PREP(B_P0_RTL2_81_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][1] +
+                                            gain->rpl_ofst_80[band][RF_PATH_B][1]) / 2) |
+             FIELD_PREP(B_P0_RTL2_8A_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][10] +
+                                            gain->rpl_ofst_80[band][RF_PATH_B][10]) / 2);
+       rtw89_phy_write32(rtwdev, R_P0_RPL2, val);
+       rtw89_phy_write32(rtwdev, R_P1_RPL2, val);
+
+       val = FIELD_PREP(B_P0_RTL3_82_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][2] +
+                                            gain->rpl_ofst_80[band][RF_PATH_B][2]) / 2) |
+             FIELD_PREP(B_P0_RTL3_83_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][3] +
+                                            gain->rpl_ofst_80[band][RF_PATH_B][3]) / 2) |
+             FIELD_PREP(B_P0_RTL3_84_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][4] +
+                                            gain->rpl_ofst_80[band][RF_PATH_B][4]) / 2) |
+             FIELD_PREP(B_P0_RTL3_89_MASK, (gain->rpl_ofst_80[band][RF_PATH_A][9] +
+                                            gain->rpl_ofst_80[band][RF_PATH_B][9]) / 2);
+       rtw89_phy_write32(rtwdev, R_P0_RPL3, val);
+       rtw89_phy_write32(rtwdev, R_P1_RPL3, val);
+}
+
+static void rtw8852b_ctrl_ch(struct rtw89_dev *rtwdev,
+                            const struct rtw89_chan *chan,
+                            enum rtw89_phy_idx phy_idx)
+{
+       u8 central_ch = chan->channel;
+       u8 subband = chan->subband_type;
+       u8 sco_comp;
+       bool is_2g = central_ch <= 14;
+
+       /* Path A */
+       if (is_2g)
+               rtw89_phy_write32_idx(rtwdev, R_PATH0_BAND_SEL_V1,
+                                     B_PATH0_BAND_SEL_MSK_V1, 1, phy_idx);
+       else
+               rtw89_phy_write32_idx(rtwdev, R_PATH0_BAND_SEL_V1,
+                                     B_PATH0_BAND_SEL_MSK_V1, 0, phy_idx);
+
+       /* Path B */
+       if (is_2g)
+               rtw89_phy_write32_idx(rtwdev, R_PATH1_BAND_SEL_V1,
+                                     B_PATH1_BAND_SEL_MSK_V1, 1, phy_idx);
+       else
+               rtw89_phy_write32_idx(rtwdev, R_PATH1_BAND_SEL_V1,
+                                     B_PATH1_BAND_SEL_MSK_V1, 0, phy_idx);
+
+       /* SCO compensate FC setting */
+       sco_comp = rtw8852b_sco_mapping(central_ch);
+       rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_INV, sco_comp, phy_idx);
+
+       if (chan->band_type == RTW89_BAND_6G)
+               return;
+
+       /* CCK parameters */
+       if (central_ch == 14) {
+               rtw89_phy_write32_mask(rtwdev, R_TXFIR0, B_TXFIR_C01, 0x3b13ff);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIR2, B_TXFIR_C23, 0x1c42de);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIR4, B_TXFIR_C45, 0xfdb0ad);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIR6, B_TXFIR_C67, 0xf60f6e);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIR8, B_TXFIR_C89, 0xfd8f92);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIRA, B_TXFIR_CAB, 0x2d011);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIRC, B_TXFIR_CCD, 0x1c02c);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIRE, B_TXFIR_CEF, 0xfff00a);
+       } else {
+               rtw89_phy_write32_mask(rtwdev, R_TXFIR0, B_TXFIR_C01, 0x3d23ff);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIR2, B_TXFIR_C23, 0x29b354);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIR4, B_TXFIR_C45, 0xfc1c8);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIR6, B_TXFIR_C67, 0xfdb053);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIR8, B_TXFIR_C89, 0xf86f9a);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIRA, B_TXFIR_CAB, 0xfaef92);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIRC, B_TXFIR_CCD, 0xfe5fcc);
+               rtw89_phy_write32_mask(rtwdev, R_TXFIRE, B_TXFIR_CEF, 0xffdff5);
+       }
+
+       rtw8852b_set_gain_error(rtwdev, subband, RF_PATH_A);
+       rtw8852b_set_gain_error(rtwdev, subband, RF_PATH_B);
+       rtw8852b_set_gain_offset(rtwdev, subband, phy_idx);
+       rtw8852b_set_rxsc_rpl_comp(rtwdev, subband);
+}
+
+static void rtw8852b_bw_setting(struct rtw89_dev *rtwdev, u8 bw, u8 path)
+{
+       static const u32 adc_sel[2] = {0xC0EC, 0xC1EC};
+       static const u32 wbadc_sel[2] = {0xC0E4, 0xC1E4};
+
+       switch (bw) {
+       case RTW89_CHANNEL_WIDTH_5:
+               rtw89_phy_write32_mask(rtwdev, adc_sel[path], 0x6000, 0x1);
+               rtw89_phy_write32_mask(rtwdev, wbadc_sel[path], 0x30, 0x0);
+               break;
+       case RTW89_CHANNEL_WIDTH_10:
+               rtw89_phy_write32_mask(rtwdev, adc_sel[path], 0x6000, 0x2);
+               rtw89_phy_write32_mask(rtwdev, wbadc_sel[path], 0x30, 0x1);
+               break;
+       case RTW89_CHANNEL_WIDTH_20:
+               rtw89_phy_write32_mask(rtwdev, adc_sel[path], 0x6000, 0x0);
+               rtw89_phy_write32_mask(rtwdev, wbadc_sel[path], 0x30, 0x2);
+               break;
+       case RTW89_CHANNEL_WIDTH_40:
+               rtw89_phy_write32_mask(rtwdev, adc_sel[path], 0x6000, 0x0);
+               rtw89_phy_write32_mask(rtwdev, wbadc_sel[path], 0x30, 0x2);
+               break;
+       case RTW89_CHANNEL_WIDTH_80:
+               rtw89_phy_write32_mask(rtwdev, adc_sel[path], 0x6000, 0x0);
+               rtw89_phy_write32_mask(rtwdev, wbadc_sel[path], 0x30, 0x2);
+               break;
+       default:
+               rtw89_warn(rtwdev, "Fail to set ADC\n");
+       }
+}
+
+static void rtw8852b_ctrl_bw(struct rtw89_dev *rtwdev, u8 pri_ch, u8 bw,
+                            enum rtw89_phy_idx phy_idx)
+{
+       u32 rx_path_0;
+
+       switch (bw) {
+       case RTW89_CHANNEL_WIDTH_5:
+               rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_SET, 0x0, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_SBW, 0x1, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH, 0x0, phy_idx);
+
+               /*Set RF mode at 3 */
+               rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX,
+                                     B_P0_RFMODE_ORI_RX_ALL, 0x333, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX,
+                                     B_P1_RFMODE_ORI_RX_ALL, 0x333, phy_idx);
+               break;
+       case RTW89_CHANNEL_WIDTH_10:
+               rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_SET, 0x0, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_SBW, 0x2, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH, 0x0, phy_idx);
+
+               /*Set RF mode at 3 */
+               rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX,
+                                     B_P0_RFMODE_ORI_RX_ALL, 0x333, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX,
+                                     B_P1_RFMODE_ORI_RX_ALL, 0x333, phy_idx);
+               break;
+       case RTW89_CHANNEL_WIDTH_20:
+               rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_SET, 0x0, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_SBW, 0x0, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH, 0x0, phy_idx);
+
+               /*Set RF mode at 3 */
+               rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX,
+                                     B_P0_RFMODE_ORI_RX_ALL, 0x333, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX,
+                                     B_P1_RFMODE_ORI_RX_ALL, 0x333, phy_idx);
+               break;
+       case RTW89_CHANNEL_WIDTH_40:
+               rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_SET, 0x1, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_SBW, 0x0, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH,
+                                     pri_ch, phy_idx);
+
+               /*Set RF mode at 3 */
+               rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX,
+                                     B_P0_RFMODE_ORI_RX_ALL, 0x333, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX,
+                                     B_P1_RFMODE_ORI_RX_ALL, 0x333, phy_idx);
+               /*CCK primary channel */
+               if (pri_ch == RTW89_SC_20_UPPER)
+                       rtw89_phy_write32_mask(rtwdev, R_RXSC, B_RXSC_EN, 1);
+               else
+                       rtw89_phy_write32_mask(rtwdev, R_RXSC, B_RXSC_EN, 0);
+
+               break;
+       case RTW89_CHANNEL_WIDTH_80:
+               rtw89_phy_write32_idx(rtwdev, R_FC0_BW_V1, B_FC0_BW_SET, 0x2, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_SBW, 0x0, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_CHBW_MOD_PRICH,
+                                     pri_ch, phy_idx);
+
+               /*Set RF mode at A */
+               rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX,
+                                     B_P0_RFMODE_ORI_RX_ALL, 0xaaa, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX,
+                                     B_P1_RFMODE_ORI_RX_ALL, 0xaaa, phy_idx);
+               break;
+       default:
+               rtw89_warn(rtwdev, "Fail to switch bw (bw:%d, pri ch:%d)\n", bw,
+                          pri_ch);
+       }
+
+       rtw8852b_bw_setting(rtwdev, bw, RF_PATH_A);
+       rtw8852b_bw_setting(rtwdev, bw, RF_PATH_B);
+
+       rx_path_0 = rtw89_phy_read32_idx(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0,
+                                        phy_idx);
+       if (rx_path_0 == 0x1)
+               rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_ORI_RX,
+                                     B_P1_RFMODE_ORI_RX_ALL, 0x111, phy_idx);
+       else if (rx_path_0 == 0x2)
+               rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_ORI_RX,
+                                     B_P0_RFMODE_ORI_RX_ALL, 0x111, phy_idx);
+}
+
+static void rtw8852b_ctrl_cck_en(struct rtw89_dev *rtwdev, bool cck_en)
+{
+       if (cck_en) {
+               rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_ENABLE_CCK, 1);
+               rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0);
+       } else {
+               rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_ENABLE_CCK, 0);
+               rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 1);
+       }
+}
+
+static void rtw8852b_5m_mask(struct rtw89_dev *rtwdev, const struct rtw89_chan *chan,
+                            enum rtw89_phy_idx phy_idx)
+{
+       u8 pri_ch = chan->primary_channel;
+       bool mask_5m_low;
+       bool mask_5m_en;
+
+       switch (chan->band_width) {
+       case RTW89_CHANNEL_WIDTH_40:
+               /* Prich=1: Mask 5M High, Prich=2: Mask 5M Low */
+               mask_5m_en = true;
+               mask_5m_low = pri_ch == 2;
+               break;
+       case RTW89_CHANNEL_WIDTH_80:
+               /* Prich=3: Mask 5M High, Prich=4: Mask 5M Low, Else: Disable */
+               mask_5m_en = pri_ch == 3 || pri_ch == 4;
+               mask_5m_low = pri_ch == 4;
+               break;
+       default:
+               mask_5m_en = false;
+               break;
+       }
+
+       if (!mask_5m_en) {
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_EN, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_EN, 0x0);
+               rtw89_phy_write32_idx(rtwdev, R_ASSIGN_SBD_OPT_V1,
+                                     B_ASSIGN_SBD_OPT_EN_V1, 0x0, phy_idx);
+               return;
+       }
+
+       if (mask_5m_low) {
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_TH, 0x4);
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_EN, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_SB2, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_SB0, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_TH, 0x4);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_EN, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_SB2, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_SB0, 0x1);
+       } else {
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_TH, 0x4);
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_EN, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_SB2, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_5MDET_V1, B_PATH0_5MDET_SB0, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_TH, 0x4);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_EN, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_SB2, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_5MDET_V1, B_PATH1_5MDET_SB0, 0x0);
+       }
+       rtw89_phy_write32_idx(rtwdev, R_ASSIGN_SBD_OPT_V1,
+                             B_ASSIGN_SBD_OPT_EN_V1, 0x1, phy_idx);
+}
+
+static void rtw8852b_bb_reset_all(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
+{
+       rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS, B_S0_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx);
+       rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS, B_S1_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx);
+       fsleep(1);
+       rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 1, phy_idx);
+       rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 0, phy_idx);
+       rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS, B_S0_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx);
+       rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS, B_S1_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx);
+       rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 1, phy_idx);
+}
+
+static void rtw8852b_bb_reset_en(struct rtw89_dev *rtwdev, enum rtw89_band band,
+                                enum rtw89_phy_idx phy_idx, bool en)
+{
+       if (en) {
+               rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS,
+                                     B_S0_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS,
+                                     B_S1_HW_SI_DIS_W_R_TRIG, 0x0, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 1, phy_idx);
+               if (band == RTW89_BAND_2G)
+                       rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x0);
+       } else {
+               rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x1);
+               rtw89_phy_write32_idx(rtwdev, R_S0_HW_SI_DIS,
+                                     B_S0_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx);
+               rtw89_phy_write32_idx(rtwdev, R_S1_HW_SI_DIS,
+                                     B_S1_HW_SI_DIS_W_R_TRIG, 0x7, phy_idx);
+               fsleep(1);
+               rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 0, phy_idx);
+       }
+}
+
+static void rtw8852b_bb_reset(struct rtw89_dev *rtwdev,
+                             enum rtw89_phy_idx phy_idx)
+{
+       rtw89_phy_write32_set(rtwdev, R_P0_TXPW_RSTB, B_P0_TXPW_RSTB_MANON);
+       rtw89_phy_write32_set(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_TRK_EN);
+       rtw89_phy_write32_set(rtwdev, R_P1_TXPW_RSTB, B_P1_TXPW_RSTB_MANON);
+       rtw89_phy_write32_set(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_TRK_EN);
+       rtw8852b_bb_reset_all(rtwdev, phy_idx);
+       rtw89_phy_write32_clr(rtwdev, R_P0_TXPW_RSTB, B_P0_TXPW_RSTB_MANON);
+       rtw89_phy_write32_clr(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_TRK_EN);
+       rtw89_phy_write32_clr(rtwdev, R_P1_TXPW_RSTB, B_P1_TXPW_RSTB_MANON);
+       rtw89_phy_write32_clr(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_TRK_EN);
+}
+
+static void rtw8852b_bb_macid_ctrl_init(struct rtw89_dev *rtwdev,
+                                       enum rtw89_phy_idx phy_idx)
+{
+       u32 addr;
+
+       for (addr = R_AX_PWR_MACID_LMT_TABLE0;
+            addr <= R_AX_PWR_MACID_LMT_TABLE127; addr += 4)
+               rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, 0);
+}
+
+static void rtw8852b_bb_sethw(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_phy_efuse_gain *gain = &rtwdev->efuse_gain;
+
+       rtw89_phy_write32_clr(rtwdev, R_P0_EN_SOUND_WO_NDP, B_P0_EN_SOUND_WO_NDP);
+       rtw89_phy_write32_clr(rtwdev, R_P1_EN_SOUND_WO_NDP, B_P1_EN_SOUND_WO_NDP);
+
+       rtw8852b_bb_macid_ctrl_init(rtwdev, RTW89_PHY_0);
+
+       /* read these registers after loading BB parameters */
+       gain->offset_base[RTW89_PHY_0] =
+               rtw89_phy_read32_mask(rtwdev, R_P0_RPL1, B_P0_RPL1_BIAS_MASK);
+       gain->rssi_base[RTW89_PHY_0] =
+               rtw89_phy_read32_mask(rtwdev, R_P1_RPL1, B_P0_RPL1_BIAS_MASK);
+}
+
+static void rtw8852b_set_channel_bb(struct rtw89_dev *rtwdev, const struct rtw89_chan *chan,
+                                   enum rtw89_phy_idx phy_idx)
+{
+       bool cck_en = chan->channel <= 14;
+       u8 pri_ch_idx = chan->pri_ch_idx;
+
+       if (cck_en)
+               rtw8852b_ctrl_sco_cck(rtwdev,  chan->primary_channel);
+
+       rtw8852b_ctrl_ch(rtwdev, chan, phy_idx);
+       rtw8852b_ctrl_bw(rtwdev, pri_ch_idx, chan->band_width, phy_idx);
+       rtw8852b_ctrl_cck_en(rtwdev, cck_en);
+       if (chan->band_type == RTW89_BAND_5G) {
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_BT_SHARE_V1,
+                                      B_PATH0_BT_SHARE_V1, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_BTG_PATH_V1,
+                                      B_PATH0_BTG_PATH_V1, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_BT_SHARE_V1,
+                                      B_PATH1_BT_SHARE_V1, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_BTG_PATH_V1,
+                                      B_PATH1_BTG_PATH_V1, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_BT_SHARE, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_BT_SEG0, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_BT_DYN_DC_EST_EN_V1,
+                                      B_BT_DYN_DC_EST_EN_MSK, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_GNT_BT_WGT_EN, B_GNT_BT_WGT_EN, 0x0);
+       }
+       rtw89_phy_write32_mask(rtwdev, R_MAC_PIN_SEL, B_CH_IDX_SEG0,
+                              chan->primary_channel);
+       rtw8852b_5m_mask(rtwdev, chan, phy_idx);
+       rtw8852b_bb_reset_all(rtwdev, phy_idx);
+}
+
+static void rtw8852b_set_channel(struct rtw89_dev *rtwdev,
+                                const struct rtw89_chan *chan,
+                                enum rtw89_mac_idx mac_idx,
+                                enum rtw89_phy_idx phy_idx)
+{
+       rtw8852b_set_channel_mac(rtwdev, chan, mac_idx);
+       rtw8852b_set_channel_bb(rtwdev, chan, phy_idx);
+       rtw8852b_set_channel_rf(rtwdev, chan, phy_idx);
+}
+
+static void rtw8852b_tssi_cont_en(struct rtw89_dev *rtwdev, bool en,
+                                 enum rtw89_rf_path path)
+{
+       static const u32 tssi_trk[2] = {R_P0_TSSI_TRK, R_P1_TSSI_TRK};
+       static const u32 ctrl_bbrst[2] = {R_P0_TXPW_RSTB, R_P1_TXPW_RSTB};
+
+       if (en) {
+               rtw89_phy_write32_mask(rtwdev, ctrl_bbrst[path], B_P0_TXPW_RSTB_MANON, 0x0);
+               rtw89_phy_write32_mask(rtwdev, tssi_trk[path], B_P0_TSSI_TRK_EN, 0x0);
+       } else {
+               rtw89_phy_write32_mask(rtwdev, ctrl_bbrst[path], B_P0_TXPW_RSTB_MANON, 0x1);
+               rtw89_phy_write32_mask(rtwdev, tssi_trk[path], B_P0_TSSI_TRK_EN, 0x1);
+       }
+}
+
+static void rtw8852b_tssi_cont_en_phyidx(struct rtw89_dev *rtwdev, bool en,
+                                        u8 phy_idx)
+{
+       if (!rtwdev->dbcc_en) {
+               rtw8852b_tssi_cont_en(rtwdev, en, RF_PATH_A);
+               rtw8852b_tssi_cont_en(rtwdev, en, RF_PATH_B);
+       } else {
+               if (phy_idx == RTW89_PHY_0)
+                       rtw8852b_tssi_cont_en(rtwdev, en, RF_PATH_A);
+               else
+                       rtw8852b_tssi_cont_en(rtwdev, en, RF_PATH_B);
+       }
+}
+
+static void rtw8852b_adc_en(struct rtw89_dev *rtwdev, bool en)
+{
+       if (en)
+               rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0);
+       else
+               rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0xf);
+}
+
+static void rtw8852b_set_channel_help(struct rtw89_dev *rtwdev, bool enter,
+                                     struct rtw89_channel_help_params *p,
+                                     const struct rtw89_chan *chan,
+                                     enum rtw89_mac_idx mac_idx,
+                                     enum rtw89_phy_idx phy_idx)
+{
+       if (enter) {
+               rtw89_chip_stop_sch_tx(rtwdev, RTW89_MAC_0, &p->tx_en, RTW89_SCH_TX_SEL_ALL);
+               rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false);
+               rtw8852b_tssi_cont_en_phyidx(rtwdev, false, RTW89_PHY_0);
+               rtw8852b_adc_en(rtwdev, false);
+               fsleep(40);
+               rtw8852b_bb_reset_en(rtwdev, chan->band_type, phy_idx, false);
+       } else {
+               rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true);
+               rtw8852b_adc_en(rtwdev, true);
+               rtw8852b_tssi_cont_en_phyidx(rtwdev, true, RTW89_PHY_0);
+               rtw8852b_bb_reset_en(rtwdev, chan->band_type, phy_idx, true);
+               rtw89_chip_resume_sch_tx(rtwdev, RTW89_MAC_0, p->tx_en);
+       }
+}
+
+static void rtw8852b_rfk_init(struct rtw89_dev *rtwdev)
+{
+       rtwdev->is_tssi_mode[RF_PATH_A] = false;
+       rtwdev->is_tssi_mode[RF_PATH_B] = false;
+
+       rtw8852b_dpk_init(rtwdev);
+       rtw8852b_rck(rtwdev);
+       rtw8852b_dack(rtwdev);
+       rtw8852b_rx_dck(rtwdev, RTW89_PHY_0);
+}
+
+static void rtw8852b_rfk_channel(struct rtw89_dev *rtwdev)
+{
+       enum rtw89_phy_idx phy_idx = RTW89_PHY_0;
+
+       rtw8852b_rx_dck(rtwdev, phy_idx);
+       rtw8852b_iqk(rtwdev, phy_idx);
+       rtw8852b_tssi(rtwdev, phy_idx, true);
+       rtw8852b_dpk(rtwdev, phy_idx);
+}
+
+static void rtw8852b_rfk_band_changed(struct rtw89_dev *rtwdev,
+                                     enum rtw89_phy_idx phy_idx)
+{
+       rtw8852b_tssi_scan(rtwdev, phy_idx);
+}
+
+static void rtw8852b_rfk_scan(struct rtw89_dev *rtwdev, bool start)
+{
+       rtw8852b_wifi_scan_notify(rtwdev, start, RTW89_PHY_0);
+}
+
+static void rtw8852b_rfk_track(struct rtw89_dev *rtwdev)
+{
+       rtw8852b_dpk_track(rtwdev);
+}
+
+static u32 rtw8852b_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev,
+                                    enum rtw89_phy_idx phy_idx, s16 ref)
+{
+       const u16 tssi_16dbm_cw = 0x12c;
+       const u8 base_cw_0db = 0x27;
+       const s8 ofst_int = 0;
+       s16 pwr_s10_3;
+       s16 rf_pwr_cw;
+       u16 bb_pwr_cw;
+       u32 pwr_cw;
+       u32 tssi_ofst_cw;
+
+       pwr_s10_3 = (ref << 1) + (s16)(ofst_int) + (s16)(base_cw_0db << 3);
+       bb_pwr_cw = FIELD_GET(GENMASK(2, 0), pwr_s10_3);
+       rf_pwr_cw = FIELD_GET(GENMASK(8, 3), pwr_s10_3);
+       rf_pwr_cw = clamp_t(s16, rf_pwr_cw, 15, 63);
+       pwr_cw = (rf_pwr_cw << 3) | bb_pwr_cw;
+
+       tssi_ofst_cw = (u32)((s16)tssi_16dbm_cw + (ref << 1) - (16 << 3));
+       rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
+                   "[TXPWR] tssi_ofst_cw=%d rf_cw=0x%x bb_cw=0x%x\n",
+                   tssi_ofst_cw, rf_pwr_cw, bb_pwr_cw);
+
+       return FIELD_PREP(B_DPD_TSSI_CW, tssi_ofst_cw) |
+              FIELD_PREP(B_DPD_PWR_CW, pwr_cw) |
+              FIELD_PREP(B_DPD_REF, ref);
+}
+
+static void rtw8852b_set_txpwr_ref(struct rtw89_dev *rtwdev,
+                                  enum rtw89_phy_idx phy_idx)
+{
+       static const u32 addr[RF_PATH_NUM_8852B] = {0x5800, 0x7800};
+       const u32 mask = B_DPD_TSSI_CW | B_DPD_PWR_CW | B_DPD_REF;
+       const u8 ofst_ofdm = 0x4;
+       const u8 ofst_cck = 0x8;
+       const s16 ref_ofdm = 0;
+       const s16 ref_cck = 0;
+       u32 val;
+       u8 i;
+
+       rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set txpwr reference\n");
+
+       rtw89_mac_txpwr_write32_mask(rtwdev, phy_idx, R_AX_PWR_RATE_CTRL,
+                                    B_AX_PWR_REF, 0x0);
+
+       rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set bb ofdm txpwr ref\n");
+       val = rtw8852b_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_ofdm);
+
+       for (i = 0; i < RF_PATH_NUM_8852B; i++)
+               rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_ofdm, mask, val,
+                                     phy_idx);
+
+       rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set bb cck txpwr ref\n");
+       val = rtw8852b_bb_cal_txpwr_ref(rtwdev, phy_idx, ref_cck);
+
+       for (i = 0; i < RF_PATH_NUM_8852B; i++)
+               rtw89_phy_write32_idx(rtwdev, addr[i] + ofst_cck, mask, val,
+                                     phy_idx);
+}
+
+static void rtw8852b_bb_set_tx_shape_dfir(struct rtw89_dev *rtwdev,
+                                         u8 tx_shape_idx,
+                                         enum rtw89_phy_idx phy_idx)
+{
+#define __DFIR_CFG_ADDR(i) (R_TXFIR0 + ((i) << 2))
+#define __DFIR_CFG_MASK 0xffffffff
+#define __DFIR_CFG_NR 8
+#define __DECL_DFIR_PARAM(_name, _val...) \
+       static const u32 param_ ## _name[] = {_val}; \
+       static_assert(ARRAY_SIZE(param_ ## _name) == __DFIR_CFG_NR)
+
+       __DECL_DFIR_PARAM(flat,
+                         0x023D23FF, 0x0029B354, 0x000FC1C8, 0x00FDB053,
+                         0x00F86F9A, 0x06FAEF92, 0x00FE5FCC, 0x00FFDFF5);
+       __DECL_DFIR_PARAM(sharp,
+                         0x023D83FF, 0x002C636A, 0x0013F204, 0x00008090,
+                         0x00F87FB0, 0x06F99F83, 0x00FDBFBA, 0x00003FF5);
+       __DECL_DFIR_PARAM(sharp_14,
+                         0x023B13FF, 0x001C42DE, 0x00FDB0AD, 0x00F60F6E,
+                         0x00FD8F92, 0x0602D011, 0x0001C02C, 0x00FFF00A);
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       u8 ch = chan->channel;
+       const u32 *param;
+       u32 addr;
+       int i;
+
+       if (ch > 14) {
+               rtw89_warn(rtwdev,
+                          "set tx shape dfir by unknown ch: %d on 2G\n", ch);
+               return;
+       }
+
+       if (ch == 14)
+               param = param_sharp_14;
+       else
+               param = tx_shape_idx == 0 ? param_flat : param_sharp;
+
+       for (i = 0; i < __DFIR_CFG_NR; i++) {
+               addr = __DFIR_CFG_ADDR(i);
+               rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
+                           "set tx shape dfir: 0x%x: 0x%x\n", addr, param[i]);
+               rtw89_phy_write32_idx(rtwdev, addr, __DFIR_CFG_MASK, param[i],
+                                     phy_idx);
+       }
+
+#undef __DECL_DFIR_PARAM
+#undef __DFIR_CFG_NR
+#undef __DFIR_CFG_MASK
+#undef __DECL_CFG_ADDR
+}
+
+static void rtw8852b_set_tx_shape(struct rtw89_dev *rtwdev,
+                                 const struct rtw89_chan *chan,
+                                 enum rtw89_phy_idx phy_idx)
+{
+       u8 band = chan->band_type;
+       u8 regd = rtw89_regd_get(rtwdev, band);
+       u8 tx_shape_cck = rtw89_8852b_tx_shape[band][RTW89_RS_CCK][regd];
+       u8 tx_shape_ofdm = rtw89_8852b_tx_shape[band][RTW89_RS_OFDM][regd];
+
+       if (band == RTW89_BAND_2G)
+               rtw8852b_bb_set_tx_shape_dfir(rtwdev, tx_shape_cck, phy_idx);
+
+       rtw89_phy_write32_mask(rtwdev, R_DCFO_OPT, B_TXSHAPE_TRIANGULAR_CFG,
+                              tx_shape_ofdm);
+}
+
+static void rtw8852b_set_txpwr(struct rtw89_dev *rtwdev,
+                              const struct rtw89_chan *chan,
+                              enum rtw89_phy_idx phy_idx)
+{
+       rtw89_phy_set_txpwr_byrate(rtwdev, chan, phy_idx);
+       rtw89_phy_set_txpwr_offset(rtwdev, chan, phy_idx);
+       rtw8852b_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);
+}
+
+static void rtw8852b_set_txpwr_ctrl(struct rtw89_dev *rtwdev,
+                                   enum rtw89_phy_idx phy_idx)
+{
+       rtw8852b_set_txpwr_ref(rtwdev, phy_idx);
+}
+
+static
+void rtw8852b_set_txpwr_ul_tb_offset(struct rtw89_dev *rtwdev,
+                                    s8 pw_ofst, enum rtw89_mac_idx mac_idx)
+{
+       u32 reg;
+
+       if (pw_ofst < -16 || pw_ofst > 15) {
+               rtw89_warn(rtwdev, "[ULTB] Err pwr_offset=%d\n", pw_ofst);
+               return;
+       }
+
+       reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_CTRL, mac_idx);
+       rtw89_write32_set(rtwdev, reg, B_AX_PWR_UL_TB_CTRL_EN);
+
+       reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_1T, mac_idx);
+       rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_1T_MASK, pw_ofst);
+
+       pw_ofst = max_t(s8, pw_ofst - 3, -16);
+       reg = rtw89_mac_reg_by_idx(R_AX_PWR_UL_TB_2T, mac_idx);
+       rtw89_write32_mask(rtwdev, reg, B_AX_PWR_UL_TB_1T_MASK, pw_ofst);
+}
+
+static int
+rtw8852b_init_txpwr_unit(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
+{
+       int ret;
+
+       ret = rtw89_mac_txpwr_write32(rtwdev, phy_idx, R_AX_PWR_UL_CTRL2, 0x07763333);
+       if (ret)
+               return ret;
+
+       ret = rtw89_mac_txpwr_write32(rtwdev, phy_idx, R_AX_PWR_COEXT_CTRL, 0x01ebf000);
+       if (ret)
+               return ret;
+
+       ret = rtw89_mac_txpwr_write32(rtwdev, phy_idx, R_AX_PWR_UL_CTRL0, 0x0002f8ff);
+       if (ret)
+               return ret;
+
+       rtw8852b_set_txpwr_ul_tb_offset(rtwdev, 0, phy_idx == RTW89_PHY_1 ?
+                                                  RTW89_MAC_1 : RTW89_MAC_0);
+
+       return 0;
+}
+
+void rtw8852b_bb_set_plcp_tx(struct rtw89_dev *rtwdev)
+{
+       const struct rtw89_reg3_def *def = rtw8852b_pmac_ht20_mcs7_tbl;
+       u8 i;
+
+       for (i = 0; i < ARRAY_SIZE(rtw8852b_pmac_ht20_mcs7_tbl); i++, def++)
+               rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data);
+}
+
+static void rtw8852b_stop_pmac_tx(struct rtw89_dev *rtwdev,
+                                 struct rtw8852b_bb_pmac_info *tx_info,
+                                 enum rtw89_phy_idx idx)
+{
+       rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC Stop Tx");
+       if (tx_info->mode == CONT_TX)
+               rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_PRD, B_PMAC_CTX_EN, 0, idx);
+       else if (tx_info->mode == PKTS_TX)
+               rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_PRD, B_PMAC_PTX_EN, 0, idx);
+}
+
+static void rtw8852b_start_pmac_tx(struct rtw89_dev *rtwdev,
+                                  struct rtw8852b_bb_pmac_info *tx_info,
+                                  enum rtw89_phy_idx idx)
+{
+       enum rtw8852b_pmac_mode mode = tx_info->mode;
+       u32 pkt_cnt = tx_info->tx_cnt;
+       u16 period = tx_info->period;
+
+       if (mode == CONT_TX && !tx_info->is_cck) {
+               rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_PRD, B_PMAC_CTX_EN, 1, idx);
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC CTx Start");
+       } else if (mode == PKTS_TX) {
+               rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_PRD, B_PMAC_PTX_EN, 1, idx);
+               rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_PRD,
+                                     B_PMAC_TX_PRD_MSK, period, idx);
+               rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_CNT, B_PMAC_TX_CNT_MSK,
+                                     pkt_cnt, idx);
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC PTx Start");
+       }
+
+       rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_CTRL, B_PMAC_TXEN_DIS, 1, idx);
+       rtw89_phy_write32_idx(rtwdev, R_PMAC_TX_CTRL, B_PMAC_TXEN_DIS, 0, idx);
+}
+
+void rtw8852b_bb_set_pmac_tx(struct rtw89_dev *rtwdev,
+                            struct rtw8852b_bb_pmac_info *tx_info,
+                            enum rtw89_phy_idx idx)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+
+       if (!tx_info->en_pmac_tx) {
+               rtw8852b_stop_pmac_tx(rtwdev, tx_info, idx);
+               rtw89_phy_write32_idx(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0, idx);
+               if (chan->band_type == RTW89_BAND_2G)
+                       rtw89_phy_write32_clr(rtwdev, R_RXCCA, B_RXCCA_DIS);
+               return;
+       }
+
+       rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC Tx Enable");
+
+       rtw89_phy_write32_idx(rtwdev, R_PMAC_GNT, B_PMAC_GNT_TXEN, 1, idx);
+       rtw89_phy_write32_idx(rtwdev, R_PMAC_GNT, B_PMAC_GNT_RXEN, 1, idx);
+       rtw89_phy_write32_idx(rtwdev, R_PMAC_RX_CFG1, B_PMAC_OPT1_MSK, 0x3f, idx);
+       rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 0, idx);
+       rtw89_phy_write32_idx(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 1, idx);
+       rtw89_phy_write32_set(rtwdev, R_RXCCA, B_RXCCA_DIS);
+       rtw89_phy_write32_idx(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_ALL, 1, idx);
+
+       rtw8852b_start_pmac_tx(rtwdev, tx_info, idx);
+}
+
+void rtw8852b_bb_set_pmac_pkt_tx(struct rtw89_dev *rtwdev, u8 enable,
+                                u16 tx_cnt, u16 period, u16 tx_time,
+                                enum rtw89_phy_idx idx)
+{
+       struct rtw8852b_bb_pmac_info tx_info = {0};
+
+       tx_info.en_pmac_tx = enable;
+       tx_info.is_cck = 0;
+       tx_info.mode = PKTS_TX;
+       tx_info.tx_cnt = tx_cnt;
+       tx_info.period = period;
+       tx_info.tx_time = tx_time;
+
+       rtw8852b_bb_set_pmac_tx(rtwdev, &tx_info, idx);
+}
+
+void rtw8852b_bb_set_power(struct rtw89_dev *rtwdev, s16 pwr_dbm,
+                          enum rtw89_phy_idx idx)
+{
+       rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC CFG Tx PWR = %d", pwr_dbm);
+
+       rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_PWR_EN, 1, idx);
+       rtw89_phy_write32_idx(rtwdev, R_TXPWR, B_TXPWR_MSK, pwr_dbm, idx);
+}
+
+void rtw8852b_bb_cfg_tx_path(struct rtw89_dev *rtwdev, u8 tx_path)
+{
+       rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_MOD, 7, RTW89_PHY_0);
+
+       rtw89_debug(rtwdev, RTW89_DBG_TSSI, "PMAC CFG Tx Path = %d", tx_path);
+
+       if (tx_path == RF_PATH_A) {
+               rtw89_phy_write32_mask(rtwdev, R_TXPATH_SEL, B_TXPATH_SEL_MSK, 1);
+               rtw89_phy_write32_mask(rtwdev, R_TXNSS_MAP, B_TXNSS_MAP_MSK, 0);
+       } else if (tx_path == RF_PATH_B) {
+               rtw89_phy_write32_mask(rtwdev, R_TXPATH_SEL, B_TXPATH_SEL_MSK, 2);
+               rtw89_phy_write32_mask(rtwdev, R_TXNSS_MAP, B_TXNSS_MAP_MSK, 0);
+       } else if (tx_path == RF_PATH_AB) {
+               rtw89_phy_write32_mask(rtwdev, R_TXPATH_SEL, B_TXPATH_SEL_MSK, 3);
+               rtw89_phy_write32_mask(rtwdev, R_TXNSS_MAP, B_TXNSS_MAP_MSK, 4);
+       } else {
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI, "Error Tx Path");
+       }
+}
+
+void rtw8852b_bb_tx_mode_switch(struct rtw89_dev *rtwdev,
+                               enum rtw89_phy_idx idx, u8 mode)
+{
+       if (mode != 0)
+               return;
+
+       rtw89_debug(rtwdev, RTW89_DBG_TSSI, "Tx mode switch");
+
+       rtw89_phy_write32_idx(rtwdev, R_PMAC_GNT, B_PMAC_GNT_TXEN, 0, idx);
+       rtw89_phy_write32_idx(rtwdev, R_PMAC_GNT, B_PMAC_GNT_RXEN, 0, idx);
+       rtw89_phy_write32_idx(rtwdev, R_PMAC_RX_CFG1, B_PMAC_OPT1_MSK, 0, idx);
+       rtw89_phy_write32_idx(rtwdev, R_PMAC_RXMOD, B_PMAC_RXMOD_MSK, 0, idx);
+       rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_DPD_EN, 0, idx);
+       rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_MOD, 0, idx);
+       rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_PWR_EN, 0, idx);
+}
+
+void rtw8852b_bb_backup_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx idx,
+                            struct rtw8852b_bb_tssi_bak *bak)
+{
+       s32 tmp;
+
+       bak->tx_path = rtw89_phy_read32_idx(rtwdev, R_TXPATH_SEL, B_TXPATH_SEL_MSK, idx);
+       bak->rx_path = rtw89_phy_read32_idx(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, idx);
+       bak->p0_rfmode = rtw89_phy_read32_idx(rtwdev, R_P0_RFMODE, MASKDWORD, idx);
+       bak->p0_rfmode_ftm = rtw89_phy_read32_idx(rtwdev, R_P0_RFMODE_FTM_RX, MASKDWORD, idx);
+       bak->p1_rfmode = rtw89_phy_read32_idx(rtwdev, R_P1_RFMODE, MASKDWORD, idx);
+       bak->p1_rfmode_ftm = rtw89_phy_read32_idx(rtwdev, R_P1_RFMODE_FTM_RX, MASKDWORD, idx);
+       tmp = rtw89_phy_read32_idx(rtwdev, R_TXPWR, B_TXPWR_MSK, idx);
+       bak->tx_pwr = sign_extend32(tmp, 8);
+}
+
+void rtw8852b_bb_restore_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx idx,
+                             const struct rtw8852b_bb_tssi_bak *bak)
+{
+       rtw89_phy_write32_idx(rtwdev, R_TXPATH_SEL, B_TXPATH_SEL_MSK, bak->tx_path, idx);
+       if (bak->tx_path == RF_AB)
+               rtw89_phy_write32_mask(rtwdev, R_TXNSS_MAP, B_TXNSS_MAP_MSK, 0x4);
+       else
+               rtw89_phy_write32_mask(rtwdev, R_TXNSS_MAP, B_TXNSS_MAP_MSK, 0x0);
+       rtw89_phy_write32_idx(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, bak->rx_path, idx);
+       rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_PWR_EN, 1, idx);
+       rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE, MASKDWORD, bak->p0_rfmode, idx);
+       rtw89_phy_write32_idx(rtwdev, R_P0_RFMODE_FTM_RX, MASKDWORD, bak->p0_rfmode_ftm, idx);
+       rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE, MASKDWORD, bak->p1_rfmode, idx);
+       rtw89_phy_write32_idx(rtwdev, R_P1_RFMODE_FTM_RX, MASKDWORD, bak->p1_rfmode_ftm, idx);
+       rtw89_phy_write32_idx(rtwdev, R_TXPWR, B_TXPWR_MSK, bak->tx_pwr, idx);
+}
+
+static void rtw8852b_bb_ctrl_btc_preagc(struct rtw89_dev *rtwdev, bool bt_en)
+{
+       rtw89_phy_write_reg3_tbl(rtwdev, bt_en ? &rtw8852b_btc_preagc_en_defs_tbl :
+                                                &rtw8852b_btc_preagc_dis_defs_tbl);
+}
+
+static void rtw8852b_ctrl_btg(struct rtw89_dev *rtwdev, bool btg)
+{
+       if (btg) {
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_BT_SHARE_V1,
+                                      B_PATH0_BT_SHARE_V1, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_BTG_PATH_V1,
+                                      B_PATH0_BTG_PATH_V1, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_G_LNA6_OP1DB_V1,
+                                      B_PATH1_G_LNA6_OP1DB_V1, 0x20);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_G_TIA0_LNA6_OP1DB_V1,
+                                      B_PATH1_G_TIA0_LNA6_OP1DB_V1, 0x30);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_BT_SHARE_V1,
+                                      B_PATH1_BT_SHARE_V1, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_BTG_PATH_V1,
+                                      B_PATH1_BTG_PATH_V1, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PMAC_GNT, B_PMAC_GNT_P1, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_BT_SHARE, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_BT_SEG0, 0x2);
+               rtw89_phy_write32_mask(rtwdev, R_BT_DYN_DC_EST_EN_V1,
+                                      B_BT_DYN_DC_EST_EN_MSK, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_GNT_BT_WGT_EN, B_GNT_BT_WGT_EN, 0x1);
+       } else {
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_BT_SHARE_V1,
+                                      B_PATH0_BT_SHARE_V1, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH0_BTG_PATH_V1,
+                                      B_PATH0_BTG_PATH_V1, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_G_LNA6_OP1DB_V1,
+                                      B_PATH1_G_LNA6_OP1DB_V1, 0x1a);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_G_TIA0_LNA6_OP1DB_V1,
+                                      B_PATH1_G_TIA0_LNA6_OP1DB_V1, 0x2a);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_BT_SHARE_V1,
+                                      B_PATH1_BT_SHARE_V1, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_BTG_PATH_V1,
+                                      B_PATH1_BTG_PATH_V1, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PMAC_GNT, B_PMAC_GNT_P1, 0xc);
+               rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_BT_SHARE, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_BT_SEG0, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_BT_DYN_DC_EST_EN_V1,
+                                      B_BT_DYN_DC_EST_EN_MSK, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_GNT_BT_WGT_EN, B_GNT_BT_WGT_EN, 0x0);
+       }
+}
+
+void rtw8852b_bb_ctrl_rx_path(struct rtw89_dev *rtwdev,
+                             enum rtw89_rf_path_bit rx_path)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       u32 rst_mask0;
+       u32 rst_mask1;
+
+       if (rx_path == RF_A) {
+               rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, 1);
+               rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG0, 1);
+               rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG1, 1);
+               rtw89_phy_write32_mask(rtwdev, R_RXHT_MCS_LIMIT, B_RXHT_MCS_LIMIT, 0);
+               rtw89_phy_write32_mask(rtwdev, R_RXVHT_MCS_LIMIT, B_RXVHT_MCS_LIMIT, 0);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_USER_MAX, 4);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_MAX_NSS, 0);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHETB_MAX_NSS, 0);
+       } else if (rx_path == RF_B) {
+               rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, 2);
+               rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG0, 2);
+               rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG1, 2);
+               rtw89_phy_write32_mask(rtwdev, R_RXHT_MCS_LIMIT, B_RXHT_MCS_LIMIT, 0);
+               rtw89_phy_write32_mask(rtwdev, R_RXVHT_MCS_LIMIT, B_RXVHT_MCS_LIMIT, 0);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_USER_MAX, 4);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_MAX_NSS, 0);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHETB_MAX_NSS, 0);
+       } else if (rx_path == RF_AB) {
+               rtw89_phy_write32_mask(rtwdev, R_CHBW_MOD_V1, B_ANT_RX_SEG0, 3);
+               rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG0, 3);
+               rtw89_phy_write32_mask(rtwdev, R_FC0_BW_V1, B_ANT_RX_1RCCA_SEG1, 3);
+               rtw89_phy_write32_mask(rtwdev, R_RXHT_MCS_LIMIT, B_RXHT_MCS_LIMIT, 1);
+               rtw89_phy_write32_mask(rtwdev, R_RXVHT_MCS_LIMIT, B_RXVHT_MCS_LIMIT, 1);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_USER_MAX, 4);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_MAX_NSS, 1);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHETB_MAX_NSS, 1);
+       }
+
+       rtw8852b_set_gain_offset(rtwdev, chan->subband_type, RTW89_PHY_0);
+
+       if (chan->band_type == RTW89_BAND_2G &&
+           (rx_path == RF_B || rx_path == RF_AB))
+               rtw8852b_ctrl_btg(rtwdev, true);
+       else
+               rtw8852b_ctrl_btg(rtwdev, false);
+
+       rst_mask0 = B_P0_TXPW_RSTB_MANON | B_P0_TXPW_RSTB_TSSI;
+       rst_mask1 = B_P1_TXPW_RSTB_MANON | B_P1_TXPW_RSTB_TSSI;
+       if (rx_path == RF_A) {
+               rtw89_phy_write32_mask(rtwdev, R_P0_TXPW_RSTB, rst_mask0, 1);
+               rtw89_phy_write32_mask(rtwdev, R_P0_TXPW_RSTB, rst_mask0, 3);
+       } else {
+               rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_RSTB, rst_mask1, 1);
+               rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_RSTB, rst_mask1, 3);
+       }
+}
+
+static void rtw8852b_bb_ctrl_rf_mode_rx_path(struct rtw89_dev *rtwdev,
+                                            enum rtw89_rf_path_bit rx_path)
+{
+       if (rx_path == RF_A) {
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE,
+                                      B_P0_RFMODE_ORI_TXRX_FTM_TX, 0x1233312);
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE_FTM_RX,
+                                      B_P0_RFMODE_FTM_RX, 0x333);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE,
+                                      B_P1_RFMODE_ORI_TXRX_FTM_TX, 0x1111111);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE_FTM_RX,
+                                      B_P1_RFMODE_FTM_RX, 0x111);
+       } else if (rx_path == RF_B) {
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE,
+                                      B_P0_RFMODE_ORI_TXRX_FTM_TX, 0x1111111);
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE_FTM_RX,
+                                      B_P0_RFMODE_FTM_RX, 0x111);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE,
+                                      B_P1_RFMODE_ORI_TXRX_FTM_TX, 0x1233312);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE_FTM_RX,
+                                      B_P1_RFMODE_FTM_RX, 0x333);
+       } else if (rx_path == RF_AB) {
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE,
+                                      B_P0_RFMODE_ORI_TXRX_FTM_TX, 0x1233312);
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE_FTM_RX,
+                                      B_P0_RFMODE_FTM_RX, 0x333);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE,
+                                      B_P1_RFMODE_ORI_TXRX_FTM_TX, 0x1233312);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE_FTM_RX,
+                                      B_P1_RFMODE_FTM_RX, 0x333);
+       }
+}
+
+static void rtw8852b_bb_cfg_txrx_path(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_hal *hal = &rtwdev->hal;
+       enum rtw89_rf_path_bit rx_path = hal->antenna_rx ? hal->antenna_rx : RF_AB;
+
+       rtw8852b_bb_ctrl_rx_path(rtwdev, rx_path);
+       rtw8852b_bb_ctrl_rf_mode_rx_path(rtwdev, rx_path);
+
+       if (rtwdev->hal.rx_nss == 1) {
+               rtw89_phy_write32_mask(rtwdev, R_RXHT_MCS_LIMIT, B_RXHT_MCS_LIMIT, 0);
+               rtw89_phy_write32_mask(rtwdev, R_RXVHT_MCS_LIMIT, B_RXVHT_MCS_LIMIT, 0);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_MAX_NSS, 0);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHETB_MAX_NSS, 0);
+       } else {
+               rtw89_phy_write32_mask(rtwdev, R_RXHT_MCS_LIMIT, B_RXHT_MCS_LIMIT, 1);
+               rtw89_phy_write32_mask(rtwdev, R_RXVHT_MCS_LIMIT, B_RXVHT_MCS_LIMIT, 1);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHE_MAX_NSS, 1);
+               rtw89_phy_write32_mask(rtwdev, R_RXHE, B_RXHETB_MAX_NSS, 1);
+       }
+
+       rtw89_phy_write32_idx(rtwdev, R_MAC_SEL, B_MAC_SEL_MOD, 0x0, RTW89_PHY_0);
+}
+
+static u8 rtw8852b_get_thermal(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path)
+{
+       if (rtwdev->is_tssi_mode[rf_path]) {
+               u32 addr = 0x1c10 + (rf_path << 13);
+
+               return rtw89_phy_read32_mask(rtwdev, addr, 0x3F000000);
+       }
+
+       rtw89_write_rf(rtwdev, rf_path, RR_TM, RR_TM_TRI, 0x1);
+       rtw89_write_rf(rtwdev, rf_path, RR_TM, RR_TM_TRI, 0x0);
+       rtw89_write_rf(rtwdev, rf_path, RR_TM, RR_TM_TRI, 0x1);
+
+       fsleep(200);
+
+       return rtw89_read_rf(rtwdev, rf_path, RR_TM, RR_TM_VAL);
+}
+
+static void rtw8852b_btc_set_rfe(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_btc *btc = &rtwdev->btc;
+       struct rtw89_btc_module *module = &btc->mdinfo;
+
+       module->rfe_type = rtwdev->efuse.rfe_type;
+       module->cv = rtwdev->hal.cv;
+       module->bt_solo = 0;
+       module->switch_type = BTC_SWITCH_INTERNAL;
+
+       if (module->rfe_type > 0)
+               module->ant.num = module->rfe_type % 2 ? 2 : 3;
+       else
+               module->ant.num = 2;
+
+       module->ant.diversity = 0;
+       module->ant.isolation = 10;
+
+       if (module->ant.num == 3) {
+               module->ant.type = BTC_ANT_DEDICATED;
+               module->bt_pos = BTC_BT_ALONE;
+       } else {
+               module->ant.type = BTC_ANT_SHARED;
+               module->bt_pos = BTC_BT_BTG;
+       }
+}
+
+static
+void rtw8852b_set_trx_mask(struct rtw89_dev *rtwdev, u8 path, u8 group, u32 val)
+{
+       rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x20000);
+       rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, group);
+       rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, val);
+       rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x0);
+}
+
+static void rtw8852b_btc_init_cfg(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_btc *btc = &rtwdev->btc;
+       struct rtw89_btc_module *module = &btc->mdinfo;
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+       const struct rtw89_mac_ax_coex coex_params = {
+               .pta_mode = RTW89_MAC_AX_COEX_RTK_MODE,
+               .direction = RTW89_MAC_AX_COEX_INNER,
+       };
+
+       /* PTA init  */
+       rtw89_mac_coex_init(rtwdev, &coex_params);
+
+       /* set WL Tx response = Hi-Pri */
+       chip->ops->btc_set_wl_pri(rtwdev, BTC_PRI_MASK_TX_RESP, true);
+       chip->ops->btc_set_wl_pri(rtwdev, BTC_PRI_MASK_BEACON, true);
+
+       /* set rf gnt debug off */
+       rtw89_write_rf(rtwdev, RF_PATH_A, RR_WLSEL, RFREG_MASK, 0x0);
+       rtw89_write_rf(rtwdev, RF_PATH_B, RR_WLSEL, RFREG_MASK, 0x0);
+
+       /* set WL Tx thru in TRX mask table if GNT_WL = 0 && BT_S1 = ss group */
+       if (module->ant.type == BTC_ANT_SHARED) {
+               rtw8852b_set_trx_mask(rtwdev, RF_PATH_A, BTC_BT_SS_GROUP, 0x5ff);
+               rtw8852b_set_trx_mask(rtwdev, RF_PATH_B, BTC_BT_SS_GROUP, 0x5ff);
+               /* set path-A(S0) Tx/Rx no-mask if GNT_WL=0 && BT_S1=tx group */
+               rtw8852b_set_trx_mask(rtwdev, RF_PATH_A, BTC_BT_TX_GROUP, 0x5ff);
+               rtw8852b_set_trx_mask(rtwdev, RF_PATH_B, BTC_BT_TX_GROUP, 0x55f);
+       } else { /* set WL Tx stb if GNT_WL = 0 && BT_S1 = ss group for 3-ant */
+               rtw8852b_set_trx_mask(rtwdev, RF_PATH_A, BTC_BT_SS_GROUP, 0x5df);
+               rtw8852b_set_trx_mask(rtwdev, RF_PATH_B, BTC_BT_SS_GROUP, 0x5df);
+               rtw8852b_set_trx_mask(rtwdev, RF_PATH_A, BTC_BT_TX_GROUP, 0x5ff);
+               rtw8852b_set_trx_mask(rtwdev, RF_PATH_B, BTC_BT_TX_GROUP, 0x5ff);
+       }
+
+       /* set PTA break table */
+       rtw89_write32(rtwdev, R_BTC_BREAK_TABLE, BTC_BREAK_PARAM);
+
+        /* enable BT counter 0xda40[16,2] = 2b'11 */
+       rtw89_write32_set(rtwdev, R_AX_CSR_MODE, B_AX_BT_CNT_RST | B_AX_STATIS_BT_EN);
+       btc->cx.wl.status.map.init_ok = true;
+}
+
+static
+void rtw8852b_btc_set_wl_pri(struct rtw89_dev *rtwdev, u8 map, bool state)
+{
+       u32 bitmap;
+       u32 reg;
+
+       switch (map) {
+       case BTC_PRI_MASK_TX_RESP:
+               reg = R_BTC_BT_COEX_MSK_TABLE;
+               bitmap = B_BTC_PRI_MASK_TX_RESP_V1;
+               break;
+       case BTC_PRI_MASK_BEACON:
+               reg = R_AX_WL_PRI_MSK;
+               bitmap = B_AX_PTA_WL_PRI_MASK_BCNQ;
+               break;
+       case BTC_PRI_MASK_RX_CCK:
+               reg = R_BTC_BT_COEX_MSK_TABLE;
+               bitmap = B_BTC_PRI_MASK_RXCCK_V1;
+               break;
+       default:
+               return;
+       }
+
+       if (state)
+               rtw89_write32_set(rtwdev, reg, bitmap);
+       else
+               rtw89_write32_clr(rtwdev, reg, bitmap);
+}
+
+union rtw8852b_btc_wl_txpwr_ctrl {
+       u32 txpwr_val;
+       struct {
+               union {
+                       u16 ctrl_all_time;
+                       struct {
+                               s16 data:9;
+                               u16 rsvd:6;
+                               u16 flag:1;
+                       } all_time;
+               };
+               union {
+                       u16 ctrl_gnt_bt;
+                       struct {
+                               s16 data:9;
+                               u16 rsvd:7;
+                       } gnt_bt;
+               };
+       };
+} __packed;
+
+static void
+rtw8852b_btc_set_wl_txpwr_ctrl(struct rtw89_dev *rtwdev, u32 txpwr_val)
+{
+       union rtw8852b_btc_wl_txpwr_ctrl arg = { .txpwr_val = txpwr_val };
+       s32 val;
+
+#define __write_ctrl(_reg, _msk, _val, _en, _cond)             \
+do {                                                           \
+       u32 _wrt = FIELD_PREP(_msk, _val);                      \
+       BUILD_BUG_ON(!!(_msk & _en));                           \
+       if (_cond)                                              \
+               _wrt |= _en;                                    \
+       else                                                    \
+               _wrt &= ~_en;                                   \
+       rtw89_mac_txpwr_write32_mask(rtwdev, RTW89_PHY_0, _reg, \
+                                    _msk | _en, _wrt);         \
+} while (0)
+
+       switch (arg.ctrl_all_time) {
+       case 0xffff:
+               val = 0;
+               break;
+       default:
+               val = arg.all_time.data;
+               break;
+       }
+
+       __write_ctrl(R_AX_PWR_RATE_CTRL, B_AX_FORCE_PWR_BY_RATE_VALUE_MASK,
+                    val, B_AX_FORCE_PWR_BY_RATE_EN,
+                    arg.ctrl_all_time != 0xffff);
+
+       switch (arg.ctrl_gnt_bt) {
+       case 0xffff:
+               val = 0;
+               break;
+       default:
+               val = arg.gnt_bt.data;
+               break;
+       }
+
+       __write_ctrl(R_AX_PWR_COEXT_CTRL, B_AX_TXAGC_BT_MASK, val,
+                    B_AX_TXAGC_BT_EN, arg.ctrl_gnt_bt != 0xffff);
+
+#undef __write_ctrl
+}
+
+static
+s8 rtw8852b_btc_get_bt_rssi(struct rtw89_dev *rtwdev, s8 val)
+{
+       return clamp_t(s8, val, -100, 0) + 100;
+}
+
+static
+void rtw8852b_btc_update_bt_cnt(struct rtw89_dev *rtwdev)
+{
+       /* Feature move to firmware */
+}
+
+static void rtw8852b_btc_wl_s1_standby(struct rtw89_dev *rtwdev, bool state)
+{
+       rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x80000);
+       rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWA, RFREG_MASK, 0x1);
+       rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD1, RFREG_MASK, 0x31);
+
+       /* set WL standby = Rx for GNT_BT_Tx = 1->0 settle issue */
+       if (state)
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x579);
+       else
+               rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWD0, RFREG_MASK, 0x20);
+
+       rtw89_write_rf(rtwdev, RF_PATH_B, RR_LUTWE, RFREG_MASK, 0x0);
+}
+
+static void rtw8852b_btc_set_wl_rx_gain(struct rtw89_dev *rtwdev, u32 level)
+{
+}
+
+static void rtw8852b_fill_freq_with_ppdu(struct rtw89_dev *rtwdev,
+                                        struct rtw89_rx_phy_ppdu *phy_ppdu,
+                                        struct ieee80211_rx_status *status)
+{
+       u16 chan = phy_ppdu->chan_idx;
+       u8 band;
+
+       if (chan == 0)
+               return;
+
+       band = chan <= 14 ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
+       status->freq = ieee80211_channel_to_frequency(chan, band);
+       status->band = band;
+}
+
+static void rtw8852b_query_ppdu(struct rtw89_dev *rtwdev,
+                               struct rtw89_rx_phy_ppdu *phy_ppdu,
+                               struct ieee80211_rx_status *status)
+{
+       u8 path;
+       u8 *rx_power = phy_ppdu->rssi;
+
+       status->signal = RTW89_RSSI_RAW_TO_DBM(max(rx_power[RF_PATH_A], rx_power[RF_PATH_B]));
+       for (path = 0; path < rtwdev->chip->rf_path_num; path++) {
+               status->chains |= BIT(path);
+               status->chain_signal[path] = RTW89_RSSI_RAW_TO_DBM(rx_power[path]);
+       }
+       if (phy_ppdu->valid)
+               rtw8852b_fill_freq_with_ppdu(rtwdev, phy_ppdu, status);
+}
+
 static int rtw8852b_mac_enable_bb_rf(struct rtw89_dev *rtwdev)
 {
        int ret;
@@ -75,13 +2374,148 @@ static int rtw8852b_mac_disable_bb_rf(struct rtw89_dev *rtwdev)
 static const struct rtw89_chip_ops rtw8852b_chip_ops = {
        .enable_bb_rf           = rtw8852b_mac_enable_bb_rf,
        .disable_bb_rf          = rtw8852b_mac_disable_bb_rf,
+       .bb_reset               = rtw8852b_bb_reset,
+       .bb_sethw               = rtw8852b_bb_sethw,
+       .read_rf                = rtw89_phy_read_rf_v1,
+       .write_rf               = rtw89_phy_write_rf_v1,
+       .set_channel            = rtw8852b_set_channel,
+       .set_channel_help       = rtw8852b_set_channel_help,
+       .read_efuse             = rtw8852b_read_efuse,
+       .read_phycap            = rtw8852b_read_phycap,
+       .fem_setup              = NULL,
+       .rfk_init               = rtw8852b_rfk_init,
+       .rfk_channel            = rtw8852b_rfk_channel,
+       .rfk_band_changed       = rtw8852b_rfk_band_changed,
+       .rfk_scan               = rtw8852b_rfk_scan,
+       .rfk_track              = rtw8852b_rfk_track,
+       .power_trim             = rtw8852b_power_trim,
+       .set_txpwr              = rtw8852b_set_txpwr,
+       .set_txpwr_ctrl         = rtw8852b_set_txpwr_ctrl,
+       .init_txpwr_unit        = rtw8852b_init_txpwr_unit,
+       .get_thermal            = rtw8852b_get_thermal,
+       .ctrl_btg               = rtw8852b_ctrl_btg,
+       .query_ppdu             = rtw8852b_query_ppdu,
+       .bb_ctrl_btc_preagc     = rtw8852b_bb_ctrl_btc_preagc,
+       .cfg_txrx_path          = rtw8852b_bb_cfg_txrx_path,
+       .set_txpwr_ul_tb_offset = rtw8852b_set_txpwr_ul_tb_offset,
+       .pwr_on_func            = rtw8852b_pwr_on_func,
+       .pwr_off_func           = rtw8852b_pwr_off_func,
+       .fill_txdesc            = rtw89_core_fill_txdesc,
+       .fill_txdesc_fwcmd      = rtw89_core_fill_txdesc,
+       .cfg_ctrl_path          = rtw89_mac_cfg_ctrl_path,
+       .mac_cfg_gnt            = rtw89_mac_cfg_gnt,
+       .stop_sch_tx            = rtw89_mac_stop_sch_tx,
+       .resume_sch_tx          = rtw89_mac_resume_sch_tx,
+       .h2c_dctl_sec_cam       = NULL,
+
+       .btc_set_rfe            = rtw8852b_btc_set_rfe,
+       .btc_init_cfg           = rtw8852b_btc_init_cfg,
+       .btc_set_wl_pri         = rtw8852b_btc_set_wl_pri,
+       .btc_set_wl_txpwr_ctrl  = rtw8852b_btc_set_wl_txpwr_ctrl,
+       .btc_get_bt_rssi        = rtw8852b_btc_get_bt_rssi,
+       .btc_update_bt_cnt      = rtw8852b_btc_update_bt_cnt,
+       .btc_wl_s1_standby      = rtw8852b_btc_wl_s1_standby,
+       .btc_set_wl_rx_gain     = rtw8852b_btc_set_wl_rx_gain,
+       .btc_set_policy         = rtw89_btc_set_policy,
 };
 
 const struct rtw89_chip_info rtw8852b_chip_info = {
        .chip_id                = RTL8852B,
+       .ops                    = &rtw8852b_chip_ops,
+       .fw_name                = "rtw89/rtw8852b_fw.bin",
        .fifo_size              = 196608,
        .dle_scc_rsvd_size      = 98304,
+       .max_amsdu_limit        = 3500,
+       .dis_2g_40m_ul_ofdma    = true,
+       .rsvd_ple_ofst          = 0x2f800,
+       .hfc_param_ini          = rtw8852b_hfc_param_ini_pcie,
        .dle_mem                = rtw8852b_dle_mem_pcie,
+       .rf_base_addr           = {0xe000, 0xf000},
+       .pwr_on_seq             = NULL,
+       .pwr_off_seq            = NULL,
+       .bb_table               = &rtw89_8852b_phy_bb_table,
+       .bb_gain_table          = &rtw89_8852b_phy_bb_gain_table,
+       .rf_table               = {&rtw89_8852b_phy_radioa_table,
+                                  &rtw89_8852b_phy_radiob_table,},
+       .nctl_table             = &rtw89_8852b_phy_nctl_table,
+       .byr_table              = &rtw89_8852b_byr_table,
+       .txpwr_lmt_2g           = &rtw89_8852b_txpwr_lmt_2g,
+       .txpwr_lmt_5g           = &rtw89_8852b_txpwr_lmt_5g,
+       .txpwr_lmt_ru_2g        = &rtw89_8852b_txpwr_lmt_ru_2g,
+       .txpwr_lmt_ru_5g        = &rtw89_8852b_txpwr_lmt_ru_5g,
+       .txpwr_factor_rf        = 2,
+       .txpwr_factor_mac       = 1,
+       .dig_table              = NULL,
+       .dig_regs               = &rtw8852b_dig_regs,
+       .tssi_dbw_table         = NULL,
+       .support_chanctx_num    = 0,
+       .support_bands          = BIT(NL80211_BAND_2GHZ) |
+                                 BIT(NL80211_BAND_5GHZ),
+       .support_bw160          = false,
+       .hw_sec_hdr             = false,
+       .rf_path_num            = 2,
+       .tx_nss                 = 2,
+       .rx_nss                 = 2,
+       .acam_num               = 128,
+       .bcam_num               = 10,
+       .scam_num               = 128,
+       .bacam_num              = 2,
+       .bacam_dynamic_num      = 4,
+       .bacam_v1               = false,
+       .sec_ctrl_efuse_size    = 4,
+       .physical_efuse_size    = 1216,
+       .logical_efuse_size     = 2048,
+       .limit_efuse_size       = 1280,
+       .dav_phy_efuse_size     = 96,
+       .dav_log_efuse_size     = 16,
+       .phycap_addr            = 0x580,
+       .phycap_size            = 128,
+       .para_ver               = 0,
+       .wlcx_desired           = 0x05050000,
+       .btcx_desired           = 0x5,
+       .scbd                   = 0x1,
+       .mailbox                = 0x1,
+       .btc_fwinfo_buf         = 1024,
+
+       .fcxbtcrpt_ver          = 1,
+       .fcxtdma_ver            = 1,
+       .fcxslots_ver           = 1,
+       .fcxcysta_ver           = 2,
+       .fcxstep_ver            = 2,
+       .fcxnullsta_ver         = 1,
+       .fcxmreg_ver            = 1,
+       .fcxgpiodbg_ver         = 1,
+       .fcxbtver_ver           = 1,
+       .fcxbtscan_ver          = 1,
+       .fcxbtafh_ver           = 1,
+       .fcxbtdevinfo_ver       = 1,
+       .afh_guard_ch           = 6,
+       .wl_rssi_thres          = rtw89_btc_8852b_wl_rssi_thres,
+       .bt_rssi_thres          = rtw89_btc_8852b_bt_rssi_thres,
+       .rssi_tol               = 2,
+       .mon_reg_num            = ARRAY_SIZE(rtw89_btc_8852b_mon_reg),
+       .mon_reg                = rtw89_btc_8852b_mon_reg,
+       .rf_para_ulink_num      = ARRAY_SIZE(rtw89_btc_8852b_rf_ul),
+       .rf_para_ulink          = rtw89_btc_8852b_rf_ul,
+       .rf_para_dlink_num      = ARRAY_SIZE(rtw89_btc_8852b_rf_dl),
+       .rf_para_dlink          = rtw89_btc_8852b_rf_dl,
+       .ps_mode_supported      = BIT(RTW89_PS_MODE_RFOFF) |
+                                 BIT(RTW89_PS_MODE_CLK_GATED) |
+                                 BIT(RTW89_PS_MODE_PWR_GATED),
+       .low_power_hci_modes    = 0,
+       .h2c_cctl_func_id       = H2C_FUNC_MAC_CCTLINFO_UD,
+       .hci_func_en_addr       = R_AX_HCI_FUNC_EN,
+       .h2c_desc_size          = sizeof(struct rtw89_txwd_body),
+       .txwd_body_size         = sizeof(struct rtw89_txwd_body),
+       .h2c_ctrl_reg           = R_AX_H2CREG_CTRL,
+       .h2c_regs               = rtw8852b_h2c_regs,
+       .c2h_ctrl_reg           = R_AX_C2HREG_CTRL,
+       .c2h_regs               = rtw8852b_c2h_regs,
+       .page_regs              = &rtw8852b_page_regs,
+       .dcfo_comp              = &rtw8852b_dcfo_comp,
+       .dcfo_comp_sft          = 3,
+       .imr_info               = &rtw8852b_imr_info,
+       .rrsr_cfgs              = &rtw8852b_rrsr_cfgs,
        .dma_ch_mask            = BIT(RTW89_DMA_ACH4) | BIT(RTW89_DMA_ACH5) |
                                  BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) |
                                  BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b.h b/drivers/net/wireless/realtek/rtw89/rtw8852b.h
new file mode 100644 (file)
index 0000000..4f9b3d4
--- /dev/null
@@ -0,0 +1,137 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/* Copyright(c) 2019-2022  Realtek Corporation
+ */
+
+#ifndef __RTW89_8852B_H__
+#define __RTW89_8852B_H__
+
+#include "core.h"
+
+#define RF_PATH_NUM_8852B 2
+#define BB_PATH_NUM_8852B 2
+
+enum rtw8852b_pmac_mode {
+       NONE_TEST,
+       PKTS_TX,
+       PKTS_RX,
+       CONT_TX
+};
+
+struct rtw8852b_u_efuse {
+       u8 rsvd[0x88];
+       u8 mac_addr[ETH_ALEN];
+};
+
+struct rtw8852b_e_efuse {
+       u8 mac_addr[ETH_ALEN];
+};
+
+struct rtw8852b_tssi_offset {
+       u8 cck_tssi[TSSI_CCK_CH_GROUP_NUM];
+       u8 bw40_tssi[TSSI_MCS_2G_CH_GROUP_NUM];
+       u8 rsvd[7];
+       u8 bw40_1s_tssi_5g[TSSI_MCS_5G_CH_GROUP_NUM];
+} __packed;
+
+struct rtw8852b_efuse {
+       u8 rsvd[0x210];
+       struct rtw8852b_tssi_offset path_a_tssi;
+       u8 rsvd1[10];
+       struct rtw8852b_tssi_offset path_b_tssi;
+       u8 rsvd2[94];
+       u8 channel_plan;
+       u8 xtal_k;
+       u8 rsvd3;
+       u8 iqk_lck;
+       u8 rsvd4[5];
+       u8 reg_setting:2;
+       u8 tx_diversity:1;
+       u8 rx_diversity:2;
+       u8 ac_mode:1;
+       u8 module_type:2;
+       u8 rsvd5;
+       u8 shared_ant:1;
+       u8 coex_type:3;
+       u8 ant_iso:1;
+       u8 radio_on_off:1;
+       u8 rsvd6:2;
+       u8 eeprom_version;
+       u8 customer_id;
+       u8 tx_bb_swing_2g;
+       u8 tx_bb_swing_5g;
+       u8 tx_cali_pwr_trk_mode;
+       u8 trx_path_selection;
+       u8 rfe_type;
+       u8 country_code[2];
+       u8 rsvd7[3];
+       u8 path_a_therm;
+       u8 path_b_therm;
+       u8 rsvd8[2];
+       u8 rx_gain_2g_ofdm;
+       u8 rsvd9;
+       u8 rx_gain_2g_cck;
+       u8 rsvd10;
+       u8 rx_gain_5g_low;
+       u8 rsvd11;
+       u8 rx_gain_5g_mid;
+       u8 rsvd12;
+       u8 rx_gain_5g_high;
+       u8 rsvd13[35];
+       u8 path_a_cck_pwr_idx[6];
+       u8 path_a_bw40_1tx_pwr_idx[5];
+       u8 path_a_ofdm_1tx_pwr_idx_diff:4;
+       u8 path_a_bw20_1tx_pwr_idx_diff:4;
+       u8 path_a_bw20_2tx_pwr_idx_diff:4;
+       u8 path_a_bw40_2tx_pwr_idx_diff:4;
+       u8 path_a_cck_2tx_pwr_idx_diff:4;
+       u8 path_a_ofdm_2tx_pwr_idx_diff:4;
+       u8 rsvd14[0xf2];
+       union {
+               struct rtw8852b_u_efuse u;
+               struct rtw8852b_e_efuse e;
+       };
+} __packed;
+
+struct rtw8852b_bb_pmac_info {
+       u8 en_pmac_tx:1;
+       u8 is_cck:1;
+       u8 mode:3;
+       u8 rsvd:3;
+       u16 tx_cnt;
+       u16 period;
+       u16 tx_time;
+       u8 duty_cycle;
+};
+
+struct rtw8852b_bb_tssi_bak {
+       u8 tx_path;
+       u8 rx_path;
+       u32 p0_rfmode;
+       u32 p0_rfmode_ftm;
+       u32 p1_rfmode;
+       u32 p1_rfmode_ftm;
+       s16 tx_pwr; /* S9 */
+};
+
+extern const struct rtw89_chip_info rtw8852b_chip_info;
+
+void rtw8852b_bb_set_plcp_tx(struct rtw89_dev *rtwdev);
+void rtw8852b_bb_set_pmac_tx(struct rtw89_dev *rtwdev,
+                            struct rtw8852b_bb_pmac_info *tx_info,
+                            enum rtw89_phy_idx idx);
+void rtw8852b_bb_set_pmac_pkt_tx(struct rtw89_dev *rtwdev, u8 enable,
+                                u16 tx_cnt, u16 period, u16 tx_time,
+                                enum rtw89_phy_idx idx);
+void rtw8852b_bb_set_power(struct rtw89_dev *rtwdev, s16 pwr_dbm,
+                          enum rtw89_phy_idx idx);
+void rtw8852b_bb_cfg_tx_path(struct rtw89_dev *rtwdev, u8 tx_path);
+void rtw8852b_bb_ctrl_rx_path(struct rtw89_dev *rtwdev,
+                             enum rtw89_rf_path_bit rx_path);
+void rtw8852b_bb_tx_mode_switch(struct rtw89_dev *rtwdev,
+                               enum rtw89_phy_idx idx, u8 mode);
+void rtw8852b_bb_backup_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx idx,
+                            struct rtw8852b_bb_tssi_bak *bak);
+void rtw8852b_bb_restore_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx idx,
+                             const struct rtw8852b_bb_tssi_bak *bak);
+
+#endif
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c b/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.c
new file mode 100644 (file)
index 0000000..8fd0150
--- /dev/null
@@ -0,0 +1,4174 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2019-2022  Realtek Corporation
+ */
+
+#include "coex.h"
+#include "debug.h"
+#include "mac.h"
+#include "phy.h"
+#include "reg.h"
+#include "rtw8852b.h"
+#include "rtw8852b_rfk.h"
+#include "rtw8852b_rfk_table.h"
+#include "rtw8852b_table.h"
+
+#define RTW8852B_RXDCK_VER 0x1
+#define RTW8852B_IQK_VER 0x2a
+#define RTW8852B_IQK_SS 2
+#define RTW8852B_RXK_GROUP_NR 4
+#define RTW8852B_TSSI_PATH_NR 2
+#define RTW8852B_RF_REL_VERSION 34
+#define RTW8852B_DPK_VER 0x0d
+#define RTW8852B_DPK_RF_PATH 2
+#define RTW8852B_DPK_KIP_REG_NUM 2
+
+#define _TSSI_DE_MASK GENMASK(21, 12)
+#define ADDC_T_AVG 100
+#define DPK_TXAGC_LOWER 0x2e
+#define DPK_TXAGC_UPPER 0x3f
+#define DPK_TXAGC_INVAL 0xff
+#define RFREG_MASKRXBB 0x003e0
+#define RFREG_MASKMODE 0xf0000
+
+enum rtw8852b_dpk_id {
+       LBK_RXIQK       = 0x06,
+       SYNC            = 0x10,
+       MDPK_IDL        = 0x11,
+       MDPK_MPA        = 0x12,
+       GAIN_LOSS       = 0x13,
+       GAIN_CAL        = 0x14,
+       DPK_RXAGC       = 0x15,
+       KIP_PRESET      = 0x16,
+       KIP_RESTORE     = 0x17,
+       DPK_TXAGC       = 0x19,
+       D_KIP_PRESET    = 0x28,
+       D_TXAGC         = 0x29,
+       D_RXAGC         = 0x2a,
+       D_SYNC          = 0x2b,
+       D_GAIN_LOSS     = 0x2c,
+       D_MDPK_IDL      = 0x2d,
+       D_GAIN_NORM     = 0x2f,
+       D_KIP_THERMAL   = 0x30,
+       D_KIP_RESTORE   = 0x31
+};
+
+enum dpk_agc_step {
+       DPK_AGC_STEP_SYNC_DGAIN,
+       DPK_AGC_STEP_GAIN_ADJ,
+       DPK_AGC_STEP_GAIN_LOSS_IDX,
+       DPK_AGC_STEP_GL_GT_CRITERION,
+       DPK_AGC_STEP_GL_LT_CRITERION,
+       DPK_AGC_STEP_SET_TX_GAIN,
+};
+
+enum rtw8852b_iqk_type {
+       ID_TXAGC = 0x0,
+       ID_FLOK_COARSE = 0x1,
+       ID_FLOK_FINE = 0x2,
+       ID_TXK = 0x3,
+       ID_RXAGC = 0x4,
+       ID_RXK = 0x5,
+       ID_NBTXK = 0x6,
+       ID_NBRXK = 0x7,
+       ID_FLOK_VBUFFER = 0x8,
+       ID_A_FLOK_COARSE = 0x9,
+       ID_G_FLOK_COARSE = 0xa,
+       ID_A_FLOK_FINE = 0xb,
+       ID_G_FLOK_FINE = 0xc,
+       ID_IQK_RESTORE = 0x10,
+};
+
+static const u32 _tssi_trigger[RTW8852B_TSSI_PATH_NR] = {0x5820, 0x7820};
+static const u32 _tssi_cw_rpt_addr[RTW8852B_TSSI_PATH_NR] = {0x1c18, 0x3c18};
+static const u32 _tssi_cw_default_addr[RTW8852B_TSSI_PATH_NR][4] = {
+       {0x5634, 0x5630, 0x5630, 0x5630},
+       {0x7634, 0x7630, 0x7630, 0x7630} };
+static const u32 _tssi_cw_default_mask[4] = {
+       0x000003ff, 0x3ff00000, 0x000ffc00, 0x000003ff};
+static const u32 _tssi_de_cck_long[RF_PATH_NUM_8852B] = {0x5858, 0x7858};
+static const u32 _tssi_de_cck_short[RF_PATH_NUM_8852B] = {0x5860, 0x7860};
+static const u32 _tssi_de_mcs_20m[RF_PATH_NUM_8852B] = {0x5838, 0x7838};
+static const u32 _tssi_de_mcs_40m[RF_PATH_NUM_8852B] = {0x5840, 0x7840};
+static const u32 _tssi_de_mcs_80m[RF_PATH_NUM_8852B] = {0x5848, 0x7848};
+static const u32 _tssi_de_mcs_80m_80m[RF_PATH_NUM_8852B] = {0x5850, 0x7850};
+static const u32 _tssi_de_mcs_5m[RF_PATH_NUM_8852B] = {0x5828, 0x7828};
+static const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8852B] = {0x5830, 0x7830};
+static const u32 _a_idxrxgain[RTW8852B_RXK_GROUP_NR] = {0x190, 0x198, 0x350, 0x352};
+static const u32 _a_idxattc2[RTW8852B_RXK_GROUP_NR] = {0x0f, 0x0f, 0x3f, 0x7f};
+static const u32 _a_idxattc1[RTW8852B_RXK_GROUP_NR] = {0x3, 0x1, 0x0, 0x0};
+static const u32 _g_idxrxgain[RTW8852B_RXK_GROUP_NR] = {0x212, 0x21c, 0x350, 0x360};
+static const u32 _g_idxattc2[RTW8852B_RXK_GROUP_NR] = {0x00, 0x00, 0x28, 0x5f};
+static const u32 _g_idxattc1[RTW8852B_RXK_GROUP_NR] = {0x3, 0x3, 0x2, 0x1};
+static const u32 _a_power_range[RTW8852B_RXK_GROUP_NR] = {0x0, 0x0, 0x0, 0x0};
+static const u32 _a_track_range[RTW8852B_RXK_GROUP_NR] = {0x3, 0x3, 0x6, 0x6};
+static const u32 _a_gain_bb[RTW8852B_RXK_GROUP_NR] = {0x08, 0x0e, 0x06, 0x0e};
+static const u32 _a_itqt[RTW8852B_RXK_GROUP_NR] = {0x12, 0x12, 0x12, 0x1b};
+static const u32 _g_power_range[RTW8852B_RXK_GROUP_NR] = {0x0, 0x0, 0x0, 0x0};
+static const u32 _g_track_range[RTW8852B_RXK_GROUP_NR] = {0x4, 0x4, 0x6, 0x6};
+static const u32 _g_gain_bb[RTW8852B_RXK_GROUP_NR] = {0x08, 0x0e, 0x06, 0x0e};
+static const u32 _g_itqt[RTW8852B_RXK_GROUP_NR] = {0x09, 0x12, 0x1b, 0x24};
+
+static const u32 rtw8852b_backup_bb_regs[] = {0x2344, 0x5800, 0x7800};
+static const u32 rtw8852b_backup_rf_regs[] = {
+       0xde, 0xdf, 0x8b, 0x90, 0x97, 0x85, 0x1e, 0x0, 0x2, 0x5, 0x10005
+};
+
+#define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8852b_backup_bb_regs)
+#define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8852b_backup_rf_regs)
+
+static const struct rtw89_reg3_def rtw8852b_set_nondbcc_path01[] = {
+       {0x20fc, 0xffff0000, 0x0303},
+       {0x5864, 0x18000000, 0x3},
+       {0x7864, 0x18000000, 0x3},
+       {0x12b8, 0x40000000, 0x1},
+       {0x32b8, 0x40000000, 0x1},
+       {0x030c, 0xff000000, 0x13},
+       {0x032c, 0xffff0000, 0x0041},
+       {0x12b8, 0x10000000, 0x1},
+       {0x58c8, 0x01000000, 0x1},
+       {0x78c8, 0x01000000, 0x1},
+       {0x5864, 0xc0000000, 0x3},
+       {0x7864, 0xc0000000, 0x3},
+       {0x2008, 0x01ffffff, 0x1ffffff},
+       {0x0c1c, 0x00000004, 0x1},
+       {0x0700, 0x08000000, 0x1},
+       {0x0c70, 0x000003ff, 0x3ff},
+       {0x0c60, 0x00000003, 0x3},
+       {0x0c6c, 0x00000001, 0x1},
+       {0x58ac, 0x08000000, 0x1},
+       {0x78ac, 0x08000000, 0x1},
+       {0x0c3c, 0x00000200, 0x1},
+       {0x2344, 0x80000000, 0x1},
+       {0x4490, 0x80000000, 0x1},
+       {0x12a0, 0x00007000, 0x7},
+       {0x12a0, 0x00008000, 0x1},
+       {0x12a0, 0x00070000, 0x3},
+       {0x12a0, 0x00080000, 0x1},
+       {0x32a0, 0x00070000, 0x3},
+       {0x32a0, 0x00080000, 0x1},
+       {0x0700, 0x01000000, 0x1},
+       {0x0700, 0x06000000, 0x2},
+       {0x20fc, 0xffff0000, 0x3333},
+};
+
+static const struct rtw89_reg3_def rtw8852b_restore_nondbcc_path01[] = {
+       {0x20fc, 0xffff0000, 0x0303},
+       {0x12b8, 0x40000000, 0x0},
+       {0x32b8, 0x40000000, 0x0},
+       {0x5864, 0xc0000000, 0x0},
+       {0x7864, 0xc0000000, 0x0},
+       {0x2008, 0x01ffffff, 0x0000000},
+       {0x0c1c, 0x00000004, 0x0},
+       {0x0700, 0x08000000, 0x0},
+       {0x0c70, 0x0000001f, 0x03},
+       {0x0c70, 0x000003e0, 0x03},
+       {0x12a0, 0x000ff000, 0x00},
+       {0x32a0, 0x000ff000, 0x00},
+       {0x0700, 0x07000000, 0x0},
+       {0x20fc, 0xffff0000, 0x0000},
+       {0x58c8, 0x01000000, 0x0},
+       {0x78c8, 0x01000000, 0x0},
+       {0x0c3c, 0x00000200, 0x0},
+       {0x2344, 0x80000000, 0x0},
+};
+
+static void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev, u32 backup_bb_reg_val[])
+{
+       u32 i;
+
+       for (i = 0; i < BACKUP_BB_REGS_NR; i++) {
+               backup_bb_reg_val[i] =
+                       rtw89_phy_read32_mask(rtwdev, rtw8852b_backup_bb_regs[i],
+                                             MASKDWORD);
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[RFK]backup bb reg : %x, value =%x\n",
+                           rtw8852b_backup_bb_regs[i], backup_bb_reg_val[i]);
+       }
+}
+
+static void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev, u32 backup_rf_reg_val[],
+                              u8 rf_path)
+{
+       u32 i;
+
+       for (i = 0; i < BACKUP_RF_REGS_NR; i++) {
+               backup_rf_reg_val[i] =
+                       rtw89_read_rf(rtwdev, rf_path,
+                                     rtw8852b_backup_rf_regs[i], RFREG_MASK);
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[RFK]backup rf S%d reg : %x, value =%x\n", rf_path,
+                           rtw8852b_backup_rf_regs[i], backup_rf_reg_val[i]);
+       }
+}
+
+static void _rfk_restore_bb_reg(struct rtw89_dev *rtwdev,
+                               const u32 backup_bb_reg_val[])
+{
+       u32 i;
+
+       for (i = 0; i < BACKUP_BB_REGS_NR; i++) {
+               rtw89_phy_write32_mask(rtwdev, rtw8852b_backup_bb_regs[i],
+                                      MASKDWORD, backup_bb_reg_val[i]);
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[RFK]restore bb reg : %x, value =%x\n",
+                           rtw8852b_backup_bb_regs[i], backup_bb_reg_val[i]);
+       }
+}
+
+static void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev,
+                               const u32 backup_rf_reg_val[], u8 rf_path)
+{
+       u32 i;
+
+       for (i = 0; i < BACKUP_RF_REGS_NR; i++) {
+               rtw89_write_rf(rtwdev, rf_path, rtw8852b_backup_rf_regs[i],
+                              RFREG_MASK, backup_rf_reg_val[i]);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[RFK]restore rf S%d reg: %x, value =%x\n", rf_path,
+                           rtw8852b_backup_rf_regs[i], backup_rf_reg_val[i]);
+       }
+}
+
+static void _rfk_rf_direct_cntrl(struct rtw89_dev *rtwdev,
+                                enum rtw89_rf_path path, bool is_bybb)
+{
+       if (is_bybb)
+               rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1);
+       else
+               rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
+}
+
+static void _rfk_drf_direct_cntrl(struct rtw89_dev *rtwdev,
+                                 enum rtw89_rf_path path, bool is_bybb)
+{
+       if (is_bybb)
+               rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1);
+       else
+               rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0);
+}
+
+static bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path)
+{
+       bool fail = true;
+       u32 val;
+       int ret;
+
+       ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55,
+                                      1, 8200, false, rtwdev, 0xbff8, MASKBYTE0);
+       if (ret)
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]NCTL1 IQK timeout!!!\n");
+
+       udelay(200);
+
+       if (!ret)
+               fail = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);
+       rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ret=%d\n", path, ret);
+       val = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8008 = 0x%x\n", path, val);
+
+       return fail;
+}
+
+static u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
+{
+       u8 val;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]dbcc_en: %x,PHY%d\n",
+                   rtwdev->dbcc_en, phy_idx);
+
+       if (!rtwdev->dbcc_en) {
+               val = RF_AB;
+       } else {
+               if (phy_idx == RTW89_PHY_0)
+                       val = RF_A;
+               else
+                       val = RF_B;
+       }
+       return val;
+}
+
+static void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                       enum rtw89_rf_path path)
+{
+       rtw89_write_rf(rtwdev, path, RR_DCK1, RR_DCK1_CLR, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1);
+       mdelay(1);
+}
+
+static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
+{
+       u8 path, dck_tune;
+       u32 rf_reg5;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, CV : 0x%x) ******\n",
+                   RTW8852B_RXDCK_VER, rtwdev->hal.cv);
+
+       for (path = 0; path < RF_PATH_NUM_8852B; path++) {
+               rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);
+               dck_tune = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_FINE);
+
+               if (rtwdev->is_tssi_mode[path])
+                       rtw89_phy_write32_mask(rtwdev,
+                                              R_P0_TSSI_TRK + (path << 13),
+                                              B_P0_TSSI_TRK_EN, 0x1);
+
+               rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
+               rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0);
+               rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
+               _set_rx_dck(rtwdev, phy, path);
+               rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, dck_tune);
+               rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
+
+               if (rtwdev->is_tssi_mode[path])
+                       rtw89_phy_write32_mask(rtwdev,
+                                              R_P0_TSSI_TRK + (path << 13),
+                                              B_P0_TSSI_TRK_EN, 0x0);
+       }
+}
+
+static void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
+{
+       u32 rf_reg5;
+       u32 rck_val;
+       u32 val;
+       int ret;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path);
+
+       rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);
+
+       rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%05x\n",
+                   rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK));
+
+       /* RCK trigger */
+       rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240);
+
+       ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 30,
+                                      false, rtwdev, path, RR_RCKS, BIT(3));
+
+       rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] rck_val = 0x%x, ret = %d\n",
+                   rck_val, ret);
+
+       rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val);
+       rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF 0x1b = 0x%x\n",
+                   rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK));
+}
+
+static void _afe_init(struct rtw89_dev *rtwdev)
+{
+       rtw89_write32(rtwdev, R_AX_PHYREG_SET, 0xf);
+
+       rtw89_rfk_parser(rtwdev, &rtw8852b_afe_init_defs_tbl);
+}
+
+static void _drck(struct rtw89_dev *rtwdev)
+{
+       u32 rck_d;
+       u32 val;
+       int ret;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]Ddie RCK start!!!\n");
+       rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_KICK, 0x1);
+
+       ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
+                                      false, rtwdev, R_DRCK_RS, B_DRCK_RS_DONE);
+       if (ret)
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DRCK timeout\n");
+
+       rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_KICK, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x1);
+       udelay(1);
+       rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x0);
+       rck_d = rtw89_phy_read32_mask(rtwdev, R_DRCK_RS, B_DRCK_RS_LPS);
+       rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_SEL, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_CV, rck_d);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0xc0cc = 0x%x\n",
+                   rtw89_phy_read32_mask(rtwdev, R_DRCK_V1, MASKDWORD));
+}
+
+static void _addck_backup(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dack_info *dack = &rtwdev->dack;
+
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x0);
+       dack->addck_d[0][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A0);
+       dack->addck_d[0][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A1);
+
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x0);
+       dack->addck_d[1][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A0);
+       dack->addck_d[1][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A1);
+}
+
+static void _addck_reload(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dack_info *dack = &rtwdev->dack;
+
+       /* S0 */
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK0D_VAL, dack->addck_d[0][0]);
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_VAL, dack->addck_d[0][1] >> 6);
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK0D_VAL2, dack->addck_d[0][1] & 0x3f);
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_MAN, 0x3);
+
+       /* S1 */
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK1D, B_ADDCK1D_VAL, dack->addck_d[1][0]);
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK0_VAL, dack->addck_d[1][1] >> 6);
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK1D, B_ADDCK1D_VAL2, dack->addck_d[1][1] & 0x3f);
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_MAN, 0x3);
+}
+
+static void _dack_backup_s0(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dack_info *dack = &rtwdev->dack;
+       u8 i;
+
+       rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
+
+       for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
+               rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_V, i);
+               dack->msbk_d[0][0][i] =
+                       rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0M0);
+               rtw89_phy_write32_mask(rtwdev, R_DCOF8, B_DCOF8_V, i);
+               dack->msbk_d[0][1][i] =
+                       rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0M1);
+       }
+
+       dack->biask_d[0][0] =
+               rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS00, B_DACK_BIAS00);
+       dack->biask_d[0][1] =
+               rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS01, B_DACK_BIAS01);
+
+       dack->dadck_d[0][0] =
+               rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK00, B_DACK_DADCK00);
+       dack->dadck_d[0][1] =
+               rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK01, B_DACK_DADCK01);
+}
+
+static void _dack_backup_s1(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dack_info *dack = &rtwdev->dack;
+       u8 i;
+
+       rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
+
+       for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
+               rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10, i);
+               dack->msbk_d[1][0][i] =
+                       rtw89_phy_read32_mask(rtwdev, R_DACK10S, B_DACK10S);
+               rtw89_phy_write32_mask(rtwdev, R_DACK11, B_DACK11, i);
+               dack->msbk_d[1][1][i] =
+                       rtw89_phy_read32_mask(rtwdev, R_DACK11S, B_DACK11S);
+       }
+
+       dack->biask_d[1][0] =
+               rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS10, B_DACK_BIAS10);
+       dack->biask_d[1][1] =
+               rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS11, B_DACK_BIAS11);
+
+       dack->dadck_d[1][0] =
+               rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK10, B_DACK_DADCK10);
+       dack->dadck_d[1][1] =
+               rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK11, B_DACK_DADCK11);
+}
+
+static void _check_addc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
+{
+       s32 dc_re = 0, dc_im = 0;
+       u32 tmp;
+       u32 i;
+
+       rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
+                                &rtw8852b_check_addc_defs_a_tbl,
+                                &rtw8852b_check_addc_defs_b_tbl);
+
+       for (i = 0; i < ADDC_T_AVG; i++) {
+               tmp = rtw89_phy_read32_mask(rtwdev, R_DBG32_D, MASKDWORD);
+               dc_re += sign_extend32(FIELD_GET(0xfff000, tmp), 11);
+               dc_im += sign_extend32(FIELD_GET(0xfff, tmp), 11);
+       }
+
+       dc_re /= ADDC_T_AVG;
+       dc_im /= ADDC_T_AVG;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DACK]S%d,dc_re = 0x%x,dc_im =0x%x\n", path, dc_re, dc_im);
+}
+
+static void _addck(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dack_info *dack = &rtwdev->dack;
+       u32 val;
+       int ret;
+
+       /* S0 */
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_MAN, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, 0x30, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(1), 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S0 ADDCK\n");
+       _check_addc(rtwdev, RF_PATH_A);
+
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x0);
+       udelay(1);
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x1);
+
+       ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
+                                      false, rtwdev, R_ADDCKR0, BIT(0));
+       if (ret) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n");
+               dack->addck_timeout[0] = true;
+       }
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 ADDCK\n");
+       _check_addc(rtwdev, RF_PATH_A);
+
+       rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(1), 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0);
+
+       /* S1 */
+       rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(1), 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S1 ADDCK\n");
+       _check_addc(rtwdev, RF_PATH_B);
+
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x0);
+       udelay(1);
+       rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x1);
+
+       ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
+                                      false, rtwdev, R_ADDCKR1, BIT(0));
+       if (ret) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADDCK timeout\n");
+               dack->addck_timeout[1] = true;
+       }
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 ADDCK\n");
+       _check_addc(rtwdev, RF_PATH_B);
+
+       rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(1), 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0);
+}
+
+static void _check_dadc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
+{
+       rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
+                                &rtw8852b_check_dadc_en_defs_a_tbl,
+                                &rtw8852b_check_dadc_en_defs_b_tbl);
+
+       _check_addc(rtwdev, path);
+
+       rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
+                                &rtw8852b_check_dadc_dis_defs_a_tbl,
+                                &rtw8852b_check_dadc_dis_defs_b_tbl);
+}
+
+static bool _dack_s0_check_done(struct rtw89_dev *rtwdev, bool part1)
+{
+       if (part1) {
+               if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P0, B_DACK_S0P0_OK) == 0 ||
+                   rtw89_phy_read32_mask(rtwdev, R_DACK_S0P1, B_DACK_S0P1_OK) == 0)
+                       return false;
+       } else {
+               if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0P2_OK) == 0 ||
+                   rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0P3_OK) == 0)
+                       return false;
+       }
+
+       return true;
+}
+
+static void _dack_s0(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dack_info *dack = &rtwdev->dack;
+       bool done;
+       int ret;
+
+       rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_1_defs_tbl);
+
+       ret = read_poll_timeout_atomic(_dack_s0_check_done, done, done, 1, 10000,
+                                      false, rtwdev, true);
+       if (ret) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK timeout\n");
+               dack->msbk_timeout[0] = true;
+       }
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
+
+       rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_2_defs_tbl);
+
+       ret = read_poll_timeout_atomic(_dack_s0_check_done, done, done, 1, 10000,
+                                      false, rtwdev, false);
+       if (ret) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DADCK timeout\n");
+               dack->dadck_timeout[0] = true;
+       }
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
+
+       rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_3_defs_tbl);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 DADCK\n");
+
+       _dack_backup_s0(rtwdev);
+       rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0);
+}
+
+static bool _dack_s1_check_done(struct rtw89_dev *rtwdev, bool part1)
+{
+       if (part1) {
+               if (rtw89_phy_read32_mask(rtwdev, R_DACK_S1P0, B_DACK_S1P0_OK) == 0 &&
+                   rtw89_phy_read32_mask(rtwdev, R_DACK_S1P1, B_DACK_S1P1_OK) == 0)
+                       return false;
+       } else {
+               if (rtw89_phy_read32_mask(rtwdev, R_DACK10S, B_DACK_S1P2_OK) == 0 &&
+                   rtw89_phy_read32_mask(rtwdev, R_DACK11S, B_DACK_S1P3_OK) == 0)
+                       return false;
+       }
+
+       return true;
+}
+
+static void _dack_s1(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dack_info *dack = &rtwdev->dack;
+       bool done;
+       int ret;
+
+       rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_1_defs_tbl);
+
+       ret = read_poll_timeout_atomic(_dack_s1_check_done, done, done, 1, 10000,
+                                      false, rtwdev, true);
+       if (ret) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK timeout\n");
+               dack->msbk_timeout[1] = true;
+       }
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
+
+       rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_2_defs_tbl);
+
+       ret = read_poll_timeout_atomic(_dack_s1_check_done, done, done, 1, 10000,
+                                      false, rtwdev, false);
+       if (ret) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 DADCK timeout\n");
+               dack->dadck_timeout[1] = true;
+       }
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
+
+       rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_3_defs_tbl);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 DADCK\n");
+
+       _check_dadc(rtwdev, RF_PATH_B);
+       _dack_backup_s1(rtwdev);
+       rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0);
+}
+
+static void _dack(struct rtw89_dev *rtwdev)
+{
+       _dack_s0(rtwdev);
+       _dack_s1(rtwdev);
+}
+
+static void _dack_dump(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dack_info *dack = &rtwdev->dack;
+       u8 i;
+       u8 t;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n",
+                   dack->addck_d[0][0], dack->addck_d[0][1]);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DACK]S1 ADC_DCK ic = 0x%x, qc = 0x%x\n",
+                   dack->addck_d[1][0], dack->addck_d[1][1]);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n",
+                   dack->dadck_d[0][0], dack->dadck_d[0][1]);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DACK]S1 DAC_DCK ic = 0x%x, qc = 0x%x\n",
+                   dack->dadck_d[1][0], dack->dadck_d[1][1]);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n",
+                   dack->biask_d[0][0], dack->biask_d[0][1]);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DACK]S1 biask ic = 0x%x, qc = 0x%x\n",
+                   dack->biask_d[1][0], dack->biask_d[1][1]);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n");
+       for (i = 0; i < 0x10; i++) {
+               t = dack->msbk_d[0][0][i];
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
+       }
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n");
+       for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
+               t = dack->msbk_d[0][1][i];
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
+       }
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK ic:\n");
+       for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
+               t = dack->msbk_d[1][0][i];
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
+       }
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK qc:\n");
+       for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
+               t = dack->msbk_d[1][1][i];
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
+       }
+}
+
+static void _dac_cal(struct rtw89_dev *rtwdev, bool force)
+{
+       struct rtw89_dack_info *dack = &rtwdev->dack;
+       u32 rf0_0, rf1_0;
+
+       dack->dack_done = false;
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK 0x1\n");
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n");
+
+       rf0_0 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK);
+       rf1_0 = rtw89_read_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK);
+       _afe_init(rtwdev);
+       _drck(rtwdev);
+
+       rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x0);
+       rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x0);
+       rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x337e1);
+       rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x337e1);
+       _addck(rtwdev);
+       _addck_backup(rtwdev);
+       _addck_reload(rtwdev);
+
+       rtw89_write_rf(rtwdev, RF_PATH_A, RR_MODOPT, RFREG_MASK, 0x0);
+       rtw89_write_rf(rtwdev, RF_PATH_B, RR_MODOPT, RFREG_MASK, 0x0);
+       _dack(rtwdev);
+       _dack_dump(rtwdev);
+       dack->dack_done = true;
+
+       rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, rf0_0);
+       rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, rf1_0);
+       rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x1);
+       rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x1);
+       dack->dack_cnt++;
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n");
+}
+
+static void _iqk_rxk_setting(struct rtw89_dev *rtwdev, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       u32 tmp;
+
+       switch (iqk_info->iqk_band[path]) {
+       case RTW89_BAND_2G:
+               rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc);
+               rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x1);
+               tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
+               rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp);
+               break;
+       case RTW89_BAND_5G:
+               rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc);
+               rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x1);
+               tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
+               rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp);
+               break;
+       default:
+               break;
+       }
+}
+
+static bool _iqk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
+                         u8 path, u8 ktype)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       u32 iqk_cmd;
+       bool fail;
+
+       switch (ktype) {
+       case ID_FLOK_COARSE:
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
+               iqk_cmd = 0x108 | (1 << (4 + path));
+               break;
+       case ID_FLOK_FINE:
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
+               iqk_cmd = 0x208 | (1 << (4 + path));
+               break;
+       case ID_FLOK_VBUFFER:
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
+               iqk_cmd = 0x308 | (1 << (4 + path));
+               break;
+       case ID_TXK:
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
+               iqk_cmd = 0x008 | (1 << (path + 4)) |
+                         (((0x8 + iqk_info->iqk_bw[path]) & 0xf) << 8);
+               break;
+       case ID_RXAGC:
+               iqk_cmd = 0x508 | (1 << (4 + path)) | (path << 1);
+               break;
+       case ID_RXK:
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
+               iqk_cmd = 0x008 | (1 << (path + 4)) |
+                         (((0xb + iqk_info->iqk_bw[path]) & 0xf) << 8);
+               break;
+       case ID_NBTXK:
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x011);
+               iqk_cmd = 0x308 | (1 << (4 + path));
+               break;
+       case ID_NBRXK:
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011);
+               iqk_cmd = 0x608 | (1 << (4 + path));
+               break;
+       default:
+               return false;
+       }
+
+       rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1);
+       udelay(1);
+       fail = _iqk_check_cal(rtwdev, path);
+       rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
+
+       return fail;
+}
+
+static bool _rxk_group_sel(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
+                          u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       bool kfail = false;
+       bool fail;
+       u8 gp;
+
+       for (gp = 0; gp < RTW8852B_RXK_GROUP_NR; gp++) {
+               switch (iqk_info->iqk_band[path]) {
+               case RTW89_BAND_2G:
+                       rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM,
+                                      _g_idxrxgain[gp]);
+                       rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G,
+                                      _g_idxattc2[gp]);
+                       rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G,
+                                      _g_idxattc1[gp]);
+                       break;
+               case RTW89_BAND_5G:
+                       rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM,
+                                      _a_idxrxgain[gp]);
+                       rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_HATT,
+                                      _a_idxattc2[gp]);
+                       rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_CC2,
+                                      _a_idxattc1[gp]);
+                       break;
+               default:
+                       break;
+               }
+
+               rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
+                                      B_CFIR_LUT_SEL, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
+                                      B_CFIR_LUT_SET, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
+                                      B_CFIR_LUT_GP_V1, gp);
+               fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK);
+               rtw89_phy_write32_mask(rtwdev, R_IQKINF,
+                                      BIT(16 + gp + path * 4), fail);
+               kfail |= fail;
+       }
+       rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0);
+
+       if (kfail) {
+               iqk_info->nb_rxcfir[path] = 0x40000002;
+               rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
+                                      B_IQK_RES_RXCFIR, 0x0);
+               iqk_info->is_wb_rxiqk[path] = false;
+       } else {
+               iqk_info->nb_rxcfir[path] = 0x40000000;
+               rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
+                                      B_IQK_RES_RXCFIR, 0x5);
+               iqk_info->is_wb_rxiqk[path] = true;
+       }
+
+       return kfail;
+}
+
+static bool _iqk_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
+                      u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       const u8 gp = 0x3;
+       bool kfail = false;
+       bool fail;
+
+       switch (iqk_info->iqk_band[path]) {
+       case RTW89_BAND_2G:
+               rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM,
+                              _g_idxrxgain[gp]);
+               rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G,
+                              _g_idxattc2[gp]);
+               rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G,
+                              _g_idxattc1[gp]);
+               break;
+       case RTW89_BAND_5G:
+               rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM,
+                              _a_idxrxgain[gp]);
+               rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_HATT,
+                              _a_idxattc2[gp]);
+               rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_CC2,
+                              _a_idxattc1[gp]);
+               break;
+       default:
+               break;
+       }
+
+       rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SET, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP_V1, gp);
+       rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013);
+       udelay(1);
+
+       fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK);
+       rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(16 + gp + path * 4), fail);
+       kfail |= fail;
+       rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0);
+
+       if (!kfail)
+               iqk_info->nb_rxcfir[path] =
+                        rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD) | 0x2;
+       else
+               iqk_info->nb_rxcfir[path] = 0x40000002;
+
+       return kfail;
+}
+
+static void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+
+       if (iqk_info->iqk_bw[path] == RTW89_CHANNEL_WIDTH_80) {
+               rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
+               udelay(1);
+               rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x0f);
+               udelay(1);
+               rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x03);
+               rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa001);
+               udelay(1);
+               rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041);
+               rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_VAL, 0x2);
+               rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ON, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_VAL, 0x2);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_ON, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x1);
+       } else {
+               rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
+               udelay(1);
+               rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x0f);
+               udelay(1);
+               rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x03);
+               rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa001);
+               udelay(1);
+               rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041);
+               rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_VAL, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ON, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_VAL, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_ON, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x0);
+       }
+}
+
+static bool _txk_group_sel(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       bool kfail = false;
+       bool fail;
+       u8 gp;
+
+       for (gp = 0x0; gp < RTW8852B_RXK_GROUP_NR; gp++) {
+               switch (iqk_info->iqk_band[path]) {
+               case RTW89_BAND_2G:
+                       rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0,
+                                      _g_power_range[gp]);
+                       rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1,
+                                      _g_track_range[gp]);
+                       rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG,
+                                      _g_gain_bb[gp]);
+                       rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
+                                              MASKDWORD, _g_itqt[gp]);
+                       break;
+               case RTW89_BAND_5G:
+                       rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0,
+                                      _a_power_range[gp]);
+                       rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1,
+                                      _a_track_range[gp]);
+                       rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG,
+                                      _a_gain_bb[gp]);
+                       rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
+                                              MASKDWORD, _a_itqt[gp]);
+                       break;
+               default:
+                       break;
+               }
+
+               rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
+                                      B_CFIR_LUT_SEL, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
+                                      B_CFIR_LUT_SET, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
+                                      B_CFIR_LUT_G2, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
+                                      B_CFIR_LUT_GP, gp);
+               rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
+               fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK);
+               rtw89_phy_write32_mask(rtwdev, R_IQKINF,
+                                      BIT(8 + gp + path * 4), fail);
+               kfail |= fail;
+       }
+
+       if (kfail) {
+               iqk_info->nb_txcfir[path] = 0x40000002;
+               rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
+                                      B_IQK_RES_TXCFIR, 0x0);
+               iqk_info->is_wb_txiqk[path] = false;
+       } else {
+               iqk_info->nb_txcfir[path] = 0x40000000;
+               rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
+                                      B_IQK_RES_TXCFIR, 0x5);
+               iqk_info->is_wb_txiqk[path] = true;
+       }
+
+       return kfail;
+}
+
+static bool _iqk_nbtxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       bool kfail;
+       u8 gp = 0x3;
+
+       switch (iqk_info->iqk_band[path]) {
+       case RTW89_BAND_2G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0,
+                              _g_power_range[gp]);
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1,
+                              _g_track_range[gp]);
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG,
+                              _g_gain_bb[gp]);
+               rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
+                                      MASKDWORD, _g_itqt[gp]);
+               break;
+       case RTW89_BAND_5G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0,
+                              _a_power_range[gp]);
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1,
+                              _a_track_range[gp]);
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG,
+                              _a_gain_bb[gp]);
+               rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
+                                      MASKDWORD, _a_itqt[gp]);
+               break;
+       default:
+               break;
+       }
+
+       rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SET, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G2, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, gp);
+       rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
+       kfail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK);
+
+       if (!kfail)
+               iqk_info->nb_txcfir[path] =
+                       rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8),
+                                             MASKDWORD) | 0x2;
+       else
+               iqk_info->nb_txcfir[path] = 0x40000002;
+
+       return kfail;
+}
+
+static void _lok_res_table(struct rtw89_dev *rtwdev, u8 path, u8 ibias)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ibias = %x\n", path, ibias);
+
+       rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x2);
+       if (iqk_info->iqk_band[path] == RTW89_BAND_2G)
+               rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x0);
+       else
+               rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x1);
+       rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, ibias);
+       rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_TXVBUF, RR_TXVBUF_DACEN, 0x1);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x7c = %x\n", path,
+                   rtw89_read_rf(rtwdev, path, RR_TXVBUF, RFREG_MASK));
+}
+
+static bool _lok_finetune_check(struct rtw89_dev *rtwdev, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       bool is_fail1, is_fail2;
+       u32 vbuff_i;
+       u32 vbuff_q;
+       u32 core_i;
+       u32 core_q;
+       u32 tmp;
+       u8 ch;
+
+       tmp = rtw89_read_rf(rtwdev, path, RR_TXMO, RFREG_MASK);
+       core_i = FIELD_GET(RR_TXMO_COI, tmp);
+       core_q = FIELD_GET(RR_TXMO_COQ, tmp);
+       ch = (iqk_info->iqk_times / 2) % RTW89_IQK_CHS_NR;
+
+       if (core_i < 0x2 || core_i > 0x1d || core_q < 0x2 || core_q > 0x1d)
+               is_fail1 = true;
+       else
+               is_fail1 = false;
+
+       iqk_info->lok_idac[ch][path] = tmp;
+
+       tmp = rtw89_read_rf(rtwdev, path, RR_LOKVB, RFREG_MASK);
+       vbuff_i = FIELD_GET(RR_LOKVB_COI, tmp);
+       vbuff_q = FIELD_GET(RR_LOKVB_COQ, tmp);
+
+       if (vbuff_i < 0x2 || vbuff_i > 0x3d || vbuff_q < 0x2 || vbuff_q > 0x3d)
+               is_fail2 = true;
+       else
+               is_fail2 = false;
+
+       iqk_info->lok_vbuf[ch][path] = tmp;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[IQK]S%x, lok_idac[%x][%x] = 0x%x\n", path, ch, path,
+                   iqk_info->lok_idac[ch][path]);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[IQK]S%x, lok_vbuf[%x][%x] = 0x%x\n", path, ch, path,
+                   iqk_info->lok_vbuf[ch][path]);
+
+       return is_fail1 | is_fail2;
+}
+
+static bool _iqk_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       bool tmp;
+
+       rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021);
+
+       switch (iqk_info->iqk_band[path]) {
+       case RTW89_BAND_2G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0);
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x6);
+               break;
+       case RTW89_BAND_5G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0);
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x4);
+               break;
+       default:
+               break;
+       }
+
+       switch (iqk_info->iqk_band[path]) {
+       case RTW89_BAND_2G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
+               break;
+       case RTW89_BAND_5G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
+               break;
+       default:
+               break;
+       }
+
+       rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x9);
+       tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_COARSE);
+       iqk_info->lok_cor_fail[0][path] = tmp;
+
+       switch (iqk_info->iqk_band[path]) {
+       case RTW89_BAND_2G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
+               break;
+       case RTW89_BAND_5G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
+               break;
+       default:
+               break;
+       }
+
+       rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x24);
+       tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_VBUFFER);
+
+       switch (iqk_info->iqk_band[path]) {
+       case RTW89_BAND_2G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
+               break;
+       case RTW89_BAND_5G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
+               break;
+       default:
+               break;
+       }
+
+       rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x9);
+       rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021);
+       tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_FINE);
+       iqk_info->lok_fin_fail[0][path] = tmp;
+
+       switch (iqk_info->iqk_band[path]) {
+       case RTW89_BAND_2G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
+               break;
+       case RTW89_BAND_5G:
+               rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
+               break;
+       default:
+               break;
+       }
+
+       rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x24);
+       _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_VBUFFER);
+
+       return _lok_finetune_check(rtwdev, path);
+}
+
+static void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+
+       switch (iqk_info->iqk_band[path]) {
+       case RTW89_BAND_2G:
+               rtw89_write_rf(rtwdev, path, RR_XALNA2, RR_XALNA2_SW2, 0x00);
+               rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT2, 0x0);
+               rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, 0x0);
+               rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, 0x1);
+               rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0);
+               rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1);
+               rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x00);
+               rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e);
+               udelay(1);
+               break;
+       case RTW89_BAND_5G:
+               rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x00);
+               rtw89_write_rf(rtwdev, path, RR_BIASA, RR_BIASA_A, 0x1);
+               rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0);
+               rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1);
+               rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x80);
+               rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e);
+               udelay(1);
+               break;
+       default:
+               break;
+       }
+}
+
+static void _iqk_txclk_setting(struct rtw89_dev *rtwdev, u8 path)
+{
+       rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
+       udelay(1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f);
+       udelay(1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0001);
+       udelay(1);
+       rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041);
+}
+
+static void _iqk_info_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       u32 tmp;
+       bool flag;
+
+       iqk_info->thermal[path] =
+               ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]);
+       iqk_info->thermal_rek_en = false;
+
+       flag = iqk_info->lok_cor_fail[0][path];
+       rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FCOR << (path * 4), flag);
+       flag = iqk_info->lok_fin_fail[0][path];
+       rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FFIN << (path * 4), flag);
+       flag = iqk_info->iqk_tx_fail[0][path];
+       rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FTX << (path * 4), flag);
+       flag = iqk_info->iqk_rx_fail[0][path];
+       rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_F_RX << (path * 4), flag);
+
+       tmp = rtw89_phy_read32_mask(rtwdev, R_IQK_RES + (path << 8), MASKDWORD);
+       iqk_info->bp_iqkenable[path] = tmp;
+       tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD);
+       iqk_info->bp_txkresult[path] = tmp;
+       tmp = rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD);
+       iqk_info->bp_rxkresult[path] = tmp;
+
+       rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_KCNT, iqk_info->iqk_times);
+
+       tmp = rtw89_phy_read32_mask(rtwdev, R_IQKINF, B_IQKINF_FAIL << (path * 4));
+       if (tmp)
+               iqk_info->iqk_fail_cnt++;
+       rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_FCNT << (path * 4),
+                              iqk_info->iqk_fail_cnt);
+}
+
+static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       bool lok_is_fail = false;
+       const int try = 3;
+       u8 ibias = 0x1;
+       u8 i;
+
+       _iqk_txclk_setting(rtwdev, path);
+
+       /* LOK */
+       for (i = 0; i < try; i++) {
+               _lok_res_table(rtwdev, path, ibias++);
+               _iqk_txk_setting(rtwdev, path);
+               lok_is_fail = _iqk_lok(rtwdev, phy_idx, path);
+               if (!lok_is_fail)
+                       break;
+       }
+
+       if (lok_is_fail)
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] LOK (%d) fail\n", path);
+
+       /* TXK */
+       if (iqk_info->is_nbiqk)
+               iqk_info->iqk_tx_fail[0][path] = _iqk_nbtxk(rtwdev, phy_idx, path);
+       else
+               iqk_info->iqk_tx_fail[0][path] = _txk_group_sel(rtwdev, phy_idx, path);
+
+       /* RX */
+       _iqk_rxclk_setting(rtwdev, path);
+       _iqk_rxk_setting(rtwdev, path);
+       if (iqk_info->is_nbiqk)
+               iqk_info->iqk_rx_fail[0][path] = _iqk_nbrxk(rtwdev, phy_idx, path);
+       else
+               iqk_info->iqk_rx_fail[0][path] = _rxk_group_sel(rtwdev, phy_idx, path);
+
+       _iqk_info_iqk(rtwdev, phy_idx, path);
+}
+
+static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       u32 reg_rf18;
+       u32 reg_35c;
+       u8 idx;
+       u8 get_empty_table = false;
+
+       for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) {
+               if (iqk_info->iqk_mcc_ch[idx][path] == 0) {
+                       get_empty_table = true;
+                       break;
+               }
+       }
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (1)idx = %x\n", idx);
+
+       if (!get_empty_table) {
+               idx = iqk_info->iqk_table_idx[path] + 1;
+               if (idx > 1)
+                       idx = 0;
+       }
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (2)idx = %x\n", idx);
+
+       reg_rf18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
+       reg_35c = rtw89_phy_read32_mask(rtwdev, R_CIRST, B_CIRST_SYN);
+
+       iqk_info->iqk_band[path] = chan->band_type;
+       iqk_info->iqk_bw[path] = chan->band_width;
+       iqk_info->iqk_ch[path] = chan->channel;
+       iqk_info->iqk_mcc_ch[idx][path] = chan->channel;
+       iqk_info->iqk_table_idx[path] = idx;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x, idx = %x\n",
+                   path, reg_rf18, idx);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x\n",
+                   path, reg_rf18);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]times = 0x%x, ch =%x\n",
+                   iqk_info->iqk_times, idx);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_mcc_ch[%x][%x] = 0x%x\n",
+                   idx, path, iqk_info->iqk_mcc_ch[idx][path]);
+
+       if (reg_35c == 0x01)
+               iqk_info->syn1to2 = 0x1;
+       else
+               iqk_info->syn1to2 = 0x0;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[IQK]S%x, iqk_info->syn1to2= 0x%x\n", path,
+                   iqk_info->syn1to2);
+
+       rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_VER, RTW8852B_IQK_VER);
+       /* 2GHz/5GHz/6GHz = 0/1/2 */
+       rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_BAND << (path * 16),
+                              iqk_info->iqk_band[path]);
+       /* 20/40/80 = 0/1/2 */
+       rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_BW << (path * 16),
+                              iqk_info->iqk_bw[path]);
+       rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_CH << (path * 16),
+                              iqk_info->iqk_ch[path]);
+}
+
+static void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
+{
+       _iqk_by_path(rtwdev, phy_idx, path);
+}
+
+static void _iqk_restore(struct rtw89_dev *rtwdev, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       bool fail;
+
+       rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD,
+                              iqk_info->nb_txcfir[path]);
+       rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD,
+                              iqk_info->nb_rxcfir[path]);
+       rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD,
+                              0x00000e19 + (path << 4));
+       fail = _iqk_check_cal(rtwdev, path);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "%s result =%x\n", __func__, fail);
+
+       rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
+       rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000);
+       rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000);
+       rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS, B_IQK_RES_K, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_IQRSN, B_IQRSN_K1, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_IQRSN, B_IQRSN_K2, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0x3);
+       rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1);
+       rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1);
+}
+
+static void _iqk_afebb_restore(struct rtw89_dev *rtwdev,
+                              enum rtw89_phy_idx phy_idx, u8 path)
+{
+       const struct rtw89_reg3_def *def;
+       int size;
+       u8 kpath;
+       int i;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "===> %s\n", __func__);
+
+       kpath = _kpath(rtwdev, phy_idx);
+
+       switch (kpath) {
+       case RF_A:
+       case RF_B:
+               return;
+       default:
+               size = ARRAY_SIZE(rtw8852b_restore_nondbcc_path01);
+               def = rtw8852b_restore_nondbcc_path01;
+               break;
+       }
+
+       for (i = 0; i < size; i++, def++)
+               rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data);
+}
+
+static void _iqk_preset(struct rtw89_dev *rtwdev, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       u8 idx;
+
+       idx = iqk_info->iqk_table_idx[path];
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (3)idx = %x\n", idx);
+
+       rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), B_COEF_SEL_IQC, idx);
+       rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3, idx);
+
+       rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080);
+       rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK](1)S%x, 0x8%x54 = 0x%x\n", path, 1 << path,
+                   rtw89_phy_read32_mask(rtwdev, R_CFIR_LUT + (path << 8), MASKDWORD));
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK](1)S%x, 0x8%x04 = 0x%x\n", path, 1 << path,
+                   rtw89_phy_read32_mask(rtwdev, R_COEF_SEL + (path << 8), MASKDWORD));
+}
+
+static void _iqk_macbb_setting(struct rtw89_dev *rtwdev,
+                              enum rtw89_phy_idx phy_idx, u8 path)
+{
+       const struct rtw89_reg3_def *def;
+       int size;
+       u8 kpath;
+       int i;
+
+       kpath = _kpath(rtwdev, phy_idx);
+
+       switch (kpath) {
+       case RF_A:
+       case RF_B:
+               return;
+       default:
+               size = ARRAY_SIZE(rtw8852b_set_nondbcc_path01);
+               def = rtw8852b_set_nondbcc_path01;
+               break;
+       }
+
+       for (i = 0; i < size; i++, def++)
+               rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data);
+}
+
+static void _iqk_init(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       u8 idx, path;
+
+       rtw89_phy_write32_mask(rtwdev, R_IQKINF, MASKDWORD, 0x0);
+       if (iqk_info->is_iqk_init)
+               return;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
+       iqk_info->is_iqk_init = true;
+       iqk_info->is_nbiqk = false;
+       iqk_info->iqk_fft_en = false;
+       iqk_info->iqk_sram_en = false;
+       iqk_info->iqk_cfir_en = false;
+       iqk_info->iqk_xym_en = false;
+       iqk_info->thermal_rek_en = false;
+       iqk_info->iqk_times = 0x0;
+
+       for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) {
+               iqk_info->iqk_channel[idx] = 0x0;
+               for (path = 0; path < RTW8852B_IQK_SS; path++) {
+                       iqk_info->lok_cor_fail[idx][path] = false;
+                       iqk_info->lok_fin_fail[idx][path] = false;
+                       iqk_info->iqk_tx_fail[idx][path] = false;
+                       iqk_info->iqk_rx_fail[idx][path] = false;
+                       iqk_info->iqk_mcc_ch[idx][path] = 0x0;
+                       iqk_info->iqk_table_idx[path] = 0x0;
+               }
+       }
+}
+
+static void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath)
+{
+       u32 rf_mode;
+       u8 path;
+       int ret;
+
+       for (path = 0; path < RF_PATH_MAX; path++) {
+               if (!(kpath & BIT(path)))
+                       continue;
+
+               ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode,
+                                              rf_mode != 2, 2, 5000, false,
+                                              rtwdev, path, RR_MOD, RR_MOD_MASK);
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[RFK] Wait S%d to Rx mode!! (ret = %d)\n", path, ret);
+       }
+}
+
+static void _tmac_tx_pause(struct rtw89_dev *rtwdev, enum rtw89_phy_idx band_idx,
+                          bool is_pause)
+{
+       if (!is_pause)
+               return;
+
+       _wait_rx_mode(rtwdev, _kpath(rtwdev, band_idx));
+}
+
+static void _doiqk(struct rtw89_dev *rtwdev, bool force,
+                  enum rtw89_phy_idx phy_idx, u8 path)
+{
+       struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
+       u32 backup_bb_val[BACKUP_BB_REGS_NR];
+       u32 backup_rf_val[RTW8852B_IQK_SS][BACKUP_RF_REGS_NR];
+       u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
+
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[IQK]==========IQK strat!!!!!==========\n");
+       iqk_info->iqk_times++;
+       iqk_info->kcount = 0;
+       iqk_info->version = RTW8852B_IQK_VER;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version);
+       _iqk_get_ch_info(rtwdev, phy_idx, path);
+
+       _rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]);
+       _rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
+       _iqk_macbb_setting(rtwdev, phy_idx, path);
+       _iqk_preset(rtwdev, path);
+       _iqk_start_iqk(rtwdev, phy_idx, path);
+       _iqk_restore(rtwdev, path);
+       _iqk_afebb_restore(rtwdev, phy_idx, path);
+       _rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]);
+       _rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path);
+
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
+}
+
+static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force)
+{
+       u8 kpath = _kpath(rtwdev, phy_idx);
+
+       switch (kpath) {
+       case RF_A:
+               _doiqk(rtwdev, force, phy_idx, RF_PATH_A);
+               break;
+       case RF_B:
+               _doiqk(rtwdev, force, phy_idx, RF_PATH_B);
+               break;
+       case RF_AB:
+               _doiqk(rtwdev, force, phy_idx, RF_PATH_A);
+               _doiqk(rtwdev, force, phy_idx, RF_PATH_B);
+               break;
+       default:
+               break;
+       }
+}
+
+static void _dpk_bkup_kip(struct rtw89_dev *rtwdev, const u32 reg[],
+                         u32 reg_bkup[][RTW8852B_DPK_KIP_REG_NUM], u8 path)
+{
+       u8 i;
+
+       for (i = 0; i < RTW8852B_DPK_KIP_REG_NUM; i++) {
+               reg_bkup[path][i] =
+                       rtw89_phy_read32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD);
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n",
+                           reg[i] + (path << 8), reg_bkup[path][i]);
+       }
+}
+
+static void _dpk_reload_kip(struct rtw89_dev *rtwdev, const u32 reg[],
+                           const u32 reg_bkup[][RTW8852B_DPK_KIP_REG_NUM], u8 path)
+{
+       u8 i;
+
+       for (i = 0; i < RTW8852B_DPK_KIP_REG_NUM; i++) {
+               rtw89_phy_write32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD,
+                                      reg_bkup[path][i]);
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Reload 0x%x = %x\n",
+                           reg[i] + (path << 8), reg_bkup[path][i]);
+       }
+}
+
+static u8 _dpk_order_convert(struct rtw89_dev *rtwdev)
+{
+       u8 order;
+       u8 val;
+
+       order = rtw89_phy_read32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP);
+       val = 0x3 >> order;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] convert MDPD order to 0x%x\n", val);
+
+       return val;
+}
+
+static void _dpk_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool off)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+       u8 val, kidx = dpk->cur_idx[path];
+
+       val = dpk->is_dpk_enable && !off && dpk->bp[path][kidx].path_ok;
+
+       rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
+                              MASKBYTE3, _dpk_order_convert(rtwdev) << 1 | val);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path,
+                   kidx, dpk->is_dpk_enable && !off ? "enable" : "disable");
+}
+
+static void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                         enum rtw89_rf_path path, enum rtw8852b_dpk_id id)
+{
+       u16 dpk_cmd;
+       u32 val;
+       int ret;
+
+       dpk_cmd = (id << 8) | (0x19 + (path << 4));
+       rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd);
+
+       ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55,
+                                      1, 20000, false,
+                                      rtwdev, 0xbff8, MASKBYTE0);
+       if (ret)
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot over 20ms!!!!\n");
+
+       udelay(1);
+
+       rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00030000);
+
+       ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000,
+                                      1, 2000, false,
+                                      rtwdev, 0x80fc, MASKLWORD);
+       if (ret)
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot over 20ms!!!!\n");
+
+       rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] one-shot for %s = 0x%x\n",
+                   id == 0x06 ? "LBK_RXIQK" :
+                   id == 0x10 ? "SYNC" :
+                   id == 0x11 ? "MDPK_IDL" :
+                   id == 0x12 ? "MDPK_MPA" :
+                   id == 0x13 ? "GAIN_LOSS" :
+                   id == 0x14 ? "PWR_CAL" :
+                   id == 0x15 ? "DPK_RXAGC" :
+                   id == 0x16 ? "KIP_PRESET" :
+                   id == 0x17 ? "KIP_RESOTRE" : "DPK_TXAGC",
+                   dpk_cmd);
+}
+
+static void _dpk_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                       enum rtw89_rf_path path)
+{
+       rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_EN_TIA_IDA, 0x3);
+       _set_rx_dck(rtwdev, phy, path);
+}
+
+static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                            enum rtw89_rf_path path)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+
+       u8 kidx = dpk->cur_idx[path];
+
+       dpk->bp[path][kidx].band = chan->band_type;
+       dpk->bp[path][kidx].ch = chan->channel;
+       dpk->bp[path][kidx].bw = chan->band_width;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n",
+                   path, dpk->cur_idx[path], phy,
+                   rtwdev->is_tssi_mode[path] ? "on" : "off",
+                   rtwdev->dbcc_en ? "on" : "off",
+                   dpk->bp[path][kidx].band == 0 ? "2G" :
+                   dpk->bp[path][kidx].band == 1 ? "5G" : "6G",
+                   dpk->bp[path][kidx].ch,
+                   dpk->bp[path][kidx].bw == 0 ? "20M" :
+                   dpk->bp[path][kidx].bw == 1 ? "40M" : "80M");
+}
+
+static void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev,
+                               enum rtw89_phy_idx phy,
+                               enum rtw89_rf_path path, u8 kpath)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+
+       rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_defs_tbl);
+
+       if (chan->band_width == RTW89_CHANNEL_WIDTH_80) {
+               rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_EX, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1, B_PATH1_BW_SEL_EX, 0x1);
+       }
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] Set BB/AFE for PHY%d (kpath=%d)\n", phy, kpath);
+}
+
+static void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev,
+                               enum rtw89_phy_idx phy,
+                               enum rtw89_rf_path path, u8 kpath)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+
+       rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_restore_defs_tbl);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] Restore BB/AFE for PHY%d (kpath=%d)\n", phy, kpath);
+
+       if (chan->band_width == RTW89_CHANNEL_WIDTH_80) {
+               rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_EX, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1,  B_PATH1_BW_SEL_EX, 0x0);
+       }
+}
+
+static void _dpk_tssi_pause(struct rtw89_dev *rtwdev,
+                           enum rtw89_rf_path path, bool is_pause)
+{
+       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13),
+                              B_P0_TSSI_TRK_EN, is_pause);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path,
+                   is_pause ? "pause" : "resume");
+}
+
+static void _dpk_kip_restore(struct rtw89_dev *rtwdev,
+                            enum rtw89_rf_path path)
+{
+       rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_kip_defs_tbl);
+
+       if (rtwdev->hal.cv > CHIP_CAV)
+               rtw89_phy_write32_mask(rtwdev, R_DPD_COM + (path << 8), B_DPD_COM_OF, 0x1);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path);
+}
+
+static void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                          enum rtw89_rf_path path)
+{
+       u8 cur_rxbb;
+       u32 tmp;
+
+       cur_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB);
+
+       rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_RXCFIR, 0x0);
+
+       tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
+       rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp);
+       rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0xd);
+       rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x1);
+
+       if (cur_rxbb >= 0x11)
+               rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x13);
+       else if (cur_rxbb <= 0xa)
+               rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x00);
+       else
+               rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x05);
+
+       rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80014);
+       udelay(70);
+
+       rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x025);
+
+       _dpk_one_shot(rtwdev, phy, path, LBK_RXIQK);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d LBK RXIQC = 0x%x\n", path,
+                   rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD));
+
+       rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, B_KPATH_CFG_ED, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_DI, 0x1);
+       rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0x5);
+}
+
+static void _dpk_get_thermal(struct rtw89_dev *rtwdev, u8 kidx, enum rtw89_rf_path path)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+
+       rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1);
+       rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1);
+
+       udelay(200);
+
+       dpk->bp[path][kidx].ther_dpk = rtw89_read_rf(rtwdev, path, RR_TM, RR_TM_VAL);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] thermal@DPK = 0x%x\n",
+                   dpk->bp[path][kidx].ther_dpk);
+}
+
+static void _dpk_rf_setting(struct rtw89_dev *rtwdev, u8 gain,
+                           enum rtw89_rf_path path, u8 kidx)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+
+       if (dpk->bp[path][kidx].band == RTW89_BAND_2G) {
+               rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220);
+               rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_FATT, 0xf2);
+               rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1);
+               rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1);
+       } else {
+               rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220);
+               rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RAA2_SWATT, 0x5);
+               rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1);
+               rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1);
+               rtw89_write_rf(rtwdev, path, RR_RXA_LNA, RFREG_MASK, 0x920FC);
+               rtw89_write_rf(rtwdev, path, RR_XALNA2, RFREG_MASK, 0x002C0);
+               rtw89_write_rf(rtwdev, path, RR_IQGEN, RFREG_MASK, 0x38800);
+       }
+
+       rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_BW, 0x1);
+       rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_TXBB, dpk->bp[path][kidx].bw + 1);
+       rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_RXBB, 0x0);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] ARF 0x0/0x11/0x1a = 0x%x/ 0x%x/ 0x%x\n",
+                   rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK),
+                   rtw89_read_rf(rtwdev, path, RR_TXIG, RFREG_MASK),
+                   rtw89_read_rf(rtwdev, path, RR_BTC, RFREG_MASK));
+}
+
+static void _dpk_bypass_rxcfir(struct rtw89_dev *rtwdev,
+                              enum rtw89_rf_path path, bool is_bypass)
+{
+       if (is_bypass) {
+               rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
+                                      B_RXIQC_BYPASS2, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
+                                      B_RXIQC_BYPASS, 0x1);
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[DPK] Bypass RXIQC (0x8%d3c = 0x%x)\n", 1 + path,
+                           rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8),
+                                                 MASKDWORD));
+       } else {
+               rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS2);
+               rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS);
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[DPK] restore 0x8%d3c = 0x%x\n", 1 + path,
+                           rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8),
+                                                 MASKDWORD));
+       }
+}
+
+static
+void _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+
+       if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80)
+               rtw89_phy_write32_clr(rtwdev, R_TPG_MOD, B_TPG_MOD_F);
+       else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40)
+               rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2);
+       else
+               rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG_Select for %s\n",
+                   dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" :
+                   dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M");
+}
+
+static void _dpk_table_select(struct rtw89_dev *rtwdev,
+                             enum rtw89_rf_path path, u8 kidx, u8 gain)
+{
+       u8 val;
+
+       val = 0x80 + kidx * 0x20 + gain * 0x10;
+       rtw89_phy_write32_mask(rtwdev, R_DPD_CH0 + (path << 8), MASKBYTE3, val);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] table select for Kidx[%d], Gain[%d] (0x%x)\n", kidx,
+                   gain, val);
+}
+
+static bool _dpk_sync_check(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)
+{
+#define DPK_SYNC_TH_DC_I 200
+#define DPK_SYNC_TH_DC_Q 200
+#define DPK_SYNC_TH_CORR 170
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+       u16 dc_i, dc_q;
+       u8 corr_val, corr_idx;
+
+       rtw89_phy_write32_clr(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL);
+
+       corr_idx = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORI);
+       corr_val = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORV);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] S%d Corr_idx / Corr_val = %d / %d\n",
+                   path, corr_idx, corr_val);
+
+       dpk->corr_idx[path][kidx] = corr_idx;
+       dpk->corr_val[path][kidx] = corr_val;
+
+       rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9);
+
+       dc_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI);
+       dc_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ);
+
+       dc_i = abs(sign_extend32(dc_i, 11));
+       dc_q = abs(sign_extend32(dc_q, 11));
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d DC I/Q, = %d / %d\n",
+                   path, dc_i, dc_q);
+
+       dpk->dc_i[path][kidx] = dc_i;
+       dpk->dc_q[path][kidx] = dc_q;
+
+       if (dc_i > DPK_SYNC_TH_DC_I || dc_q > DPK_SYNC_TH_DC_Q ||
+           corr_val < DPK_SYNC_TH_CORR)
+               return true;
+       else
+               return false;
+}
+
+static bool _dpk_sync(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                     enum rtw89_rf_path path, u8 kidx)
+{
+       _dpk_one_shot(rtwdev, phy, path, SYNC);
+
+       return _dpk_sync_check(rtwdev, path, kidx);
+}
+
+static u16 _dpk_dgain_read(struct rtw89_dev *rtwdev)
+{
+       u16 dgain;
+
+       rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0);
+
+       dgain = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x\n", dgain);
+
+       return dgain;
+}
+
+static s8 _dpk_dgain_mapping(struct rtw89_dev *rtwdev, u16 dgain)
+{
+       static const u16 bnd[15] = {
+               0xbf1, 0xaa5, 0x97d, 0x875, 0x789, 0x6b7, 0x5fc, 0x556,
+               0x4c1, 0x43d, 0x3c7, 0x35e, 0x2ac, 0x262, 0x220
+       };
+       s8 offset;
+
+       if (dgain >= bnd[0])
+               offset = 0x6;
+       else if (bnd[0] > dgain && dgain >= bnd[1])
+               offset = 0x6;
+       else if (bnd[1] > dgain && dgain >= bnd[2])
+               offset = 0x5;
+       else if (bnd[2] > dgain && dgain >= bnd[3])
+               offset = 0x4;
+       else if (bnd[3] > dgain && dgain >= bnd[4])
+               offset = 0x3;
+       else if (bnd[4] > dgain && dgain >= bnd[5])
+               offset = 0x2;
+       else if (bnd[5] > dgain && dgain >= bnd[6])
+               offset = 0x1;
+       else if (bnd[6] > dgain && dgain >= bnd[7])
+               offset = 0x0;
+       else if (bnd[7] > dgain && dgain >= bnd[8])
+               offset = 0xff;
+       else if (bnd[8] > dgain && dgain >= bnd[9])
+               offset = 0xfe;
+       else if (bnd[9] > dgain && dgain >= bnd[10])
+               offset = 0xfd;
+       else if (bnd[10] > dgain && dgain >= bnd[11])
+               offset = 0xfc;
+       else if (bnd[11] > dgain && dgain >= bnd[12])
+               offset = 0xfb;
+       else if (bnd[12] > dgain && dgain >= bnd[13])
+               offset = 0xfa;
+       else if (bnd[13] > dgain && dgain >= bnd[14])
+               offset = 0xf9;
+       else if (bnd[14] > dgain)
+               offset = 0xf8;
+       else
+               offset = 0x0;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain offset = %d\n", offset);
+
+       return offset;
+}
+
+static u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev)
+{
+       rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6);
+       rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1);
+
+       return rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL);
+}
+
+static void _dpk_gainloss(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                         enum rtw89_rf_path path, u8 kidx)
+{
+       _dpk_table_select(rtwdev, path, kidx, 1);
+       _dpk_one_shot(rtwdev, phy, path, GAIN_LOSS);
+}
+
+static void _dpk_kip_preset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                           enum rtw89_rf_path path, u8 kidx)
+{
+       _dpk_tpg_sel(rtwdev, path, kidx);
+       _dpk_one_shot(rtwdev, phy, path, KIP_PRESET);
+}
+
+static void _dpk_kip_pwr_clk_on(struct rtw89_dev *rtwdev,
+                               enum rtw89_rf_path path)
+{
+       rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080);
+       rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x807f030a);
+       rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0xce000a08);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] KIP Power/CLK on\n");
+}
+
+static void _dpk_kip_set_txagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                              enum rtw89_rf_path path, u8 txagc)
+{
+       rtw89_write_rf(rtwdev, path, RR_TXAGC, RFREG_MASK, txagc);
+       rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
+       _dpk_one_shot(rtwdev, phy, path, DPK_TXAGC);
+       rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] set TXAGC = 0x%x\n", txagc);
+}
+
+static void _dpk_kip_set_rxagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                              enum rtw89_rf_path path)
+{
+       u32 tmp;
+
+       tmp = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);
+       rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, tmp);
+       rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
+       _dpk_one_shot(rtwdev, phy, path, DPK_RXAGC);
+       rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL_V1, 0x8);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] set RXBB = 0x%x (RF0x0[9:5] = 0x%x)\n",
+                   rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_RXBB_V1),
+                   rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB));
+}
+
+static u8 _dpk_set_offset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                         enum rtw89_rf_path path, s8 gain_offset)
+{
+       u8 txagc;
+
+       txagc = rtw89_read_rf(rtwdev, path, RR_TXAGC, RFREG_MASK);
+
+       if (txagc - gain_offset < DPK_TXAGC_LOWER)
+               txagc = DPK_TXAGC_LOWER;
+       else if (txagc - gain_offset > DPK_TXAGC_UPPER)
+               txagc = DPK_TXAGC_UPPER;
+       else
+               txagc = txagc - gain_offset;
+
+       _dpk_kip_set_txagc(rtwdev, phy, path, txagc);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp_txagc (GL=%d) = 0x%x\n",
+                   gain_offset, txagc);
+       return txagc;
+}
+
+static bool _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check)
+{
+       u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0;
+       u8 i;
+
+       rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKBYTE2, 0x06);
+       rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE2, 0x08);
+
+       if (is_check) {
+               rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00);
+               val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD);
+               val1_i = abs(sign_extend32(val1_i, 11));
+               val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD);
+               val1_q = abs(sign_extend32(val1_q, 11));
+
+               rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f);
+               val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD);
+               val2_i = abs(sign_extend32(val2_i, 11));
+               val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD);
+               val2_q = abs(sign_extend32(val2_q, 11));
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n",
+                           phy_div(val1_i * val1_i + val1_q * val1_q,
+                                   val2_i * val2_i + val2_q * val2_q));
+       } else {
+               for (i = 0; i < 32; i++) {
+                       rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i);
+                       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                                   "[DPK] PAS_Read[%02d]= 0x%08x\n", i,
+                                   rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD));
+               }
+       }
+
+       if (val1_i * val1_i + val1_q * val1_q >=
+           (val2_i * val2_i + val2_q * val2_q) * 8 / 5)
+               return true;
+
+       return false;
+}
+
+static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                  enum rtw89_rf_path path, u8 kidx, u8 init_txagc,
+                  bool loss_only)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       u8 step = DPK_AGC_STEP_SYNC_DGAIN;
+       u8 tmp_txagc, tmp_rxbb = 0, tmp_gl_idx = 0;
+       u8 goout = 0, agc_cnt = 0, limited_rxbb = 0;
+       u16 dgain = 0;
+       s8 offset;
+       int limit = 200;
+
+       tmp_txagc = init_txagc;
+
+       do {
+               switch (step) {
+               case DPK_AGC_STEP_SYNC_DGAIN:
+                       if (_dpk_sync(rtwdev, phy, path, kidx)) {
+                               tmp_txagc = 0xff;
+                               goout = 1;
+                               break;
+                       }
+
+                       dgain = _dpk_dgain_read(rtwdev);
+
+                       if (loss_only == 1 || limited_rxbb == 1)
+                               step = DPK_AGC_STEP_GAIN_LOSS_IDX;
+                       else
+                               step = DPK_AGC_STEP_GAIN_ADJ;
+                       break;
+
+               case DPK_AGC_STEP_GAIN_ADJ:
+                       tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD,
+                                                RFREG_MASKRXBB);
+                       offset = _dpk_dgain_mapping(rtwdev, dgain);
+
+                       if (tmp_rxbb + offset > 0x1f) {
+                               tmp_rxbb = 0x1f;
+                               limited_rxbb = 1;
+                       } else if (tmp_rxbb + offset < 0) {
+                               tmp_rxbb = 0;
+                               limited_rxbb = 1;
+                       } else {
+                               tmp_rxbb = tmp_rxbb + offset;
+                       }
+
+                       rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB,
+                                      tmp_rxbb);
+                       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                                   "[DPK] Adjust RXBB (%d) = 0x%x\n", offset, tmp_rxbb);
+                       if (offset || agc_cnt == 0) {
+                               if (chan->band_width < RTW89_CHANNEL_WIDTH_80)
+                                       _dpk_bypass_rxcfir(rtwdev, path, true);
+                               else
+                                       _dpk_lbk_rxiqk(rtwdev, phy, path);
+                       }
+                       if (dgain > 1922 || dgain < 342)
+                               step = DPK_AGC_STEP_SYNC_DGAIN;
+                       else
+                               step = DPK_AGC_STEP_GAIN_LOSS_IDX;
+
+                       agc_cnt++;
+                       break;
+
+               case DPK_AGC_STEP_GAIN_LOSS_IDX:
+                       _dpk_gainloss(rtwdev, phy, path, kidx);
+                       tmp_gl_idx = _dpk_gainloss_read(rtwdev);
+
+                       if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, true)) ||
+                           tmp_gl_idx >= 7)
+                               step = DPK_AGC_STEP_GL_GT_CRITERION;
+                       else if (tmp_gl_idx == 0)
+                               step = DPK_AGC_STEP_GL_LT_CRITERION;
+                       else
+                               step = DPK_AGC_STEP_SET_TX_GAIN;
+                       break;
+
+               case DPK_AGC_STEP_GL_GT_CRITERION:
+                       if (tmp_txagc == 0x2e) {
+                               goout = 1;
+                               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                                           "[DPK] Txagc@lower bound!!\n");
+                       } else {
+                               tmp_txagc = _dpk_set_offset(rtwdev, phy, path, 0x3);
+                       }
+                       step = DPK_AGC_STEP_GAIN_LOSS_IDX;
+                       agc_cnt++;
+                       break;
+
+               case DPK_AGC_STEP_GL_LT_CRITERION:
+                       if (tmp_txagc == 0x3f) {
+                               goout = 1;
+                               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                                           "[DPK] Txagc@upper bound!!\n");
+                       } else {
+                               tmp_txagc = _dpk_set_offset(rtwdev, phy, path, 0xfe);
+                       }
+                       step = DPK_AGC_STEP_GAIN_LOSS_IDX;
+                       agc_cnt++;
+                       break;
+               case DPK_AGC_STEP_SET_TX_GAIN:
+                       tmp_txagc = _dpk_set_offset(rtwdev, phy, path, tmp_gl_idx);
+                       goout = 1;
+                       agc_cnt++;
+                       break;
+
+               default:
+                       goout = 1;
+                       break;
+               }
+       } while (!goout && agc_cnt < 6 && limit-- > 0);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] Txagc / RXBB for DPK = 0x%x / 0x%x\n", tmp_txagc,
+                   tmp_rxbb);
+
+       return tmp_txagc;
+}
+
+static void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, u8 order)
+{
+       switch (order) {
+       case 0:
+               rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
+               rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x3);
+               rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x1);
+               break;
+       case 1:
+               rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
+               rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN);
+               rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN);
+               break;
+       case 2:
+               rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
+               rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN);
+               rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN);
+               break;
+       default:
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[DPK] Wrong MDPD order!!(0x%x)\n", order);
+               break;
+       }
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] Set MDPD order to 0x%x for IDL\n", order);
+}
+
+static void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                        enum rtw89_rf_path path, u8 kidx, u8 gain)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+
+       if (dpk->bp[path][kidx].bw < RTW89_CHANNEL_WIDTH_80 &&
+           dpk->bp[path][kidx].band == RTW89_BAND_5G)
+               _dpk_set_mdpd_para(rtwdev, 0x2);
+       else
+               _dpk_set_mdpd_para(rtwdev, 0x0);
+
+       _dpk_one_shot(rtwdev, phy, path, MDPK_IDL);
+}
+
+static void _dpk_fill_result(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                            enum rtw89_rf_path path, u8 kidx, u8 gain, u8 txagc)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+       const u16 pwsf = 0x78;
+       u8 gs = dpk->dpk_gs[phy];
+
+       rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8),
+                              B_COEF_SEL_MDPD, kidx);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] Fill txagc/ pwsf/ gs = 0x%x/ 0x%x/ 0x%x\n", txagc,
+                   pwsf, gs);
+
+       dpk->bp[path][kidx].txagc_dpk = txagc;
+       rtw89_phy_write32_mask(rtwdev, R_TXAGC_RFK + (path << 8),
+                              0x3F << ((gain << 3) + (kidx << 4)), txagc);
+
+       dpk->bp[path][kidx].pwsf = pwsf;
+       rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2),
+                              0x1FF << (gain << 4), pwsf);
+
+       rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x0);
+
+       dpk->bp[path][kidx].gs = gs;
+       if (dpk->dpk_gs[phy] == 0x7f)
+               rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
+                                      MASKDWORD, 0x007f7f7f);
+       else
+               rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
+                                      MASKDWORD, 0x005b5b5b);
+
+       rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
+                              B_DPD_ORDER_V1, _dpk_order_convert(rtwdev));
+       rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), MASKDWORD, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_SEL, 0x0);
+}
+
+static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                             enum rtw89_rf_path path)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+       bool is_reload = false;
+       u8 idx, cur_band, cur_ch;
+
+       cur_band = chan->band_type;
+       cur_ch = chan->channel;
+
+       for (idx = 0; idx < RTW89_DPK_BKUP_NUM; idx++) {
+               if (cur_band != dpk->bp[path][idx].band ||
+                   cur_ch != dpk->bp[path][idx].ch)
+                       continue;
+
+               rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8),
+                                      B_COEF_SEL_MDPD, idx);
+               dpk->cur_idx[path] = idx;
+               is_reload = true;
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[DPK] reload S%d[%d] success\n", path, idx);
+       }
+
+       return is_reload;
+}
+
+static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                     enum rtw89_rf_path path, u8 gain)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+       u8 txagc = 0x38, kidx = dpk->cur_idx[path];
+       bool is_fail = false;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] ========= S%d[%d] DPK Start =========\n", path, kidx);
+
+       _rfk_rf_direct_cntrl(rtwdev, path, false);
+       _rfk_drf_direct_cntrl(rtwdev, path, false);
+
+       _dpk_kip_pwr_clk_on(rtwdev, path);
+       _dpk_kip_set_txagc(rtwdev, phy, path, txagc);
+       _dpk_rf_setting(rtwdev, gain, path, kidx);
+       _dpk_rx_dck(rtwdev, phy, path);
+
+       _dpk_kip_preset(rtwdev, phy, path, kidx);
+       _dpk_kip_set_rxagc(rtwdev, phy, path);
+       _dpk_table_select(rtwdev, path, kidx, gain);
+
+       txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Adjust txagc = 0x%x\n", txagc);
+
+       if (txagc == 0xff) {
+               is_fail = true;
+       } else {
+               _dpk_get_thermal(rtwdev, kidx, path);
+
+               _dpk_idl_mpa(rtwdev, phy, path, kidx, gain);
+
+               rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
+
+               _dpk_fill_result(rtwdev, phy, path, kidx, gain, txagc);
+       }
+
+       if (!is_fail)
+               dpk->bp[path][kidx].path_ok = true;
+       else
+               dpk->bp[path][kidx].path_ok = false;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s\n", path, kidx,
+                   is_fail ? "Check" : "Success");
+
+       return is_fail;
+}
+
+static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
+                           enum rtw89_phy_idx phy, u8 kpath)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+       static const u32 kip_reg[] = {0x813c, 0x8124, 0x8120};
+       u32 kip_bkup[RTW8852B_DPK_RF_PATH][RTW8852B_DPK_KIP_REG_NUM] = {};
+       u32 backup_rf_val[RTW8852B_DPK_RF_PATH][BACKUP_RF_REGS_NR];
+       u32 backup_bb_val[BACKUP_BB_REGS_NR];
+       bool is_fail = true, reloaded[RTW8852B_DPK_RF_PATH] = {};
+       u8 path;
+
+       if (dpk->is_dpk_reload_en) {
+               for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
+                       reloaded[path] = _dpk_reload_check(rtwdev, phy, path);
+                       if (!reloaded[path] && dpk->bp[path][0].ch)
+                               dpk->cur_idx[path] = !dpk->cur_idx[path];
+                       else
+                               _dpk_onoff(rtwdev, path, false);
+               }
+       } else {
+               for (path = 0; path < RTW8852B_DPK_RF_PATH; path++)
+                       dpk->cur_idx[path] = 0;
+       }
+
+       _rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]);
+
+       for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
+               _dpk_bkup_kip(rtwdev, kip_reg, kip_bkup, path);
+               _rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
+               _dpk_information(rtwdev, phy, path);
+               if (rtwdev->is_tssi_mode[path])
+                       _dpk_tssi_pause(rtwdev, path, true);
+       }
+
+       _dpk_bb_afe_setting(rtwdev, phy, path, kpath);
+
+       for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
+               is_fail = _dpk_main(rtwdev, phy, path, 1);
+               _dpk_onoff(rtwdev, path, is_fail);
+       }
+
+       _dpk_bb_afe_restore(rtwdev, phy, path, kpath);
+       _rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]);
+
+       for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
+               _dpk_kip_restore(rtwdev, path);
+               _dpk_reload_kip(rtwdev, kip_reg, kip_bkup, path);
+               _rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path);
+               if (rtwdev->is_tssi_mode[path])
+                       _dpk_tssi_pause(rtwdev, path, false);
+       }
+}
+
+static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       struct rtw89_fem_info *fem = &rtwdev->fem;
+
+       if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[DPK] Skip DPK due to 2G_ext_PA exist!!\n");
+               return true;
+       } else if (fem->epa_5g && chan->band_type == RTW89_BAND_5G) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[DPK] Skip DPK due to 5G_ext_PA exist!!\n");
+               return true;
+       } else if (fem->epa_6g && chan->band_type == RTW89_BAND_6G) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[DPK] Skip DPK due to 6G_ext_PA exist!!\n");
+               return true;
+       }
+
+       return false;
+}
+
+static void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
+{
+       u8 path, kpath;
+
+       kpath = _kpath(rtwdev, phy);
+
+       for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
+               if (kpath & BIT(path))
+                       _dpk_onoff(rtwdev, path, true);
+       }
+}
+
+static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force)
+{
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[DPK] ****** DPK Start (Ver: 0x%x, Cv: %d, RF_para: %d) ******\n",
+                   RTW8852B_DPK_VER, rtwdev->hal.cv,
+                   RTW8852B_RF_REL_VERSION);
+
+       if (_dpk_bypass_check(rtwdev, phy))
+               _dpk_force_bypass(rtwdev, phy);
+       else
+               _dpk_cal_select(rtwdev, force, phy, RF_AB);
+}
+
+static void _dpk_track(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+       s8 txagc_bb, txagc_bb_tp, ini_diff = 0, txagc_ofst;
+       s8 delta_ther[2] = {};
+       u8 trk_idx, txagc_rf;
+       u8 path, kidx;
+       u16 pwsf[2];
+       u8 cur_ther;
+       u32 tmp;
+
+       for (path = 0; path < RF_PATH_NUM_8852B; path++) {
+               kidx = dpk->cur_idx[path];
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
+                           "[DPK_TRK] ================[S%d[%d] (CH %d)]================\n",
+                           path, kidx, dpk->bp[path][kidx].ch);
+
+               cur_ther = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
+                           "[DPK_TRK] thermal now = %d\n", cur_ther);
+
+               if (dpk->bp[path][kidx].ch && cur_ther)
+                       delta_ther[path] = dpk->bp[path][kidx].ther_dpk - cur_ther;
+
+               if (dpk->bp[path][kidx].band == RTW89_BAND_2G)
+                       delta_ther[path] = delta_ther[path] * 3 / 2;
+               else
+                       delta_ther[path] = delta_ther[path] * 5 / 2;
+
+               txagc_rf = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),
+                                                0x0000003f);
+
+               if (rtwdev->is_tssi_mode[path]) {
+                       trk_idx = rtw89_read_rf(rtwdev, path, RR_TXA, RR_TXA_TRK);
+
+                       rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
+                                   "[DPK_TRK] txagc_RF / track_idx = 0x%x / %d\n",
+                                   txagc_rf, trk_idx);
+
+                       txagc_bb =
+                               rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),
+                                                     MASKBYTE2);
+                       txagc_bb_tp =
+                               rtw89_phy_read32_mask(rtwdev, R_TXAGC_TP + (path << 13),
+                                                     B_TXAGC_TP);
+
+                       rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
+                                   "[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n",
+                                   txagc_bb_tp, txagc_bb);
+
+                       txagc_ofst =
+                               rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),
+                                                     MASKBYTE3);
+
+                       rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
+                                   "[DPK_TRK] txagc_offset / delta_ther = %d / %d\n",
+                                   txagc_ofst, delta_ther[path]);
+                       tmp = rtw89_phy_read32_mask(rtwdev, R_DPD_COM + (path << 8),
+                                                   B_DPD_COM_OF);
+                       if (tmp == 0x1) {
+                               txagc_ofst = 0;
+                               rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
+                                           "[DPK_TRK] HW txagc offset mode\n");
+                       }
+
+                       if (txagc_rf && cur_ther)
+                               ini_diff = txagc_ofst + (delta_ther[path]);
+
+                       tmp = rtw89_phy_read32_mask(rtwdev,
+                                                   R_P0_TXDPD + (path << 13),
+                                                   B_P0_TXDPD);
+                       if (tmp == 0x0) {
+                               pwsf[0] = dpk->bp[path][kidx].pwsf +
+                                         txagc_bb_tp - txagc_bb + ini_diff;
+                               pwsf[1] = dpk->bp[path][kidx].pwsf +
+                                         txagc_bb_tp - txagc_bb + ini_diff;
+                       } else {
+                               pwsf[0] = dpk->bp[path][kidx].pwsf + ini_diff;
+                               pwsf[1] = dpk->bp[path][kidx].pwsf + ini_diff;
+                       }
+
+               } else {
+                       pwsf[0] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff;
+                       pwsf[1] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff;
+               }
+
+               tmp = rtw89_phy_read32_mask(rtwdev, R_DPK_TRK, B_DPK_TRK_DIS);
+               if (!tmp && txagc_rf) {
+                       rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
+                                   "[DPK_TRK] New pwsf[0] / pwsf[1] = 0x%x / 0x%x\n",
+                                   pwsf[0], pwsf[1]);
+
+                       rtw89_phy_write32_mask(rtwdev,
+                                              R_DPD_BND + (path << 8) + (kidx << 2),
+                                              B_DPD_BND_0, pwsf[0]);
+                       rtw89_phy_write32_mask(rtwdev,
+                                              R_DPD_BND + (path << 8) + (kidx << 2),
+                                              B_DPD_BND_1, pwsf[1]);
+               }
+       }
+}
+
+static void _set_dpd_backoff(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
+{
+       struct rtw89_dpk_info *dpk = &rtwdev->dpk;
+       u8 tx_scale, ofdm_bkof, path, kpath;
+
+       kpath = _kpath(rtwdev, phy);
+
+       ofdm_bkof = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_OFDM);
+       tx_scale = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_SCA);
+
+       if (ofdm_bkof + tx_scale >= 44) {
+               /* move dpd backoff to bb, and set dpd backoff to 0 */
+               dpk->dpk_gs[phy] = 0x7f;
+               for (path = 0; path < RF_PATH_NUM_8852B; path++) {
+                       if (!(kpath & BIT(path)))
+                               continue;
+
+                       rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8),
+                                              B_DPD_CFG, 0x7f7f7f);
+                       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                                   "[RFK] Set S%d DPD backoff to 0dB\n", path);
+               }
+       } else {
+               dpk->dpk_gs[phy] = 0x5b;
+       }
+}
+
+static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                            enum rtw89_rf_path path)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       enum rtw89_band band = chan->band_type;
+
+       if (band == RTW89_BAND_2G)
+               rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXG, 0x1);
+       else
+               rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXA, 0x1);
+}
+
+static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                         enum rtw89_rf_path path)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       enum rtw89_band band = chan->band_type;
+
+       rtw89_rfk_parser(rtwdev, &rtw8852b_tssi_sys_defs_tbl);
+
+       if (path == RF_PATH_A)
+               rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
+                                        &rtw8852b_tssi_sys_a_defs_2g_tbl,
+                                        &rtw8852b_tssi_sys_a_defs_5g_tbl);
+       else
+               rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
+                                        &rtw8852b_tssi_sys_b_defs_2g_tbl,
+                                        &rtw8852b_tssi_sys_b_defs_5g_tbl);
+}
+
+static void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev,
+                                   enum rtw89_phy_idx phy,
+                                   enum rtw89_rf_path path)
+{
+       rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
+                                &rtw8852b_tssi_init_txpwr_defs_a_tbl,
+                                &rtw8852b_tssi_init_txpwr_defs_b_tbl);
+}
+
+static void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev,
+                                         enum rtw89_phy_idx phy,
+                                         enum rtw89_rf_path path)
+{
+       rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
+                                &rtw8852b_tssi_init_txpwr_he_tb_defs_a_tbl,
+                                &rtw8852b_tssi_init_txpwr_he_tb_defs_b_tbl);
+}
+
+static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                         enum rtw89_rf_path path)
+{
+       rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
+                                &rtw8852b_tssi_dck_defs_a_tbl,
+                                &rtw8852b_tssi_dck_defs_b_tbl);
+}
+
+static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                                enum rtw89_rf_path path)
+{
+#define RTW8852B_TSSI_GET_VAL(ptr, idx)                        \
+({                                                     \
+       s8 *__ptr = (ptr);                              \
+       u8 __idx = (idx), __i, __v;                     \
+       u32 __val = 0;                                  \
+       for (__i = 0; __i < 4; __i++) {                 \
+               __v = (__ptr[__idx + __i]);             \
+               __val |= (__v << (8 * __i));            \
+       }                                               \
+       __val;                                          \
+})
+       struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       u8 ch = chan->channel;
+       u8 subband = chan->subband_type;
+       const s8 *thm_up_a = NULL;
+       const s8 *thm_down_a = NULL;
+       const s8 *thm_up_b = NULL;
+       const s8 *thm_down_b = NULL;
+       u8 thermal = 0xff;
+       s8 thm_ofst[64] = {0};
+       u32 tmp = 0;
+       u8 i, j;
+
+       switch (subband) {
+       default:
+       case RTW89_CH_2G:
+               thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_2ga_p;
+               thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_2ga_n;
+               thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_2gb_p;
+               thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_2gb_n;
+               break;
+       case RTW89_CH_5G_BAND_1:
+               thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[0];
+               thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[0];
+               thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[0];
+               thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[0];
+               break;
+       case RTW89_CH_5G_BAND_3:
+               thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[1];
+               thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[1];
+               thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[1];
+               thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[1];
+               break;
+       case RTW89_CH_5G_BAND_4:
+               thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[2];
+               thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[2];
+               thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[2];
+               thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[2];
+               break;
+       }
+
+       if (path == RF_PATH_A) {
+               thermal = tssi_info->thermal[RF_PATH_A];
+
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal);
+
+               rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1);
+
+               if (thermal == 0xff) {
+                       rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32);
+                       rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32);
+
+                       for (i = 0; i < 64; i += 4) {
+                               rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0);
+
+                               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                                           "[TSSI] write 0x%x val=0x%08x\n",
+                                           R_P0_TSSI_BASE + i, 0x0);
+                       }
+
+               } else {
+                       rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, thermal);
+                       rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL,
+                                              thermal);
+
+                       i = 0;
+                       for (j = 0; j < 32; j++)
+                               thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
+                                             -thm_down_a[i++] :
+                                             -thm_down_a[DELTA_SWINGIDX_SIZE - 1];
+
+                       i = 1;
+                       for (j = 63; j >= 32; j--)
+                               thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
+                                             thm_up_a[i++] :
+                                             thm_up_a[DELTA_SWINGIDX_SIZE - 1];
+
+                       for (i = 0; i < 64; i += 4) {
+                               tmp = RTW8852B_TSSI_GET_VAL(thm_ofst, i);
+                               rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp);
+
+                               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                                           "[TSSI] write 0x%x val=0x%08x\n",
+                                           0x5c00 + i, tmp);
+                       }
+               }
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0);
+
+       } else {
+               thermal = tssi_info->thermal[RF_PATH_B];
+
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI] ch=%d thermal_pathB=0x%x\n", ch, thermal);
+
+               rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_DIS, 0x0);
+               rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_TRK, 0x1);
+
+               if (thermal == 0xff) {
+                       rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, 32);
+                       rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 32);
+
+                       for (i = 0; i < 64; i += 4) {
+                               rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, 0x0);
+
+                               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                                           "[TSSI] write 0x%x val=0x%08x\n",
+                                           0x7c00 + i, 0x0);
+                       }
+
+               } else {
+                       rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, thermal);
+                       rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL,
+                                              thermal);
+
+                       i = 0;
+                       for (j = 0; j < 32; j++)
+                               thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
+                                             -thm_down_b[i++] :
+                                             -thm_down_b[DELTA_SWINGIDX_SIZE - 1];
+
+                       i = 1;
+                       for (j = 63; j >= 32; j--)
+                               thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
+                                             thm_up_b[i++] :
+                                             thm_up_b[DELTA_SWINGIDX_SIZE - 1];
+
+                       for (i = 0; i < 64; i += 4) {
+                               tmp = RTW8852B_TSSI_GET_VAL(thm_ofst, i);
+                               rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, tmp);
+
+                               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                                           "[TSSI] write 0x%x val=0x%08x\n",
+                                           0x7c00 + i, tmp);
+                       }
+               }
+               rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x1);
+               rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x0);
+       }
+#undef RTW8852B_TSSI_GET_VAL
+}
+
+static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                                  enum rtw89_rf_path path)
+{
+       rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
+                                &rtw8852b_tssi_dac_gain_defs_a_tbl,
+                                &rtw8852b_tssi_dac_gain_defs_b_tbl);
+}
+
+static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                               enum rtw89_rf_path path)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       enum rtw89_band band = chan->band_type;
+
+       if (path == RF_PATH_A)
+               rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
+                                        &rtw8852b_tssi_slope_a_defs_2g_tbl,
+                                        &rtw8852b_tssi_slope_a_defs_5g_tbl);
+       else
+               rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
+                                        &rtw8852b_tssi_slope_b_defs_2g_tbl,
+                                        &rtw8852b_tssi_slope_b_defs_5g_tbl);
+}
+
+static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                                   enum rtw89_rf_path path, bool all)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       enum rtw89_band band = chan->band_type;
+       const struct rtw89_rfk_tbl *tbl = NULL;
+       u8 ch = chan->channel;
+
+       if (path == RF_PATH_A) {
+               if (band == RTW89_BAND_2G) {
+                       if (all)
+                               tbl = &rtw8852b_tssi_align_a_2g_all_defs_tbl;
+                       else
+                               tbl = &rtw8852b_tssi_align_a_2g_part_defs_tbl;
+               } else if (ch >= 36 && ch <= 64) {
+                       if (all)
+                               tbl = &rtw8852b_tssi_align_a_5g1_all_defs_tbl;
+                       else
+                               tbl = &rtw8852b_tssi_align_a_5g1_part_defs_tbl;
+               } else if (ch >= 100 && ch <= 144) {
+                       if (all)
+                               tbl = &rtw8852b_tssi_align_a_5g2_all_defs_tbl;
+                       else
+                               tbl = &rtw8852b_tssi_align_a_5g2_part_defs_tbl;
+               } else if (ch >= 149 && ch <= 177) {
+                       if (all)
+                               tbl = &rtw8852b_tssi_align_a_5g3_all_defs_tbl;
+                       else
+                               tbl = &rtw8852b_tssi_align_a_5g3_part_defs_tbl;
+               }
+       } else {
+               if (ch >= 1 && ch <= 14) {
+                       if (all)
+                               tbl = &rtw8852b_tssi_align_b_2g_all_defs_tbl;
+                       else
+                               tbl = &rtw8852b_tssi_align_b_2g_part_defs_tbl;
+               } else if (ch >= 36 && ch <= 64) {
+                       if (all)
+                               tbl = &rtw8852b_tssi_align_b_5g1_all_defs_tbl;
+                       else
+                               tbl = &rtw8852b_tssi_align_b_5g1_part_defs_tbl;
+               } else if (ch >= 100 && ch <= 144) {
+                       if (all)
+                               tbl = &rtw8852b_tssi_align_b_5g2_all_defs_tbl;
+                       else
+                               tbl = &rtw8852b_tssi_align_b_5g2_part_defs_tbl;
+               } else if (ch >= 149 && ch <= 177) {
+                       if (all)
+                               tbl = &rtw8852b_tssi_align_b_5g3_all_defs_tbl;
+                       else
+                               tbl = &rtw8852b_tssi_align_b_5g3_part_defs_tbl;
+               }
+       }
+
+       if (tbl)
+               rtw89_rfk_parser(rtwdev, tbl);
+}
+
+static void _tssi_set_tssi_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                                enum rtw89_rf_path path)
+{
+       rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
+                                &rtw8852b_tssi_slope_defs_a_tbl,
+                                &rtw8852b_tssi_slope_defs_b_tbl);
+}
+
+static void _tssi_set_tssi_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                                enum rtw89_rf_path path)
+{
+       if (path == RF_PATH_A)
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSIC, B_P0_TSSIC_BYPASS, 0x0);
+       else
+               rtw89_phy_write32_mask(rtwdev, R_P1_TSSIC, B_P1_TSSIC_BYPASS, 0x0);
+}
+
+static void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev,
+                                         enum rtw89_phy_idx phy,
+                                         enum rtw89_rf_path path)
+{
+       rtw89_debug(rtwdev, RTW89_DBG_TSSI, "======>%s   path=%d\n", __func__,
+                   path);
+
+       if (path == RF_PATH_A)
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_MIX, 0x010);
+       else
+               rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_RFCTM_DEL, 0x010);
+}
+
+static void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
+{
+       u8 i;
+
+       for (i = 0; i < RF_PATH_NUM_8852B; i++) {
+               _tssi_set_tssi_track(rtwdev, phy, i);
+               _tssi_set_txagc_offset_mv_avg(rtwdev, phy, i);
+
+               if (i == RF_PATH_A) {
+                       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG,
+                                              B_P0_TSSI_MV_CLR, 0x0);
+                       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG,
+                                              B_P0_TSSI_EN, 0x0);
+                       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG,
+                                              B_P0_TSSI_EN, 0x1);
+                       rtw89_write_rf(rtwdev, i, RR_TXGA_V1,
+                                      RR_TXGA_V1_TRK_EN, 0x1);
+                       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
+                                              B_P0_TSSI_RFC, 0x3);
+
+                       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
+                                              B_P0_TSSI_OFT, 0xc0);
+                       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
+                                              B_P0_TSSI_OFT_EN, 0x0);
+                       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
+                                              B_P0_TSSI_OFT_EN, 0x1);
+
+                       rtwdev->is_tssi_mode[RF_PATH_A] = true;
+               } else {
+                       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG,
+                                              B_P1_TSSI_MV_CLR, 0x0);
+                       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG,
+                                              B_P1_TSSI_EN, 0x0);
+                       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG,
+                                              B_P1_TSSI_EN, 0x1);
+                       rtw89_write_rf(rtwdev, i, RR_TXGA_V1,
+                                      RR_TXGA_V1_TRK_EN, 0x1);
+                       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
+                                              B_P1_TSSI_RFC, 0x3);
+
+                       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
+                                              B_P1_TSSI_OFT, 0xc0);
+                       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
+                                              B_P1_TSSI_OFT_EN, 0x0);
+                       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
+                                              B_P1_TSSI_OFT_EN, 0x1);
+
+                       rtwdev->is_tssi_mode[RF_PATH_B] = true;
+               }
+       }
+}
+
+static void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
+{
+       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_RFC, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_CLR, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_EN, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_RFC, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_CLR, 0x1);
+
+       rtwdev->is_tssi_mode[RF_PATH_A] = false;
+       rtwdev->is_tssi_mode[RF_PATH_B] = false;
+}
+
+static u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch)
+{
+       switch (ch) {
+       case 1 ... 2:
+               return 0;
+       case 3 ... 5:
+               return 1;
+       case 6 ... 8:
+               return 2;
+       case 9 ... 11:
+               return 3;
+       case 12 ... 13:
+               return 4;
+       case 14:
+               return 5;
+       }
+
+       return 0;
+}
+
+#define TSSI_EXTRA_GROUP_BIT (BIT(31))
+#define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx))
+#define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT)
+#define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT)
+#define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1)
+
+static u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch)
+{
+       switch (ch) {
+       case 1 ... 2:
+               return 0;
+       case 3 ... 5:
+               return 1;
+       case 6 ... 8:
+               return 2;
+       case 9 ... 11:
+               return 3;
+       case 12 ... 14:
+               return 4;
+       case 36 ... 40:
+               return 5;
+       case 41 ... 43:
+               return TSSI_EXTRA_GROUP(5);
+       case 44 ... 48:
+               return 6;
+       case 49 ... 51:
+               return TSSI_EXTRA_GROUP(6);
+       case 52 ... 56:
+               return 7;
+       case 57 ... 59:
+               return TSSI_EXTRA_GROUP(7);
+       case 60 ... 64:
+               return 8;
+       case 100 ... 104:
+               return 9;
+       case 105 ... 107:
+               return TSSI_EXTRA_GROUP(9);
+       case 108 ... 112:
+               return 10;
+       case 113 ... 115:
+               return TSSI_EXTRA_GROUP(10);
+       case 116 ... 120:
+               return 11;
+       case 121 ... 123:
+               return TSSI_EXTRA_GROUP(11);
+       case 124 ... 128:
+               return 12;
+       case 129 ... 131:
+               return TSSI_EXTRA_GROUP(12);
+       case 132 ... 136:
+               return 13;
+       case 137 ... 139:
+               return TSSI_EXTRA_GROUP(13);
+       case 140 ... 144:
+               return 14;
+       case 149 ... 153:
+               return 15;
+       case 154 ... 156:
+               return TSSI_EXTRA_GROUP(15);
+       case 157 ... 161:
+               return 16;
+       case 162 ... 164:
+               return TSSI_EXTRA_GROUP(16);
+       case 165 ... 169:
+               return 17;
+       case 170 ... 172:
+               return TSSI_EXTRA_GROUP(17);
+       case 173 ... 177:
+               return 18;
+       }
+
+       return 0;
+}
+
+static u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch)
+{
+       switch (ch) {
+       case 1 ... 8:
+               return 0;
+       case 9 ... 14:
+               return 1;
+       case 36 ... 48:
+               return 2;
+       case 52 ... 64:
+               return 3;
+       case 100 ... 112:
+               return 4;
+       case 116 ... 128:
+               return 5;
+       case 132 ... 144:
+               return 6;
+       case 149 ... 177:
+               return 7;
+       }
+
+       return 0;
+}
+
+static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                           enum rtw89_rf_path path)
+{
+       struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       u8 ch = chan->channel;
+       u32 gidx, gidx_1st, gidx_2nd;
+       s8 de_1st;
+       s8 de_2nd;
+       s8 val;
+
+       gidx = _tssi_get_ofdm_group(rtwdev, ch);
+
+       rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                   "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", path, gidx);
+
+       if (IS_TSSI_EXTRA_GROUP(gidx)) {
+               gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx);
+               gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx);
+               de_1st = tssi_info->tssi_mcs[path][gidx_1st];
+               de_2nd = tssi_info->tssi_mcs[path][gidx_2nd];
+               val = (de_1st + de_2nd) / 2;
+
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n",
+                           path, val, de_1st, de_2nd);
+       } else {
+               val = tssi_info->tssi_mcs[path][gidx];
+
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val);
+       }
+
+       return val;
+}
+
+static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                                enum rtw89_rf_path path)
+{
+       struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       u8 ch = chan->channel;
+       u32 tgidx, tgidx_1st, tgidx_2nd;
+       s8 tde_1st;
+       s8 tde_2nd;
+       s8 val;
+
+       tgidx = _tssi_get_trim_group(rtwdev, ch);
+
+       rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                   "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n",
+                   path, tgidx);
+
+       if (IS_TSSI_EXTRA_GROUP(tgidx)) {
+               tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx);
+               tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx);
+               tde_1st = tssi_info->tssi_trim[path][tgidx_1st];
+               tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd];
+               val = (tde_1st + tde_2nd) / 2;
+
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n",
+                           path, val, tde_1st, tde_2nd);
+       } else {
+               val = tssi_info->tssi_trim[path][tgidx];
+
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI][TRIM]: path=%d mcs trim_de=%d\n",
+                           path, val);
+       }
+
+       return val;
+}
+
+static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
+{
+       struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       u8 ch = chan->channel;
+       u8 gidx;
+       s8 ofdm_de;
+       s8 trim_de;
+       s32 val;
+       u32 i;
+
+       rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n",
+                   phy, ch);
+
+       for (i = RF_PATH_A; i < RF_PATH_NUM_8852B; i++) {
+               gidx = _tssi_get_cck_group(rtwdev, ch);
+               trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
+               val = tssi_info->tssi_cck[i][gidx] + trim_de;
+
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n",
+                           i, gidx, tssi_info->tssi_cck[i][gidx], trim_de);
+
+               rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_long[i], _TSSI_DE_MASK, val);
+               rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_short[i], _TSSI_DE_MASK, val);
+
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n",
+                           _tssi_de_cck_long[i],
+                           rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i],
+                                                 _TSSI_DE_MASK));
+
+               ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i);
+               trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
+               val = ofdm_de + trim_de;
+
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n",
+                           i, ofdm_de, trim_de);
+
+               rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_20m[i], _TSSI_DE_MASK, val);
+               rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_40m[i], _TSSI_DE_MASK, val);
+               rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m[i], _TSSI_DE_MASK, val);
+               rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m_80m[i], _TSSI_DE_MASK, val);
+               rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_5m[i], _TSSI_DE_MASK, val);
+               rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_10m[i], _TSSI_DE_MASK, val);
+
+               rtw89_debug(rtwdev, RTW89_DBG_TSSI,
+                           "[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n",
+                           _tssi_de_mcs_20m[i],
+                           rtw89_phy_read32_mask(rtwdev, _tssi_de_mcs_20m[i],
+                                                 _TSSI_DE_MASK));
+       }
+}
+
+static void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
+{
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[TSSI PA K]\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n"
+                   "0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n",
+                   R_TSSI_PA_K1 + (path << 13),
+                   rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K1 + (path << 13), MASKDWORD),
+                   R_TSSI_PA_K2 + (path << 13),
+                   rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K2 + (path << 13), MASKDWORD),
+                   R_P0_TSSI_ALIM1 + (path << 13),
+                   rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD),
+                   R_P0_TSSI_ALIM3 + (path << 13),
+                   rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD),
+                   R_TSSI_PA_K5 + (path << 13),
+                   rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K5 + (path << 13), MASKDWORD),
+                   R_P0_TSSI_ALIM2 + (path << 13),
+                   rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD),
+                   R_P0_TSSI_ALIM4 + (path << 13),
+                   rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD),
+                   R_TSSI_PA_K8 + (path << 13),
+                   rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K8 + (path << 13), MASKDWORD));
+}
+
+static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
+                               enum rtw89_phy_idx phy, enum rtw89_rf_path path)
+{
+       struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       u8 channel = chan->channel;
+       u8 band;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "======>%s   phy=%d   path=%d\n", __func__, phy, path);
+
+       if (channel >= 1 && channel <= 14)
+               band = TSSI_ALIMK_2G;
+       else if (channel >= 36 && channel <= 64)
+               band = TSSI_ALIMK_5GL;
+       else if (channel >= 100 && channel <= 144)
+               band = TSSI_ALIMK_5GM;
+       else if (channel >= 149 && channel <= 177)
+               band = TSSI_ALIMK_5GH;
+       else
+               band = TSSI_ALIMK_2G;
+
+       if (tssi_info->alignment_done[path][band]) {
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD,
+                                      tssi_info->alignment_value[path][band][0]);
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD,
+                                      tssi_info->alignment_value[path][band][1]);
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD,
+                                      tssi_info->alignment_value[path][band][2]);
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD,
+                                      tssi_info->alignment_value[path][band][3]);
+       }
+
+       _tssi_alimentk_dump_result(rtwdev, path);
+}
+
+static void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                       enum rtw89_rf_path path, u16 cnt, u16 period, s16 pwr_dbm,
+                       u8 enable)
+{
+       enum rtw89_rf_path_bit rx_path;
+
+       if (path == RF_PATH_A)
+               rx_path = RF_A;
+       else if (path == RF_PATH_B)
+               rx_path = RF_B;
+       else if (path == RF_PATH_AB)
+               rx_path = RF_AB;
+       else
+               rx_path = RF_ABCD; /* don't change path, but still set others */
+
+       if (enable) {
+               rtw8852b_bb_set_plcp_tx(rtwdev);
+               rtw8852b_bb_cfg_tx_path(rtwdev, path);
+               rtw8852b_bb_ctrl_rx_path(rtwdev, rx_path);
+               rtw8852b_bb_set_power(rtwdev, pwr_dbm, phy);
+       }
+
+       rtw8852b_bb_set_pmac_pkt_tx(rtwdev, enable, cnt, period, 20, phy);
+}
+
+static void _tssi_backup_bb_registers(struct rtw89_dev *rtwdev,
+                                     enum rtw89_phy_idx phy, const u32 reg[],
+                                     u32 reg_backup[], u32 reg_num)
+{
+       u32 i;
+
+       for (i = 0; i < reg_num; i++) {
+               reg_backup[i] = rtw89_phy_read32_mask(rtwdev, reg[i], MASKDWORD);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[TSSI] Backup BB 0x%x = 0x%x\n", reg[i],
+                           reg_backup[i]);
+       }
+}
+
+static void _tssi_reload_bb_registers(struct rtw89_dev *rtwdev,
+                                     enum rtw89_phy_idx phy, const u32 reg[],
+                                     u32 reg_backup[], u32 reg_num)
+
+{
+       u32 i;
+
+       for (i = 0; i < reg_num; i++) {
+               rtw89_phy_write32_mask(rtwdev, reg[i], MASKDWORD, reg_backup[i]);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[TSSI] Reload BB 0x%x = 0x%x\n", reg[i],
+                           reg_backup[i]);
+       }
+}
+
+static u8 _tssi_ch_to_idx(struct rtw89_dev *rtwdev, u8 channel)
+{
+       u8 channel_index;
+
+       if (channel >= 1 && channel <= 14)
+               channel_index = channel - 1;
+       else if (channel >= 36 && channel <= 64)
+               channel_index = (channel - 36) / 2 + 14;
+       else if (channel >= 100 && channel <= 144)
+               channel_index = ((channel - 100) / 2) + 15 + 14;
+       else if (channel >= 149 && channel <= 177)
+               channel_index = ((channel - 149) / 2) + 38 + 14;
+       else
+               channel_index = 0;
+
+       return channel_index;
+}
+
+static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                               enum rtw89_rf_path path, const s16 *power,
+                               u32 *tssi_cw_rpt)
+{
+       u32 tx_counter, tx_counter_tmp;
+       const int retry = 100;
+       u32 tmp;
+       int j, k;
+
+       for (j = 0; j < RTW8852B_TSSI_PATH_NR; j++) {
+               rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x0);
+               rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x1);
+
+               tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
+
+               tmp = rtw89_phy_read32_mask(rtwdev, _tssi_trigger[path], MASKDWORD);
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[TSSI PA K] 0x%x = 0x%08x   path=%d\n",
+                           _tssi_trigger[path], tmp, path);
+
+               if (j == 0)
+                       _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], true);
+               else
+                       _tssi_hw_tx(rtwdev, phy, RF_PATH_ABCD, 100, 5000, power[j], true);
+
+               tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
+               tx_counter_tmp -= tx_counter;
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[TSSI PA K] First HWTXcounter=%d path=%d\n",
+                           tx_counter_tmp, path);
+
+               for (k = 0; k < retry; k++) {
+                       tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path],
+                                                   B_TSSI_CWRPT_RDY);
+                       if (tmp)
+                               break;
+
+                       udelay(30);
+
+                       tx_counter_tmp =
+                               rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
+                       tx_counter_tmp -= tx_counter;
+
+                       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                                   "[TSSI PA K] Flow k = %d HWTXcounter=%d path=%d\n",
+                                   k, tx_counter_tmp, path);
+               }
+
+               if (k >= retry) {
+                       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                                   "[TSSI PA K] TSSI finish bit k > %d mp:100ms normal:30us path=%d\n",
+                                   k, path);
+
+                       _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false);
+                       return false;
+               }
+
+               tssi_cw_rpt[j] =
+                       rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path], B_TSSI_CWRPT);
+
+               _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false);
+
+               tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
+               tx_counter_tmp -= tx_counter;
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[TSSI PA K] Final HWTXcounter=%d path=%d\n",
+                           tx_counter_tmp, path);
+       }
+
+       return true;
+}
+
+static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                          enum rtw89_rf_path path)
+{
+       static const u32 bb_reg[8] = {0x5820, 0x7820, 0x4978, 0x58e4,
+                                     0x78e4, 0x49c0, 0x0d18, 0x0d80};
+       static const s16 power_2g[4] = {48, 20, 4, 4};
+       static const s16 power_5g[4] = {48, 20, 4, 4};
+       struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       s32 tssi_alim_offset_1, tssi_alim_offset_2, tssi_alim_offset_3;
+       u32 tssi_cw_rpt[RTW8852B_TSSI_PATH_NR] = {0};
+       u8 channel = chan->channel;
+       u8 ch_idx = _tssi_ch_to_idx(rtwdev, channel);
+       struct rtw8852b_bb_tssi_bak tssi_bak;
+       s32 aliment_diff, tssi_cw_default;
+       u32 start_time, finish_time;
+       u32 bb_reg_backup[8] = {0};
+       const s16 *power;
+       u8 band;
+       bool ok;
+       u32 tmp;
+       u8 j;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "======> %s   channel=%d   path=%d\n", __func__, channel,
+                   path);
+
+       if (tssi_info->check_backup_aligmk[path][ch_idx]) {
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD,
+                                      tssi_info->alignment_backup_by_ch[path][ch_idx][0]);
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD,
+                                      tssi_info->alignment_backup_by_ch[path][ch_idx][1]);
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD,
+                                      tssi_info->alignment_backup_by_ch[path][ch_idx][2]);
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD,
+                                      tssi_info->alignment_backup_by_ch[path][ch_idx][3]);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "======> %s   Reload TSSI Alignment !!!\n", __func__);
+               _tssi_alimentk_dump_result(rtwdev, path);
+               return;
+       }
+
+       start_time = ktime_get_ns();
+
+       if (chan->band_type == RTW89_BAND_2G)
+               power = power_2g;
+       else
+               power = power_5g;
+
+       if (channel >= 1 && channel <= 14)
+               band = TSSI_ALIMK_2G;
+       else if (channel >= 36 && channel <= 64)
+               band = TSSI_ALIMK_5GL;
+       else if (channel >= 100 && channel <= 144)
+               band = TSSI_ALIMK_5GM;
+       else if (channel >= 149 && channel <= 177)
+               band = TSSI_ALIMK_5GH;
+       else
+               band = TSSI_ALIMK_2G;
+
+       rtw8852b_bb_backup_tssi(rtwdev, phy, &tssi_bak);
+       _tssi_backup_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup, ARRAY_SIZE(bb_reg_backup));
+
+       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_AVG, 0x8);
+       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_AVG, 0x8);
+       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x2);
+       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x2);
+
+       ok = _tssi_get_cw_report(rtwdev, phy, path, power, tssi_cw_rpt);
+       if (!ok)
+               goto out;
+
+       for (j = 0; j < RTW8852B_TSSI_PATH_NR; j++) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[TSSI PA K] power[%d]=%d  tssi_cw_rpt[%d]=%d\n", j,
+                           power[j], j, tssi_cw_rpt[j]);
+       }
+
+       tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][1],
+                                   _tssi_cw_default_mask[1]);
+       tssi_cw_default = sign_extend32(tmp, 8);
+       tssi_alim_offset_1 = tssi_cw_rpt[0] - ((power[0] - power[1]) * 2) -
+                            tssi_cw_rpt[1] + tssi_cw_default;
+       aliment_diff = tssi_alim_offset_1 - tssi_cw_default;
+
+       tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][2],
+                                   _tssi_cw_default_mask[2]);
+       tssi_cw_default = sign_extend32(tmp, 8);
+       tssi_alim_offset_2 = tssi_cw_default + aliment_diff;
+
+       tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][3],
+                                   _tssi_cw_default_mask[3]);
+       tssi_cw_default = sign_extend32(tmp, 8);
+       tssi_alim_offset_3 = tssi_cw_default + aliment_diff;
+
+       if (path == RF_PATH_A) {
+               tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) |
+                     FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) |
+                     FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3);
+
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM1, tmp);
+               rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2, B_P0_TSSI_ALIM2, tmp);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[TSSI PA K] tssi_alim_offset = 0x%x   0x%x   0x%x   0x%x\n",
+                           rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3, B_P0_TSSI_ALIM31),
+                           rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM11),
+                           rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM12),
+                           rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM13));
+       } else {
+               tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) |
+                     FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) |
+                     FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3);
+
+               rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM1, tmp);
+               rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM2, B_P1_TSSI_ALIM2, tmp);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[TSSI PA K] tssi_alim_offset = 0x%x   0x%x   0x%x   0x%x\n",
+                           rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM3, B_P1_TSSI_ALIM31),
+                           rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM11),
+                           rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM12),
+                           rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM13));
+       }
+
+       tssi_info->alignment_done[path][band] = true;
+       tssi_info->alignment_value[path][band][0] =
+               rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD);
+       tssi_info->alignment_value[path][band][1] =
+               rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD);
+       tssi_info->alignment_value[path][band][2] =
+               rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD);
+       tssi_info->alignment_value[path][band][3] =
+               rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD);
+
+       tssi_info->check_backup_aligmk[path][ch_idx] = true;
+       tssi_info->alignment_backup_by_ch[path][ch_idx][0] =
+               rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD);
+       tssi_info->alignment_backup_by_ch[path][ch_idx][1] =
+               rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD);
+       tssi_info->alignment_backup_by_ch[path][ch_idx][2] =
+               rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD);
+       tssi_info->alignment_backup_by_ch[path][ch_idx][3] =
+               rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][0], 0x%x = 0x%08x\n",
+                   path, band, R_P0_TSSI_ALIM1 + (path << 13),
+                   tssi_info->alignment_value[path][band][0]);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][1], 0x%x = 0x%08x\n",
+                   path, band, R_P0_TSSI_ALIM3 + (path << 13),
+                   tssi_info->alignment_value[path][band][1]);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][2], 0x%x = 0x%08x\n",
+                   path, band, R_P0_TSSI_ALIM2 + (path << 13),
+                   tssi_info->alignment_value[path][band][2]);
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][3], 0x%x = 0x%08x\n",
+                   path, band, R_P0_TSSI_ALIM4 + (path << 13),
+                   tssi_info->alignment_value[path][band][3]);
+
+out:
+       _tssi_reload_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup, ARRAY_SIZE(bb_reg_backup));
+       rtw8852b_bb_restore_tssi(rtwdev, phy, &tssi_bak);
+       rtw8852b_bb_tx_mode_switch(rtwdev, phy, 0);
+
+       finish_time = ktime_get_ns();
+       tssi_info->tssi_alimk_time += finish_time - start_time;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[TSSI PA K] %s processing time = %d ms\n", __func__,
+                   tssi_info->tssi_alimk_time);
+}
+
+void rtw8852b_dpk_init(struct rtw89_dev *rtwdev)
+{
+       _set_dpd_backoff(rtwdev, RTW89_PHY_0);
+}
+
+void rtw8852b_rck(struct rtw89_dev *rtwdev)
+{
+       u8 path;
+
+       for (path = 0; path < RF_PATH_NUM_8852B; path++)
+               _rck(rtwdev, path);
+}
+
+void rtw8852b_dack(struct rtw89_dev *rtwdev)
+{
+       u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
+
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
+       _dac_cal(rtwdev, false);
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP);
+}
+
+void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
+{
+       u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
+       u32 tx_en;
+
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
+       rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
+       _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
+
+       _iqk_init(rtwdev);
+       _iqk(rtwdev, phy_idx, false);
+
+       rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
+}
+
+void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
+{
+       u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
+       u32 tx_en;
+
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
+       rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
+       _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
+
+       _rx_dck(rtwdev, phy_idx);
+
+       rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
+}
+
+void rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
+{
+       u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
+       u32 tx_en;
+
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
+       rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
+       _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
+
+       rtwdev->dpk.is_dpk_enable = true;
+       rtwdev->dpk.is_dpk_reload_en = false;
+       _dpk(rtwdev, phy_idx, false);
+
+       rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);
+}
+
+void rtw8852b_dpk_track(struct rtw89_dev *rtwdev)
+{
+       _dpk_track(rtwdev);
+}
+
+void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en)
+{
+       u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB);
+       u32 tx_en;
+       u8 i;
+
+       rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy);
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
+
+       _tssi_disable(rtwdev, phy);
+
+       for (i = RF_PATH_A; i < RF_PATH_NUM_8852B; i++) {
+               _tssi_rf_setting(rtwdev, phy, i);
+               _tssi_set_sys(rtwdev, phy, i);
+               _tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i);
+               _tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i);
+               _tssi_set_dck(rtwdev, phy, i);
+               _tssi_set_tmeter_tbl(rtwdev, phy, i);
+               _tssi_set_dac_gain_tbl(rtwdev, phy, i);
+               _tssi_slope_cal_org(rtwdev, phy, i);
+               _tssi_alignment_default(rtwdev, phy, i, true);
+               _tssi_set_tssi_slope(rtwdev, phy, i);
+
+               rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL);
+               _tmac_tx_pause(rtwdev, phy, true);
+               if (hwtx_en)
+                       _tssi_alimentk(rtwdev, phy, i);
+               _tmac_tx_pause(rtwdev, phy, false);
+               rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en);
+       }
+
+       _tssi_enable(rtwdev, phy);
+       _tssi_set_efuse_to_de(rtwdev, phy);
+
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
+}
+
+void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
+       u8 channel = chan->channel;
+       u8 band;
+       u32 i;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "======>%s   phy=%d  channel=%d\n", __func__, phy, channel);
+
+       if (channel >= 1 && channel <= 14)
+               band = TSSI_ALIMK_2G;
+       else if (channel >= 36 && channel <= 64)
+               band = TSSI_ALIMK_5GL;
+       else if (channel >= 100 && channel <= 144)
+               band = TSSI_ALIMK_5GM;
+       else if (channel >= 149 && channel <= 177)
+               band = TSSI_ALIMK_5GH;
+       else
+               band = TSSI_ALIMK_2G;
+
+       _tssi_disable(rtwdev, phy);
+
+       for (i = RF_PATH_A; i < RTW8852B_TSSI_PATH_NR; i++) {
+               _tssi_rf_setting(rtwdev, phy, i);
+               _tssi_set_sys(rtwdev, phy, i);
+               _tssi_set_tmeter_tbl(rtwdev, phy, i);
+
+               if (tssi_info->alignment_done[i][band])
+                       _tssi_alimentk_done(rtwdev, phy, i);
+               else
+                       _tssi_alignment_default(rtwdev, phy, i, true);
+       }
+
+       _tssi_enable(rtwdev, phy);
+       _tssi_set_efuse_to_de(rtwdev, phy);
+}
+
+static void rtw8852b_tssi_default_txagc(struct rtw89_dev *rtwdev,
+                                       enum rtw89_phy_idx phy, bool enable)
+{
+       const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
+       u8 channel = chan->channel;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s   ch=%d\n",
+                   __func__, channel);
+
+       if (enable) {
+               if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B])
+                       rtw8852b_tssi(rtwdev, phy, true);
+               return;
+       }
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "======>%s 1 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n",
+                   __func__,
+                   rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT),
+                   rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT));
+
+       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 0xc0);
+       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT,  0xc0);
+       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1);
+       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0);
+       rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1);
+
+       _tssi_alimentk_done(rtwdev, phy, RF_PATH_A);
+       _tssi_alimentk_done(rtwdev, phy, RF_PATH_B);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n",
+                   __func__,
+                   rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT),
+                   rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT));
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "======> %s   SCAN_END\n", __func__);
+}
+
+void rtw8852b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
+                              enum rtw89_phy_idx phy_idx)
+{
+       if (scan_start)
+               rtw8852b_tssi_default_txagc(rtwdev, phy_idx, true);
+       else
+               rtw8852b_tssi_default_txagc(rtwdev, phy_idx, false);
+}
+
+static void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
+                       enum rtw89_bandwidth bw, bool dav)
+{
+       u32 rf_reg18;
+       u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__);
+
+       rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK);
+       if (rf_reg18 == INV_RF_DATA) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                           "[RFK]Invalid RF_0x18 for Path-%d\n", path);
+               return;
+       }
+       rf_reg18 &= ~RR_CFGCH_BW;
+
+       switch (bw) {
+       case RTW89_CHANNEL_WIDTH_5:
+       case RTW89_CHANNEL_WIDTH_10:
+       case RTW89_CHANNEL_WIDTH_20:
+               rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_20M);
+               break;
+       case RTW89_CHANNEL_WIDTH_40:
+               rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_40M);
+               break;
+       case RTW89_CHANNEL_WIDTH_80:
+               rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_80M);
+               break;
+       default:
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]Fail to set CH\n");
+       }
+
+       rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN |
+                     RR_CFGCH_BW2) & RFREG_MASK;
+       rf_reg18 |= RR_CFGCH_BW2;
+       rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set %x at path%d, %x =0x%x\n",
+                   bw, path, reg18_addr,
+                   rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK));
+}
+
+static void _ctrl_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                    enum rtw89_bandwidth bw)
+{
+       _bw_setting(rtwdev, RF_PATH_A, bw, true);
+       _bw_setting(rtwdev, RF_PATH_B, bw, true);
+       _bw_setting(rtwdev, RF_PATH_A, bw, false);
+       _bw_setting(rtwdev, RF_PATH_B, bw, false);
+}
+
+static bool _set_s0_arfc18(struct rtw89_dev *rtwdev, u32 val)
+{
+       u32 bak;
+       u32 tmp;
+       int ret;
+
+       bak = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK);
+       rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RR_LDO_SEL, 0x1);
+       rtw89_write_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK, val);
+
+       ret = read_poll_timeout_atomic(rtw89_read_rf, tmp, tmp == 0, 1, 1000,
+                                      false, rtwdev, RF_PATH_A, RR_LPF, RR_LPF_BUSY);
+       if (ret)
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]LCK timeout\n");
+
+       rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK, bak);
+
+       return !!ret;
+}
+
+static void _lck_check(struct rtw89_dev *rtwdev)
+{
+       u32 tmp;
+
+       if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN MMD reset\n");
+
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x1);
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x0);
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x1);
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x0);
+       }
+
+       udelay(10);
+
+       if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]re-set RF 0x18\n");
+
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
+               tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
+               _set_s0_arfc18(rtwdev, tmp);
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
+       }
+
+       if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN off/on\n");
+
+               tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK);
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK, tmp);
+               tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK);
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK, tmp);
+
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x1);
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x0);
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x3);
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x0);
+
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
+               tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
+               _set_s0_arfc18(rtwdev, tmp);
+               rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]0xb2=%x, 0xc5=%x\n",
+                           rtw89_read_rf(rtwdev, RF_PATH_A, RR_VCO, RFREG_MASK),
+                           rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RFREG_MASK));
+       }
+}
+
+static void _set_ch(struct rtw89_dev *rtwdev, u32 val)
+{
+       bool timeout;
+
+       timeout = _set_s0_arfc18(rtwdev, val);
+       if (!timeout)
+               _lck_check(rtwdev);
+}
+
+static void _ch_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
+                       u8 central_ch, bool dav)
+{
+       u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1;
+       bool is_2g_ch = central_ch <= 14;
+       u32 rf_reg18;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__);
+
+       rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK);
+       rf_reg18 &= ~(RR_CFGCH_BAND1 | RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH |
+                     RR_CFGCH_BCN | RR_CFGCH_BAND0 | RR_CFGCH_CH);
+       rf_reg18 |= FIELD_PREP(RR_CFGCH_CH, central_ch);
+
+       if (!is_2g_ch)
+               rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_5G) |
+                           FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_5G);
+
+       rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN |
+                     RR_CFGCH_BW2) & RFREG_MASK;
+       rf_reg18 |= RR_CFGCH_BW2;
+
+       if (path == RF_PATH_A && dav)
+               _set_ch(rtwdev, rf_reg18);
+       else
+               rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18);
+
+       rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 0);
+       rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 1);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[RFK]CH: %d for Path-%d, reg0x%x = 0x%x\n",
+                   central_ch, path, reg18_addr,
+                   rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK));
+}
+
+static void _ctrl_ch(struct rtw89_dev *rtwdev, u8 central_ch)
+{
+       _ch_setting(rtwdev, RF_PATH_A, central_ch, true);
+       _ch_setting(rtwdev, RF_PATH_B, central_ch, true);
+       _ch_setting(rtwdev, RF_PATH_A, central_ch, false);
+       _ch_setting(rtwdev, RF_PATH_B, central_ch, false);
+}
+
+static void _set_rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_bandwidth bw,
+                        enum rtw89_rf_path path)
+{
+       rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x1);
+       rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M2, 0x12);
+
+       if (bw == RTW89_CHANNEL_WIDTH_20)
+               rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x1b);
+       else if (bw == RTW89_CHANNEL_WIDTH_40)
+               rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x13);
+       else if (bw == RTW89_CHANNEL_WIDTH_80)
+               rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0xb);
+       else
+               rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x3);
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set S%d RXBB BW 0x3F = 0x%x\n", path,
+                   rtw89_read_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB));
+
+       rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x0);
+}
+
+static void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                    enum rtw89_bandwidth bw)
+{
+       u8 kpath, path;
+
+       kpath = _kpath(rtwdev, phy);
+
+       for (path = 0; path < RF_PATH_NUM_8852B; path++) {
+               if (!(kpath & BIT(path)))
+                       continue;
+
+               _set_rxbb_bw(rtwdev, bw, path);
+       }
+}
+
+static void rtw8852b_ctrl_bw_ch(struct rtw89_dev *rtwdev,
+                               enum rtw89_phy_idx phy, u8 central_ch,
+                               enum rtw89_band band, enum rtw89_bandwidth bw)
+{
+       _ctrl_ch(rtwdev, central_ch);
+       _ctrl_bw(rtwdev, phy, bw);
+       _rxbb_bw(rtwdev, phy, bw);
+}
+
+void rtw8852b_set_channel_rf(struct rtw89_dev *rtwdev,
+                            const struct rtw89_chan *chan,
+                            enum rtw89_phy_idx phy_idx)
+{
+       rtw8852b_ctrl_bw_ch(rtwdev, phy_idx, chan->channel, chan->band_type,
+                           chan->band_width);
+}
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.h b/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk.h
new file mode 100644 (file)
index 0000000..f528320
--- /dev/null
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/* Copyright(c) 2019-2022  Realtek Corporation
+ */
+
+#ifndef __RTW89_8852B_RFK_H__
+#define __RTW89_8852B_RFK_H__
+
+#include "core.h"
+
+void rtw8852b_rck(struct rtw89_dev *rtwdev);
+void rtw8852b_dack(struct rtw89_dev *rtwdev);
+void rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
+void rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
+void rtw8852b_dpk_init(struct rtw89_dev *rtwdev);
+void rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
+void rtw8852b_dpk_track(struct rtw89_dev *rtwdev);
+void rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en);
+void rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
+void rtw8852b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
+                              enum rtw89_phy_idx phy_idx);
+void rtw8852b_set_channel_rf(struct rtw89_dev *rtwdev,
+                            const struct rtw89_chan *chan,
+                            enum rtw89_phy_idx phy_idx);
+
+#endif
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.c b/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.c
new file mode 100644 (file)
index 0000000..0b8a210
--- /dev/null
@@ -0,0 +1,794 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2019-2020  Realtek Corporation
+ */
+
+#include "rtw8852b_rfk_table.h"
+
+static const struct rtw89_reg5_def rtw8852b_afe_init_defs[] = {
+       RTW89_DECL_RFK_WM(0xC0D4, 0xffffffff, 0x4486888c),
+       RTW89_DECL_RFK_WM(0xC0D8, 0xffffffff, 0xc6ba10e0),
+       RTW89_DECL_RFK_WM(0xc0dc, 0xffffffff, 0x30c52868),
+       RTW89_DECL_RFK_WM(0xc0e0, 0xffffffff, 0x05008128),
+       RTW89_DECL_RFK_WM(0xc0e4, 0xffffffff, 0x0000272b),
+       RTW89_DECL_RFK_WM(0xC1D4, 0xffffffff, 0x4486888c),
+       RTW89_DECL_RFK_WM(0xC1D8, 0xffffffff, 0xc6ba10e0),
+       RTW89_DECL_RFK_WM(0xc1dc, 0xffffffff, 0x30c52868),
+       RTW89_DECL_RFK_WM(0xc1e0, 0xffffffff, 0x05008128),
+       RTW89_DECL_RFK_WM(0xc1e4, 0xffffffff, 0x0000272b),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_afe_init_defs);
+
+static const struct rtw89_reg5_def rtw8852b_check_addc_defs_a[] = {
+       RTW89_DECL_RFK_WM(0x20f4, BIT(24), 0x0),
+       RTW89_DECL_RFK_WM(0x20f8, 0x80000000, 0x1),
+       RTW89_DECL_RFK_WM(0x20f0, 0xff0000, 0x1),
+       RTW89_DECL_RFK_WM(0x20f0, 0xf00, 0x2),
+       RTW89_DECL_RFK_WM(0x20f0, 0xf, 0x0),
+       RTW89_DECL_RFK_WM(0x20f0, 0xc0, 0x2),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_check_addc_defs_a);
+
+static const struct rtw89_reg5_def rtw8852b_check_addc_defs_b[] = {
+       RTW89_DECL_RFK_WM(0x20f4, BIT(24), 0x0),
+       RTW89_DECL_RFK_WM(0x20f8, 0x80000000, 0x1),
+       RTW89_DECL_RFK_WM(0x20f0, 0xff0000, 0x1),
+       RTW89_DECL_RFK_WM(0x20f0, 0xf00, 0x2),
+       RTW89_DECL_RFK_WM(0x20f0, 0xf, 0x0),
+       RTW89_DECL_RFK_WM(0x20f0, 0xc0, 0x3),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_check_addc_defs_b);
+
+static const struct rtw89_reg5_def rtw8852b_check_dadc_en_defs_a[] = {
+       RTW89_DECL_RFK_WM(0x032C, BIT(30), 0x0),
+       RTW89_DECL_RFK_WM(0x030C, 0x0f000000, 0xf),
+       RTW89_DECL_RFK_WM(0x030C, 0x0f000000, 0x3),
+       RTW89_DECL_RFK_WM(0x032C, BIT(16), 0x0),
+       RTW89_DECL_RFK_WM(0x12dc, BIT(0), 0x1),
+       RTW89_DECL_RFK_WM(0x12e8, BIT(2), 0x1),
+       RTW89_DECL_RFK_WRF(RF_PATH_A, 0x8f, BIT(13), 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_check_dadc_en_defs_a);
+
+static const struct rtw89_reg5_def rtw8852b_check_dadc_en_defs_b[] = {
+       RTW89_DECL_RFK_WM(0x032C, BIT(30), 0x0),
+       RTW89_DECL_RFK_WM(0x030C, 0x0f000000, 0xf),
+       RTW89_DECL_RFK_WM(0x030C, 0x0f000000, 0x3),
+       RTW89_DECL_RFK_WM(0x032C, BIT(16), 0x0),
+       RTW89_DECL_RFK_WM(0x32dc, BIT(0), 0x1),
+       RTW89_DECL_RFK_WM(0x32e8, BIT(2), 0x1),
+       RTW89_DECL_RFK_WRF(RF_PATH_B, 0x8f, BIT(13), 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_check_dadc_en_defs_b);
+
+static const struct rtw89_reg5_def rtw8852b_check_dadc_dis_defs_a[] = {
+       RTW89_DECL_RFK_WM(0x12dc, BIT(0), 0x0),
+       RTW89_DECL_RFK_WM(0x12e8, BIT(2), 0x0),
+       RTW89_DECL_RFK_WRF(RF_PATH_A, 0x8f, BIT(13), 0x0),
+       RTW89_DECL_RFK_WM(0x032C, BIT(16), 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_check_dadc_dis_defs_a);
+
+static const struct rtw89_reg5_def rtw8852b_check_dadc_dis_defs_b[] = {
+       RTW89_DECL_RFK_WM(0x32dc, BIT(0), 0x0),
+       RTW89_DECL_RFK_WM(0x32e8, BIT(2), 0x0),
+       RTW89_DECL_RFK_WRF(RF_PATH_B, 0x8f, BIT(13), 0x0),
+       RTW89_DECL_RFK_WM(0x032C, BIT(16), 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_check_dadc_dis_defs_b);
+
+static const struct rtw89_reg5_def rtw8852b_dack_s0_1_defs[] = {
+       RTW89_DECL_RFK_WM(0x12A0, BIT(15), 0x1),
+       RTW89_DECL_RFK_WM(0x12A0, 0x00007000, 0x3),
+       RTW89_DECL_RFK_WM(0x12B8, BIT(30), 0x1),
+       RTW89_DECL_RFK_WM(0x030C, BIT(28), 0x1),
+       RTW89_DECL_RFK_WM(0x032C, 0x80000000, 0x0),
+       RTW89_DECL_RFK_WM(0xC0D8, BIT(16), 0x1),
+       RTW89_DECL_RFK_WM(0xc0dc, 0x0c000000, 0x3),
+       RTW89_DECL_RFK_WM(0xC004, BIT(30), 0x0),
+       RTW89_DECL_RFK_WM(0xc024, BIT(30), 0x0),
+       RTW89_DECL_RFK_WM(0xC004, 0x3ff00000, 0x30),
+       RTW89_DECL_RFK_WM(0xC004, 0xc0000000, 0x0),
+       RTW89_DECL_RFK_WM(0xC004, BIT(17), 0x1),
+       RTW89_DECL_RFK_WM(0xc024, BIT(17), 0x1),
+       RTW89_DECL_RFK_WM(0xc00c, BIT(2), 0x0),
+       RTW89_DECL_RFK_WM(0xc02c, BIT(2), 0x0),
+       RTW89_DECL_RFK_WM(0xC004, BIT(0), 0x1),
+       RTW89_DECL_RFK_WM(0xc024, BIT(0), 0x1),
+       RTW89_DECL_RFK_DELAY(1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s0_1_defs);
+
+static const struct rtw89_reg5_def rtw8852b_dack_s0_2_defs[] = {
+       RTW89_DECL_RFK_WM(0xc0dc, 0x0c000000, 0x0),
+       RTW89_DECL_RFK_WM(0xc00c, BIT(2), 0x1),
+       RTW89_DECL_RFK_WM(0xc02c, BIT(2), 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s0_2_defs);
+
+static const struct rtw89_reg5_def rtw8852b_dack_s0_3_defs[] = {
+       RTW89_DECL_RFK_WM(0xC004, BIT(0), 0x0),
+       RTW89_DECL_RFK_WM(0xc024, BIT(0), 0x0),
+       RTW89_DECL_RFK_WM(0xC0D8, BIT(16), 0x0),
+       RTW89_DECL_RFK_WM(0x12A0, BIT(15), 0x0),
+       RTW89_DECL_RFK_WM(0x12A0, 0x00007000, 0x7),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s0_3_defs);
+
+static const struct rtw89_reg5_def rtw8852b_dack_s1_1_defs[] = {
+       RTW89_DECL_RFK_WM(0x32a0, BIT(15), 0x1),
+       RTW89_DECL_RFK_WM(0x32a0, 0x7000, 0x3),
+       RTW89_DECL_RFK_WM(0x32B8, BIT(30), 0x1),
+       RTW89_DECL_RFK_WM(0x030C, BIT(28), 0x1),
+       RTW89_DECL_RFK_WM(0x032C, 0x80000000, 0x0),
+       RTW89_DECL_RFK_WM(0xC1D8, BIT(16), 0x1),
+       RTW89_DECL_RFK_WM(0xc1dc, 0x0c000000, 0x3),
+       RTW89_DECL_RFK_WM(0xc104, BIT(30), 0x0),
+       RTW89_DECL_RFK_WM(0xc124, BIT(30), 0x0),
+       RTW89_DECL_RFK_WM(0xc104, 0x3ff00000, 0x30),
+       RTW89_DECL_RFK_WM(0xc104, 0xc0000000, 0x0),
+       RTW89_DECL_RFK_WM(0xc104, BIT(17), 0x1),
+       RTW89_DECL_RFK_WM(0xc124, BIT(17), 0x1),
+       RTW89_DECL_RFK_WM(0xc10c, BIT(2), 0x0),
+       RTW89_DECL_RFK_WM(0xc12c, BIT(2), 0x0),
+       RTW89_DECL_RFK_WM(0xc104, BIT(0), 0x1),
+       RTW89_DECL_RFK_WM(0xc124, BIT(0), 0x1),
+       RTW89_DECL_RFK_DELAY(1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s1_1_defs);
+
+static const struct rtw89_reg5_def rtw8852b_dack_s1_2_defs[] = {
+       RTW89_DECL_RFK_WM(0xc1dc, 0x0c000000, 0x0),
+       RTW89_DECL_RFK_WM(0xc10c, BIT(2), 0x1),
+       RTW89_DECL_RFK_WM(0xc12c, BIT(2), 0x1),
+       RTW89_DECL_RFK_DELAY(1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s1_2_defs);
+
+static const struct rtw89_reg5_def rtw8852b_dack_s1_3_defs[] = {
+       RTW89_DECL_RFK_WM(0xc104, BIT(0), 0x0),
+       RTW89_DECL_RFK_WM(0xc124, BIT(0), 0x0),
+       RTW89_DECL_RFK_WM(0xC1D8, BIT(16), 0x0),
+       RTW89_DECL_RFK_WM(0x32a0, BIT(15), 0x0),
+       RTW89_DECL_RFK_WM(0x32a0, 0x7000, 0x7),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_dack_s1_3_defs);
+
+static const struct rtw89_reg5_def rtw8852b_dpk_afe_defs[] = {
+       RTW89_DECL_RFK_WM(0x20fc, 0xffff0000, 0x0303),
+       RTW89_DECL_RFK_WM(0x12b8, BIT(30), 0x1),
+       RTW89_DECL_RFK_WM(0x32b8, BIT(30), 0x1),
+       RTW89_DECL_RFK_WM(0x030c, 0xff000000, 0x13),
+       RTW89_DECL_RFK_WM(0x032c, 0xffff0000, 0x0041),
+       RTW89_DECL_RFK_WM(0x12b8, BIT(28), 0x1),
+       RTW89_DECL_RFK_WM(0x58c8, BIT(24), 0x1),
+       RTW89_DECL_RFK_WM(0x78c8, BIT(24), 0x1),
+       RTW89_DECL_RFK_WM(0x5864, 0xc0000000, 0x3),
+       RTW89_DECL_RFK_WM(0x7864, 0xc0000000, 0x3),
+       RTW89_DECL_RFK_WM(0x2008, 0x01FFFFFF, 0x1ffffff),
+       RTW89_DECL_RFK_WM(0x0c1c, BIT(2), 0x1),
+       RTW89_DECL_RFK_WM(0x0700, BIT(27), 0x1),
+       RTW89_DECL_RFK_WM(0x0c70, 0x000003FF, 0x3ff),
+       RTW89_DECL_RFK_WM(0x0c60, 0x00000003, 0x3),
+       RTW89_DECL_RFK_WM(0x0c6c, BIT(0), 0x1),
+       RTW89_DECL_RFK_WM(0x58ac, BIT(27), 0x1),
+       RTW89_DECL_RFK_WM(0x78ac, BIT(27), 0x1),
+       RTW89_DECL_RFK_WM(0x0c3c, BIT(9), 0x1),
+       RTW89_DECL_RFK_WM(0x2344, BIT(31), 0x1),
+       RTW89_DECL_RFK_WM(0x4490, BIT(31), 0x1),
+       RTW89_DECL_RFK_WM(0x12a0, 0x000ff000, 0xbf),
+       RTW89_DECL_RFK_WM(0x32a0, 0x000f0000, 0xb),
+       RTW89_DECL_RFK_WM(0x0700, 0x07000000, 0x5),
+       RTW89_DECL_RFK_WM(0x20fc, 0xffff0000, 0x3333),
+       RTW89_DECL_RFK_WM(0x580c, BIT(15), 0x1),
+       RTW89_DECL_RFK_WM(0x5800, 0x0000ffff, 0x0000),
+       RTW89_DECL_RFK_WM(0x780c, BIT(15), 0x1),
+       RTW89_DECL_RFK_WM(0x7800, 0x0000ffff, 0x0000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_dpk_afe_defs);
+
+static const struct rtw89_reg5_def rtw8852b_dpk_afe_restore_defs[] = {
+       RTW89_DECL_RFK_WM(0x20fc, 0xffff0000, 0x0303),
+       RTW89_DECL_RFK_WM(0x12b8, BIT(30), 0x0),
+       RTW89_DECL_RFK_WM(0x32b8, BIT(30), 0x0),
+       RTW89_DECL_RFK_WM(0x5864, 0xc0000000, 0x0),
+       RTW89_DECL_RFK_WM(0x7864, 0xc0000000, 0x0),
+       RTW89_DECL_RFK_WM(0x2008, 0x01FFFFFF, 0x0),
+       RTW89_DECL_RFK_WM(0x0c1c, BIT(2), 0x0),
+       RTW89_DECL_RFK_WM(0x0700, BIT(27), 0x0),
+       RTW89_DECL_RFK_WM(0x0c70, 0x000003FF, 0x63),
+       RTW89_DECL_RFK_WM(0x12a0, 0x000FF000, 0x00),
+       RTW89_DECL_RFK_WM(0x32a0, 0x000FF000, 0x00),
+       RTW89_DECL_RFK_WM(0x0700, 0x07000000, 0x0),
+       RTW89_DECL_RFK_WM(0x5864, BIT(29), 0x0),
+       RTW89_DECL_RFK_WM(0x7864, BIT(29), 0x0),
+       RTW89_DECL_RFK_WM(0x20fc, 0xffff0000, 0x0000),
+       RTW89_DECL_RFK_WM(0x58c8, BIT(24), 0x0),
+       RTW89_DECL_RFK_WM(0x78c8, BIT(24), 0x0),
+       RTW89_DECL_RFK_WM(0x0c3c, BIT(9), 0x0),
+       RTW89_DECL_RFK_WM(0x580c, BIT(15), 0x0),
+       RTW89_DECL_RFK_WM(0x58e4, 0x18000000, 0x1),
+       RTW89_DECL_RFK_WM(0x58e4, 0x18000000, 0x2),
+       RTW89_DECL_RFK_WM(0x780c, BIT(15), 0x0),
+       RTW89_DECL_RFK_WM(0x78e4, 0x18000000, 0x1),
+       RTW89_DECL_RFK_WM(0x78e4, 0x18000000, 0x2),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_dpk_afe_restore_defs);
+
+static const struct rtw89_reg5_def rtw8852b_dpk_kip_defs[] = {
+       RTW89_DECL_RFK_WM(0x8008, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x8088, 0xffffffff, 0x80000000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_dpk_kip_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_sys_defs[] = {
+       RTW89_DECL_RFK_WM(0x12a8, 0x0000000f, 0x5),
+       RTW89_DECL_RFK_WM(0x32a8, 0x0000000f, 0x5),
+       RTW89_DECL_RFK_WM(0x12bc, 0x000ffff0, 0x5555),
+       RTW89_DECL_RFK_WM(0x32bc, 0x000ffff0, 0x5555),
+       RTW89_DECL_RFK_WM(0x0300, 0xff000000, 0x16),
+       RTW89_DECL_RFK_WM(0x0304, 0x000000ff, 0x19),
+       RTW89_DECL_RFK_WM(0x0314, 0xffff0000, 0x2041),
+       RTW89_DECL_RFK_WM(0x0318, 0xffffffff, 0x2041),
+       RTW89_DECL_RFK_WM(0x0318, 0xffffffff, 0x20012041),
+       RTW89_DECL_RFK_WM(0x0020, 0x00006000, 0x3),
+       RTW89_DECL_RFK_WM(0x0024, 0x00006000, 0x3),
+       RTW89_DECL_RFK_WM(0x0704, 0xffff0000, 0x601e),
+       RTW89_DECL_RFK_WM(0x2704, 0xffff0000, 0x601e),
+       RTW89_DECL_RFK_WM(0x0700, 0xf0000000, 0x4),
+       RTW89_DECL_RFK_WM(0x2700, 0xf0000000, 0x4),
+       RTW89_DECL_RFK_WM(0x0650, 0x3c000000, 0x0),
+       RTW89_DECL_RFK_WM(0x2650, 0x3c000000, 0x0),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_sys_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_sys_a_defs_2g[] = {
+       RTW89_DECL_RFK_WM(0x120c, 0x000000ff, 0x33),
+       RTW89_DECL_RFK_WM(0x12c0, 0x0ff00000, 0x33),
+       RTW89_DECL_RFK_WM(0x58f8, 0x40000000, 0x1),
+       RTW89_DECL_RFK_WM(0x0304, 0x0000ff00, 0x1e),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_sys_a_defs_2g);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_sys_a_defs_5g[] = {
+       RTW89_DECL_RFK_WM(0x120c, 0x000000ff, 0x44),
+       RTW89_DECL_RFK_WM(0x12c0, 0x0ff00000, 0x44),
+       RTW89_DECL_RFK_WM(0x58f8, 0x40000000, 0x0),
+       RTW89_DECL_RFK_WM(0x0304, 0x0000ff00, 0x1d),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_sys_a_defs_5g);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_sys_b_defs_2g[] = {
+       RTW89_DECL_RFK_WM(0x32c0, 0x0ff00000, 0x33),
+       RTW89_DECL_RFK_WM(0x320c, 0x000000ff, 0x33),
+       RTW89_DECL_RFK_WM(0x78f8, 0x40000000, 0x1),
+       RTW89_DECL_RFK_WM(0x0304, 0x0000ff00, 0x1e),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_sys_b_defs_2g);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_sys_b_defs_5g[] = {
+       RTW89_DECL_RFK_WM(0x32c0, 0x0ff00000, 0x44),
+       RTW89_DECL_RFK_WM(0x320c, 0x000000ff, 0x44),
+       RTW89_DECL_RFK_WM(0x78f8, 0x40000000, 0x0),
+       RTW89_DECL_RFK_WM(0x0304, 0x0000ff00, 0x1d),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_sys_b_defs_5g);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_init_txpwr_defs_a[] = {
+       RTW89_DECL_RFK_WM(0x566c, 0x00001000, 0x0),
+       RTW89_DECL_RFK_WM(0x5800, 0xffffffff, 0x003f807f),
+       RTW89_DECL_RFK_WM(0x580c, 0x0000007f, 0x40),
+       RTW89_DECL_RFK_WM(0x580c, 0x0fffff00, 0x00040),
+       RTW89_DECL_RFK_WM(0x5810, 0xffffffff, 0x59010000),
+       RTW89_DECL_RFK_WM(0x5814, 0x01ffffff, 0x002d000),
+       RTW89_DECL_RFK_WM(0x5814, 0xf8000000, 0x00),
+       RTW89_DECL_RFK_WM(0x5818, 0xffffffff, 0x002c1800),
+       RTW89_DECL_RFK_WM(0x581c, 0x3fffffff, 0x1dc80280),
+       RTW89_DECL_RFK_WM(0x5820, 0xffffffff, 0x00002080),
+       RTW89_DECL_RFK_WM(0x580c, 0x10000000, 0x1),
+       RTW89_DECL_RFK_WM(0x580c, 0x40000000, 0x1),
+       RTW89_DECL_RFK_WM(0x5834, 0x3fffffff, 0x000115f2),
+       RTW89_DECL_RFK_WM(0x5838, 0x7fffffff, 0x0000121),
+       RTW89_DECL_RFK_WM(0x5854, 0x3fffffff, 0x000115f2),
+       RTW89_DECL_RFK_WM(0x5858, 0x7fffffff, 0x0000121),
+       RTW89_DECL_RFK_WM(0x5860, 0x80000000, 0x0),
+       RTW89_DECL_RFK_WM(0x5864, 0x07ffffff, 0x00801ff),
+       RTW89_DECL_RFK_WM(0x5898, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x589c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x58a4, 0x000000ff, 0x16),
+       RTW89_DECL_RFK_WM(0x58b0, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x58b4, 0x7fffffff, 0x0a002000),
+       RTW89_DECL_RFK_WM(0x58b8, 0x7fffffff, 0x00007628),
+       RTW89_DECL_RFK_WM(0x58bc, 0x07ffffff, 0x7a7807f),
+       RTW89_DECL_RFK_WM(0x58c0, 0xfffe0000, 0x003f),
+       RTW89_DECL_RFK_WM(0x58c4, 0xffffffff, 0x0003ffff),
+       RTW89_DECL_RFK_WM(0x58c8, 0x00ffffff, 0x000000),
+       RTW89_DECL_RFK_WM(0x58c8, 0xf0000000, 0x0),
+       RTW89_DECL_RFK_WM(0x58cc, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x58d0, 0x07ffffff, 0x2008101),
+       RTW89_DECL_RFK_WM(0x58d4, 0x000000ff, 0x00),
+       RTW89_DECL_RFK_WM(0x58d4, 0x0003fe00, 0x0ff),
+       RTW89_DECL_RFK_WM(0x58d4, 0x07fc0000, 0x100),
+       RTW89_DECL_RFK_WM(0x58d8, 0xffffffff, 0x8008016c),
+       RTW89_DECL_RFK_WM(0x58dc, 0x0001ffff, 0x0807f),
+       RTW89_DECL_RFK_WM(0x58dc, 0xfff00000, 0x800),
+       RTW89_DECL_RFK_WM(0x58f0, 0x0003ffff, 0x001ff),
+       RTW89_DECL_RFK_WM(0x58f4, 0x000fffff, 0x000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_init_txpwr_defs_a);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_init_txpwr_defs_b[] = {
+       RTW89_DECL_RFK_WM(0x566c, 0x00001000, 0x0),
+       RTW89_DECL_RFK_WM(0x7800, 0xffffffff, 0x003f807f),
+       RTW89_DECL_RFK_WM(0x780c, 0x0000007f, 0x40),
+       RTW89_DECL_RFK_WM(0x780c, 0x0fffff00, 0x00040),
+       RTW89_DECL_RFK_WM(0x7810, 0xffffffff, 0x59010000),
+       RTW89_DECL_RFK_WM(0x7814, 0x01ffffff, 0x002d000),
+       RTW89_DECL_RFK_WM(0x7814, 0xf8000000, 0x00),
+       RTW89_DECL_RFK_WM(0x7818, 0xffffffff, 0x002c1800),
+       RTW89_DECL_RFK_WM(0x781c, 0x3fffffff, 0x1dc80280),
+       RTW89_DECL_RFK_WM(0x7820, 0xffffffff, 0x00002080),
+       RTW89_DECL_RFK_WM(0x780c, 0x10000000, 0x1),
+       RTW89_DECL_RFK_WM(0x780c, 0x40000000, 0x1),
+       RTW89_DECL_RFK_WM(0x7834, 0x3fffffff, 0x000115f2),
+       RTW89_DECL_RFK_WM(0x7838, 0x7fffffff, 0x0000121),
+       RTW89_DECL_RFK_WM(0x7854, 0x3fffffff, 0x000115f2),
+       RTW89_DECL_RFK_WM(0x7858, 0x7fffffff, 0x0000121),
+       RTW89_DECL_RFK_WM(0x7860, 0x80000000, 0x0),
+       RTW89_DECL_RFK_WM(0x7864, 0x07ffffff, 0x00801ff),
+       RTW89_DECL_RFK_WM(0x7898, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x789c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x78a4, 0x000000ff, 0x16),
+       RTW89_DECL_RFK_WM(0x78b0, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x78b4, 0x7fffffff, 0x0a002000),
+       RTW89_DECL_RFK_WM(0x78b8, 0x7fffffff, 0x00007628),
+       RTW89_DECL_RFK_WM(0x78bc, 0x07ffffff, 0x7a7807f),
+       RTW89_DECL_RFK_WM(0x78c0, 0xfffe0000, 0x003f),
+       RTW89_DECL_RFK_WM(0x78c4, 0xffffffff, 0x0003ffff),
+       RTW89_DECL_RFK_WM(0x78c8, 0x00ffffff, 0x000000),
+       RTW89_DECL_RFK_WM(0x78c8, 0xf0000000, 0x0),
+       RTW89_DECL_RFK_WM(0x78cc, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x78d0, 0x07ffffff, 0x2008101),
+       RTW89_DECL_RFK_WM(0x78d4, 0x000000ff, 0x00),
+       RTW89_DECL_RFK_WM(0x78d4, 0x0003fe00, 0x0ff),
+       RTW89_DECL_RFK_WM(0x78d4, 0x07fc0000, 0x100),
+       RTW89_DECL_RFK_WM(0x78d8, 0xffffffff, 0x8008016c),
+       RTW89_DECL_RFK_WM(0x78dc, 0x0001ffff, 0x0807f),
+       RTW89_DECL_RFK_WM(0x78dc, 0xfff00000, 0x800),
+       RTW89_DECL_RFK_WM(0x78f0, 0x0003ffff, 0x001ff),
+       RTW89_DECL_RFK_WM(0x78f4, 0x000fffff, 0x000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_init_txpwr_defs_b);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_init_txpwr_he_tb_defs_a[] = {
+       RTW89_DECL_RFK_WM(0x58a0, 0xffffffff, 0x000000fe),
+       RTW89_DECL_RFK_WM(0x58e4, 0x0000007f, 0x1f),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_init_txpwr_he_tb_defs_a);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_init_txpwr_he_tb_defs_b[] = {
+       RTW89_DECL_RFK_WM(0x78a0, 0xffffffff, 0x000000fe),
+       RTW89_DECL_RFK_WM(0x78e4, 0x0000007f, 0x1f),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_init_txpwr_he_tb_defs_b);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_dck_defs_a[] = {
+       RTW89_DECL_RFK_WM(0x580c, 0x0fff0000, 0x000),
+       RTW89_DECL_RFK_WM(0x5814, 0x003ff000, 0x0ef),
+       RTW89_DECL_RFK_WM(0x5814, 0x18000000, 0x0),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_dck_defs_a);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_dck_defs_b[] = {
+       RTW89_DECL_RFK_WM(0x780c, 0x0fff0000, 0x000),
+       RTW89_DECL_RFK_WM(0x7814, 0x003ff000, 0x0ef),
+       RTW89_DECL_RFK_WM(0x7814, 0x18000000, 0x0),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_dck_defs_b);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_dac_gain_defs_a[] = {
+       RTW89_DECL_RFK_WM(0x58b0, 0x00000400, 0x1),
+       RTW89_DECL_RFK_WM(0x58b0, 0x00000fff, 0x000),
+       RTW89_DECL_RFK_WM(0x58b0, 0x00000800, 0x1),
+       RTW89_DECL_RFK_WM(0x5a00, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a04, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a08, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a0c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a10, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a14, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a18, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a1c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a20, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a24, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a28, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a2c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a30, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a34, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a38, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a3c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a40, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a44, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a48, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a4c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a50, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a54, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a58, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a5c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a60, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a64, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a68, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a6c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a70, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a74, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a78, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a7c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a80, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a84, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a88, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a8c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a90, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a94, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a98, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5a9c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5aa0, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5aa4, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5aa8, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5aac, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5ab0, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5ab4, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5ab8, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5abc, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5ac0, 0xffffffff, 0x00000000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_dac_gain_defs_a);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_dac_gain_defs_b[] = {
+       RTW89_DECL_RFK_WM(0x78b0, 0x00000fff, 0x000),
+       RTW89_DECL_RFK_WM(0x78b0, 0x00000800, 0x1),
+       RTW89_DECL_RFK_WM(0x7a00, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a04, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a08, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a0c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a10, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a14, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a18, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a1c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a20, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a24, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a28, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a2c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a30, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a34, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a38, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a3c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a40, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a44, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a48, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a4c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a50, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a54, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a58, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a5c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a60, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a64, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a68, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a6c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a70, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a74, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a78, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a7c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a80, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a84, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a88, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a8c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a90, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a94, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a98, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7a9c, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7aa0, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7aa4, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7aa8, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7aac, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7ab0, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7ab4, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7ab8, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7abc, 0xffffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7ac0, 0xffffffff, 0x00000000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_dac_gain_defs_b);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_slope_a_defs_2g[] = {
+       RTW89_DECL_RFK_WM(0x5608, 0x07ffffff, 0x0801008),
+       RTW89_DECL_RFK_WM(0x560c, 0x07ffffff, 0x0201020),
+       RTW89_DECL_RFK_WM(0x5610, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x5614, 0x07ffffff, 0x0804008),
+       RTW89_DECL_RFK_WM(0x5618, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x561c, 0x000001ff, 0x008),
+       RTW89_DECL_RFK_WM(0x561c, 0xffff0000, 0x0808),
+       RTW89_DECL_RFK_WM(0x5620, 0xffffffff, 0x08081e28),
+       RTW89_DECL_RFK_WM(0x5624, 0xffffffff, 0x08080808),
+       RTW89_DECL_RFK_WM(0x5628, 0xffffffff, 0x08081e28),
+       RTW89_DECL_RFK_WM(0x562c, 0x0000ffff, 0x0808),
+       RTW89_DECL_RFK_WM(0x581c, 0x00100000, 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_a_defs_2g);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_slope_a_defs_5g[] = {
+       RTW89_DECL_RFK_WM(0x5608, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x560c, 0x07ffffff, 0x0201020),
+       RTW89_DECL_RFK_WM(0x5610, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x5614, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x5618, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x561c, 0x000001ff, 0x008),
+       RTW89_DECL_RFK_WM(0x561c, 0xffff0000, 0x0808),
+       RTW89_DECL_RFK_WM(0x5620, 0xffffffff, 0x08081e08),
+       RTW89_DECL_RFK_WM(0x5624, 0xffffffff, 0x08080808),
+       RTW89_DECL_RFK_WM(0x5628, 0xffffffff, 0x08080808),
+       RTW89_DECL_RFK_WM(0x562c, 0x0000ffff, 0x0808),
+       RTW89_DECL_RFK_WM(0x581c, 0x00100000, 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_a_defs_5g);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_slope_b_defs_2g[] = {
+       RTW89_DECL_RFK_WM(0x7608, 0x07ffffff, 0x0801008),
+       RTW89_DECL_RFK_WM(0x760c, 0x07ffffff, 0x0201020),
+       RTW89_DECL_RFK_WM(0x7610, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x7614, 0x07ffffff, 0x0804008),
+       RTW89_DECL_RFK_WM(0x7618, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x761c, 0x000001ff, 0x008),
+       RTW89_DECL_RFK_WM(0x761c, 0xffff0000, 0x0808),
+       RTW89_DECL_RFK_WM(0x7620, 0xffffffff, 0x08081e28),
+       RTW89_DECL_RFK_WM(0x7624, 0xffffffff, 0x08080808),
+       RTW89_DECL_RFK_WM(0x7628, 0xffffffff, 0x08081e28),
+       RTW89_DECL_RFK_WM(0x762c, 0x0000ffff, 0x0808),
+       RTW89_DECL_RFK_WM(0x781c, 0x00100000, 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_b_defs_2g);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_slope_b_defs_5g[] = {
+       RTW89_DECL_RFK_WM(0x7608, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x760c, 0x07ffffff, 0x0201020),
+       RTW89_DECL_RFK_WM(0x7610, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x7614, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x7618, 0x07ffffff, 0x0201008),
+       RTW89_DECL_RFK_WM(0x761c, 0x000001ff, 0x008),
+       RTW89_DECL_RFK_WM(0x761c, 0xffff0000, 0x0808),
+       RTW89_DECL_RFK_WM(0x7620, 0xffffffff, 0x08081e08),
+       RTW89_DECL_RFK_WM(0x7624, 0xffffffff, 0x08080808),
+       RTW89_DECL_RFK_WM(0x7628, 0xffffffff, 0x08080808),
+       RTW89_DECL_RFK_WM(0x762c, 0x0000ffff, 0x0808),
+       RTW89_DECL_RFK_WM(0x781c, 0x00100000, 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_b_defs_5g);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_a_2g_all_defs[] = {
+       RTW89_DECL_RFK_WM(0x5604, 0x80000000, 0x1),
+       RTW89_DECL_RFK_WM(0x5600, 0x3fffffff, 0x3f2d2721),
+       RTW89_DECL_RFK_WM(0x5604, 0x003fffff, 0x010101),
+       RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01ef27af),
+       RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000075),
+       RTW89_DECL_RFK_WM(0x5638, 0x000fffff, 0x00000),
+       RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x017f13ae),
+       RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x0000006e),
+       RTW89_DECL_RFK_WM(0x5644, 0x000fffff, 0x00000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_2g_all_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_a_2g_part_defs[] = {
+       RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01ef27af),
+       RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000075),
+       RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x017f13ae),
+       RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x0000006e),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_2g_part_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g1_all_defs[] = {
+       RTW89_DECL_RFK_WM(0x5604, 0x80000000, 0x1),
+       RTW89_DECL_RFK_WM(0x5600, 0x3fffffff, 0x3f2d2721),
+       RTW89_DECL_RFK_WM(0x5604, 0x003fffff, 0x010101),
+       RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x016037e7),
+       RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x0000006f),
+       RTW89_DECL_RFK_WM(0x5638, 0x000fffff, 0x00000),
+       RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5644, 0x000fffff, 0x00000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g1_all_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g1_part_defs[] = {
+       RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x016037e7),
+       RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x0000006f),
+       RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g1_part_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g2_all_defs[] = {
+       RTW89_DECL_RFK_WM(0x5604, 0x80000000, 0x1),
+       RTW89_DECL_RFK_WM(0x5600, 0x3fffffff, 0x3f2d2721),
+       RTW89_DECL_RFK_WM(0x5604, 0x003fffff, 0x010101),
+       RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01f053f1),
+       RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000070),
+       RTW89_DECL_RFK_WM(0x5638, 0x000fffff, 0x00000),
+       RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5644, 0x000fffff, 0x00000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g2_all_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g2_part_defs[] = {
+       RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01f053f1),
+       RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000070),
+       RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g2_part_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g3_all_defs[] = {
+       RTW89_DECL_RFK_WM(0x5604, 0x80000000, 0x1),
+       RTW89_DECL_RFK_WM(0x5600, 0x3fffffff, 0x3f2d2721),
+       RTW89_DECL_RFK_WM(0x5604, 0x003fffff, 0x010101),
+       RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01c047ee),
+       RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000070),
+       RTW89_DECL_RFK_WM(0x5638, 0x000fffff, 0x00000),
+       RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5644, 0x000fffff, 0x00000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g3_all_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_a_5g3_part_defs[] = {
+       RTW89_DECL_RFK_WM(0x5630, 0x3fffffff, 0x01c047ee),
+       RTW89_DECL_RFK_WM(0x5634, 0x3fffffff, 0x00000070),
+       RTW89_DECL_RFK_WM(0x563c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x5640, 0x3fffffff, 0x00000000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_a_5g3_part_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_b_2g_all_defs[] = {
+       RTW89_DECL_RFK_WM(0x7604, 0x80000000, 0x1),
+       RTW89_DECL_RFK_WM(0x7600, 0x3fffffff, 0x3f2d2721),
+       RTW89_DECL_RFK_WM(0x7604, 0x003fffff, 0x010101),
+       RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x01ff2bb5),
+       RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000078),
+       RTW89_DECL_RFK_WM(0x7638, 0x000fffff, 0x00000),
+       RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x018f2bb0),
+       RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000072),
+       RTW89_DECL_RFK_WM(0x7644, 0x000fffff, 0x00000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_2g_all_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_b_2g_part_defs[] = {
+       RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x01ff2bb5),
+       RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000078),
+       RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x018f2bb0),
+       RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000072),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_2g_part_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g1_all_defs[] = {
+       RTW89_DECL_RFK_WM(0x7604, 0x80000000, 0x1),
+       RTW89_DECL_RFK_WM(0x7600, 0x3fffffff, 0x3f2d2721),
+       RTW89_DECL_RFK_WM(0x7604, 0x003fffff, 0x010101),
+       RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x009003da),
+       RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069),
+       RTW89_DECL_RFK_WM(0x7638, 0x000fffff, 0x00000),
+       RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7644, 0x000fffff, 0x00000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g1_all_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g1_part_defs[] = {
+       RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x009003da),
+       RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069),
+       RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g1_part_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g2_all_defs[] = {
+       RTW89_DECL_RFK_WM(0x7604, 0x80000000, 0x1),
+       RTW89_DECL_RFK_WM(0x7600, 0x3fffffff, 0x3f2d2721),
+       RTW89_DECL_RFK_WM(0x7604, 0x003fffff, 0x010101),
+       RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x013027e6),
+       RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069),
+       RTW89_DECL_RFK_WM(0x7638, 0x000fffff, 0x00000),
+       RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7644, 0x000fffff, 0x00000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g2_all_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g2_part_defs[] = {
+       RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x013027e6),
+       RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069),
+       RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g2_part_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g3_all_defs[] = {
+       RTW89_DECL_RFK_WM(0x7604, 0x80000000, 0x1),
+       RTW89_DECL_RFK_WM(0x7600, 0x3fffffff, 0x3f2d2721),
+       RTW89_DECL_RFK_WM(0x7604, 0x003fffff, 0x010101),
+       RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x009003da),
+       RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069),
+       RTW89_DECL_RFK_WM(0x7638, 0x000fffff, 0x00000),
+       RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7644, 0x000fffff, 0x00000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g3_all_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_align_b_5g3_part_defs[] = {
+       RTW89_DECL_RFK_WM(0x7630, 0x3fffffff, 0x009003da),
+       RTW89_DECL_RFK_WM(0x7634, 0x3fffffff, 0x00000069),
+       RTW89_DECL_RFK_WM(0x763c, 0x3fffffff, 0x00000000),
+       RTW89_DECL_RFK_WM(0x7640, 0x3fffffff, 0x00000000),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_align_b_5g3_part_defs);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_slope_defs_a[] = {
+       RTW89_DECL_RFK_WM(0x5814, 0x00000800, 0x1),
+       RTW89_DECL_RFK_WM(0x581c, 0x20000000, 0x1),
+       RTW89_DECL_RFK_WM(0x5814, 0x20000000, 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_defs_a);
+
+static const struct rtw89_reg5_def rtw8852b_tssi_slope_defs_b[] = {
+       RTW89_DECL_RFK_WM(0x7814, 0x00000800, 0x1),
+       RTW89_DECL_RFK_WM(0x781c, 0x20000000, 0x1),
+       RTW89_DECL_RFK_WM(0x7814, 0x20000000, 0x1),
+};
+
+RTW89_DECLARE_RFK_TBL(rtw8852b_tssi_slope_defs_b);
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.h b/drivers/net/wireless/realtek/rtw89/rtw8852b_rfk_table.h
new file mode 100644 (file)
index 0000000..b4d6e98
--- /dev/null
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/* Copyright(c) 2019-2020  Realtek Corporation
+ */
+
+#ifndef __RTW89_8852B_RFK_TABLE_H__
+#define __RTW89_8852B_RFK_TABLE_H__
+
+#include "phy.h"
+
+extern const struct rtw89_rfk_tbl rtw8852b_afe_init_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_check_addc_defs_a_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_check_addc_defs_b_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_check_dadc_en_defs_a_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_check_dadc_en_defs_b_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_check_dadc_dis_defs_a_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_check_dadc_dis_defs_b_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_dack_s0_1_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_dack_s0_2_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_dack_s0_3_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_dack_s1_1_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_dack_s1_2_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_dack_s1_3_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_dpk_afe_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_dpk_afe_restore_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_dpk_kip_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_sys_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_sys_a_defs_2g_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_sys_a_defs_5g_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_sys_b_defs_2g_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_sys_b_defs_5g_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_init_txpwr_defs_a_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_init_txpwr_defs_b_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_init_txpwr_he_tb_defs_a_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_init_txpwr_he_tb_defs_b_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_dck_defs_a_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_dck_defs_b_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_dac_gain_defs_a_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_dac_gain_defs_b_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_a_defs_2g_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_a_defs_5g_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_b_defs_2g_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_b_defs_5g_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_2g_all_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_2g_part_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g1_all_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g1_part_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g2_all_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g2_part_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g3_all_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_a_5g3_part_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_2g_all_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_2g_part_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g1_all_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g1_part_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g2_all_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g2_part_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g3_all_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_align_b_5g3_part_defs_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_defs_a_tbl;
+extern const struct rtw89_rfk_tbl rtw8852b_tssi_slope_defs_b_tbl;
+
+#endif
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b_table.c b/drivers/net/wireless/realtek/rtw89/rtw8852b_table.c
new file mode 100644 (file)
index 0000000..a673496
--- /dev/null
@@ -0,0 +1,22877 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2019-2020  Realtek Corporation
+ */
+
+#include "phy.h"
+#include "reg.h"
+#include "rtw8852b_table.h"
+
+static const struct rtw89_reg2_def rtw89_8852b_phy_bb_regs[] = {
+       {0x704, 0x601E0100},
+       {0x4000, 0x00000000},
+       {0x4004, 0xCA014000},
+       {0x4008, 0xC751D4F0},
+       {0x400C, 0x44511475},
+       {0x4010, 0x00000000},
+       {0x4014, 0x00000000},
+       {0x4018, 0x4F4C084B},
+       {0x401C, 0x084A4E52},
+       {0x4020, 0x4D504E4B},
+       {0x4024, 0x4F4C0849},
+       {0x4028, 0x08484C50},
+       {0x402C, 0x4C50504C},
+       {0x4030, 0x5454084A},
+       {0x4034, 0x084B5654},
+       {0x4038, 0x6A6C605A},
+       {0x403C, 0x4C4C084C},
+       {0x4040, 0x084B4E4D},
+       {0x4044, 0x4E4C4B4B},
+       {0x4048, 0x4B4B084A},
+       {0x404C, 0x084A4E4C},
+       {0x4050, 0x514F4C4A},
+       {0x4054, 0x524E084A},
+       {0x4058, 0x084A5154},
+       {0x405C, 0x53555554},
+       {0x4060, 0x45450845},
+       {0x4064, 0x08454144},
+       {0x4068, 0x40434445},
+       {0x406C, 0x44450845},
+       {0x4070, 0x08444043},
+       {0x4074, 0x42434444},
+       {0x4078, 0x46450844},
+       {0x407C, 0x08444843},
+       {0x4080, 0x4B4E4A47},
+       {0x4084, 0x4F4C084B},
+       {0x4088, 0x084A4E52},
+       {0x408C, 0x4D504E4B},
+       {0x4090, 0x4F4C0849},
+       {0x4094, 0x08484C50},
+       {0x4098, 0x4C50504C},
+       {0x409C, 0x5454084A},
+       {0x40A0, 0x084B5654},
+       {0x40A4, 0x6A6C605A},
+       {0x40A8, 0x4C4C084C},
+       {0x40AC, 0x084B4E4D},
+       {0x40B0, 0x4E4C4B4B},
+       {0x40B4, 0x4B4B084A},
+       {0x40B8, 0x084A4E4C},
+       {0x40BC, 0x514F4C4A},
+       {0x40C0, 0x524E084A},
+       {0x40C4, 0x084A5154},
+       {0x40C8, 0x53555554},
+       {0x40CC, 0x45450845},
+       {0x40D0, 0x08454144},
+       {0x40D4, 0x40434445},
+       {0x40D8, 0x44450845},
+       {0x40DC, 0x08444043},
+       {0x40E0, 0x42434444},
+       {0x40E4, 0x46450844},
+       {0x40E8, 0x08444843},
+       {0x40EC, 0x4B4E4A47},
+       {0x40F0, 0x00000000},
+       {0x40F4, 0x00000006},
+       {0x40F8, 0x00000000},
+       {0x40FC, 0x8C30C30C},
+       {0x4100, 0x4C30C30C},
+       {0x4104, 0x0C30C30C},
+       {0x4108, 0x0C30C30C},
+       {0x410C, 0x0C30C30C},
+       {0x4110, 0x0C30C30C},
+       {0x4114, 0x28A28A28},
+       {0x4118, 0x28A28A28},
+       {0x411C, 0x28A28A28},
+       {0x4120, 0x28A28A28},
+       {0x4124, 0x28A28A28},
+       {0x4128, 0x28A28A28},
+       {0x412C, 0x06666666},
+       {0x4130, 0x33333333},
+       {0x4134, 0x33333333},
+       {0x4138, 0x33333333},
+       {0x413C, 0x00000031},
+       {0x4140, 0x5100600A},
+       {0x4144, 0x18363113},
+       {0x4148, 0x1D976DDC},
+       {0x414C, 0x1C072DD7},
+       {0x4150, 0x1127CDF4},
+       {0x4154, 0x1E37BDF1},
+       {0x4158, 0x1FB7F1D6},
+       {0x415C, 0x1EA7DDF9},
+       {0x4160, 0x1FE445DD},
+       {0x4164, 0x1F97F1FE},
+       {0x4168, 0x1FF781ED},
+       {0x416C, 0x1FA7F5FE},
+       {0x4170, 0x1E07B913},
+       {0x4174, 0x1FD7FDFF},
+       {0x4178, 0x1E17B9FA},
+       {0x417C, 0x19A66914},
+       {0x4180, 0x10F65598},
+       {0x4184, 0x14A5A111},
+       {0x4188, 0x1D3765DB},
+       {0x418C, 0x17C685CA},
+       {0x4190, 0x1107C5F3},
+       {0x4194, 0x1B5785EB},
+       {0x4198, 0x1F97ED8F},
+       {0x419C, 0x1BC7A5F3},
+       {0x41A0, 0x1FE43595},
+       {0x41A4, 0x1EB7D9FC},
+       {0x41A8, 0x1FE65DBE},
+       {0x41AC, 0x1EC7D9FC},
+       {0x41B0, 0x1976FCFF},
+       {0x41B4, 0x1F77F5FF},
+       {0x41B8, 0x1976FDEC},
+       {0x41BC, 0x198664EF},
+       {0x41C0, 0x11062D93},
+       {0x41C4, 0x10C4E910},
+       {0x41C8, 0x1CA759DB},
+       {0x41CC, 0x1335A9B5},
+       {0x41D0, 0x1097B9F3},
+       {0x41D4, 0x17B72DE1},
+       {0x41D8, 0x1F67ED42},
+       {0x41DC, 0x18074DE9},
+       {0x41E0, 0x1FD40547},
+       {0x41E4, 0x1D57ADF9},
+       {0x41E8, 0x1FE52182},
+       {0x41EC, 0x1D67B1F9},
+       {0x41F0, 0x14860CE1},
+       {0x41F4, 0x1EC7E9FE},
+       {0x41F8, 0x14860DD6},
+       {0x41FC, 0x195664C7},
+       {0x4200, 0x0005E58A},
+       {0x4204, 0x00000000},
+       {0x4208, 0x00000000},
+       {0x420C, 0x7A000000},
+       {0x4210, 0x0F9F3D7A},
+       {0x4214, 0x0040817C},
+       {0x4218, 0x00E10204},
+       {0x421C, 0x227D94CD},
+       {0x4220, 0x08028A28},
+       {0x4224, 0x00000210},
+       {0x4228, 0x04688000},
+       {0x4A48, 0x00000002},
+       {0x422C, 0x0060B002},
+       {0x4230, 0x9A8249A8},
+       {0x4234, 0x26A1469E},
+       {0x4238, 0x2099A824},
+       {0x423C, 0x2359461C},
+       {0x4240, 0x1631A675},
+       {0x4244, 0x2C6B1D63},
+       {0x4248, 0x0000000E},
+       {0x424C, 0x00000001},
+       {0x4250, 0x00000001},
+       {0x4254, 0x00000000},
+       {0x4258, 0x00000000},
+       {0x425C, 0x00000000},
+       {0x4260, 0x0020000C},
+       {0x4264, 0x00000000},
+       {0x4268, 0x00000000},
+       {0x426C, 0x0418317C},
+       {0x4270, 0x2B33135C},
+       {0x4274, 0x00000002},
+       {0x4278, 0x00000000},
+       {0x427C, 0x00000000},
+       {0x4280, 0x00000000},
+       {0x4284, 0x00000000},
+       {0x4288, 0x00000000},
+       {0x428C, 0x00000000},
+       {0x4290, 0x00000000},
+       {0x4294, 0x00000000},
+       {0x4298, 0x00000000},
+       {0x429C, 0x84026000},
+       {0x42A0, 0x0051AC20},
+       {0x4A24, 0x0010C040},
+       {0x42A4, 0x02024008},
+       {0x42A8, 0x00000000},
+       {0x42AC, 0x00000000},
+       {0x42B0, 0x22CE803C},
+       {0x42B4, 0x32000000},
+       {0x42B8, 0x996FD67D},
+       {0x42BC, 0xBD67D67D},
+       {0x42C0, 0x7D67D65B},
+       {0x42C4, 0x28029F59},
+       {0x42C8, 0x00280280},
+       {0x42CC, 0x00000000},
+       {0x42D0, 0x00000000},
+       {0x42D4, 0x00000003},
+       {0x42D8, 0x00000001},
+       {0x42DC, 0x61861800},
+       {0x42E0, 0x830C30C3},
+       {0x42E4, 0xC30C30C3},
+       {0x42E8, 0x830C30C3},
+       {0x42EC, 0x451450C3},
+       {0x42F0, 0x05145145},
+       {0x42F4, 0x05145145},
+       {0x42F8, 0x05145145},
+       {0x42FC, 0x0F0C3145},
+       {0x4300, 0x030C30CF},
+       {0x4304, 0x030C30C3},
+       {0x4308, 0x030CF3C3},
+       {0x430C, 0x030C30C3},
+       {0x4310, 0x0F3CF3C3},
+       {0x4314, 0x0F3CF3CF},
+       {0x4318, 0x0F3CF3CF},
+       {0x431C, 0x0F3CF3CF},
+       {0x4320, 0x0F3CF3CF},
+       {0x4324, 0x030C10C3},
+       {0x4328, 0x051430C3},
+       {0x432C, 0x051490CB},
+       {0x4330, 0x030CD151},
+       {0x4334, 0x050C50C7},
+       {0x4338, 0x051492CB},
+       {0x433C, 0x05145145},
+       {0x4340, 0x05145145},
+       {0x4344, 0x05145145},
+       {0x4348, 0x05145145},
+       {0x434C, 0x090CD3CF},
+       {0x4350, 0x071491C5},
+       {0x4354, 0x073CF143},
+       {0x4358, 0x071431C3},
+       {0x435C, 0x0F3CF1C5},
+       {0x4360, 0x0F3CF3CF},
+       {0x4364, 0x0F3CF3CF},
+       {0x4368, 0x0F3CF3CF},
+       {0x436C, 0x0F3CF3CF},
+       {0x4370, 0x090C91CF},
+       {0x4374, 0x11243143},
+       {0x4378, 0x9777A777},
+       {0x437C, 0xBB7BAC95},
+       {0x4380, 0xB667B889},
+       {0x4384, 0x7B9B8899},
+       {0x4388, 0x7A5567C8},
+       {0x438C, 0x2278CCCC},
+       {0x4390, 0x7C222222},
+       {0x4394, 0x0000069B},
+       {0x4398, 0x001CCCCC},
+       {0x4AAC, 0xCCCCC88C},
+       {0x4AB0, 0x0000AACC},
+       {0x439C, 0x00000000},
+       {0x43A0, 0x00000008},
+       {0x43A4, 0x00000000},
+       {0x43A8, 0x00000000},
+       {0x43AC, 0x00000000},
+       {0x43B0, 0x10000000},
+       {0x43B4, 0x00401001},
+       {0x43B8, 0x00061003},
+       {0x43BC, 0x000024D8},
+       {0x43C0, 0x00000000},
+       {0x43C4, 0x10000020},
+       {0x43C8, 0x20000200},
+       {0x43CC, 0x00000000},
+       {0x43D0, 0x04000000},
+       {0x43D4, 0x44000100},
+       {0x43D8, 0x60804060},
+       {0x43DC, 0x44204210},
+       {0x43E0, 0x82108082},
+       {0x43E4, 0x82108402},
+       {0x43E8, 0xC8082108},
+       {0x43EC, 0xC8202084},
+       {0x43F0, 0x44208208},
+       {0x43F4, 0x84108204},
+       {0x43F8, 0xD0108104},
+       {0x43FC, 0xF8210108},
+       {0x4400, 0x6431E930},
+       {0x4404, 0x02309468},
+       {0x4408, 0x10C61C22},
+       {0x440C, 0x02109469},
+       {0x4410, 0x10C61C22},
+       {0x4414, 0x00041049},
+       {0x4A4C, 0x00060581},
+       {0x4418, 0x00000000},
+       {0x441C, 0x00000000},
+       {0x4420, 0x6C000000},
+       {0x4424, 0xB0200020},
+       {0x4428, 0x00001FF0},
+       {0x442C, 0x00000000},
+       {0x4430, 0x00000000},
+       {0x4434, 0x00000000},
+       {0x4438, 0x00000000},
+       {0x443C, 0x190642D0},
+       {0x4440, 0xA80668A0},
+       {0x4444, 0x60900820},
+       {0x4448, 0x9F28518C},
+       {0x444C, 0x32488A62},
+       {0x4450, 0x9C6E36DC},
+       {0x4454, 0x0000F52B},
+       {0x4458, 0x00000000},
+       {0x445C, 0x4801442E},
+       {0x4460, 0x0051A0B8},
+       {0x4464, 0x00000000},
+       {0x4468, 0x00000000},
+       {0x446C, 0x00000000},
+       {0x4470, 0x00000000},
+       {0x4474, 0x00000000},
+       {0x4478, 0x00000000},
+       {0x447C, 0x00000000},
+       {0x4480, 0x2A0A6040},
+       {0x4484, 0x0A0A6829},
+       {0x4488, 0x00000004},
+       {0x448C, 0x00000000},
+       {0x4490, 0x80000000},
+       {0x4494, 0x10000000},
+       {0x4498, 0xE0000000},
+       {0x4AB4, 0x00000000},
+       {0x449C, 0x0000001E},
+       {0x44A0, 0x02B2C3A6},
+       {0x44A4, 0x00000400},
+       {0x44A8, 0x00000001},
+       {0x44AC, 0x000190C0},
+       {0x44B0, 0x00000000},
+       {0x44B4, 0x00000000},
+       {0x44B8, 0x00000000},
+       {0x44BC, 0x00000000},
+       {0x44C0, 0x00000000},
+       {0x44C4, 0x00000000},
+       {0x44C8, 0x00000000},
+       {0x44CC, 0x00000000},
+       {0x44D0, 0x00000000},
+       {0x44D4, 0x00000000},
+       {0x44D8, 0x00000000},
+       {0x44DC, 0x00000000},
+       {0x44E0, 0x00000000},
+       {0x44E4, 0x00000000},
+       {0x44E8, 0x00000000},
+       {0x44EC, 0x00000000},
+       {0x44F0, 0x00000000},
+       {0x44F4, 0x00000000},
+       {0x44F8, 0x00000000},
+       {0x44FC, 0x00000000},
+       {0x4500, 0x00000000},
+       {0x4504, 0x00000000},
+       {0x4508, 0x00000000},
+       {0x450C, 0x00000000},
+       {0x4510, 0x00000000},
+       {0x4514, 0x00000000},
+       {0x4518, 0x00000000},
+       {0x451C, 0x00000000},
+       {0x4520, 0x00000000},
+       {0x4524, 0x00000000},
+       {0x4528, 0x00000000},
+       {0x452C, 0x00000000},
+       {0x4530, 0x4E830171},
+       {0x4534, 0x00000870},
+       {0x4538, 0x000000FF},
+       {0x453C, 0x00000000},
+       {0x4540, 0x00000000},
+       {0x4544, 0x00000000},
+       {0x4548, 0x00000000},
+       {0x454C, 0x00000000},
+       {0x4550, 0x00000000},
+       {0x4554, 0x00000000},
+       {0x4558, 0x00000000},
+       {0x455C, 0x00000000},
+       {0x4560, 0x40000000},
+       {0x4564, 0x40000000},
+       {0x4568, 0x00000000},
+       {0x456C, 0x20000000},
+       {0x4570, 0x04F040BB},
+       {0x4574, 0x000E53FF},
+       {0x4578, 0x000205CB},
+       {0x457C, 0x00200000},
+       {0x4580, 0x00000040},
+       {0x4584, 0x00000000},
+       {0x4588, 0x00000017},
+       {0x458C, 0x30000000},
+       {0x4590, 0x00000000},
+       {0x4594, 0x00000000},
+       {0x4598, 0x00000001},
+       {0x459C, 0x0003FE00},
+       {0x45A0, 0x00000086},
+       {0x45A4, 0x00000000},
+       {0x45A8, 0xC00001C0},
+       {0x45AC, 0x78038000},
+       {0x45B0, 0x8000004A},
+       {0x45B4, 0x04094800},
+       {0x45B8, 0x00280002},
+       {0x45BC, 0x06748790},
+       {0x45C0, 0x80000000},
+       {0x45C4, 0x00000000},
+       {0x45C8, 0x00000000},
+       {0x45CC, 0x00558670},
+       {0x45D0, 0x002883F0},
+       {0x45D4, 0x00090120},
+       {0x45D8, 0x00000000},
+       {0x45E0, 0xA3A6D3C4},
+       {0x45E4, 0xAB27B126},
+       {0x45E8, 0x00006778},
+       {0x45F4, 0x000001B5},
+       {0x45EC, 0x11110F0A},
+       {0x45F0, 0x00000003},
+       {0x4A0C, 0x0000000A},
+       {0x45F8, 0x0058BC3F},
+       {0x45FC, 0x00000003},
+       {0x462C, 0x00000020},
+       {0x4600, 0x000003D9},
+       {0x45F0, 0x00000004},
+       {0x4604, 0x002B1CB0},
+       {0x4A50, 0xC0000000},
+       {0x4A54, 0x00001000},
+       {0x4A58, 0x00000000},
+       {0x4A18, 0x00000024},
+       {0x4608, 0x00000001},
+       {0x460C, 0x00000000},
+       {0x4A10, 0x00000001},
+       {0x4610, 0x00000001},
+       {0x4614, 0x16E5298F},
+       {0x4618, 0x18C6294A},
+       {0x461C, 0x0E06318A},
+       {0x4620, 0x0E539CE5},
+       {0x4624, 0x00019287},
+       {0x4A14, 0x000000BF},
+       {0x4628, 0x00000001},
+       {0x4630, 0x000001AA},
+       {0x4A18, 0x00001900},
+       {0x4A1C, 0x000002A6},
+       {0x4634, 0x000000A3},
+       {0x4A20, 0x00000086},
+       {0x4638, 0x01986456},
+       {0x49F8, 0x00000000},
+       {0x463C, 0x00000000},
+       {0x4640, 0x00000000},
+       {0x4644, 0x00C8CC00},
+       {0x4648, 0xC400B6B6},
+       {0x464C, 0xDC400FC0},
+       {0x4A8C, 0x00000110},
+       {0x4650, 0x08882550},
+       {0x4654, 0x08CC2660},
+       {0x4658, 0x09102660},
+       {0x465C, 0x00000154},
+       {0x45DC, 0xC39E38E8},
+       {0x4660, 0x452607E6},
+       {0x4664, 0x6750DC65},
+       {0x4668, 0xF3F0F1ED},
+       {0x466C, 0x30141506},
+       {0x4670, 0x2C2B2B2B},
+       {0x4674, 0x2C2C2C2C},
+       {0x4678, 0xDDB738E8},
+       {0x467C, 0x543618FB},
+       {0x4680, 0x4F31DC6F},
+       {0x4684, 0xFBEBDA00},
+       {0x4688, 0x1A10FF04},
+       {0x468C, 0x282A3000},
+       {0x4690, 0x2A29292A},
+       {0x4694, 0x04FA2A2A},
+       {0x4698, 0xEE0F04D1},
+       {0x469C, 0x99E91436},
+       {0x46A0, 0x0701E79E},
+       {0x46A4, 0x08D77CFF},
+       {0x46A8, 0x2212FF14},
+       {0x46AC, 0x60322437},
+       {0x46B0, 0x63666666},
+       {0x46B4, 0x35374425},
+       {0x46B8, 0x35883042},
+       {0x46BC, 0x5177C252},
+       {0x4720, 0x7FFFFD63},
+       {0x4724, 0xB58D11FF},
+       {0x4728, 0x07FFFFFF},
+       {0x472C, 0x0E7893B6},
+       {0x4730, 0xE0391201},
+       {0x4734, 0x00000020},
+       {0x4738, 0x8325C500},
+       {0x473C, 0x00000B7F},
+       {0x46C0, 0x00000000},
+       {0x46C4, 0x00000000},
+       {0x46C8, 0x00000219},
+       {0x46CC, 0x00000000},
+       {0x46D0, 0x00000000},
+       {0x46D4, 0x00000001},
+       {0x46D8, 0x00000001},
+       {0x46DC, 0x00000000},
+       {0x46E0, 0x00000000},
+       {0x46E4, 0x00000151},
+       {0x46E8, 0x00000498},
+       {0x46EC, 0x00000498},
+       {0x46F0, 0x00000000},
+       {0x46F4, 0x00000000},
+       {0x46F8, 0x00001146},
+       {0x46FC, 0x00000000},
+       {0x4700, 0x00000000},
+       {0x4704, 0x00C8CC00},
+       {0x4708, 0xC400B6B6},
+       {0x470C, 0xDC400FC0},
+       {0x4A90, 0x00000110},
+       {0x4710, 0x08882550},
+       {0x4714, 0x08CC2660},
+       {0x4718, 0x09102660},
+       {0x471C, 0x00000154},
+       {0x4740, 0xC69F38E8},
+       {0x4744, 0x462709E9},
+       {0x4748, 0x6750DC67},
+       {0x474C, 0xF3F0F1ED},
+       {0x4750, 0x30141506},
+       {0x4754, 0x2C2B2B2B},
+       {0x4758, 0x2C2C2C2C},
+       {0x475C, 0xE0B738E8},
+       {0x4760, 0x52381BFE},
+       {0x4764, 0x5031DC6C},
+       {0x4768, 0xFBEBDA00},
+       {0x476C, 0x1A10FF04},
+       {0x4770, 0x282A3000},
+       {0x4774, 0x2A29292A},
+       {0x4778, 0x04FA2A2A},
+       {0x477C, 0xEE0F04D1},
+       {0x49F0, 0x99E91436},
+       {0x49F4, 0x0701E79E},
+       {0x49FC, 0x08D77CFF},
+       {0x4A5C, 0x2212FF14},
+       {0x4A60, 0x60322437},
+       {0x4A64, 0x63666666},
+       {0x4A68, 0x35374425},
+       {0x4A6C, 0x35883042},
+       {0x4A70, 0x5177C252},
+       {0x4A74, 0x7FFFFD63},
+       {0x4A78, 0xB58D11FF},
+       {0x4A7C, 0x07FFFFFF},
+       {0x4A80, 0x0E7893B6},
+       {0x4A9C, 0xE0391201},
+       {0x4AA0, 0x00000020},
+       {0x4AA4, 0x8325C500},
+       {0x4AA8, 0x00000B7F},
+       {0x4780, 0x00000000},
+       {0x4784, 0x00000000},
+       {0x4788, 0x00000219},
+       {0x478C, 0x00000000},
+       {0x4790, 0x00000000},
+       {0x4794, 0x00000001},
+       {0x4798, 0x00000001},
+       {0x479C, 0x00000000},
+       {0x47A0, 0x00000000},
+       {0x47A4, 0x00000151},
+       {0x47A8, 0x00000498},
+       {0x47AC, 0x00000498},
+       {0x47B0, 0x00000000},
+       {0x47B4, 0x00000000},
+       {0x47B8, 0x00001146},
+       {0x47BC, 0x00000002},
+       {0x47C0, 0x00000002},
+       {0x47C4, 0x00000000},
+       {0x47C8, 0xA32103FE},
+       {0x47CC, 0xB20A5328},
+       {0x47D0, 0xC686314F},
+       {0x47D4, 0x000005D7},
+       {0x47D8, 0x009B902A},
+       {0x47DC, 0x009B902A},
+       {0x47E0, 0x98682C18},
+       {0x47E4, 0x6308C4C1},
+       {0x47E8, 0x6248C631},
+       {0x47EC, 0x922A8253},
+       {0x47F0, 0x00000005},
+       {0x47F4, 0x00001759},
+       {0x47F8, 0x4BB02000},
+       {0x47FC, 0x831408BE},
+       {0x4A84, 0x000000E9},
+       {0x4800, 0x9ABBCACB},
+       {0x4804, 0x56767578},
+       {0x4808, 0xBCCBBB13},
+       {0x480C, 0x7889989B},
+       {0x4810, 0xBBB0F455},
+       {0x4814, 0x777BBBBB},
+       {0x4818, 0x15277777},
+       {0x481C, 0x27039CE9},
+       {0x4820, 0x42424432},
+       {0x4824, 0x36058342},
+       {0x4828, 0x00000006},
+       {0x482C, 0x00000005},
+       {0x4830, 0x00000005},
+       {0x4834, 0xC7013016},
+       {0x4838, 0x84413016},
+       {0x483C, 0x84413016},
+       {0x4840, 0x8C413016},
+       {0x4844, 0x8C40B028},
+       {0x4848, 0x3140B028},
+       {0x484C, 0x2940B028},
+       {0x4850, 0x8440B028},
+       {0x4854, 0x2318C610},
+       {0x4858, 0x45344753},
+       {0x485C, 0x236A6A88},
+       {0x4860, 0xAC8DF814},
+       {0x4864, 0x08877ACB},
+       {0x4868, 0x000107AA},
+       {0x4A94, 0x00000000},
+       {0x486C, 0xBCEB4A14},
+       {0x4870, 0x000A3A4A},
+       {0x4874, 0xBCEB4A14},
+       {0x4878, 0x000A3A4A},
+       {0x487C, 0xBCBDBD85},
+       {0x4880, 0x0CABB99A},
+       {0x4884, 0x38384242},
+       {0x4888, 0x0086102E},
+       {0x488C, 0xCA24C82A},
+       {0x4890, 0x00008A62},
+       {0x4894, 0x00000008},
+       {0x4898, 0x009B902A},
+       {0x489C, 0x009B902A},
+       {0x48A0, 0x98682C18},
+       {0x48A4, 0x6308C4C1},
+       {0x48A8, 0x6248C631},
+       {0x48AC, 0x922A8253},
+       {0x48B0, 0x00000005},
+       {0x48B4, 0x00001759},
+       {0x48B8, 0x4BA02000},
+       {0x48BC, 0x831408BE},
+       {0x4A88, 0x000000E9},
+       {0x48C0, 0x9898A8BB},
+       {0x48C4, 0x54535368},
+       {0x48C8, 0x99999B13},
+       {0x48CC, 0x55555899},
+       {0x48D0, 0xBBB07453},
+       {0x48D4, 0x777BBBBB},
+       {0x48D8, 0x15277777},
+       {0x48DC, 0x27039CE9},
+       {0x48E0, 0x31413432},
+       {0x48E4, 0x36058342},
+       {0x48E8, 0x00000006},
+       {0x48EC, 0x00000005},
+       {0x48F0, 0x00000005},
+       {0x48F4, 0xC7013016},
+       {0x48F8, 0x84413016},
+       {0x48FC, 0x84413016},
+       {0x4900, 0x8C413016},
+       {0x4904, 0x8C40B028},
+       {0x4908, 0x3140B028},
+       {0x490C, 0x2940B028},
+       {0x4910, 0x8440B028},
+       {0x4914, 0x2318C610},
+       {0x4918, 0x45334753},
+       {0x491C, 0x236A6A88},
+       {0x4920, 0xAC8DF814},
+       {0x4924, 0x08877ACB},
+       {0x4928, 0x000007AA},
+       {0x4A98, 0x00000000},
+       {0x492C, 0xBCEB4A14},
+       {0x4930, 0x000A3A4A},
+       {0x4934, 0xBCEB4A14},
+       {0x4938, 0x000A3A4A},
+       {0x493C, 0x9A8A8A85},
+       {0x4940, 0x0CA3B99A},
+       {0x4944, 0x38384242},
+       {0x4948, 0x8086102E},
+       {0x494C, 0xCA24C82A},
+       {0x4950, 0x00008A62},
+       {0x4954, 0x00000008},
+       {0x4958, 0x80040000},
+       {0x495C, 0x80040000},
+       {0x4960, 0xFE800000},
+       {0x4964, 0x834C0000},
+       {0x4968, 0x00000000},
+       {0x496C, 0x00000000},
+       {0x4970, 0x00000000},
+       {0x4974, 0x00000000},
+       {0x4978, 0x00000000},
+       {0x497C, 0x00000000},
+       {0x4980, 0x40000000},
+       {0x4984, 0x00000000},
+       {0x4988, 0x00000000},
+       {0x498C, 0x00000000},
+       {0x4990, 0x00000000},
+       {0x4994, 0x04065800},
+       {0x4998, 0x02004080},
+       {0x499C, 0x0E1E3E05},
+       {0x49A0, 0x0A163068},
+       {0x49A4, 0x00206040},
+       {0x49A8, 0x02020202},
+       {0x49AC, 0x00002020},
+       {0x49B0, 0xF8F8F418},
+       {0x49B4, 0xF8E8F8F8},
+       {0x49B8, 0xF80808E8},
+       {0x4A00, 0xF8F8FA00},
+       {0x4A04, 0xFAFAFAF8},
+       {0x4A08, 0xFAFAFAFA},
+       {0x4A28, 0xFAFAFAFA},
+       {0x4A2C, 0xFAFAFAFA},
+       {0x4A30, 0xFAFAFAFA},
+       {0x4A34, 0xFAFAFAFA},
+       {0x4A38, 0xFAFAFAFA},
+       {0x4A3C, 0xFAFAFAFA},
+       {0x4A40, 0xFAFAFAFA},
+       {0x4A44, 0x0000FAFA},
+       {0x49BC, 0x00000000},
+       {0x49C0, 0x800CD62D},
+       {0x49C4, 0x00000103},
+       {0x49C8, 0x00000000},
+       {0x49CC, 0x00000000},
+       {0x49D0, 0x00000000},
+       {0x49D4, 0x00000000},
+       {0x49D8, 0x00000000},
+       {0x49DC, 0x00000000},
+       {0x49E0, 0x00000000},
+       {0x49E4, 0x00000000},
+       {0x49E8, 0x00000000},
+       {0x49EC, 0x00000000},
+       {0x994, 0x00000010},
+       {0x904, 0x00000005},
+       {0xC3C, 0x2840E1BF},
+       {0xC40, 0x00000000},
+       {0xC44, 0x00000007},
+       {0xC48, 0x410E4000},
+       {0xC54, 0x1EE14368},
+       {0xC58, 0x41000000},
+       {0x730, 0x00000002},
+       {0xC60, 0x017FFFF2},
+       {0xC64, 0x0010A130},
+       {0xC68, 0x10000050},
+       {0xC6C, 0x10001021},
+       {0x708, 0x00000000},
+       {0x884, 0x0043F01D},
+       {0x704, 0x601E0100},
+       {0x710, 0xEF810000},
+       {0x704, 0x601E0100},
+       {0xD40, 0xF64FA0F7},
+       {0xD44, 0x0400063F},
+       {0xD48, 0x0003FF7F},
+       {0xD4C, 0x00000000},
+       {0xD50, 0xF64FA0F7},
+       {0xD54, 0x04100437},
+       {0xD58, 0x0000FF7F},
+       {0xD5C, 0x00000000},
+       {0xD60, 0x00000000},
+       {0xD64, 0x00000000},
+       {0xD70, 0x00000015},
+       {0xD90, 0x000003FF},
+       {0xD94, 0x00000000},
+       {0xD98, 0x0000003F},
+       {0xD9C, 0x00000000},
+       {0xDA0, 0x000003FE},
+       {0xDA4, 0x00000000},
+       {0xDA8, 0x0000003F},
+       {0xDAC, 0x00000000},
+       {0xD00, 0x77777777},
+       {0xD04, 0xBBBBBBBB},
+       {0xD08, 0xBBBBBBBB},
+       {0xD0C, 0x00000070},
+       {0xD10, 0x20110900},
+       {0xD10, 0x20110FFF},
+       {0xD78, 0x00000001},
+       {0xD7C, 0x001D050E},
+       {0xD84, 0x00004207},
+       {0xD18, 0x50209900},
+       {0xD80, 0x00804100},
+       {0x718, 0x1333233F},
+       {0x604, 0x041E1E1E},
+       {0x714, 0x00010000},
+       {0x586C, 0x000000F0},
+       {0x586C, 0x000000E0},
+       {0x586C, 0x000000D0},
+       {0x586C, 0x000000C0},
+       {0x586C, 0x000000B0},
+       {0x586C, 0x000000A0},
+       {0x586C, 0x00000090},
+       {0x586C, 0x00000080},
+       {0x586C, 0x00000070},
+       {0x586C, 0x00000060},
+       {0x586C, 0x00000050},
+       {0x586C, 0x00000040},
+       {0x586C, 0x00000030},
+       {0x586C, 0x00000020},
+       {0x586C, 0x00000010},
+       {0x586C, 0x00000000},
+       {0x786C, 0x000000F0},
+       {0x786C, 0x000000E0},
+       {0x786C, 0x000000D0},
+       {0x786C, 0x000000C0},
+       {0x786C, 0x000000B0},
+       {0x786C, 0x000000A0},
+       {0x786C, 0x00000090},
+       {0x786C, 0x00000080},
+       {0x786C, 0x00000070},
+       {0x786C, 0x00000060},
+       {0x786C, 0x00000050},
+       {0x786C, 0x00000040},
+       {0x786C, 0x00000030},
+       {0x786C, 0x00000020},
+       {0x786C, 0x00000010},
+       {0x786C, 0x00000000},
+       {0xC0D4, 0x4486888C},
+       {0xC0D8, 0xC6BA10E1},
+       {0xC0DC, 0x30C52868},
+       {0xC0E0, 0x05008128},
+       {0xC0E4, 0x0000A72B},
+       {0xC1D4, 0x4486888C},
+       {0xC1D8, 0xC6BA10E1},
+       {0xC1DC, 0x30C52868},
+       {0xC1E0, 0x05008128},
+       {0xC1E4, 0x0000A72B},
+       {0xC0EC, 0x00000000},
+       {0xC0E4, 0x0000272B},
+       {0xC1EC, 0x00000000},
+       {0xC1E4, 0x0000272B},
+       {0x334, 0xFFFFFFFF},
+       {0x33C, 0x55000000},
+       {0x340, 0x00005555},
+       {0x724, 0x00111200},
+       {0x5868, 0xA9550000},
+       {0x5870, 0x33221100},
+       {0x5874, 0x77665544},
+       {0x5878, 0xBBAA9988},
+       {0x587C, 0xFFEEDDCC},
+       {0x5880, 0x76543210},
+       {0x5884, 0xFEDCBA98},
+       {0x5888, 0x00000000},
+       {0x588C, 0x00000000},
+       {0x5894, 0x00000008},
+       {0x7868, 0xA9550000},
+       {0x7870, 0x33221100},
+       {0x7874, 0x77665544},
+       {0x7878, 0xBBAA9988},
+       {0x787C, 0xFFEEDDCC},
+       {0x7880, 0x76543210},
+       {0x7884, 0xFEDCBA98},
+       {0x7888, 0x00000000},
+       {0x788C, 0x00000000},
+       {0x7894, 0x00000008},
+       {0x650, 0x00200888},
+       {0x710, 0xF3810000},
+       {0x020, 0x0000F381},
+       {0x024, 0x0000F381},
+       {0x000, 0xC580801E},
+       {0xC70, 0x00000400},
+       {0x980, 0x10002250},
+       {0x988, 0x3C3C4107},
+       {0x994, 0x00000010},
+       {0x2994, 0x00000010},
+       {0x000, 0x0580801F},
+       {0x240C, 0x00000000},
+       {0x640, 0x140A141E},
+       {0x640, 0x1414141E},
+       {0x640, 0x1414141E},
+       {0x644, 0x3414283C},
+       {0x644, 0x3425283C},
+       {0x644, 0x3426283C},
+       {0x2640, 0x140A141E},
+       {0x2640, 0x1414141E},
+       {0x2640, 0x1414141E},
+       {0x2644, 0x3414283C},
+       {0x2644, 0x3425283C},
+       {0x2644, 0x3425183C},
+       {0x2300, 0x02748790},
+       {0x2304, 0x00558670},
+       {0x2308, 0x002883F0},
+       {0x230C, 0x00090120},
+       {0x2310, 0x00000000},
+       {0x2314, 0x06000000},
+       {0x2318, 0x00000000},
+       {0x231C, 0x00000000},
+       {0x2320, 0x03020100},
+       {0x2324, 0x07060504},
+       {0x2328, 0x0B0A0908},
+       {0x232C, 0x0F0E0D0C},
+       {0x2330, 0x13121110},
+       {0x2334, 0x17161514},
+       {0x2338, 0x0C700022},
+       {0x233C, 0x0A0529D0},
+       {0x2340, 0x000529D0},
+       {0x2344, 0x0006318A},
+       {0x2348, 0xB7E6318A},
+       {0x234C, 0x80039C00},
+       {0x2350, 0x80039C00},
+       {0x2354, 0x0005298F},
+       {0x2358, 0x0015296E},
+       {0x235C, 0x0C07FC31},
+       {0x2360, 0x0219AAAE},
+       {0x2364, 0xE4F624C3},
+       {0x2368, 0x53626F15},
+       {0x236C, 0x48000000},
+       {0x2370, 0x48000000},
+       {0x2374, 0x07540000},
+       {0x2378, 0x202401B9},
+       {0x237C, 0x00F7000E},
+       {0x2380, 0x0F0A1111},
+       {0x2384, 0x30D9000F},
+       {0x2388, 0x0200EA02},
+       {0x238C, 0x003CB061},
+       {0x2390, 0x69C00000},
+       {0x2394, 0x00000000},
+       {0x2398, 0x000000F0},
+       {0x239C, 0x0001FFFF},
+       {0x23A0, 0x00C80064},
+       {0x23A4, 0x0190012C},
+       {0x23A8, 0x001917BE},
+       {0x23AC, 0x0B30880C},
+       {0x23B0, 0x9281CE00},
+       {0x23B4, 0x7F027C00},
+       {0x704, 0x601E0102},
+       {0x704, 0x601E0102},
+       {0x5864, 0x080801FF},
+       {0x7864, 0x080801FF},
+       {0xC60, 0x017FFFF3},
+       {0x58AC, 0x08000000},
+       {0x78AC, 0x08000000},
+       {0x8088, 0x007F0000},
+       {0x81A4, 0x003F3A00},
+       {0x81B4, 0x0100007F},
+       {0x81C0, 0x0060010B},
+       {0x81A0, 0x00000010},
+       {0x8138, 0x00000002},
+       {0x82A4, 0x003F3A00},
+       {0x82B4, 0x0100007F},
+       {0x82C0, 0x0060010B},
+       {0x82A0, 0x00000010},
+       {0x81A0, 0x00000010},
+       {0x8238, 0x00000002},
+       {0x8088, 0x00000000},
+       {0x8020, 0x00000000},
+       {0x8120, 0x00000000},
+       {0x8220, 0x00000000},
+       {0x8124, 0x00000F0F},
+       {0x8224, 0x00000F0F},
+       {0x5864, 0x180801FF},
+       {0x7864, 0x180801FF},
+       {0xC60, 0x017FFFF3},
+       {0xC70, 0x00000600},
+       {0xC70, 0x00000660},
+       {0x58AC, 0x08000000},
+       {0x78AC, 0x08000000},
+       {0x8120, 0x10000000},
+       {0x8120, 0x10030000},
+       {0x8124, 0x00000F0F},
+       {0x8124, 0x00000F0F},
+       {0x8224, 0x00000F0F},
+       {0x8224, 0x00000F0F},
+       {0x8220, 0x10000000},
+       {0x8220, 0x10030000},
+       {0x704, 0x601E0100},
+       {0x5864, 0x100801FF},
+       {0x7864, 0x100801FF},
+       {0x5864, 0x180801FF},
+       {0x7864, 0x180801FF},
+       {0x58D4, 0x7401FE00},
+       {0x78D4, 0x7401FE00},
+       {0x58F0, 0x400401FF},
+       {0x78F0, 0x400401FF},
+       {0x58F0, 0x400401FF},
+       {0x78F0, 0x400401FF},
+       {0x704, 0x601E0102},
+       {0xC7C, 0x0020BFE0},
+       {0x58C0, 0x00FE0000},
+       {0x58FC, 0x00000000},
+       {0x566C, 0x00000005},
+       {0x566C, 0x00001005},
+       {0x78C0, 0x00FE0000},
+       {0x78FC, 0x00000000},
+       {0x700, 0x00000030},
+       {0x704, 0x601E0102},
+       {0x704, 0x601E0100},
+       {0x704, 0x601E0502},
+       {0x20FC, 0x00000000},
+       {0x20F8, 0x00000000},
+       {0x20F0, 0x00000000},
+       {0x9C0, 0x00000001},
+       {0x9C0, 0x00000000},
+       {0x9C0, 0x00000001},
+       {0x9C0, 0x00000000},
+       {0x4AE8, 0x00000744},
+       {0x4AF0, 0x00000744},
+       {0x1010, 0x00000010},
+       {0x3010, 0x00000010},
+       {0x4AD4, 0x00000040},
+       {0x4AE0, 0x00000040},
+       {0x4AE4, 0x0079E99E},
+       {0x4AEC, 0x0079E99E},
+       {0x300, 0xF30CE31C},
+       {0x304, 0x13EF1F19},
+       {0x308, 0x0C0CF3F3},
+       {0x30C, 0x0C0C0C0C},
+       {0x310, 0x80496000},
+       {0x314, 0x0041E000},
+       {0x318, 0x20022042},
+       {0x31C, 0x20448009},
+       {0x320, 0x00010031},
+       {0x324, 0xE000E000},
+       {0x328, 0xE000E000},
+       {0x32C, 0xE000E000},
+       {0x12BC, 0x10104041},
+       {0x12C0, 0x14411111},
+       {0x32BC, 0x10104041},
+       {0x32C0, 0x14411111},
+       {0x010, 0x0005FFFF},
+       {0x028, 0x0000F381},
+       {0x02C, 0x0000F381},
+       {0x620, 0x00141230},
+       {0x704, 0x601C05FF},
+       {0x720, 0x20000000},
+       {0x738, 0x004100CC},
+       {0x12A0, 0x24903056},
+       {0x12AC, 0x12333121},
+       {0x12B8, 0x30020000},
+       {0x12E4, 0x30D52A68},
+       {0x2000, 0x50BBBF04},
+       {0x32A0, 0x24903056},
+       {0x32AC, 0x12333121},
+       {0x32B8, 0x30020000},
+       {0x32E4, 0x30D52A68},
+       {0x5800, 0x03FF807F},
+       {0x5804, 0x04237040},
+       {0x5808, 0x04237040},
+       {0x7800, 0x03FF807F},
+       {0x7804, 0x04237040},
+       {0x7808, 0x04237040},
+       {0x73C, 0x00000002},
+       {0x74C, 0x00000001},
+       {0x748, 0x00000002},
+       {0x5818, 0x082C1800},
+       {0x7818, 0x082C1800},
+       {0x624, 0x0101030A},
+       {0xC14, 0x85010000},
+       {0xDD4, 0x00000001},
+       {0x241C, 0x00000001},
+       {0x1200, 0x00010142},
+       {0x3200, 0x00010142},
+       {0xC0F8, 0x00000001},
+       {0xC1F8, 0x00000001},
+       {0x35C, 0x000004C4},
+       {0x0F0, 0x00000002},
+       {0x0F4, 0x00000028},
+       {0x0F8, 0x20220408},
+};
+
+static const struct rtw89_reg2_def rtw89_8852b_phy_bb_reg_gain[] = {
+       {0x000, 0x18FBDDB7},
+       {0x001, 0x006F5436},
+       {0x002, 0x00004F31},
+       {0x100, 0x1BFEE0B7},
+       {0x101, 0x006C5238},
+       {0x102, 0x00005031},
+       {0x10000, 0x07E6C39E},
+       {0x10001, 0x00654526},
+       {0x10002, 0x00006750},
+       {0x10100, 0x09E9C69F},
+       {0x10101, 0x00674627},
+       {0x10102, 0x00006750},
+       {0x20000, 0x06E8C49F},
+       {0x20001, 0x00654526},
+       {0x20002, 0x00006750},
+       {0x20100, 0x07E9C6A0},
+       {0x20101, 0x00674728},
+       {0x20102, 0x00006850},
+       {0x30000, 0x04E5C39D},
+       {0x30001, 0x00634325},
+       {0x30002, 0x00006750},
+       {0x30100, 0x06E9C69F},
+       {0x30101, 0x00654527},
+       {0x30102, 0x00006750},
+       {0x1000000, 0x000000F4},
+       {0x1000010, 0x000000F8},
+       {0x1000011, 0x0000F8F8},
+       {0x1000100, 0x000000F8},
+       {0x1000110, 0x00000000},
+       {0x1000111, 0x00000000},
+       {0x1010000, 0x000000F4},
+       {0x1010010, 0x000000F8},
+       {0x1010011, 0x0000F8F8},
+       {0x1010020, 0x000000F8},
+       {0x1010021, 0x0808E8E8},
+       {0x1010029, 0x0000F8F8},
+       {0x1010100, 0x000000F4},
+       {0x1010110, 0x000000F8},
+       {0x1010111, 0x0000F8F8},
+       {0x1010120, 0x000000F8},
+       {0x1010121, 0x0808E8E8},
+       {0x1010129, 0x0000F8F8},
+       {0x1020000, 0x000000F4},
+       {0x1020010, 0x000000F8},
+       {0x1020011, 0x0000F8F8},
+       {0x1020020, 0x000000F8},
+       {0x1020021, 0x0808E8E8},
+       {0x1020029, 0x0000F8F8},
+       {0x1020100, 0x000000F4},
+       {0x1020110, 0x000000F8},
+       {0x1020111, 0x0000F8F8},
+       {0x1020120, 0x000000F8},
+       {0x1020121, 0x0808E8E8},
+       {0x1020129, 0x0000F8F8},
+       {0x1030000, 0x000000F4},
+       {0x1030010, 0x000000F8},
+       {0x1030011, 0x0000F8F8},
+       {0x1030020, 0x000000F8},
+       {0x1030021, 0x0808E8E8},
+       {0x1030029, 0x0000F8F8},
+       {0x1030100, 0x000000F4},
+       {0x1030110, 0x000000F8},
+       {0x1030111, 0x0000F8F8},
+       {0x1030120, 0x000000F8},
+       {0x1030121, 0x0808E8E8},
+       {0x1030129, 0x0000F8F8},
+};
+
+static const struct rtw89_reg2_def rtw89_8852b_phy_radioa_regs[] = {
+       {0xF0010000, 0x00000000},
+       {0xF0020000, 0x00000001},
+       {0xF0010001, 0x00000002},
+       {0xF0020001, 0x00000003},
+       {0xF0030001, 0x00000004},
+       {0xF0040001, 0x00000005},
+       {0xF0050001, 0x00000006},
+       {0xF0060001, 0x00000007},
+       {0xF0070001, 0x00000008},
+       {0xF0080001, 0x00000009},
+       {0xF0290001, 0x0000000A},
+       {0xF02B0001, 0x0000000B},
+       {0x005, 0x00000000},
+       {0x000, 0x00030000},
+       {0x10000, 0x00030000},
+       {0x018, 0x00011124},
+       {0x10018, 0x00011124},
+       {0x000, 0x00033C00},
+       {0x10000, 0x00033C00},
+       {0x01A, 0x00040004},
+       {0x011, 0x00014073},
+       {0x067, 0x00000070},
+       {0x059, 0x000A0000},
+       {0x066, 0x00000100},
+       {0x057, 0x0000D589},
+       {0x05A, 0x0007FFFF},
+       {0x0A4, 0x0006FF12},
+       {0x043, 0x00005000},
+       {0x0E1, 0x00000001},
+       {0x0DD, 0x000001A0},
+       {0x0CA, 0x00002000},
+       {0x0D3, 0x00000003},
+       {0x0B3, 0x0004EFE0},
+       {0x0B4, 0x0007C07E},
+       {0x0B5, 0x0003A701},
+       {0x0B6, 0x000581E0},
+       {0x0B7, 0x00001A0A},
+       {0x0BB, 0x000C7000},
+       {0x0ED, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x00000543},
+       {0x033, 0x00000001},
+       {0x03F, 0x00000542},
+       {0x033, 0x00000002},
+       {0x03F, 0x00000541},
+       {0x033, 0x00000003},
+       {0x03F, 0x00000521},
+       {0x033, 0x00000004},
+       {0x03F, 0x00000343},
+       {0x033, 0x00000005},
+       {0x03F, 0x00000342},
+       {0x033, 0x00000006},
+       {0x03F, 0x00000341},
+       {0x033, 0x00000007},
+       {0x03F, 0x00000321},
+       {0x033, 0x00000008},
+       {0x03F, 0x000005C3},
+       {0x033, 0x00000009},
+       {0x03F, 0x000005C2},
+       {0x033, 0x0000000A},
+       {0x03F, 0x000005C1},
+       {0x033, 0x0000000B},
+       {0x03F, 0x000005A1},
+       {0x033, 0x0000000C},
+       {0x03F, 0x000002C3},
+       {0x033, 0x0000000D},
+       {0x03F, 0x000002C2},
+       {0x033, 0x0000000E},
+       {0x03F, 0x000002C1},
+       {0x033, 0x0000000F},
+       {0x03F, 0x000002A1},
+       {0x0ED, 0x00000000},
+       {0x0ED, 0x00002000},
+       {0x033, 0x00000002},
+       {0x03D, 0x0004A883},
+       {0x03E, 0x00000000},
+       {0x03F, 0x00000001},
+       {0x033, 0x00000006},
+       {0x03D, 0x0004A883},
+       {0x03E, 0x00000000},
+       {0x03F, 0x00000001},
+       {0x0ED, 0x00000000},
+       {0x018, 0x00001001},
+       {0x10018, 0x00001001},
+       {0x002, 0x0000000D},
+       {0x10002, 0x0000000D},
+       {0x0EE, 0x00000004},
+       {0x033, 0x0000000B},
+       {0x03F, 0x0000000B},
+       {0x033, 0x0000000C},
+       {0x03F, 0x00000012},
+       {0x033, 0x0000000D},
+       {0x03F, 0x00000019},
+       {0x0EE, 0x00000000},
+       {0x08F, 0x000D0F7A},
+       {0x0EF, 0x00080000},
+       {0x033, 0x00000008},
+       {0x03E, 0x000000C4},
+       {0x03F, 0x000034C0},
+       {0x033, 0x0000000A},
+       {0x03E, 0x000000C4},
+       {0x03F, 0x000035D0},
+       {0x033, 0x0000000B},
+       {0x03E, 0x000000C4},
+       {0x03F, 0x000035C8},
+       {0x033, 0x0000008A},
+       {0x03E, 0x000000C4},
+       {0x03F, 0x000035F7},
+       {0x0EF, 0x00000000},
+       {0x08D, 0x000CC800},
+       {0x0EF, 0x00004000},
+       {0x033, 0x00000006},
+       {0x03F, 0x00000700},
+       {0x033, 0x00000005},
+       {0x03F, 0x00090600},
+       {0x033, 0x00000004},
+       {0x03F, 0x000A3500},
+       {0x033, 0x00000003},
+       {0x03F, 0x000A3400},
+       {0x033, 0x00000002},
+       {0x03F, 0x00008B00},
+       {0x033, 0x00000001},
+       {0x03F, 0x00001B00},
+       {0x033, 0x00000000},
+       {0x03F, 0x00003A00},
+       {0x033, 0x0000000F},
+       {0x03F, 0x00000700},
+       {0x033, 0x0000000E},
+       {0x03F, 0x00000700},
+       {0x033, 0x0000000D},
+       {0x03F, 0x00090600},
+       {0x033, 0x0000000C},
+       {0x03F, 0x000A3500},
+       {0x033, 0x0000000B},
+       {0x03F, 0x000A3400},
+       {0x033, 0x0000000A},
+       {0x03F, 0x00008B00},
+       {0x033, 0x00000009},
+       {0x03F, 0x00001B00},
+       {0x033, 0x00000008},
+       {0x03F, 0x00003A00},
+       {0x0EF, 0x00000000},
+       {0x0EE, 0x00000010},
+       {0x033, 0x00000006},
+       {0x03F, 0x00000003},
+       {0x033, 0x00000007},
+       {0x03F, 0x00000003},
+       {0x033, 0x00000008},
+       {0x03F, 0x00000001},
+       {0x0EE, 0x00000000},
+       {0x0EF, 0x00001000},
+       {0x033, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x033, 0x00000001},
+       {0x03F, 0x00000017},
+       {0x0EF, 0x00000000},
+       {0x0EF, 0x00008000},
+       {0x033, 0x00000000},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000001},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000002},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000003},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x00000004},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x00000005},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x00000006},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x033, 0x00000008},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000009},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x0000000A},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x0000000B},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x0000000C},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x0000000D},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x0000000E},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x033, 0x00000010},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000011},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000012},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000013},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x00000014},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x00000015},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x00000016},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x033, 0x00000020},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000021},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000022},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000023},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x00000024},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x00000025},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x00000026},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x033, 0x00000028},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000029},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x0000002A},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x0000002B},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x0000002C},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x0000002D},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x0000002E},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x033, 0x00000030},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000031},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000032},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000033},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x00000034},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x00000035},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x00000036},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x0EF, 0x00000000},
+       {0x0EF, 0x00000100},
+       {0x033, 0x00000000},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000001},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000002},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000003},
+       {0x03F, 0x00004376},
+       {0x033, 0x00000004},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000005},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000006},
+       {0x03F, 0x00004376},
+       {0x033, 0x00000007},
+       {0x03F, 0x00004376},
+       {0x033, 0x00000008},
+       {0x03F, 0x00004376},
+       {0x033, 0x00000009},
+       {0x03F, 0x00004376},
+       {0x033, 0x0000000A},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000D},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000E},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000F},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000010},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000011},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000012},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000013},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000014},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000015},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000016},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000017},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000020},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000021},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000022},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000023},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000024},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000025},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000026},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000027},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004386},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004396},
+       {0xB0000000, 0x00000000},
+       {0x0EF, 0x00000000},
+       {0x067, 0x00008072},
+       {0x0EF, 0x00000010},
+       {0x033, 0x00000001},
+       {0x03F, 0x00000ED5},
+       {0x033, 0x00000002},
+       {0x03F, 0x00000FC7},
+       {0x033, 0x00000003},
+       {0x03F, 0x00000783},
+       {0x033, 0x00000004},
+       {0x03F, 0x00000973},
+       {0x033, 0x00000005},
+       {0x03F, 0x00000762},
+       {0x033, 0x00000006},
+       {0x03F, 0x00000762},
+       {0x0EF, 0x00000000},
+       {0x0EF, 0x00000080},
+       {0x033, 0x00000000},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000001},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000002},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000003},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000004},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000005},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000006},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000007},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000008},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000009},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000A},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000B},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000C},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000D},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000E},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000F},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000010},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000011},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000012},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000013},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023958},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000014},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000015},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000016},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000017},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000018},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000019},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001A},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001B},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001C},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001D},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001E},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001F},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000020},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000021},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000022},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000023},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000024},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000025},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000026},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000027},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000028},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000029},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002A},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002B},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002C},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002D},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002E},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002F},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000030},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000031},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000032},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000033},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000034},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000035},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000036},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000037},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000038},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000039},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026858},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000003A},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000003B},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00023A58},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x0002C758},
+       {0xB0000000, 0x00000000},
+       {0x0EF, 0x00000000},
+       {0x0EE, 0x00000800},
+       {0x033, 0x00000000},
+       {0x03F, 0x00000001},
+       {0x033, 0x00000001},
+       {0x03F, 0x00000003},
+       {0x033, 0x00000002},
+       {0x03F, 0x00000005},
+       {0x033, 0x00000003},
+       {0x03F, 0x00000007},
+       {0x033, 0x00000004},
+       {0x03F, 0x00000001},
+       {0x033, 0x00000005},
+       {0x03F, 0x00000003},
+       {0x033, 0x00000006},
+       {0x03F, 0x00000006},
+       {0x033, 0x00000007},
+       {0x03F, 0x00000007},
+       {0x0EE, 0x00000000},
+       {0x0EE, 0x00001000},
+       {0x033, 0x00000000},
+       {0x03F, 0x00003000},
+       {0x033, 0x00000001},
+       {0x03F, 0x00003001},
+       {0x033, 0x00000002},
+       {0x03F, 0x00003003},
+       {0x033, 0x00000003},
+       {0x03F, 0x00003007},
+       {0x033, 0x00000004},
+       {0x03F, 0x0000300F},
+       {0x033, 0x00000005},
+       {0x03F, 0x0000310F},
+       {0x033, 0x00000006},
+       {0x03F, 0x0000330F},
+       {0x033, 0x00000007},
+       {0x03F, 0x0000330F},
+       {0x033, 0x00000008},
+       {0x03F, 0x00003000},
+       {0x033, 0x00000009},
+       {0x03F, 0x00003001},
+       {0x033, 0x0000000A},
+       {0x03F, 0x00003003},
+       {0x033, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00003103},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000D},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00002307},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000E},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000F},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0xB0000000, 0x00000000},
+       {0x0EE, 0x00000000},
+       {0x0EE, 0x00000200},
+       {0x033, 0x00000000},
+       {0x03F, 0x00000001},
+       {0x033, 0x00000001},
+       {0x03F, 0x00000003},
+       {0x033, 0x00000002},
+       {0x03F, 0x00000005},
+       {0x033, 0x00000003},
+       {0x03F, 0x00000007},
+       {0x0EE, 0x00000000},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000100},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000100},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0xA0000000, 0x00000000},
+       {0x0EC, 0x00000100},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000004},
+       {0x03D, 0x00000078},
+       {0x03E, 0x00080000},
+       {0x03F, 0x00000000},
+       {0x033, 0x00000005},
+       {0x03D, 0x0000007B},
+       {0x03E, 0x00020000},
+       {0x03F, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x0DE, 0x00000000},
+       {0x0EF, 0x00000000},
+       {0x033, 0x00000000},
+       {0x008, 0x00060280},
+       {0x009, 0x00030400},
+       {0x0EF, 0x00000000},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x000001F7},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x000001F7},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0xA0000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x000001F7},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FF},
+       {0xB0000000, 0x00000000},
+       {0x0EF, 0x00000200},
+       {0x033, 0x00000000},
+       {0x03F, 0x0000017F},
+       {0x033, 0x00000001},
+       {0x03F, 0x0000017F},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000017F},
+       {0x033, 0x00000003},
+       {0x03F, 0x0000007F},
+       {0x033, 0x00000004},
+       {0x03F, 0x0000007F},
+       {0x033, 0x00000005},
+       {0x03F, 0x0000007F},
+       {0x033, 0x00000006},
+       {0x03F, 0x0000007F},
+       {0x033, 0x00000007},
+       {0x03F, 0x0000007F},
+       {0x0EF, 0x00000000},
+       {0x06E, 0x00077A18},
+       {0x06F, 0x00077A18},
+       {0x06D, 0x00000C31},
+       {0x0EF, 0x00020000},
+       {0x033, 0x00000000},
+       {0x03F, 0x000005FF},
+       {0x0EF, 0x00000000},
+       {0x005, 0x00000001},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0xA0000000, 0x00000000},
+       {0x094, 0x000001FC},
+       {0xB0000000, 0x00000000},
+       {0x100EE, 0x00002000},
+       {0x10033, 0x00000080},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000081},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000082},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F0},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000083},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000ED},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000084},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000EA},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000085},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000E7},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000086},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000087},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000088},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000063},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000089},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000060},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008A},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000026},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000023},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000020},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008D},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008E},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001A},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008F},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000017},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000090},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000014},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A1},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A2},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F0},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A3},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000ED},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A4},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000EA},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A5},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000E7},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A6},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A7},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A8},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000063},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A9},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000060},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AA},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000026},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AB},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000023},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AC},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000020},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AD},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AE},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001A},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AF},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000017},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000B0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000014},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C1},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C2},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F0},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C3},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000ED},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C4},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000EA},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C5},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000E7},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C6},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C7},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C8},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000063},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C9},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000060},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CA},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000026},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CB},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000023},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CC},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000020},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CD},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CE},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001A},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CF},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000017},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000D0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000014},
+       {0xB0000000, 0x00000000},
+       {0x100EE, 0x00000000},
+       {0x100EE, 0x00004000},
+       {0x10033, 0x00000080},
+       {0x1003F, 0x000001A9},
+       {0x10033, 0x00000081},
+       {0x1003F, 0x000001A3},
+       {0x10033, 0x00000082},
+       {0x1003F, 0x0000019D},
+       {0x10033, 0x00000083},
+       {0x1003F, 0x00000197},
+       {0x10033, 0x00000084},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000191},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000085},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000018B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000086},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000014D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000087},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000010B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000088},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000089},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008A},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000093},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008D},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008E},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000053},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008F},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000090},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000091},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A0},
+       {0x1003F, 0x000001A9},
+       {0x10033, 0x000000A1},
+       {0x1003F, 0x000001A3},
+       {0x10033, 0x000000A2},
+       {0x1003F, 0x0000019D},
+       {0x10033, 0x000000A3},
+       {0x1003F, 0x00000197},
+       {0x10033, 0x000000A4},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000191},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A5},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000018B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A6},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000014D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A7},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000010B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A8},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A9},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AA},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AB},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AC},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000093},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AD},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AE},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000053},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AF},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000B0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000B1},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C0},
+       {0x1003F, 0x000001A9},
+       {0x10033, 0x000000C1},
+       {0x1003F, 0x000001A3},
+       {0x10033, 0x000000C2},
+       {0x1003F, 0x0000019D},
+       {0x10033, 0x000000C3},
+       {0x1003F, 0x00000197},
+       {0x10033, 0x000000C4},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000191},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C5},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000018B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C6},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000014D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C7},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000010B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C8},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C9},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CA},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CB},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CC},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000093},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CD},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CE},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000053},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CF},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000D0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000D1},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xB0000000, 0x00000000},
+       {0x100EE, 0x00000000},
+       {0x100EE, 0x00002000},
+       {0x10033, 0x00000000},
+       {0x1003F, 0x000000F6},
+       {0x10033, 0x00000001},
+       {0x1003F, 0x000000F3},
+       {0x10033, 0x00000002},
+       {0x1003F, 0x000000F0},
+       {0x10033, 0x00000003},
+       {0x1003F, 0x000000ED},
+       {0x10033, 0x00000004},
+       {0x1003F, 0x000000EA},
+       {0x10033, 0x00000005},
+       {0x1003F, 0x000000E7},
+       {0x10033, 0x00000006},
+       {0x1003F, 0x000000A6},
+       {0x10033, 0x00000007},
+       {0x1003F, 0x000000A3},
+       {0x10033, 0x00000008},
+       {0x1003F, 0x00000063},
+       {0x10033, 0x00000009},
+       {0x1003F, 0x00000060},
+       {0x10033, 0x0000000A},
+       {0x1003F, 0x00000023},
+       {0x10033, 0x0000000B},
+       {0x1003F, 0x00000020},
+       {0x10033, 0x0000000C},
+       {0x1003F, 0x0000001D},
+       {0x10033, 0x0000000D},
+       {0x1003F, 0x0000001A},
+       {0x10033, 0x0000000E},
+       {0x1003F, 0x00000017},
+       {0x10033, 0x0000000F},
+       {0x1003F, 0x00000014},
+       {0x10033, 0x00000010},
+       {0x1003F, 0x00000011},
+       {0x100EE, 0x00000000},
+       {0x100EE, 0x00004000},
+       {0x10033, 0x00000000},
+       {0x1003F, 0x000001AF},
+       {0x10033, 0x00000001},
+       {0x1003F, 0x000001A9},
+       {0x10033, 0x00000002},
+       {0x1003F, 0x000001A3},
+       {0x10033, 0x00000003},
+       {0x1003F, 0x0000019D},
+       {0x10033, 0x00000004},
+       {0x1003F, 0x00000197},
+       {0x10033, 0x00000005},
+       {0x1003F, 0x0000015F},
+       {0x10033, 0x00000006},
+       {0x1003F, 0x00000159},
+       {0x10033, 0x00000007},
+       {0x1003F, 0x0000011F},
+       {0x10033, 0x00000008},
+       {0x1003F, 0x00000119},
+       {0x10033, 0x00000009},
+       {0x1003F, 0x000000DF},
+       {0x10033, 0x0000000A},
+       {0x1003F, 0x000000D9},
+       {0x10033, 0x0000000B},
+       {0x1003F, 0x0000009F},
+       {0x10033, 0x0000000C},
+       {0x1003F, 0x00000099},
+       {0x10033, 0x0000000D},
+       {0x1003F, 0x0000005F},
+       {0x10033, 0x0000000E},
+       {0x1003F, 0x00000059},
+       {0x10033, 0x0000000F},
+       {0x1003F, 0x0000001F},
+       {0x10033, 0x00000010},
+       {0x1003F, 0x00000019},
+       {0x10033, 0x00000011},
+       {0x1003F, 0x00000013},
+       {0x100EE, 0x00000000},
+       {0x10005, 0x00000001},
+       {0x09F, 0x00000032},
+};
+
+static const struct rtw89_reg2_def rtw89_8852b_phy_radiob_regs[] = {
+       {0xF0010000, 0x00000000},
+       {0xF0020000, 0x00000001},
+       {0xF0010001, 0x00000002},
+       {0xF0020001, 0x00000003},
+       {0xF0030001, 0x00000004},
+       {0xF0040001, 0x00000005},
+       {0xF0050001, 0x00000006},
+       {0xF0060001, 0x00000007},
+       {0xF0070001, 0x00000008},
+       {0xF0080001, 0x00000009},
+       {0xF0290001, 0x0000000A},
+       {0xF02B0001, 0x0000000B},
+       {0x005, 0x00000000},
+       {0x000, 0x00030000},
+       {0x10000, 0x00030000},
+       {0x018, 0x00011124},
+       {0x10018, 0x00011124},
+       {0x000, 0x00033C00},
+       {0x10000, 0x00033C00},
+       {0x01A, 0x00040004},
+       {0x011, 0x00014073},
+       {0x067, 0x00000070},
+       {0x059, 0x000A0000},
+       {0x066, 0x00000100},
+       {0x05A, 0x0007F000},
+       {0x0A4, 0x0006FF12},
+       {0x043, 0x00005000},
+       {0x0E1, 0x00000001},
+       {0x0DD, 0x000001A0},
+       {0x0CA, 0x00002000},
+       {0x0D3, 0x00000003},
+       {0x0B3, 0x0004EFE0},
+       {0x0B4, 0x0007C03E},
+       {0x0B5, 0x0003A201},
+       {0x0BB, 0x000C7000},
+       {0x0ED, 0x00002000},
+       {0x033, 0x00000002},
+       {0x03D, 0x0004A883},
+       {0x03E, 0x00000000},
+       {0x03F, 0x00000001},
+       {0x033, 0x00000006},
+       {0x03D, 0x0004A883},
+       {0x03E, 0x00000000},
+       {0x03F, 0x00000001},
+       {0x0ED, 0x00000000},
+       {0x018, 0x00001001},
+       {0x10018, 0x00001001},
+       {0x002, 0x0000000D},
+       {0x10002, 0x0000000D},
+       {0x0EE, 0x00000004},
+       {0x033, 0x0000000B},
+       {0x03F, 0x0000000B},
+       {0x033, 0x0000000C},
+       {0x03F, 0x00000012},
+       {0x033, 0x0000000D},
+       {0x03F, 0x00000019},
+       {0x0EE, 0x00000000},
+       {0x08F, 0x000D0F7A},
+       {0x0EF, 0x00080000},
+       {0x033, 0x00000008},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D30},
+       {0xA0000000, 0x00000000},
+       {0x03E, 0x000000C4},
+       {0x03F, 0x000034C0},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000A},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D74},
+       {0xA0000000, 0x00000000},
+       {0x03E, 0x000000C4},
+       {0x03F, 0x000035D0},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D72},
+       {0xA0000000, 0x00000000},
+       {0x03E, 0x000000C4},
+       {0x03F, 0x000035C8},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000008A},
+       {0x03E, 0x00000031},
+       {0x03F, 0x00000D7D},
+       {0x0EF, 0x00000000},
+       {0x08D, 0x000CC800},
+       {0x0EF, 0x00004000},
+       {0x033, 0x00000007},
+       {0x03F, 0x00000700},
+       {0x033, 0x00000006},
+       {0x03F, 0x00000700},
+       {0x033, 0x00000005},
+       {0x03F, 0x00090600},
+       {0x033, 0x00000004},
+       {0x03F, 0x000A3500},
+       {0x033, 0x00000003},
+       {0x03F, 0x000A3400},
+       {0x033, 0x00000002},
+       {0x03F, 0x00008B00},
+       {0x033, 0x00000001},
+       {0x03F, 0x00001B00},
+       {0x033, 0x00000000},
+       {0x03F, 0x00003A00},
+       {0x033, 0x0000000F},
+       {0x03F, 0x00000700},
+       {0x033, 0x0000000E},
+       {0x03F, 0x00000700},
+       {0x033, 0x0000000D},
+       {0x03F, 0x00090600},
+       {0x033, 0x0000000C},
+       {0x03F, 0x000A3500},
+       {0x033, 0x0000000B},
+       {0x03F, 0x000A3400},
+       {0x033, 0x0000000A},
+       {0x03F, 0x00008B00},
+       {0x033, 0x00000009},
+       {0x03F, 0x00001B00},
+       {0x033, 0x00000008},
+       {0x03F, 0x00003A00},
+       {0x033, 0x00000017},
+       {0x03F, 0x00000705},
+       {0x033, 0x00000016},
+       {0x03F, 0x00000705},
+       {0x033, 0x00000015},
+       {0x03F, 0x00090605},
+       {0x033, 0x00000014},
+       {0x03F, 0x000A3505},
+       {0x033, 0x00000013},
+       {0x03F, 0x000A3405},
+       {0x033, 0x00000012},
+       {0x03F, 0x00008B05},
+       {0x033, 0x00000011},
+       {0x03F, 0x00001B05},
+       {0x033, 0x00000010},
+       {0x03F, 0x00003A05},
+       {0x0EF, 0x00000000},
+       {0x0EE, 0x00000010},
+       {0x033, 0x00000006},
+       {0x03F, 0x00000003},
+       {0x033, 0x00000007},
+       {0x03F, 0x00000003},
+       {0x033, 0x00000008},
+       {0x03F, 0x00000001},
+       {0x0EE, 0x00000000},
+       {0x0EF, 0x00001000},
+       {0x033, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x033, 0x00000001},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000002},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000015},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000015},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00000017},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000003},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000007},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000007},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000005},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00000007},
+       {0xB0000000, 0x00000000},
+       {0x0EF, 0x00000000},
+       {0x0EF, 0x00008000},
+       {0x033, 0x00000000},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000001},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000002},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000003},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x00000004},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x00000005},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x00000006},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x033, 0x00000008},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000009},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x0000000A},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x0000000B},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x0000000C},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x0000000D},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x0000000E},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x033, 0x00000010},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000011},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000012},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000013},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x00000014},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x00000015},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x00000016},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x033, 0x00000020},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000021},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000022},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000023},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x00000024},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x00000025},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x00000026},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x033, 0x00000028},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000029},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x0000002A},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x0000002B},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x0000002C},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x0000002D},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x0000002E},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x033, 0x00000030},
+       {0x03E, 0x00004FC0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000031},
+       {0x03E, 0x000046C0},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000032},
+       {0x03E, 0x00004240},
+       {0x03F, 0x00000087},
+       {0x033, 0x00000033},
+       {0x03E, 0x00008010},
+       {0x03F, 0x00000147},
+       {0x033, 0x00000034},
+       {0x03E, 0x0000A048},
+       {0x03F, 0x0000004F},
+       {0x033, 0x00000035},
+       {0x03E, 0x0000A030},
+       {0x03F, 0x0000005F},
+       {0x033, 0x00000036},
+       {0x03E, 0x0000A000},
+       {0x03F, 0x0000009F},
+       {0x0EF, 0x00000000},
+       {0x0EF, 0x00000100},
+       {0x033, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x033, 0x00000001},
+       {0x03F, 0x00004346},
+       {0x033, 0x00000002},
+       {0x03F, 0x00004346},
+       {0x033, 0x00000003},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000004},
+       {0x03F, 0x00004346},
+       {0x033, 0x00000005},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004317},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000006},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000007},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000008},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000009},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004376},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000A},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000D},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x000043A6},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000E},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000F},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000010},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000011},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000012},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000013},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000014},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000015},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000016},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000017},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000020},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000021},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004347},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000022},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00004346},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00004366},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000023},
+       {0x03F, 0x00004386},
+       {0x033, 0x00000024},
+       {0x03F, 0x00004386},
+       {0x033, 0x00000025},
+       {0x03F, 0x00004386},
+       {0x033, 0x00000026},
+       {0x03F, 0x00004386},
+       {0x033, 0x00000027},
+       {0x03F, 0x00004386},
+       {0x0EF, 0x00000000},
+       {0x067, 0x00008072},
+       {0x0EF, 0x00000010},
+       {0x033, 0x00000001},
+       {0x03F, 0x00000ED5},
+       {0x033, 0x00000002},
+       {0x03F, 0x00000FC5},
+       {0x033, 0x00000003},
+       {0x03F, 0x00000A93},
+       {0x033, 0x00000004},
+       {0x03F, 0x00000973},
+       {0x033, 0x00000005},
+       {0x03F, 0x00000761},
+       {0x033, 0x00000006},
+       {0x03F, 0x00000761},
+       {0x0EF, 0x00000000},
+       {0x0EF, 0x00000080},
+       {0x033, 0x00000000},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000001},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000002},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000003},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000004},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000005},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000006},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000007},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000008},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000009},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000A},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000B},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000C},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000D},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000E},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000F},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000010},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000011},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000012},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000013},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020758},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000014},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000015},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000016},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000017},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000018},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000019},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001A},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001B},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001C},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001D},
+       {0x03E, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001E},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000001F},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000020},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000021},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000022},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000023},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000024},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000025},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000026},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000027},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000028},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000029},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002A},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002B},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002C},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002D},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002E},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000002F},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000030},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000031},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000032},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000033},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000034},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000035},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000036},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000037},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000038},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000039},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022658},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00026458},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000003A},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00022858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000003B},
+       {0x03E, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00020858},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00027558},
+       {0xB0000000, 0x00000000},
+       {0x0EF, 0x00000000},
+       {0x0EE, 0x00000800},
+       {0x033, 0x00000000},
+       {0x03F, 0x00000001},
+       {0x033, 0x00000001},
+       {0x03F, 0x00000003},
+       {0x033, 0x00000002},
+       {0x03F, 0x00000005},
+       {0x033, 0x00000003},
+       {0x03F, 0x00000007},
+       {0x033, 0x00000004},
+       {0x03F, 0x00000001},
+       {0x033, 0x00000005},
+       {0x03F, 0x00000003},
+       {0x033, 0x00000006},
+       {0x03F, 0x00000006},
+       {0x033, 0x00000007},
+       {0x03F, 0x00000007},
+       {0x0EE, 0x00000000},
+       {0x0EE, 0x00001000},
+       {0x033, 0x00000000},
+       {0x03F, 0x00003000},
+       {0x033, 0x00000001},
+       {0x03F, 0x00003001},
+       {0x033, 0x00000002},
+       {0x03F, 0x00003003},
+       {0x033, 0x00000003},
+       {0x03F, 0x00003007},
+       {0x033, 0x00000004},
+       {0x03F, 0x0000300F},
+       {0x033, 0x00000005},
+       {0x03F, 0x0000310F},
+       {0x033, 0x00000006},
+       {0x03F, 0x0000330F},
+       {0x033, 0x00000007},
+       {0x03F, 0x0000330F},
+       {0x033, 0x00000008},
+       {0x03F, 0x00003000},
+       {0x033, 0x00000009},
+       {0x03F, 0x00003001},
+       {0x033, 0x0000000A},
+       {0x03F, 0x00003003},
+       {0x033, 0x0000000B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003007},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00003103},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003107},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000D},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00003307},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00002307},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000E},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00001307},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x0000000F},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0xA0000000, 0x00000000},
+       {0x03F, 0x00000307},
+       {0xB0000000, 0x00000000},
+       {0x0EE, 0x00000000},
+       {0x0EE, 0x00000200},
+       {0x033, 0x00000000},
+       {0x03F, 0x00000001},
+       {0x033, 0x00000001},
+       {0x03F, 0x00000003},
+       {0x033, 0x00000002},
+       {0x03F, 0x00000005},
+       {0x033, 0x00000003},
+       {0x03F, 0x00000007},
+       {0x0EE, 0x00000000},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000100},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000100},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0xA0000000, 0x00000000},
+       {0x0EC, 0x00000100},
+       {0xB0000000, 0x00000000},
+       {0x033, 0x00000004},
+       {0x03D, 0x00000078},
+       {0x03E, 0x00080000},
+       {0x03F, 0x00000000},
+       {0x033, 0x00000005},
+       {0x03D, 0x0000007B},
+       {0x03E, 0x00020000},
+       {0x03F, 0x00000000},
+       {0x0EC, 0x00000000},
+       {0x0DE, 0x00000000},
+       {0x0EF, 0x00000000},
+       {0x033, 0x00000000},
+       {0x008, 0x00060280},
+       {0x009, 0x00030400},
+       {0x0EF, 0x00000000},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x000001F7},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x000001F7},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000013F},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FB},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FB},
+       {0xA0000000, 0x00000000},
+       {0x0EF, 0x00000400},
+       {0x033, 0x00000000},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000001},
+       {0x03F, 0x000001FF},
+       {0x033, 0x00000002},
+       {0x03F, 0x000001F7},
+       {0x033, 0x00000003},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000004},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000005},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000006},
+       {0x03F, 0x000000FF},
+       {0x033, 0x00000007},
+       {0x03F, 0x000000FF},
+       {0xB0000000, 0x00000000},
+       {0x0EF, 0x00000200},
+       {0x033, 0x00000000},
+       {0x03F, 0x0000017F},
+       {0x033, 0x00000001},
+       {0x03F, 0x0000017F},
+       {0x033, 0x00000002},
+       {0x03F, 0x0000017F},
+       {0x033, 0x00000003},
+       {0x03F, 0x0000007F},
+       {0x033, 0x00000004},
+       {0x03F, 0x0000007F},
+       {0x033, 0x00000005},
+       {0x03F, 0x0000007F},
+       {0x033, 0x00000006},
+       {0x03F, 0x0000007F},
+       {0x033, 0x00000007},
+       {0x03F, 0x0000007F},
+       {0x0EF, 0x00000000},
+       {0x06E, 0x00077A18},
+       {0x06F, 0x00077A18},
+       {0x06D, 0x00000C31},
+       {0x0EF, 0x00020000},
+       {0x033, 0x00000000},
+       {0x03F, 0x000005FF},
+       {0x0EF, 0x00000000},
+       {0x005, 0x00000001},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x094, 0x000000FC},
+       {0xA0000000, 0x00000000},
+       {0x094, 0x000001FC},
+       {0xB0000000, 0x00000000},
+       {0x100EE, 0x00002000},
+       {0x10033, 0x00000080},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000081},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000082},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F0},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000083},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000ED},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000084},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000EA},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000085},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000E7},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000086},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000087},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000088},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000063},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000089},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000060},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008A},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000026},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000023},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000020},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008D},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008E},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001A},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008F},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000017},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000090},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000014},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A1},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A2},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F0},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A3},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000ED},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A4},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000EA},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A5},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000E7},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A6},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A7},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A8},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000063},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A9},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000060},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AA},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000026},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AB},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000023},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AC},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000020},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AD},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AE},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001A},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AF},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000017},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000B0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000014},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000FB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C1},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C2},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F5},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000F0},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C3},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000F2},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000ED},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C4},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000EA},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C5},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000EC},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000E7},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C6},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000AB},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A6},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C7},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000A8},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000A3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C8},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000068},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000063},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C9},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000065},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000060},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CA},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000002B},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000026},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CB},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000028},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000023},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CC},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000025},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000020},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CD},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000022},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CE},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000001A},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CF},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001C},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000017},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000D0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000014},
+       {0xB0000000, 0x00000000},
+       {0x100EE, 0x00000000},
+       {0x100EE, 0x00004000},
+       {0x10033, 0x00000080},
+       {0x1003F, 0x000001A9},
+       {0x10033, 0x00000081},
+       {0x1003F, 0x000001A3},
+       {0x10033, 0x00000082},
+       {0x1003F, 0x0000019D},
+       {0x10033, 0x00000083},
+       {0x1003F, 0x00000197},
+       {0x10033, 0x00000084},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000191},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000085},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000018B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000086},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000014D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000087},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000010B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000088},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000089},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008A},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008B},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008C},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000093},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008D},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008E},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000053},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x0000008F},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000090},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x00000091},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A0},
+       {0x1003F, 0x000001A9},
+       {0x10033, 0x000000A1},
+       {0x1003F, 0x000001A3},
+       {0x10033, 0x000000A2},
+       {0x1003F, 0x0000019D},
+       {0x10033, 0x000000A3},
+       {0x1003F, 0x00000197},
+       {0x10033, 0x000000A4},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000191},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A5},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000018B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A6},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000014D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A7},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000010B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A8},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000A9},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AA},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AB},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AC},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000093},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AD},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AE},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000053},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000AF},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000B0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000B1},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C0},
+       {0x1003F, 0x000001A9},
+       {0x10033, 0x000000C1},
+       {0x1003F, 0x000001A3},
+       {0x10033, 0x000000C2},
+       {0x1003F, 0x0000019D},
+       {0x10033, 0x000000C3},
+       {0x1003F, 0x00000197},
+       {0x10033, 0x000000C4},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000158},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000191},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C5},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000011F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000018B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C6},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000119},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000014D},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C7},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000010B},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C8},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000DF},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000C9},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000009F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D9},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CA},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x000000D3},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CB},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000005F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000099},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CC},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000093},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CD},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000001F},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000059},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CE},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000053},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000CF},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000019},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000D0},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x00000013},
+       {0xB0000000, 0x00000000},
+       {0x10033, 0x000000D1},
+       {0x80010000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90010001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90020001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90030001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90040001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90050001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90060001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90070001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90080001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x90290001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0x902b0001, 0x00000000}, {0x40000000, 0x00000000},
+       {0x1003F, 0x00000007},
+       {0xA0000000, 0x00000000},
+       {0x1003F, 0x0000000D},
+       {0xB0000000, 0x00000000},
+       {0x100EE, 0x00000000},
+       {0x100EE, 0x00002000},
+       {0x10033, 0x00000000},
+       {0x1003F, 0x000000F6},
+       {0x10033, 0x00000001},
+       {0x1003F, 0x000000F3},
+       {0x10033, 0x00000002},
+       {0x1003F, 0x000000F0},
+       {0x10033, 0x00000003},
+       {0x1003F, 0x000000ED},
+       {0x10033, 0x00000004},
+       {0x1003F, 0x000000EA},
+       {0x10033, 0x00000005},
+       {0x1003F, 0x000000E7},
+       {0x10033, 0x00000006},
+       {0x1003F, 0x000000A6},
+       {0x10033, 0x00000007},
+       {0x1003F, 0x000000A3},
+       {0x10033, 0x00000008},
+       {0x1003F, 0x00000063},
+       {0x10033, 0x00000009},
+       {0x1003F, 0x00000060},
+       {0x10033, 0x0000000A},
+       {0x1003F, 0x00000023},
+       {0x10033, 0x0000000B},
+       {0x1003F, 0x00000020},
+       {0x10033, 0x0000000C},
+       {0x1003F, 0x0000001D},
+       {0x10033, 0x0000000D},
+       {0x1003F, 0x0000001A},
+       {0x10033, 0x0000000E},
+       {0x1003F, 0x00000017},
+       {0x10033, 0x0000000F},
+       {0x1003F, 0x00000014},
+       {0x10033, 0x00000010},
+       {0x1003F, 0x00000011},
+       {0x100EE, 0x00000000},
+       {0x100EE, 0x00004000},
+       {0x10033, 0x00000000},
+       {0x1003F, 0x000001AF},
+       {0x10033, 0x00000001},
+       {0x1003F, 0x000001A9},
+       {0x10033, 0x00000002},
+       {0x1003F, 0x000001A3},
+       {0x10033, 0x00000003},
+       {0x1003F, 0x0000019D},
+       {0x10033, 0x00000004},
+       {0x1003F, 0x00000197},
+       {0x10033, 0x00000005},
+       {0x1003F, 0x0000015F},
+       {0x10033, 0x00000006},
+       {0x1003F, 0x00000159},
+       {0x10033, 0x00000007},
+       {0x1003F, 0x0000011F},
+       {0x10033, 0x00000008},
+       {0x1003F, 0x00000119},
+       {0x10033, 0x00000009},
+       {0x1003F, 0x000000DF},
+       {0x10033, 0x0000000A},
+       {0x1003F, 0x000000D9},
+       {0x10033, 0x0000000B},
+       {0x1003F, 0x0000009F},
+       {0x10033, 0x0000000C},
+       {0x1003F, 0x00000099},
+       {0x10033, 0x0000000D},
+       {0x1003F, 0x0000005F},
+       {0x10033, 0x0000000E},
+       {0x1003F, 0x00000059},
+       {0x10033, 0x0000000F},
+       {0x1003F, 0x0000001F},
+       {0x10033, 0x00000010},
+       {0x1003F, 0x00000019},
+       {0x10033, 0x00000011},
+       {0x1003F, 0x00000013},
+       {0x100EE, 0x00000000},
+       {0x10005, 0x00000001},
+       {0x09F, 0x00000032},
+};
+
+static const struct rtw89_reg2_def rtw89_8852b_phy_nctl_regs[] = {
+       {0x8000, 0x00000008},
+       {0x8008, 0x00000000},
+       {0x8004, 0xf0862966},
+       {0x800c, 0x78000000},
+       {0x8010, 0x88015000},
+       {0x8014, 0x80010100},
+       {0x8018, 0x10010100},
+       {0x801c, 0xa210bc00},
+       {0x8020, 0x000403e0},
+       {0x8024, 0x00072160},
+       {0x8028, 0x00180e00},
+       {0x8030, 0x400000c0},
+       {0x8034, 0x11000830},
+       {0x8038, 0x00000009},
+       {0x803c, 0x00000008},
+       {0x8040, 0x00000046},
+       {0x8044, 0x0010001f},
+       {0x8048, 0xf0000003},
+       {0x804c, 0x62ac6162},
+       {0x8050, 0xf2acf162},
+       {0x8054, 0x62ac6162},
+       {0x8058, 0xf2acf162},
+       {0x805c, 0x150c0b02},
+       {0x8060, 0x150c0b02},
+       {0x8064, 0x2aa00047},
+       {0x8074, 0x80000000},
+       {0x807c, 0x000000ee},
+       {0x8088, 0x80000000},
+       {0x8098, 0x0000ff00},
+       {0x809c, 0x0000001f},
+       {0x80a0, 0x00010300},
+       {0x80b8, 0x00001000},
+       {0x80b0, 0x00000000},
+       {0x80d0, 0x00000000},
+       {0x80ec, 0x00000002},
+       {0x810c, 0x33112200},
+       {0x8110, 0x33112200},
+       {0x8114, 0x00000000},
+       {0x8120, 0x10010000},
+       {0x8124, 0x00000000},
+       {0x812c, 0x0000c000},
+       {0x8138, 0x40000000},
+       {0x813c, 0x40000000},
+       {0x8140, 0x00000000},
+       {0x8144, 0x0b040b03},
+       {0x8148, 0x0a050b04},
+       {0x814c, 0x0a050b04},
+       {0x8150, 0xe4e40000},
+       {0x8158, 0xffffffff},
+       {0x815c, 0xffffffff},
+       {0x8160, 0xffffffff},
+       {0x8164, 0xffffffff},
+       {0x8168, 0xffffffff},
+       {0x816c, 0x1fffffff},
+       {0x81a0, 0x00000000},
+       {0x81ac, 0x003f2e2e},
+       {0x81b0, 0x003f2e2e},
+       {0x81bc, 0x005b5b5b},
+       {0x81c0, 0x005b5b5b},
+       {0x81b4, 0x00600060},
+       {0x81b8, 0x00600060},
+       {0x81cc, 0x00000000},
+       {0x81dc, 0x00000002},
+       {0x81e0, 0x00000000},
+       {0x81e4, 0x00000001},
+       {0x820c, 0x33112200},
+       {0x8210, 0x33112200},
+       {0x8214, 0x00000000},
+       {0x8220, 0x10010000},
+       {0x8224, 0x00000000},
+       {0x822c, 0x0000d000},
+       {0x8238, 0x40000000},
+       {0x823c, 0x40000000},
+       {0x8240, 0x00000000},
+       {0x8244, 0x0b040b03},
+       {0x8248, 0x0a050b04},
+       {0x824c, 0x0a050b04},
+       {0x8250, 0xe4e40000},
+       {0x8258, 0xffffffff},
+       {0x825c, 0xffffffff},
+       {0x8260, 0xffffffff},
+       {0x8264, 0xffffffff},
+       {0x8268, 0xffffffff},
+       {0x826c, 0x1fffffff},
+       {0x82a0, 0x00000000},
+       {0x82ac, 0x003f2e2e},
+       {0x82b0, 0x003f2e2e},
+       {0x82bc, 0x005b5b5b},
+       {0x82c0, 0x005b5b5b},
+       {0x82b4, 0x00600060},
+       {0x82b8, 0x00600060},
+       {0x82cc, 0x00000000},
+       {0x82dc, 0x00000002},
+       {0x82e0, 0x00100000},
+       {0x82e4, 0x00000001},
+       {0x81d8, 0x00000001},
+       {0x82d8, 0x00000001},
+       {0x8d00, 0x00000000},
+       {0x8d04, 0x00000000},
+       {0x8d08, 0x00000000},
+       {0x8d0c, 0x00000000},
+       {0x8d10, 0x00000000},
+       {0x8d14, 0x00000000},
+       {0x8d18, 0x00000000},
+       {0x8d1c, 0x00000000},
+       {0x8d20, 0x00000000},
+       {0x8d24, 0x00000000},
+       {0x8d28, 0x00000000},
+       {0x8d2c, 0x00000000},
+       {0x8d30, 0x00000000},
+       {0x8d34, 0x00000000},
+       {0x8d38, 0x00000000},
+       {0x8d3c, 0x00000000},
+       {0x8d40, 0x00000000},
+       {0x8d44, 0x00000000},
+       {0x8d48, 0x00000000},
+       {0x8d4c, 0x00000000},
+       {0x8d50, 0x00000000},
+       {0x8d54, 0x00000000},
+       {0x8d58, 0x00000000},
+       {0x8d5c, 0x00000000},
+       {0x8d60, 0x00000000},
+       {0x8d64, 0x00000000},
+       {0x8d68, 0x00000000},
+       {0x8d6c, 0x00000000},
+       {0x8d70, 0x00000000},
+       {0x8d74, 0x00000000},
+       {0x8d78, 0x00000000},
+       {0x8d7c, 0x00000000},
+       {0x8d80, 0x00000000},
+       {0x8d84, 0x00000000},
+       {0x8d88, 0x00000000},
+       {0x8d8c, 0x00000000},
+       {0x8d90, 0x00000000},
+       {0x8d94, 0x00000000},
+       {0x8d98, 0x00000000},
+       {0x8d9c, 0x00000000},
+       {0x8da0, 0x00000000},
+       {0x8da4, 0x00000000},
+       {0x8da8, 0x00000000},
+       {0x8dac, 0x00000000},
+       {0x8db0, 0x00000000},
+       {0x8db4, 0x00000000},
+       {0x8db8, 0x00000000},
+       {0x8dbc, 0x00000000},
+       {0x8dc0, 0x00000000},
+       {0x8dc4, 0x00000000},
+       {0x8dc8, 0x00000000},
+       {0x8dcc, 0x00000000},
+       {0x8dd0, 0x00000000},
+       {0x8dd4, 0x00000000},
+       {0x8dd8, 0x00000000},
+       {0x8ddc, 0x00000000},
+       {0x8de0, 0x00000000},
+       {0x8de4, 0x00000000},
+       {0x8de8, 0x00000000},
+       {0x8dec, 0x00000000},
+       {0x8df0, 0x00000000},
+       {0x8df4, 0x00000000},
+       {0x8df8, 0x00000000},
+       {0x8dfc, 0x00000000},
+       {0x8e00, 0x00000000},
+       {0x8e04, 0x00000000},
+       {0x8e08, 0x00000000},
+       {0x8e0c, 0x00000000},
+       {0x8e10, 0x00000000},
+       {0x8e14, 0x00000000},
+       {0x8e18, 0x00000000},
+       {0x8e1c, 0x00000000},
+       {0x8e20, 0x00000000},
+       {0x8e24, 0x00000000},
+       {0x8e28, 0x00000000},
+       {0x8e2c, 0x00000000},
+       {0x8e30, 0x00000000},
+       {0x8e34, 0x00000000},
+       {0x8e38, 0x00000000},
+       {0x8e3c, 0x00000000},
+       {0x8e40, 0x00000000},
+       {0x8e44, 0x00000000},
+       {0x8e48, 0x00000000},
+       {0x8e4c, 0x00000000},
+       {0x8e50, 0x00000000},
+       {0x8e54, 0x00000000},
+       {0x8e58, 0x00000000},
+       {0x8e5c, 0x00000000},
+       {0x8e60, 0x00000000},
+       {0x8e64, 0x00000000},
+       {0x8e68, 0x00000000},
+       {0x8e6c, 0x00000000},
+       {0x8e70, 0x00000000},
+       {0x8e74, 0x00000000},
+       {0x8e78, 0x00000000},
+       {0x8e7c, 0x00000000},
+       {0x8e80, 0x00000000},
+       {0x8e84, 0x00000000},
+       {0x8e88, 0x00000000},
+       {0x8e8c, 0x00000000},
+       {0x8e90, 0x00000000},
+       {0x8e94, 0x00000000},
+       {0x8e98, 0x00000000},
+       {0x8e9c, 0x00000000},
+       {0x8ea0, 0x00000000},
+       {0x8ea4, 0x00000000},
+       {0x8ea8, 0x00000000},
+       {0x8eac, 0x00000000},
+       {0x8eb0, 0x00000000},
+       {0x8eb4, 0x00000000},
+       {0x8eb8, 0x00000000},
+       {0x8ebc, 0x00000000},
+       {0x8ec0, 0x00000000},
+       {0x8ec4, 0x00000000},
+       {0x8ec8, 0x00000000},
+       {0x8ecc, 0x00000000},
+       {0x8ed0, 0x00000000},
+       {0x8ed4, 0x00000000},
+       {0x8ed8, 0x00000000},
+       {0x8edc, 0x00000000},
+       {0x8ee0, 0x00000000},
+       {0x8ee4, 0x00000000},
+       {0x8ee8, 0x00000000},
+       {0x8eec, 0x00000000},
+       {0x8ef0, 0x00000000},
+       {0x8ef4, 0x00000000},
+       {0x8ef8, 0x00000000},
+       {0x8efc, 0x00000000},
+       {0x8f00, 0x00000000},
+       {0x8f04, 0x00000000},
+       {0x8f08, 0x00000000},
+       {0x8f0c, 0x00000000},
+       {0x8f10, 0x00000000},
+       {0x8f14, 0x00000000},
+       {0x8f18, 0x00000000},
+       {0x8f1c, 0x00000000},
+       {0x8f20, 0x00000000},
+       {0x8f24, 0x00000000},
+       {0x8f28, 0x00000000},
+       {0x8f2c, 0x00000000},
+       {0x8f30, 0x00000000},
+       {0x8f34, 0x00000000},
+       {0x8f38, 0x00000000},
+       {0x8f3c, 0x00000000},
+       {0x8f40, 0x00000000},
+       {0x8f44, 0x00000000},
+       {0x8f48, 0x00000000},
+       {0x8f4c, 0x00000000},
+       {0x8f50, 0x00000000},
+       {0x8f54, 0x00000000},
+       {0x8f58, 0x00000000},
+       {0x8f5c, 0x00000000},
+       {0x8f60, 0x00000000},
+       {0x8f64, 0x00000000},
+       {0x8f68, 0x00000000},
+       {0x8f6c, 0x00000000},
+       {0x8f70, 0x00000000},
+       {0x8f74, 0x00000000},
+       {0x8f78, 0x00000000},
+       {0x8f7c, 0x00000000},
+       {0x8f80, 0x00000000},
+       {0x8f84, 0x00000000},
+       {0x8f88, 0x00000000},
+       {0x8f8c, 0x00000000},
+       {0x8f90, 0x00000000},
+       {0x8f94, 0x00000000},
+       {0x8f98, 0x00000000},
+       {0x8f9c, 0x00000000},
+       {0x8fa0, 0x00000000},
+       {0x8fa4, 0x00000000},
+       {0x8fa8, 0x00000000},
+       {0x8fac, 0x00000000},
+       {0x8fb0, 0x00000000},
+       {0x8fb4, 0x00000000},
+       {0x8fb8, 0x00000000},
+       {0x8fbc, 0x00000000},
+       {0x8fc0, 0x00000000},
+       {0x8fc4, 0x00000000},
+       {0x8fc8, 0x00000000},
+       {0x8fcc, 0x00000000},
+       {0x8fd0, 0x00000000},
+       {0x8fd4, 0x00000000},
+       {0x8fd8, 0x00000000},
+       {0x8fdc, 0x00000000},
+       {0x8fe0, 0x00000000},
+       {0x8fe4, 0x00000000},
+       {0x8fe8, 0x00000000},
+       {0x8fec, 0x00000000},
+       {0x8ff0, 0x00000000},
+       {0x8ff4, 0x00000000},
+       {0x8ff8, 0x00000000},
+       {0x8ffc, 0x00000000},
+       {0x9000, 0x00000000},
+       {0x9004, 0x00000000},
+       {0x9008, 0x00000000},
+       {0x900c, 0x00000000},
+       {0x9010, 0x00000000},
+       {0x9014, 0x00000000},
+       {0x9018, 0x00000000},
+       {0x901c, 0x00000000},
+       {0x9020, 0x00000000},
+       {0x9024, 0x00000000},
+       {0x9028, 0x00000000},
+       {0x902c, 0x00000000},
+       {0x9030, 0x00000000},
+       {0x9034, 0x00000000},
+       {0x9038, 0x00000000},
+       {0x903c, 0x00000000},
+       {0x9040, 0x00000000},
+       {0x9044, 0x00000000},
+       {0x9048, 0x00000000},
+       {0x904c, 0x00000000},
+       {0x9050, 0x00000000},
+       {0x9054, 0x00000000},
+       {0x9058, 0x00000000},
+       {0x905c, 0x00000000},
+       {0x9060, 0x00000000},
+       {0x9064, 0x00000000},
+       {0x9068, 0x00000000},
+       {0x906c, 0x00000000},
+       {0x9070, 0x00000000},
+       {0x9074, 0x00000000},
+       {0x9078, 0x00000000},
+       {0x907c, 0x00000000},
+       {0x9080, 0x00000000},
+       {0x9084, 0x00000000},
+       {0x9088, 0x00000000},
+       {0x908c, 0x00000000},
+       {0x9090, 0x00000000},
+       {0x9094, 0x00000000},
+       {0x9098, 0x00000000},
+       {0x909c, 0x00000000},
+       {0x90a0, 0x00000000},
+       {0x90a4, 0x00000000},
+       {0x90a8, 0x00000000},
+       {0x90ac, 0x00000000},
+       {0x90b0, 0x00000000},
+       {0x90b4, 0x00000000},
+       {0x90b8, 0x00000000},
+       {0x90bc, 0x00000000},
+       {0x9100, 0x00000000},
+       {0x9104, 0x00000000},
+       {0x9108, 0x00000000},
+       {0x910c, 0x00000000},
+       {0x9110, 0x00000000},
+       {0x9114, 0x00000000},
+       {0x9118, 0x00000000},
+       {0x911c, 0x00000000},
+       {0x9120, 0x00000000},
+       {0x9124, 0x00000000},
+       {0x9128, 0x00000000},
+       {0x912c, 0x00000000},
+       {0x9130, 0x00000000},
+       {0x9134, 0x00000000},
+       {0x9138, 0x00000000},
+       {0x913c, 0x00000000},
+       {0x9140, 0x00000000},
+       {0x9144, 0x00000000},
+       {0x9148, 0x00000000},
+       {0x914c, 0x00000000},
+       {0x9150, 0x00000000},
+       {0x9154, 0x00000000},
+       {0x9158, 0x00000000},
+       {0x915c, 0x00000000},
+       {0x9160, 0x00000000},
+       {0x9164, 0x00000000},
+       {0x9168, 0x00000000},
+       {0x916c, 0x00000000},
+       {0x9170, 0x00000000},
+       {0x9174, 0x00000000},
+       {0x9178, 0x00000000},
+       {0x917c, 0x00000000},
+       {0x9180, 0x00000000},
+       {0x9184, 0x00000000},
+       {0x9188, 0x00000000},
+       {0x918c, 0x00000000},
+       {0x9190, 0x00000000},
+       {0x9194, 0x00000000},
+       {0x9198, 0x00000000},
+       {0x919c, 0x00000000},
+       {0x91a0, 0x00000000},
+       {0x91a4, 0x00000000},
+       {0x91a8, 0x00000000},
+       {0x91ac, 0x00000000},
+       {0x91b0, 0x00000000},
+       {0x91b4, 0x00000000},
+       {0x91b8, 0x00000000},
+       {0x91bc, 0x00000000},
+       {0x91c0, 0x00000000},
+       {0x91c4, 0x00000000},
+       {0x91c8, 0x00000000},
+       {0x91cc, 0x00000000},
+       {0x91d0, 0x00000000},
+       {0x91d4, 0x00000000},
+       {0x91d8, 0x00000000},
+       {0x91dc, 0x00000000},
+       {0x91e0, 0x00000000},
+       {0x91e4, 0x00000000},
+       {0x91e8, 0x00000000},
+       {0x91ec, 0x00000000},
+       {0x91f0, 0x00000000},
+       {0x91f4, 0x00000000},
+       {0x91f8, 0x00000000},
+       {0x91fc, 0x00000000},
+       {0x9200, 0x00000000},
+       {0x9204, 0x00000000},
+       {0x9208, 0x00000000},
+       {0x920c, 0x00000000},
+       {0x9210, 0x00000000},
+       {0x9214, 0x00000000},
+       {0x9218, 0x00000000},
+       {0x921c, 0x00000000},
+       {0x9220, 0x00000000},
+       {0x9224, 0x00000000},
+       {0x9228, 0x00000000},
+       {0x922c, 0x00000000},
+       {0x9230, 0x00000000},
+       {0x9234, 0x00000000},
+       {0x9238, 0x00000000},
+       {0x923c, 0x00000000},
+       {0x9240, 0x00000000},
+       {0x9244, 0x00000000},
+       {0x9248, 0x00000000},
+       {0x924c, 0x00000000},
+       {0x9250, 0x00000000},
+       {0x9254, 0x00000000},
+       {0x9258, 0x00000000},
+       {0x925c, 0x00000000},
+       {0x9260, 0x00000000},
+       {0x9264, 0x00000000},
+       {0x9268, 0x00000000},
+       {0x926c, 0x00000000},
+       {0x9270, 0x00000000},
+       {0x9274, 0x00000000},
+       {0x9278, 0x00000000},
+       {0x927c, 0x00000000},
+       {0x9280, 0x00000000},
+       {0x9284, 0x00000000},
+       {0x9288, 0x00000000},
+       {0x928c, 0x00000000},
+       {0x9290, 0x00000000},
+       {0x9294, 0x00000000},
+       {0x9298, 0x00000000},
+       {0x929c, 0x00000000},
+       {0x92a0, 0x00000000},
+       {0x92a4, 0x00000000},
+       {0x92a8, 0x00000000},
+       {0x92ac, 0x00000000},
+       {0x92b0, 0x00000000},
+       {0x92b4, 0x00000000},
+       {0x92b8, 0x00000000},
+       {0x92bc, 0x00000000},
+       {0x92c0, 0x00000000},
+       {0x92c4, 0x00000000},
+       {0x92c8, 0x00000000},
+       {0x92cc, 0x00000000},
+       {0x92d0, 0x00000000},
+       {0x92d4, 0x00000000},
+       {0x92d8, 0x00000000},
+       {0x92dc, 0x00000000},
+       {0x92e0, 0x00000000},
+       {0x92e4, 0x00000000},
+       {0x92e8, 0x00000000},
+       {0x92ec, 0x00000000},
+       {0x92f0, 0x00000000},
+       {0x92f4, 0x00000000},
+       {0x92f8, 0x00000000},
+       {0x92fc, 0x00000000},
+       {0x9300, 0x00000000},
+       {0x9304, 0x00000000},
+       {0x9308, 0x00000000},
+       {0x930c, 0x00000000},
+       {0x9310, 0x00000000},
+       {0x9314, 0x00000000},
+       {0x9318, 0x00000000},
+       {0x931c, 0x00000000},
+       {0x9320, 0x00000000},
+       {0x9324, 0x00000000},
+       {0x9328, 0x00000000},
+       {0x932c, 0x00000000},
+       {0x9330, 0x00000000},
+       {0x9334, 0x00000000},
+       {0x9338, 0x00000000},
+       {0x933c, 0x00000000},
+       {0x9340, 0x00000000},
+       {0x9344, 0x00000000},
+       {0x9348, 0x00000000},
+       {0x934c, 0x00000000},
+       {0x9350, 0x00000000},
+       {0x9354, 0x00000000},
+       {0x9358, 0x00000000},
+       {0x935c, 0x00000000},
+       {0x9360, 0x00000000},
+       {0x9364, 0x00000000},
+       {0x9368, 0x00000000},
+       {0x936c, 0x00000000},
+       {0x9370, 0x00000000},
+       {0x9374, 0x00000000},
+       {0x9378, 0x00000000},
+       {0x937c, 0x00000000},
+       {0x9380, 0x00000000},
+       {0x9384, 0x00000000},
+       {0x9388, 0x00000000},
+       {0x938c, 0x00000000},
+       {0x9390, 0x00000000},
+       {0x9394, 0x00000000},
+       {0x9398, 0x00000000},
+       {0x939c, 0x00000000},
+       {0x93a0, 0x00000000},
+       {0x93a4, 0x00000000},
+       {0x93a8, 0x00000000},
+       {0x93ac, 0x00000000},
+       {0x93b0, 0x00000000},
+       {0x93b4, 0x00000000},
+       {0x93b8, 0x00000000},
+       {0x93bc, 0x00000000},
+       {0x93c0, 0x00000000},
+       {0x93c4, 0x00000000},
+       {0x93c8, 0x00000000},
+       {0x93cc, 0x00000000},
+       {0x93d0, 0x00000000},
+       {0x93d4, 0x00000000},
+       {0x93d8, 0x00000000},
+       {0x93dc, 0x00000000},
+       {0x93e0, 0x00000000},
+       {0x93e4, 0x00000000},
+       {0x93e8, 0x00000000},
+       {0x93ec, 0x00000000},
+       {0x93f0, 0x00000000},
+       {0x93f4, 0x00000000},
+       {0x93f8, 0x00000000},
+       {0x93fc, 0x00000000},
+       {0x9400, 0x00000000},
+       {0x9404, 0x00000000},
+       {0x9408, 0x00000000},
+       {0x940c, 0x00000000},
+       {0x9410, 0x00000000},
+       {0x9414, 0x00000000},
+       {0x9418, 0x00000000},
+       {0x941c, 0x00000000},
+       {0x9420, 0x00000000},
+       {0x9424, 0x00000000},
+       {0x9428, 0x00000000},
+       {0x942c, 0x00000000},
+       {0x9430, 0x00000000},
+       {0x9434, 0x00000000},
+       {0x9438, 0x00000000},
+       {0x943c, 0x00000000},
+       {0x9440, 0x00000000},
+       {0x9444, 0x00000000},
+       {0x9448, 0x00000000},
+       {0x944c, 0x00000000},
+       {0x9450, 0x00000000},
+       {0x9454, 0x00000000},
+       {0x9458, 0x00000000},
+       {0x945c, 0x00000000},
+       {0x9460, 0x00000000},
+       {0x9464, 0x00000000},
+       {0x9468, 0x00000000},
+       {0x946c, 0x00000000},
+       {0x9470, 0x00000000},
+       {0x9474, 0x00000000},
+       {0x9478, 0x00000000},
+       {0x947c, 0x00000000},
+       {0x9480, 0x00000000},
+       {0x9484, 0x00000000},
+       {0x9488, 0x00000000},
+       {0x948c, 0x00000000},
+       {0x9490, 0x00000000},
+       {0x9494, 0x00000000},
+       {0x9498, 0x00000000},
+       {0x949c, 0x00000000},
+       {0x94a0, 0x00000000},
+       {0x94a4, 0x00000000},
+       {0x94a8, 0x00000000},
+       {0x94ac, 0x00000000},
+       {0x94b0, 0x00000000},
+       {0x94b4, 0x00000000},
+       {0x94b8, 0x00000000},
+       {0x94bc, 0x00000000},
+       {0xa220, 0x00000000},
+       {0xa224, 0x00000000},
+       {0xa228, 0x00000000},
+       {0xa22c, 0x00000000},
+       {0xa230, 0x00000000},
+       {0xa234, 0x00000000},
+       {0xa238, 0x00000000},
+       {0xa23c, 0x00000000},
+       {0xa240, 0x00000000},
+       {0xa244, 0x00000000},
+       {0xa248, 0x00000000},
+       {0xa24c, 0x00000000},
+       {0xa250, 0x00000000},
+       {0xa254, 0x00000000},
+       {0xa258, 0x00000000},
+       {0xa25c, 0x00000000},
+       {0xa260, 0x00000000},
+       {0xa264, 0x00000000},
+       {0xa268, 0x00000000},
+       {0xa26c, 0x00000000},
+       {0xa270, 0x00000000},
+       {0xa274, 0x00000000},
+       {0xa278, 0x00000000},
+       {0xa27c, 0x00000000},
+       {0xa280, 0x00000000},
+       {0xa284, 0x00000000},
+       {0xa288, 0x00000000},
+       {0xa28c, 0x00000000},
+       {0xa290, 0x00000000},
+       {0xa294, 0x00000000},
+       {0xa298, 0x00000000},
+       {0xa29c, 0x00000000},
+       {0xa2a0, 0x00000000},
+       {0xa2a4, 0x00000000},
+       {0xa2a8, 0x00000000},
+       {0xa2ac, 0x00000000},
+       {0xa2b0, 0x00000000},
+       {0xa2b4, 0x00000000},
+       {0xa2b8, 0x00000000},
+       {0xa2bc, 0x00000000},
+       {0xa2c0, 0x00000000},
+       {0xa2c4, 0x00000000},
+       {0xa2c8, 0x00000000},
+       {0xa2cc, 0x00000000},
+       {0xa2d0, 0x00000000},
+       {0xa2d4, 0x00000000},
+       {0xa2d8, 0x00000000},
+       {0xa2dc, 0x00000000},
+       {0xa2e0, 0x00000000},
+       {0xa2e4, 0x00000000},
+       {0xa2e8, 0x00000000},
+       {0xa2ec, 0x00000000},
+       {0xa2f0, 0x00000000},
+       {0xa2f4, 0x00000000},
+       {0xa2f8, 0x00000000},
+       {0xa2fc, 0x00000000},
+       {0xa300, 0x00000000},
+       {0xa304, 0x00000000},
+       {0xa308, 0x00000000},
+       {0xa30c, 0x00000000},
+       {0xa310, 0x00000000},
+       {0xa314, 0x00000000},
+       {0xa318, 0x00000000},
+       {0xa31c, 0x00000000},
+       {0xa320, 0x00000000},
+       {0xa324, 0x00000000},
+       {0xa328, 0x00000000},
+       {0xa32c, 0x00000000},
+       {0xa330, 0x00000000},
+       {0xa334, 0x00000000},
+       {0xa338, 0x00000000},
+       {0xa33c, 0x00000000},
+       {0xa340, 0x00000000},
+       {0xa344, 0x00000000},
+       {0xa348, 0x00000000},
+       {0xa34c, 0x00000000},
+       {0xa350, 0x00000000},
+       {0xa354, 0x00000000},
+       {0xa358, 0x00000000},
+       {0xa35c, 0x00000000},
+       {0xa360, 0x00000000},
+       {0xa364, 0x00000000},
+       {0xa368, 0x00000000},
+       {0xa36c, 0x00000000},
+       {0xa370, 0x00000000},
+       {0xa374, 0x00000000},
+       {0xa378, 0x00000000},
+       {0xa37c, 0x00000000},
+       {0xa380, 0x00000000},
+       {0xa384, 0x00000000},
+       {0xa388, 0x00000000},
+       {0xa38c, 0x00000000},
+       {0xa390, 0x00000000},
+       {0xa394, 0x00000000},
+       {0xa398, 0x00000000},
+       {0xa39c, 0x00000000},
+       {0xa3a0, 0x00000000},
+       {0xa3a4, 0x00000000},
+       {0xa3a8, 0x00000000},
+       {0xa3ac, 0x00000000},
+       {0xa3b0, 0x00000000},
+       {0xa3b4, 0x00000000},
+       {0xa3b8, 0x00000000},
+       {0xa3bc, 0x00000000},
+       {0xa620, 0x00000000},
+       {0xa624, 0x00000000},
+       {0xa628, 0x00000000},
+       {0xa62c, 0x00000000},
+       {0xa630, 0x00000000},
+       {0xa634, 0x00000000},
+       {0xa638, 0x00000000},
+       {0xa63c, 0x00000000},
+       {0xa640, 0x00000000},
+       {0xa644, 0x00000000},
+       {0xa648, 0x00000000},
+       {0xa64c, 0x00000000},
+       {0xa650, 0x00000000},
+       {0xa654, 0x00000000},
+       {0xa658, 0x00000000},
+       {0xa65c, 0x00000000},
+       {0xa660, 0x00000000},
+       {0xa664, 0x00000000},
+       {0xa668, 0x00000000},
+       {0xa66c, 0x00000000},
+       {0xa670, 0x00000000},
+       {0xa674, 0x00000000},
+       {0xa678, 0x00000000},
+       {0xa67c, 0x00000000},
+       {0xa680, 0x00000000},
+       {0xa684, 0x00000000},
+       {0xa688, 0x00000000},
+       {0xa68c, 0x00000000},
+       {0xa690, 0x00000000},
+       {0xa694, 0x00000000},
+       {0xa698, 0x00000000},
+       {0xa69c, 0x00000000},
+       {0xa6a0, 0x00000000},
+       {0xa6a4, 0x00000000},
+       {0xa6a8, 0x00000000},
+       {0xa6ac, 0x00000000},
+       {0xa6b0, 0x00000000},
+       {0xa6b4, 0x00000000},
+       {0xa6b8, 0x00000000},
+       {0xa6bc, 0x00000000},
+       {0xa6c0, 0x00000000},
+       {0xa6c4, 0x00000000},
+       {0xa6c8, 0x00000000},
+       {0xa6cc, 0x00000000},
+       {0xa6d0, 0x00000000},
+       {0xa6d4, 0x00000000},
+       {0xa6d8, 0x00000000},
+       {0xa6dc, 0x00000000},
+       {0xa6e0, 0x00000000},
+       {0xa6e4, 0x00000000},
+       {0xa6e8, 0x00000000},
+       {0xa6ec, 0x00000000},
+       {0xa6f0, 0x00000000},
+       {0xa6f4, 0x00000000},
+       {0xa6f8, 0x00000000},
+       {0xa6fc, 0x00000000},
+       {0xa700, 0x00000000},
+       {0xa704, 0x00000000},
+       {0xa708, 0x00000000},
+       {0xa70c, 0x00000000},
+       {0xa710, 0x00000000},
+       {0xa714, 0x00000000},
+       {0xa718, 0x00000000},
+       {0xa71c, 0x00000000},
+       {0xa720, 0x00000000},
+       {0xa724, 0x00000000},
+       {0xa728, 0x00000000},
+       {0xa72c, 0x00000000},
+       {0xa730, 0x00000000},
+       {0xa734, 0x00000000},
+       {0xa738, 0x00000000},
+       {0xa73c, 0x00000000},
+       {0xa740, 0x00000000},
+       {0xa744, 0x00000000},
+       {0xa748, 0x00000000},
+       {0xa74c, 0x00000000},
+       {0xa750, 0x00000000},
+       {0xa754, 0x00000000},
+       {0xa758, 0x00000000},
+       {0xa75c, 0x00000000},
+       {0xa760, 0x00000000},
+       {0xa764, 0x00000000},
+       {0xa768, 0x00000000},
+       {0xa76c, 0x00000000},
+       {0xa770, 0x00000000},
+       {0xa774, 0x00000000},
+       {0xa778, 0x00000000},
+       {0xa77c, 0x00000000},
+       {0xa780, 0x00000000},
+       {0xa784, 0x00000000},
+       {0xa788, 0x00000000},
+       {0xa78c, 0x00000000},
+       {0xa790, 0x00000000},
+       {0xa794, 0x00000000},
+       {0xa798, 0x00000000},
+       {0xa79c, 0x00000000},
+       {0xa7a0, 0x00000000},
+       {0xa7a4, 0x00000000},
+       {0xa7a8, 0x00000000},
+       {0xa7ac, 0x00000000},
+       {0xa7b0, 0x00000000},
+       {0xa7b4, 0x00000000},
+       {0xa7b8, 0x00000000},
+       {0xa7bc, 0x00000000},
+       {0x81d8, 0x00000000},
+       {0x82d8, 0x00000000},
+       {0x9f04, 0x2b251f19},
+       {0x9f08, 0x433d3731},
+       {0x9f0c, 0x5b554f49},
+       {0x9f10, 0x736d6761},
+       {0x9f14, 0x7f7f7f79},
+       {0x9f18, 0x120f7f7f},
+       {0x9f1c, 0x1e1b1815},
+       {0x9f20, 0x2a272421},
+       {0x9f24, 0x3633302d},
+       {0x9f28, 0x3f3f3c39},
+       {0x9f2c, 0x3f3f3f3f},
+       {0x8008, 0x00000080},
+       {0x8088, 0x807f030a},
+       {0x80c8, 0x708f0bf1},
+       {0x80c8, 0x708e0aa5},
+       {0x80c8, 0x708d097d},
+       {0x80c8, 0x708c0875},
+       {0x80c8, 0x708b0789},
+       {0x80c8, 0x708a06b7},
+       {0x80c8, 0x708905fc},
+       {0x80c8, 0x70880556},
+       {0x80c8, 0x708704c1},
+       {0x80c8, 0x7086043d},
+       {0x80c8, 0x708503c7},
+       {0x80c8, 0x7084035e},
+       {0x80c8, 0x708302ac},
+       {0x80c8, 0x70820262},
+       {0x80c8, 0x70810220},
+       {0x80c8, 0x70800000},
+       {0x80c8, 0x7090011f},
+       {0x80c8, 0x7010011f},
+       {0x8088, 0x80000000},
+       {0x8008, 0x00000000},
+       {0x8088, 0x00000110},
+       {0x8000, 0x00000008},
+       {0x8080, 0x00000005},
+       {0x8500, 0x80000008},
+       {0x8504, 0x43000004},
+       {0x8508, 0x4b044a00},
+       {0x850c, 0x40098604},
+       {0x8510, 0x0004e020},
+       {0x8514, 0x87044b05},
+       {0x8518, 0xe020400b},
+       {0x851c, 0x4b000004},
+       {0x8520, 0x21e07410},
+       {0x8524, 0x74300000},
+       {0x8528, 0x43800004},
+       {0x852c, 0x4c000007},
+       {0x8530, 0x43000004},
+       {0x8534, 0x42fe5700},
+       {0x8538, 0x42004000},
+       {0x853c, 0x30005055},
+       {0x8540, 0xa50fb41a},
+       {0x8544, 0xf11ce3c7},
+       {0x8548, 0xf31cf21c},
+       {0x854c, 0xf61cf41c},
+       {0x8550, 0xf91cf81c},
+       {0x8554, 0xfb1cfa1c},
+       {0x8558, 0xfd1cfc1c},
+       {0x855c, 0xff1cfe1c},
+       {0x8560, 0xf11cf01c},
+       {0x8564, 0xf31cf21c},
+       {0x8568, 0xf51cf41c},
+       {0x856c, 0xf71cf61c},
+       {0x8570, 0xf91cf81c},
+       {0x8574, 0xe3c7a504},
+       {0x8578, 0xf11af01a},
+       {0x857c, 0x30580001},
+       {0x8580, 0x30b030c9},
+       {0x8584, 0x30ff30fc},
+       {0x8588, 0x310f3102},
+       {0x858c, 0x3148311c},
+       {0x8590, 0x31603158},
+       {0x8594, 0x30c7320e},
+       {0x8598, 0x32293225},
+       {0x859c, 0x32433242},
+       {0x85a0, 0x3286327a},
+       {0x85a4, 0x329d328a},
+       {0x85a8, 0x32aa32a8},
+       {0x85ac, 0x320331c5},
+       {0x85b0, 0x7410e2c1},
+       {0x85b4, 0x020020a8},
+       {0x85b8, 0x2098140f},
+       {0x85bc, 0x140f0200},
+       {0x85c0, 0x02002088},
+       {0x85c4, 0x7430140f},
+       {0x85c8, 0x5b10e31c},
+       {0x85cc, 0x20a87410},
+       {0x85d0, 0x140f0201},
+       {0x85d4, 0x00002080},
+       {0x85d8, 0x5507140f},
+       {0x85dc, 0x5c065661},
+       {0x85e0, 0x7410e308},
+       {0x85e4, 0x02002088},
+       {0x85e8, 0x5517140f},
+       {0x85ec, 0x7410e308},
+       {0x85f0, 0x020020a8},
+       {0x85f4, 0x5517140f},
+       {0x85f8, 0x5c025641},
+       {0x85fc, 0x7410e308},
+       {0x8600, 0x00002080},
+       {0x8604, 0x1407140f},
+       {0x8608, 0xe3085507},
+       {0x860c, 0x7508e2b4},
+       {0x8610, 0xe312468e},
+       {0x8614, 0x5b10e0f4},
+       {0x8618, 0x20a87410},
+       {0x861c, 0x140f0201},
+       {0x8620, 0x00002090},
+       {0x8624, 0x5507140f},
+       {0x8628, 0x5c065661},
+       {0x862c, 0x7410e308},
+       {0x8630, 0x02002098},
+       {0x8634, 0x5517140f},
+       {0x8638, 0x7410e308},
+       {0x863c, 0x020020a8},
+       {0x8640, 0x5517140f},
+       {0x8644, 0x5c025641},
+       {0x8648, 0x7410e308},
+       {0x864c, 0x00002090},
+       {0x8650, 0x5507140f},
+       {0x8654, 0x7509e308},
+       {0x8658, 0xe3124696},
+       {0x865c, 0x0001e0f4},
+       {0x8660, 0x74105b10},
+       {0x8664, 0x000020a0},
+       {0x8668, 0x5507140f},
+       {0x866c, 0xe3085601},
+       {0x8670, 0x20a87410},
+       {0x8674, 0x140f0200},
+       {0x8678, 0xe3085517},
+       {0x867c, 0x750ae2b4},
+       {0x8680, 0xe3124686},
+       {0x8684, 0x5500e0f4},
+       {0x8688, 0x5501e304},
+       {0x868c, 0xe2c10001},
+       {0x8690, 0x5b10e31c},
+       {0x8694, 0x20807410},
+       {0x8698, 0x140f0000},
+       {0x869c, 0x02002098},
+       {0x86a0, 0xf204140f},
+       {0x86a4, 0x020020a8},
+       {0x86a8, 0x5507140f},
+       {0x86ac, 0xe3085601},
+       {0x86b0, 0x20887410},
+       {0x86b4, 0x140f0200},
+       {0x86b8, 0xe3085517},
+       {0x86bc, 0x7508e2b4},
+       {0x86c0, 0xe312468e},
+       {0x86c4, 0x7410e0f4},
+       {0x86c8, 0x00002090},
+       {0x86cc, 0x5507140f},
+       {0x86d0, 0x7410e308},
+       {0x86d4, 0x02002098},
+       {0x86d8, 0x5517140f},
+       {0x86dc, 0x7509e308},
+       {0x86e0, 0xe3124696},
+       {0x86e4, 0x0001e0f4},
+       {0x86e8, 0x74207900},
+       {0x86ec, 0x57005710},
+       {0x86f0, 0x9700140f},
+       {0x86f4, 0x00017430},
+       {0x86f8, 0xe31ce2c1},
+       {0x86fc, 0xe2ca0001},
+       {0x8700, 0x0001e34b},
+       {0x8704, 0x312ae2c1},
+       {0x8708, 0xe3ba0023},
+       {0x870c, 0x54ed0002},
+       {0x8710, 0x00230baa},
+       {0x8714, 0x0002e3ba},
+       {0x8718, 0xe2b9e367},
+       {0x871c, 0xe2c10001},
+       {0x8720, 0x00223125},
+       {0x8724, 0x0002e3ba},
+       {0x8728, 0x0baa54ec},
+       {0x872c, 0xe3ba0022},
+       {0x8730, 0xe3670002},
+       {0x8734, 0x0001e2b9},
+       {0x8738, 0x0baae2c1},
+       {0x873c, 0x6d0f6c67},
+       {0x8740, 0xe3bae31c},
+       {0x8744, 0xe31c6c8b},
+       {0x8748, 0x0bace3ba},
+       {0x874c, 0x6d0f6cb3},
+       {0x8750, 0xe3bae31c},
+       {0x8754, 0x6cdb0bad},
+       {0x8758, 0xe31c6d0f},
+       {0x875c, 0x6cf7e3ba},
+       {0x8760, 0xe31c6d0f},
+       {0x8764, 0x6c09e3ba},
+       {0x8768, 0xe31c6d00},
+       {0x876c, 0x6c25e3ba},
+       {0x8770, 0xe3bae31c},
+       {0x8774, 0x6c4df8ca},
+       {0x8778, 0xe3bae31c},
+       {0x877c, 0x6c75f9d3},
+       {0x8780, 0xe3bae31c},
+       {0x8784, 0xe31c6c99},
+       {0x8788, 0xe367e3ba},
+       {0x878c, 0x0001e2b9},
+       {0x8790, 0x4380e2ca},
+       {0x8794, 0x43006344},
+       {0x8798, 0x00223188},
+       {0x879c, 0x0002e3bf},
+       {0x87a0, 0x0baa54ec},
+       {0x87a4, 0xe3bf0022},
+       {0x87a8, 0xe3670002},
+       {0x87ac, 0x0001e2c5},
+       {0x87b0, 0x4380e2ca},
+       {0x87b4, 0x43006344},
+       {0x87b8, 0xe367317b},
+       {0x87bc, 0x0001e2c5},
+       {0x87c0, 0x4380e2ca},
+       {0x87c4, 0x4300634d},
+       {0x87c8, 0x74100ba6},
+       {0x87cc, 0x000921e8},
+       {0x87d0, 0x6f0f6e67},
+       {0x87d4, 0xe3bfe34b},
+       {0x87d8, 0x000a21e8},
+       {0x87dc, 0xe34b6e77},
+       {0x87e0, 0x21e8e3bf},
+       {0x87e4, 0x6e8b000b},
+       {0x87e8, 0xe3bfe34b},
+       {0x87ec, 0x000c21e8},
+       {0x87f0, 0xe34b6e9f},
+       {0x87f4, 0x0baae3bf},
+       {0x87f8, 0x21e87410},
+       {0x87fc, 0x6eb3000d},
+       {0x8800, 0xe34b6f0f},
+       {0x8804, 0x21e8e3bf},
+       {0x8808, 0x6ec7000e},
+       {0x880c, 0xe3bfe34b},
+       {0x8810, 0x74100bac},
+       {0x8814, 0x000f21e8},
+       {0x8818, 0x6f0f6edb},
+       {0x881c, 0xe3bfe34b},
+       {0x8820, 0x001021e8},
+       {0x8824, 0xe34b6eef},
+       {0x8828, 0xe3bfe3bf},
+       {0x882c, 0x001321e8},
+       {0x8830, 0x6f006e11},
+       {0x8834, 0xe3bfe34b},
+       {0x8838, 0x21e8e3bf},
+       {0x883c, 0x6e250014},
+       {0x8840, 0xe3bfe34b},
+       {0x8844, 0x21e8fbab},
+       {0x8848, 0x6e390015},
+       {0x884c, 0xe3bfe34b},
+       {0x8850, 0x001621e8},
+       {0x8854, 0xe34b6e4d},
+       {0x8858, 0xfcb0e3bf},
+       {0x885c, 0x001721e8},
+       {0x8860, 0xe34b6e61},
+       {0x8864, 0x21e8e3bf},
+       {0x8868, 0x6e750018},
+       {0x886c, 0xe3bfe34b},
+       {0x8870, 0x001921e8},
+       {0x8874, 0xe34b6e89},
+       {0x8878, 0x21e8e3bf},
+       {0x887c, 0x6e99001a},
+       {0x8880, 0xe3bfe34b},
+       {0x8884, 0xe2c5e367},
+       {0x8888, 0x00040001},
+       {0x888c, 0x42fc0004},
+       {0x8890, 0x60010007},
+       {0x8894, 0x42000004},
+       {0x8898, 0x62200007},
+       {0x889c, 0x00046200},
+       {0x88a0, 0x5b005501},
+       {0x88a4, 0x5b40e304},
+       {0x88a8, 0x00076605},
+       {0x88ac, 0x63006200},
+       {0x88b0, 0x0004e388},
+       {0x88b4, 0x0a010900},
+       {0x88b8, 0x0d000b40},
+       {0x88bc, 0x00320e01},
+       {0x88c0, 0x95090004},
+       {0x88c4, 0x790442fb},
+       {0x88c8, 0x43804200},
+       {0x88cc, 0x4d010007},
+       {0x88d0, 0x43000004},
+       {0x88d4, 0x05620007},
+       {0x88d8, 0x961d05a3},
+       {0x88dc, 0x0004e388},
+       {0x88e0, 0x0007e304},
+       {0x88e4, 0x07a306a2},
+       {0x88e8, 0x0004e388},
+       {0x88ec, 0xe378e304},
+       {0x88f0, 0xe3800002},
+       {0x88f4, 0x00074380},
+       {0x88f8, 0x00044d00},
+       {0x88fc, 0x42fe4300},
+       {0x8900, 0x42007900},
+       {0x8904, 0x00040001},
+       {0x8908, 0x000742fc},
+       {0x890c, 0x00046003},
+       {0x8910, 0x31cc4200},
+       {0x8914, 0x06a20007},
+       {0x8918, 0x31f807a3},
+       {0x891c, 0x77000005},
+       {0x8920, 0x52000007},
+       {0x8924, 0x42fe0004},
+       {0x8928, 0x60000007},
+       {0x892c, 0x42000004},
+       {0x8930, 0x60004380},
+       {0x8934, 0x62016100},
+       {0x8938, 0x00056310},
+       {0x893c, 0x55004100},
+       {0x8940, 0x5c020007},
+       {0x8944, 0x43000004},
+       {0x8948, 0xe2d70001},
+       {0x894c, 0x73000005},
+       {0x8950, 0xe2d70001},
+       {0x8954, 0x5d000006},
+       {0x8958, 0x42f70004},
+       {0x895c, 0x6c000005},
+       {0x8960, 0x42000004},
+       {0x8964, 0x0004e2de},
+       {0x8968, 0x00074380},
+       {0x896c, 0x4a004e00},
+       {0x8970, 0x00064c00},
+       {0x8974, 0x60007f00},
+       {0x8978, 0x00046f00},
+       {0x897c, 0x00054300},
+       {0x8980, 0x00017300},
+       {0x8984, 0xe2d70001},
+       {0x8988, 0x5d010006},
+       {0x898c, 0x61006002},
+       {0x8990, 0x00055601},
+       {0x8994, 0xe2e27710},
+       {0x8998, 0x73000005},
+       {0x899c, 0x43800004},
+       {0x89a0, 0x5e010007},
+       {0x89a4, 0x4d205e00},
+       {0x89a8, 0x4a084e20},
+       {0x89ac, 0x4c3f4960},
+       {0x89b0, 0x00064301},
+       {0x89b4, 0x63807f01},
+       {0x89b8, 0x00046010},
+       {0x89bc, 0x00064300},
+       {0x89c0, 0x00077402},
+       {0x89c4, 0x40004001},
+       {0x89c8, 0x0006ab00},
+       {0x89cc, 0x00077404},
+       {0x89d0, 0x40004001},
+       {0x89d4, 0x0004ab00},
+       {0x89d8, 0x00074380},
+       {0x89dc, 0x4e004d00},
+       {0x89e0, 0x4c004a00},
+       {0x89e4, 0x00064300},
+       {0x89e8, 0x63007f00},
+       {0x89ec, 0x00046000},
+       {0x89f0, 0x00014300},
+       {0x89f4, 0x73800005},
+       {0x89f8, 0x42fe0004},
+       {0x89fc, 0x6c010005},
+       {0x8a00, 0x000514c8},
+       {0x8a04, 0x00046c00},
+       {0x8a08, 0x00014200},
+       {0x8a0c, 0x0005e2ce},
+       {0x8a10, 0x00017300},
+       {0x8a14, 0x00040006},
+       {0x8a18, 0x42fa4380},
+       {0x8a1c, 0x42007c05},
+       {0x8a20, 0x7c5b0006},
+       {0x8a24, 0x7e5b7d5b},
+       {0x8a28, 0x00077f00},
+       {0x8a2c, 0x415b405b},
+       {0x8a30, 0x4300425b},
+       {0x8a34, 0x43000004},
+       {0x8a38, 0x00040001},
+       {0x8a3c, 0x60004380},
+       {0x8a40, 0x62016100},
+       {0x8a44, 0x42fa6310},
+       {0x8a48, 0x42007c00},
+       {0x8a4c, 0x00014300},
+       {0x8a50, 0x0001e2e5},
+       {0x8a54, 0x55000007},
+       {0x8a58, 0x74200004},
+       {0x8a5c, 0x79017711},
+       {0x8a60, 0x57005710},
+       {0x8a64, 0x00019700},
+       {0x8a68, 0x4e004f02},
+       {0x8a6c, 0x52015302},
+       {0x8a70, 0x43800001},
+       {0x8a74, 0x78006505},
+       {0x8a78, 0x7a007900},
+       {0x8a7c, 0x43007b00},
+       {0x8a80, 0x43800001},
+       {0x8a84, 0x43006500},
+       {0x8a88, 0x43800001},
+       {0x8a8c, 0x7c006405},
+       {0x8a90, 0x00014300},
+       {0x8a94, 0x64004380},
+       {0x8a98, 0x00014300},
+       {0x8a9c, 0x74200004},
+       {0x8aa0, 0x0005e392},
+       {0x8aa4, 0x73807388},
+       {0x8aa8, 0xe3a08f00},
+       {0x8aac, 0xe3920001},
+       {0x8ab0, 0x73810005},
+       {0x8ab4, 0x93007380},
+       {0x8ab8, 0x0001e3a0},
+       {0x8abc, 0xe2e5e3a7},
+       {0x8ac0, 0x0001e3ae},
+       {0x8ac4, 0xe3aee3a7},
+       {0x8ac8, 0x00040001},
+       {0x8acc, 0x24207410},
+       {0x8ad0, 0x14c80000},
+       {0x8ad4, 0x00002428},
+       {0x8ad8, 0x1a4215f4},
+       {0x8adc, 0x74300008},
+       {0x8ae0, 0x43800001},
+       {0x8ae4, 0x7a907b48},
+       {0x8ae8, 0x78027900},
+       {0x8aec, 0x55034300},
+       {0x8af0, 0x43803308},
+       {0x8af4, 0x7a807b38},
+       {0x8af8, 0x55134300},
+       {0x8afc, 0x43803308},
+       {0x8b00, 0x7a007b40},
+       {0x8b04, 0x55234300},
+       {0x8b08, 0x74007401},
+       {0x8b0c, 0x00018e00},
+       {0x8b10, 0x52300007},
+       {0x8b14, 0x74310004},
+       {0x8b18, 0x8e007430},
+       {0x8b1c, 0x52200007},
+       {0x8b20, 0x00010004},
+       {0x8b24, 0x57005702},
+       {0x8b28, 0x00018e00},
+       {0x8b2c, 0x561042ef},
+       {0x8b30, 0x42005600},
+       {0x8b34, 0x00018c00},
+       {0x8b38, 0x4e004f78},
+       {0x8b3c, 0x52015388},
+       {0x8b40, 0xe32b5b20},
+       {0x8b44, 0x54005480},
+       {0x8b48, 0x54005481},
+       {0x8b4c, 0x54005482},
+       {0x8b50, 0xbf1de336},
+       {0x8b54, 0xe2f13010},
+       {0x8b58, 0xe2ffe2f9},
+       {0x8b5c, 0xe3b3e312},
+       {0x8b60, 0xe3085523},
+       {0x8b64, 0xe3125525},
+       {0x8b68, 0x0001e3b3},
+       {0x8b6c, 0x54c054bf},
+       {0x8b70, 0x54c154a3},
+       {0x8b74, 0x4c1854a4},
+       {0x8b78, 0x54c2bf07},
+       {0x8b7c, 0xbf0454a4},
+       {0x8b80, 0x54a354c1},
+       {0x8b84, 0xe3c4bf01},
+       {0x8b88, 0x000154df},
+       {0x8b8c, 0x54e554bf},
+       {0x8b90, 0x54df050a},
+       {0x8b94, 0x16570001},
+       {0x8b98, 0x74307b80},
+       {0x8b9c, 0x7f404380},
+       {0x8ba0, 0x7d007e00},
+       {0x8ba4, 0x43007c02},
+       {0x8ba8, 0x55015b40},
+       {0x8bac, 0xe3165c01},
+       {0x8bb0, 0x54005480},
+       {0x8bb4, 0x54005481},
+       {0x8bb8, 0x54005482},
+       {0x8bbc, 0x74107b00},
+       {0x8bc0, 0xbfe5e336},
+       {0x8bc4, 0x56103010},
+       {0x8bc8, 0x8c005600},
+       {0x8bcc, 0x57040001},
+       {0x8bd0, 0x8e005700},
+       {0x8bd4, 0x57005708},
+       {0x8bd8, 0x57818e00},
+       {0x8bdc, 0x8e005780},
+       {0x8be0, 0x00074380},
+       {0x8be4, 0x5c005c01},
+       {0x8be8, 0x00041403},
+       {0x8bec, 0x00014300},
+       {0x8bf0, 0x0007427f},
+       {0x8bf4, 0x62006280},
+       {0x8bf8, 0x00049200},
+       {0x8bfc, 0x00014200},
+       {0x8c00, 0x0007427f},
+       {0x8c04, 0x63146394},
+       {0x8c08, 0x00049200},
+       {0x8c0c, 0x00014200},
+       {0x8c10, 0x42fe0004},
+       {0x8c14, 0x42007901},
+       {0x8c18, 0x14037420},
+       {0x8c1c, 0x57005710},
+       {0x8c20, 0x0001140f},
+       {0x8c24, 0x56010006},
+       {0x8c28, 0x54005502},
+       {0x8c2c, 0x7f000005},
+       {0x8c30, 0x77107e12},
+       {0x8c34, 0x75007600},
+       {0x8c38, 0x00047400},
+       {0x8c3c, 0x00014270},
+       {0x8c40, 0x42000004},
+       {0x8c44, 0x77000005},
+       {0x8c48, 0x56000006},
+       {0x8c4c, 0x00060001},
+       {0x8c50, 0x5f005f80},
+       {0x8c54, 0x00059900},
+       {0x8c58, 0x00017300},
+       {0x8c5c, 0x63800006},
+       {0x8c60, 0x98006300},
+       {0x8c64, 0x549f0001},
+       {0x8c68, 0x5c015400},
+       {0x8c6c, 0x540054df},
+       {0x8c70, 0x00015c02},
+       {0x8c74, 0x07145c01},
+       {0x8c78, 0x5c025400},
+       {0x8c7c, 0x5c020001},
+       {0x8c80, 0x54000714},
+       {0x8c84, 0x00015c01},
+       {0x8c88, 0x4c184c98},
+       {0x8c8c, 0x00040001},
+       {0x8c90, 0x74305c02},
+       {0x8c94, 0x0c010901},
+       {0x8c98, 0x00050ba6},
+       {0x8c9c, 0x00077780},
+       {0x8ca0, 0x00045220},
+       {0x8ca4, 0x60084380},
+       {0x8ca8, 0x6200610a},
+       {0x8cac, 0x000763ce},
+       {0x8cb0, 0x00045c00},
+       {0x8cb4, 0x00014300},
+       {0x8080, 0x00000004},
+       {0x8080, 0x00000000},
+       {0x8088, 0x00000000},
+};
+
+static const struct rtw89_txpwr_byrate_cfg rtw89_8852b_txpwr_byrate[] = {
+       { 0, 0, 0, 0, 4, 0x50505050, },
+       { 0, 0, 1, 0, 4, 0x50505050, },
+       { 0, 0, 1, 4, 4, 0x484c5050, },
+       { 0, 0, 2, 0, 4, 0x50505050, },
+       { 0, 0, 2, 4, 4, 0x44484c50, },
+       { 0, 0, 2, 8, 4, 0x34383c40, },
+       { 0, 0, 3, 0, 4, 0x50505050, },
+       { 0, 1, 2, 0, 4, 0x50505050, },
+       { 0, 1, 2, 4, 4, 0x44484c50, },
+       { 0, 1, 2, 8, 4, 0x34383c40, },
+       { 0, 1, 3, 0, 4, 0x50505050, },
+       { 0, 0, 4, 1, 4, 0x00000000, },
+       { 0, 0, 4, 0, 1, 0x00000000, },
+       { 1, 0, 1, 0, 4, 0x50505050, },
+       { 1, 0, 1, 4, 4, 0x484c5050, },
+       { 1, 0, 2, 0, 4, 0x50505050, },
+       { 1, 0, 2, 4, 4, 0x44484c50, },
+       { 1, 0, 2, 8, 4, 0x34383c40, },
+       { 1, 0, 3, 0, 4, 0x50505050, },
+       { 1, 1, 2, 0, 4, 0x50505050, },
+       { 1, 1, 2, 4, 4, 0x44484c50, },
+       { 1, 1, 2, 8, 4, 0x34383c40, },
+       { 1, 1, 3, 0, 4, 0x50505050, },
+       { 1, 0, 4, 0, 4, 0x00000000, },
+};
+
+static const s8 _txpwr_track_delta_swingidx_5gb_n[][DELTA_SWINGIDX_SIZE] = {
+       {0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,
+        4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8},
+       {0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5,
+        5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8},
+       {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, 12},
+};
+
+static const s8 _txpwr_track_delta_swingidx_5gb_p[][DELTA_SWINGIDX_SIZE] = {
+       {0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5,
+        5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8},
+       {0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,
+        4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8},
+       {0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5,
+        5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9},
+};
+
+static const s8 _txpwr_track_delta_swingidx_5ga_n[][DELTA_SWINGIDX_SIZE] = {
+       {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
+        2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4},
+       {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
+        2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3},
+       {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
+        2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3},
+};
+
+static const s8 _txpwr_track_delta_swingidx_5ga_p[][DELTA_SWINGIDX_SIZE] = {
+       {0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4,
+        4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7},
+       {0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5,
+        5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9},
+       {0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5,
+        5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9},
+};
+
+static const s8 _txpwr_track_delta_swingidx_2gb_n[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1,
+        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2};
+
+static const s8 _txpwr_track_delta_swingidx_2gb_p[] = {
+       0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
+        3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6};
+
+static const s8 _txpwr_track_delta_swingidx_2ga_n[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+static const s8 _txpwr_track_delta_swingidx_2ga_p[] = {
+       0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3,
+        3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5};
+
+static const s8 _txpwr_track_delta_swingidx_2g_cck_b_n[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1,
+        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
+
+static const s8 _txpwr_track_delta_swingidx_2g_cck_b_p[] = {
+       0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
+        4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6};
+
+static const s8 _txpwr_track_delta_swingidx_2g_cck_a_n[] = {
+       0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -2, -2,
+        -2, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3, -3, -3};
+
+static const s8 _txpwr_track_delta_swingidx_2g_cck_a_p[] = {
+       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
+
+const u8 rtw89_8852b_tx_shape[RTW89_BAND_MAX][RTW89_RS_TX_SHAPE_NUM]
+                            [RTW89_REGD_NUM] = {
+       [0][0][RTW89_ACMA] = 0,
+       [0][0][RTW89_CHILE] = 0,
+       [0][0][RTW89_CN] = 0,
+       [0][0][RTW89_ETSI] = 0,
+       [0][0][RTW89_FCC] = 1,
+       [0][0][RTW89_IC] = 1,
+       [0][0][RTW89_KCC] = 0,
+       [0][0][RTW89_MEXICO] = 1,
+       [0][0][RTW89_MKK] = 0,
+       [0][0][RTW89_QATAR] = 0,
+       [0][0][RTW89_UK] = 0,
+       [0][0][RTW89_UKRAINE] = 0,
+       [0][1][RTW89_ACMA] = 0,
+       [0][1][RTW89_CHILE] = 0,
+       [0][1][RTW89_CN] = 0,
+       [0][1][RTW89_ETSI] = 0,
+       [0][1][RTW89_FCC] = 3,
+       [0][1][RTW89_IC] = 3,
+       [0][1][RTW89_KCC] = 0,
+       [0][1][RTW89_MEXICO] = 3,
+       [0][1][RTW89_MKK] = 0,
+       [0][1][RTW89_QATAR] = 0,
+       [0][1][RTW89_UK] = 0,
+       [0][1][RTW89_UKRAINE] = 0,
+       [1][1][RTW89_ACMA] = 0,
+       [1][1][RTW89_CHILE] = 0,
+       [1][1][RTW89_CN] = 0,
+       [1][1][RTW89_ETSI] = 0,
+       [1][1][RTW89_FCC] = 3,
+       [1][1][RTW89_IC] = 3,
+       [1][1][RTW89_KCC] = 0,
+       [1][1][RTW89_MEXICO] = 3,
+       [1][1][RTW89_MKK] = 0,
+       [1][1][RTW89_QATAR] = 0,
+       [1][1][RTW89_UK] = 0,
+       [1][1][RTW89_UKRAINE] = 0,
+};
+
+const s8 rtw89_8852b_txpwr_lmt_2g[RTW89_2G_BW_NUM][RTW89_NTX_NUM]
+                                [RTW89_RS_LMT_NUM][RTW89_BF_NUM]
+                                [RTW89_REGD_NUM][RTW89_2G_CH_NUM] = {
+       [0][0][0][0][RTW89_WW][0] = 58,
+       [0][0][0][0][RTW89_WW][1] = 58,
+       [0][0][0][0][RTW89_WW][2] = 58,
+       [0][0][0][0][RTW89_WW][3] = 58,
+       [0][0][0][0][RTW89_WW][4] = 58,
+       [0][0][0][0][RTW89_WW][5] = 58,
+       [0][0][0][0][RTW89_WW][6] = 58,
+       [0][0][0][0][RTW89_WW][7] = 58,
+       [0][0][0][0][RTW89_WW][8] = 58,
+       [0][0][0][0][RTW89_WW][9] = 58,
+       [0][0][0][0][RTW89_WW][10] = 58,
+       [0][0][0][0][RTW89_WW][11] = 58,
+       [0][0][0][0][RTW89_WW][12] = 56,
+       [0][0][0][0][RTW89_WW][13] = 76,
+       [0][1][0][0][RTW89_WW][0] = 46,
+       [0][1][0][0][RTW89_WW][1] = 46,
+       [0][1][0][0][RTW89_WW][2] = 46,
+       [0][1][0][0][RTW89_WW][3] = 46,
+       [0][1][0][0][RTW89_WW][4] = 46,
+       [0][1][0][0][RTW89_WW][5] = 46,
+       [0][1][0][0][RTW89_WW][6] = 46,
+       [0][1][0][0][RTW89_WW][7] = 46,
+       [0][1][0][0][RTW89_WW][8] = 46,
+       [0][1][0][0][RTW89_WW][9] = 46,
+       [0][1][0][0][RTW89_WW][10] = 46,
+       [0][1][0][0][RTW89_WW][11] = 46,
+       [0][1][0][0][RTW89_WW][12] = 42,
+       [0][1][0][0][RTW89_WW][13] = 64,
+       [1][0][0][0][RTW89_WW][0] = 0,
+       [1][0][0][0][RTW89_WW][1] = 0,
+       [1][0][0][0][RTW89_WW][2] = 50,
+       [1][0][0][0][RTW89_WW][3] = 50,
+       [1][0][0][0][RTW89_WW][4] = 50,
+       [1][0][0][0][RTW89_WW][5] = 58,
+       [1][0][0][0][RTW89_WW][6] = 50,
+       [1][0][0][0][RTW89_WW][7] = 50,
+       [1][0][0][0][RTW89_WW][8] = 50,
+       [1][0][0][0][RTW89_WW][9] = 42,
+       [1][0][0][0][RTW89_WW][10] = 30,
+       [1][0][0][0][RTW89_WW][11] = 0,
+       [1][0][0][0][RTW89_WW][12] = 0,
+       [1][0][0][0][RTW89_WW][13] = 0,
+       [1][1][0][0][RTW89_WW][0] = 0,
+       [1][1][0][0][RTW89_WW][1] = 0,
+       [1][1][0][0][RTW89_WW][2] = 46,
+       [1][1][0][0][RTW89_WW][3] = 46,
+       [1][1][0][0][RTW89_WW][4] = 46,
+       [1][1][0][0][RTW89_WW][5] = 46,
+       [1][1][0][0][RTW89_WW][6] = 34,
+       [1][1][0][0][RTW89_WW][7] = 34,
+       [1][1][0][0][RTW89_WW][8] = 34,
+       [1][1][0][0][RTW89_WW][9] = 30,
+       [1][1][0][0][RTW89_WW][10] = 30,
+       [1][1][0][0][RTW89_WW][11] = 0,
+       [1][1][0][0][RTW89_WW][12] = 0,
+       [1][1][0][0][RTW89_WW][13] = 0,
+       [0][0][1][0][RTW89_WW][0] = 58,
+       [0][0][1][0][RTW89_WW][1] = 58,
+       [0][0][1][0][RTW89_WW][2] = 58,
+       [0][0][1][0][RTW89_WW][3] = 58,
+       [0][0][1][0][RTW89_WW][4] = 58,
+       [0][0][1][0][RTW89_WW][5] = 58,
+       [0][0][1][0][RTW89_WW][6] = 58,
+       [0][0][1][0][RTW89_WW][7] = 58,
+       [0][0][1][0][RTW89_WW][8] = 58,
+       [0][0][1][0][RTW89_WW][9] = 58,
+       [0][0][1][0][RTW89_WW][10] = 58,
+       [0][0][1][0][RTW89_WW][11] = 54,
+       [0][0][1][0][RTW89_WW][12] = 50,
+       [0][0][1][0][RTW89_WW][13] = 0,
+       [0][1][1][0][RTW89_WW][0] = 46,
+       [0][1][1][0][RTW89_WW][1] = 46,
+       [0][1][1][0][RTW89_WW][2] = 46,
+       [0][1][1][0][RTW89_WW][3] = 46,
+       [0][1][1][0][RTW89_WW][4] = 46,
+       [0][1][1][0][RTW89_WW][5] = 46,
+       [0][1][1][0][RTW89_WW][6] = 46,
+       [0][1][1][0][RTW89_WW][7] = 46,
+       [0][1][1][0][RTW89_WW][8] = 46,
+       [0][1][1][0][RTW89_WW][9] = 46,
+       [0][1][1][0][RTW89_WW][10] = 46,
+       [0][1][1][0][RTW89_WW][11] = 46,
+       [0][1][1][0][RTW89_WW][12] = 42,
+       [0][1][1][0][RTW89_WW][13] = 0,
+       [0][0][2][0][RTW89_WW][0] = 58,
+       [0][0][2][0][RTW89_WW][1] = 58,
+       [0][0][2][0][RTW89_WW][2] = 58,
+       [0][0][2][0][RTW89_WW][3] = 58,
+       [0][0][2][0][RTW89_WW][4] = 58,
+       [0][0][2][0][RTW89_WW][5] = 58,
+       [0][0][2][0][RTW89_WW][6] = 58,
+       [0][0][2][0][RTW89_WW][7] = 58,
+       [0][0][2][0][RTW89_WW][8] = 58,
+       [0][0][2][0][RTW89_WW][9] = 58,
+       [0][0][2][0][RTW89_WW][10] = 58,
+       [0][0][2][0][RTW89_WW][11] = 54,
+       [0][0][2][0][RTW89_WW][12] = 50,
+       [0][0][2][0][RTW89_WW][13] = 0,
+       [0][1][2][0][RTW89_WW][0] = 46,
+       [0][1][2][0][RTW89_WW][1] = 46,
+       [0][1][2][0][RTW89_WW][2] = 46,
+       [0][1][2][0][RTW89_WW][3] = 46,
+       [0][1][2][0][RTW89_WW][4] = 46,
+       [0][1][2][0][RTW89_WW][5] = 46,
+       [0][1][2][0][RTW89_WW][6] = 46,
+       [0][1][2][0][RTW89_WW][7] = 46,
+       [0][1][2][0][RTW89_WW][8] = 46,
+       [0][1][2][0][RTW89_WW][9] = 46,
+       [0][1][2][0][RTW89_WW][10] = 46,
+       [0][1][2][0][RTW89_WW][11] = 46,
+       [0][1][2][0][RTW89_WW][12] = 42,
+       [0][1][2][0][RTW89_WW][13] = 0,
+       [0][1][2][1][RTW89_WW][0] = 34,
+       [0][1][2][1][RTW89_WW][1] = 34,
+       [0][1][2][1][RTW89_WW][2] = 34,
+       [0][1][2][1][RTW89_WW][3] = 34,
+       [0][1][2][1][RTW89_WW][4] = 34,
+       [0][1][2][1][RTW89_WW][5] = 34,
+       [0][1][2][1][RTW89_WW][6] = 34,
+       [0][1][2][1][RTW89_WW][7] = 34,
+       [0][1][2][1][RTW89_WW][8] = 34,
+       [0][1][2][1][RTW89_WW][9] = 34,
+       [0][1][2][1][RTW89_WW][10] = 34,
+       [0][1][2][1][RTW89_WW][11] = 34,
+       [0][1][2][1][RTW89_WW][12] = 34,
+       [0][1][2][1][RTW89_WW][13] = 0,
+       [1][0][2][0][RTW89_WW][0] = 0,
+       [1][0][2][0][RTW89_WW][1] = 0,
+       [1][0][2][0][RTW89_WW][2] = 58,
+       [1][0][2][0][RTW89_WW][3] = 58,
+       [1][0][2][0][RTW89_WW][4] = 58,
+       [1][0][2][0][RTW89_WW][5] = 58,
+       [1][0][2][0][RTW89_WW][6] = 58,
+       [1][0][2][0][RTW89_WW][7] = 58,
+       [1][0][2][0][RTW89_WW][8] = 58,
+       [1][0][2][0][RTW89_WW][9] = 58,
+       [1][0][2][0][RTW89_WW][10] = 58,
+       [1][0][2][0][RTW89_WW][11] = 0,
+       [1][0][2][0][RTW89_WW][12] = 0,
+       [1][0][2][0][RTW89_WW][13] = 0,
+       [1][1][2][0][RTW89_WW][0] = 0,
+       [1][1][2][0][RTW89_WW][1] = 0,
+       [1][1][2][0][RTW89_WW][2] = 46,
+       [1][1][2][0][RTW89_WW][3] = 46,
+       [1][1][2][0][RTW89_WW][4] = 46,
+       [1][1][2][0][RTW89_WW][5] = 46,
+       [1][1][2][0][RTW89_WW][6] = 46,
+       [1][1][2][0][RTW89_WW][7] = 46,
+       [1][1][2][0][RTW89_WW][8] = 46,
+       [1][1][2][0][RTW89_WW][9] = 42,
+       [1][1][2][0][RTW89_WW][10] = 38,
+       [1][1][2][0][RTW89_WW][11] = 0,
+       [1][1][2][0][RTW89_WW][12] = 0,
+       [1][1][2][0][RTW89_WW][13] = 0,
+       [1][1][2][1][RTW89_WW][0] = 0,
+       [1][1][2][1][RTW89_WW][1] = 0,
+       [1][1][2][1][RTW89_WW][2] = 34,
+       [1][1][2][1][RTW89_WW][3] = 34,
+       [1][1][2][1][RTW89_WW][4] = 34,
+       [1][1][2][1][RTW89_WW][5] = 34,
+       [1][1][2][1][RTW89_WW][6] = 34,
+       [1][1][2][1][RTW89_WW][7] = 34,
+       [1][1][2][1][RTW89_WW][8] = 34,
+       [1][1][2][1][RTW89_WW][9] = 34,
+       [1][1][2][1][RTW89_WW][10] = 34,
+       [1][1][2][1][RTW89_WW][11] = 0,
+       [1][1][2][1][RTW89_WW][12] = 0,
+       [1][1][2][1][RTW89_WW][13] = 0,
+       [0][0][0][0][RTW89_FCC][0] = 78,
+       [0][0][0][0][RTW89_ETSI][0] = 58,
+       [0][0][0][0][RTW89_MKK][0] = 68,
+       [0][0][0][0][RTW89_IC][0] = 78,
+       [0][0][0][0][RTW89_KCC][0] = 68,
+       [0][0][0][0][RTW89_ACMA][0] = 58,
+       [0][0][0][0][RTW89_CHILE][0] = 64,
+       [0][0][0][0][RTW89_UKRAINE][0] = 58,
+       [0][0][0][0][RTW89_MEXICO][0] = 78,
+       [0][0][0][0][RTW89_CN][0] = 58,
+       [0][0][0][0][RTW89_QATAR][0] = 58,
+       [0][0][0][0][RTW89_UK][0] = 58,
+       [0][0][0][0][RTW89_FCC][1] = 78,
+       [0][0][0][0][RTW89_ETSI][1] = 58,
+       [0][0][0][0][RTW89_MKK][1] = 68,
+       [0][0][0][0][RTW89_IC][1] = 78,
+       [0][0][0][0][RTW89_KCC][1] = 68,
+       [0][0][0][0][RTW89_ACMA][1] = 58,
+       [0][0][0][0][RTW89_CHILE][1] = 64,
+       [0][0][0][0][RTW89_UKRAINE][1] = 58,
+       [0][0][0][0][RTW89_MEXICO][1] = 78,
+       [0][0][0][0][RTW89_CN][1] = 58,
+       [0][0][0][0][RTW89_QATAR][1] = 58,
+       [0][0][0][0][RTW89_UK][1] = 58,
+       [0][0][0][0][RTW89_FCC][2] = 78,
+       [0][0][0][0][RTW89_ETSI][2] = 58,
+       [0][0][0][0][RTW89_MKK][2] = 68,
+       [0][0][0][0][RTW89_IC][2] = 78,
+       [0][0][0][0][RTW89_KCC][2] = 68,
+       [0][0][0][0][RTW89_ACMA][2] = 58,
+       [0][0][0][0][RTW89_CHILE][2] = 64,
+       [0][0][0][0][RTW89_UKRAINE][2] = 58,
+       [0][0][0][0][RTW89_MEXICO][2] = 78,
+       [0][0][0][0][RTW89_CN][2] = 58,
+       [0][0][0][0][RTW89_QATAR][2] = 58,
+       [0][0][0][0][RTW89_UK][2] = 58,
+       [0][0][0][0][RTW89_FCC][3] = 78,
+       [0][0][0][0][RTW89_ETSI][3] = 58,
+       [0][0][0][0][RTW89_MKK][3] = 68,
+       [0][0][0][0][RTW89_IC][3] = 78,
+       [0][0][0][0][RTW89_KCC][3] = 68,
+       [0][0][0][0][RTW89_ACMA][3] = 58,
+       [0][0][0][0][RTW89_CHILE][3] = 64,
+       [0][0][0][0][RTW89_UKRAINE][3] = 58,
+       [0][0][0][0][RTW89_MEXICO][3] = 78,
+       [0][0][0][0][RTW89_CN][3] = 58,
+       [0][0][0][0][RTW89_QATAR][3] = 58,
+       [0][0][0][0][RTW89_UK][3] = 58,
+       [0][0][0][0][RTW89_FCC][4] = 78,
+       [0][0][0][0][RTW89_ETSI][4] = 58,
+       [0][0][0][0][RTW89_MKK][4] = 68,
+       [0][0][0][0][RTW89_IC][4] = 78,
+       [0][0][0][0][RTW89_KCC][4] = 70,
+       [0][0][0][0][RTW89_ACMA][4] = 58,
+       [0][0][0][0][RTW89_CHILE][4] = 64,
+       [0][0][0][0][RTW89_UKRAINE][4] = 58,
+       [0][0][0][0][RTW89_MEXICO][4] = 78,
+       [0][0][0][0][RTW89_CN][4] = 58,
+       [0][0][0][0][RTW89_QATAR][4] = 58,
+       [0][0][0][0][RTW89_UK][4] = 58,
+       [0][0][0][0][RTW89_FCC][5] = 78,
+       [0][0][0][0][RTW89_ETSI][5] = 58,
+       [0][0][0][0][RTW89_MKK][5] = 68,
+       [0][0][0][0][RTW89_IC][5] = 78,
+       [0][0][0][0][RTW89_KCC][5] = 70,
+       [0][0][0][0][RTW89_ACMA][5] = 58,
+       [0][0][0][0][RTW89_CHILE][5] = 64,
+       [0][0][0][0][RTW89_UKRAINE][5] = 58,
+       [0][0][0][0][RTW89_MEXICO][5] = 78,
+       [0][0][0][0][RTW89_CN][5] = 58,
+       [0][0][0][0][RTW89_QATAR][5] = 58,
+       [0][0][0][0][RTW89_UK][5] = 58,
+       [0][0][0][0][RTW89_FCC][6] = 78,
+       [0][0][0][0][RTW89_ETSI][6] = 58,
+       [0][0][0][0][RTW89_MKK][6] = 68,
+       [0][0][0][0][RTW89_IC][6] = 78,
+       [0][0][0][0][RTW89_KCC][6] = 70,
+       [0][0][0][0][RTW89_ACMA][6] = 58,
+       [0][0][0][0][RTW89_CHILE][6] = 64,
+       [0][0][0][0][RTW89_UKRAINE][6] = 58,
+       [0][0][0][0][RTW89_MEXICO][6] = 78,
+       [0][0][0][0][RTW89_CN][6] = 58,
+       [0][0][0][0][RTW89_QATAR][6] = 58,
+       [0][0][0][0][RTW89_UK][6] = 58,
+       [0][0][0][0][RTW89_FCC][7] = 78,
+       [0][0][0][0][RTW89_ETSI][7] = 58,
+       [0][0][0][0][RTW89_MKK][7] = 68,
+       [0][0][0][0][RTW89_IC][7] = 78,
+       [0][0][0][0][RTW89_KCC][7] = 70,
+       [0][0][0][0][RTW89_ACMA][7] = 58,
+       [0][0][0][0][RTW89_CHILE][7] = 64,
+       [0][0][0][0][RTW89_UKRAINE][7] = 58,
+       [0][0][0][0][RTW89_MEXICO][7] = 78,
+       [0][0][0][0][RTW89_CN][7] = 58,
+       [0][0][0][0][RTW89_QATAR][7] = 58,
+       [0][0][0][0][RTW89_UK][7] = 58,
+       [0][0][0][0][RTW89_FCC][8] = 78,
+       [0][0][0][0][RTW89_ETSI][8] = 58,
+       [0][0][0][0][RTW89_MKK][8] = 68,
+       [0][0][0][0][RTW89_IC][8] = 78,
+       [0][0][0][0][RTW89_KCC][8] = 70,
+       [0][0][0][0][RTW89_ACMA][8] = 58,
+       [0][0][0][0][RTW89_CHILE][8] = 64,
+       [0][0][0][0][RTW89_UKRAINE][8] = 58,
+       [0][0][0][0][RTW89_MEXICO][8] = 78,
+       [0][0][0][0][RTW89_CN][8] = 58,
+       [0][0][0][0][RTW89_QATAR][8] = 58,
+       [0][0][0][0][RTW89_UK][8] = 58,
+       [0][0][0][0][RTW89_FCC][9] = 78,
+       [0][0][0][0][RTW89_ETSI][9] = 58,
+       [0][0][0][0][RTW89_MKK][9] = 68,
+       [0][0][0][0][RTW89_IC][9] = 78,
+       [0][0][0][0][RTW89_KCC][9] = 70,
+       [0][0][0][0][RTW89_ACMA][9] = 58,
+       [0][0][0][0][RTW89_CHILE][9] = 64,
+       [0][0][0][0][RTW89_UKRAINE][9] = 58,
+       [0][0][0][0][RTW89_MEXICO][9] = 78,
+       [0][0][0][0][RTW89_CN][9] = 58,
+       [0][0][0][0][RTW89_QATAR][9] = 58,
+       [0][0][0][0][RTW89_UK][9] = 58,
+       [0][0][0][0][RTW89_FCC][10] = 78,
+       [0][0][0][0][RTW89_ETSI][10] = 58,
+       [0][0][0][0][RTW89_MKK][10] = 68,
+       [0][0][0][0][RTW89_IC][10] = 78,
+       [0][0][0][0][RTW89_KCC][10] = 70,
+       [0][0][0][0][RTW89_ACMA][10] = 58,
+       [0][0][0][0][RTW89_CHILE][10] = 66,
+       [0][0][0][0][RTW89_UKRAINE][10] = 58,
+       [0][0][0][0][RTW89_MEXICO][10] = 78,
+       [0][0][0][0][RTW89_CN][10] = 58,
+       [0][0][0][0][RTW89_QATAR][10] = 58,
+       [0][0][0][0][RTW89_UK][10] = 58,
+       [0][0][0][0][RTW89_FCC][11] = 70,
+       [0][0][0][0][RTW89_ETSI][11] = 58,
+       [0][0][0][0][RTW89_MKK][11] = 68,
+       [0][0][0][0][RTW89_IC][11] = 70,
+       [0][0][0][0][RTW89_KCC][11] = 70,
+       [0][0][0][0][RTW89_ACMA][11] = 58,
+       [0][0][0][0][RTW89_CHILE][11] = 64,
+       [0][0][0][0][RTW89_UKRAINE][11] = 58,
+       [0][0][0][0][RTW89_MEXICO][11] = 70,
+       [0][0][0][0][RTW89_CN][11] = 58,
+       [0][0][0][0][RTW89_QATAR][11] = 58,
+       [0][0][0][0][RTW89_UK][11] = 58,
+       [0][0][0][0][RTW89_FCC][12] = 56,
+       [0][0][0][0][RTW89_ETSI][12] = 58,
+       [0][0][0][0][RTW89_MKK][12] = 68,
+       [0][0][0][0][RTW89_IC][12] = 56,
+       [0][0][0][0][RTW89_KCC][12] = 70,
+       [0][0][0][0][RTW89_ACMA][12] = 58,
+       [0][0][0][0][RTW89_CHILE][12] = 56,
+       [0][0][0][0][RTW89_UKRAINE][12] = 58,
+       [0][0][0][0][RTW89_MEXICO][12] = 56,
+       [0][0][0][0][RTW89_CN][12] = 58,
+       [0][0][0][0][RTW89_QATAR][12] = 58,
+       [0][0][0][0][RTW89_UK][12] = 58,
+       [0][0][0][0][RTW89_FCC][13] = 127,
+       [0][0][0][0][RTW89_ETSI][13] = 127,
+       [0][0][0][0][RTW89_MKK][13] = 76,
+       [0][0][0][0][RTW89_IC][13] = 127,
+       [0][0][0][0][RTW89_KCC][13] = 127,
+       [0][0][0][0][RTW89_ACMA][13] = 127,
+       [0][0][0][0][RTW89_CHILE][13] = 127,
+       [0][0][0][0][RTW89_UKRAINE][13] = 127,
+       [0][0][0][0][RTW89_MEXICO][13] = 127,
+       [0][0][0][0][RTW89_CN][13] = 127,
+       [0][0][0][0][RTW89_QATAR][13] = 127,
+       [0][0][0][0][RTW89_UK][13] = 127,
+       [0][1][0][0][RTW89_FCC][0] = 74,
+       [0][1][0][0][RTW89_ETSI][0] = 46,
+       [0][1][0][0][RTW89_MKK][0] = 56,
+       [0][1][0][0][RTW89_IC][0] = 74,
+       [0][1][0][0][RTW89_KCC][0] = 58,
+       [0][1][0][0][RTW89_ACMA][0] = 46,
+       [0][1][0][0][RTW89_CHILE][0] = 50,
+       [0][1][0][0][RTW89_UKRAINE][0] = 46,
+       [0][1][0][0][RTW89_MEXICO][0] = 74,
+       [0][1][0][0][RTW89_CN][0] = 46,
+       [0][1][0][0][RTW89_QATAR][0] = 46,
+       [0][1][0][0][RTW89_UK][0] = 46,
+       [0][1][0][0][RTW89_FCC][1] = 74,
+       [0][1][0][0][RTW89_ETSI][1] = 46,
+       [0][1][0][0][RTW89_MKK][1] = 56,
+       [0][1][0][0][RTW89_IC][1] = 74,
+       [0][1][0][0][RTW89_KCC][1] = 58,
+       [0][1][0][0][RTW89_ACMA][1] = 46,
+       [0][1][0][0][RTW89_CHILE][1] = 50,
+       [0][1][0][0][RTW89_UKRAINE][1] = 46,
+       [0][1][0][0][RTW89_MEXICO][1] = 74,
+       [0][1][0][0][RTW89_CN][1] = 46,
+       [0][1][0][0][RTW89_QATAR][1] = 46,
+       [0][1][0][0][RTW89_UK][1] = 46,
+       [0][1][0][0][RTW89_FCC][2] = 74,
+       [0][1][0][0][RTW89_ETSI][2] = 46,
+       [0][1][0][0][RTW89_MKK][2] = 56,
+       [0][1][0][0][RTW89_IC][2] = 74,
+       [0][1][0][0][RTW89_KCC][2] = 58,
+       [0][1][0][0][RTW89_ACMA][2] = 46,
+       [0][1][0][0][RTW89_CHILE][2] = 50,
+       [0][1][0][0][RTW89_UKRAINE][2] = 46,
+       [0][1][0][0][RTW89_MEXICO][2] = 74,
+       [0][1][0][0][RTW89_CN][2] = 46,
+       [0][1][0][0][RTW89_QATAR][2] = 46,
+       [0][1][0][0][RTW89_UK][2] = 46,
+       [0][1][0][0][RTW89_FCC][3] = 74,
+       [0][1][0][0][RTW89_ETSI][3] = 46,
+       [0][1][0][0][RTW89_MKK][3] = 56,
+       [0][1][0][0][RTW89_IC][3] = 74,
+       [0][1][0][0][RTW89_KCC][3] = 58,
+       [0][1][0][0][RTW89_ACMA][3] = 46,
+       [0][1][0][0][RTW89_CHILE][3] = 50,
+       [0][1][0][0][RTW89_UKRAINE][3] = 46,
+       [0][1][0][0][RTW89_MEXICO][3] = 74,
+       [0][1][0][0][RTW89_CN][3] = 46,
+       [0][1][0][0][RTW89_QATAR][3] = 46,
+       [0][1][0][0][RTW89_UK][3] = 46,
+       [0][1][0][0][RTW89_FCC][4] = 74,
+       [0][1][0][0][RTW89_ETSI][4] = 46,
+       [0][1][0][0][RTW89_MKK][4] = 56,
+       [0][1][0][0][RTW89_IC][4] = 74,
+       [0][1][0][0][RTW89_KCC][4] = 56,
+       [0][1][0][0][RTW89_ACMA][4] = 46,
+       [0][1][0][0][RTW89_CHILE][4] = 50,
+       [0][1][0][0][RTW89_UKRAINE][4] = 46,
+       [0][1][0][0][RTW89_MEXICO][4] = 74,
+       [0][1][0][0][RTW89_CN][4] = 46,
+       [0][1][0][0][RTW89_QATAR][4] = 46,
+       [0][1][0][0][RTW89_UK][4] = 46,
+       [0][1][0][0][RTW89_FCC][5] = 74,
+       [0][1][0][0][RTW89_ETSI][5] = 46,
+       [0][1][0][0][RTW89_MKK][5] = 56,
+       [0][1][0][0][RTW89_IC][5] = 74,
+       [0][1][0][0][RTW89_KCC][5] = 56,
+       [0][1][0][0][RTW89_ACMA][5] = 46,
+       [0][1][0][0][RTW89_CHILE][5] = 50,
+       [0][1][0][0][RTW89_UKRAINE][5] = 46,
+       [0][1][0][0][RTW89_MEXICO][5] = 74,
+       [0][1][0][0][RTW89_CN][5] = 46,
+       [0][1][0][0][RTW89_QATAR][5] = 46,
+       [0][1][0][0][RTW89_UK][5] = 46,
+       [0][1][0][0][RTW89_FCC][6] = 74,
+       [0][1][0][0][RTW89_ETSI][6] = 46,
+       [0][1][0][0][RTW89_MKK][6] = 56,
+       [0][1][0][0][RTW89_IC][6] = 74,
+       [0][1][0][0][RTW89_KCC][6] = 56,
+       [0][1][0][0][RTW89_ACMA][6] = 46,
+       [0][1][0][0][RTW89_CHILE][6] = 52,
+       [0][1][0][0][RTW89_UKRAINE][6] = 46,
+       [0][1][0][0][RTW89_MEXICO][6] = 74,
+       [0][1][0][0][RTW89_CN][6] = 46,
+       [0][1][0][0][RTW89_QATAR][6] = 46,
+       [0][1][0][0][RTW89_UK][6] = 46,
+       [0][1][0][0][RTW89_FCC][7] = 74,
+       [0][1][0][0][RTW89_ETSI][7] = 46,
+       [0][1][0][0][RTW89_MKK][7] = 56,
+       [0][1][0][0][RTW89_IC][7] = 74,
+       [0][1][0][0][RTW89_KCC][7] = 56,
+       [0][1][0][0][RTW89_ACMA][7] = 46,
+       [0][1][0][0][RTW89_CHILE][7] = 50,
+       [0][1][0][0][RTW89_UKRAINE][7] = 46,
+       [0][1][0][0][RTW89_MEXICO][7] = 74,
+       [0][1][0][0][RTW89_CN][7] = 46,
+       [0][1][0][0][RTW89_QATAR][7] = 46,
+       [0][1][0][0][RTW89_UK][7] = 46,
+       [0][1][0][0][RTW89_FCC][8] = 74,
+       [0][1][0][0][RTW89_ETSI][8] = 46,
+       [0][1][0][0][RTW89_MKK][8] = 56,
+       [0][1][0][0][RTW89_IC][8] = 74,
+       [0][1][0][0][RTW89_KCC][8] = 56,
+       [0][1][0][0][RTW89_ACMA][8] = 46,
+       [0][1][0][0][RTW89_CHILE][8] = 50,
+       [0][1][0][0][RTW89_UKRAINE][8] = 46,
+       [0][1][0][0][RTW89_MEXICO][8] = 74,
+       [0][1][0][0][RTW89_CN][8] = 46,
+       [0][1][0][0][RTW89_QATAR][8] = 46,
+       [0][1][0][0][RTW89_UK][8] = 46,
+       [0][1][0][0][RTW89_FCC][9] = 74,
+       [0][1][0][0][RTW89_ETSI][9] = 46,
+       [0][1][0][0][RTW89_MKK][9] = 56,
+       [0][1][0][0][RTW89_IC][9] = 74,
+       [0][1][0][0][RTW89_KCC][9] = 54,
+       [0][1][0][0][RTW89_ACMA][9] = 46,
+       [0][1][0][0][RTW89_CHILE][9] = 50,
+       [0][1][0][0][RTW89_UKRAINE][9] = 46,
+       [0][1][0][0][RTW89_MEXICO][9] = 74,
+       [0][1][0][0][RTW89_CN][9] = 46,
+       [0][1][0][0][RTW89_QATAR][9] = 46,
+       [0][1][0][0][RTW89_UK][9] = 46,
+       [0][1][0][0][RTW89_FCC][10] = 74,
+       [0][1][0][0][RTW89_ETSI][10] = 46,
+       [0][1][0][0][RTW89_MKK][10] = 56,
+       [0][1][0][0][RTW89_IC][10] = 74,
+       [0][1][0][0][RTW89_KCC][10] = 54,
+       [0][1][0][0][RTW89_ACMA][10] = 46,
+       [0][1][0][0][RTW89_CHILE][10] = 52,
+       [0][1][0][0][RTW89_UKRAINE][10] = 46,
+       [0][1][0][0][RTW89_MEXICO][10] = 74,
+       [0][1][0][0][RTW89_CN][10] = 46,
+       [0][1][0][0][RTW89_QATAR][10] = 46,
+       [0][1][0][0][RTW89_UK][10] = 46,
+       [0][1][0][0][RTW89_FCC][11] = 54,
+       [0][1][0][0][RTW89_ETSI][11] = 46,
+       [0][1][0][0][RTW89_MKK][11] = 56,
+       [0][1][0][0][RTW89_IC][11] = 54,
+       [0][1][0][0][RTW89_KCC][11] = 54,
+       [0][1][0][0][RTW89_ACMA][11] = 46,
+       [0][1][0][0][RTW89_CHILE][11] = 50,
+       [0][1][0][0][RTW89_UKRAINE][11] = 46,
+       [0][1][0][0][RTW89_MEXICO][11] = 54,
+       [0][1][0][0][RTW89_CN][11] = 46,
+       [0][1][0][0][RTW89_QATAR][11] = 46,
+       [0][1][0][0][RTW89_UK][11] = 46,
+       [0][1][0][0][RTW89_FCC][12] = 42,
+       [0][1][0][0][RTW89_ETSI][12] = 46,
+       [0][1][0][0][RTW89_MKK][12] = 56,
+       [0][1][0][0][RTW89_IC][12] = 42,
+       [0][1][0][0][RTW89_KCC][12] = 54,
+       [0][1][0][0][RTW89_ACMA][12] = 46,
+       [0][1][0][0][RTW89_CHILE][12] = 42,
+       [0][1][0][0][RTW89_UKRAINE][12] = 46,
+       [0][1][0][0][RTW89_MEXICO][12] = 42,
+       [0][1][0][0][RTW89_CN][12] = 46,
+       [0][1][0][0][RTW89_QATAR][12] = 46,
+       [0][1][0][0][RTW89_UK][12] = 46,
+       [0][1][0][0][RTW89_FCC][13] = 127,
+       [0][1][0][0][RTW89_ETSI][13] = 127,
+       [0][1][0][0][RTW89_MKK][13] = 64,
+       [0][1][0][0][RTW89_IC][13] = 127,
+       [0][1][0][0][RTW89_KCC][13] = 127,
+       [0][1][0][0][RTW89_ACMA][13] = 127,
+       [0][1][0][0][RTW89_CHILE][13] = 127,
+       [0][1][0][0][RTW89_UKRAINE][13] = 127,
+       [0][1][0][0][RTW89_MEXICO][13] = 127,
+       [0][1][0][0][RTW89_CN][13] = 127,
+       [0][1][0][0][RTW89_QATAR][13] = 127,
+       [0][1][0][0][RTW89_UK][13] = 127,
+       [1][0][0][0][RTW89_FCC][0] = 127,
+       [1][0][0][0][RTW89_ETSI][0] = 127,
+       [1][0][0][0][RTW89_MKK][0] = 127,
+       [1][0][0][0][RTW89_IC][0] = 127,
+       [1][0][0][0][RTW89_KCC][0] = 127,
+       [1][0][0][0][RTW89_ACMA][0] = 127,
+       [1][0][0][0][RTW89_CHILE][0] = 127,
+       [1][0][0][0][RTW89_UKRAINE][0] = 127,
+       [1][0][0][0][RTW89_MEXICO][0] = 127,
+       [1][0][0][0][RTW89_CN][0] = 127,
+       [1][0][0][0][RTW89_QATAR][0] = 127,
+       [1][0][0][0][RTW89_UK][0] = 127,
+       [1][0][0][0][RTW89_FCC][1] = 127,
+       [1][0][0][0][RTW89_ETSI][1] = 127,
+       [1][0][0][0][RTW89_MKK][1] = 127,
+       [1][0][0][0][RTW89_IC][1] = 127,
+       [1][0][0][0][RTW89_KCC][1] = 127,
+       [1][0][0][0][RTW89_ACMA][1] = 127,
+       [1][0][0][0][RTW89_CHILE][1] = 127,
+       [1][0][0][0][RTW89_UKRAINE][1] = 127,
+       [1][0][0][0][RTW89_MEXICO][1] = 127,
+       [1][0][0][0][RTW89_CN][1] = 127,
+       [1][0][0][0][RTW89_QATAR][1] = 127,
+       [1][0][0][0][RTW89_UK][1] = 127,
+       [1][0][0][0][RTW89_FCC][2] = 50,
+       [1][0][0][0][RTW89_ETSI][2] = 58,
+       [1][0][0][0][RTW89_MKK][2] = 76,
+       [1][0][0][0][RTW89_IC][2] = 50,
+       [1][0][0][0][RTW89_KCC][2] = 70,
+       [1][0][0][0][RTW89_ACMA][2] = 58,
+       [1][0][0][0][RTW89_CHILE][2] = 62,
+       [1][0][0][0][RTW89_UKRAINE][2] = 58,
+       [1][0][0][0][RTW89_MEXICO][2] = 50,
+       [1][0][0][0][RTW89_CN][2] = 58,
+       [1][0][0][0][RTW89_QATAR][2] = 58,
+       [1][0][0][0][RTW89_UK][2] = 58,
+       [1][0][0][0][RTW89_FCC][3] = 50,
+       [1][0][0][0][RTW89_ETSI][3] = 58,
+       [1][0][0][0][RTW89_MKK][3] = 76,
+       [1][0][0][0][RTW89_IC][3] = 50,
+       [1][0][0][0][RTW89_KCC][3] = 70,
+       [1][0][0][0][RTW89_ACMA][3] = 58,
+       [1][0][0][0][RTW89_CHILE][3] = 62,
+       [1][0][0][0][RTW89_UKRAINE][3] = 58,
+       [1][0][0][0][RTW89_MEXICO][3] = 50,
+       [1][0][0][0][RTW89_CN][3] = 58,
+       [1][0][0][0][RTW89_QATAR][3] = 58,
+       [1][0][0][0][RTW89_UK][3] = 58,
+       [1][0][0][0][RTW89_FCC][4] = 50,
+       [1][0][0][0][RTW89_ETSI][4] = 58,
+       [1][0][0][0][RTW89_MKK][4] = 76,
+       [1][0][0][0][RTW89_IC][4] = 50,
+       [1][0][0][0][RTW89_KCC][4] = 70,
+       [1][0][0][0][RTW89_ACMA][4] = 58,
+       [1][0][0][0][RTW89_CHILE][4] = 62,
+       [1][0][0][0][RTW89_UKRAINE][4] = 58,
+       [1][0][0][0][RTW89_MEXICO][4] = 50,
+       [1][0][0][0][RTW89_CN][4] = 58,
+       [1][0][0][0][RTW89_QATAR][4] = 58,
+       [1][0][0][0][RTW89_UK][4] = 58,
+       [1][0][0][0][RTW89_FCC][5] = 66,
+       [1][0][0][0][RTW89_ETSI][5] = 58,
+       [1][0][0][0][RTW89_MKK][5] = 76,
+       [1][0][0][0][RTW89_IC][5] = 66,
+       [1][0][0][0][RTW89_KCC][5] = 70,
+       [1][0][0][0][RTW89_ACMA][5] = 58,
+       [1][0][0][0][RTW89_CHILE][5] = 62,
+       [1][0][0][0][RTW89_UKRAINE][5] = 58,
+       [1][0][0][0][RTW89_MEXICO][5] = 66,
+       [1][0][0][0][RTW89_CN][5] = 58,
+       [1][0][0][0][RTW89_QATAR][5] = 58,
+       [1][0][0][0][RTW89_UK][5] = 58,
+       [1][0][0][0][RTW89_FCC][6] = 50,
+       [1][0][0][0][RTW89_ETSI][6] = 58,
+       [1][0][0][0][RTW89_MKK][6] = 76,
+       [1][0][0][0][RTW89_IC][6] = 50,
+       [1][0][0][0][RTW89_KCC][6] = 70,
+       [1][0][0][0][RTW89_ACMA][6] = 58,
+       [1][0][0][0][RTW89_CHILE][6] = 62,
+       [1][0][0][0][RTW89_UKRAINE][6] = 58,
+       [1][0][0][0][RTW89_MEXICO][6] = 50,
+       [1][0][0][0][RTW89_CN][6] = 58,
+       [1][0][0][0][RTW89_QATAR][6] = 58,
+       [1][0][0][0][RTW89_UK][6] = 58,
+       [1][0][0][0][RTW89_FCC][7] = 50,
+       [1][0][0][0][RTW89_ETSI][7] = 58,
+       [1][0][0][0][RTW89_MKK][7] = 76,
+       [1][0][0][0][RTW89_IC][7] = 50,
+       [1][0][0][0][RTW89_KCC][7] = 70,
+       [1][0][0][0][RTW89_ACMA][7] = 58,
+       [1][0][0][0][RTW89_CHILE][7] = 62,
+       [1][0][0][0][RTW89_UKRAINE][7] = 58,
+       [1][0][0][0][RTW89_MEXICO][7] = 50,
+       [1][0][0][0][RTW89_CN][7] = 58,
+       [1][0][0][0][RTW89_QATAR][7] = 58,
+       [1][0][0][0][RTW89_UK][7] = 58,
+       [1][0][0][0][RTW89_FCC][8] = 50,
+       [1][0][0][0][RTW89_ETSI][8] = 58,
+       [1][0][0][0][RTW89_MKK][8] = 76,
+       [1][0][0][0][RTW89_IC][8] = 50,
+       [1][0][0][0][RTW89_KCC][8] = 70,
+       [1][0][0][0][RTW89_ACMA][8] = 58,
+       [1][0][0][0][RTW89_CHILE][8] = 62,
+       [1][0][0][0][RTW89_UKRAINE][8] = 58,
+       [1][0][0][0][RTW89_MEXICO][8] = 50,
+       [1][0][0][0][RTW89_CN][8] = 58,
+       [1][0][0][0][RTW89_QATAR][8] = 58,
+       [1][0][0][0][RTW89_UK][8] = 58,
+       [1][0][0][0][RTW89_FCC][9] = 42,
+       [1][0][0][0][RTW89_ETSI][9] = 58,
+       [1][0][0][0][RTW89_MKK][9] = 76,
+       [1][0][0][0][RTW89_IC][9] = 42,
+       [1][0][0][0][RTW89_KCC][9] = 70,
+       [1][0][0][0][RTW89_ACMA][9] = 58,
+       [1][0][0][0][RTW89_CHILE][9] = 42,
+       [1][0][0][0][RTW89_UKRAINE][9] = 58,
+       [1][0][0][0][RTW89_MEXICO][9] = 42,
+       [1][0][0][0][RTW89_CN][9] = 58,
+       [1][0][0][0][RTW89_QATAR][9] = 58,
+       [1][0][0][0][RTW89_UK][9] = 58,
+       [1][0][0][0][RTW89_FCC][10] = 30,
+       [1][0][0][0][RTW89_ETSI][10] = 58,
+       [1][0][0][0][RTW89_MKK][10] = 72,
+       [1][0][0][0][RTW89_IC][10] = 30,
+       [1][0][0][0][RTW89_KCC][10] = 70,
+       [1][0][0][0][RTW89_ACMA][10] = 58,
+       [1][0][0][0][RTW89_CHILE][10] = 30,
+       [1][0][0][0][RTW89_UKRAINE][10] = 58,
+       [1][0][0][0][RTW89_MEXICO][10] = 30,
+       [1][0][0][0][RTW89_CN][10] = 58,
+       [1][0][0][0][RTW89_QATAR][10] = 58,
+       [1][0][0][0][RTW89_UK][10] = 58,
+       [1][0][0][0][RTW89_FCC][11] = 127,
+       [1][0][0][0][RTW89_ETSI][11] = 127,
+       [1][0][0][0][RTW89_MKK][11] = 127,
+       [1][0][0][0][RTW89_IC][11] = 127,
+       [1][0][0][0][RTW89_KCC][11] = 127,
+       [1][0][0][0][RTW89_ACMA][11] = 127,
+       [1][0][0][0][RTW89_CHILE][11] = 127,
+       [1][0][0][0][RTW89_UKRAINE][11] = 127,
+       [1][0][0][0][RTW89_MEXICO][11] = 127,
+       [1][0][0][0][RTW89_CN][11] = 127,
+       [1][0][0][0][RTW89_QATAR][11] = 127,
+       [1][0][0][0][RTW89_UK][11] = 127,
+       [1][0][0][0][RTW89_FCC][12] = 127,
+       [1][0][0][0][RTW89_ETSI][12] = 127,
+       [1][0][0][0][RTW89_MKK][12] = 127,
+       [1][0][0][0][RTW89_IC][12] = 127,
+       [1][0][0][0][RTW89_KCC][12] = 127,
+       [1][0][0][0][RTW89_ACMA][12] = 127,
+       [1][0][0][0][RTW89_CHILE][12] = 127,
+       [1][0][0][0][RTW89_UKRAINE][12] = 127,
+       [1][0][0][0][RTW89_MEXICO][12] = 127,
+       [1][0][0][0][RTW89_CN][12] = 127,
+       [1][0][0][0][RTW89_QATAR][12] = 127,
+       [1][0][0][0][RTW89_UK][12] = 127,
+       [1][0][0][0][RTW89_FCC][13] = 127,
+       [1][0][0][0][RTW89_ETSI][13] = 127,
+       [1][0][0][0][RTW89_MKK][13] = 127,
+       [1][0][0][0][RTW89_IC][13] = 127,
+       [1][0][0][0][RTW89_KCC][13] = 127,
+       [1][0][0][0][RTW89_ACMA][13] = 127,
+       [1][0][0][0][RTW89_CHILE][13] = 127,
+       [1][0][0][0][RTW89_UKRAINE][13] = 127,
+       [1][0][0][0][RTW89_MEXICO][13] = 127,
+       [1][0][0][0][RTW89_CN][13] = 127,
+       [1][0][0][0][RTW89_QATAR][13] = 127,
+       [1][0][0][0][RTW89_UK][13] = 127,
+       [1][1][0][0][RTW89_FCC][0] = 127,
+       [1][1][0][0][RTW89_ETSI][0] = 127,
+       [1][1][0][0][RTW89_MKK][0] = 127,
+       [1][1][0][0][RTW89_IC][0] = 127,
+       [1][1][0][0][RTW89_KCC][0] = 127,
+       [1][1][0][0][RTW89_ACMA][0] = 127,
+       [1][1][0][0][RTW89_CHILE][0] = 127,
+       [1][1][0][0][RTW89_UKRAINE][0] = 127,
+       [1][1][0][0][RTW89_MEXICO][0] = 127,
+       [1][1][0][0][RTW89_CN][0] = 127,
+       [1][1][0][0][RTW89_QATAR][0] = 127,
+       [1][1][0][0][RTW89_UK][0] = 127,
+       [1][1][0][0][RTW89_FCC][1] = 127,
+       [1][1][0][0][RTW89_ETSI][1] = 127,
+       [1][1][0][0][RTW89_MKK][1] = 127,
+       [1][1][0][0][RTW89_IC][1] = 127,
+       [1][1][0][0][RTW89_KCC][1] = 127,
+       [1][1][0][0][RTW89_ACMA][1] = 127,
+       [1][1][0][0][RTW89_CHILE][1] = 127,
+       [1][1][0][0][RTW89_UKRAINE][1] = 127,
+       [1][1][0][0][RTW89_MEXICO][1] = 127,
+       [1][1][0][0][RTW89_CN][1] = 127,
+       [1][1][0][0][RTW89_QATAR][1] = 127,
+       [1][1][0][0][RTW89_UK][1] = 127,
+       [1][1][0][0][RTW89_FCC][2] = 46,
+       [1][1][0][0][RTW89_ETSI][2] = 46,
+       [1][1][0][0][RTW89_MKK][2] = 64,
+       [1][1][0][0][RTW89_IC][2] = 46,
+       [1][1][0][0][RTW89_KCC][2] = 58,
+       [1][1][0][0][RTW89_ACMA][2] = 46,
+       [1][1][0][0][RTW89_CHILE][2] = 50,
+       [1][1][0][0][RTW89_UKRAINE][2] = 46,
+       [1][1][0][0][RTW89_MEXICO][2] = 46,
+       [1][1][0][0][RTW89_CN][2] = 46,
+       [1][1][0][0][RTW89_QATAR][2] = 46,
+       [1][1][0][0][RTW89_UK][2] = 46,
+       [1][1][0][0][RTW89_FCC][3] = 46,
+       [1][1][0][0][RTW89_ETSI][3] = 46,
+       [1][1][0][0][RTW89_MKK][3] = 64,
+       [1][1][0][0][RTW89_IC][3] = 46,
+       [1][1][0][0][RTW89_KCC][3] = 58,
+       [1][1][0][0][RTW89_ACMA][3] = 46,
+       [1][1][0][0][RTW89_CHILE][3] = 50,
+       [1][1][0][0][RTW89_UKRAINE][3] = 46,
+       [1][1][0][0][RTW89_MEXICO][3] = 46,
+       [1][1][0][0][RTW89_CN][3] = 46,
+       [1][1][0][0][RTW89_QATAR][3] = 46,
+       [1][1][0][0][RTW89_UK][3] = 46,
+       [1][1][0][0][RTW89_FCC][4] = 46,
+       [1][1][0][0][RTW89_ETSI][4] = 46,
+       [1][1][0][0][RTW89_MKK][4] = 64,
+       [1][1][0][0][RTW89_IC][4] = 46,
+       [1][1][0][0][RTW89_KCC][4] = 58,
+       [1][1][0][0][RTW89_ACMA][4] = 46,
+       [1][1][0][0][RTW89_CHILE][4] = 50,
+       [1][1][0][0][RTW89_UKRAINE][4] = 46,
+       [1][1][0][0][RTW89_MEXICO][4] = 46,
+       [1][1][0][0][RTW89_CN][4] = 46,
+       [1][1][0][0][RTW89_QATAR][4] = 46,
+       [1][1][0][0][RTW89_UK][4] = 46,
+       [1][1][0][0][RTW89_FCC][5] = 62,
+       [1][1][0][0][RTW89_ETSI][5] = 46,
+       [1][1][0][0][RTW89_MKK][5] = 64,
+       [1][1][0][0][RTW89_IC][5] = 62,
+       [1][1][0][0][RTW89_KCC][5] = 58,
+       [1][1][0][0][RTW89_ACMA][5] = 46,
+       [1][1][0][0][RTW89_CHILE][5] = 50,
+       [1][1][0][0][RTW89_UKRAINE][5] = 46,
+       [1][1][0][0][RTW89_MEXICO][5] = 62,
+       [1][1][0][0][RTW89_CN][5] = 46,
+       [1][1][0][0][RTW89_QATAR][5] = 46,
+       [1][1][0][0][RTW89_UK][5] = 46,
+       [1][1][0][0][RTW89_FCC][6] = 34,
+       [1][1][0][0][RTW89_ETSI][6] = 46,
+       [1][1][0][0][RTW89_MKK][6] = 64,
+       [1][1][0][0][RTW89_IC][6] = 34,
+       [1][1][0][0][RTW89_KCC][6] = 58,
+       [1][1][0][0][RTW89_ACMA][6] = 46,
+       [1][1][0][0][RTW89_CHILE][6] = 50,
+       [1][1][0][0][RTW89_UKRAINE][6] = 46,
+       [1][1][0][0][RTW89_MEXICO][6] = 34,
+       [1][1][0][0][RTW89_CN][6] = 46,
+       [1][1][0][0][RTW89_QATAR][6] = 46,
+       [1][1][0][0][RTW89_UK][6] = 46,
+       [1][1][0][0][RTW89_FCC][7] = 34,
+       [1][1][0][0][RTW89_ETSI][7] = 46,
+       [1][1][0][0][RTW89_MKK][7] = 64,
+       [1][1][0][0][RTW89_IC][7] = 34,
+       [1][1][0][0][RTW89_KCC][7] = 58,
+       [1][1][0][0][RTW89_ACMA][7] = 46,
+       [1][1][0][0][RTW89_CHILE][7] = 50,
+       [1][1][0][0][RTW89_UKRAINE][7] = 46,
+       [1][1][0][0][RTW89_MEXICO][7] = 34,
+       [1][1][0][0][RTW89_CN][7] = 46,
+       [1][1][0][0][RTW89_QATAR][7] = 46,
+       [1][1][0][0][RTW89_UK][7] = 46,
+       [1][1][0][0][RTW89_FCC][8] = 34,
+       [1][1][0][0][RTW89_ETSI][8] = 46,
+       [1][1][0][0][RTW89_MKK][8] = 64,
+       [1][1][0][0][RTW89_IC][8] = 34,
+       [1][1][0][0][RTW89_KCC][8] = 58,
+       [1][1][0][0][RTW89_ACMA][8] = 46,
+       [1][1][0][0][RTW89_CHILE][8] = 50,
+       [1][1][0][0][RTW89_UKRAINE][8] = 46,
+       [1][1][0][0][RTW89_MEXICO][8] = 34,
+       [1][1][0][0][RTW89_CN][8] = 46,
+       [1][1][0][0][RTW89_QATAR][8] = 46,
+       [1][1][0][0][RTW89_UK][8] = 46,
+       [1][1][0][0][RTW89_FCC][9] = 30,
+       [1][1][0][0][RTW89_ETSI][9] = 46,
+       [1][1][0][0][RTW89_MKK][9] = 64,
+       [1][1][0][0][RTW89_IC][9] = 30,
+       [1][1][0][0][RTW89_KCC][9] = 58,
+       [1][1][0][0][RTW89_ACMA][9] = 46,
+       [1][1][0][0][RTW89_CHILE][9] = 30,
+       [1][1][0][0][RTW89_UKRAINE][9] = 46,
+       [1][1][0][0][RTW89_MEXICO][9] = 30,
+       [1][1][0][0][RTW89_CN][9] = 46,
+       [1][1][0][0][RTW89_QATAR][9] = 46,
+       [1][1][0][0][RTW89_UK][9] = 46,
+       [1][1][0][0][RTW89_FCC][10] = 30,
+       [1][1][0][0][RTW89_ETSI][10] = 46,
+       [1][1][0][0][RTW89_MKK][10] = 64,
+       [1][1][0][0][RTW89_IC][10] = 30,
+       [1][1][0][0][RTW89_KCC][10] = 58,
+       [1][1][0][0][RTW89_ACMA][10] = 46,
+       [1][1][0][0][RTW89_CHILE][10] = 30,
+       [1][1][0][0][RTW89_UKRAINE][10] = 46,
+       [1][1][0][0][RTW89_MEXICO][10] = 30,
+       [1][1][0][0][RTW89_CN][10] = 46,
+       [1][1][0][0][RTW89_QATAR][10] = 46,
+       [1][1][0][0][RTW89_UK][10] = 46,
+       [1][1][0][0][RTW89_FCC][11] = 127,
+       [1][1][0][0][RTW89_ETSI][11] = 127,
+       [1][1][0][0][RTW89_MKK][11] = 127,
+       [1][1][0][0][RTW89_IC][11] = 127,
+       [1][1][0][0][RTW89_KCC][11] = 127,
+       [1][1][0][0][RTW89_ACMA][11] = 127,
+       [1][1][0][0][RTW89_CHILE][11] = 127,
+       [1][1][0][0][RTW89_UKRAINE][11] = 127,
+       [1][1][0][0][RTW89_MEXICO][11] = 127,
+       [1][1][0][0][RTW89_CN][11] = 127,
+       [1][1][0][0][RTW89_QATAR][11] = 127,
+       [1][1][0][0][RTW89_UK][11] = 127,
+       [1][1][0][0][RTW89_FCC][12] = 127,
+       [1][1][0][0][RTW89_ETSI][12] = 127,
+       [1][1][0][0][RTW89_MKK][12] = 127,
+       [1][1][0][0][RTW89_IC][12] = 127,
+       [1][1][0][0][RTW89_KCC][12] = 127,
+       [1][1][0][0][RTW89_ACMA][12] = 127,
+       [1][1][0][0][RTW89_CHILE][12] = 127,
+       [1][1][0][0][RTW89_UKRAINE][12] = 127,
+       [1][1][0][0][RTW89_MEXICO][12] = 127,
+       [1][1][0][0][RTW89_CN][12] = 127,
+       [1][1][0][0][RTW89_QATAR][12] = 127,
+       [1][1][0][0][RTW89_UK][12] = 127,
+       [1][1][0][0][RTW89_FCC][13] = 127,
+       [1][1][0][0][RTW89_ETSI][13] = 127,
+       [1][1][0][0][RTW89_MKK][13] = 127,
+       [1][1][0][0][RTW89_IC][13] = 127,
+       [1][1][0][0][RTW89_KCC][13] = 127,
+       [1][1][0][0][RTW89_ACMA][13] = 127,
+       [1][1][0][0][RTW89_CHILE][13] = 127,
+       [1][1][0][0][RTW89_UKRAINE][13] = 127,
+       [1][1][0][0][RTW89_MEXICO][13] = 127,
+       [1][1][0][0][RTW89_CN][13] = 127,
+       [1][1][0][0][RTW89_QATAR][13] = 127,
+       [1][1][0][0][RTW89_UK][13] = 127,
+       [0][0][1][0][RTW89_FCC][0] = 76,
+       [0][0][1][0][RTW89_ETSI][0] = 58,
+       [0][0][1][0][RTW89_MKK][0] = 74,
+       [0][0][1][0][RTW89_IC][0] = 76,
+       [0][0][1][0][RTW89_KCC][0] = 76,
+       [0][0][1][0][RTW89_ACMA][0] = 58,
+       [0][0][1][0][RTW89_CHILE][0] = 66,
+       [0][0][1][0][RTW89_UKRAINE][0] = 58,
+       [0][0][1][0][RTW89_MEXICO][0] = 76,
+       [0][0][1][0][RTW89_CN][0] = 58,
+       [0][0][1][0][RTW89_QATAR][0] = 58,
+       [0][0][1][0][RTW89_UK][0] = 58,
+       [0][0][1][0][RTW89_FCC][1] = 76,
+       [0][0][1][0][RTW89_ETSI][1] = 58,
+       [0][0][1][0][RTW89_MKK][1] = 76,
+       [0][0][1][0][RTW89_IC][1] = 76,
+       [0][0][1][0][RTW89_KCC][1] = 76,
+       [0][0][1][0][RTW89_ACMA][1] = 58,
+       [0][0][1][0][RTW89_CHILE][1] = 66,
+       [0][0][1][0][RTW89_UKRAINE][1] = 58,
+       [0][0][1][0][RTW89_MEXICO][1] = 76,
+       [0][0][1][0][RTW89_CN][1] = 58,
+       [0][0][1][0][RTW89_QATAR][1] = 58,
+       [0][0][1][0][RTW89_UK][1] = 58,
+       [0][0][1][0][RTW89_FCC][2] = 78,
+       [0][0][1][0][RTW89_ETSI][2] = 58,
+       [0][0][1][0][RTW89_MKK][2] = 76,
+       [0][0][1][0][RTW89_IC][2] = 78,
+       [0][0][1][0][RTW89_KCC][2] = 76,
+       [0][0][1][0][RTW89_ACMA][2] = 58,
+       [0][0][1][0][RTW89_CHILE][2] = 66,
+       [0][0][1][0][RTW89_UKRAINE][2] = 58,
+       [0][0][1][0][RTW89_MEXICO][2] = 78,
+       [0][0][1][0][RTW89_CN][2] = 58,
+       [0][0][1][0][RTW89_QATAR][2] = 58,
+       [0][0][1][0][RTW89_UK][2] = 58,
+       [0][0][1][0][RTW89_FCC][3] = 78,
+       [0][0][1][0][RTW89_ETSI][3] = 58,
+       [0][0][1][0][RTW89_MKK][3] = 76,
+       [0][0][1][0][RTW89_IC][3] = 78,
+       [0][0][1][0][RTW89_KCC][3] = 76,
+       [0][0][1][0][RTW89_ACMA][3] = 58,
+       [0][0][1][0][RTW89_CHILE][3] = 66,
+       [0][0][1][0][RTW89_UKRAINE][3] = 58,
+       [0][0][1][0][RTW89_MEXICO][3] = 78,
+       [0][0][1][0][RTW89_CN][3] = 58,
+       [0][0][1][0][RTW89_QATAR][3] = 58,
+       [0][0][1][0][RTW89_UK][3] = 58,
+       [0][0][1][0][RTW89_FCC][4] = 78,
+       [0][0][1][0][RTW89_ETSI][4] = 58,
+       [0][0][1][0][RTW89_MKK][4] = 76,
+       [0][0][1][0][RTW89_IC][4] = 78,
+       [0][0][1][0][RTW89_KCC][4] = 76,
+       [0][0][1][0][RTW89_ACMA][4] = 58,
+       [0][0][1][0][RTW89_CHILE][4] = 66,
+       [0][0][1][0][RTW89_UKRAINE][4] = 58,
+       [0][0][1][0][RTW89_MEXICO][4] = 78,
+       [0][0][1][0][RTW89_CN][4] = 58,
+       [0][0][1][0][RTW89_QATAR][4] = 58,
+       [0][0][1][0][RTW89_UK][4] = 58,
+       [0][0][1][0][RTW89_FCC][5] = 78,
+       [0][0][1][0][RTW89_ETSI][5] = 58,
+       [0][0][1][0][RTW89_MKK][5] = 76,
+       [0][0][1][0][RTW89_IC][5] = 78,
+       [0][0][1][0][RTW89_KCC][5] = 76,
+       [0][0][1][0][RTW89_ACMA][5] = 58,
+       [0][0][1][0][RTW89_CHILE][5] = 66,
+       [0][0][1][0][RTW89_UKRAINE][5] = 58,
+       [0][0][1][0][RTW89_MEXICO][5] = 78,
+       [0][0][1][0][RTW89_CN][5] = 58,
+       [0][0][1][0][RTW89_QATAR][5] = 58,
+       [0][0][1][0][RTW89_UK][5] = 58,
+       [0][0][1][0][RTW89_FCC][6] = 78,
+       [0][0][1][0][RTW89_ETSI][6] = 58,
+       [0][0][1][0][RTW89_MKK][6] = 76,
+       [0][0][1][0][RTW89_IC][6] = 78,
+       [0][0][1][0][RTW89_KCC][6] = 76,
+       [0][0][1][0][RTW89_ACMA][6] = 58,
+       [0][0][1][0][RTW89_CHILE][6] = 66,
+       [0][0][1][0][RTW89_UKRAINE][6] = 58,
+       [0][0][1][0][RTW89_MEXICO][6] = 78,
+       [0][0][1][0][RTW89_CN][6] = 58,
+       [0][0][1][0][RTW89_QATAR][6] = 58,
+       [0][0][1][0][RTW89_UK][6] = 58,
+       [0][0][1][0][RTW89_FCC][7] = 78,
+       [0][0][1][0][RTW89_ETSI][7] = 58,
+       [0][0][1][0][RTW89_MKK][7] = 76,
+       [0][0][1][0][RTW89_IC][7] = 78,
+       [0][0][1][0][RTW89_KCC][7] = 76,
+       [0][0][1][0][RTW89_ACMA][7] = 58,
+       [0][0][1][0][RTW89_CHILE][7] = 66,
+       [0][0][1][0][RTW89_UKRAINE][7] = 58,
+       [0][0][1][0][RTW89_MEXICO][7] = 78,
+       [0][0][1][0][RTW89_CN][7] = 58,
+       [0][0][1][0][RTW89_QATAR][7] = 58,
+       [0][0][1][0][RTW89_UK][7] = 58,
+       [0][0][1][0][RTW89_FCC][8] = 78,
+       [0][0][1][0][RTW89_ETSI][8] = 58,
+       [0][0][1][0][RTW89_MKK][8] = 76,
+       [0][0][1][0][RTW89_IC][8] = 78,
+       [0][0][1][0][RTW89_KCC][8] = 76,
+       [0][0][1][0][RTW89_ACMA][8] = 58,
+       [0][0][1][0][RTW89_CHILE][8] = 66,
+       [0][0][1][0][RTW89_UKRAINE][8] = 58,
+       [0][0][1][0][RTW89_MEXICO][8] = 78,
+       [0][0][1][0][RTW89_CN][8] = 58,
+       [0][0][1][0][RTW89_QATAR][8] = 58,
+       [0][0][1][0][RTW89_UK][8] = 58,
+       [0][0][1][0][RTW89_FCC][9] = 74,
+       [0][0][1][0][RTW89_ETSI][9] = 58,
+       [0][0][1][0][RTW89_MKK][9] = 76,
+       [0][0][1][0][RTW89_IC][9] = 74,
+       [0][0][1][0][RTW89_KCC][9] = 76,
+       [0][0][1][0][RTW89_ACMA][9] = 58,
+       [0][0][1][0][RTW89_CHILE][9] = 66,
+       [0][0][1][0][RTW89_UKRAINE][9] = 58,
+       [0][0][1][0][RTW89_MEXICO][9] = 74,
+       [0][0][1][0][RTW89_CN][9] = 58,
+       [0][0][1][0][RTW89_QATAR][9] = 58,
+       [0][0][1][0][RTW89_UK][9] = 58,
+       [0][0][1][0][RTW89_FCC][10] = 74,
+       [0][0][1][0][RTW89_ETSI][10] = 58,
+       [0][0][1][0][RTW89_MKK][10] = 76,
+       [0][0][1][0][RTW89_IC][10] = 74,
+       [0][0][1][0][RTW89_KCC][10] = 76,
+       [0][0][1][0][RTW89_ACMA][10] = 58,
+       [0][0][1][0][RTW89_CHILE][10] = 66,
+       [0][0][1][0][RTW89_UKRAINE][10] = 58,
+       [0][0][1][0][RTW89_MEXICO][10] = 74,
+       [0][0][1][0][RTW89_CN][10] = 58,
+       [0][0][1][0][RTW89_QATAR][10] = 58,
+       [0][0][1][0][RTW89_UK][10] = 58,
+       [0][0][1][0][RTW89_FCC][11] = 54,
+       [0][0][1][0][RTW89_ETSI][11] = 58,
+       [0][0][1][0][RTW89_MKK][11] = 76,
+       [0][0][1][0][RTW89_IC][11] = 54,
+       [0][0][1][0][RTW89_KCC][11] = 76,
+       [0][0][1][0][RTW89_ACMA][11] = 58,
+       [0][0][1][0][RTW89_CHILE][11] = 54,
+       [0][0][1][0][RTW89_UKRAINE][11] = 58,
+       [0][0][1][0][RTW89_MEXICO][11] = 54,
+       [0][0][1][0][RTW89_CN][11] = 58,
+       [0][0][1][0][RTW89_QATAR][11] = 58,
+       [0][0][1][0][RTW89_UK][11] = 58,
+       [0][0][1][0][RTW89_FCC][12] = 50,
+       [0][0][1][0][RTW89_ETSI][12] = 58,
+       [0][0][1][0][RTW89_MKK][12] = 76,
+       [0][0][1][0][RTW89_IC][12] = 50,
+       [0][0][1][0][RTW89_KCC][12] = 76,
+       [0][0][1][0][RTW89_ACMA][12] = 58,
+       [0][0][1][0][RTW89_CHILE][12] = 50,
+       [0][0][1][0][RTW89_UKRAINE][12] = 58,
+       [0][0][1][0][RTW89_MEXICO][12] = 50,
+       [0][0][1][0][RTW89_CN][12] = 58,
+       [0][0][1][0][RTW89_QATAR][12] = 58,
+       [0][0][1][0][RTW89_UK][12] = 58,
+       [0][0][1][0][RTW89_FCC][13] = 127,
+       [0][0][1][0][RTW89_ETSI][13] = 127,
+       [0][0][1][0][RTW89_MKK][13] = 127,
+       [0][0][1][0][RTW89_IC][13] = 127,
+       [0][0][1][0][RTW89_KCC][13] = 127,
+       [0][0][1][0][RTW89_ACMA][13] = 127,
+       [0][0][1][0][RTW89_CHILE][13] = 127,
+       [0][0][1][0][RTW89_UKRAINE][13] = 127,
+       [0][0][1][0][RTW89_MEXICO][13] = 127,
+       [0][0][1][0][RTW89_CN][13] = 127,
+       [0][0][1][0][RTW89_QATAR][13] = 127,
+       [0][0][1][0][RTW89_UK][13] = 127,
+       [0][1][1][0][RTW89_FCC][0] = 62,
+       [0][1][1][0][RTW89_ETSI][0] = 46,
+       [0][1][1][0][RTW89_MKK][0] = 64,
+       [0][1][1][0][RTW89_IC][0] = 62,
+       [0][1][1][0][RTW89_KCC][0] = 66,
+       [0][1][1][0][RTW89_ACMA][0] = 46,
+       [0][1][1][0][RTW89_CHILE][0] = 50,
+       [0][1][1][0][RTW89_UKRAINE][0] = 46,
+       [0][1][1][0][RTW89_MEXICO][0] = 62,
+       [0][1][1][0][RTW89_CN][0] = 46,
+       [0][1][1][0][RTW89_QATAR][0] = 46,
+       [0][1][1][0][RTW89_UK][0] = 46,
+       [0][1][1][0][RTW89_FCC][1] = 62,
+       [0][1][1][0][RTW89_ETSI][1] = 46,
+       [0][1][1][0][RTW89_MKK][1] = 64,
+       [0][1][1][0][RTW89_IC][1] = 62,
+       [0][1][1][0][RTW89_KCC][1] = 66,
+       [0][1][1][0][RTW89_ACMA][1] = 46,
+       [0][1][1][0][RTW89_CHILE][1] = 50,
+       [0][1][1][0][RTW89_UKRAINE][1] = 46,
+       [0][1][1][0][RTW89_MEXICO][1] = 62,
+       [0][1][1][0][RTW89_CN][1] = 46,
+       [0][1][1][0][RTW89_QATAR][1] = 46,
+       [0][1][1][0][RTW89_UK][1] = 46,
+       [0][1][1][0][RTW89_FCC][2] = 66,
+       [0][1][1][0][RTW89_ETSI][2] = 46,
+       [0][1][1][0][RTW89_MKK][2] = 64,
+       [0][1][1][0][RTW89_IC][2] = 66,
+       [0][1][1][0][RTW89_KCC][2] = 66,
+       [0][1][1][0][RTW89_ACMA][2] = 46,
+       [0][1][1][0][RTW89_CHILE][2] = 50,
+       [0][1][1][0][RTW89_UKRAINE][2] = 46,
+       [0][1][1][0][RTW89_MEXICO][2] = 66,
+       [0][1][1][0][RTW89_CN][2] = 46,
+       [0][1][1][0][RTW89_QATAR][2] = 46,
+       [0][1][1][0][RTW89_UK][2] = 46,
+       [0][1][1][0][RTW89_FCC][3] = 70,
+       [0][1][1][0][RTW89_ETSI][3] = 46,
+       [0][1][1][0][RTW89_MKK][3] = 64,
+       [0][1][1][0][RTW89_IC][3] = 70,
+       [0][1][1][0][RTW89_KCC][3] = 66,
+       [0][1][1][0][RTW89_ACMA][3] = 46,
+       [0][1][1][0][RTW89_CHILE][3] = 50,
+       [0][1][1][0][RTW89_UKRAINE][3] = 46,
+       [0][1][1][0][RTW89_MEXICO][3] = 70,
+       [0][1][1][0][RTW89_CN][3] = 46,
+       [0][1][1][0][RTW89_QATAR][3] = 46,
+       [0][1][1][0][RTW89_UK][3] = 46,
+       [0][1][1][0][RTW89_FCC][4] = 78,
+       [0][1][1][0][RTW89_ETSI][4] = 46,
+       [0][1][1][0][RTW89_MKK][4] = 64,
+       [0][1][1][0][RTW89_IC][4] = 78,
+       [0][1][1][0][RTW89_KCC][4] = 64,
+       [0][1][1][0][RTW89_ACMA][4] = 46,
+       [0][1][1][0][RTW89_CHILE][4] = 50,
+       [0][1][1][0][RTW89_UKRAINE][4] = 46,
+       [0][1][1][0][RTW89_MEXICO][4] = 78,
+       [0][1][1][0][RTW89_CN][4] = 46,
+       [0][1][1][0][RTW89_QATAR][4] = 46,
+       [0][1][1][0][RTW89_UK][4] = 46,
+       [0][1][1][0][RTW89_FCC][5] = 78,
+       [0][1][1][0][RTW89_ETSI][5] = 46,
+       [0][1][1][0][RTW89_MKK][5] = 64,
+       [0][1][1][0][RTW89_IC][5] = 78,
+       [0][1][1][0][RTW89_KCC][5] = 64,
+       [0][1][1][0][RTW89_ACMA][5] = 46,
+       [0][1][1][0][RTW89_CHILE][5] = 50,
+       [0][1][1][0][RTW89_UKRAINE][5] = 46,
+       [0][1][1][0][RTW89_MEXICO][5] = 78,
+       [0][1][1][0][RTW89_CN][5] = 46,
+       [0][1][1][0][RTW89_QATAR][5] = 46,
+       [0][1][1][0][RTW89_UK][5] = 46,
+       [0][1][1][0][RTW89_FCC][6] = 78,
+       [0][1][1][0][RTW89_ETSI][6] = 46,
+       [0][1][1][0][RTW89_MKK][6] = 64,
+       [0][1][1][0][RTW89_IC][6] = 78,
+       [0][1][1][0][RTW89_KCC][6] = 64,
+       [0][1][1][0][RTW89_ACMA][6] = 46,
+       [0][1][1][0][RTW89_CHILE][6] = 50,
+       [0][1][1][0][RTW89_UKRAINE][6] = 46,
+       [0][1][1][0][RTW89_MEXICO][6] = 78,
+       [0][1][1][0][RTW89_CN][6] = 46,
+       [0][1][1][0][RTW89_QATAR][6] = 46,
+       [0][1][1][0][RTW89_UK][6] = 46,
+       [0][1][1][0][RTW89_FCC][7] = 70,
+       [0][1][1][0][RTW89_ETSI][7] = 46,
+       [0][1][1][0][RTW89_MKK][7] = 64,
+       [0][1][1][0][RTW89_IC][7] = 70,
+       [0][1][1][0][RTW89_KCC][7] = 64,
+       [0][1][1][0][RTW89_ACMA][7] = 46,
+       [0][1][1][0][RTW89_CHILE][7] = 50,
+       [0][1][1][0][RTW89_UKRAINE][7] = 46,
+       [0][1][1][0][RTW89_MEXICO][7] = 70,
+       [0][1][1][0][RTW89_CN][7] = 46,
+       [0][1][1][0][RTW89_QATAR][7] = 46,
+       [0][1][1][0][RTW89_UK][7] = 46,
+       [0][1][1][0][RTW89_FCC][8] = 66,
+       [0][1][1][0][RTW89_ETSI][8] = 46,
+       [0][1][1][0][RTW89_MKK][8] = 64,
+       [0][1][1][0][RTW89_IC][8] = 66,
+       [0][1][1][0][RTW89_KCC][8] = 64,
+       [0][1][1][0][RTW89_ACMA][8] = 46,
+       [0][1][1][0][RTW89_CHILE][8] = 50,
+       [0][1][1][0][RTW89_UKRAINE][8] = 46,
+       [0][1][1][0][RTW89_MEXICO][8] = 66,
+       [0][1][1][0][RTW89_CN][8] = 46,
+       [0][1][1][0][RTW89_QATAR][8] = 46,
+       [0][1][1][0][RTW89_UK][8] = 46,
+       [0][1][1][0][RTW89_FCC][9] = 62,
+       [0][1][1][0][RTW89_ETSI][9] = 46,
+       [0][1][1][0][RTW89_MKK][9] = 64,
+       [0][1][1][0][RTW89_IC][9] = 62,
+       [0][1][1][0][RTW89_KCC][9] = 64,
+       [0][1][1][0][RTW89_ACMA][9] = 46,
+       [0][1][1][0][RTW89_CHILE][9] = 50,
+       [0][1][1][0][RTW89_UKRAINE][9] = 46,
+       [0][1][1][0][RTW89_MEXICO][9] = 62,
+       [0][1][1][0][RTW89_CN][9] = 46,
+       [0][1][1][0][RTW89_QATAR][9] = 46,
+       [0][1][1][0][RTW89_UK][9] = 46,
+       [0][1][1][0][RTW89_FCC][10] = 62,
+       [0][1][1][0][RTW89_ETSI][10] = 46,
+       [0][1][1][0][RTW89_MKK][10] = 64,
+       [0][1][1][0][RTW89_IC][10] = 62,
+       [0][1][1][0][RTW89_KCC][10] = 64,
+       [0][1][1][0][RTW89_ACMA][10] = 46,
+       [0][1][1][0][RTW89_CHILE][10] = 52,
+       [0][1][1][0][RTW89_UKRAINE][10] = 46,
+       [0][1][1][0][RTW89_MEXICO][10] = 62,
+       [0][1][1][0][RTW89_CN][10] = 46,
+       [0][1][1][0][RTW89_QATAR][10] = 46,
+       [0][1][1][0][RTW89_UK][10] = 46,
+       [0][1][1][0][RTW89_FCC][11] = 46,
+       [0][1][1][0][RTW89_ETSI][11] = 46,
+       [0][1][1][0][RTW89_MKK][11] = 64,
+       [0][1][1][0][RTW89_IC][11] = 46,
+       [0][1][1][0][RTW89_KCC][11] = 64,
+       [0][1][1][0][RTW89_ACMA][11] = 46,
+       [0][1][1][0][RTW89_CHILE][11] = 46,
+       [0][1][1][0][RTW89_UKRAINE][11] = 46,
+       [0][1][1][0][RTW89_MEXICO][11] = 46,
+       [0][1][1][0][RTW89_CN][11] = 46,
+       [0][1][1][0][RTW89_QATAR][11] = 46,
+       [0][1][1][0][RTW89_UK][11] = 46,
+       [0][1][1][0][RTW89_FCC][12] = 42,
+       [0][1][1][0][RTW89_ETSI][12] = 46,
+       [0][1][1][0][RTW89_MKK][12] = 64,
+       [0][1][1][0][RTW89_IC][12] = 42,
+       [0][1][1][0][RTW89_KCC][12] = 64,
+       [0][1][1][0][RTW89_ACMA][12] = 46,
+       [0][1][1][0][RTW89_CHILE][12] = 42,
+       [0][1][1][0][RTW89_UKRAINE][12] = 46,
+       [0][1][1][0][RTW89_MEXICO][12] = 42,
+       [0][1][1][0][RTW89_CN][12] = 46,
+       [0][1][1][0][RTW89_QATAR][12] = 46,
+       [0][1][1][0][RTW89_UK][12] = 46,
+       [0][1][1][0][RTW89_FCC][13] = 127,
+       [0][1][1][0][RTW89_ETSI][13] = 127,
+       [0][1][1][0][RTW89_MKK][13] = 127,
+       [0][1][1][0][RTW89_IC][13] = 127,
+       [0][1][1][0][RTW89_KCC][13] = 127,
+       [0][1][1][0][RTW89_ACMA][13] = 127,
+       [0][1][1][0][RTW89_CHILE][13] = 127,
+       [0][1][1][0][RTW89_UKRAINE][13] = 127,
+       [0][1][1][0][RTW89_MEXICO][13] = 127,
+       [0][1][1][0][RTW89_CN][13] = 127,
+       [0][1][1][0][RTW89_QATAR][13] = 127,
+       [0][1][1][0][RTW89_UK][13] = 127,
+       [0][0][2][0][RTW89_FCC][0] = 76,
+       [0][0][2][0][RTW89_ETSI][0] = 58,
+       [0][0][2][0][RTW89_MKK][0] = 76,
+       [0][0][2][0][RTW89_IC][0] = 76,
+       [0][0][2][0][RTW89_KCC][0] = 76,
+       [0][0][2][0][RTW89_ACMA][0] = 58,
+       [0][0][2][0][RTW89_CHILE][0] = 66,
+       [0][0][2][0][RTW89_UKRAINE][0] = 58,
+       [0][0][2][0][RTW89_MEXICO][0] = 76,
+       [0][0][2][0][RTW89_CN][0] = 58,
+       [0][0][2][0][RTW89_QATAR][0] = 58,
+       [0][0][2][0][RTW89_UK][0] = 58,
+       [0][0][2][0][RTW89_FCC][1] = 76,
+       [0][0][2][0][RTW89_ETSI][1] = 58,
+       [0][0][2][0][RTW89_MKK][1] = 76,
+       [0][0][2][0][RTW89_IC][1] = 76,
+       [0][0][2][0][RTW89_KCC][1] = 76,
+       [0][0][2][0][RTW89_ACMA][1] = 58,
+       [0][0][2][0][RTW89_CHILE][1] = 66,
+       [0][0][2][0][RTW89_UKRAINE][1] = 58,
+       [0][0][2][0][RTW89_MEXICO][1] = 76,
+       [0][0][2][0][RTW89_CN][1] = 58,
+       [0][0][2][0][RTW89_QATAR][1] = 58,
+       [0][0][2][0][RTW89_UK][1] = 58,
+       [0][0][2][0][RTW89_FCC][2] = 78,
+       [0][0][2][0][RTW89_ETSI][2] = 58,
+       [0][0][2][0][RTW89_MKK][2] = 76,
+       [0][0][2][0][RTW89_IC][2] = 78,
+       [0][0][2][0][RTW89_KCC][2] = 76,
+       [0][0][2][0][RTW89_ACMA][2] = 58,
+       [0][0][2][0][RTW89_CHILE][2] = 66,
+       [0][0][2][0][RTW89_UKRAINE][2] = 58,
+       [0][0][2][0][RTW89_MEXICO][2] = 78,
+       [0][0][2][0][RTW89_CN][2] = 58,
+       [0][0][2][0][RTW89_QATAR][2] = 58,
+       [0][0][2][0][RTW89_UK][2] = 58,
+       [0][0][2][0][RTW89_FCC][3] = 78,
+       [0][0][2][0][RTW89_ETSI][3] = 58,
+       [0][0][2][0][RTW89_MKK][3] = 76,
+       [0][0][2][0][RTW89_IC][3] = 78,
+       [0][0][2][0][RTW89_KCC][3] = 76,
+       [0][0][2][0][RTW89_ACMA][3] = 58,
+       [0][0][2][0][RTW89_CHILE][3] = 66,
+       [0][0][2][0][RTW89_UKRAINE][3] = 58,
+       [0][0][2][0][RTW89_MEXICO][3] = 78,
+       [0][0][2][0][RTW89_CN][3] = 58,
+       [0][0][2][0][RTW89_QATAR][3] = 58,
+       [0][0][2][0][RTW89_UK][3] = 58,
+       [0][0][2][0][RTW89_FCC][4] = 78,
+       [0][0][2][0][RTW89_ETSI][4] = 58,
+       [0][0][2][0][RTW89_MKK][4] = 76,
+       [0][0][2][0][RTW89_IC][4] = 78,
+       [0][0][2][0][RTW89_KCC][4] = 76,
+       [0][0][2][0][RTW89_ACMA][4] = 58,
+       [0][0][2][0][RTW89_CHILE][4] = 66,
+       [0][0][2][0][RTW89_UKRAINE][4] = 58,
+       [0][0][2][0][RTW89_MEXICO][4] = 78,
+       [0][0][2][0][RTW89_CN][4] = 58,
+       [0][0][2][0][RTW89_QATAR][4] = 58,
+       [0][0][2][0][RTW89_UK][4] = 58,
+       [0][0][2][0][RTW89_FCC][5] = 78,
+       [0][0][2][0][RTW89_ETSI][5] = 58,
+       [0][0][2][0][RTW89_MKK][5] = 76,
+       [0][0][2][0][RTW89_IC][5] = 78,
+       [0][0][2][0][RTW89_KCC][5] = 76,
+       [0][0][2][0][RTW89_ACMA][5] = 58,
+       [0][0][2][0][RTW89_CHILE][5] = 66,
+       [0][0][2][0][RTW89_UKRAINE][5] = 58,
+       [0][0][2][0][RTW89_MEXICO][5] = 78,
+       [0][0][2][0][RTW89_CN][5] = 58,
+       [0][0][2][0][RTW89_QATAR][5] = 58,
+       [0][0][2][0][RTW89_UK][5] = 58,
+       [0][0][2][0][RTW89_FCC][6] = 78,
+       [0][0][2][0][RTW89_ETSI][6] = 58,
+       [0][0][2][0][RTW89_MKK][6] = 76,
+       [0][0][2][0][RTW89_IC][6] = 78,
+       [0][0][2][0][RTW89_KCC][6] = 76,
+       [0][0][2][0][RTW89_ACMA][6] = 58,
+       [0][0][2][0][RTW89_CHILE][6] = 66,
+       [0][0][2][0][RTW89_UKRAINE][6] = 58,
+       [0][0][2][0][RTW89_MEXICO][6] = 78,
+       [0][0][2][0][RTW89_CN][6] = 58,
+       [0][0][2][0][RTW89_QATAR][6] = 58,
+       [0][0][2][0][RTW89_UK][6] = 58,
+       [0][0][2][0][RTW89_FCC][7] = 78,
+       [0][0][2][0][RTW89_ETSI][7] = 58,
+       [0][0][2][0][RTW89_MKK][7] = 76,
+       [0][0][2][0][RTW89_IC][7] = 78,
+       [0][0][2][0][RTW89_KCC][7] = 76,
+       [0][0][2][0][RTW89_ACMA][7] = 58,
+       [0][0][2][0][RTW89_CHILE][7] = 66,
+       [0][0][2][0][RTW89_UKRAINE][7] = 58,
+       [0][0][2][0][RTW89_MEXICO][7] = 78,
+       [0][0][2][0][RTW89_CN][7] = 58,
+       [0][0][2][0][RTW89_QATAR][7] = 58,
+       [0][0][2][0][RTW89_UK][7] = 58,
+       [0][0][2][0][RTW89_FCC][8] = 76,
+       [0][0][2][0][RTW89_ETSI][8] = 58,
+       [0][0][2][0][RTW89_MKK][8] = 76,
+       [0][0][2][0][RTW89_IC][8] = 76,
+       [0][0][2][0][RTW89_KCC][8] = 76,
+       [0][0][2][0][RTW89_ACMA][8] = 58,
+       [0][0][2][0][RTW89_CHILE][8] = 66,
+       [0][0][2][0][RTW89_UKRAINE][8] = 58,
+       [0][0][2][0][RTW89_MEXICO][8] = 76,
+       [0][0][2][0][RTW89_CN][8] = 58,
+       [0][0][2][0][RTW89_QATAR][8] = 58,
+       [0][0][2][0][RTW89_UK][8] = 58,
+       [0][0][2][0][RTW89_FCC][9] = 72,
+       [0][0][2][0][RTW89_ETSI][9] = 58,
+       [0][0][2][0][RTW89_MKK][9] = 76,
+       [0][0][2][0][RTW89_IC][9] = 72,
+       [0][0][2][0][RTW89_KCC][9] = 76,
+       [0][0][2][0][RTW89_ACMA][9] = 58,
+       [0][0][2][0][RTW89_CHILE][9] = 66,
+       [0][0][2][0][RTW89_UKRAINE][9] = 58,
+       [0][0][2][0][RTW89_MEXICO][9] = 72,
+       [0][0][2][0][RTW89_CN][9] = 58,
+       [0][0][2][0][RTW89_QATAR][9] = 58,
+       [0][0][2][0][RTW89_UK][9] = 58,
+       [0][0][2][0][RTW89_FCC][10] = 72,
+       [0][0][2][0][RTW89_ETSI][10] = 58,
+       [0][0][2][0][RTW89_MKK][10] = 76,
+       [0][0][2][0][RTW89_IC][10] = 72,
+       [0][0][2][0][RTW89_KCC][10] = 76,
+       [0][0][2][0][RTW89_ACMA][10] = 58,
+       [0][0][2][0][RTW89_CHILE][10] = 66,
+       [0][0][2][0][RTW89_UKRAINE][10] = 58,
+       [0][0][2][0][RTW89_MEXICO][10] = 72,
+       [0][0][2][0][RTW89_CN][10] = 58,
+       [0][0][2][0][RTW89_QATAR][10] = 58,
+       [0][0][2][0][RTW89_UK][10] = 58,
+       [0][0][2][0][RTW89_FCC][11] = 54,
+       [0][0][2][0][RTW89_ETSI][11] = 58,
+       [0][0][2][0][RTW89_MKK][11] = 76,
+       [0][0][2][0][RTW89_IC][11] = 54,
+       [0][0][2][0][RTW89_KCC][11] = 76,
+       [0][0][2][0][RTW89_ACMA][11] = 58,
+       [0][0][2][0][RTW89_CHILE][11] = 54,
+       [0][0][2][0][RTW89_UKRAINE][11] = 58,
+       [0][0][2][0][RTW89_MEXICO][11] = 54,
+       [0][0][2][0][RTW89_CN][11] = 58,
+       [0][0][2][0][RTW89_QATAR][11] = 58,
+       [0][0][2][0][RTW89_UK][11] = 58,
+       [0][0][2][0][RTW89_FCC][12] = 50,
+       [0][0][2][0][RTW89_ETSI][12] = 58,
+       [0][0][2][0][RTW89_MKK][12] = 76,
+       [0][0][2][0][RTW89_IC][12] = 50,
+       [0][0][2][0][RTW89_KCC][12] = 76,
+       [0][0][2][0][RTW89_ACMA][12] = 58,
+       [0][0][2][0][RTW89_CHILE][12] = 50,
+       [0][0][2][0][RTW89_UKRAINE][12] = 58,
+       [0][0][2][0][RTW89_MEXICO][12] = 50,
+       [0][0][2][0][RTW89_CN][12] = 58,
+       [0][0][2][0][RTW89_QATAR][12] = 58,
+       [0][0][2][0][RTW89_UK][12] = 58,
+       [0][0][2][0][RTW89_FCC][13] = 127,
+       [0][0][2][0][RTW89_ETSI][13] = 127,
+       [0][0][2][0][RTW89_MKK][13] = 127,
+       [0][0][2][0][RTW89_IC][13] = 127,
+       [0][0][2][0][RTW89_KCC][13] = 127,
+       [0][0][2][0][RTW89_ACMA][13] = 127,
+       [0][0][2][0][RTW89_CHILE][13] = 127,
+       [0][0][2][0][RTW89_UKRAINE][13] = 127,
+       [0][0][2][0][RTW89_MEXICO][13] = 127,
+       [0][0][2][0][RTW89_CN][13] = 127,
+       [0][0][2][0][RTW89_QATAR][13] = 127,
+       [0][0][2][0][RTW89_UK][13] = 127,
+       [0][1][2][0][RTW89_FCC][0] = 58,
+       [0][1][2][0][RTW89_ETSI][0] = 46,
+       [0][1][2][0][RTW89_MKK][0] = 66,
+       [0][1][2][0][RTW89_IC][0] = 58,
+       [0][1][2][0][RTW89_KCC][0] = 62,
+       [0][1][2][0][RTW89_ACMA][0] = 46,
+       [0][1][2][0][RTW89_CHILE][0] = 50,
+       [0][1][2][0][RTW89_UKRAINE][0] = 46,
+       [0][1][2][0][RTW89_MEXICO][0] = 58,
+       [0][1][2][0][RTW89_CN][0] = 46,
+       [0][1][2][0][RTW89_QATAR][0] = 46,
+       [0][1][2][0][RTW89_UK][0] = 46,
+       [0][1][2][0][RTW89_FCC][1] = 58,
+       [0][1][2][0][RTW89_ETSI][1] = 46,
+       [0][1][2][0][RTW89_MKK][1] = 66,
+       [0][1][2][0][RTW89_IC][1] = 58,
+       [0][1][2][0][RTW89_KCC][1] = 62,
+       [0][1][2][0][RTW89_ACMA][1] = 46,
+       [0][1][2][0][RTW89_CHILE][1] = 50,
+       [0][1][2][0][RTW89_UKRAINE][1] = 46,
+       [0][1][2][0][RTW89_MEXICO][1] = 58,
+       [0][1][2][0][RTW89_CN][1] = 46,
+       [0][1][2][0][RTW89_QATAR][1] = 46,
+       [0][1][2][0][RTW89_UK][1] = 46,
+       [0][1][2][0][RTW89_FCC][2] = 62,
+       [0][1][2][0][RTW89_ETSI][2] = 46,
+       [0][1][2][0][RTW89_MKK][2] = 66,
+       [0][1][2][0][RTW89_IC][2] = 62,
+       [0][1][2][0][RTW89_KCC][2] = 62,
+       [0][1][2][0][RTW89_ACMA][2] = 46,
+       [0][1][2][0][RTW89_CHILE][2] = 50,
+       [0][1][2][0][RTW89_UKRAINE][2] = 46,
+       [0][1][2][0][RTW89_MEXICO][2] = 62,
+       [0][1][2][0][RTW89_CN][2] = 46,
+       [0][1][2][0][RTW89_QATAR][2] = 46,
+       [0][1][2][0][RTW89_UK][2] = 46,
+       [0][1][2][0][RTW89_FCC][3] = 66,
+       [0][1][2][0][RTW89_ETSI][3] = 46,
+       [0][1][2][0][RTW89_MKK][3] = 66,
+       [0][1][2][0][RTW89_IC][3] = 66,
+       [0][1][2][0][RTW89_KCC][3] = 62,
+       [0][1][2][0][RTW89_ACMA][3] = 46,
+       [0][1][2][0][RTW89_CHILE][3] = 50,
+       [0][1][2][0][RTW89_UKRAINE][3] = 46,
+       [0][1][2][0][RTW89_MEXICO][3] = 66,
+       [0][1][2][0][RTW89_CN][3] = 46,
+       [0][1][2][0][RTW89_QATAR][3] = 46,
+       [0][1][2][0][RTW89_UK][3] = 46,
+       [0][1][2][0][RTW89_FCC][4] = 72,
+       [0][1][2][0][RTW89_ETSI][4] = 46,
+       [0][1][2][0][RTW89_MKK][4] = 66,
+       [0][1][2][0][RTW89_IC][4] = 72,
+       [0][1][2][0][RTW89_KCC][4] = 62,
+       [0][1][2][0][RTW89_ACMA][4] = 46,
+       [0][1][2][0][RTW89_CHILE][4] = 50,
+       [0][1][2][0][RTW89_UKRAINE][4] = 46,
+       [0][1][2][0][RTW89_MEXICO][4] = 72,
+       [0][1][2][0][RTW89_CN][4] = 46,
+       [0][1][2][0][RTW89_QATAR][4] = 46,
+       [0][1][2][0][RTW89_UK][4] = 46,
+       [0][1][2][0][RTW89_FCC][5] = 78,
+       [0][1][2][0][RTW89_ETSI][5] = 46,
+       [0][1][2][0][RTW89_MKK][5] = 66,
+       [0][1][2][0][RTW89_IC][5] = 78,
+       [0][1][2][0][RTW89_KCC][5] = 62,
+       [0][1][2][0][RTW89_ACMA][5] = 46,
+       [0][1][2][0][RTW89_CHILE][5] = 50,
+       [0][1][2][0][RTW89_UKRAINE][5] = 46,
+       [0][1][2][0][RTW89_MEXICO][5] = 78,
+       [0][1][2][0][RTW89_CN][5] = 46,
+       [0][1][2][0][RTW89_QATAR][5] = 46,
+       [0][1][2][0][RTW89_UK][5] = 46,
+       [0][1][2][0][RTW89_FCC][6] = 74,
+       [0][1][2][0][RTW89_ETSI][6] = 46,
+       [0][1][2][0][RTW89_MKK][6] = 66,
+       [0][1][2][0][RTW89_IC][6] = 74,
+       [0][1][2][0][RTW89_KCC][6] = 62,
+       [0][1][2][0][RTW89_ACMA][6] = 46,
+       [0][1][2][0][RTW89_CHILE][6] = 50,
+       [0][1][2][0][RTW89_UKRAINE][6] = 46,
+       [0][1][2][0][RTW89_MEXICO][6] = 74,
+       [0][1][2][0][RTW89_CN][6] = 46,
+       [0][1][2][0][RTW89_QATAR][6] = 46,
+       [0][1][2][0][RTW89_UK][6] = 46,
+       [0][1][2][0][RTW89_FCC][7] = 66,
+       [0][1][2][0][RTW89_ETSI][7] = 46,
+       [0][1][2][0][RTW89_MKK][7] = 66,
+       [0][1][2][0][RTW89_IC][7] = 66,
+       [0][1][2][0][RTW89_KCC][7] = 62,
+       [0][1][2][0][RTW89_ACMA][7] = 46,
+       [0][1][2][0][RTW89_CHILE][7] = 50,
+       [0][1][2][0][RTW89_UKRAINE][7] = 46,
+       [0][1][2][0][RTW89_MEXICO][7] = 66,
+       [0][1][2][0][RTW89_CN][7] = 46,
+       [0][1][2][0][RTW89_QATAR][7] = 46,
+       [0][1][2][0][RTW89_UK][7] = 46,
+       [0][1][2][0][RTW89_FCC][8] = 62,
+       [0][1][2][0][RTW89_ETSI][8] = 46,
+       [0][1][2][0][RTW89_MKK][8] = 66,
+       [0][1][2][0][RTW89_IC][8] = 62,
+       [0][1][2][0][RTW89_KCC][8] = 62,
+       [0][1][2][0][RTW89_ACMA][8] = 46,
+       [0][1][2][0][RTW89_CHILE][8] = 50,
+       [0][1][2][0][RTW89_UKRAINE][8] = 46,
+       [0][1][2][0][RTW89_MEXICO][8] = 62,
+       [0][1][2][0][RTW89_CN][8] = 46,
+       [0][1][2][0][RTW89_QATAR][8] = 46,
+       [0][1][2][0][RTW89_UK][8] = 46,
+       [0][1][2][0][RTW89_FCC][9] = 58,
+       [0][1][2][0][RTW89_ETSI][9] = 46,
+       [0][1][2][0][RTW89_MKK][9] = 66,
+       [0][1][2][0][RTW89_IC][9] = 58,
+       [0][1][2][0][RTW89_KCC][9] = 60,
+       [0][1][2][0][RTW89_ACMA][9] = 46,
+       [0][1][2][0][RTW89_CHILE][9] = 50,
+       [0][1][2][0][RTW89_UKRAINE][9] = 46,
+       [0][1][2][0][RTW89_MEXICO][9] = 58,
+       [0][1][2][0][RTW89_CN][9] = 46,
+       [0][1][2][0][RTW89_QATAR][9] = 46,
+       [0][1][2][0][RTW89_UK][9] = 46,
+       [0][1][2][0][RTW89_FCC][10] = 58,
+       [0][1][2][0][RTW89_ETSI][10] = 46,
+       [0][1][2][0][RTW89_MKK][10] = 66,
+       [0][1][2][0][RTW89_IC][10] = 58,
+       [0][1][2][0][RTW89_KCC][10] = 60,
+       [0][1][2][0][RTW89_ACMA][10] = 46,
+       [0][1][2][0][RTW89_CHILE][10] = 50,
+       [0][1][2][0][RTW89_UKRAINE][10] = 46,
+       [0][1][2][0][RTW89_MEXICO][10] = 58,
+       [0][1][2][0][RTW89_CN][10] = 46,
+       [0][1][2][0][RTW89_QATAR][10] = 46,
+       [0][1][2][0][RTW89_UK][10] = 46,
+       [0][1][2][0][RTW89_FCC][11] = 46,
+       [0][1][2][0][RTW89_ETSI][11] = 46,
+       [0][1][2][0][RTW89_MKK][11] = 66,
+       [0][1][2][0][RTW89_IC][11] = 46,
+       [0][1][2][0][RTW89_KCC][11] = 60,
+       [0][1][2][0][RTW89_ACMA][11] = 46,
+       [0][1][2][0][RTW89_CHILE][11] = 46,
+       [0][1][2][0][RTW89_UKRAINE][11] = 46,
+       [0][1][2][0][RTW89_MEXICO][11] = 46,
+       [0][1][2][0][RTW89_CN][11] = 46,
+       [0][1][2][0][RTW89_QATAR][11] = 46,
+       [0][1][2][0][RTW89_UK][11] = 46,
+       [0][1][2][0][RTW89_FCC][12] = 42,
+       [0][1][2][0][RTW89_ETSI][12] = 46,
+       [0][1][2][0][RTW89_MKK][12] = 66,
+       [0][1][2][0][RTW89_IC][12] = 42,
+       [0][1][2][0][RTW89_KCC][12] = 60,
+       [0][1][2][0][RTW89_ACMA][12] = 46,
+       [0][1][2][0][RTW89_CHILE][12] = 42,
+       [0][1][2][0][RTW89_UKRAINE][12] = 46,
+       [0][1][2][0][RTW89_MEXICO][12] = 42,
+       [0][1][2][0][RTW89_CN][12] = 46,
+       [0][1][2][0][RTW89_QATAR][12] = 46,
+       [0][1][2][0][RTW89_UK][12] = 46,
+       [0][1][2][0][RTW89_FCC][13] = 127,
+       [0][1][2][0][RTW89_ETSI][13] = 127,
+       [0][1][2][0][RTW89_MKK][13] = 127,
+       [0][1][2][0][RTW89_IC][13] = 127,
+       [0][1][2][0][RTW89_KCC][13] = 127,
+       [0][1][2][0][RTW89_ACMA][13] = 127,
+       [0][1][2][0][RTW89_CHILE][13] = 127,
+       [0][1][2][0][RTW89_UKRAINE][13] = 127,
+       [0][1][2][0][RTW89_MEXICO][13] = 127,
+       [0][1][2][0][RTW89_CN][13] = 127,
+       [0][1][2][0][RTW89_QATAR][13] = 127,
+       [0][1][2][0][RTW89_UK][13] = 127,
+       [0][1][2][1][RTW89_FCC][0] = 58,
+       [0][1][2][1][RTW89_ETSI][0] = 34,
+       [0][1][2][1][RTW89_MKK][0] = 66,
+       [0][1][2][1][RTW89_IC][0] = 58,
+       [0][1][2][1][RTW89_KCC][0] = 62,
+       [0][1][2][1][RTW89_ACMA][0] = 34,
+       [0][1][2][1][RTW89_CHILE][0] = 42,
+       [0][1][2][1][RTW89_UKRAINE][0] = 34,
+       [0][1][2][1][RTW89_MEXICO][0] = 58,
+       [0][1][2][1][RTW89_CN][0] = 34,
+       [0][1][2][1][RTW89_QATAR][0] = 34,
+       [0][1][2][1][RTW89_UK][0] = 34,
+       [0][1][2][1][RTW89_FCC][1] = 58,
+       [0][1][2][1][RTW89_ETSI][1] = 34,
+       [0][1][2][1][RTW89_MKK][1] = 66,
+       [0][1][2][1][RTW89_IC][1] = 58,
+       [0][1][2][1][RTW89_KCC][1] = 62,
+       [0][1][2][1][RTW89_ACMA][1] = 34,
+       [0][1][2][1][RTW89_CHILE][1] = 40,
+       [0][1][2][1][RTW89_UKRAINE][1] = 34,
+       [0][1][2][1][RTW89_MEXICO][1] = 58,
+       [0][1][2][1][RTW89_CN][1] = 34,
+       [0][1][2][1][RTW89_QATAR][1] = 34,
+       [0][1][2][1][RTW89_UK][1] = 34,
+       [0][1][2][1][RTW89_FCC][2] = 62,
+       [0][1][2][1][RTW89_ETSI][2] = 34,
+       [0][1][2][1][RTW89_MKK][2] = 66,
+       [0][1][2][1][RTW89_IC][2] = 62,
+       [0][1][2][1][RTW89_KCC][2] = 62,
+       [0][1][2][1][RTW89_ACMA][2] = 34,
+       [0][1][2][1][RTW89_CHILE][2] = 40,
+       [0][1][2][1][RTW89_UKRAINE][2] = 34,
+       [0][1][2][1][RTW89_MEXICO][2] = 62,
+       [0][1][2][1][RTW89_CN][2] = 34,
+       [0][1][2][1][RTW89_QATAR][2] = 34,
+       [0][1][2][1][RTW89_UK][2] = 34,
+       [0][1][2][1][RTW89_FCC][3] = 66,
+       [0][1][2][1][RTW89_ETSI][3] = 34,
+       [0][1][2][1][RTW89_MKK][3] = 66,
+       [0][1][2][1][RTW89_IC][3] = 66,
+       [0][1][2][1][RTW89_KCC][3] = 62,
+       [0][1][2][1][RTW89_ACMA][3] = 34,
+       [0][1][2][1][RTW89_CHILE][3] = 40,
+       [0][1][2][1][RTW89_UKRAINE][3] = 34,
+       [0][1][2][1][RTW89_MEXICO][3] = 66,
+       [0][1][2][1][RTW89_CN][3] = 34,
+       [0][1][2][1][RTW89_QATAR][3] = 34,
+       [0][1][2][1][RTW89_UK][3] = 34,
+       [0][1][2][1][RTW89_FCC][4] = 72,
+       [0][1][2][1][RTW89_ETSI][4] = 34,
+       [0][1][2][1][RTW89_MKK][4] = 66,
+       [0][1][2][1][RTW89_IC][4] = 72,
+       [0][1][2][1][RTW89_KCC][4] = 62,
+       [0][1][2][1][RTW89_ACMA][4] = 34,
+       [0][1][2][1][RTW89_CHILE][4] = 40,
+       [0][1][2][1][RTW89_UKRAINE][4] = 34,
+       [0][1][2][1][RTW89_MEXICO][4] = 72,
+       [0][1][2][1][RTW89_CN][4] = 34,
+       [0][1][2][1][RTW89_QATAR][4] = 34,
+       [0][1][2][1][RTW89_UK][4] = 34,
+       [0][1][2][1][RTW89_FCC][5] = 78,
+       [0][1][2][1][RTW89_ETSI][5] = 34,
+       [0][1][2][1][RTW89_MKK][5] = 66,
+       [0][1][2][1][RTW89_IC][5] = 78,
+       [0][1][2][1][RTW89_KCC][5] = 62,
+       [0][1][2][1][RTW89_ACMA][5] = 34,
+       [0][1][2][1][RTW89_CHILE][5] = 42,
+       [0][1][2][1][RTW89_UKRAINE][5] = 34,
+       [0][1][2][1][RTW89_MEXICO][5] = 78,
+       [0][1][2][1][RTW89_CN][5] = 34,
+       [0][1][2][1][RTW89_QATAR][5] = 34,
+       [0][1][2][1][RTW89_UK][5] = 34,
+       [0][1][2][1][RTW89_FCC][6] = 74,
+       [0][1][2][1][RTW89_ETSI][6] = 34,
+       [0][1][2][1][RTW89_MKK][6] = 66,
+       [0][1][2][1][RTW89_IC][6] = 74,
+       [0][1][2][1][RTW89_KCC][6] = 62,
+       [0][1][2][1][RTW89_ACMA][6] = 34,
+       [0][1][2][1][RTW89_CHILE][6] = 40,
+       [0][1][2][1][RTW89_UKRAINE][6] = 34,
+       [0][1][2][1][RTW89_MEXICO][6] = 74,
+       [0][1][2][1][RTW89_CN][6] = 34,
+       [0][1][2][1][RTW89_QATAR][6] = 34,
+       [0][1][2][1][RTW89_UK][6] = 34,
+       [0][1][2][1][RTW89_FCC][7] = 66,
+       [0][1][2][1][RTW89_ETSI][7] = 34,
+       [0][1][2][1][RTW89_MKK][7] = 66,
+       [0][1][2][1][RTW89_IC][7] = 66,
+       [0][1][2][1][RTW89_KCC][7] = 62,
+       [0][1][2][1][RTW89_ACMA][7] = 34,
+       [0][1][2][1][RTW89_CHILE][7] = 40,
+       [0][1][2][1][RTW89_UKRAINE][7] = 34,
+       [0][1][2][1][RTW89_MEXICO][7] = 66,
+       [0][1][2][1][RTW89_CN][7] = 34,
+       [0][1][2][1][RTW89_QATAR][7] = 34,
+       [0][1][2][1][RTW89_UK][7] = 34,
+       [0][1][2][1][RTW89_FCC][8] = 62,
+       [0][1][2][1][RTW89_ETSI][8] = 34,
+       [0][1][2][1][RTW89_MKK][8] = 66,
+       [0][1][2][1][RTW89_IC][8] = 62,
+       [0][1][2][1][RTW89_KCC][8] = 62,
+       [0][1][2][1][RTW89_ACMA][8] = 34,
+       [0][1][2][1][RTW89_CHILE][8] = 40,
+       [0][1][2][1][RTW89_UKRAINE][8] = 34,
+       [0][1][2][1][RTW89_MEXICO][8] = 62,
+       [0][1][2][1][RTW89_CN][8] = 34,
+       [0][1][2][1][RTW89_QATAR][8] = 34,
+       [0][1][2][1][RTW89_UK][8] = 34,
+       [0][1][2][1][RTW89_FCC][9] = 58,
+       [0][1][2][1][RTW89_ETSI][9] = 34,
+       [0][1][2][1][RTW89_MKK][9] = 66,
+       [0][1][2][1][RTW89_IC][9] = 58,
+       [0][1][2][1][RTW89_KCC][9] = 60,
+       [0][1][2][1][RTW89_ACMA][9] = 34,
+       [0][1][2][1][RTW89_CHILE][9] = 40,
+       [0][1][2][1][RTW89_UKRAINE][9] = 34,
+       [0][1][2][1][RTW89_MEXICO][9] = 58,
+       [0][1][2][1][RTW89_CN][9] = 34,
+       [0][1][2][1][RTW89_QATAR][9] = 34,
+       [0][1][2][1][RTW89_UK][9] = 34,
+       [0][1][2][1][RTW89_FCC][10] = 58,
+       [0][1][2][1][RTW89_ETSI][10] = 34,
+       [0][1][2][1][RTW89_MKK][10] = 66,
+       [0][1][2][1][RTW89_IC][10] = 58,
+       [0][1][2][1][RTW89_KCC][10] = 60,
+       [0][1][2][1][RTW89_ACMA][10] = 34,
+       [0][1][2][1][RTW89_CHILE][10] = 40,
+       [0][1][2][1][RTW89_UKRAINE][10] = 34,
+       [0][1][2][1][RTW89_MEXICO][10] = 58,
+       [0][1][2][1][RTW89_CN][10] = 34,
+       [0][1][2][1][RTW89_QATAR][10] = 34,
+       [0][1][2][1][RTW89_UK][10] = 34,
+       [0][1][2][1][RTW89_FCC][11] = 46,
+       [0][1][2][1][RTW89_ETSI][11] = 34,
+       [0][1][2][1][RTW89_MKK][11] = 66,
+       [0][1][2][1][RTW89_IC][11] = 46,
+       [0][1][2][1][RTW89_KCC][11] = 60,
+       [0][1][2][1][RTW89_ACMA][11] = 34,
+       [0][1][2][1][RTW89_CHILE][11] = 40,
+       [0][1][2][1][RTW89_UKRAINE][11] = 34,
+       [0][1][2][1][RTW89_MEXICO][11] = 46,
+       [0][1][2][1][RTW89_CN][11] = 34,
+       [0][1][2][1][RTW89_QATAR][11] = 34,
+       [0][1][2][1][RTW89_UK][11] = 34,
+       [0][1][2][1][RTW89_FCC][12] = 42,
+       [0][1][2][1][RTW89_ETSI][12] = 34,
+       [0][1][2][1][RTW89_MKK][12] = 66,
+       [0][1][2][1][RTW89_IC][12] = 42,
+       [0][1][2][1][RTW89_KCC][12] = 60,
+       [0][1][2][1][RTW89_ACMA][12] = 34,
+       [0][1][2][1][RTW89_CHILE][12] = 40,
+       [0][1][2][1][RTW89_UKRAINE][12] = 34,
+       [0][1][2][1][RTW89_MEXICO][12] = 42,
+       [0][1][2][1][RTW89_CN][12] = 34,
+       [0][1][2][1][RTW89_QATAR][12] = 34,
+       [0][1][2][1][RTW89_UK][12] = 34,
+       [0][1][2][1][RTW89_FCC][13] = 127,
+       [0][1][2][1][RTW89_ETSI][13] = 127,
+       [0][1][2][1][RTW89_MKK][13] = 127,
+       [0][1][2][1][RTW89_IC][13] = 127,
+       [0][1][2][1][RTW89_KCC][13] = 127,
+       [0][1][2][1][RTW89_ACMA][13] = 127,
+       [0][1][2][1][RTW89_CHILE][13] = 127,
+       [0][1][2][1][RTW89_UKRAINE][13] = 127,
+       [0][1][2][1][RTW89_MEXICO][13] = 127,
+       [0][1][2][1][RTW89_CN][13] = 127,
+       [0][1][2][1][RTW89_QATAR][13] = 127,
+       [0][1][2][1][RTW89_UK][13] = 127,
+       [1][0][2][0][RTW89_FCC][0] = 127,
+       [1][0][2][0][RTW89_ETSI][0] = 127,
+       [1][0][2][0][RTW89_MKK][0] = 127,
+       [1][0][2][0][RTW89_IC][0] = 127,
+       [1][0][2][0][RTW89_KCC][0] = 127,
+       [1][0][2][0][RTW89_ACMA][0] = 127,
+       [1][0][2][0][RTW89_CHILE][0] = 127,
+       [1][0][2][0][RTW89_UKRAINE][0] = 127,
+       [1][0][2][0][RTW89_MEXICO][0] = 127,
+       [1][0][2][0][RTW89_CN][0] = 127,
+       [1][0][2][0][RTW89_QATAR][0] = 127,
+       [1][0][2][0][RTW89_UK][0] = 127,
+       [1][0][2][0][RTW89_FCC][1] = 127,
+       [1][0][2][0][RTW89_ETSI][1] = 127,
+       [1][0][2][0][RTW89_MKK][1] = 127,
+       [1][0][2][0][RTW89_IC][1] = 127,
+       [1][0][2][0][RTW89_KCC][1] = 127,
+       [1][0][2][0][RTW89_ACMA][1] = 127,
+       [1][0][2][0][RTW89_CHILE][1] = 127,
+       [1][0][2][0][RTW89_UKRAINE][1] = 127,
+       [1][0][2][0][RTW89_MEXICO][1] = 127,
+       [1][0][2][0][RTW89_CN][1] = 127,
+       [1][0][2][0][RTW89_QATAR][1] = 127,
+       [1][0][2][0][RTW89_UK][1] = 127,
+       [1][0][2][0][RTW89_FCC][2] = 70,
+       [1][0][2][0][RTW89_ETSI][2] = 58,
+       [1][0][2][0][RTW89_MKK][2] = 74,
+       [1][0][2][0][RTW89_IC][2] = 70,
+       [1][0][2][0][RTW89_KCC][2] = 74,
+       [1][0][2][0][RTW89_ACMA][2] = 58,
+       [1][0][2][0][RTW89_CHILE][2] = 66,
+       [1][0][2][0][RTW89_UKRAINE][2] = 58,
+       [1][0][2][0][RTW89_MEXICO][2] = 70,
+       [1][0][2][0][RTW89_CN][2] = 58,
+       [1][0][2][0][RTW89_QATAR][2] = 58,
+       [1][0][2][0][RTW89_UK][2] = 58,
+       [1][0][2][0][RTW89_FCC][3] = 70,
+       [1][0][2][0][RTW89_ETSI][3] = 58,
+       [1][0][2][0][RTW89_MKK][3] = 74,
+       [1][0][2][0][RTW89_IC][3] = 70,
+       [1][0][2][0][RTW89_KCC][3] = 74,
+       [1][0][2][0][RTW89_ACMA][3] = 58,
+       [1][0][2][0][RTW89_CHILE][3] = 66,
+       [1][0][2][0][RTW89_UKRAINE][3] = 58,
+       [1][0][2][0][RTW89_MEXICO][3] = 70,
+       [1][0][2][0][RTW89_CN][3] = 58,
+       [1][0][2][0][RTW89_QATAR][3] = 58,
+       [1][0][2][0][RTW89_UK][3] = 58,
+       [1][0][2][0][RTW89_FCC][4] = 72,
+       [1][0][2][0][RTW89_ETSI][4] = 58,
+       [1][0][2][0][RTW89_MKK][4] = 74,
+       [1][0][2][0][RTW89_IC][4] = 72,
+       [1][0][2][0][RTW89_KCC][4] = 74,
+       [1][0][2][0][RTW89_ACMA][4] = 58,
+       [1][0][2][0][RTW89_CHILE][4] = 66,
+       [1][0][2][0][RTW89_UKRAINE][4] = 58,
+       [1][0][2][0][RTW89_MEXICO][4] = 72,
+       [1][0][2][0][RTW89_CN][4] = 58,
+       [1][0][2][0][RTW89_QATAR][4] = 58,
+       [1][0][2][0][RTW89_UK][4] = 58,
+       [1][0][2][0][RTW89_FCC][5] = 72,
+       [1][0][2][0][RTW89_ETSI][5] = 58,
+       [1][0][2][0][RTW89_MKK][5] = 74,
+       [1][0][2][0][RTW89_IC][5] = 72,
+       [1][0][2][0][RTW89_KCC][5] = 74,
+       [1][0][2][0][RTW89_ACMA][5] = 58,
+       [1][0][2][0][RTW89_CHILE][5] = 66,
+       [1][0][2][0][RTW89_UKRAINE][5] = 58,
+       [1][0][2][0][RTW89_MEXICO][5] = 72,
+       [1][0][2][0][RTW89_CN][5] = 58,
+       [1][0][2][0][RTW89_QATAR][5] = 58,
+       [1][0][2][0][RTW89_UK][5] = 58,
+       [1][0][2][0][RTW89_FCC][6] = 72,
+       [1][0][2][0][RTW89_ETSI][6] = 58,
+       [1][0][2][0][RTW89_MKK][6] = 74,
+       [1][0][2][0][RTW89_IC][6] = 72,
+       [1][0][2][0][RTW89_KCC][6] = 74,
+       [1][0][2][0][RTW89_ACMA][6] = 58,
+       [1][0][2][0][RTW89_CHILE][6] = 66,
+       [1][0][2][0][RTW89_UKRAINE][6] = 58,
+       [1][0][2][0][RTW89_MEXICO][6] = 72,
+       [1][0][2][0][RTW89_CN][6] = 58,
+       [1][0][2][0][RTW89_QATAR][6] = 58,
+       [1][0][2][0][RTW89_UK][6] = 58,
+       [1][0][2][0][RTW89_FCC][7] = 68,
+       [1][0][2][0][RTW89_ETSI][7] = 58,
+       [1][0][2][0][RTW89_MKK][7] = 74,
+       [1][0][2][0][RTW89_IC][7] = 68,
+       [1][0][2][0][RTW89_KCC][7] = 74,
+       [1][0][2][0][RTW89_ACMA][7] = 58,
+       [1][0][2][0][RTW89_CHILE][7] = 66,
+       [1][0][2][0][RTW89_UKRAINE][7] = 58,
+       [1][0][2][0][RTW89_MEXICO][7] = 68,
+       [1][0][2][0][RTW89_CN][7] = 58,
+       [1][0][2][0][RTW89_QATAR][7] = 58,
+       [1][0][2][0][RTW89_UK][7] = 58,
+       [1][0][2][0][RTW89_FCC][8] = 68,
+       [1][0][2][0][RTW89_ETSI][8] = 58,
+       [1][0][2][0][RTW89_MKK][8] = 74,
+       [1][0][2][0][RTW89_IC][8] = 68,
+       [1][0][2][0][RTW89_KCC][8] = 74,
+       [1][0][2][0][RTW89_ACMA][8] = 58,
+       [1][0][2][0][RTW89_CHILE][8] = 66,
+       [1][0][2][0][RTW89_UKRAINE][8] = 58,
+       [1][0][2][0][RTW89_MEXICO][8] = 68,
+       [1][0][2][0][RTW89_CN][8] = 58,
+       [1][0][2][0][RTW89_QATAR][8] = 58,
+       [1][0][2][0][RTW89_UK][8] = 58,
+       [1][0][2][0][RTW89_FCC][9] = 68,
+       [1][0][2][0][RTW89_ETSI][9] = 58,
+       [1][0][2][0][RTW89_MKK][9] = 74,
+       [1][0][2][0][RTW89_IC][9] = 68,
+       [1][0][2][0][RTW89_KCC][9] = 74,
+       [1][0][2][0][RTW89_ACMA][9] = 58,
+       [1][0][2][0][RTW89_CHILE][9] = 66,
+       [1][0][2][0][RTW89_UKRAINE][9] = 58,
+       [1][0][2][0][RTW89_MEXICO][9] = 68,
+       [1][0][2][0][RTW89_CN][9] = 58,
+       [1][0][2][0][RTW89_QATAR][9] = 58,
+       [1][0][2][0][RTW89_UK][9] = 58,
+       [1][0][2][0][RTW89_FCC][10] = 66,
+       [1][0][2][0][RTW89_ETSI][10] = 58,
+       [1][0][2][0][RTW89_MKK][10] = 74,
+       [1][0][2][0][RTW89_IC][10] = 66,
+       [1][0][2][0][RTW89_KCC][10] = 74,
+       [1][0][2][0][RTW89_ACMA][10] = 58,
+       [1][0][2][0][RTW89_CHILE][10] = 66,
+       [1][0][2][0][RTW89_UKRAINE][10] = 58,
+       [1][0][2][0][RTW89_MEXICO][10] = 66,
+       [1][0][2][0][RTW89_CN][10] = 58,
+       [1][0][2][0][RTW89_QATAR][10] = 58,
+       [1][0][2][0][RTW89_UK][10] = 58,
+       [1][0][2][0][RTW89_FCC][11] = 127,
+       [1][0][2][0][RTW89_ETSI][11] = 127,
+       [1][0][2][0][RTW89_MKK][11] = 127,
+       [1][0][2][0][RTW89_IC][11] = 127,
+       [1][0][2][0][RTW89_KCC][11] = 127,
+       [1][0][2][0][RTW89_ACMA][11] = 127,
+       [1][0][2][0][RTW89_CHILE][11] = 127,
+       [1][0][2][0][RTW89_UKRAINE][11] = 127,
+       [1][0][2][0][RTW89_MEXICO][11] = 127,
+       [1][0][2][0][RTW89_CN][11] = 127,
+       [1][0][2][0][RTW89_QATAR][11] = 127,
+       [1][0][2][0][RTW89_UK][11] = 127,
+       [1][0][2][0][RTW89_FCC][12] = 127,
+       [1][0][2][0][RTW89_ETSI][12] = 127,
+       [1][0][2][0][RTW89_MKK][12] = 127,
+       [1][0][2][0][RTW89_IC][12] = 127,
+       [1][0][2][0][RTW89_KCC][12] = 127,
+       [1][0][2][0][RTW89_ACMA][12] = 127,
+       [1][0][2][0][RTW89_CHILE][12] = 127,
+       [1][0][2][0][RTW89_UKRAINE][12] = 127,
+       [1][0][2][0][RTW89_MEXICO][12] = 127,
+       [1][0][2][0][RTW89_CN][12] = 127,
+       [1][0][2][0][RTW89_QATAR][12] = 127,
+       [1][0][2][0][RTW89_UK][12] = 127,
+       [1][0][2][0][RTW89_FCC][13] = 127,
+       [1][0][2][0][RTW89_ETSI][13] = 127,
+       [1][0][2][0][RTW89_MKK][13] = 127,
+       [1][0][2][0][RTW89_IC][13] = 127,
+       [1][0][2][0][RTW89_KCC][13] = 127,
+       [1][0][2][0][RTW89_ACMA][13] = 127,
+       [1][0][2][0][RTW89_CHILE][13] = 127,
+       [1][0][2][0][RTW89_UKRAINE][13] = 127,
+       [1][0][2][0][RTW89_MEXICO][13] = 127,
+       [1][0][2][0][RTW89_CN][13] = 127,
+       [1][0][2][0][RTW89_QATAR][13] = 127,
+       [1][0][2][0][RTW89_UK][13] = 127,
+       [1][1][2][0][RTW89_FCC][0] = 127,
+       [1][1][2][0][RTW89_ETSI][0] = 127,
+       [1][1][2][0][RTW89_MKK][0] = 127,
+       [1][1][2][0][RTW89_IC][0] = 127,
+       [1][1][2][0][RTW89_KCC][0] = 127,
+       [1][1][2][0][RTW89_ACMA][0] = 127,
+       [1][1][2][0][RTW89_CHILE][0] = 127,
+       [1][1][2][0][RTW89_UKRAINE][0] = 127,
+       [1][1][2][0][RTW89_MEXICO][0] = 127,
+       [1][1][2][0][RTW89_CN][0] = 127,
+       [1][1][2][0][RTW89_QATAR][0] = 127,
+       [1][1][2][0][RTW89_UK][0] = 127,
+       [1][1][2][0][RTW89_FCC][1] = 127,
+       [1][1][2][0][RTW89_ETSI][1] = 127,
+       [1][1][2][0][RTW89_MKK][1] = 127,
+       [1][1][2][0][RTW89_IC][1] = 127,
+       [1][1][2][0][RTW89_KCC][1] = 127,
+       [1][1][2][0][RTW89_ACMA][1] = 127,
+       [1][1][2][0][RTW89_CHILE][1] = 127,
+       [1][1][2][0][RTW89_UKRAINE][1] = 127,
+       [1][1][2][0][RTW89_MEXICO][1] = 127,
+       [1][1][2][0][RTW89_CN][1] = 127,
+       [1][1][2][0][RTW89_QATAR][1] = 127,
+       [1][1][2][0][RTW89_UK][1] = 127,
+       [1][1][2][0][RTW89_FCC][2] = 54,
+       [1][1][2][0][RTW89_ETSI][2] = 46,
+       [1][1][2][0][RTW89_MKK][2] = 66,
+       [1][1][2][0][RTW89_IC][2] = 54,
+       [1][1][2][0][RTW89_KCC][2] = 62,
+       [1][1][2][0][RTW89_ACMA][2] = 46,
+       [1][1][2][0][RTW89_CHILE][2] = 52,
+       [1][1][2][0][RTW89_UKRAINE][2] = 46,
+       [1][1][2][0][RTW89_MEXICO][2] = 54,
+       [1][1][2][0][RTW89_CN][2] = 46,
+       [1][1][2][0][RTW89_QATAR][2] = 46,
+       [1][1][2][0][RTW89_UK][2] = 46,
+       [1][1][2][0][RTW89_FCC][3] = 54,
+       [1][1][2][0][RTW89_ETSI][3] = 46,
+       [1][1][2][0][RTW89_MKK][3] = 66,
+       [1][1][2][0][RTW89_IC][3] = 54,
+       [1][1][2][0][RTW89_KCC][3] = 62,
+       [1][1][2][0][RTW89_ACMA][3] = 46,
+       [1][1][2][0][RTW89_CHILE][3] = 52,
+       [1][1][2][0][RTW89_UKRAINE][3] = 46,
+       [1][1][2][0][RTW89_MEXICO][3] = 54,
+       [1][1][2][0][RTW89_CN][3] = 46,
+       [1][1][2][0][RTW89_QATAR][3] = 46,
+       [1][1][2][0][RTW89_UK][3] = 46,
+       [1][1][2][0][RTW89_FCC][4] = 58,
+       [1][1][2][0][RTW89_ETSI][4] = 46,
+       [1][1][2][0][RTW89_MKK][4] = 66,
+       [1][1][2][0][RTW89_IC][4] = 58,
+       [1][1][2][0][RTW89_KCC][4] = 62,
+       [1][1][2][0][RTW89_ACMA][4] = 46,
+       [1][1][2][0][RTW89_CHILE][4] = 52,
+       [1][1][2][0][RTW89_UKRAINE][4] = 46,
+       [1][1][2][0][RTW89_MEXICO][4] = 58,
+       [1][1][2][0][RTW89_CN][4] = 46,
+       [1][1][2][0][RTW89_QATAR][4] = 46,
+       [1][1][2][0][RTW89_UK][4] = 46,
+       [1][1][2][0][RTW89_FCC][5] = 66,
+       [1][1][2][0][RTW89_ETSI][5] = 46,
+       [1][1][2][0][RTW89_MKK][5] = 66,
+       [1][1][2][0][RTW89_IC][5] = 66,
+       [1][1][2][0][RTW89_KCC][5] = 62,
+       [1][1][2][0][RTW89_ACMA][5] = 46,
+       [1][1][2][0][RTW89_CHILE][5] = 54,
+       [1][1][2][0][RTW89_UKRAINE][5] = 46,
+       [1][1][2][0][RTW89_MEXICO][5] = 66,
+       [1][1][2][0][RTW89_CN][5] = 46,
+       [1][1][2][0][RTW89_QATAR][5] = 46,
+       [1][1][2][0][RTW89_UK][5] = 46,
+       [1][1][2][0][RTW89_FCC][6] = 58,
+       [1][1][2][0][RTW89_ETSI][6] = 46,
+       [1][1][2][0][RTW89_MKK][6] = 66,
+       [1][1][2][0][RTW89_IC][6] = 58,
+       [1][1][2][0][RTW89_KCC][6] = 62,
+       [1][1][2][0][RTW89_ACMA][6] = 46,
+       [1][1][2][0][RTW89_CHILE][6] = 52,
+       [1][1][2][0][RTW89_UKRAINE][6] = 46,
+       [1][1][2][0][RTW89_MEXICO][6] = 58,
+       [1][1][2][0][RTW89_CN][6] = 46,
+       [1][1][2][0][RTW89_QATAR][6] = 46,
+       [1][1][2][0][RTW89_UK][6] = 46,
+       [1][1][2][0][RTW89_FCC][7] = 54,
+       [1][1][2][0][RTW89_ETSI][7] = 46,
+       [1][1][2][0][RTW89_MKK][7] = 66,
+       [1][1][2][0][RTW89_IC][7] = 54,
+       [1][1][2][0][RTW89_KCC][7] = 62,
+       [1][1][2][0][RTW89_ACMA][7] = 46,
+       [1][1][2][0][RTW89_CHILE][7] = 52,
+       [1][1][2][0][RTW89_UKRAINE][7] = 46,
+       [1][1][2][0][RTW89_MEXICO][7] = 54,
+       [1][1][2][0][RTW89_CN][7] = 46,
+       [1][1][2][0][RTW89_QATAR][7] = 46,
+       [1][1][2][0][RTW89_UK][7] = 46,
+       [1][1][2][0][RTW89_FCC][8] = 54,
+       [1][1][2][0][RTW89_ETSI][8] = 46,
+       [1][1][2][0][RTW89_MKK][8] = 66,
+       [1][1][2][0][RTW89_IC][8] = 54,
+       [1][1][2][0][RTW89_KCC][8] = 62,
+       [1][1][2][0][RTW89_ACMA][8] = 46,
+       [1][1][2][0][RTW89_CHILE][8] = 52,
+       [1][1][2][0][RTW89_UKRAINE][8] = 46,
+       [1][1][2][0][RTW89_MEXICO][8] = 54,
+       [1][1][2][0][RTW89_CN][8] = 46,
+       [1][1][2][0][RTW89_QATAR][8] = 46,
+       [1][1][2][0][RTW89_UK][8] = 46,
+       [1][1][2][0][RTW89_FCC][9] = 42,
+       [1][1][2][0][RTW89_ETSI][9] = 46,
+       [1][1][2][0][RTW89_MKK][9] = 66,
+       [1][1][2][0][RTW89_IC][9] = 42,
+       [1][1][2][0][RTW89_KCC][9] = 62,
+       [1][1][2][0][RTW89_ACMA][9] = 46,
+       [1][1][2][0][RTW89_CHILE][9] = 42,
+       [1][1][2][0][RTW89_UKRAINE][9] = 46,
+       [1][1][2][0][RTW89_MEXICO][9] = 42,
+       [1][1][2][0][RTW89_CN][9] = 46,
+       [1][1][2][0][RTW89_QATAR][9] = 46,
+       [1][1][2][0][RTW89_UK][9] = 46,
+       [1][1][2][0][RTW89_FCC][10] = 38,
+       [1][1][2][0][RTW89_ETSI][10] = 46,
+       [1][1][2][0][RTW89_MKK][10] = 66,
+       [1][1][2][0][RTW89_IC][10] = 38,
+       [1][1][2][0][RTW89_KCC][10] = 62,
+       [1][1][2][0][RTW89_ACMA][10] = 46,
+       [1][1][2][0][RTW89_CHILE][10] = 38,
+       [1][1][2][0][RTW89_UKRAINE][10] = 46,
+       [1][1][2][0][RTW89_MEXICO][10] = 38,
+       [1][1][2][0][RTW89_CN][10] = 46,
+       [1][1][2][0][RTW89_QATAR][10] = 46,
+       [1][1][2][0][RTW89_UK][10] = 46,
+       [1][1][2][0][RTW89_FCC][11] = 127,
+       [1][1][2][0][RTW89_ETSI][11] = 127,
+       [1][1][2][0][RTW89_MKK][11] = 127,
+       [1][1][2][0][RTW89_IC][11] = 127,
+       [1][1][2][0][RTW89_KCC][11] = 127,
+       [1][1][2][0][RTW89_ACMA][11] = 127,
+       [1][1][2][0][RTW89_CHILE][11] = 127,
+       [1][1][2][0][RTW89_UKRAINE][11] = 127,
+       [1][1][2][0][RTW89_MEXICO][11] = 127,
+       [1][1][2][0][RTW89_CN][11] = 127,
+       [1][1][2][0][RTW89_QATAR][11] = 127,
+       [1][1][2][0][RTW89_UK][11] = 127,
+       [1][1][2][0][RTW89_FCC][12] = 127,
+       [1][1][2][0][RTW89_ETSI][12] = 127,
+       [1][1][2][0][RTW89_MKK][12] = 127,
+       [1][1][2][0][RTW89_IC][12] = 127,
+       [1][1][2][0][RTW89_KCC][12] = 127,
+       [1][1][2][0][RTW89_ACMA][12] = 127,
+       [1][1][2][0][RTW89_CHILE][12] = 127,
+       [1][1][2][0][RTW89_UKRAINE][12] = 127,
+       [1][1][2][0][RTW89_MEXICO][12] = 127,
+       [1][1][2][0][RTW89_CN][12] = 127,
+       [1][1][2][0][RTW89_QATAR][12] = 127,
+       [1][1][2][0][RTW89_UK][12] = 127,
+       [1][1][2][0][RTW89_FCC][13] = 127,
+       [1][1][2][0][RTW89_ETSI][13] = 127,
+       [1][1][2][0][RTW89_MKK][13] = 127,
+       [1][1][2][0][RTW89_IC][13] = 127,
+       [1][1][2][0][RTW89_KCC][13] = 127,
+       [1][1][2][0][RTW89_ACMA][13] = 127,
+       [1][1][2][0][RTW89_CHILE][13] = 127,
+       [1][1][2][0][RTW89_UKRAINE][13] = 127,
+       [1][1][2][0][RTW89_MEXICO][13] = 127,
+       [1][1][2][0][RTW89_CN][13] = 127,
+       [1][1][2][0][RTW89_QATAR][13] = 127,
+       [1][1][2][0][RTW89_UK][13] = 127,
+       [1][1][2][1][RTW89_FCC][0] = 127,
+       [1][1][2][1][RTW89_ETSI][0] = 127,
+       [1][1][2][1][RTW89_MKK][0] = 127,
+       [1][1][2][1][RTW89_IC][0] = 127,
+       [1][1][2][1][RTW89_KCC][0] = 127,
+       [1][1][2][1][RTW89_ACMA][0] = 127,
+       [1][1][2][1][RTW89_CHILE][0] = 127,
+       [1][1][2][1][RTW89_UKRAINE][0] = 127,
+       [1][1][2][1][RTW89_MEXICO][0] = 127,
+       [1][1][2][1][RTW89_CN][0] = 127,
+       [1][1][2][1][RTW89_QATAR][0] = 127,
+       [1][1][2][1][RTW89_UK][0] = 127,
+       [1][1][2][1][RTW89_FCC][1] = 127,
+       [1][1][2][1][RTW89_ETSI][1] = 127,
+       [1][1][2][1][RTW89_MKK][1] = 127,
+       [1][1][2][1][RTW89_IC][1] = 127,
+       [1][1][2][1][RTW89_KCC][1] = 127,
+       [1][1][2][1][RTW89_ACMA][1] = 127,
+       [1][1][2][1][RTW89_CHILE][1] = 127,
+       [1][1][2][1][RTW89_UKRAINE][1] = 127,
+       [1][1][2][1][RTW89_MEXICO][1] = 127,
+       [1][1][2][1][RTW89_CN][1] = 127,
+       [1][1][2][1][RTW89_QATAR][1] = 127,
+       [1][1][2][1][RTW89_UK][1] = 127,
+       [1][1][2][1][RTW89_FCC][2] = 54,
+       [1][1][2][1][RTW89_ETSI][2] = 34,
+       [1][1][2][1][RTW89_MKK][2] = 66,
+       [1][1][2][1][RTW89_IC][2] = 54,
+       [1][1][2][1][RTW89_KCC][2] = 62,
+       [1][1][2][1][RTW89_ACMA][2] = 34,
+       [1][1][2][1][RTW89_CHILE][2] = 42,
+       [1][1][2][1][RTW89_UKRAINE][2] = 34,
+       [1][1][2][1][RTW89_MEXICO][2] = 54,
+       [1][1][2][1][RTW89_CN][2] = 34,
+       [1][1][2][1][RTW89_QATAR][2] = 34,
+       [1][1][2][1][RTW89_UK][2] = 34,
+       [1][1][2][1][RTW89_FCC][3] = 54,
+       [1][1][2][1][RTW89_ETSI][3] = 34,
+       [1][1][2][1][RTW89_MKK][3] = 66,
+       [1][1][2][1][RTW89_IC][3] = 54,
+       [1][1][2][1][RTW89_KCC][3] = 62,
+       [1][1][2][1][RTW89_ACMA][3] = 34,
+       [1][1][2][1][RTW89_CHILE][3] = 42,
+       [1][1][2][1][RTW89_UKRAINE][3] = 34,
+       [1][1][2][1][RTW89_MEXICO][3] = 54,
+       [1][1][2][1][RTW89_CN][3] = 34,
+       [1][1][2][1][RTW89_QATAR][3] = 34,
+       [1][1][2][1][RTW89_UK][3] = 34,
+       [1][1][2][1][RTW89_FCC][4] = 58,
+       [1][1][2][1][RTW89_ETSI][4] = 34,
+       [1][1][2][1][RTW89_MKK][4] = 66,
+       [1][1][2][1][RTW89_IC][4] = 58,
+       [1][1][2][1][RTW89_KCC][4] = 62,
+       [1][1][2][1][RTW89_ACMA][4] = 34,
+       [1][1][2][1][RTW89_CHILE][4] = 42,
+       [1][1][2][1][RTW89_UKRAINE][4] = 34,
+       [1][1][2][1][RTW89_MEXICO][4] = 58,
+       [1][1][2][1][RTW89_CN][4] = 34,
+       [1][1][2][1][RTW89_QATAR][4] = 34,
+       [1][1][2][1][RTW89_UK][4] = 34,
+       [1][1][2][1][RTW89_FCC][5] = 66,
+       [1][1][2][1][RTW89_ETSI][5] = 34,
+       [1][1][2][1][RTW89_MKK][5] = 66,
+       [1][1][2][1][RTW89_IC][5] = 66,
+       [1][1][2][1][RTW89_KCC][5] = 62,
+       [1][1][2][1][RTW89_ACMA][5] = 34,
+       [1][1][2][1][RTW89_CHILE][5] = 42,
+       [1][1][2][1][RTW89_UKRAINE][5] = 34,
+       [1][1][2][1][RTW89_MEXICO][5] = 66,
+       [1][1][2][1][RTW89_CN][5] = 34,
+       [1][1][2][1][RTW89_QATAR][5] = 34,
+       [1][1][2][1][RTW89_UK][5] = 34,
+       [1][1][2][1][RTW89_FCC][6] = 58,
+       [1][1][2][1][RTW89_ETSI][6] = 34,
+       [1][1][2][1][RTW89_MKK][6] = 66,
+       [1][1][2][1][RTW89_IC][6] = 58,
+       [1][1][2][1][RTW89_KCC][6] = 62,
+       [1][1][2][1][RTW89_ACMA][6] = 34,
+       [1][1][2][1][RTW89_CHILE][6] = 42,
+       [1][1][2][1][RTW89_UKRAINE][6] = 34,
+       [1][1][2][1][RTW89_MEXICO][6] = 58,
+       [1][1][2][1][RTW89_CN][6] = 34,
+       [1][1][2][1][RTW89_QATAR][6] = 34,
+       [1][1][2][1][RTW89_UK][6] = 34,
+       [1][1][2][1][RTW89_FCC][7] = 54,
+       [1][1][2][1][RTW89_ETSI][7] = 34,
+       [1][1][2][1][RTW89_MKK][7] = 66,
+       [1][1][2][1][RTW89_IC][7] = 54,
+       [1][1][2][1][RTW89_KCC][7] = 62,
+       [1][1][2][1][RTW89_ACMA][7] = 34,
+       [1][1][2][1][RTW89_CHILE][7] = 42,
+       [1][1][2][1][RTW89_UKRAINE][7] = 34,
+       [1][1][2][1][RTW89_MEXICO][7] = 54,
+       [1][1][2][1][RTW89_CN][7] = 34,
+       [1][1][2][1][RTW89_QATAR][7] = 34,
+       [1][1][2][1][RTW89_UK][7] = 34,
+       [1][1][2][1][RTW89_FCC][8] = 54,
+       [1][1][2][1][RTW89_ETSI][8] = 34,
+       [1][1][2][1][RTW89_MKK][8] = 66,
+       [1][1][2][1][RTW89_IC][8] = 54,
+       [1][1][2][1][RTW89_KCC][8] = 62,
+       [1][1][2][1][RTW89_ACMA][8] = 34,
+       [1][1][2][1][RTW89_CHILE][8] = 42,
+       [1][1][2][1][RTW89_UKRAINE][8] = 34,
+       [1][1][2][1][RTW89_MEXICO][8] = 54,
+       [1][1][2][1][RTW89_CN][8] = 34,
+       [1][1][2][1][RTW89_QATAR][8] = 34,
+       [1][1][2][1][RTW89_UK][8] = 34,
+       [1][1][2][1][RTW89_FCC][9] = 42,
+       [1][1][2][1][RTW89_ETSI][9] = 34,
+       [1][1][2][1][RTW89_MKK][9] = 66,
+       [1][1][2][1][RTW89_IC][9] = 42,
+       [1][1][2][1][RTW89_KCC][9] = 62,
+       [1][1][2][1][RTW89_ACMA][9] = 34,
+       [1][1][2][1][RTW89_CHILE][9] = 42,
+       [1][1][2][1][RTW89_UKRAINE][9] = 34,
+       [1][1][2][1][RTW89_MEXICO][9] = 42,
+       [1][1][2][1][RTW89_CN][9] = 34,
+       [1][1][2][1][RTW89_QATAR][9] = 34,
+       [1][1][2][1][RTW89_UK][9] = 34,
+       [1][1][2][1][RTW89_FCC][10] = 38,
+       [1][1][2][1][RTW89_ETSI][10] = 34,
+       [1][1][2][1][RTW89_MKK][10] = 66,
+       [1][1][2][1][RTW89_IC][10] = 38,
+       [1][1][2][1][RTW89_KCC][10] = 62,
+       [1][1][2][1][RTW89_ACMA][10] = 34,
+       [1][1][2][1][RTW89_CHILE][10] = 38,
+       [1][1][2][1][RTW89_UKRAINE][10] = 34,
+       [1][1][2][1][RTW89_MEXICO][10] = 38,
+       [1][1][2][1][RTW89_CN][10] = 34,
+       [1][1][2][1][RTW89_QATAR][10] = 34,
+       [1][1][2][1][RTW89_UK][10] = 34,
+       [1][1][2][1][RTW89_FCC][11] = 127,
+       [1][1][2][1][RTW89_ETSI][11] = 127,
+       [1][1][2][1][RTW89_MKK][11] = 127,
+       [1][1][2][1][RTW89_IC][11] = 127,
+       [1][1][2][1][RTW89_KCC][11] = 127,
+       [1][1][2][1][RTW89_ACMA][11] = 127,
+       [1][1][2][1][RTW89_CHILE][11] = 127,
+       [1][1][2][1][RTW89_UKRAINE][11] = 127,
+       [1][1][2][1][RTW89_MEXICO][11] = 127,
+       [1][1][2][1][RTW89_CN][11] = 127,
+       [1][1][2][1][RTW89_QATAR][11] = 127,
+       [1][1][2][1][RTW89_UK][11] = 127,
+       [1][1][2][1][RTW89_FCC][12] = 127,
+       [1][1][2][1][RTW89_ETSI][12] = 127,
+       [1][1][2][1][RTW89_MKK][12] = 127,
+       [1][1][2][1][RTW89_IC][12] = 127,
+       [1][1][2][1][RTW89_KCC][12] = 127,
+       [1][1][2][1][RTW89_ACMA][12] = 127,
+       [1][1][2][1][RTW89_CHILE][12] = 127,
+       [1][1][2][1][RTW89_UKRAINE][12] = 127,
+       [1][1][2][1][RTW89_MEXICO][12] = 127,
+       [1][1][2][1][RTW89_CN][12] = 127,
+       [1][1][2][1][RTW89_QATAR][12] = 127,
+       [1][1][2][1][RTW89_UK][12] = 127,
+       [1][1][2][1][RTW89_FCC][13] = 127,
+       [1][1][2][1][RTW89_ETSI][13] = 127,
+       [1][1][2][1][RTW89_MKK][13] = 127,
+       [1][1][2][1][RTW89_IC][13] = 127,
+       [1][1][2][1][RTW89_KCC][13] = 127,
+       [1][1][2][1][RTW89_ACMA][13] = 127,
+       [1][1][2][1][RTW89_CHILE][13] = 127,
+       [1][1][2][1][RTW89_UKRAINE][13] = 127,
+       [1][1][2][1][RTW89_MEXICO][13] = 127,
+       [1][1][2][1][RTW89_CN][13] = 127,
+       [1][1][2][1][RTW89_QATAR][13] = 127,
+       [1][1][2][1][RTW89_UK][13] = 127,
+};
+
+const s8 rtw89_8852b_txpwr_lmt_5g[RTW89_5G_BW_NUM][RTW89_NTX_NUM]
+                                [RTW89_RS_LMT_NUM][RTW89_BF_NUM]
+                                [RTW89_REGD_NUM][RTW89_5G_CH_NUM] = {
+       [0][0][1][0][RTW89_WW][0] = 42,
+       [0][0][1][0][RTW89_WW][2] = 42,
+       [0][0][1][0][RTW89_WW][4] = 42,
+       [0][0][1][0][RTW89_WW][6] = 42,
+       [0][0][1][0][RTW89_WW][8] = 52,
+       [0][0][1][0][RTW89_WW][10] = 52,
+       [0][0][1][0][RTW89_WW][12] = 52,
+       [0][0][1][0][RTW89_WW][14] = 52,
+       [0][0][1][0][RTW89_WW][15] = 52,
+       [0][0][1][0][RTW89_WW][17] = 52,
+       [0][0][1][0][RTW89_WW][19] = 52,
+       [0][0][1][0][RTW89_WW][21] = 52,
+       [0][0][1][0][RTW89_WW][23] = 52,
+       [0][0][1][0][RTW89_WW][25] = 52,
+       [0][0][1][0][RTW89_WW][27] = 52,
+       [0][0][1][0][RTW89_WW][29] = 52,
+       [0][0][1][0][RTW89_WW][31] = 52,
+       [0][0][1][0][RTW89_WW][33] = 52,
+       [0][0][1][0][RTW89_WW][35] = 52,
+       [0][0][1][0][RTW89_WW][37] = 68,
+       [0][0][1][0][RTW89_WW][38] = 28,
+       [0][0][1][0][RTW89_WW][40] = 28,
+       [0][0][1][0][RTW89_WW][42] = 28,
+       [0][0][1][0][RTW89_WW][44] = 28,
+       [0][0][1][0][RTW89_WW][46] = 28,
+       [0][0][1][0][RTW89_WW][48] = 78,
+       [0][0][1][0][RTW89_WW][50] = 78,
+       [0][0][1][0][RTW89_WW][52] = 78,
+       [0][1][1][0][RTW89_WW][0] = 30,
+       [0][1][1][0][RTW89_WW][2] = 32,
+       [0][1][1][0][RTW89_WW][4] = 30,
+       [0][1][1][0][RTW89_WW][6] = 30,
+       [0][1][1][0][RTW89_WW][8] = 40,
+       [0][1][1][0][RTW89_WW][10] = 40,
+       [0][1][1][0][RTW89_WW][12] = 40,
+       [0][1][1][0][RTW89_WW][14] = 40,
+       [0][1][1][0][RTW89_WW][15] = 40,
+       [0][1][1][0][RTW89_WW][17] = 40,
+       [0][1][1][0][RTW89_WW][19] = 40,
+       [0][1][1][0][RTW89_WW][21] = 40,
+       [0][1][1][0][RTW89_WW][23] = 40,
+       [0][1][1][0][RTW89_WW][25] = 40,
+       [0][1][1][0][RTW89_WW][27] = 40,
+       [0][1][1][0][RTW89_WW][29] = 40,
+       [0][1][1][0][RTW89_WW][31] = 40,
+       [0][1][1][0][RTW89_WW][33] = 40,
+       [0][1][1][0][RTW89_WW][35] = 40,
+       [0][1][1][0][RTW89_WW][37] = 50,
+       [0][1][1][0][RTW89_WW][38] = 16,
+       [0][1][1][0][RTW89_WW][40] = 16,
+       [0][1][1][0][RTW89_WW][42] = 16,
+       [0][1][1][0][RTW89_WW][44] = 16,
+       [0][1][1][0][RTW89_WW][46] = 16,
+       [0][1][1][0][RTW89_WW][48] = 56,
+       [0][1][1][0][RTW89_WW][50] = 56,
+       [0][1][1][0][RTW89_WW][52] = 56,
+       [0][0][2][0][RTW89_WW][0] = 42,
+       [0][0][2][0][RTW89_WW][2] = 42,
+       [0][0][2][0][RTW89_WW][4] = 42,
+       [0][0][2][0][RTW89_WW][6] = 42,
+       [0][0][2][0][RTW89_WW][8] = 52,
+       [0][0][2][0][RTW89_WW][10] = 52,
+       [0][0][2][0][RTW89_WW][12] = 52,
+       [0][0][2][0][RTW89_WW][14] = 52,
+       [0][0][2][0][RTW89_WW][15] = 52,
+       [0][0][2][0][RTW89_WW][17] = 52,
+       [0][0][2][0][RTW89_WW][19] = 52,
+       [0][0][2][0][RTW89_WW][21] = 52,
+       [0][0][2][0][RTW89_WW][23] = 52,
+       [0][0][2][0][RTW89_WW][25] = 52,
+       [0][0][2][0][RTW89_WW][27] = 52,
+       [0][0][2][0][RTW89_WW][29] = 52,
+       [0][0][2][0][RTW89_WW][31] = 52,
+       [0][0][2][0][RTW89_WW][33] = 52,
+       [0][0][2][0][RTW89_WW][35] = 52,
+       [0][0][2][0][RTW89_WW][37] = 64,
+       [0][0][2][0][RTW89_WW][38] = 28,
+       [0][0][2][0][RTW89_WW][40] = 28,
+       [0][0][2][0][RTW89_WW][42] = 28,
+       [0][0][2][0][RTW89_WW][44] = 28,
+       [0][0][2][0][RTW89_WW][46] = 28,
+       [0][0][2][0][RTW89_WW][48] = 78,
+       [0][0][2][0][RTW89_WW][50] = 78,
+       [0][0][2][0][RTW89_WW][52] = 78,
+       [0][1][2][0][RTW89_WW][0] = 30,
+       [0][1][2][0][RTW89_WW][2] = 30,
+       [0][1][2][0][RTW89_WW][4] = 30,
+       [0][1][2][0][RTW89_WW][6] = 30,
+       [0][1][2][0][RTW89_WW][8] = 40,
+       [0][1][2][0][RTW89_WW][10] = 40,
+       [0][1][2][0][RTW89_WW][12] = 40,
+       [0][1][2][0][RTW89_WW][14] = 40,
+       [0][1][2][0][RTW89_WW][15] = 40,
+       [0][1][2][0][RTW89_WW][17] = 40,
+       [0][1][2][0][RTW89_WW][19] = 40,
+       [0][1][2][0][RTW89_WW][21] = 40,
+       [0][1][2][0][RTW89_WW][23] = 40,
+       [0][1][2][0][RTW89_WW][25] = 40,
+       [0][1][2][0][RTW89_WW][27] = 40,
+       [0][1][2][0][RTW89_WW][29] = 40,
+       [0][1][2][0][RTW89_WW][31] = 40,
+       [0][1][2][0][RTW89_WW][33] = 40,
+       [0][1][2][0][RTW89_WW][35] = 40,
+       [0][1][2][0][RTW89_WW][37] = 50,
+       [0][1][2][0][RTW89_WW][38] = 16,
+       [0][1][2][0][RTW89_WW][40] = 16,
+       [0][1][2][0][RTW89_WW][42] = 16,
+       [0][1][2][0][RTW89_WW][44] = 16,
+       [0][1][2][0][RTW89_WW][46] = 16,
+       [0][1][2][0][RTW89_WW][48] = 58,
+       [0][1][2][0][RTW89_WW][50] = 58,
+       [0][1][2][0][RTW89_WW][52] = 58,
+       [0][1][2][1][RTW89_WW][0] = 14,
+       [0][1][2][1][RTW89_WW][2] = 14,
+       [0][1][2][1][RTW89_WW][4] = 14,
+       [0][1][2][1][RTW89_WW][6] = 14,
+       [0][1][2][1][RTW89_WW][8] = 28,
+       [0][1][2][1][RTW89_WW][10] = 28,
+       [0][1][2][1][RTW89_WW][12] = 28,
+       [0][1][2][1][RTW89_WW][14] = 28,
+       [0][1][2][1][RTW89_WW][15] = 28,
+       [0][1][2][1][RTW89_WW][17] = 28,
+       [0][1][2][1][RTW89_WW][19] = 28,
+       [0][1][2][1][RTW89_WW][21] = 28,
+       [0][1][2][1][RTW89_WW][23] = 28,
+       [0][1][2][1][RTW89_WW][25] = 28,
+       [0][1][2][1][RTW89_WW][27] = 28,
+       [0][1][2][1][RTW89_WW][29] = 28,
+       [0][1][2][1][RTW89_WW][31] = 28,
+       [0][1][2][1][RTW89_WW][33] = 28,
+       [0][1][2][1][RTW89_WW][35] = 28,
+       [0][1][2][1][RTW89_WW][37] = 36,
+       [0][1][2][1][RTW89_WW][38] = 4,
+       [0][1][2][1][RTW89_WW][40] = 4,
+       [0][1][2][1][RTW89_WW][42] = 4,
+       [0][1][2][1][RTW89_WW][44] = 4,
+       [0][1][2][1][RTW89_WW][46] = 4,
+       [0][1][2][1][RTW89_WW][48] = 58,
+       [0][1][2][1][RTW89_WW][50] = 58,
+       [0][1][2][1][RTW89_WW][52] = 58,
+       [1][0][2][0][RTW89_WW][1] = 42,
+       [1][0][2][0][RTW89_WW][5] = 42,
+       [1][0][2][0][RTW89_WW][9] = 52,
+       [1][0][2][0][RTW89_WW][13] = 52,
+       [1][0][2][0][RTW89_WW][16] = 52,
+       [1][0][2][0][RTW89_WW][20] = 52,
+       [1][0][2][0][RTW89_WW][24] = 52,
+       [1][0][2][0][RTW89_WW][28] = 52,
+       [1][0][2][0][RTW89_WW][32] = 52,
+       [1][0][2][0][RTW89_WW][36] = 64,
+       [1][0][2][0][RTW89_WW][39] = 28,
+       [1][0][2][0][RTW89_WW][43] = 28,
+       [1][0][2][0][RTW89_WW][47] = 78,
+       [1][0][2][0][RTW89_WW][51] = 70,
+       [1][1][2][0][RTW89_WW][1] = 30,
+       [1][1][2][0][RTW89_WW][5] = 30,
+       [1][1][2][0][RTW89_WW][9] = 40,
+       [1][1][2][0][RTW89_WW][13] = 40,
+       [1][1][2][0][RTW89_WW][16] = 40,
+       [1][1][2][0][RTW89_WW][20] = 40,
+       [1][1][2][0][RTW89_WW][24] = 40,
+       [1][1][2][0][RTW89_WW][28] = 40,
+       [1][1][2][0][RTW89_WW][32] = 40,
+       [1][1][2][0][RTW89_WW][36] = 50,
+       [1][1][2][0][RTW89_WW][39] = 16,
+       [1][1][2][0][RTW89_WW][43] = 16,
+       [1][1][2][0][RTW89_WW][47] = 68,
+       [1][1][2][0][RTW89_WW][51] = 66,
+       [1][1][2][1][RTW89_WW][1] = 16,
+       [1][1][2][1][RTW89_WW][5] = 16,
+       [1][1][2][1][RTW89_WW][9] = 28,
+       [1][1][2][1][RTW89_WW][13] = 28,
+       [1][1][2][1][RTW89_WW][16] = 28,
+       [1][1][2][1][RTW89_WW][20] = 28,
+       [1][1][2][1][RTW89_WW][24] = 28,
+       [1][1][2][1][RTW89_WW][28] = 28,
+       [1][1][2][1][RTW89_WW][32] = 28,
+       [1][1][2][1][RTW89_WW][36] = 36,
+       [1][1][2][1][RTW89_WW][39] = 4,
+       [1][1][2][1][RTW89_WW][43] = 4,
+       [1][1][2][1][RTW89_WW][47] = 68,
+       [1][1][2][1][RTW89_WW][51] = 66,
+       [2][0][2][0][RTW89_WW][3] = 42,
+       [2][0][2][0][RTW89_WW][11] = 52,
+       [2][0][2][0][RTW89_WW][18] = 52,
+       [2][0][2][0][RTW89_WW][26] = 52,
+       [2][0][2][0][RTW89_WW][34] = 64,
+       [2][0][2][0][RTW89_WW][41] = 28,
+       [2][0][2][0][RTW89_WW][49] = 64,
+       [2][1][2][0][RTW89_WW][3] = 28,
+       [2][1][2][0][RTW89_WW][11] = 40,
+       [2][1][2][0][RTW89_WW][18] = 40,
+       [2][1][2][0][RTW89_WW][26] = 40,
+       [2][1][2][0][RTW89_WW][34] = 50,
+       [2][1][2][0][RTW89_WW][41] = 16,
+       [2][1][2][0][RTW89_WW][49] = 58,
+       [2][1][2][1][RTW89_WW][3] = 16,
+       [2][1][2][1][RTW89_WW][11] = 28,
+       [2][1][2][1][RTW89_WW][18] = 28,
+       [2][1][2][1][RTW89_WW][26] = 28,
+       [2][1][2][1][RTW89_WW][34] = 34,
+       [2][1][2][1][RTW89_WW][41] = 4,
+       [2][1][2][1][RTW89_WW][49] = 58,
+       [0][0][1][0][RTW89_FCC][0] = 78,
+       [0][0][1][0][RTW89_ETSI][0] = 58,
+       [0][0][1][0][RTW89_MKK][0] = 60,
+       [0][0][1][0][RTW89_IC][0] = 60,
+       [0][0][1][0][RTW89_KCC][0] = 76,
+       [0][0][1][0][RTW89_ACMA][0] = 58,
+       [0][0][1][0][RTW89_CHILE][0] = 42,
+       [0][0][1][0][RTW89_UKRAINE][0] = 52,
+       [0][0][1][0][RTW89_MEXICO][0] = 62,
+       [0][0][1][0][RTW89_CN][0] = 58,
+       [0][0][1][0][RTW89_QATAR][0] = 58,
+       [0][0][1][0][RTW89_UK][0] = 58,
+       [0][0][1][0][RTW89_FCC][2] = 78,
+       [0][0][1][0][RTW89_ETSI][2] = 58,
+       [0][0][1][0][RTW89_MKK][2] = 60,
+       [0][0][1][0][RTW89_IC][2] = 60,
+       [0][0][1][0][RTW89_KCC][2] = 76,
+       [0][0][1][0][RTW89_ACMA][2] = 58,
+       [0][0][1][0][RTW89_CHILE][2] = 42,
+       [0][0][1][0][RTW89_UKRAINE][2] = 52,
+       [0][0][1][0][RTW89_MEXICO][2] = 62,
+       [0][0][1][0][RTW89_CN][2] = 58,
+       [0][0][1][0][RTW89_QATAR][2] = 58,
+       [0][0][1][0][RTW89_UK][2] = 58,
+       [0][0][1][0][RTW89_FCC][4] = 78,
+       [0][0][1][0][RTW89_ETSI][4] = 58,
+       [0][0][1][0][RTW89_MKK][4] = 60,
+       [0][0][1][0][RTW89_IC][4] = 60,
+       [0][0][1][0][RTW89_KCC][4] = 76,
+       [0][0][1][0][RTW89_ACMA][4] = 58,
+       [0][0][1][0][RTW89_CHILE][4] = 42,
+       [0][0][1][0][RTW89_UKRAINE][4] = 52,
+       [0][0][1][0][RTW89_MEXICO][4] = 62,
+       [0][0][1][0][RTW89_CN][4] = 58,
+       [0][0][1][0][RTW89_QATAR][4] = 58,
+       [0][0][1][0][RTW89_UK][4] = 58,
+       [0][0][1][0][RTW89_FCC][6] = 78,
+       [0][0][1][0][RTW89_ETSI][6] = 58,
+       [0][0][1][0][RTW89_MKK][6] = 60,
+       [0][0][1][0][RTW89_IC][6] = 60,
+       [0][0][1][0][RTW89_KCC][6] = 50,
+       [0][0][1][0][RTW89_ACMA][6] = 58,
+       [0][0][1][0][RTW89_CHILE][6] = 42,
+       [0][0][1][0][RTW89_UKRAINE][6] = 52,
+       [0][0][1][0][RTW89_MEXICO][6] = 62,
+       [0][0][1][0][RTW89_CN][6] = 58,
+       [0][0][1][0][RTW89_QATAR][6] = 58,
+       [0][0][1][0][RTW89_UK][6] = 58,
+       [0][0][1][0][RTW89_FCC][8] = 78,
+       [0][0][1][0][RTW89_ETSI][8] = 58,
+       [0][0][1][0][RTW89_MKK][8] = 62,
+       [0][0][1][0][RTW89_IC][8] = 64,
+       [0][0][1][0][RTW89_KCC][8] = 70,
+       [0][0][1][0][RTW89_ACMA][8] = 58,
+       [0][0][1][0][RTW89_CHILE][8] = 66,
+       [0][0][1][0][RTW89_UKRAINE][8] = 52,
+       [0][0][1][0][RTW89_MEXICO][8] = 78,
+       [0][0][1][0][RTW89_CN][8] = 58,
+       [0][0][1][0][RTW89_QATAR][8] = 58,
+       [0][0][1][0][RTW89_UK][8] = 58,
+       [0][0][1][0][RTW89_FCC][10] = 78,
+       [0][0][1][0][RTW89_ETSI][10] = 58,
+       [0][0][1][0][RTW89_MKK][10] = 62,
+       [0][0][1][0][RTW89_IC][10] = 64,
+       [0][0][1][0][RTW89_KCC][10] = 70,
+       [0][0][1][0][RTW89_ACMA][10] = 58,
+       [0][0][1][0][RTW89_CHILE][10] = 66,
+       [0][0][1][0][RTW89_UKRAINE][10] = 52,
+       [0][0][1][0][RTW89_MEXICO][10] = 78,
+       [0][0][1][0][RTW89_CN][10] = 58,
+       [0][0][1][0][RTW89_QATAR][10] = 58,
+       [0][0][1][0][RTW89_UK][10] = 58,
+       [0][0][1][0][RTW89_FCC][12] = 78,
+       [0][0][1][0][RTW89_ETSI][12] = 58,
+       [0][0][1][0][RTW89_MKK][12] = 62,
+       [0][0][1][0][RTW89_IC][12] = 64,
+       [0][0][1][0][RTW89_KCC][12] = 74,
+       [0][0][1][0][RTW89_ACMA][12] = 58,
+       [0][0][1][0][RTW89_CHILE][12] = 66,
+       [0][0][1][0][RTW89_UKRAINE][12] = 52,
+       [0][0][1][0][RTW89_MEXICO][12] = 78,
+       [0][0][1][0][RTW89_CN][12] = 58,
+       [0][0][1][0][RTW89_QATAR][12] = 58,
+       [0][0][1][0][RTW89_UK][12] = 58,
+       [0][0][1][0][RTW89_FCC][14] = 78,
+       [0][0][1][0][RTW89_ETSI][14] = 58,
+       [0][0][1][0][RTW89_MKK][14] = 60,
+       [0][0][1][0][RTW89_IC][14] = 64,
+       [0][0][1][0][RTW89_KCC][14] = 74,
+       [0][0][1][0][RTW89_ACMA][14] = 58,
+       [0][0][1][0][RTW89_CHILE][14] = 66,
+       [0][0][1][0][RTW89_UKRAINE][14] = 52,
+       [0][0][1][0][RTW89_MEXICO][14] = 78,
+       [0][0][1][0][RTW89_CN][14] = 58,
+       [0][0][1][0][RTW89_QATAR][14] = 58,
+       [0][0][1][0][RTW89_UK][14] = 58,
+       [0][0][1][0][RTW89_FCC][15] = 76,
+       [0][0][1][0][RTW89_ETSI][15] = 58,
+       [0][0][1][0][RTW89_MKK][15] = 76,
+       [0][0][1][0][RTW89_IC][15] = 76,
+       [0][0][1][0][RTW89_KCC][15] = 74,
+       [0][0][1][0][RTW89_ACMA][15] = 58,
+       [0][0][1][0][RTW89_CHILE][15] = 66,
+       [0][0][1][0][RTW89_UKRAINE][15] = 52,
+       [0][0][1][0][RTW89_MEXICO][15] = 76,
+       [0][0][1][0][RTW89_CN][15] = 127,
+       [0][0][1][0][RTW89_QATAR][15] = 58,
+       [0][0][1][0][RTW89_UK][15] = 58,
+       [0][0][1][0][RTW89_FCC][17] = 78,
+       [0][0][1][0][RTW89_ETSI][17] = 58,
+       [0][0][1][0][RTW89_MKK][17] = 76,
+       [0][0][1][0][RTW89_IC][17] = 78,
+       [0][0][1][0][RTW89_KCC][17] = 74,
+       [0][0][1][0][RTW89_ACMA][17] = 58,
+       [0][0][1][0][RTW89_CHILE][17] = 66,
+       [0][0][1][0][RTW89_UKRAINE][17] = 52,
+       [0][0][1][0][RTW89_MEXICO][17] = 78,
+       [0][0][1][0][RTW89_CN][17] = 127,
+       [0][0][1][0][RTW89_QATAR][17] = 58,
+       [0][0][1][0][RTW89_UK][17] = 58,
+       [0][0][1][0][RTW89_FCC][19] = 78,
+       [0][0][1][0][RTW89_ETSI][19] = 58,
+       [0][0][1][0][RTW89_MKK][19] = 76,
+       [0][0][1][0][RTW89_IC][19] = 78,
+       [0][0][1][0][RTW89_KCC][19] = 74,
+       [0][0][1][0][RTW89_ACMA][19] = 58,
+       [0][0][1][0][RTW89_CHILE][19] = 66,
+       [0][0][1][0][RTW89_UKRAINE][19] = 52,
+       [0][0][1][0][RTW89_MEXICO][19] = 78,
+       [0][0][1][0][RTW89_CN][19] = 127,
+       [0][0][1][0][RTW89_QATAR][19] = 58,
+       [0][0][1][0][RTW89_UK][19] = 58,
+       [0][0][1][0][RTW89_FCC][21] = 78,
+       [0][0][1][0][RTW89_ETSI][21] = 58,
+       [0][0][1][0][RTW89_MKK][21] = 76,
+       [0][0][1][0][RTW89_IC][21] = 78,
+       [0][0][1][0][RTW89_KCC][21] = 74,
+       [0][0][1][0][RTW89_ACMA][21] = 58,
+       [0][0][1][0][RTW89_CHILE][21] = 68,
+       [0][0][1][0][RTW89_UKRAINE][21] = 52,
+       [0][0][1][0][RTW89_MEXICO][21] = 78,
+       [0][0][1][0][RTW89_CN][21] = 127,
+       [0][0][1][0][RTW89_QATAR][21] = 58,
+       [0][0][1][0][RTW89_UK][21] = 58,
+       [0][0][1][0][RTW89_FCC][23] = 78,
+       [0][0][1][0][RTW89_ETSI][23] = 58,
+       [0][0][1][0][RTW89_MKK][23] = 76,
+       [0][0][1][0][RTW89_IC][23] = 78,
+       [0][0][1][0][RTW89_KCC][23] = 74,
+       [0][0][1][0][RTW89_ACMA][23] = 58,
+       [0][0][1][0][RTW89_CHILE][23] = 68,
+       [0][0][1][0][RTW89_UKRAINE][23] = 52,
+       [0][0][1][0][RTW89_MEXICO][23] = 78,
+       [0][0][1][0][RTW89_CN][23] = 127,
+       [0][0][1][0][RTW89_QATAR][23] = 58,
+       [0][0][1][0][RTW89_UK][23] = 58,
+       [0][0][1][0][RTW89_FCC][25] = 78,
+       [0][0][1][0][RTW89_ETSI][25] = 58,
+       [0][0][1][0][RTW89_MKK][25] = 76,
+       [0][0][1][0][RTW89_IC][25] = 127,
+       [0][0][1][0][RTW89_KCC][25] = 74,
+       [0][0][1][0][RTW89_ACMA][25] = 127,
+       [0][0][1][0][RTW89_CHILE][25] = 68,
+       [0][0][1][0][RTW89_UKRAINE][25] = 52,
+       [0][0][1][0][RTW89_MEXICO][25] = 78,
+       [0][0][1][0][RTW89_CN][25] = 127,
+       [0][0][1][0][RTW89_QATAR][25] = 58,
+       [0][0][1][0][RTW89_UK][25] = 58,
+       [0][0][1][0][RTW89_FCC][27] = 78,
+       [0][0][1][0][RTW89_ETSI][27] = 58,
+       [0][0][1][0][RTW89_MKK][27] = 76,
+       [0][0][1][0][RTW89_IC][27] = 127,
+       [0][0][1][0][RTW89_KCC][27] = 74,
+       [0][0][1][0][RTW89_ACMA][27] = 127,
+       [0][0][1][0][RTW89_CHILE][27] = 66,
+       [0][0][1][0][RTW89_UKRAINE][27] = 52,
+       [0][0][1][0][RTW89_MEXICO][27] = 78,
+       [0][0][1][0][RTW89_CN][27] = 127,
+       [0][0][1][0][RTW89_QATAR][27] = 58,
+       [0][0][1][0][RTW89_UK][27] = 58,
+       [0][0][1][0][RTW89_FCC][29] = 78,
+       [0][0][1][0][RTW89_ETSI][29] = 58,
+       [0][0][1][0][RTW89_MKK][29] = 76,
+       [0][0][1][0][RTW89_IC][29] = 127,
+       [0][0][1][0][RTW89_KCC][29] = 74,
+       [0][0][1][0][RTW89_ACMA][29] = 127,
+       [0][0][1][0][RTW89_CHILE][29] = 66,
+       [0][0][1][0][RTW89_UKRAINE][29] = 52,
+       [0][0][1][0][RTW89_MEXICO][29] = 78,
+       [0][0][1][0][RTW89_CN][29] = 127,
+       [0][0][1][0][RTW89_QATAR][29] = 58,
+       [0][0][1][0][RTW89_UK][29] = 58,
+       [0][0][1][0][RTW89_FCC][31] = 78,
+       [0][0][1][0][RTW89_ETSI][31] = 58,
+       [0][0][1][0][RTW89_MKK][31] = 76,
+       [0][0][1][0][RTW89_IC][31] = 78,
+       [0][0][1][0][RTW89_KCC][31] = 72,
+       [0][0][1][0][RTW89_ACMA][31] = 58,
+       [0][0][1][0][RTW89_CHILE][31] = 66,
+       [0][0][1][0][RTW89_UKRAINE][31] = 52,
+       [0][0][1][0][RTW89_MEXICO][31] = 78,
+       [0][0][1][0][RTW89_CN][31] = 127,
+       [0][0][1][0][RTW89_QATAR][31] = 58,
+       [0][0][1][0][RTW89_UK][31] = 58,
+       [0][0][1][0][RTW89_FCC][33] = 78,
+       [0][0][1][0][RTW89_ETSI][33] = 58,
+       [0][0][1][0][RTW89_MKK][33] = 76,
+       [0][0][1][0][RTW89_IC][33] = 78,
+       [0][0][1][0][RTW89_KCC][33] = 72,
+       [0][0][1][0][RTW89_ACMA][33] = 58,
+       [0][0][1][0][RTW89_CHILE][33] = 66,
+       [0][0][1][0][RTW89_UKRAINE][33] = 52,
+       [0][0][1][0][RTW89_MEXICO][33] = 78,
+       [0][0][1][0][RTW89_CN][33] = 127,
+       [0][0][1][0][RTW89_QATAR][33] = 58,
+       [0][0][1][0][RTW89_UK][33] = 58,
+       [0][0][1][0][RTW89_FCC][35] = 70,
+       [0][0][1][0][RTW89_ETSI][35] = 58,
+       [0][0][1][0][RTW89_MKK][35] = 76,
+       [0][0][1][0][RTW89_IC][35] = 70,
+       [0][0][1][0][RTW89_KCC][35] = 72,
+       [0][0][1][0][RTW89_ACMA][35] = 58,
+       [0][0][1][0][RTW89_CHILE][35] = 66,
+       [0][0][1][0][RTW89_UKRAINE][35] = 52,
+       [0][0][1][0][RTW89_MEXICO][35] = 70,
+       [0][0][1][0][RTW89_CN][35] = 127,
+       [0][0][1][0][RTW89_QATAR][35] = 58,
+       [0][0][1][0][RTW89_UK][35] = 58,
+       [0][0][1][0][RTW89_FCC][37] = 78,
+       [0][0][1][0][RTW89_ETSI][37] = 127,
+       [0][0][1][0][RTW89_MKK][37] = 76,
+       [0][0][1][0][RTW89_IC][37] = 78,
+       [0][0][1][0][RTW89_KCC][37] = 72,
+       [0][0][1][0][RTW89_ACMA][37] = 76,
+       [0][0][1][0][RTW89_CHILE][37] = 68,
+       [0][0][1][0][RTW89_UKRAINE][37] = 127,
+       [0][0][1][0][RTW89_MEXICO][37] = 78,
+       [0][0][1][0][RTW89_CN][37] = 127,
+       [0][0][1][0][RTW89_QATAR][37] = 127,
+       [0][0][1][0][RTW89_UK][37] = 76,
+       [0][0][1][0][RTW89_FCC][38] = 78,
+       [0][0][1][0][RTW89_ETSI][38] = 28,
+       [0][0][1][0][RTW89_MKK][38] = 127,
+       [0][0][1][0][RTW89_IC][38] = 78,
+       [0][0][1][0][RTW89_KCC][38] = 74,
+       [0][0][1][0][RTW89_ACMA][38] = 76,
+       [0][0][1][0][RTW89_CHILE][38] = 68,
+       [0][0][1][0][RTW89_UKRAINE][38] = 28,
+       [0][0][1][0][RTW89_MEXICO][38] = 78,
+       [0][0][1][0][RTW89_CN][38] = 76,
+       [0][0][1][0][RTW89_QATAR][38] = 28,
+       [0][0][1][0][RTW89_UK][38] = 58,
+       [0][0][1][0][RTW89_FCC][40] = 78,
+       [0][0][1][0][RTW89_ETSI][40] = 28,
+       [0][0][1][0][RTW89_MKK][40] = 127,
+       [0][0][1][0][RTW89_IC][40] = 78,
+       [0][0][1][0][RTW89_KCC][40] = 74,
+       [0][0][1][0][RTW89_ACMA][40] = 76,
+       [0][0][1][0][RTW89_CHILE][40] = 68,
+       [0][0][1][0][RTW89_UKRAINE][40] = 28,
+       [0][0][1][0][RTW89_MEXICO][40] = 78,
+       [0][0][1][0][RTW89_CN][40] = 76,
+       [0][0][1][0][RTW89_QATAR][40] = 28,
+       [0][0][1][0][RTW89_UK][40] = 58,
+       [0][0][1][0][RTW89_FCC][42] = 78,
+       [0][0][1][0][RTW89_ETSI][42] = 28,
+       [0][0][1][0][RTW89_MKK][42] = 127,
+       [0][0][1][0][RTW89_IC][42] = 78,
+       [0][0][1][0][RTW89_KCC][42] = 74,
+       [0][0][1][0][RTW89_ACMA][42] = 76,
+       [0][0][1][0][RTW89_CHILE][42] = 66,
+       [0][0][1][0][RTW89_UKRAINE][42] = 28,
+       [0][0][1][0][RTW89_MEXICO][42] = 78,
+       [0][0][1][0][RTW89_CN][42] = 76,
+       [0][0][1][0][RTW89_QATAR][42] = 28,
+       [0][0][1][0][RTW89_UK][42] = 58,
+       [0][0][1][0][RTW89_FCC][44] = 78,
+       [0][0][1][0][RTW89_ETSI][44] = 28,
+       [0][0][1][0][RTW89_MKK][44] = 127,
+       [0][0][1][0][RTW89_IC][44] = 78,
+       [0][0][1][0][RTW89_KCC][44] = 74,
+       [0][0][1][0][RTW89_ACMA][44] = 76,
+       [0][0][1][0][RTW89_CHILE][44] = 68,
+       [0][0][1][0][RTW89_UKRAINE][44] = 28,
+       [0][0][1][0][RTW89_MEXICO][44] = 78,
+       [0][0][1][0][RTW89_CN][44] = 76,
+       [0][0][1][0][RTW89_QATAR][44] = 28,
+       [0][0][1][0][RTW89_UK][44] = 58,
+       [0][0][1][0][RTW89_FCC][46] = 78,
+       [0][0][1][0][RTW89_ETSI][46] = 28,
+       [0][0][1][0][RTW89_MKK][46] = 127,
+       [0][0][1][0][RTW89_IC][46] = 78,
+       [0][0][1][0][RTW89_KCC][46] = 74,
+       [0][0][1][0][RTW89_ACMA][46] = 76,
+       [0][0][1][0][RTW89_CHILE][46] = 68,
+       [0][0][1][0][RTW89_UKRAINE][46] = 28,
+       [0][0][1][0][RTW89_MEXICO][46] = 78,
+       [0][0][1][0][RTW89_CN][46] = 76,
+       [0][0][1][0][RTW89_QATAR][46] = 28,
+       [0][0][1][0][RTW89_UK][46] = 58,
+       [0][0][1][0][RTW89_FCC][48] = 78,
+       [0][0][1][0][RTW89_ETSI][48] = 127,
+       [0][0][1][0][RTW89_MKK][48] = 127,
+       [0][0][1][0][RTW89_IC][48] = 127,
+       [0][0][1][0][RTW89_KCC][48] = 127,
+       [0][0][1][0][RTW89_ACMA][48] = 127,
+       [0][0][1][0][RTW89_CHILE][48] = 127,
+       [0][0][1][0][RTW89_UKRAINE][48] = 127,
+       [0][0][1][0][RTW89_MEXICO][48] = 127,
+       [0][0][1][0][RTW89_CN][48] = 127,
+       [0][0][1][0][RTW89_QATAR][48] = 127,
+       [0][0][1][0][RTW89_UK][48] = 127,
+       [0][0][1][0][RTW89_FCC][50] = 78,
+       [0][0][1][0][RTW89_ETSI][50] = 127,
+       [0][0][1][0][RTW89_MKK][50] = 127,
+       [0][0][1][0][RTW89_IC][50] = 127,
+       [0][0][1][0][RTW89_KCC][50] = 127,
+       [0][0][1][0][RTW89_ACMA][50] = 127,
+       [0][0][1][0][RTW89_CHILE][50] = 127,
+       [0][0][1][0][RTW89_UKRAINE][50] = 127,
+       [0][0][1][0][RTW89_MEXICO][50] = 127,
+       [0][0][1][0][RTW89_CN][50] = 127,
+       [0][0][1][0][RTW89_QATAR][50] = 127,
+       [0][0][1][0][RTW89_UK][50] = 127,
+       [0][0][1][0][RTW89_FCC][52] = 78,
+       [0][0][1][0][RTW89_ETSI][52] = 127,
+       [0][0][1][0][RTW89_MKK][52] = 127,
+       [0][0][1][0][RTW89_IC][52] = 127,
+       [0][0][1][0][RTW89_KCC][52] = 127,
+       [0][0][1][0][RTW89_ACMA][52] = 127,
+       [0][0][1][0][RTW89_CHILE][52] = 127,
+       [0][0][1][0][RTW89_UKRAINE][52] = 127,
+       [0][0][1][0][RTW89_MEXICO][52] = 127,
+       [0][0][1][0][RTW89_CN][52] = 127,
+       [0][0][1][0][RTW89_QATAR][52] = 127,
+       [0][0][1][0][RTW89_UK][52] = 127,
+       [0][1][1][0][RTW89_FCC][0] = 68,
+       [0][1][1][0][RTW89_ETSI][0] = 46,
+       [0][1][1][0][RTW89_MKK][0] = 48,
+       [0][1][1][0][RTW89_IC][0] = 40,
+       [0][1][1][0][RTW89_KCC][0] = 64,
+       [0][1][1][0][RTW89_ACMA][0] = 46,
+       [0][1][1][0][RTW89_CHILE][0] = 30,
+       [0][1][1][0][RTW89_UKRAINE][0] = 40,
+       [0][1][1][0][RTW89_MEXICO][0] = 50,
+       [0][1][1][0][RTW89_CN][0] = 46,
+       [0][1][1][0][RTW89_QATAR][0] = 46,
+       [0][1][1][0][RTW89_UK][0] = 46,
+       [0][1][1][0][RTW89_FCC][2] = 68,
+       [0][1][1][0][RTW89_ETSI][2] = 46,
+       [0][1][1][0][RTW89_MKK][2] = 48,
+       [0][1][1][0][RTW89_IC][2] = 40,
+       [0][1][1][0][RTW89_KCC][2] = 64,
+       [0][1][1][0][RTW89_ACMA][2] = 46,
+       [0][1][1][0][RTW89_CHILE][2] = 32,
+       [0][1][1][0][RTW89_UKRAINE][2] = 40,
+       [0][1][1][0][RTW89_MEXICO][2] = 50,
+       [0][1][1][0][RTW89_CN][2] = 46,
+       [0][1][1][0][RTW89_QATAR][2] = 46,
+       [0][1][1][0][RTW89_UK][2] = 46,
+       [0][1][1][0][RTW89_FCC][4] = 68,
+       [0][1][1][0][RTW89_ETSI][4] = 46,
+       [0][1][1][0][RTW89_MKK][4] = 48,
+       [0][1][1][0][RTW89_IC][4] = 40,
+       [0][1][1][0][RTW89_KCC][4] = 64,
+       [0][1][1][0][RTW89_ACMA][4] = 46,
+       [0][1][1][0][RTW89_CHILE][4] = 30,
+       [0][1][1][0][RTW89_UKRAINE][4] = 40,
+       [0][1][1][0][RTW89_MEXICO][4] = 50,
+       [0][1][1][0][RTW89_CN][4] = 46,
+       [0][1][1][0][RTW89_QATAR][4] = 46,
+       [0][1][1][0][RTW89_UK][4] = 46,
+       [0][1][1][0][RTW89_FCC][6] = 68,
+       [0][1][1][0][RTW89_ETSI][6] = 46,
+       [0][1][1][0][RTW89_MKK][6] = 48,
+       [0][1][1][0][RTW89_IC][6] = 40,
+       [0][1][1][0][RTW89_KCC][6] = 38,
+       [0][1][1][0][RTW89_ACMA][6] = 46,
+       [0][1][1][0][RTW89_CHILE][6] = 30,
+       [0][1][1][0][RTW89_UKRAINE][6] = 40,
+       [0][1][1][0][RTW89_MEXICO][6] = 50,
+       [0][1][1][0][RTW89_CN][6] = 46,
+       [0][1][1][0][RTW89_QATAR][6] = 46,
+       [0][1][1][0][RTW89_UK][6] = 46,
+       [0][1][1][0][RTW89_FCC][8] = 68,
+       [0][1][1][0][RTW89_ETSI][8] = 46,
+       [0][1][1][0][RTW89_MKK][8] = 48,
+       [0][1][1][0][RTW89_IC][8] = 52,
+       [0][1][1][0][RTW89_KCC][8] = 64,
+       [0][1][1][0][RTW89_ACMA][8] = 46,
+       [0][1][1][0][RTW89_CHILE][8] = 52,
+       [0][1][1][0][RTW89_UKRAINE][8] = 40,
+       [0][1][1][0][RTW89_MEXICO][8] = 68,
+       [0][1][1][0][RTW89_CN][8] = 46,
+       [0][1][1][0][RTW89_QATAR][8] = 46,
+       [0][1][1][0][RTW89_UK][8] = 46,
+       [0][1][1][0][RTW89_FCC][10] = 68,
+       [0][1][1][0][RTW89_ETSI][10] = 46,
+       [0][1][1][0][RTW89_MKK][10] = 48,
+       [0][1][1][0][RTW89_IC][10] = 52,
+       [0][1][1][0][RTW89_KCC][10] = 64,
+       [0][1][1][0][RTW89_ACMA][10] = 46,
+       [0][1][1][0][RTW89_CHILE][10] = 52,
+       [0][1][1][0][RTW89_UKRAINE][10] = 40,
+       [0][1][1][0][RTW89_MEXICO][10] = 68,
+       [0][1][1][0][RTW89_CN][10] = 46,
+       [0][1][1][0][RTW89_QATAR][10] = 46,
+       [0][1][1][0][RTW89_UK][10] = 46,
+       [0][1][1][0][RTW89_FCC][12] = 68,
+       [0][1][1][0][RTW89_ETSI][12] = 46,
+       [0][1][1][0][RTW89_MKK][12] = 48,
+       [0][1][1][0][RTW89_IC][12] = 52,
+       [0][1][1][0][RTW89_KCC][12] = 64,
+       [0][1][1][0][RTW89_ACMA][12] = 46,
+       [0][1][1][0][RTW89_CHILE][12] = 52,
+       [0][1][1][0][RTW89_UKRAINE][12] = 40,
+       [0][1][1][0][RTW89_MEXICO][12] = 68,
+       [0][1][1][0][RTW89_CN][12] = 46,
+       [0][1][1][0][RTW89_QATAR][12] = 46,
+       [0][1][1][0][RTW89_UK][12] = 46,
+       [0][1][1][0][RTW89_FCC][14] = 68,
+       [0][1][1][0][RTW89_ETSI][14] = 46,
+       [0][1][1][0][RTW89_MKK][14] = 48,
+       [0][1][1][0][RTW89_IC][14] = 52,
+       [0][1][1][0][RTW89_KCC][14] = 64,
+       [0][1][1][0][RTW89_ACMA][14] = 46,
+       [0][1][1][0][RTW89_CHILE][14] = 52,
+       [0][1][1][0][RTW89_UKRAINE][14] = 40,
+       [0][1][1][0][RTW89_MEXICO][14] = 68,
+       [0][1][1][0][RTW89_CN][14] = 46,
+       [0][1][1][0][RTW89_QATAR][14] = 46,
+       [0][1][1][0][RTW89_UK][14] = 46,
+       [0][1][1][0][RTW89_FCC][15] = 66,
+       [0][1][1][0][RTW89_ETSI][15] = 46,
+       [0][1][1][0][RTW89_MKK][15] = 68,
+       [0][1][1][0][RTW89_IC][15] = 66,
+       [0][1][1][0][RTW89_KCC][15] = 62,
+       [0][1][1][0][RTW89_ACMA][15] = 46,
+       [0][1][1][0][RTW89_CHILE][15] = 48,
+       [0][1][1][0][RTW89_UKRAINE][15] = 40,
+       [0][1][1][0][RTW89_MEXICO][15] = 66,
+       [0][1][1][0][RTW89_CN][15] = 127,
+       [0][1][1][0][RTW89_QATAR][15] = 46,
+       [0][1][1][0][RTW89_UK][15] = 46,
+       [0][1][1][0][RTW89_FCC][17] = 68,
+       [0][1][1][0][RTW89_ETSI][17] = 46,
+       [0][1][1][0][RTW89_MKK][17] = 70,
+       [0][1][1][0][RTW89_IC][17] = 68,
+       [0][1][1][0][RTW89_KCC][17] = 62,
+       [0][1][1][0][RTW89_ACMA][17] = 46,
+       [0][1][1][0][RTW89_CHILE][17] = 48,
+       [0][1][1][0][RTW89_UKRAINE][17] = 40,
+       [0][1][1][0][RTW89_MEXICO][17] = 68,
+       [0][1][1][0][RTW89_CN][17] = 127,
+       [0][1][1][0][RTW89_QATAR][17] = 46,
+       [0][1][1][0][RTW89_UK][17] = 46,
+       [0][1][1][0][RTW89_FCC][19] = 68,
+       [0][1][1][0][RTW89_ETSI][19] = 46,
+       [0][1][1][0][RTW89_MKK][19] = 70,
+       [0][1][1][0][RTW89_IC][19] = 68,
+       [0][1][1][0][RTW89_KCC][19] = 62,
+       [0][1][1][0][RTW89_ACMA][19] = 46,
+       [0][1][1][0][RTW89_CHILE][19] = 48,
+       [0][1][1][0][RTW89_UKRAINE][19] = 40,
+       [0][1][1][0][RTW89_MEXICO][19] = 68,
+       [0][1][1][0][RTW89_CN][19] = 127,
+       [0][1][1][0][RTW89_QATAR][19] = 46,
+       [0][1][1][0][RTW89_UK][19] = 46,
+       [0][1][1][0][RTW89_FCC][21] = 68,
+       [0][1][1][0][RTW89_ETSI][21] = 46,
+       [0][1][1][0][RTW89_MKK][21] = 70,
+       [0][1][1][0][RTW89_IC][21] = 68,
+       [0][1][1][0][RTW89_KCC][21] = 62,
+       [0][1][1][0][RTW89_ACMA][21] = 46,
+       [0][1][1][0][RTW89_CHILE][21] = 48,
+       [0][1][1][0][RTW89_UKRAINE][21] = 40,
+       [0][1][1][0][RTW89_MEXICO][21] = 68,
+       [0][1][1][0][RTW89_CN][21] = 127,
+       [0][1][1][0][RTW89_QATAR][21] = 46,
+       [0][1][1][0][RTW89_UK][21] = 46,
+       [0][1][1][0][RTW89_FCC][23] = 68,
+       [0][1][1][0][RTW89_ETSI][23] = 46,
+       [0][1][1][0][RTW89_MKK][23] = 70,
+       [0][1][1][0][RTW89_IC][23] = 68,
+       [0][1][1][0][RTW89_KCC][23] = 62,
+       [0][1][1][0][RTW89_ACMA][23] = 46,
+       [0][1][1][0][RTW89_CHILE][23] = 48,
+       [0][1][1][0][RTW89_UKRAINE][23] = 40,
+       [0][1][1][0][RTW89_MEXICO][23] = 68,
+       [0][1][1][0][RTW89_CN][23] = 127,
+       [0][1][1][0][RTW89_QATAR][23] = 46,
+       [0][1][1][0][RTW89_UK][23] = 46,
+       [0][1][1][0][RTW89_FCC][25] = 68,
+       [0][1][1][0][RTW89_ETSI][25] = 46,
+       [0][1][1][0][RTW89_MKK][25] = 68,
+       [0][1][1][0][RTW89_IC][25] = 127,
+       [0][1][1][0][RTW89_KCC][25] = 62,
+       [0][1][1][0][RTW89_ACMA][25] = 127,
+       [0][1][1][0][RTW89_CHILE][25] = 48,
+       [0][1][1][0][RTW89_UKRAINE][25] = 40,
+       [0][1][1][0][RTW89_MEXICO][25] = 68,
+       [0][1][1][0][RTW89_CN][25] = 127,
+       [0][1][1][0][RTW89_QATAR][25] = 46,
+       [0][1][1][0][RTW89_UK][25] = 46,
+       [0][1][1][0][RTW89_FCC][27] = 68,
+       [0][1][1][0][RTW89_ETSI][27] = 46,
+       [0][1][1][0][RTW89_MKK][27] = 70,
+       [0][1][1][0][RTW89_IC][27] = 127,
+       [0][1][1][0][RTW89_KCC][27] = 62,
+       [0][1][1][0][RTW89_ACMA][27] = 127,
+       [0][1][1][0][RTW89_CHILE][27] = 50,
+       [0][1][1][0][RTW89_UKRAINE][27] = 40,
+       [0][1][1][0][RTW89_MEXICO][27] = 68,
+       [0][1][1][0][RTW89_CN][27] = 127,
+       [0][1][1][0][RTW89_QATAR][27] = 46,
+       [0][1][1][0][RTW89_UK][27] = 46,
+       [0][1][1][0][RTW89_FCC][29] = 68,
+       [0][1][1][0][RTW89_ETSI][29] = 46,
+       [0][1][1][0][RTW89_MKK][29] = 70,
+       [0][1][1][0][RTW89_IC][29] = 127,
+       [0][1][1][0][RTW89_KCC][29] = 62,
+       [0][1][1][0][RTW89_ACMA][29] = 127,
+       [0][1][1][0][RTW89_CHILE][29] = 50,
+       [0][1][1][0][RTW89_UKRAINE][29] = 40,
+       [0][1][1][0][RTW89_MEXICO][29] = 68,
+       [0][1][1][0][RTW89_CN][29] = 127,
+       [0][1][1][0][RTW89_QATAR][29] = 46,
+       [0][1][1][0][RTW89_UK][29] = 46,
+       [0][1][1][0][RTW89_FCC][31] = 68,
+       [0][1][1][0][RTW89_ETSI][31] = 46,
+       [0][1][1][0][RTW89_MKK][31] = 70,
+       [0][1][1][0][RTW89_IC][31] = 68,
+       [0][1][1][0][RTW89_KCC][31] = 62,
+       [0][1][1][0][RTW89_ACMA][31] = 46,
+       [0][1][1][0][RTW89_CHILE][31] = 50,
+       [0][1][1][0][RTW89_UKRAINE][31] = 40,
+       [0][1][1][0][RTW89_MEXICO][31] = 68,
+       [0][1][1][0][RTW89_CN][31] = 127,
+       [0][1][1][0][RTW89_QATAR][31] = 46,
+       [0][1][1][0][RTW89_UK][31] = 46,
+       [0][1][1][0][RTW89_FCC][33] = 68,
+       [0][1][1][0][RTW89_ETSI][33] = 46,
+       [0][1][1][0][RTW89_MKK][33] = 70,
+       [0][1][1][0][RTW89_IC][33] = 68,
+       [0][1][1][0][RTW89_KCC][33] = 62,
+       [0][1][1][0][RTW89_ACMA][33] = 46,
+       [0][1][1][0][RTW89_CHILE][33] = 50,
+       [0][1][1][0][RTW89_UKRAINE][33] = 40,
+       [0][1][1][0][RTW89_MEXICO][33] = 68,
+       [0][1][1][0][RTW89_CN][33] = 127,
+       [0][1][1][0][RTW89_QATAR][33] = 46,
+       [0][1][1][0][RTW89_UK][33] = 46,
+       [0][1][1][0][RTW89_FCC][35] = 66,
+       [0][1][1][0][RTW89_ETSI][35] = 46,
+       [0][1][1][0][RTW89_MKK][35] = 70,
+       [0][1][1][0][RTW89_IC][35] = 66,
+       [0][1][1][0][RTW89_KCC][35] = 62,
+       [0][1][1][0][RTW89_ACMA][35] = 46,
+       [0][1][1][0][RTW89_CHILE][35] = 50,
+       [0][1][1][0][RTW89_UKRAINE][35] = 40,
+       [0][1][1][0][RTW89_MEXICO][35] = 66,
+       [0][1][1][0][RTW89_CN][35] = 127,
+       [0][1][1][0][RTW89_QATAR][35] = 46,
+       [0][1][1][0][RTW89_UK][35] = 46,
+       [0][1][1][0][RTW89_FCC][37] = 68,
+       [0][1][1][0][RTW89_ETSI][37] = 127,
+       [0][1][1][0][RTW89_MKK][37] = 70,
+       [0][1][1][0][RTW89_IC][37] = 68,
+       [0][1][1][0][RTW89_KCC][37] = 62,
+       [0][1][1][0][RTW89_ACMA][37] = 70,
+       [0][1][1][0][RTW89_CHILE][37] = 50,
+       [0][1][1][0][RTW89_UKRAINE][37] = 127,
+       [0][1][1][0][RTW89_MEXICO][37] = 68,
+       [0][1][1][0][RTW89_CN][37] = 127,
+       [0][1][1][0][RTW89_QATAR][37] = 127,
+       [0][1][1][0][RTW89_UK][37] = 76,
+       [0][1][1][0][RTW89_FCC][38] = 78,
+       [0][1][1][0][RTW89_ETSI][38] = 16,
+       [0][1][1][0][RTW89_MKK][38] = 127,
+       [0][1][1][0][RTW89_IC][38] = 78,
+       [0][1][1][0][RTW89_KCC][38] = 60,
+       [0][1][1][0][RTW89_ACMA][38] = 72,
+       [0][1][1][0][RTW89_CHILE][38] = 48,
+       [0][1][1][0][RTW89_UKRAINE][38] = 16,
+       [0][1][1][0][RTW89_MEXICO][38] = 78,
+       [0][1][1][0][RTW89_CN][38] = 76,
+       [0][1][1][0][RTW89_QATAR][38] = 16,
+       [0][1][1][0][RTW89_UK][38] = 46,
+       [0][1][1][0][RTW89_FCC][40] = 78,
+       [0][1][1][0][RTW89_ETSI][40] = 16,
+       [0][1][1][0][RTW89_MKK][40] = 127,
+       [0][1][1][0][RTW89_IC][40] = 78,
+       [0][1][1][0][RTW89_KCC][40] = 60,
+       [0][1][1][0][RTW89_ACMA][40] = 72,
+       [0][1][1][0][RTW89_CHILE][40] = 48,
+       [0][1][1][0][RTW89_UKRAINE][40] = 16,
+       [0][1][1][0][RTW89_MEXICO][40] = 78,
+       [0][1][1][0][RTW89_CN][40] = 76,
+       [0][1][1][0][RTW89_QATAR][40] = 16,
+       [0][1][1][0][RTW89_UK][40] = 46,
+       [0][1][1][0][RTW89_FCC][42] = 78,
+       [0][1][1][0][RTW89_ETSI][42] = 16,
+       [0][1][1][0][RTW89_MKK][42] = 127,
+       [0][1][1][0][RTW89_IC][42] = 78,
+       [0][1][1][0][RTW89_KCC][42] = 60,
+       [0][1][1][0][RTW89_ACMA][42] = 76,
+       [0][1][1][0][RTW89_CHILE][42] = 48,
+       [0][1][1][0][RTW89_UKRAINE][42] = 16,
+       [0][1][1][0][RTW89_MEXICO][42] = 78,
+       [0][1][1][0][RTW89_CN][42] = 76,
+       [0][1][1][0][RTW89_QATAR][42] = 16,
+       [0][1][1][0][RTW89_UK][42] = 46,
+       [0][1][1][0][RTW89_FCC][44] = 78,
+       [0][1][1][0][RTW89_ETSI][44] = 16,
+       [0][1][1][0][RTW89_MKK][44] = 127,
+       [0][1][1][0][RTW89_IC][44] = 78,
+       [0][1][1][0][RTW89_KCC][44] = 60,
+       [0][1][1][0][RTW89_ACMA][44] = 76,
+       [0][1][1][0][RTW89_CHILE][44] = 48,
+       [0][1][1][0][RTW89_UKRAINE][44] = 16,
+       [0][1][1][0][RTW89_MEXICO][44] = 78,
+       [0][1][1][0][RTW89_CN][44] = 76,
+       [0][1][1][0][RTW89_QATAR][44] = 16,
+       [0][1][1][0][RTW89_UK][44] = 46,
+       [0][1][1][0][RTW89_FCC][46] = 78,
+       [0][1][1][0][RTW89_ETSI][46] = 16,
+       [0][1][1][0][RTW89_MKK][46] = 127,
+       [0][1][1][0][RTW89_IC][46] = 78,
+       [0][1][1][0][RTW89_KCC][46] = 60,
+       [0][1][1][0][RTW89_ACMA][46] = 76,
+       [0][1][1][0][RTW89_CHILE][46] = 48,
+       [0][1][1][0][RTW89_UKRAINE][46] = 16,
+       [0][1][1][0][RTW89_MEXICO][46] = 78,
+       [0][1][1][0][RTW89_CN][46] = 76,
+       [0][1][1][0][RTW89_QATAR][46] = 16,
+       [0][1][1][0][RTW89_UK][46] = 46,
+       [0][1][1][0][RTW89_FCC][48] = 56,
+       [0][1][1][0][RTW89_ETSI][48] = 127,
+       [0][1][1][0][RTW89_MKK][48] = 127,
+       [0][1][1][0][RTW89_IC][48] = 127,
+       [0][1][1][0][RTW89_KCC][48] = 127,
+       [0][1][1][0][RTW89_ACMA][48] = 127,
+       [0][1][1][0][RTW89_CHILE][48] = 127,
+       [0][1][1][0][RTW89_UKRAINE][48] = 127,
+       [0][1][1][0][RTW89_MEXICO][48] = 127,
+       [0][1][1][0][RTW89_CN][48] = 127,
+       [0][1][1][0][RTW89_QATAR][48] = 127,
+       [0][1][1][0][RTW89_UK][48] = 127,
+       [0][1][1][0][RTW89_FCC][50] = 56,
+       [0][1][1][0][RTW89_ETSI][50] = 127,
+       [0][1][1][0][RTW89_MKK][50] = 127,
+       [0][1][1][0][RTW89_IC][50] = 127,
+       [0][1][1][0][RTW89_KCC][50] = 127,
+       [0][1][1][0][RTW89_ACMA][50] = 127,
+       [0][1][1][0][RTW89_CHILE][50] = 127,
+       [0][1][1][0][RTW89_UKRAINE][50] = 127,
+       [0][1][1][0][RTW89_MEXICO][50] = 127,
+       [0][1][1][0][RTW89_CN][50] = 127,
+       [0][1][1][0][RTW89_QATAR][50] = 127,
+       [0][1][1][0][RTW89_UK][50] = 127,
+       [0][1][1][0][RTW89_FCC][52] = 56,
+       [0][1][1][0][RTW89_ETSI][52] = 127,
+       [0][1][1][0][RTW89_MKK][52] = 127,
+       [0][1][1][0][RTW89_IC][52] = 127,
+       [0][1][1][0][RTW89_KCC][52] = 127,
+       [0][1][1][0][RTW89_ACMA][52] = 127,
+       [0][1][1][0][RTW89_CHILE][52] = 127,
+       [0][1][1][0][RTW89_UKRAINE][52] = 127,
+       [0][1][1][0][RTW89_MEXICO][52] = 127,
+       [0][1][1][0][RTW89_CN][52] = 127,
+       [0][1][1][0][RTW89_QATAR][52] = 127,
+       [0][1][1][0][RTW89_UK][52] = 127,
+       [0][0][2][0][RTW89_FCC][0] = 78,
+       [0][0][2][0][RTW89_ETSI][0] = 60,
+       [0][0][2][0][RTW89_MKK][0] = 62,
+       [0][0][2][0][RTW89_IC][0] = 64,
+       [0][0][2][0][RTW89_KCC][0] = 74,
+       [0][0][2][0][RTW89_ACMA][0] = 60,
+       [0][0][2][0][RTW89_CHILE][0] = 42,
+       [0][0][2][0][RTW89_UKRAINE][0] = 52,
+       [0][0][2][0][RTW89_MEXICO][0] = 62,
+       [0][0][2][0][RTW89_CN][0] = 60,
+       [0][0][2][0][RTW89_QATAR][0] = 60,
+       [0][0][2][0][RTW89_UK][0] = 60,
+       [0][0][2][0][RTW89_FCC][2] = 78,
+       [0][0][2][0][RTW89_ETSI][2] = 60,
+       [0][0][2][0][RTW89_MKK][2] = 62,
+       [0][0][2][0][RTW89_IC][2] = 64,
+       [0][0][2][0][RTW89_KCC][2] = 74,
+       [0][0][2][0][RTW89_ACMA][2] = 60,
+       [0][0][2][0][RTW89_CHILE][2] = 42,
+       [0][0][2][0][RTW89_UKRAINE][2] = 52,
+       [0][0][2][0][RTW89_MEXICO][2] = 62,
+       [0][0][2][0][RTW89_CN][2] = 60,
+       [0][0][2][0][RTW89_QATAR][2] = 60,
+       [0][0][2][0][RTW89_UK][2] = 60,
+       [0][0][2][0][RTW89_FCC][4] = 78,
+       [0][0][2][0][RTW89_ETSI][4] = 60,
+       [0][0][2][0][RTW89_MKK][4] = 62,
+       [0][0][2][0][RTW89_IC][4] = 64,
+       [0][0][2][0][RTW89_KCC][4] = 74,
+       [0][0][2][0][RTW89_ACMA][4] = 60,
+       [0][0][2][0][RTW89_CHILE][4] = 42,
+       [0][0][2][0][RTW89_UKRAINE][4] = 52,
+       [0][0][2][0][RTW89_MEXICO][4] = 62,
+       [0][0][2][0][RTW89_CN][4] = 60,
+       [0][0][2][0][RTW89_QATAR][4] = 60,
+       [0][0][2][0][RTW89_UK][4] = 60,
+       [0][0][2][0][RTW89_FCC][6] = 78,
+       [0][0][2][0][RTW89_ETSI][6] = 60,
+       [0][0][2][0][RTW89_MKK][6] = 62,
+       [0][0][2][0][RTW89_IC][6] = 64,
+       [0][0][2][0][RTW89_KCC][6] = 50,
+       [0][0][2][0][RTW89_ACMA][6] = 60,
+       [0][0][2][0][RTW89_CHILE][6] = 42,
+       [0][0][2][0][RTW89_UKRAINE][6] = 52,
+       [0][0][2][0][RTW89_MEXICO][6] = 62,
+       [0][0][2][0][RTW89_CN][6] = 60,
+       [0][0][2][0][RTW89_QATAR][6] = 60,
+       [0][0][2][0][RTW89_UK][6] = 60,
+       [0][0][2][0][RTW89_FCC][8] = 78,
+       [0][0][2][0][RTW89_ETSI][8] = 60,
+       [0][0][2][0][RTW89_MKK][8] = 62,
+       [0][0][2][0][RTW89_IC][8] = 64,
+       [0][0][2][0][RTW89_KCC][8] = 74,
+       [0][0][2][0][RTW89_ACMA][8] = 60,
+       [0][0][2][0][RTW89_CHILE][8] = 66,
+       [0][0][2][0][RTW89_UKRAINE][8] = 52,
+       [0][0][2][0][RTW89_MEXICO][8] = 78,
+       [0][0][2][0][RTW89_CN][8] = 60,
+       [0][0][2][0][RTW89_QATAR][8] = 60,
+       [0][0][2][0][RTW89_UK][8] = 60,
+       [0][0][2][0][RTW89_FCC][10] = 78,
+       [0][0][2][0][RTW89_ETSI][10] = 60,
+       [0][0][2][0][RTW89_MKK][10] = 62,
+       [0][0][2][0][RTW89_IC][10] = 64,
+       [0][0][2][0][RTW89_KCC][10] = 74,
+       [0][0][2][0][RTW89_ACMA][10] = 60,
+       [0][0][2][0][RTW89_CHILE][10] = 66,
+       [0][0][2][0][RTW89_UKRAINE][10] = 52,
+       [0][0][2][0][RTW89_MEXICO][10] = 78,
+       [0][0][2][0][RTW89_CN][10] = 60,
+       [0][0][2][0][RTW89_QATAR][10] = 60,
+       [0][0][2][0][RTW89_UK][10] = 60,
+       [0][0][2][0][RTW89_FCC][12] = 78,
+       [0][0][2][0][RTW89_ETSI][12] = 60,
+       [0][0][2][0][RTW89_MKK][12] = 62,
+       [0][0][2][0][RTW89_IC][12] = 64,
+       [0][0][2][0][RTW89_KCC][12] = 74,
+       [0][0][2][0][RTW89_ACMA][12] = 60,
+       [0][0][2][0][RTW89_CHILE][12] = 66,
+       [0][0][2][0][RTW89_UKRAINE][12] = 52,
+       [0][0][2][0][RTW89_MEXICO][12] = 78,
+       [0][0][2][0][RTW89_CN][12] = 60,
+       [0][0][2][0][RTW89_QATAR][12] = 60,
+       [0][0][2][0][RTW89_UK][12] = 60,
+       [0][0][2][0][RTW89_FCC][14] = 78,
+       [0][0][2][0][RTW89_ETSI][14] = 60,
+       [0][0][2][0][RTW89_MKK][14] = 62,
+       [0][0][2][0][RTW89_IC][14] = 64,
+       [0][0][2][0][RTW89_KCC][14] = 74,
+       [0][0][2][0][RTW89_ACMA][14] = 60,
+       [0][0][2][0][RTW89_CHILE][14] = 66,
+       [0][0][2][0][RTW89_UKRAINE][14] = 52,
+       [0][0][2][0][RTW89_MEXICO][14] = 78,
+       [0][0][2][0][RTW89_CN][14] = 60,
+       [0][0][2][0][RTW89_QATAR][14] = 60,
+       [0][0][2][0][RTW89_UK][14] = 60,
+       [0][0][2][0][RTW89_FCC][15] = 74,
+       [0][0][2][0][RTW89_ETSI][15] = 60,
+       [0][0][2][0][RTW89_MKK][15] = 76,
+       [0][0][2][0][RTW89_IC][15] = 74,
+       [0][0][2][0][RTW89_KCC][15] = 74,
+       [0][0][2][0][RTW89_ACMA][15] = 60,
+       [0][0][2][0][RTW89_CHILE][15] = 64,
+       [0][0][2][0][RTW89_UKRAINE][15] = 52,
+       [0][0][2][0][RTW89_MEXICO][15] = 74,
+       [0][0][2][0][RTW89_CN][15] = 127,
+       [0][0][2][0][RTW89_QATAR][15] = 60,
+       [0][0][2][0][RTW89_UK][15] = 60,
+       [0][0][2][0][RTW89_FCC][17] = 78,
+       [0][0][2][0][RTW89_ETSI][17] = 60,
+       [0][0][2][0][RTW89_MKK][17] = 76,
+       [0][0][2][0][RTW89_IC][17] = 78,
+       [0][0][2][0][RTW89_KCC][17] = 74,
+       [0][0][2][0][RTW89_ACMA][17] = 60,
+       [0][0][2][0][RTW89_CHILE][17] = 64,
+       [0][0][2][0][RTW89_UKRAINE][17] = 52,
+       [0][0][2][0][RTW89_MEXICO][17] = 78,
+       [0][0][2][0][RTW89_CN][17] = 127,
+       [0][0][2][0][RTW89_QATAR][17] = 60,
+       [0][0][2][0][RTW89_UK][17] = 60,
+       [0][0][2][0][RTW89_FCC][19] = 78,
+       [0][0][2][0][RTW89_ETSI][19] = 60,
+       [0][0][2][0][RTW89_MKK][19] = 76,
+       [0][0][2][0][RTW89_IC][19] = 78,
+       [0][0][2][0][RTW89_KCC][19] = 74,
+       [0][0][2][0][RTW89_ACMA][19] = 60,
+       [0][0][2][0][RTW89_CHILE][19] = 64,
+       [0][0][2][0][RTW89_UKRAINE][19] = 52,
+       [0][0][2][0][RTW89_MEXICO][19] = 78,
+       [0][0][2][0][RTW89_CN][19] = 127,
+       [0][0][2][0][RTW89_QATAR][19] = 60,
+       [0][0][2][0][RTW89_UK][19] = 60,
+       [0][0][2][0][RTW89_FCC][21] = 78,
+       [0][0][2][0][RTW89_ETSI][21] = 60,
+       [0][0][2][0][RTW89_MKK][21] = 76,
+       [0][0][2][0][RTW89_IC][21] = 78,
+       [0][0][2][0][RTW89_KCC][21] = 74,
+       [0][0][2][0][RTW89_ACMA][21] = 60,
+       [0][0][2][0][RTW89_CHILE][21] = 66,
+       [0][0][2][0][RTW89_UKRAINE][21] = 52,
+       [0][0][2][0][RTW89_MEXICO][21] = 78,
+       [0][0][2][0][RTW89_CN][21] = 127,
+       [0][0][2][0][RTW89_QATAR][21] = 60,
+       [0][0][2][0][RTW89_UK][21] = 60,
+       [0][0][2][0][RTW89_FCC][23] = 78,
+       [0][0][2][0][RTW89_ETSI][23] = 60,
+       [0][0][2][0][RTW89_MKK][23] = 76,
+       [0][0][2][0][RTW89_IC][23] = 78,
+       [0][0][2][0][RTW89_KCC][23] = 74,
+       [0][0][2][0][RTW89_ACMA][23] = 60,
+       [0][0][2][0][RTW89_CHILE][23] = 66,
+       [0][0][2][0][RTW89_UKRAINE][23] = 52,
+       [0][0][2][0][RTW89_MEXICO][23] = 78,
+       [0][0][2][0][RTW89_CN][23] = 127,
+       [0][0][2][0][RTW89_QATAR][23] = 60,
+       [0][0][2][0][RTW89_UK][23] = 60,
+       [0][0][2][0][RTW89_FCC][25] = 78,
+       [0][0][2][0][RTW89_ETSI][25] = 60,
+       [0][0][2][0][RTW89_MKK][25] = 76,
+       [0][0][2][0][RTW89_IC][25] = 127,
+       [0][0][2][0][RTW89_KCC][25] = 74,
+       [0][0][2][0][RTW89_ACMA][25] = 127,
+       [0][0][2][0][RTW89_CHILE][25] = 66,
+       [0][0][2][0][RTW89_UKRAINE][25] = 52,
+       [0][0][2][0][RTW89_MEXICO][25] = 78,
+       [0][0][2][0][RTW89_CN][25] = 127,
+       [0][0][2][0][RTW89_QATAR][25] = 60,
+       [0][0][2][0][RTW89_UK][25] = 60,
+       [0][0][2][0][RTW89_FCC][27] = 78,
+       [0][0][2][0][RTW89_ETSI][27] = 60,
+       [0][0][2][0][RTW89_MKK][27] = 76,
+       [0][0][2][0][RTW89_IC][27] = 127,
+       [0][0][2][0][RTW89_KCC][27] = 74,
+       [0][0][2][0][RTW89_ACMA][27] = 127,
+       [0][0][2][0][RTW89_CHILE][27] = 64,
+       [0][0][2][0][RTW89_UKRAINE][27] = 52,
+       [0][0][2][0][RTW89_MEXICO][27] = 78,
+       [0][0][2][0][RTW89_CN][27] = 127,
+       [0][0][2][0][RTW89_QATAR][27] = 60,
+       [0][0][2][0][RTW89_UK][27] = 60,
+       [0][0][2][0][RTW89_FCC][29] = 78,
+       [0][0][2][0][RTW89_ETSI][29] = 60,
+       [0][0][2][0][RTW89_MKK][29] = 76,
+       [0][0][2][0][RTW89_IC][29] = 127,
+       [0][0][2][0][RTW89_KCC][29] = 74,
+       [0][0][2][0][RTW89_ACMA][29] = 127,
+       [0][0][2][0][RTW89_CHILE][29] = 64,
+       [0][0][2][0][RTW89_UKRAINE][29] = 52,
+       [0][0][2][0][RTW89_MEXICO][29] = 78,
+       [0][0][2][0][RTW89_CN][29] = 127,
+       [0][0][2][0][RTW89_QATAR][29] = 60,
+       [0][0][2][0][RTW89_UK][29] = 60,
+       [0][0][2][0][RTW89_FCC][31] = 78,
+       [0][0][2][0][RTW89_ETSI][31] = 60,
+       [0][0][2][0][RTW89_MKK][31] = 76,
+       [0][0][2][0][RTW89_IC][31] = 78,
+       [0][0][2][0][RTW89_KCC][31] = 74,
+       [0][0][2][0][RTW89_ACMA][31] = 60,
+       [0][0][2][0][RTW89_CHILE][31] = 64,
+       [0][0][2][0][RTW89_UKRAINE][31] = 52,
+       [0][0][2][0][RTW89_MEXICO][31] = 78,
+       [0][0][2][0][RTW89_CN][31] = 127,
+       [0][0][2][0][RTW89_QATAR][31] = 60,
+       [0][0][2][0][RTW89_UK][31] = 60,
+       [0][0][2][0][RTW89_FCC][33] = 78,
+       [0][0][2][0][RTW89_ETSI][33] = 60,
+       [0][0][2][0][RTW89_MKK][33] = 76,
+       [0][0][2][0][RTW89_IC][33] = 78,
+       [0][0][2][0][RTW89_KCC][33] = 74,
+       [0][0][2][0][RTW89_ACMA][33] = 60,
+       [0][0][2][0][RTW89_CHILE][33] = 64,
+       [0][0][2][0][RTW89_UKRAINE][33] = 52,
+       [0][0][2][0][RTW89_MEXICO][33] = 78,
+       [0][0][2][0][RTW89_CN][33] = 127,
+       [0][0][2][0][RTW89_QATAR][33] = 60,
+       [0][0][2][0][RTW89_UK][33] = 60,
+       [0][0][2][0][RTW89_FCC][35] = 70,
+       [0][0][2][0][RTW89_ETSI][35] = 60,
+       [0][0][2][0][RTW89_MKK][35] = 76,
+       [0][0][2][0][RTW89_IC][35] = 70,
+       [0][0][2][0][RTW89_KCC][35] = 74,
+       [0][0][2][0][RTW89_ACMA][35] = 60,
+       [0][0][2][0][RTW89_CHILE][35] = 64,
+       [0][0][2][0][RTW89_UKRAINE][35] = 52,
+       [0][0][2][0][RTW89_MEXICO][35] = 70,
+       [0][0][2][0][RTW89_CN][35] = 127,
+       [0][0][2][0][RTW89_QATAR][35] = 60,
+       [0][0][2][0][RTW89_UK][35] = 60,
+       [0][0][2][0][RTW89_FCC][37] = 78,
+       [0][0][2][0][RTW89_ETSI][37] = 127,
+       [0][0][2][0][RTW89_MKK][37] = 76,
+       [0][0][2][0][RTW89_IC][37] = 78,
+       [0][0][2][0][RTW89_KCC][37] = 74,
+       [0][0][2][0][RTW89_ACMA][37] = 76,
+       [0][0][2][0][RTW89_CHILE][37] = 64,
+       [0][0][2][0][RTW89_UKRAINE][37] = 127,
+       [0][0][2][0][RTW89_MEXICO][37] = 78,
+       [0][0][2][0][RTW89_CN][37] = 127,
+       [0][0][2][0][RTW89_QATAR][37] = 127,
+       [0][0][2][0][RTW89_UK][37] = 74,
+       [0][0][2][0][RTW89_FCC][38] = 78,
+       [0][0][2][0][RTW89_ETSI][38] = 28,
+       [0][0][2][0][RTW89_MKK][38] = 127,
+       [0][0][2][0][RTW89_IC][38] = 78,
+       [0][0][2][0][RTW89_KCC][38] = 72,
+       [0][0][2][0][RTW89_ACMA][38] = 76,
+       [0][0][2][0][RTW89_CHILE][38] = 64,
+       [0][0][2][0][RTW89_UKRAINE][38] = 28,
+       [0][0][2][0][RTW89_MEXICO][38] = 78,
+       [0][0][2][0][RTW89_CN][38] = 76,
+       [0][0][2][0][RTW89_QATAR][38] = 28,
+       [0][0][2][0][RTW89_UK][38] = 60,
+       [0][0][2][0][RTW89_FCC][40] = 78,
+       [0][0][2][0][RTW89_ETSI][40] = 28,
+       [0][0][2][0][RTW89_MKK][40] = 127,
+       [0][0][2][0][RTW89_IC][40] = 78,
+       [0][0][2][0][RTW89_KCC][40] = 72,
+       [0][0][2][0][RTW89_ACMA][40] = 76,
+       [0][0][2][0][RTW89_CHILE][40] = 64,
+       [0][0][2][0][RTW89_UKRAINE][40] = 28,
+       [0][0][2][0][RTW89_MEXICO][40] = 78,
+       [0][0][2][0][RTW89_CN][40] = 76,
+       [0][0][2][0][RTW89_QATAR][40] = 28,
+       [0][0][2][0][RTW89_UK][40] = 60,
+       [0][0][2][0][RTW89_FCC][42] = 78,
+       [0][0][2][0][RTW89_ETSI][42] = 28,
+       [0][0][2][0][RTW89_MKK][42] = 127,
+       [0][0][2][0][RTW89_IC][42] = 78,
+       [0][0][2][0][RTW89_KCC][42] = 72,
+       [0][0][2][0][RTW89_ACMA][42] = 76,
+       [0][0][2][0][RTW89_CHILE][42] = 64,
+       [0][0][2][0][RTW89_UKRAINE][42] = 28,
+       [0][0][2][0][RTW89_MEXICO][42] = 78,
+       [0][0][2][0][RTW89_CN][42] = 76,
+       [0][0][2][0][RTW89_QATAR][42] = 28,
+       [0][0][2][0][RTW89_UK][42] = 60,
+       [0][0][2][0][RTW89_FCC][44] = 78,
+       [0][0][2][0][RTW89_ETSI][44] = 28,
+       [0][0][2][0][RTW89_MKK][44] = 127,
+       [0][0][2][0][RTW89_IC][44] = 78,
+       [0][0][2][0][RTW89_KCC][44] = 72,
+       [0][0][2][0][RTW89_ACMA][44] = 76,
+       [0][0][2][0][RTW89_CHILE][44] = 66,
+       [0][0][2][0][RTW89_UKRAINE][44] = 28,
+       [0][0][2][0][RTW89_MEXICO][44] = 78,
+       [0][0][2][0][RTW89_CN][44] = 76,
+       [0][0][2][0][RTW89_QATAR][44] = 28,
+       [0][0][2][0][RTW89_UK][44] = 60,
+       [0][0][2][0][RTW89_FCC][46] = 78,
+       [0][0][2][0][RTW89_ETSI][46] = 28,
+       [0][0][2][0][RTW89_MKK][46] = 127,
+       [0][0][2][0][RTW89_IC][46] = 78,
+       [0][0][2][0][RTW89_KCC][46] = 72,
+       [0][0][2][0][RTW89_ACMA][46] = 76,
+       [0][0][2][0][RTW89_CHILE][46] = 66,
+       [0][0][2][0][RTW89_UKRAINE][46] = 28,
+       [0][0][2][0][RTW89_MEXICO][46] = 78,
+       [0][0][2][0][RTW89_CN][46] = 76,
+       [0][0][2][0][RTW89_QATAR][46] = 28,
+       [0][0][2][0][RTW89_UK][46] = 60,
+       [0][0][2][0][RTW89_FCC][48] = 78,
+       [0][0][2][0][RTW89_ETSI][48] = 127,
+       [0][0][2][0][RTW89_MKK][48] = 127,
+       [0][0][2][0][RTW89_IC][48] = 127,
+       [0][0][2][0][RTW89_KCC][48] = 127,
+       [0][0][2][0][RTW89_ACMA][48] = 127,
+       [0][0][2][0][RTW89_CHILE][48] = 127,
+       [0][0][2][0][RTW89_UKRAINE][48] = 127,
+       [0][0][2][0][RTW89_MEXICO][48] = 127,
+       [0][0][2][0][RTW89_CN][48] = 127,
+       [0][0][2][0][RTW89_QATAR][48] = 127,
+       [0][0][2][0][RTW89_UK][48] = 127,
+       [0][0][2][0][RTW89_FCC][50] = 78,
+       [0][0][2][0][RTW89_ETSI][50] = 127,
+       [0][0][2][0][RTW89_MKK][50] = 127,
+       [0][0][2][0][RTW89_IC][50] = 127,
+       [0][0][2][0][RTW89_KCC][50] = 127,
+       [0][0][2][0][RTW89_ACMA][50] = 127,
+       [0][0][2][0][RTW89_CHILE][50] = 127,
+       [0][0][2][0][RTW89_UKRAINE][50] = 127,
+       [0][0][2][0][RTW89_MEXICO][50] = 127,
+       [0][0][2][0][RTW89_CN][50] = 127,
+       [0][0][2][0][RTW89_QATAR][50] = 127,
+       [0][0][2][0][RTW89_UK][50] = 127,
+       [0][0][2][0][RTW89_FCC][52] = 78,
+       [0][0][2][0][RTW89_ETSI][52] = 127,
+       [0][0][2][0][RTW89_MKK][52] = 127,
+       [0][0][2][0][RTW89_IC][52] = 127,
+       [0][0][2][0][RTW89_KCC][52] = 127,
+       [0][0][2][0][RTW89_ACMA][52] = 127,
+       [0][0][2][0][RTW89_CHILE][52] = 127,
+       [0][0][2][0][RTW89_UKRAINE][52] = 127,
+       [0][0][2][0][RTW89_MEXICO][52] = 127,
+       [0][0][2][0][RTW89_CN][52] = 127,
+       [0][0][2][0][RTW89_QATAR][52] = 127,
+       [0][0][2][0][RTW89_UK][52] = 127,
+       [0][1][2][0][RTW89_FCC][0] = 70,
+       [0][1][2][0][RTW89_ETSI][0] = 48,
+       [0][1][2][0][RTW89_MKK][0] = 50,
+       [0][1][2][0][RTW89_IC][0] = 42,
+       [0][1][2][0][RTW89_KCC][0] = 62,
+       [0][1][2][0][RTW89_ACMA][0] = 48,
+       [0][1][2][0][RTW89_CHILE][0] = 30,
+       [0][1][2][0][RTW89_UKRAINE][0] = 40,
+       [0][1][2][0][RTW89_MEXICO][0] = 50,
+       [0][1][2][0][RTW89_CN][0] = 48,
+       [0][1][2][0][RTW89_QATAR][0] = 48,
+       [0][1][2][0][RTW89_UK][0] = 48,
+       [0][1][2][0][RTW89_FCC][2] = 70,
+       [0][1][2][0][RTW89_ETSI][2] = 48,
+       [0][1][2][0][RTW89_MKK][2] = 50,
+       [0][1][2][0][RTW89_IC][2] = 42,
+       [0][1][2][0][RTW89_KCC][2] = 62,
+       [0][1][2][0][RTW89_ACMA][2] = 48,
+       [0][1][2][0][RTW89_CHILE][2] = 30,
+       [0][1][2][0][RTW89_UKRAINE][2] = 40,
+       [0][1][2][0][RTW89_MEXICO][2] = 50,
+       [0][1][2][0][RTW89_CN][2] = 48,
+       [0][1][2][0][RTW89_QATAR][2] = 48,
+       [0][1][2][0][RTW89_UK][2] = 48,
+       [0][1][2][0][RTW89_FCC][4] = 70,
+       [0][1][2][0][RTW89_ETSI][4] = 48,
+       [0][1][2][0][RTW89_MKK][4] = 50,
+       [0][1][2][0][RTW89_IC][4] = 42,
+       [0][1][2][0][RTW89_KCC][4] = 62,
+       [0][1][2][0][RTW89_ACMA][4] = 48,
+       [0][1][2][0][RTW89_CHILE][4] = 30,
+       [0][1][2][0][RTW89_UKRAINE][4] = 40,
+       [0][1][2][0][RTW89_MEXICO][4] = 50,
+       [0][1][2][0][RTW89_CN][4] = 48,
+       [0][1][2][0][RTW89_QATAR][4] = 48,
+       [0][1][2][0][RTW89_UK][4] = 48,
+       [0][1][2][0][RTW89_FCC][6] = 70,
+       [0][1][2][0][RTW89_ETSI][6] = 48,
+       [0][1][2][0][RTW89_MKK][6] = 50,
+       [0][1][2][0][RTW89_IC][6] = 42,
+       [0][1][2][0][RTW89_KCC][6] = 34,
+       [0][1][2][0][RTW89_ACMA][6] = 48,
+       [0][1][2][0][RTW89_CHILE][6] = 30,
+       [0][1][2][0][RTW89_UKRAINE][6] = 40,
+       [0][1][2][0][RTW89_MEXICO][6] = 50,
+       [0][1][2][0][RTW89_CN][6] = 48,
+       [0][1][2][0][RTW89_QATAR][6] = 48,
+       [0][1][2][0][RTW89_UK][6] = 48,
+       [0][1][2][0][RTW89_FCC][8] = 70,
+       [0][1][2][0][RTW89_ETSI][8] = 48,
+       [0][1][2][0][RTW89_MKK][8] = 50,
+       [0][1][2][0][RTW89_IC][8] = 52,
+       [0][1][2][0][RTW89_KCC][8] = 62,
+       [0][1][2][0][RTW89_ACMA][8] = 48,
+       [0][1][2][0][RTW89_CHILE][8] = 50,
+       [0][1][2][0][RTW89_UKRAINE][8] = 40,
+       [0][1][2][0][RTW89_MEXICO][8] = 70,
+       [0][1][2][0][RTW89_CN][8] = 48,
+       [0][1][2][0][RTW89_QATAR][8] = 48,
+       [0][1][2][0][RTW89_UK][8] = 48,
+       [0][1][2][0][RTW89_FCC][10] = 70,
+       [0][1][2][0][RTW89_ETSI][10] = 48,
+       [0][1][2][0][RTW89_MKK][10] = 50,
+       [0][1][2][0][RTW89_IC][10] = 52,
+       [0][1][2][0][RTW89_KCC][10] = 62,
+       [0][1][2][0][RTW89_ACMA][10] = 48,
+       [0][1][2][0][RTW89_CHILE][10] = 50,
+       [0][1][2][0][RTW89_UKRAINE][10] = 40,
+       [0][1][2][0][RTW89_MEXICO][10] = 70,
+       [0][1][2][0][RTW89_CN][10] = 48,
+       [0][1][2][0][RTW89_QATAR][10] = 48,
+       [0][1][2][0][RTW89_UK][10] = 48,
+       [0][1][2][0][RTW89_FCC][12] = 70,
+       [0][1][2][0][RTW89_ETSI][12] = 48,
+       [0][1][2][0][RTW89_MKK][12] = 50,
+       [0][1][2][0][RTW89_IC][12] = 52,
+       [0][1][2][0][RTW89_KCC][12] = 62,
+       [0][1][2][0][RTW89_ACMA][12] = 48,
+       [0][1][2][0][RTW89_CHILE][12] = 50,
+       [0][1][2][0][RTW89_UKRAINE][12] = 40,
+       [0][1][2][0][RTW89_MEXICO][12] = 70,
+       [0][1][2][0][RTW89_CN][12] = 48,
+       [0][1][2][0][RTW89_QATAR][12] = 48,
+       [0][1][2][0][RTW89_UK][12] = 48,
+       [0][1][2][0][RTW89_FCC][14] = 70,
+       [0][1][2][0][RTW89_ETSI][14] = 48,
+       [0][1][2][0][RTW89_MKK][14] = 50,
+       [0][1][2][0][RTW89_IC][14] = 52,
+       [0][1][2][0][RTW89_KCC][14] = 62,
+       [0][1][2][0][RTW89_ACMA][14] = 48,
+       [0][1][2][0][RTW89_CHILE][14] = 50,
+       [0][1][2][0][RTW89_UKRAINE][14] = 40,
+       [0][1][2][0][RTW89_MEXICO][14] = 70,
+       [0][1][2][0][RTW89_CN][14] = 48,
+       [0][1][2][0][RTW89_QATAR][14] = 48,
+       [0][1][2][0][RTW89_UK][14] = 48,
+       [0][1][2][0][RTW89_FCC][15] = 68,
+       [0][1][2][0][RTW89_ETSI][15] = 48,
+       [0][1][2][0][RTW89_MKK][15] = 70,
+       [0][1][2][0][RTW89_IC][15] = 68,
+       [0][1][2][0][RTW89_KCC][15] = 62,
+       [0][1][2][0][RTW89_ACMA][15] = 48,
+       [0][1][2][0][RTW89_CHILE][15] = 48,
+       [0][1][2][0][RTW89_UKRAINE][15] = 40,
+       [0][1][2][0][RTW89_MEXICO][15] = 68,
+       [0][1][2][0][RTW89_CN][15] = 127,
+       [0][1][2][0][RTW89_QATAR][15] = 48,
+       [0][1][2][0][RTW89_UK][15] = 48,
+       [0][1][2][0][RTW89_FCC][17] = 70,
+       [0][1][2][0][RTW89_ETSI][17] = 48,
+       [0][1][2][0][RTW89_MKK][17] = 70,
+       [0][1][2][0][RTW89_IC][17] = 70,
+       [0][1][2][0][RTW89_KCC][17] = 62,
+       [0][1][2][0][RTW89_ACMA][17] = 48,
+       [0][1][2][0][RTW89_CHILE][17] = 48,
+       [0][1][2][0][RTW89_UKRAINE][17] = 40,
+       [0][1][2][0][RTW89_MEXICO][17] = 70,
+       [0][1][2][0][RTW89_CN][17] = 127,
+       [0][1][2][0][RTW89_QATAR][17] = 48,
+       [0][1][2][0][RTW89_UK][17] = 48,
+       [0][1][2][0][RTW89_FCC][19] = 70,
+       [0][1][2][0][RTW89_ETSI][19] = 48,
+       [0][1][2][0][RTW89_MKK][19] = 70,
+       [0][1][2][0][RTW89_IC][19] = 70,
+       [0][1][2][0][RTW89_KCC][19] = 62,
+       [0][1][2][0][RTW89_ACMA][19] = 48,
+       [0][1][2][0][RTW89_CHILE][19] = 48,
+       [0][1][2][0][RTW89_UKRAINE][19] = 40,
+       [0][1][2][0][RTW89_MEXICO][19] = 70,
+       [0][1][2][0][RTW89_CN][19] = 127,
+       [0][1][2][0][RTW89_QATAR][19] = 48,
+       [0][1][2][0][RTW89_UK][19] = 48,
+       [0][1][2][0][RTW89_FCC][21] = 70,
+       [0][1][2][0][RTW89_ETSI][21] = 48,
+       [0][1][2][0][RTW89_MKK][21] = 70,
+       [0][1][2][0][RTW89_IC][21] = 70,
+       [0][1][2][0][RTW89_KCC][21] = 62,
+       [0][1][2][0][RTW89_ACMA][21] = 48,
+       [0][1][2][0][RTW89_CHILE][21] = 48,
+       [0][1][2][0][RTW89_UKRAINE][21] = 40,
+       [0][1][2][0][RTW89_MEXICO][21] = 70,
+       [0][1][2][0][RTW89_CN][21] = 127,
+       [0][1][2][0][RTW89_QATAR][21] = 48,
+       [0][1][2][0][RTW89_UK][21] = 48,
+       [0][1][2][0][RTW89_FCC][23] = 70,
+       [0][1][2][0][RTW89_ETSI][23] = 48,
+       [0][1][2][0][RTW89_MKK][23] = 70,
+       [0][1][2][0][RTW89_IC][23] = 70,
+       [0][1][2][0][RTW89_KCC][23] = 62,
+       [0][1][2][0][RTW89_ACMA][23] = 48,
+       [0][1][2][0][RTW89_CHILE][23] = 48,
+       [0][1][2][0][RTW89_UKRAINE][23] = 40,
+       [0][1][2][0][RTW89_MEXICO][23] = 70,
+       [0][1][2][0][RTW89_CN][23] = 127,
+       [0][1][2][0][RTW89_QATAR][23] = 48,
+       [0][1][2][0][RTW89_UK][23] = 48,
+       [0][1][2][0][RTW89_FCC][25] = 70,
+       [0][1][2][0][RTW89_ETSI][25] = 48,
+       [0][1][2][0][RTW89_MKK][25] = 70,
+       [0][1][2][0][RTW89_IC][25] = 127,
+       [0][1][2][0][RTW89_KCC][25] = 62,
+       [0][1][2][0][RTW89_ACMA][25] = 127,
+       [0][1][2][0][RTW89_CHILE][25] = 48,
+       [0][1][2][0][RTW89_UKRAINE][25] = 40,
+       [0][1][2][0][RTW89_MEXICO][25] = 70,
+       [0][1][2][0][RTW89_CN][25] = 127,
+       [0][1][2][0][RTW89_QATAR][25] = 48,
+       [0][1][2][0][RTW89_UK][25] = 48,
+       [0][1][2][0][RTW89_FCC][27] = 70,
+       [0][1][2][0][RTW89_ETSI][27] = 48,
+       [0][1][2][0][RTW89_MKK][27] = 70,
+       [0][1][2][0][RTW89_IC][27] = 127,
+       [0][1][2][0][RTW89_KCC][27] = 62,
+       [0][1][2][0][RTW89_ACMA][27] = 127,
+       [0][1][2][0][RTW89_CHILE][27] = 50,
+       [0][1][2][0][RTW89_UKRAINE][27] = 40,
+       [0][1][2][0][RTW89_MEXICO][27] = 70,
+       [0][1][2][0][RTW89_CN][27] = 127,
+       [0][1][2][0][RTW89_QATAR][27] = 48,
+       [0][1][2][0][RTW89_UK][27] = 48,
+       [0][1][2][0][RTW89_FCC][29] = 70,
+       [0][1][2][0][RTW89_ETSI][29] = 48,
+       [0][1][2][0][RTW89_MKK][29] = 70,
+       [0][1][2][0][RTW89_IC][29] = 127,
+       [0][1][2][0][RTW89_KCC][29] = 62,
+       [0][1][2][0][RTW89_ACMA][29] = 127,
+       [0][1][2][0][RTW89_CHILE][29] = 50,
+       [0][1][2][0][RTW89_UKRAINE][29] = 40,
+       [0][1][2][0][RTW89_MEXICO][29] = 70,
+       [0][1][2][0][RTW89_CN][29] = 127,
+       [0][1][2][0][RTW89_QATAR][29] = 48,
+       [0][1][2][0][RTW89_UK][29] = 48,
+       [0][1][2][0][RTW89_FCC][31] = 70,
+       [0][1][2][0][RTW89_ETSI][31] = 48,
+       [0][1][2][0][RTW89_MKK][31] = 70,
+       [0][1][2][0][RTW89_IC][31] = 70,
+       [0][1][2][0][RTW89_KCC][31] = 62,
+       [0][1][2][0][RTW89_ACMA][31] = 48,
+       [0][1][2][0][RTW89_CHILE][31] = 50,
+       [0][1][2][0][RTW89_UKRAINE][31] = 40,
+       [0][1][2][0][RTW89_MEXICO][31] = 70,
+       [0][1][2][0][RTW89_CN][31] = 127,
+       [0][1][2][0][RTW89_QATAR][31] = 48,
+       [0][1][2][0][RTW89_UK][31] = 48,
+       [0][1][2][0][RTW89_FCC][33] = 70,
+       [0][1][2][0][RTW89_ETSI][33] = 48,
+       [0][1][2][0][RTW89_MKK][33] = 70,
+       [0][1][2][0][RTW89_IC][33] = 70,
+       [0][1][2][0][RTW89_KCC][33] = 62,
+       [0][1][2][0][RTW89_ACMA][33] = 48,
+       [0][1][2][0][RTW89_CHILE][33] = 50,
+       [0][1][2][0][RTW89_UKRAINE][33] = 40,
+       [0][1][2][0][RTW89_MEXICO][33] = 70,
+       [0][1][2][0][RTW89_CN][33] = 127,
+       [0][1][2][0][RTW89_QATAR][33] = 48,
+       [0][1][2][0][RTW89_UK][33] = 48,
+       [0][1][2][0][RTW89_FCC][35] = 66,
+       [0][1][2][0][RTW89_ETSI][35] = 48,
+       [0][1][2][0][RTW89_MKK][35] = 70,
+       [0][1][2][0][RTW89_IC][35] = 66,
+       [0][1][2][0][RTW89_KCC][35] = 62,
+       [0][1][2][0][RTW89_ACMA][35] = 48,
+       [0][1][2][0][RTW89_CHILE][35] = 50,
+       [0][1][2][0][RTW89_UKRAINE][35] = 40,
+       [0][1][2][0][RTW89_MEXICO][35] = 66,
+       [0][1][2][0][RTW89_CN][35] = 127,
+       [0][1][2][0][RTW89_QATAR][35] = 48,
+       [0][1][2][0][RTW89_UK][35] = 48,
+       [0][1][2][0][RTW89_FCC][37] = 70,
+       [0][1][2][0][RTW89_ETSI][37] = 127,
+       [0][1][2][0][RTW89_MKK][37] = 70,
+       [0][1][2][0][RTW89_IC][37] = 70,
+       [0][1][2][0][RTW89_KCC][37] = 62,
+       [0][1][2][0][RTW89_ACMA][37] = 70,
+       [0][1][2][0][RTW89_CHILE][37] = 50,
+       [0][1][2][0][RTW89_UKRAINE][37] = 127,
+       [0][1][2][0][RTW89_MEXICO][37] = 70,
+       [0][1][2][0][RTW89_CN][37] = 127,
+       [0][1][2][0][RTW89_QATAR][37] = 127,
+       [0][1][2][0][RTW89_UK][37] = 76,
+       [0][1][2][0][RTW89_FCC][38] = 78,
+       [0][1][2][0][RTW89_ETSI][38] = 16,
+       [0][1][2][0][RTW89_MKK][38] = 127,
+       [0][1][2][0][RTW89_IC][38] = 78,
+       [0][1][2][0][RTW89_KCC][38] = 62,
+       [0][1][2][0][RTW89_ACMA][38] = 74,
+       [0][1][2][0][RTW89_CHILE][38] = 50,
+       [0][1][2][0][RTW89_UKRAINE][38] = 16,
+       [0][1][2][0][RTW89_MEXICO][38] = 78,
+       [0][1][2][0][RTW89_CN][38] = 76,
+       [0][1][2][0][RTW89_QATAR][38] = 16,
+       [0][1][2][0][RTW89_UK][38] = 48,
+       [0][1][2][0][RTW89_FCC][40] = 78,
+       [0][1][2][0][RTW89_ETSI][40] = 16,
+       [0][1][2][0][RTW89_MKK][40] = 127,
+       [0][1][2][0][RTW89_IC][40] = 78,
+       [0][1][2][0][RTW89_KCC][40] = 62,
+       [0][1][2][0][RTW89_ACMA][40] = 74,
+       [0][1][2][0][RTW89_CHILE][40] = 50,
+       [0][1][2][0][RTW89_UKRAINE][40] = 16,
+       [0][1][2][0][RTW89_MEXICO][40] = 78,
+       [0][1][2][0][RTW89_CN][40] = 76,
+       [0][1][2][0][RTW89_QATAR][40] = 16,
+       [0][1][2][0][RTW89_UK][40] = 48,
+       [0][1][2][0][RTW89_FCC][42] = 78,
+       [0][1][2][0][RTW89_ETSI][42] = 16,
+       [0][1][2][0][RTW89_MKK][42] = 127,
+       [0][1][2][0][RTW89_IC][42] = 78,
+       [0][1][2][0][RTW89_KCC][42] = 62,
+       [0][1][2][0][RTW89_ACMA][42] = 76,
+       [0][1][2][0][RTW89_CHILE][42] = 52,
+       [0][1][2][0][RTW89_UKRAINE][42] = 16,
+       [0][1][2][0][RTW89_MEXICO][42] = 78,
+       [0][1][2][0][RTW89_CN][42] = 76,
+       [0][1][2][0][RTW89_QATAR][42] = 16,
+       [0][1][2][0][RTW89_UK][42] = 48,
+       [0][1][2][0][RTW89_FCC][44] = 78,
+       [0][1][2][0][RTW89_ETSI][44] = 16,
+       [0][1][2][0][RTW89_MKK][44] = 127,
+       [0][1][2][0][RTW89_IC][44] = 78,
+       [0][1][2][0][RTW89_KCC][44] = 62,
+       [0][1][2][0][RTW89_ACMA][44] = 76,
+       [0][1][2][0][RTW89_CHILE][44] = 52,
+       [0][1][2][0][RTW89_UKRAINE][44] = 16,
+       [0][1][2][0][RTW89_MEXICO][44] = 78,
+       [0][1][2][0][RTW89_CN][44] = 76,
+       [0][1][2][0][RTW89_QATAR][44] = 16,
+       [0][1][2][0][RTW89_UK][44] = 48,
+       [0][1][2][0][RTW89_FCC][46] = 78,
+       [0][1][2][0][RTW89_ETSI][46] = 16,
+       [0][1][2][0][RTW89_MKK][46] = 127,
+       [0][1][2][0][RTW89_IC][46] = 78,
+       [0][1][2][0][RTW89_KCC][46] = 62,
+       [0][1][2][0][RTW89_ACMA][46] = 76,
+       [0][1][2][0][RTW89_CHILE][46] = 52,
+       [0][1][2][0][RTW89_UKRAINE][46] = 16,
+       [0][1][2][0][RTW89_MEXICO][46] = 78,
+       [0][1][2][0][RTW89_CN][46] = 76,
+       [0][1][2][0][RTW89_QATAR][46] = 16,
+       [0][1][2][0][RTW89_UK][46] = 48,
+       [0][1][2][0][RTW89_FCC][48] = 58,
+       [0][1][2][0][RTW89_ETSI][48] = 127,
+       [0][1][2][0][RTW89_MKK][48] = 127,
+       [0][1][2][0][RTW89_IC][48] = 127,
+       [0][1][2][0][RTW89_KCC][48] = 127,
+       [0][1][2][0][RTW89_ACMA][48] = 127,
+       [0][1][2][0][RTW89_CHILE][48] = 127,
+       [0][1][2][0][RTW89_UKRAINE][48] = 127,
+       [0][1][2][0][RTW89_MEXICO][48] = 127,
+       [0][1][2][0][RTW89_CN][48] = 127,
+       [0][1][2][0][RTW89_QATAR][48] = 127,
+       [0][1][2][0][RTW89_UK][48] = 127,
+       [0][1][2][0][RTW89_FCC][50] = 58,
+       [0][1][2][0][RTW89_ETSI][50] = 127,
+       [0][1][2][0][RTW89_MKK][50] = 127,
+       [0][1][2][0][RTW89_IC][50] = 127,
+       [0][1][2][0][RTW89_KCC][50] = 127,
+       [0][1][2][0][RTW89_ACMA][50] = 127,
+       [0][1][2][0][RTW89_CHILE][50] = 127,
+       [0][1][2][0][RTW89_UKRAINE][50] = 127,
+       [0][1][2][0][RTW89_MEXICO][50] = 127,
+       [0][1][2][0][RTW89_CN][50] = 127,
+       [0][1][2][0][RTW89_QATAR][50] = 127,
+       [0][1][2][0][RTW89_UK][50] = 127,
+       [0][1][2][0][RTW89_FCC][52] = 58,
+       [0][1][2][0][RTW89_ETSI][52] = 127,
+       [0][1][2][0][RTW89_MKK][52] = 127,
+       [0][1][2][0][RTW89_IC][52] = 127,
+       [0][1][2][0][RTW89_KCC][52] = 127,
+       [0][1][2][0][RTW89_ACMA][52] = 127,
+       [0][1][2][0][RTW89_CHILE][52] = 127,
+       [0][1][2][0][RTW89_UKRAINE][52] = 127,
+       [0][1][2][0][RTW89_MEXICO][52] = 127,
+       [0][1][2][0][RTW89_CN][52] = 127,
+       [0][1][2][0][RTW89_QATAR][52] = 127,
+       [0][1][2][0][RTW89_UK][52] = 127,
+       [0][1][2][1][RTW89_FCC][0] = 68,
+       [0][1][2][1][RTW89_ETSI][0] = 36,
+       [0][1][2][1][RTW89_MKK][0] = 50,
+       [0][1][2][1][RTW89_IC][0] = 40,
+       [0][1][2][1][RTW89_KCC][0] = 62,
+       [0][1][2][1][RTW89_ACMA][0] = 36,
+       [0][1][2][1][RTW89_CHILE][0] = 14,
+       [0][1][2][1][RTW89_UKRAINE][0] = 28,
+       [0][1][2][1][RTW89_MEXICO][0] = 50,
+       [0][1][2][1][RTW89_CN][0] = 36,
+       [0][1][2][1][RTW89_QATAR][0] = 36,
+       [0][1][2][1][RTW89_UK][0] = 36,
+       [0][1][2][1][RTW89_FCC][2] = 68,
+       [0][1][2][1][RTW89_ETSI][2] = 36,
+       [0][1][2][1][RTW89_MKK][2] = 50,
+       [0][1][2][1][RTW89_IC][2] = 40,
+       [0][1][2][1][RTW89_KCC][2] = 62,
+       [0][1][2][1][RTW89_ACMA][2] = 36,
+       [0][1][2][1][RTW89_CHILE][2] = 14,
+       [0][1][2][1][RTW89_UKRAINE][2] = 28,
+       [0][1][2][1][RTW89_MEXICO][2] = 50,
+       [0][1][2][1][RTW89_CN][2] = 36,
+       [0][1][2][1][RTW89_QATAR][2] = 36,
+       [0][1][2][1][RTW89_UK][2] = 36,
+       [0][1][2][1][RTW89_FCC][4] = 68,
+       [0][1][2][1][RTW89_ETSI][4] = 36,
+       [0][1][2][1][RTW89_MKK][4] = 50,
+       [0][1][2][1][RTW89_IC][4] = 40,
+       [0][1][2][1][RTW89_KCC][4] = 62,
+       [0][1][2][1][RTW89_ACMA][4] = 36,
+       [0][1][2][1][RTW89_CHILE][4] = 14,
+       [0][1][2][1][RTW89_UKRAINE][4] = 28,
+       [0][1][2][1][RTW89_MEXICO][4] = 50,
+       [0][1][2][1][RTW89_CN][4] = 36,
+       [0][1][2][1][RTW89_QATAR][4] = 36,
+       [0][1][2][1][RTW89_UK][4] = 36,
+       [0][1][2][1][RTW89_FCC][6] = 68,
+       [0][1][2][1][RTW89_ETSI][6] = 36,
+       [0][1][2][1][RTW89_MKK][6] = 50,
+       [0][1][2][1][RTW89_IC][6] = 40,
+       [0][1][2][1][RTW89_KCC][6] = 34,
+       [0][1][2][1][RTW89_ACMA][6] = 36,
+       [0][1][2][1][RTW89_CHILE][6] = 14,
+       [0][1][2][1][RTW89_UKRAINE][6] = 28,
+       [0][1][2][1][RTW89_MEXICO][6] = 50,
+       [0][1][2][1][RTW89_CN][6] = 36,
+       [0][1][2][1][RTW89_QATAR][6] = 36,
+       [0][1][2][1][RTW89_UK][6] = 36,
+       [0][1][2][1][RTW89_FCC][8] = 68,
+       [0][1][2][1][RTW89_ETSI][8] = 36,
+       [0][1][2][1][RTW89_MKK][8] = 50,
+       [0][1][2][1][RTW89_IC][8] = 40,
+       [0][1][2][1][RTW89_KCC][8] = 62,
+       [0][1][2][1][RTW89_ACMA][8] = 36,
+       [0][1][2][1][RTW89_CHILE][8] = 36,
+       [0][1][2][1][RTW89_UKRAINE][8] = 28,
+       [0][1][2][1][RTW89_MEXICO][8] = 68,
+       [0][1][2][1][RTW89_CN][8] = 36,
+       [0][1][2][1][RTW89_QATAR][8] = 36,
+       [0][1][2][1][RTW89_UK][8] = 36,
+       [0][1][2][1][RTW89_FCC][10] = 68,
+       [0][1][2][1][RTW89_ETSI][10] = 36,
+       [0][1][2][1][RTW89_MKK][10] = 50,
+       [0][1][2][1][RTW89_IC][10] = 40,
+       [0][1][2][1][RTW89_KCC][10] = 62,
+       [0][1][2][1][RTW89_ACMA][10] = 36,
+       [0][1][2][1][RTW89_CHILE][10] = 36,
+       [0][1][2][1][RTW89_UKRAINE][10] = 28,
+       [0][1][2][1][RTW89_MEXICO][10] = 68,
+       [0][1][2][1][RTW89_CN][10] = 36,
+       [0][1][2][1][RTW89_QATAR][10] = 36,
+       [0][1][2][1][RTW89_UK][10] = 36,
+       [0][1][2][1][RTW89_FCC][12] = 68,
+       [0][1][2][1][RTW89_ETSI][12] = 36,
+       [0][1][2][1][RTW89_MKK][12] = 50,
+       [0][1][2][1][RTW89_IC][12] = 40,
+       [0][1][2][1][RTW89_KCC][12] = 62,
+       [0][1][2][1][RTW89_ACMA][12] = 36,
+       [0][1][2][1][RTW89_CHILE][12] = 36,
+       [0][1][2][1][RTW89_UKRAINE][12] = 28,
+       [0][1][2][1][RTW89_MEXICO][12] = 68,
+       [0][1][2][1][RTW89_CN][12] = 36,
+       [0][1][2][1][RTW89_QATAR][12] = 36,
+       [0][1][2][1][RTW89_UK][12] = 36,
+       [0][1][2][1][RTW89_FCC][14] = 68,
+       [0][1][2][1][RTW89_ETSI][14] = 36,
+       [0][1][2][1][RTW89_MKK][14] = 50,
+       [0][1][2][1][RTW89_IC][14] = 40,
+       [0][1][2][1][RTW89_KCC][14] = 62,
+       [0][1][2][1][RTW89_ACMA][14] = 36,
+       [0][1][2][1][RTW89_CHILE][14] = 36,
+       [0][1][2][1][RTW89_UKRAINE][14] = 28,
+       [0][1][2][1][RTW89_MEXICO][14] = 68,
+       [0][1][2][1][RTW89_CN][14] = 36,
+       [0][1][2][1][RTW89_QATAR][14] = 36,
+       [0][1][2][1][RTW89_UK][14] = 36,
+       [0][1][2][1][RTW89_FCC][15] = 68,
+       [0][1][2][1][RTW89_ETSI][15] = 36,
+       [0][1][2][1][RTW89_MKK][15] = 70,
+       [0][1][2][1][RTW89_IC][15] = 68,
+       [0][1][2][1][RTW89_KCC][15] = 62,
+       [0][1][2][1][RTW89_ACMA][15] = 36,
+       [0][1][2][1][RTW89_CHILE][15] = 36,
+       [0][1][2][1][RTW89_UKRAINE][15] = 28,
+       [0][1][2][1][RTW89_MEXICO][15] = 68,
+       [0][1][2][1][RTW89_CN][15] = 127,
+       [0][1][2][1][RTW89_QATAR][15] = 36,
+       [0][1][2][1][RTW89_UK][15] = 36,
+       [0][1][2][1][RTW89_FCC][17] = 68,
+       [0][1][2][1][RTW89_ETSI][17] = 36,
+       [0][1][2][1][RTW89_MKK][17] = 70,
+       [0][1][2][1][RTW89_IC][17] = 68,
+       [0][1][2][1][RTW89_KCC][17] = 62,
+       [0][1][2][1][RTW89_ACMA][17] = 36,
+       [0][1][2][1][RTW89_CHILE][17] = 36,
+       [0][1][2][1][RTW89_UKRAINE][17] = 28,
+       [0][1][2][1][RTW89_MEXICO][17] = 68,
+       [0][1][2][1][RTW89_CN][17] = 127,
+       [0][1][2][1][RTW89_QATAR][17] = 36,
+       [0][1][2][1][RTW89_UK][17] = 36,
+       [0][1][2][1][RTW89_FCC][19] = 68,
+       [0][1][2][1][RTW89_ETSI][19] = 36,
+       [0][1][2][1][RTW89_MKK][19] = 70,
+       [0][1][2][1][RTW89_IC][19] = 68,
+       [0][1][2][1][RTW89_KCC][19] = 62,
+       [0][1][2][1][RTW89_ACMA][19] = 36,
+       [0][1][2][1][RTW89_CHILE][19] = 36,
+       [0][1][2][1][RTW89_UKRAINE][19] = 28,
+       [0][1][2][1][RTW89_MEXICO][19] = 68,
+       [0][1][2][1][RTW89_CN][19] = 127,
+       [0][1][2][1][RTW89_QATAR][19] = 36,
+       [0][1][2][1][RTW89_UK][19] = 36,
+       [0][1][2][1][RTW89_FCC][21] = 68,
+       [0][1][2][1][RTW89_ETSI][21] = 36,
+       [0][1][2][1][RTW89_MKK][21] = 70,
+       [0][1][2][1][RTW89_IC][21] = 68,
+       [0][1][2][1][RTW89_KCC][21] = 62,
+       [0][1][2][1][RTW89_ACMA][21] = 36,
+       [0][1][2][1][RTW89_CHILE][21] = 36,
+       [0][1][2][1][RTW89_UKRAINE][21] = 28,
+       [0][1][2][1][RTW89_MEXICO][21] = 68,
+       [0][1][2][1][RTW89_CN][21] = 127,
+       [0][1][2][1][RTW89_QATAR][21] = 36,
+       [0][1][2][1][RTW89_UK][21] = 36,
+       [0][1][2][1][RTW89_FCC][23] = 68,
+       [0][1][2][1][RTW89_ETSI][23] = 36,
+       [0][1][2][1][RTW89_MKK][23] = 70,
+       [0][1][2][1][RTW89_IC][23] = 68,
+       [0][1][2][1][RTW89_KCC][23] = 62,
+       [0][1][2][1][RTW89_ACMA][23] = 36,
+       [0][1][2][1][RTW89_CHILE][23] = 36,
+       [0][1][2][1][RTW89_UKRAINE][23] = 28,
+       [0][1][2][1][RTW89_MEXICO][23] = 68,
+       [0][1][2][1][RTW89_CN][23] = 127,
+       [0][1][2][1][RTW89_QATAR][23] = 36,
+       [0][1][2][1][RTW89_UK][23] = 36,
+       [0][1][2][1][RTW89_FCC][25] = 66,
+       [0][1][2][1][RTW89_ETSI][25] = 36,
+       [0][1][2][1][RTW89_MKK][25] = 70,
+       [0][1][2][1][RTW89_IC][25] = 127,
+       [0][1][2][1][RTW89_KCC][25] = 62,
+       [0][1][2][1][RTW89_ACMA][25] = 127,
+       [0][1][2][1][RTW89_CHILE][25] = 36,
+       [0][1][2][1][RTW89_UKRAINE][25] = 28,
+       [0][1][2][1][RTW89_MEXICO][25] = 66,
+       [0][1][2][1][RTW89_CN][25] = 127,
+       [0][1][2][1][RTW89_QATAR][25] = 36,
+       [0][1][2][1][RTW89_UK][25] = 36,
+       [0][1][2][1][RTW89_FCC][27] = 66,
+       [0][1][2][1][RTW89_ETSI][27] = 36,
+       [0][1][2][1][RTW89_MKK][27] = 70,
+       [0][1][2][1][RTW89_IC][27] = 127,
+       [0][1][2][1][RTW89_KCC][27] = 62,
+       [0][1][2][1][RTW89_ACMA][27] = 127,
+       [0][1][2][1][RTW89_CHILE][27] = 36,
+       [0][1][2][1][RTW89_UKRAINE][27] = 28,
+       [0][1][2][1][RTW89_MEXICO][27] = 66,
+       [0][1][2][1][RTW89_CN][27] = 127,
+       [0][1][2][1][RTW89_QATAR][27] = 36,
+       [0][1][2][1][RTW89_UK][27] = 36,
+       [0][1][2][1][RTW89_FCC][29] = 66,
+       [0][1][2][1][RTW89_ETSI][29] = 36,
+       [0][1][2][1][RTW89_MKK][29] = 70,
+       [0][1][2][1][RTW89_IC][29] = 127,
+       [0][1][2][1][RTW89_KCC][29] = 62,
+       [0][1][2][1][RTW89_ACMA][29] = 127,
+       [0][1][2][1][RTW89_CHILE][29] = 36,
+       [0][1][2][1][RTW89_UKRAINE][29] = 28,
+       [0][1][2][1][RTW89_MEXICO][29] = 66,
+       [0][1][2][1][RTW89_CN][29] = 127,
+       [0][1][2][1][RTW89_QATAR][29] = 36,
+       [0][1][2][1][RTW89_UK][29] = 36,
+       [0][1][2][1][RTW89_FCC][31] = 66,
+       [0][1][2][1][RTW89_ETSI][31] = 36,
+       [0][1][2][1][RTW89_MKK][31] = 70,
+       [0][1][2][1][RTW89_IC][31] = 66,
+       [0][1][2][1][RTW89_KCC][31] = 62,
+       [0][1][2][1][RTW89_ACMA][31] = 36,
+       [0][1][2][1][RTW89_CHILE][31] = 36,
+       [0][1][2][1][RTW89_UKRAINE][31] = 28,
+       [0][1][2][1][RTW89_MEXICO][31] = 66,
+       [0][1][2][1][RTW89_CN][31] = 127,
+       [0][1][2][1][RTW89_QATAR][31] = 36,
+       [0][1][2][1][RTW89_UK][31] = 36,
+       [0][1][2][1][RTW89_FCC][33] = 66,
+       [0][1][2][1][RTW89_ETSI][33] = 36,
+       [0][1][2][1][RTW89_MKK][33] = 70,
+       [0][1][2][1][RTW89_IC][33] = 66,
+       [0][1][2][1][RTW89_KCC][33] = 62,
+       [0][1][2][1][RTW89_ACMA][33] = 36,
+       [0][1][2][1][RTW89_CHILE][33] = 36,
+       [0][1][2][1][RTW89_UKRAINE][33] = 28,
+       [0][1][2][1][RTW89_MEXICO][33] = 66,
+       [0][1][2][1][RTW89_CN][33] = 127,
+       [0][1][2][1][RTW89_QATAR][33] = 36,
+       [0][1][2][1][RTW89_UK][33] = 36,
+       [0][1][2][1][RTW89_FCC][35] = 66,
+       [0][1][2][1][RTW89_ETSI][35] = 36,
+       [0][1][2][1][RTW89_MKK][35] = 70,
+       [0][1][2][1][RTW89_IC][35] = 66,
+       [0][1][2][1][RTW89_KCC][35] = 62,
+       [0][1][2][1][RTW89_ACMA][35] = 36,
+       [0][1][2][1][RTW89_CHILE][35] = 36,
+       [0][1][2][1][RTW89_UKRAINE][35] = 28,
+       [0][1][2][1][RTW89_MEXICO][35] = 66,
+       [0][1][2][1][RTW89_CN][35] = 127,
+       [0][1][2][1][RTW89_QATAR][35] = 36,
+       [0][1][2][1][RTW89_UK][35] = 36,
+       [0][1][2][1][RTW89_FCC][37] = 68,
+       [0][1][2][1][RTW89_ETSI][37] = 127,
+       [0][1][2][1][RTW89_MKK][37] = 70,
+       [0][1][2][1][RTW89_IC][37] = 68,
+       [0][1][2][1][RTW89_KCC][37] = 62,
+       [0][1][2][1][RTW89_ACMA][37] = 70,
+       [0][1][2][1][RTW89_CHILE][37] = 36,
+       [0][1][2][1][RTW89_UKRAINE][37] = 127,
+       [0][1][2][1][RTW89_MEXICO][37] = 68,
+       [0][1][2][1][RTW89_CN][37] = 127,
+       [0][1][2][1][RTW89_QATAR][37] = 127,
+       [0][1][2][1][RTW89_UK][37] = 62,
+       [0][1][2][1][RTW89_FCC][38] = 78,
+       [0][1][2][1][RTW89_ETSI][38] = 4,
+       [0][1][2][1][RTW89_MKK][38] = 127,
+       [0][1][2][1][RTW89_IC][38] = 78,
+       [0][1][2][1][RTW89_KCC][38] = 62,
+       [0][1][2][1][RTW89_ACMA][38] = 74,
+       [0][1][2][1][RTW89_CHILE][38] = 36,
+       [0][1][2][1][RTW89_UKRAINE][38] = 4,
+       [0][1][2][1][RTW89_MEXICO][38] = 78,
+       [0][1][2][1][RTW89_CN][38] = 72,
+       [0][1][2][1][RTW89_QATAR][38] = 4,
+       [0][1][2][1][RTW89_UK][38] = 36,
+       [0][1][2][1][RTW89_FCC][40] = 78,
+       [0][1][2][1][RTW89_ETSI][40] = 4,
+       [0][1][2][1][RTW89_MKK][40] = 127,
+       [0][1][2][1][RTW89_IC][40] = 78,
+       [0][1][2][1][RTW89_KCC][40] = 62,
+       [0][1][2][1][RTW89_ACMA][40] = 74,
+       [0][1][2][1][RTW89_CHILE][40] = 36,
+       [0][1][2][1][RTW89_UKRAINE][40] = 4,
+       [0][1][2][1][RTW89_MEXICO][40] = 78,
+       [0][1][2][1][RTW89_CN][40] = 72,
+       [0][1][2][1][RTW89_QATAR][40] = 4,
+       [0][1][2][1][RTW89_UK][40] = 36,
+       [0][1][2][1][RTW89_FCC][42] = 78,
+       [0][1][2][1][RTW89_ETSI][42] = 4,
+       [0][1][2][1][RTW89_MKK][42] = 127,
+       [0][1][2][1][RTW89_IC][42] = 78,
+       [0][1][2][1][RTW89_KCC][42] = 62,
+       [0][1][2][1][RTW89_ACMA][42] = 76,
+       [0][1][2][1][RTW89_CHILE][42] = 36,
+       [0][1][2][1][RTW89_UKRAINE][42] = 4,
+       [0][1][2][1][RTW89_MEXICO][42] = 78,
+       [0][1][2][1][RTW89_CN][42] = 72,
+       [0][1][2][1][RTW89_QATAR][42] = 4,
+       [0][1][2][1][RTW89_UK][42] = 36,
+       [0][1][2][1][RTW89_FCC][44] = 78,
+       [0][1][2][1][RTW89_ETSI][44] = 4,
+       [0][1][2][1][RTW89_MKK][44] = 127,
+       [0][1][2][1][RTW89_IC][44] = 78,
+       [0][1][2][1][RTW89_KCC][44] = 62,
+       [0][1][2][1][RTW89_ACMA][44] = 76,
+       [0][1][2][1][RTW89_CHILE][44] = 36,
+       [0][1][2][1][RTW89_UKRAINE][44] = 4,
+       [0][1][2][1][RTW89_MEXICO][44] = 78,
+       [0][1][2][1][RTW89_CN][44] = 76,
+       [0][1][2][1][RTW89_QATAR][44] = 4,
+       [0][1][2][1][RTW89_UK][44] = 36,
+       [0][1][2][1][RTW89_FCC][46] = 78,
+       [0][1][2][1][RTW89_ETSI][46] = 4,
+       [0][1][2][1][RTW89_MKK][46] = 127,
+       [0][1][2][1][RTW89_IC][46] = 78,
+       [0][1][2][1][RTW89_KCC][46] = 62,
+       [0][1][2][1][RTW89_ACMA][46] = 76,
+       [0][1][2][1][RTW89_CHILE][46] = 36,
+       [0][1][2][1][RTW89_UKRAINE][46] = 4,
+       [0][1][2][1][RTW89_MEXICO][46] = 78,
+       [0][1][2][1][RTW89_CN][46] = 76,
+       [0][1][2][1][RTW89_QATAR][46] = 4,
+       [0][1][2][1][RTW89_UK][46] = 36,
+       [0][1][2][1][RTW89_FCC][48] = 58,
+       [0][1][2][1][RTW89_ETSI][48] = 127,
+       [0][1][2][1][RTW89_MKK][48] = 127,
+       [0][1][2][1][RTW89_IC][48] = 127,
+       [0][1][2][1][RTW89_KCC][48] = 127,
+       [0][1][2][1][RTW89_ACMA][48] = 127,
+       [0][1][2][1][RTW89_CHILE][48] = 127,
+       [0][1][2][1][RTW89_UKRAINE][48] = 127,
+       [0][1][2][1][RTW89_MEXICO][48] = 127,
+       [0][1][2][1][RTW89_CN][48] = 127,
+       [0][1][2][1][RTW89_QATAR][48] = 127,
+       [0][1][2][1][RTW89_UK][48] = 127,
+       [0][1][2][1][RTW89_FCC][50] = 58,
+       [0][1][2][1][RTW89_ETSI][50] = 127,
+       [0][1][2][1][RTW89_MKK][50] = 127,
+       [0][1][2][1][RTW89_IC][50] = 127,
+       [0][1][2][1][RTW89_KCC][50] = 127,
+       [0][1][2][1][RTW89_ACMA][50] = 127,
+       [0][1][2][1][RTW89_CHILE][50] = 127,
+       [0][1][2][1][RTW89_UKRAINE][50] = 127,
+       [0][1][2][1][RTW89_MEXICO][50] = 127,
+       [0][1][2][1][RTW89_CN][50] = 127,
+       [0][1][2][1][RTW89_QATAR][50] = 127,
+       [0][1][2][1][RTW89_UK][50] = 127,
+       [0][1][2][1][RTW89_FCC][52] = 58,
+       [0][1][2][1][RTW89_ETSI][52] = 127,
+       [0][1][2][1][RTW89_MKK][52] = 127,
+       [0][1][2][1][RTW89_IC][52] = 127,
+       [0][1][2][1][RTW89_KCC][52] = 127,
+       [0][1][2][1][RTW89_ACMA][52] = 127,
+       [0][1][2][1][RTW89_CHILE][52] = 127,
+       [0][1][2][1][RTW89_UKRAINE][52] = 127,
+       [0][1][2][1][RTW89_MEXICO][52] = 127,
+       [0][1][2][1][RTW89_CN][52] = 127,
+       [0][1][2][1][RTW89_QATAR][52] = 127,
+       [0][1][2][1][RTW89_UK][52] = 127,
+       [1][0][2][0][RTW89_FCC][1] = 66,
+       [1][0][2][0][RTW89_ETSI][1] = 64,
+       [1][0][2][0][RTW89_MKK][1] = 62,
+       [1][0][2][0][RTW89_IC][1] = 64,
+       [1][0][2][0][RTW89_KCC][1] = 70,
+       [1][0][2][0][RTW89_ACMA][1] = 64,
+       [1][0][2][0][RTW89_CHILE][1] = 42,
+       [1][0][2][0][RTW89_UKRAINE][1] = 52,
+       [1][0][2][0][RTW89_MEXICO][1] = 62,
+       [1][0][2][0][RTW89_CN][1] = 62,
+       [1][0][2][0][RTW89_QATAR][1] = 64,
+       [1][0][2][0][RTW89_UK][1] = 64,
+       [1][0][2][0][RTW89_FCC][5] = 78,
+       [1][0][2][0][RTW89_ETSI][5] = 64,
+       [1][0][2][0][RTW89_MKK][5] = 62,
+       [1][0][2][0][RTW89_IC][5] = 64,
+       [1][0][2][0][RTW89_KCC][5] = 66,
+       [1][0][2][0][RTW89_ACMA][5] = 64,
+       [1][0][2][0][RTW89_CHILE][5] = 42,
+       [1][0][2][0][RTW89_UKRAINE][5] = 52,
+       [1][0][2][0][RTW89_MEXICO][5] = 62,
+       [1][0][2][0][RTW89_CN][5] = 62,
+       [1][0][2][0][RTW89_QATAR][5] = 64,
+       [1][0][2][0][RTW89_UK][5] = 64,
+       [1][0][2][0][RTW89_FCC][9] = 78,
+       [1][0][2][0][RTW89_ETSI][9] = 64,
+       [1][0][2][0][RTW89_MKK][9] = 62,
+       [1][0][2][0][RTW89_IC][9] = 64,
+       [1][0][2][0][RTW89_KCC][9] = 74,
+       [1][0][2][0][RTW89_ACMA][9] = 64,
+       [1][0][2][0][RTW89_CHILE][9] = 66,
+       [1][0][2][0][RTW89_UKRAINE][9] = 52,
+       [1][0][2][0][RTW89_MEXICO][9] = 78,
+       [1][0][2][0][RTW89_CN][9] = 62,
+       [1][0][2][0][RTW89_QATAR][9] = 64,
+       [1][0][2][0][RTW89_UK][9] = 64,
+       [1][0][2][0][RTW89_FCC][13] = 66,
+       [1][0][2][0][RTW89_ETSI][13] = 64,
+       [1][0][2][0][RTW89_MKK][13] = 62,
+       [1][0][2][0][RTW89_IC][13] = 64,
+       [1][0][2][0][RTW89_KCC][13] = 68,
+       [1][0][2][0][RTW89_ACMA][13] = 64,
+       [1][0][2][0][RTW89_CHILE][13] = 66,
+       [1][0][2][0][RTW89_UKRAINE][13] = 52,
+       [1][0][2][0][RTW89_MEXICO][13] = 66,
+       [1][0][2][0][RTW89_CN][13] = 62,
+       [1][0][2][0][RTW89_QATAR][13] = 64,
+       [1][0][2][0][RTW89_UK][13] = 64,
+       [1][0][2][0][RTW89_FCC][16] = 64,
+       [1][0][2][0][RTW89_ETSI][16] = 64,
+       [1][0][2][0][RTW89_MKK][16] = 74,
+       [1][0][2][0][RTW89_IC][16] = 64,
+       [1][0][2][0][RTW89_KCC][16] = 70,
+       [1][0][2][0][RTW89_ACMA][16] = 64,
+       [1][0][2][0][RTW89_CHILE][16] = 64,
+       [1][0][2][0][RTW89_UKRAINE][16] = 52,
+       [1][0][2][0][RTW89_MEXICO][16] = 64,
+       [1][0][2][0][RTW89_CN][16] = 127,
+       [1][0][2][0][RTW89_QATAR][16] = 64,
+       [1][0][2][0][RTW89_UK][16] = 64,
+       [1][0][2][0][RTW89_FCC][20] = 78,
+       [1][0][2][0][RTW89_ETSI][20] = 64,
+       [1][0][2][0][RTW89_MKK][20] = 74,
+       [1][0][2][0][RTW89_IC][20] = 78,
+       [1][0][2][0][RTW89_KCC][20] = 70,
+       [1][0][2][0][RTW89_ACMA][20] = 64,
+       [1][0][2][0][RTW89_CHILE][20] = 62,
+       [1][0][2][0][RTW89_UKRAINE][20] = 52,
+       [1][0][2][0][RTW89_MEXICO][20] = 78,
+       [1][0][2][0][RTW89_CN][20] = 127,
+       [1][0][2][0][RTW89_QATAR][20] = 64,
+       [1][0][2][0][RTW89_UK][20] = 64,
+       [1][0][2][0][RTW89_FCC][24] = 78,
+       [1][0][2][0][RTW89_ETSI][24] = 64,
+       [1][0][2][0][RTW89_MKK][24] = 74,
+       [1][0][2][0][RTW89_IC][24] = 127,
+       [1][0][2][0][RTW89_KCC][24] = 70,
+       [1][0][2][0][RTW89_ACMA][24] = 127,
+       [1][0][2][0][RTW89_CHILE][24] = 62,
+       [1][0][2][0][RTW89_UKRAINE][24] = 52,
+       [1][0][2][0][RTW89_MEXICO][24] = 78,
+       [1][0][2][0][RTW89_CN][24] = 127,
+       [1][0][2][0][RTW89_QATAR][24] = 64,
+       [1][0][2][0][RTW89_UK][24] = 64,
+       [1][0][2][0][RTW89_FCC][28] = 78,
+       [1][0][2][0][RTW89_ETSI][28] = 64,
+       [1][0][2][0][RTW89_MKK][28] = 74,
+       [1][0][2][0][RTW89_IC][28] = 127,
+       [1][0][2][0][RTW89_KCC][28] = 74,
+       [1][0][2][0][RTW89_ACMA][28] = 127,
+       [1][0][2][0][RTW89_CHILE][28] = 64,
+       [1][0][2][0][RTW89_UKRAINE][28] = 52,
+       [1][0][2][0][RTW89_MEXICO][28] = 78,
+       [1][0][2][0][RTW89_CN][28] = 127,
+       [1][0][2][0][RTW89_QATAR][28] = 64,
+       [1][0][2][0][RTW89_UK][28] = 64,
+       [1][0][2][0][RTW89_FCC][32] = 76,
+       [1][0][2][0][RTW89_ETSI][32] = 64,
+       [1][0][2][0][RTW89_MKK][32] = 74,
+       [1][0][2][0][RTW89_IC][32] = 76,
+       [1][0][2][0][RTW89_KCC][32] = 74,
+       [1][0][2][0][RTW89_ACMA][32] = 64,
+       [1][0][2][0][RTW89_CHILE][32] = 64,
+       [1][0][2][0][RTW89_UKRAINE][32] = 52,
+       [1][0][2][0][RTW89_MEXICO][32] = 76,
+       [1][0][2][0][RTW89_CN][32] = 127,
+       [1][0][2][0][RTW89_QATAR][32] = 64,
+       [1][0][2][0][RTW89_UK][32] = 64,
+       [1][0][2][0][RTW89_FCC][36] = 78,
+       [1][0][2][0][RTW89_ETSI][36] = 127,
+       [1][0][2][0][RTW89_MKK][36] = 74,
+       [1][0][2][0][RTW89_IC][36] = 78,
+       [1][0][2][0][RTW89_KCC][36] = 74,
+       [1][0][2][0][RTW89_ACMA][36] = 74,
+       [1][0][2][0][RTW89_CHILE][36] = 64,
+       [1][0][2][0][RTW89_UKRAINE][36] = 127,
+       [1][0][2][0][RTW89_MEXICO][36] = 78,
+       [1][0][2][0][RTW89_CN][36] = 127,
+       [1][0][2][0][RTW89_QATAR][36] = 127,
+       [1][0][2][0][RTW89_UK][36] = 74,
+       [1][0][2][0][RTW89_FCC][39] = 78,
+       [1][0][2][0][RTW89_ETSI][39] = 28,
+       [1][0][2][0][RTW89_MKK][39] = 127,
+       [1][0][2][0][RTW89_IC][39] = 78,
+       [1][0][2][0][RTW89_KCC][39] = 74,
+       [1][0][2][0][RTW89_ACMA][39] = 74,
+       [1][0][2][0][RTW89_CHILE][39] = 64,
+       [1][0][2][0][RTW89_UKRAINE][39] = 28,
+       [1][0][2][0][RTW89_MEXICO][39] = 78,
+       [1][0][2][0][RTW89_CN][39] = 70,
+       [1][0][2][0][RTW89_QATAR][39] = 28,
+       [1][0][2][0][RTW89_UK][39] = 64,
+       [1][0][2][0][RTW89_FCC][43] = 78,
+       [1][0][2][0][RTW89_ETSI][43] = 28,
+       [1][0][2][0][RTW89_MKK][43] = 127,
+       [1][0][2][0][RTW89_IC][43] = 78,
+       [1][0][2][0][RTW89_KCC][43] = 74,
+       [1][0][2][0][RTW89_ACMA][43] = 74,
+       [1][0][2][0][RTW89_CHILE][43] = 64,
+       [1][0][2][0][RTW89_UKRAINE][43] = 28,
+       [1][0][2][0][RTW89_MEXICO][43] = 78,
+       [1][0][2][0][RTW89_CN][43] = 74,
+       [1][0][2][0][RTW89_QATAR][43] = 28,
+       [1][0][2][0][RTW89_UK][43] = 62,
+       [1][0][2][0][RTW89_FCC][47] = 78,
+       [1][0][2][0][RTW89_ETSI][47] = 127,
+       [1][0][2][0][RTW89_MKK][47] = 127,
+       [1][0][2][0][RTW89_IC][47] = 127,
+       [1][0][2][0][RTW89_KCC][47] = 127,
+       [1][0][2][0][RTW89_ACMA][47] = 127,
+       [1][0][2][0][RTW89_CHILE][47] = 127,
+       [1][0][2][0][RTW89_UKRAINE][47] = 127,
+       [1][0][2][0][RTW89_MEXICO][47] = 127,
+       [1][0][2][0][RTW89_CN][47] = 127,
+       [1][0][2][0][RTW89_QATAR][47] = 127,
+       [1][0][2][0][RTW89_UK][47] = 127,
+       [1][0][2][0][RTW89_FCC][51] = 70,
+       [1][0][2][0][RTW89_ETSI][51] = 127,
+       [1][0][2][0][RTW89_MKK][51] = 127,
+       [1][0][2][0][RTW89_IC][51] = 127,
+       [1][0][2][0][RTW89_KCC][51] = 127,
+       [1][0][2][0][RTW89_ACMA][51] = 127,
+       [1][0][2][0][RTW89_CHILE][51] = 127,
+       [1][0][2][0][RTW89_UKRAINE][51] = 127,
+       [1][0][2][0][RTW89_MEXICO][51] = 127,
+       [1][0][2][0][RTW89_CN][51] = 127,
+       [1][0][2][0][RTW89_QATAR][51] = 127,
+       [1][0][2][0][RTW89_UK][51] = 127,
+       [1][1][2][0][RTW89_FCC][1] = 62,
+       [1][1][2][0][RTW89_ETSI][1] = 52,
+       [1][1][2][0][RTW89_MKK][1] = 50,
+       [1][1][2][0][RTW89_IC][1] = 52,
+       [1][1][2][0][RTW89_KCC][1] = 58,
+       [1][1][2][0][RTW89_ACMA][1] = 52,
+       [1][1][2][0][RTW89_CHILE][1] = 30,
+       [1][1][2][0][RTW89_UKRAINE][1] = 40,
+       [1][1][2][0][RTW89_MEXICO][1] = 50,
+       [1][1][2][0][RTW89_CN][1] = 50,
+       [1][1][2][0][RTW89_QATAR][1] = 52,
+       [1][1][2][0][RTW89_UK][1] = 52,
+       [1][1][2][0][RTW89_FCC][5] = 76,
+       [1][1][2][0][RTW89_ETSI][5] = 52,
+       [1][1][2][0][RTW89_MKK][5] = 50,
+       [1][1][2][0][RTW89_IC][5] = 52,
+       [1][1][2][0][RTW89_KCC][5] = 48,
+       [1][1][2][0][RTW89_ACMA][5] = 52,
+       [1][1][2][0][RTW89_CHILE][5] = 30,
+       [1][1][2][0][RTW89_UKRAINE][5] = 40,
+       [1][1][2][0][RTW89_MEXICO][5] = 50,
+       [1][1][2][0][RTW89_CN][5] = 50,
+       [1][1][2][0][RTW89_QATAR][5] = 52,
+       [1][1][2][0][RTW89_UK][5] = 52,
+       [1][1][2][0][RTW89_FCC][9] = 76,
+       [1][1][2][0][RTW89_ETSI][9] = 52,
+       [1][1][2][0][RTW89_MKK][9] = 50,
+       [1][1][2][0][RTW89_IC][9] = 52,
+       [1][1][2][0][RTW89_KCC][9] = 60,
+       [1][1][2][0][RTW89_ACMA][9] = 52,
+       [1][1][2][0][RTW89_CHILE][9] = 50,
+       [1][1][2][0][RTW89_UKRAINE][9] = 40,
+       [1][1][2][0][RTW89_MEXICO][9] = 76,
+       [1][1][2][0][RTW89_CN][9] = 50,
+       [1][1][2][0][RTW89_QATAR][9] = 52,
+       [1][1][2][0][RTW89_UK][9] = 52,
+       [1][1][2][0][RTW89_FCC][13] = 62,
+       [1][1][2][0][RTW89_ETSI][13] = 52,
+       [1][1][2][0][RTW89_MKK][13] = 50,
+       [1][1][2][0][RTW89_IC][13] = 52,
+       [1][1][2][0][RTW89_KCC][13] = 58,
+       [1][1][2][0][RTW89_ACMA][13] = 52,
+       [1][1][2][0][RTW89_CHILE][13] = 48,
+       [1][1][2][0][RTW89_UKRAINE][13] = 40,
+       [1][1][2][0][RTW89_MEXICO][13] = 62,
+       [1][1][2][0][RTW89_CN][13] = 50,
+       [1][1][2][0][RTW89_QATAR][13] = 52,
+       [1][1][2][0][RTW89_UK][13] = 52,
+       [1][1][2][0][RTW89_FCC][16] = 56,
+       [1][1][2][0][RTW89_ETSI][16] = 52,
+       [1][1][2][0][RTW89_MKK][16] = 70,
+       [1][1][2][0][RTW89_IC][16] = 56,
+       [1][1][2][0][RTW89_KCC][16] = 58,
+       [1][1][2][0][RTW89_ACMA][16] = 52,
+       [1][1][2][0][RTW89_CHILE][16] = 48,
+       [1][1][2][0][RTW89_UKRAINE][16] = 40,
+       [1][1][2][0][RTW89_MEXICO][16] = 56,
+       [1][1][2][0][RTW89_CN][16] = 127,
+       [1][1][2][0][RTW89_QATAR][16] = 52,
+       [1][1][2][0][RTW89_UK][16] = 52,
+       [1][1][2][0][RTW89_FCC][20] = 76,
+       [1][1][2][0][RTW89_ETSI][20] = 52,
+       [1][1][2][0][RTW89_MKK][20] = 70,
+       [1][1][2][0][RTW89_IC][20] = 76,
+       [1][1][2][0][RTW89_KCC][20] = 58,
+       [1][1][2][0][RTW89_ACMA][20] = 52,
+       [1][1][2][0][RTW89_CHILE][20] = 50,
+       [1][1][2][0][RTW89_UKRAINE][20] = 40,
+       [1][1][2][0][RTW89_MEXICO][20] = 76,
+       [1][1][2][0][RTW89_CN][20] = 127,
+       [1][1][2][0][RTW89_QATAR][20] = 52,
+       [1][1][2][0][RTW89_UK][20] = 52,
+       [1][1][2][0][RTW89_FCC][24] = 76,
+       [1][1][2][0][RTW89_ETSI][24] = 52,
+       [1][1][2][0][RTW89_MKK][24] = 70,
+       [1][1][2][0][RTW89_IC][24] = 127,
+       [1][1][2][0][RTW89_KCC][24] = 58,
+       [1][1][2][0][RTW89_ACMA][24] = 127,
+       [1][1][2][0][RTW89_CHILE][24] = 50,
+       [1][1][2][0][RTW89_UKRAINE][24] = 40,
+       [1][1][2][0][RTW89_MEXICO][24] = 76,
+       [1][1][2][0][RTW89_CN][24] = 127,
+       [1][1][2][0][RTW89_QATAR][24] = 52,
+       [1][1][2][0][RTW89_UK][24] = 52,
+       [1][1][2][0][RTW89_FCC][28] = 76,
+       [1][1][2][0][RTW89_ETSI][28] = 52,
+       [1][1][2][0][RTW89_MKK][28] = 70,
+       [1][1][2][0][RTW89_IC][28] = 127,
+       [1][1][2][0][RTW89_KCC][28] = 60,
+       [1][1][2][0][RTW89_ACMA][28] = 127,
+       [1][1][2][0][RTW89_CHILE][28] = 48,
+       [1][1][2][0][RTW89_UKRAINE][28] = 40,
+       [1][1][2][0][RTW89_MEXICO][28] = 76,
+       [1][1][2][0][RTW89_CN][28] = 127,
+       [1][1][2][0][RTW89_QATAR][28] = 52,
+       [1][1][2][0][RTW89_UK][28] = 52,
+       [1][1][2][0][RTW89_FCC][32] = 68,
+       [1][1][2][0][RTW89_ETSI][32] = 52,
+       [1][1][2][0][RTW89_MKK][32] = 70,
+       [1][1][2][0][RTW89_IC][32] = 68,
+       [1][1][2][0][RTW89_KCC][32] = 60,
+       [1][1][2][0][RTW89_ACMA][32] = 52,
+       [1][1][2][0][RTW89_CHILE][32] = 48,
+       [1][1][2][0][RTW89_UKRAINE][32] = 40,
+       [1][1][2][0][RTW89_MEXICO][32] = 68,
+       [1][1][2][0][RTW89_CN][32] = 127,
+       [1][1][2][0][RTW89_QATAR][32] = 52,
+       [1][1][2][0][RTW89_UK][32] = 52,
+       [1][1][2][0][RTW89_FCC][36] = 76,
+       [1][1][2][0][RTW89_ETSI][36] = 127,
+       [1][1][2][0][RTW89_MKK][36] = 70,
+       [1][1][2][0][RTW89_IC][36] = 76,
+       [1][1][2][0][RTW89_KCC][36] = 60,
+       [1][1][2][0][RTW89_ACMA][36] = 74,
+       [1][1][2][0][RTW89_CHILE][36] = 50,
+       [1][1][2][0][RTW89_UKRAINE][36] = 127,
+       [1][1][2][0][RTW89_MEXICO][36] = 76,
+       [1][1][2][0][RTW89_CN][36] = 127,
+       [1][1][2][0][RTW89_QATAR][36] = 127,
+       [1][1][2][0][RTW89_UK][36] = 74,
+       [1][1][2][0][RTW89_FCC][39] = 78,
+       [1][1][2][0][RTW89_ETSI][39] = 16,
+       [1][1][2][0][RTW89_MKK][39] = 127,
+       [1][1][2][0][RTW89_IC][39] = 78,
+       [1][1][2][0][RTW89_KCC][39] = 58,
+       [1][1][2][0][RTW89_ACMA][39] = 72,
+       [1][1][2][0][RTW89_CHILE][39] = 52,
+       [1][1][2][0][RTW89_UKRAINE][39] = 16,
+       [1][1][2][0][RTW89_MEXICO][39] = 78,
+       [1][1][2][0][RTW89_CN][39] = 70,
+       [1][1][2][0][RTW89_QATAR][39] = 16,
+       [1][1][2][0][RTW89_UK][39] = 52,
+       [1][1][2][0][RTW89_FCC][43] = 78,
+       [1][1][2][0][RTW89_ETSI][43] = 16,
+       [1][1][2][0][RTW89_MKK][43] = 127,
+       [1][1][2][0][RTW89_IC][43] = 78,
+       [1][1][2][0][RTW89_KCC][43] = 58,
+       [1][1][2][0][RTW89_ACMA][43] = 74,
+       [1][1][2][0][RTW89_CHILE][43] = 52,
+       [1][1][2][0][RTW89_UKRAINE][43] = 16,
+       [1][1][2][0][RTW89_MEXICO][43] = 78,
+       [1][1][2][0][RTW89_CN][43] = 74,
+       [1][1][2][0][RTW89_QATAR][43] = 16,
+       [1][1][2][0][RTW89_UK][43] = 52,
+       [1][1][2][0][RTW89_FCC][47] = 68,
+       [1][1][2][0][RTW89_ETSI][47] = 127,
+       [1][1][2][0][RTW89_MKK][47] = 127,
+       [1][1][2][0][RTW89_IC][47] = 127,
+       [1][1][2][0][RTW89_KCC][47] = 127,
+       [1][1][2][0][RTW89_ACMA][47] = 127,
+       [1][1][2][0][RTW89_CHILE][47] = 127,
+       [1][1][2][0][RTW89_UKRAINE][47] = 127,
+       [1][1][2][0][RTW89_MEXICO][47] = 127,
+       [1][1][2][0][RTW89_CN][47] = 127,
+       [1][1][2][0][RTW89_QATAR][47] = 127,
+       [1][1][2][0][RTW89_UK][47] = 127,
+       [1][1][2][0][RTW89_FCC][51] = 66,
+       [1][1][2][0][RTW89_ETSI][51] = 127,
+       [1][1][2][0][RTW89_MKK][51] = 127,
+       [1][1][2][0][RTW89_IC][51] = 127,
+       [1][1][2][0][RTW89_KCC][51] = 127,
+       [1][1][2][0][RTW89_ACMA][51] = 127,
+       [1][1][2][0][RTW89_CHILE][51] = 127,
+       [1][1][2][0][RTW89_UKRAINE][51] = 127,
+       [1][1][2][0][RTW89_MEXICO][51] = 127,
+       [1][1][2][0][RTW89_CN][51] = 127,
+       [1][1][2][0][RTW89_QATAR][51] = 127,
+       [1][1][2][0][RTW89_UK][51] = 127,
+       [1][1][2][1][RTW89_FCC][1] = 62,
+       [1][1][2][1][RTW89_ETSI][1] = 40,
+       [1][1][2][1][RTW89_MKK][1] = 50,
+       [1][1][2][1][RTW89_IC][1] = 40,
+       [1][1][2][1][RTW89_KCC][1] = 58,
+       [1][1][2][1][RTW89_ACMA][1] = 40,
+       [1][1][2][1][RTW89_CHILE][1] = 16,
+       [1][1][2][1][RTW89_UKRAINE][1] = 28,
+       [1][1][2][1][RTW89_MEXICO][1] = 50,
+       [1][1][2][1][RTW89_CN][1] = 38,
+       [1][1][2][1][RTW89_QATAR][1] = 40,
+       [1][1][2][1][RTW89_UK][1] = 40,
+       [1][1][2][1][RTW89_FCC][5] = 68,
+       [1][1][2][1][RTW89_ETSI][5] = 40,
+       [1][1][2][1][RTW89_MKK][5] = 50,
+       [1][1][2][1][RTW89_IC][5] = 40,
+       [1][1][2][1][RTW89_KCC][5] = 48,
+       [1][1][2][1][RTW89_ACMA][5] = 40,
+       [1][1][2][1][RTW89_CHILE][5] = 16,
+       [1][1][2][1][RTW89_UKRAINE][5] = 28,
+       [1][1][2][1][RTW89_MEXICO][5] = 50,
+       [1][1][2][1][RTW89_CN][5] = 38,
+       [1][1][2][1][RTW89_QATAR][5] = 40,
+       [1][1][2][1][RTW89_UK][5] = 40,
+       [1][1][2][1][RTW89_FCC][9] = 68,
+       [1][1][2][1][RTW89_ETSI][9] = 40,
+       [1][1][2][1][RTW89_MKK][9] = 50,
+       [1][1][2][1][RTW89_IC][9] = 40,
+       [1][1][2][1][RTW89_KCC][9] = 60,
+       [1][1][2][1][RTW89_ACMA][9] = 40,
+       [1][1][2][1][RTW89_CHILE][9] = 36,
+       [1][1][2][1][RTW89_UKRAINE][9] = 28,
+       [1][1][2][1][RTW89_MEXICO][9] = 68,
+       [1][1][2][1][RTW89_CN][9] = 38,
+       [1][1][2][1][RTW89_QATAR][9] = 40,
+       [1][1][2][1][RTW89_UK][9] = 40,
+       [1][1][2][1][RTW89_FCC][13] = 62,
+       [1][1][2][1][RTW89_ETSI][13] = 40,
+       [1][1][2][1][RTW89_MKK][13] = 50,
+       [1][1][2][1][RTW89_IC][13] = 40,
+       [1][1][2][1][RTW89_KCC][13] = 58,
+       [1][1][2][1][RTW89_ACMA][13] = 40,
+       [1][1][2][1][RTW89_CHILE][13] = 36,
+       [1][1][2][1][RTW89_UKRAINE][13] = 28,
+       [1][1][2][1][RTW89_MEXICO][13] = 62,
+       [1][1][2][1][RTW89_CN][13] = 38,
+       [1][1][2][1][RTW89_QATAR][13] = 40,
+       [1][1][2][1][RTW89_UK][13] = 40,
+       [1][1][2][1][RTW89_FCC][16] = 56,
+       [1][1][2][1][RTW89_ETSI][16] = 40,
+       [1][1][2][1][RTW89_MKK][16] = 70,
+       [1][1][2][1][RTW89_IC][16] = 56,
+       [1][1][2][1][RTW89_KCC][16] = 58,
+       [1][1][2][1][RTW89_ACMA][16] = 40,
+       [1][1][2][1][RTW89_CHILE][16] = 36,
+       [1][1][2][1][RTW89_UKRAINE][16] = 28,
+       [1][1][2][1][RTW89_MEXICO][16] = 56,
+       [1][1][2][1][RTW89_CN][16] = 127,
+       [1][1][2][1][RTW89_QATAR][16] = 40,
+       [1][1][2][1][RTW89_UK][16] = 40,
+       [1][1][2][1][RTW89_FCC][20] = 68,
+       [1][1][2][1][RTW89_ETSI][20] = 40,
+       [1][1][2][1][RTW89_MKK][20] = 70,
+       [1][1][2][1][RTW89_IC][20] = 68,
+       [1][1][2][1][RTW89_KCC][20] = 58,
+       [1][1][2][1][RTW89_ACMA][20] = 40,
+       [1][1][2][1][RTW89_CHILE][20] = 36,
+       [1][1][2][1][RTW89_UKRAINE][20] = 28,
+       [1][1][2][1][RTW89_MEXICO][20] = 68,
+       [1][1][2][1][RTW89_CN][20] = 127,
+       [1][1][2][1][RTW89_QATAR][20] = 40,
+       [1][1][2][1][RTW89_UK][20] = 40,
+       [1][1][2][1][RTW89_FCC][24] = 68,
+       [1][1][2][1][RTW89_ETSI][24] = 40,
+       [1][1][2][1][RTW89_MKK][24] = 70,
+       [1][1][2][1][RTW89_IC][24] = 127,
+       [1][1][2][1][RTW89_KCC][24] = 58,
+       [1][1][2][1][RTW89_ACMA][24] = 127,
+       [1][1][2][1][RTW89_CHILE][24] = 36,
+       [1][1][2][1][RTW89_UKRAINE][24] = 28,
+       [1][1][2][1][RTW89_MEXICO][24] = 68,
+       [1][1][2][1][RTW89_CN][24] = 127,
+       [1][1][2][1][RTW89_QATAR][24] = 40,
+       [1][1][2][1][RTW89_UK][24] = 40,
+       [1][1][2][1][RTW89_FCC][28] = 68,
+       [1][1][2][1][RTW89_ETSI][28] = 40,
+       [1][1][2][1][RTW89_MKK][28] = 70,
+       [1][1][2][1][RTW89_IC][28] = 127,
+       [1][1][2][1][RTW89_KCC][28] = 60,
+       [1][1][2][1][RTW89_ACMA][28] = 127,
+       [1][1][2][1][RTW89_CHILE][28] = 36,
+       [1][1][2][1][RTW89_UKRAINE][28] = 28,
+       [1][1][2][1][RTW89_MEXICO][28] = 68,
+       [1][1][2][1][RTW89_CN][28] = 127,
+       [1][1][2][1][RTW89_QATAR][28] = 40,
+       [1][1][2][1][RTW89_UK][28] = 40,
+       [1][1][2][1][RTW89_FCC][32] = 68,
+       [1][1][2][1][RTW89_ETSI][32] = 40,
+       [1][1][2][1][RTW89_MKK][32] = 70,
+       [1][1][2][1][RTW89_IC][32] = 68,
+       [1][1][2][1][RTW89_KCC][32] = 60,
+       [1][1][2][1][RTW89_ACMA][32] = 40,
+       [1][1][2][1][RTW89_CHILE][32] = 36,
+       [1][1][2][1][RTW89_UKRAINE][32] = 28,
+       [1][1][2][1][RTW89_MEXICO][32] = 68,
+       [1][1][2][1][RTW89_CN][32] = 127,
+       [1][1][2][1][RTW89_QATAR][32] = 40,
+       [1][1][2][1][RTW89_UK][32] = 40,
+       [1][1][2][1][RTW89_FCC][36] = 68,
+       [1][1][2][1][RTW89_ETSI][36] = 127,
+       [1][1][2][1][RTW89_MKK][36] = 70,
+       [1][1][2][1][RTW89_IC][36] = 68,
+       [1][1][2][1][RTW89_KCC][36] = 60,
+       [1][1][2][1][RTW89_ACMA][36] = 70,
+       [1][1][2][1][RTW89_CHILE][36] = 36,
+       [1][1][2][1][RTW89_UKRAINE][36] = 127,
+       [1][1][2][1][RTW89_MEXICO][36] = 68,
+       [1][1][2][1][RTW89_CN][36] = 127,
+       [1][1][2][1][RTW89_QATAR][36] = 127,
+       [1][1][2][1][RTW89_UK][36] = 62,
+       [1][1][2][1][RTW89_FCC][39] = 78,
+       [1][1][2][1][RTW89_ETSI][39] = 4,
+       [1][1][2][1][RTW89_MKK][39] = 127,
+       [1][1][2][1][RTW89_IC][39] = 78,
+       [1][1][2][1][RTW89_KCC][39] = 58,
+       [1][1][2][1][RTW89_ACMA][39] = 72,
+       [1][1][2][1][RTW89_CHILE][39] = 36,
+       [1][1][2][1][RTW89_UKRAINE][39] = 4,
+       [1][1][2][1][RTW89_MEXICO][39] = 78,
+       [1][1][2][1][RTW89_CN][39] = 70,
+       [1][1][2][1][RTW89_QATAR][39] = 4,
+       [1][1][2][1][RTW89_UK][39] = 40,
+       [1][1][2][1][RTW89_FCC][43] = 78,
+       [1][1][2][1][RTW89_ETSI][43] = 4,
+       [1][1][2][1][RTW89_MKK][43] = 127,
+       [1][1][2][1][RTW89_IC][43] = 78,
+       [1][1][2][1][RTW89_KCC][43] = 58,
+       [1][1][2][1][RTW89_ACMA][43] = 74,
+       [1][1][2][1][RTW89_CHILE][43] = 36,
+       [1][1][2][1][RTW89_UKRAINE][43] = 4,
+       [1][1][2][1][RTW89_MEXICO][43] = 78,
+       [1][1][2][1][RTW89_CN][43] = 74,
+       [1][1][2][1][RTW89_QATAR][43] = 4,
+       [1][1][2][1][RTW89_UK][43] = 40,
+       [1][1][2][1][RTW89_FCC][47] = 68,
+       [1][1][2][1][RTW89_ETSI][47] = 127,
+       [1][1][2][1][RTW89_MKK][47] = 127,
+       [1][1][2][1][RTW89_IC][47] = 127,
+       [1][1][2][1][RTW89_KCC][47] = 127,
+       [1][1][2][1][RTW89_ACMA][47] = 127,
+       [1][1][2][1][RTW89_CHILE][47] = 127,
+       [1][1][2][1][RTW89_UKRAINE][47] = 127,
+       [1][1][2][1][RTW89_MEXICO][47] = 127,
+       [1][1][2][1][RTW89_CN][47] = 127,
+       [1][1][2][1][RTW89_QATAR][47] = 127,
+       [1][1][2][1][RTW89_UK][47] = 127,
+       [1][1][2][1][RTW89_FCC][51] = 66,
+       [1][1][2][1][RTW89_ETSI][51] = 127,
+       [1][1][2][1][RTW89_MKK][51] = 127,
+       [1][1][2][1][RTW89_IC][51] = 127,
+       [1][1][2][1][RTW89_KCC][51] = 127,
+       [1][1][2][1][RTW89_ACMA][51] = 127,
+       [1][1][2][1][RTW89_CHILE][51] = 127,
+       [1][1][2][1][RTW89_UKRAINE][51] = 127,
+       [1][1][2][1][RTW89_MEXICO][51] = 127,
+       [1][1][2][1][RTW89_CN][51] = 127,
+       [1][1][2][1][RTW89_QATAR][51] = 127,
+       [1][1][2][1][RTW89_UK][51] = 127,
+       [2][0][2][0][RTW89_FCC][3] = 64,
+       [2][0][2][0][RTW89_ETSI][3] = 64,
+       [2][0][2][0][RTW89_MKK][3] = 64,
+       [2][0][2][0][RTW89_IC][3] = 62,
+       [2][0][2][0][RTW89_KCC][3] = 68,
+       [2][0][2][0][RTW89_ACMA][3] = 64,
+       [2][0][2][0][RTW89_CHILE][3] = 42,
+       [2][0][2][0][RTW89_UKRAINE][3] = 52,
+       [2][0][2][0][RTW89_MEXICO][3] = 62,
+       [2][0][2][0][RTW89_CN][3] = 62,
+       [2][0][2][0][RTW89_QATAR][3] = 64,
+       [2][0][2][0][RTW89_UK][3] = 64,
+       [2][0][2][0][RTW89_FCC][11] = 66,
+       [2][0][2][0][RTW89_ETSI][11] = 64,
+       [2][0][2][0][RTW89_MKK][11] = 64,
+       [2][0][2][0][RTW89_IC][11] = 64,
+       [2][0][2][0][RTW89_KCC][11] = 70,
+       [2][0][2][0][RTW89_ACMA][11] = 64,
+       [2][0][2][0][RTW89_CHILE][11] = 66,
+       [2][0][2][0][RTW89_UKRAINE][11] = 52,
+       [2][0][2][0][RTW89_MEXICO][11] = 66,
+       [2][0][2][0][RTW89_CN][11] = 62,
+       [2][0][2][0][RTW89_QATAR][11] = 64,
+       [2][0][2][0][RTW89_UK][11] = 64,
+       [2][0][2][0][RTW89_FCC][18] = 62,
+       [2][0][2][0][RTW89_ETSI][18] = 64,
+       [2][0][2][0][RTW89_MKK][18] = 70,
+       [2][0][2][0][RTW89_IC][18] = 62,
+       [2][0][2][0][RTW89_KCC][18] = 64,
+       [2][0][2][0][RTW89_ACMA][18] = 64,
+       [2][0][2][0][RTW89_CHILE][18] = 64,
+       [2][0][2][0][RTW89_UKRAINE][18] = 52,
+       [2][0][2][0][RTW89_MEXICO][18] = 62,
+       [2][0][2][0][RTW89_CN][18] = 127,
+       [2][0][2][0][RTW89_QATAR][18] = 64,
+       [2][0][2][0][RTW89_UK][18] = 64,
+       [2][0][2][0][RTW89_FCC][26] = 74,
+       [2][0][2][0][RTW89_ETSI][26] = 64,
+       [2][0][2][0][RTW89_MKK][26] = 70,
+       [2][0][2][0][RTW89_IC][26] = 127,
+       [2][0][2][0][RTW89_KCC][26] = 70,
+       [2][0][2][0][RTW89_ACMA][26] = 127,
+       [2][0][2][0][RTW89_CHILE][26] = 64,
+       [2][0][2][0][RTW89_UKRAINE][26] = 52,
+       [2][0][2][0][RTW89_MEXICO][26] = 74,
+       [2][0][2][0][RTW89_CN][26] = 127,
+       [2][0][2][0][RTW89_QATAR][26] = 64,
+       [2][0][2][0][RTW89_UK][26] = 64,
+       [2][0][2][0][RTW89_FCC][34] = 74,
+       [2][0][2][0][RTW89_ETSI][34] = 127,
+       [2][0][2][0][RTW89_MKK][34] = 70,
+       [2][0][2][0][RTW89_IC][34] = 74,
+       [2][0][2][0][RTW89_KCC][34] = 70,
+       [2][0][2][0][RTW89_ACMA][34] = 70,
+       [2][0][2][0][RTW89_CHILE][34] = 64,
+       [2][0][2][0][RTW89_UKRAINE][34] = 127,
+       [2][0][2][0][RTW89_MEXICO][34] = 74,
+       [2][0][2][0][RTW89_CN][34] = 127,
+       [2][0][2][0][RTW89_QATAR][34] = 127,
+       [2][0][2][0][RTW89_UK][34] = 70,
+       [2][0][2][0][RTW89_FCC][41] = 74,
+       [2][0][2][0][RTW89_ETSI][41] = 28,
+       [2][0][2][0][RTW89_MKK][41] = 127,
+       [2][0][2][0][RTW89_IC][41] = 74,
+       [2][0][2][0][RTW89_KCC][41] = 66,
+       [2][0][2][0][RTW89_ACMA][41] = 70,
+       [2][0][2][0][RTW89_CHILE][41] = 64,
+       [2][0][2][0][RTW89_UKRAINE][41] = 28,
+       [2][0][2][0][RTW89_MEXICO][41] = 74,
+       [2][0][2][0][RTW89_CN][41] = 70,
+       [2][0][2][0][RTW89_QATAR][41] = 28,
+       [2][0][2][0][RTW89_UK][41] = 64,
+       [2][0][2][0][RTW89_FCC][49] = 64,
+       [2][0][2][0][RTW89_ETSI][49] = 127,
+       [2][0][2][0][RTW89_MKK][49] = 127,
+       [2][0][2][0][RTW89_IC][49] = 127,
+       [2][0][2][0][RTW89_KCC][49] = 127,
+       [2][0][2][0][RTW89_ACMA][49] = 127,
+       [2][0][2][0][RTW89_CHILE][49] = 127,
+       [2][0][2][0][RTW89_UKRAINE][49] = 127,
+       [2][0][2][0][RTW89_MEXICO][49] = 127,
+       [2][0][2][0][RTW89_CN][49] = 127,
+       [2][0][2][0][RTW89_QATAR][49] = 127,
+       [2][0][2][0][RTW89_UK][49] = 127,
+       [2][1][2][0][RTW89_FCC][3] = 56,
+       [2][1][2][0][RTW89_ETSI][3] = 52,
+       [2][1][2][0][RTW89_MKK][3] = 52,
+       [2][1][2][0][RTW89_IC][3] = 52,
+       [2][1][2][0][RTW89_KCC][3] = 54,
+       [2][1][2][0][RTW89_ACMA][3] = 52,
+       [2][1][2][0][RTW89_CHILE][3] = 28,
+       [2][1][2][0][RTW89_UKRAINE][3] = 40,
+       [2][1][2][0][RTW89_MEXICO][3] = 50,
+       [2][1][2][0][RTW89_CN][3] = 50,
+       [2][1][2][0][RTW89_QATAR][3] = 52,
+       [2][1][2][0][RTW89_UK][3] = 52,
+       [2][1][2][0][RTW89_FCC][11] = 62,
+       [2][1][2][0][RTW89_ETSI][11] = 52,
+       [2][1][2][0][RTW89_MKK][11] = 52,
+       [2][1][2][0][RTW89_IC][11] = 52,
+       [2][1][2][0][RTW89_KCC][11] = 56,
+       [2][1][2][0][RTW89_ACMA][11] = 52,
+       [2][1][2][0][RTW89_CHILE][11] = 52,
+       [2][1][2][0][RTW89_UKRAINE][11] = 40,
+       [2][1][2][0][RTW89_MEXICO][11] = 62,
+       [2][1][2][0][RTW89_CN][11] = 50,
+       [2][1][2][0][RTW89_QATAR][11] = 52,
+       [2][1][2][0][RTW89_UK][11] = 52,
+       [2][1][2][0][RTW89_FCC][18] = 56,
+       [2][1][2][0][RTW89_ETSI][18] = 52,
+       [2][1][2][0][RTW89_MKK][18] = 70,
+       [2][1][2][0][RTW89_IC][18] = 56,
+       [2][1][2][0][RTW89_KCC][18] = 58,
+       [2][1][2][0][RTW89_ACMA][18] = 52,
+       [2][1][2][0][RTW89_CHILE][18] = 48,
+       [2][1][2][0][RTW89_UKRAINE][18] = 40,
+       [2][1][2][0][RTW89_MEXICO][18] = 56,
+       [2][1][2][0][RTW89_CN][18] = 127,
+       [2][1][2][0][RTW89_QATAR][18] = 52,
+       [2][1][2][0][RTW89_UK][18] = 52,
+       [2][1][2][0][RTW89_FCC][26] = 70,
+       [2][1][2][0][RTW89_ETSI][26] = 52,
+       [2][1][2][0][RTW89_MKK][26] = 70,
+       [2][1][2][0][RTW89_IC][26] = 127,
+       [2][1][2][0][RTW89_KCC][26] = 56,
+       [2][1][2][0][RTW89_ACMA][26] = 127,
+       [2][1][2][0][RTW89_CHILE][26] = 50,
+       [2][1][2][0][RTW89_UKRAINE][26] = 40,
+       [2][1][2][0][RTW89_MEXICO][26] = 70,
+       [2][1][2][0][RTW89_CN][26] = 127,
+       [2][1][2][0][RTW89_QATAR][26] = 52,
+       [2][1][2][0][RTW89_UK][26] = 52,
+       [2][1][2][0][RTW89_FCC][34] = 74,
+       [2][1][2][0][RTW89_ETSI][34] = 127,
+       [2][1][2][0][RTW89_MKK][34] = 70,
+       [2][1][2][0][RTW89_IC][34] = 74,
+       [2][1][2][0][RTW89_KCC][34] = 56,
+       [2][1][2][0][RTW89_ACMA][34] = 70,
+       [2][1][2][0][RTW89_CHILE][34] = 50,
+       [2][1][2][0][RTW89_UKRAINE][34] = 127,
+       [2][1][2][0][RTW89_MEXICO][34] = 74,
+       [2][1][2][0][RTW89_CN][34] = 127,
+       [2][1][2][0][RTW89_QATAR][34] = 127,
+       [2][1][2][0][RTW89_UK][34] = 68,
+       [2][1][2][0][RTW89_FCC][41] = 74,
+       [2][1][2][0][RTW89_ETSI][41] = 16,
+       [2][1][2][0][RTW89_MKK][41] = 127,
+       [2][1][2][0][RTW89_IC][41] = 74,
+       [2][1][2][0][RTW89_KCC][41] = 56,
+       [2][1][2][0][RTW89_ACMA][41] = 70,
+       [2][1][2][0][RTW89_CHILE][41] = 50,
+       [2][1][2][0][RTW89_UKRAINE][41] = 16,
+       [2][1][2][0][RTW89_MEXICO][41] = 74,
+       [2][1][2][0][RTW89_CN][41] = 70,
+       [2][1][2][0][RTW89_QATAR][41] = 16,
+       [2][1][2][0][RTW89_UK][41] = 52,
+       [2][1][2][0][RTW89_FCC][49] = 58,
+       [2][1][2][0][RTW89_ETSI][49] = 127,
+       [2][1][2][0][RTW89_MKK][49] = 127,
+       [2][1][2][0][RTW89_IC][49] = 127,
+       [2][1][2][0][RTW89_KCC][49] = 127,
+       [2][1][2][0][RTW89_ACMA][49] = 127,
+       [2][1][2][0][RTW89_CHILE][49] = 127,
+       [2][1][2][0][RTW89_UKRAINE][49] = 127,
+       [2][1][2][0][RTW89_MEXICO][49] = 127,
+       [2][1][2][0][RTW89_CN][49] = 127,
+       [2][1][2][0][RTW89_QATAR][49] = 127,
+       [2][1][2][0][RTW89_UK][49] = 127,
+       [2][1][2][1][RTW89_FCC][3] = 56,
+       [2][1][2][1][RTW89_ETSI][3] = 40,
+       [2][1][2][1][RTW89_MKK][3] = 52,
+       [2][1][2][1][RTW89_IC][3] = 40,
+       [2][1][2][1][RTW89_KCC][3] = 54,
+       [2][1][2][1][RTW89_ACMA][3] = 40,
+       [2][1][2][1][RTW89_CHILE][3] = 16,
+       [2][1][2][1][RTW89_UKRAINE][3] = 28,
+       [2][1][2][1][RTW89_MEXICO][3] = 50,
+       [2][1][2][1][RTW89_CN][3] = 38,
+       [2][1][2][1][RTW89_QATAR][3] = 40,
+       [2][1][2][1][RTW89_UK][3] = 40,
+       [2][1][2][1][RTW89_FCC][11] = 62,
+       [2][1][2][1][RTW89_ETSI][11] = 40,
+       [2][1][2][1][RTW89_MKK][11] = 52,
+       [2][1][2][1][RTW89_IC][11] = 40,
+       [2][1][2][1][RTW89_KCC][11] = 56,
+       [2][1][2][1][RTW89_ACMA][11] = 40,
+       [2][1][2][1][RTW89_CHILE][11] = 34,
+       [2][1][2][1][RTW89_UKRAINE][11] = 28,
+       [2][1][2][1][RTW89_MEXICO][11] = 62,
+       [2][1][2][1][RTW89_CN][11] = 38,
+       [2][1][2][1][RTW89_QATAR][11] = 40,
+       [2][1][2][1][RTW89_UK][11] = 40,
+       [2][1][2][1][RTW89_FCC][18] = 56,
+       [2][1][2][1][RTW89_ETSI][18] = 40,
+       [2][1][2][1][RTW89_MKK][18] = 70,
+       [2][1][2][1][RTW89_IC][18] = 56,
+       [2][1][2][1][RTW89_KCC][18] = 58,
+       [2][1][2][1][RTW89_ACMA][18] = 40,
+       [2][1][2][1][RTW89_CHILE][18] = 34,
+       [2][1][2][1][RTW89_UKRAINE][18] = 28,
+       [2][1][2][1][RTW89_MEXICO][18] = 56,
+       [2][1][2][1][RTW89_CN][18] = 127,
+       [2][1][2][1][RTW89_QATAR][18] = 40,
+       [2][1][2][1][RTW89_UK][18] = 40,
+       [2][1][2][1][RTW89_FCC][26] = 68,
+       [2][1][2][1][RTW89_ETSI][26] = 40,
+       [2][1][2][1][RTW89_MKK][26] = 70,
+       [2][1][2][1][RTW89_IC][26] = 127,
+       [2][1][2][1][RTW89_KCC][26] = 56,
+       [2][1][2][1][RTW89_ACMA][26] = 127,
+       [2][1][2][1][RTW89_CHILE][26] = 34,
+       [2][1][2][1][RTW89_UKRAINE][26] = 28,
+       [2][1][2][1][RTW89_MEXICO][26] = 68,
+       [2][1][2][1][RTW89_CN][26] = 127,
+       [2][1][2][1][RTW89_QATAR][26] = 40,
+       [2][1][2][1][RTW89_UK][26] = 40,
+       [2][1][2][1][RTW89_FCC][34] = 68,
+       [2][1][2][1][RTW89_ETSI][34] = 127,
+       [2][1][2][1][RTW89_MKK][34] = 70,
+       [2][1][2][1][RTW89_IC][34] = 68,
+       [2][1][2][1][RTW89_KCC][34] = 56,
+       [2][1][2][1][RTW89_ACMA][34] = 70,
+       [2][1][2][1][RTW89_CHILE][34] = 34,
+       [2][1][2][1][RTW89_UKRAINE][34] = 127,
+       [2][1][2][1][RTW89_MEXICO][34] = 68,
+       [2][1][2][1][RTW89_CN][34] = 127,
+       [2][1][2][1][RTW89_QATAR][34] = 127,
+       [2][1][2][1][RTW89_UK][34] = 56,
+       [2][1][2][1][RTW89_FCC][41] = 74,
+       [2][1][2][1][RTW89_ETSI][41] = 4,
+       [2][1][2][1][RTW89_MKK][41] = 127,
+       [2][1][2][1][RTW89_IC][41] = 74,
+       [2][1][2][1][RTW89_KCC][41] = 56,
+       [2][1][2][1][RTW89_ACMA][41] = 70,
+       [2][1][2][1][RTW89_CHILE][41] = 36,
+       [2][1][2][1][RTW89_UKRAINE][41] = 4,
+       [2][1][2][1][RTW89_MEXICO][41] = 74,
+       [2][1][2][1][RTW89_CN][41] = 70,
+       [2][1][2][1][RTW89_QATAR][41] = 4,
+       [2][1][2][1][RTW89_UK][41] = 38,
+       [2][1][2][1][RTW89_FCC][49] = 58,
+       [2][1][2][1][RTW89_ETSI][49] = 127,
+       [2][1][2][1][RTW89_MKK][49] = 127,
+       [2][1][2][1][RTW89_IC][49] = 127,
+       [2][1][2][1][RTW89_KCC][49] = 127,
+       [2][1][2][1][RTW89_ACMA][49] = 127,
+       [2][1][2][1][RTW89_CHILE][49] = 127,
+       [2][1][2][1][RTW89_UKRAINE][49] = 127,
+       [2][1][2][1][RTW89_MEXICO][49] = 127,
+       [2][1][2][1][RTW89_CN][49] = 127,
+       [2][1][2][1][RTW89_QATAR][49] = 127,
+       [2][1][2][1][RTW89_UK][49] = 127,
+};
+
+const s8 rtw89_8852b_txpwr_lmt_ru_2g[RTW89_RU_NUM][RTW89_NTX_NUM]
+                                   [RTW89_REGD_NUM][RTW89_2G_CH_NUM] = {
+       [0][0][RTW89_WW][0] = 32,
+       [0][0][RTW89_WW][1] = 32,
+       [0][0][RTW89_WW][2] = 32,
+       [0][0][RTW89_WW][3] = 32,
+       [0][0][RTW89_WW][4] = 32,
+       [0][0][RTW89_WW][5] = 32,
+       [0][0][RTW89_WW][6] = 32,
+       [0][0][RTW89_WW][7] = 32,
+       [0][0][RTW89_WW][8] = 32,
+       [0][0][RTW89_WW][9] = 32,
+       [0][0][RTW89_WW][10] = 32,
+       [0][0][RTW89_WW][11] = 32,
+       [0][0][RTW89_WW][12] = 32,
+       [0][0][RTW89_WW][13] = 0,
+       [0][1][RTW89_WW][0] = 20,
+       [0][1][RTW89_WW][1] = 22,
+       [0][1][RTW89_WW][2] = 22,
+       [0][1][RTW89_WW][3] = 22,
+       [0][1][RTW89_WW][4] = 22,
+       [0][1][RTW89_WW][5] = 22,
+       [0][1][RTW89_WW][6] = 22,
+       [0][1][RTW89_WW][7] = 22,
+       [0][1][RTW89_WW][8] = 22,
+       [0][1][RTW89_WW][9] = 22,
+       [0][1][RTW89_WW][10] = 22,
+       [0][1][RTW89_WW][11] = 22,
+       [0][1][RTW89_WW][12] = 20,
+       [0][1][RTW89_WW][13] = 0,
+       [1][0][RTW89_WW][0] = 42,
+       [1][0][RTW89_WW][1] = 44,
+       [1][0][RTW89_WW][2] = 44,
+       [1][0][RTW89_WW][3] = 44,
+       [1][0][RTW89_WW][4] = 44,
+       [1][0][RTW89_WW][5] = 44,
+       [1][0][RTW89_WW][6] = 44,
+       [1][0][RTW89_WW][7] = 44,
+       [1][0][RTW89_WW][8] = 44,
+       [1][0][RTW89_WW][9] = 44,
+       [1][0][RTW89_WW][10] = 44,
+       [1][0][RTW89_WW][11] = 44,
+       [1][0][RTW89_WW][12] = 38,
+       [1][0][RTW89_WW][13] = 0,
+       [1][1][RTW89_WW][0] = 32,
+       [1][1][RTW89_WW][1] = 32,
+       [1][1][RTW89_WW][2] = 32,
+       [1][1][RTW89_WW][3] = 32,
+       [1][1][RTW89_WW][4] = 32,
+       [1][1][RTW89_WW][5] = 32,
+       [1][1][RTW89_WW][6] = 32,
+       [1][1][RTW89_WW][7] = 32,
+       [1][1][RTW89_WW][8] = 32,
+       [1][1][RTW89_WW][9] = 32,
+       [1][1][RTW89_WW][10] = 32,
+       [1][1][RTW89_WW][11] = 32,
+       [1][1][RTW89_WW][12] = 32,
+       [1][1][RTW89_WW][13] = 0,
+       [2][0][RTW89_WW][0] = 56,
+       [2][0][RTW89_WW][1] = 56,
+       [2][0][RTW89_WW][2] = 56,
+       [2][0][RTW89_WW][3] = 56,
+       [2][0][RTW89_WW][4] = 56,
+       [2][0][RTW89_WW][5] = 56,
+       [2][0][RTW89_WW][6] = 56,
+       [2][0][RTW89_WW][7] = 56,
+       [2][0][RTW89_WW][8] = 56,
+       [2][0][RTW89_WW][9] = 56,
+       [2][0][RTW89_WW][10] = 56,
+       [2][0][RTW89_WW][11] = 50,
+       [2][0][RTW89_WW][12] = 46,
+       [2][0][RTW89_WW][13] = 0,
+       [2][1][RTW89_WW][0] = 44,
+       [2][1][RTW89_WW][1] = 44,
+       [2][1][RTW89_WW][2] = 44,
+       [2][1][RTW89_WW][3] = 44,
+       [2][1][RTW89_WW][4] = 44,
+       [2][1][RTW89_WW][5] = 44,
+       [2][1][RTW89_WW][6] = 44,
+       [2][1][RTW89_WW][7] = 44,
+       [2][1][RTW89_WW][8] = 44,
+       [2][1][RTW89_WW][9] = 44,
+       [2][1][RTW89_WW][10] = 44,
+       [2][1][RTW89_WW][11] = 38,
+       [2][1][RTW89_WW][12] = 34,
+       [2][1][RTW89_WW][13] = 0,
+       [0][0][RTW89_FCC][0] = 68,
+       [0][0][RTW89_ETSI][0] = 32,
+       [0][0][RTW89_MKK][0] = 42,
+       [0][0][RTW89_IC][0] = 68,
+       [0][0][RTW89_KCC][0] = 44,
+       [0][0][RTW89_ACMA][0] = 32,
+       [0][0][RTW89_CHILE][0] = 66,
+       [0][0][RTW89_UKRAINE][0] = 32,
+       [0][0][RTW89_MEXICO][0] = 68,
+       [0][0][RTW89_CN][0] = 32,
+       [0][0][RTW89_QATAR][0] = 32,
+       [0][0][RTW89_UK][0] = 32,
+       [0][0][RTW89_FCC][1] = 68,
+       [0][0][RTW89_ETSI][1] = 32,
+       [0][0][RTW89_MKK][1] = 42,
+       [0][0][RTW89_IC][1] = 68,
+       [0][0][RTW89_KCC][1] = 44,
+       [0][0][RTW89_ACMA][1] = 32,
+       [0][0][RTW89_CHILE][1] = 64,
+       [0][0][RTW89_UKRAINE][1] = 32,
+       [0][0][RTW89_MEXICO][1] = 68,
+       [0][0][RTW89_CN][1] = 32,
+       [0][0][RTW89_QATAR][1] = 32,
+       [0][0][RTW89_UK][1] = 32,
+       [0][0][RTW89_FCC][2] = 72,
+       [0][0][RTW89_ETSI][2] = 32,
+       [0][0][RTW89_MKK][2] = 42,
+       [0][0][RTW89_IC][2] = 72,
+       [0][0][RTW89_KCC][2] = 44,
+       [0][0][RTW89_ACMA][2] = 32,
+       [0][0][RTW89_CHILE][2] = 64,
+       [0][0][RTW89_UKRAINE][2] = 32,
+       [0][0][RTW89_MEXICO][2] = 72,
+       [0][0][RTW89_CN][2] = 32,
+       [0][0][RTW89_QATAR][2] = 32,
+       [0][0][RTW89_UK][2] = 32,
+       [0][0][RTW89_FCC][3] = 76,
+       [0][0][RTW89_ETSI][3] = 32,
+       [0][0][RTW89_MKK][3] = 42,
+       [0][0][RTW89_IC][3] = 76,
+       [0][0][RTW89_KCC][3] = 44,
+       [0][0][RTW89_ACMA][3] = 32,
+       [0][0][RTW89_CHILE][3] = 64,
+       [0][0][RTW89_UKRAINE][3] = 32,
+       [0][0][RTW89_MEXICO][3] = 76,
+       [0][0][RTW89_CN][3] = 32,
+       [0][0][RTW89_QATAR][3] = 32,
+       [0][0][RTW89_UK][3] = 32,
+       [0][0][RTW89_FCC][4] = 76,
+       [0][0][RTW89_ETSI][4] = 32,
+       [0][0][RTW89_MKK][4] = 42,
+       [0][0][RTW89_IC][4] = 76,
+       [0][0][RTW89_KCC][4] = 44,
+       [0][0][RTW89_ACMA][4] = 32,
+       [0][0][RTW89_CHILE][4] = 64,
+       [0][0][RTW89_UKRAINE][4] = 32,
+       [0][0][RTW89_MEXICO][4] = 76,
+       [0][0][RTW89_CN][4] = 32,
+       [0][0][RTW89_QATAR][4] = 32,
+       [0][0][RTW89_UK][4] = 32,
+       [0][0][RTW89_FCC][5] = 84,
+       [0][0][RTW89_ETSI][5] = 32,
+       [0][0][RTW89_MKK][5] = 42,
+       [0][0][RTW89_IC][5] = 84,
+       [0][0][RTW89_KCC][5] = 44,
+       [0][0][RTW89_ACMA][5] = 32,
+       [0][0][RTW89_CHILE][5] = 64,
+       [0][0][RTW89_UKRAINE][5] = 32,
+       [0][0][RTW89_MEXICO][5] = 84,
+       [0][0][RTW89_CN][5] = 32,
+       [0][0][RTW89_QATAR][5] = 32,
+       [0][0][RTW89_UK][5] = 32,
+       [0][0][RTW89_FCC][6] = 74,
+       [0][0][RTW89_ETSI][6] = 32,
+       [0][0][RTW89_MKK][6] = 42,
+       [0][0][RTW89_IC][6] = 74,
+       [0][0][RTW89_KCC][6] = 44,
+       [0][0][RTW89_ACMA][6] = 32,
+       [0][0][RTW89_CHILE][6] = 64,
+       [0][0][RTW89_UKRAINE][6] = 32,
+       [0][0][RTW89_MEXICO][6] = 74,
+       [0][0][RTW89_CN][6] = 32,
+       [0][0][RTW89_QATAR][6] = 32,
+       [0][0][RTW89_UK][6] = 32,
+       [0][0][RTW89_FCC][7] = 74,
+       [0][0][RTW89_ETSI][7] = 32,
+       [0][0][RTW89_MKK][7] = 42,
+       [0][0][RTW89_IC][7] = 74,
+       [0][0][RTW89_KCC][7] = 44,
+       [0][0][RTW89_ACMA][7] = 32,
+       [0][0][RTW89_CHILE][7] = 64,
+       [0][0][RTW89_UKRAINE][7] = 32,
+       [0][0][RTW89_MEXICO][7] = 74,
+       [0][0][RTW89_CN][7] = 32,
+       [0][0][RTW89_QATAR][7] = 32,
+       [0][0][RTW89_UK][7] = 32,
+       [0][0][RTW89_FCC][8] = 70,
+       [0][0][RTW89_ETSI][8] = 32,
+       [0][0][RTW89_MKK][8] = 42,
+       [0][0][RTW89_IC][8] = 70,
+       [0][0][RTW89_KCC][8] = 44,
+       [0][0][RTW89_ACMA][8] = 32,
+       [0][0][RTW89_CHILE][8] = 64,
+       [0][0][RTW89_UKRAINE][8] = 32,
+       [0][0][RTW89_MEXICO][8] = 70,
+       [0][0][RTW89_CN][8] = 32,
+       [0][0][RTW89_QATAR][8] = 32,
+       [0][0][RTW89_UK][8] = 32,
+       [0][0][RTW89_FCC][9] = 66,
+       [0][0][RTW89_ETSI][9] = 32,
+       [0][0][RTW89_MKK][9] = 42,
+       [0][0][RTW89_IC][9] = 66,
+       [0][0][RTW89_KCC][9] = 42,
+       [0][0][RTW89_ACMA][9] = 32,
+       [0][0][RTW89_CHILE][9] = 64,
+       [0][0][RTW89_UKRAINE][9] = 32,
+       [0][0][RTW89_MEXICO][9] = 66,
+       [0][0][RTW89_CN][9] = 32,
+       [0][0][RTW89_QATAR][9] = 32,
+       [0][0][RTW89_UK][9] = 32,
+       [0][0][RTW89_FCC][10] = 66,
+       [0][0][RTW89_ETSI][10] = 32,
+       [0][0][RTW89_MKK][10] = 42,
+       [0][0][RTW89_IC][10] = 66,
+       [0][0][RTW89_KCC][10] = 42,
+       [0][0][RTW89_ACMA][10] = 32,
+       [0][0][RTW89_CHILE][10] = 66,
+       [0][0][RTW89_UKRAINE][10] = 32,
+       [0][0][RTW89_MEXICO][10] = 66,
+       [0][0][RTW89_CN][10] = 32,
+       [0][0][RTW89_QATAR][10] = 32,
+       [0][0][RTW89_UK][10] = 32,
+       [0][0][RTW89_FCC][11] = 50,
+       [0][0][RTW89_ETSI][11] = 32,
+       [0][0][RTW89_MKK][11] = 42,
+       [0][0][RTW89_IC][11] = 50,
+       [0][0][RTW89_KCC][11] = 42,
+       [0][0][RTW89_ACMA][11] = 32,
+       [0][0][RTW89_CHILE][11] = 64,
+       [0][0][RTW89_UKRAINE][11] = 32,
+       [0][0][RTW89_MEXICO][11] = 50,
+       [0][0][RTW89_CN][11] = 32,
+       [0][0][RTW89_QATAR][11] = 32,
+       [0][0][RTW89_UK][11] = 32,
+       [0][0][RTW89_FCC][12] = 32,
+       [0][0][RTW89_ETSI][12] = 32,
+       [0][0][RTW89_MKK][12] = 42,
+       [0][0][RTW89_IC][12] = 32,
+       [0][0][RTW89_KCC][12] = 42,
+       [0][0][RTW89_ACMA][12] = 32,
+       [0][0][RTW89_CHILE][12] = 64,
+       [0][0][RTW89_UKRAINE][12] = 32,
+       [0][0][RTW89_MEXICO][12] = 32,
+       [0][0][RTW89_CN][12] = 32,
+       [0][0][RTW89_QATAR][12] = 32,
+       [0][0][RTW89_UK][12] = 32,
+       [0][0][RTW89_FCC][13] = 127,
+       [0][0][RTW89_ETSI][13] = 127,
+       [0][0][RTW89_MKK][13] = 127,
+       [0][0][RTW89_IC][13] = 127,
+       [0][0][RTW89_KCC][13] = 127,
+       [0][0][RTW89_ACMA][13] = 127,
+       [0][0][RTW89_CHILE][13] = 127,
+       [0][0][RTW89_UKRAINE][13] = 127,
+       [0][0][RTW89_MEXICO][13] = 127,
+       [0][0][RTW89_CN][13] = 127,
+       [0][0][RTW89_QATAR][13] = 127,
+       [0][0][RTW89_UK][13] = 127,
+       [0][1][RTW89_FCC][0] = 54,
+       [0][1][RTW89_ETSI][0] = 20,
+       [0][1][RTW89_MKK][0] = 32,
+       [0][1][RTW89_IC][0] = 54,
+       [0][1][RTW89_KCC][0] = 32,
+       [0][1][RTW89_ACMA][0] = 20,
+       [0][1][RTW89_CHILE][0] = 50,
+       [0][1][RTW89_UKRAINE][0] = 20,
+       [0][1][RTW89_MEXICO][0] = 54,
+       [0][1][RTW89_CN][0] = 20,
+       [0][1][RTW89_QATAR][0] = 20,
+       [0][1][RTW89_UK][0] = 20,
+       [0][1][RTW89_FCC][1] = 54,
+       [0][1][RTW89_ETSI][1] = 22,
+       [0][1][RTW89_MKK][1] = 32,
+       [0][1][RTW89_IC][1] = 54,
+       [0][1][RTW89_KCC][1] = 32,
+       [0][1][RTW89_ACMA][1] = 22,
+       [0][1][RTW89_CHILE][1] = 50,
+       [0][1][RTW89_UKRAINE][1] = 22,
+       [0][1][RTW89_MEXICO][1] = 54,
+       [0][1][RTW89_CN][1] = 22,
+       [0][1][RTW89_QATAR][1] = 22,
+       [0][1][RTW89_UK][1] = 22,
+       [0][1][RTW89_FCC][2] = 58,
+       [0][1][RTW89_ETSI][2] = 22,
+       [0][1][RTW89_MKK][2] = 32,
+       [0][1][RTW89_IC][2] = 58,
+       [0][1][RTW89_KCC][2] = 32,
+       [0][1][RTW89_ACMA][2] = 22,
+       [0][1][RTW89_CHILE][2] = 50,
+       [0][1][RTW89_UKRAINE][2] = 22,
+       [0][1][RTW89_MEXICO][2] = 58,
+       [0][1][RTW89_CN][2] = 22,
+       [0][1][RTW89_QATAR][2] = 22,
+       [0][1][RTW89_UK][2] = 22,
+       [0][1][RTW89_FCC][3] = 62,
+       [0][1][RTW89_ETSI][3] = 22,
+       [0][1][RTW89_MKK][3] = 32,
+       [0][1][RTW89_IC][3] = 62,
+       [0][1][RTW89_KCC][3] = 32,
+       [0][1][RTW89_ACMA][3] = 22,
+       [0][1][RTW89_CHILE][3] = 50,
+       [0][1][RTW89_UKRAINE][3] = 22,
+       [0][1][RTW89_MEXICO][3] = 62,
+       [0][1][RTW89_CN][3] = 22,
+       [0][1][RTW89_QATAR][3] = 22,
+       [0][1][RTW89_UK][3] = 22,
+       [0][1][RTW89_FCC][4] = 66,
+       [0][1][RTW89_ETSI][4] = 22,
+       [0][1][RTW89_MKK][4] = 32,
+       [0][1][RTW89_IC][4] = 66,
+       [0][1][RTW89_KCC][4] = 30,
+       [0][1][RTW89_ACMA][4] = 22,
+       [0][1][RTW89_CHILE][4] = 50,
+       [0][1][RTW89_UKRAINE][4] = 22,
+       [0][1][RTW89_MEXICO][4] = 66,
+       [0][1][RTW89_CN][4] = 22,
+       [0][1][RTW89_QATAR][4] = 22,
+       [0][1][RTW89_UK][4] = 22,
+       [0][1][RTW89_FCC][5] = 74,
+       [0][1][RTW89_ETSI][5] = 22,
+       [0][1][RTW89_MKK][5] = 32,
+       [0][1][RTW89_IC][5] = 74,
+       [0][1][RTW89_KCC][5] = 30,
+       [0][1][RTW89_ACMA][5] = 22,
+       [0][1][RTW89_CHILE][5] = 52,
+       [0][1][RTW89_UKRAINE][5] = 22,
+       [0][1][RTW89_MEXICO][5] = 74,
+       [0][1][RTW89_CN][5] = 22,
+       [0][1][RTW89_QATAR][5] = 22,
+       [0][1][RTW89_UK][5] = 22,
+       [0][1][RTW89_FCC][6] = 66,
+       [0][1][RTW89_ETSI][6] = 22,
+       [0][1][RTW89_MKK][6] = 30,
+       [0][1][RTW89_IC][6] = 66,
+       [0][1][RTW89_KCC][6] = 30,
+       [0][1][RTW89_ACMA][6] = 22,
+       [0][1][RTW89_CHILE][6] = 50,
+       [0][1][RTW89_UKRAINE][6] = 22,
+       [0][1][RTW89_MEXICO][6] = 66,
+       [0][1][RTW89_CN][6] = 22,
+       [0][1][RTW89_QATAR][6] = 22,
+       [0][1][RTW89_UK][6] = 22,
+       [0][1][RTW89_FCC][7] = 62,
+       [0][1][RTW89_ETSI][7] = 22,
+       [0][1][RTW89_MKK][7] = 32,
+       [0][1][RTW89_IC][7] = 62,
+       [0][1][RTW89_KCC][7] = 30,
+       [0][1][RTW89_ACMA][7] = 22,
+       [0][1][RTW89_CHILE][7] = 50,
+       [0][1][RTW89_UKRAINE][7] = 22,
+       [0][1][RTW89_MEXICO][7] = 62,
+       [0][1][RTW89_CN][7] = 22,
+       [0][1][RTW89_QATAR][7] = 22,
+       [0][1][RTW89_UK][7] = 22,
+       [0][1][RTW89_FCC][8] = 58,
+       [0][1][RTW89_ETSI][8] = 22,
+       [0][1][RTW89_MKK][8] = 32,
+       [0][1][RTW89_IC][8] = 58,
+       [0][1][RTW89_KCC][8] = 30,
+       [0][1][RTW89_ACMA][8] = 22,
+       [0][1][RTW89_CHILE][8] = 50,
+       [0][1][RTW89_UKRAINE][8] = 22,
+       [0][1][RTW89_MEXICO][8] = 58,
+       [0][1][RTW89_CN][8] = 22,
+       [0][1][RTW89_QATAR][8] = 22,
+       [0][1][RTW89_UK][8] = 22,
+       [0][1][RTW89_FCC][9] = 54,
+       [0][1][RTW89_ETSI][9] = 22,
+       [0][1][RTW89_MKK][9] = 32,
+       [0][1][RTW89_IC][9] = 54,
+       [0][1][RTW89_KCC][9] = 30,
+       [0][1][RTW89_ACMA][9] = 22,
+       [0][1][RTW89_CHILE][9] = 50,
+       [0][1][RTW89_UKRAINE][9] = 22,
+       [0][1][RTW89_MEXICO][9] = 54,
+       [0][1][RTW89_CN][9] = 22,
+       [0][1][RTW89_QATAR][9] = 22,
+       [0][1][RTW89_UK][9] = 22,
+       [0][1][RTW89_FCC][10] = 54,
+       [0][1][RTW89_ETSI][10] = 22,
+       [0][1][RTW89_MKK][10] = 32,
+       [0][1][RTW89_IC][10] = 54,
+       [0][1][RTW89_KCC][10] = 30,
+       [0][1][RTW89_ACMA][10] = 22,
+       [0][1][RTW89_CHILE][10] = 50,
+       [0][1][RTW89_UKRAINE][10] = 22,
+       [0][1][RTW89_MEXICO][10] = 54,
+       [0][1][RTW89_CN][10] = 22,
+       [0][1][RTW89_QATAR][10] = 22,
+       [0][1][RTW89_UK][10] = 22,
+       [0][1][RTW89_FCC][11] = 38,
+       [0][1][RTW89_ETSI][11] = 22,
+       [0][1][RTW89_MKK][11] = 32,
+       [0][1][RTW89_IC][11] = 38,
+       [0][1][RTW89_KCC][11] = 30,
+       [0][1][RTW89_ACMA][11] = 22,
+       [0][1][RTW89_CHILE][11] = 50,
+       [0][1][RTW89_UKRAINE][11] = 22,
+       [0][1][RTW89_MEXICO][11] = 38,
+       [0][1][RTW89_CN][11] = 22,
+       [0][1][RTW89_QATAR][11] = 22,
+       [0][1][RTW89_UK][11] = 22,
+       [0][1][RTW89_FCC][12] = 30,
+       [0][1][RTW89_ETSI][12] = 20,
+       [0][1][RTW89_MKK][12] = 30,
+       [0][1][RTW89_IC][12] = 30,
+       [0][1][RTW89_KCC][12] = 30,
+       [0][1][RTW89_ACMA][12] = 20,
+       [0][1][RTW89_CHILE][12] = 50,
+       [0][1][RTW89_UKRAINE][12] = 20,
+       [0][1][RTW89_MEXICO][12] = 30,
+       [0][1][RTW89_CN][12] = 20,
+       [0][1][RTW89_QATAR][12] = 20,
+       [0][1][RTW89_UK][12] = 20,
+       [0][1][RTW89_FCC][13] = 127,
+       [0][1][RTW89_ETSI][13] = 127,
+       [0][1][RTW89_MKK][13] = 127,
+       [0][1][RTW89_IC][13] = 127,
+       [0][1][RTW89_KCC][13] = 127,
+       [0][1][RTW89_ACMA][13] = 127,
+       [0][1][RTW89_CHILE][13] = 127,
+       [0][1][RTW89_UKRAINE][13] = 127,
+       [0][1][RTW89_MEXICO][13] = 127,
+       [0][1][RTW89_CN][13] = 127,
+       [0][1][RTW89_QATAR][13] = 127,
+       [0][1][RTW89_UK][13] = 127,
+       [1][0][RTW89_FCC][0] = 72,
+       [1][0][RTW89_ETSI][0] = 42,
+       [1][0][RTW89_MKK][0] = 52,
+       [1][0][RTW89_IC][0] = 72,
+       [1][0][RTW89_KCC][0] = 52,
+       [1][0][RTW89_ACMA][0] = 42,
+       [1][0][RTW89_CHILE][0] = 68,
+       [1][0][RTW89_UKRAINE][0] = 42,
+       [1][0][RTW89_MEXICO][0] = 72,
+       [1][0][RTW89_CN][0] = 42,
+       [1][0][RTW89_QATAR][0] = 42,
+       [1][0][RTW89_UK][0] = 42,
+       [1][0][RTW89_FCC][1] = 72,
+       [1][0][RTW89_ETSI][1] = 44,
+       [1][0][RTW89_MKK][1] = 52,
+       [1][0][RTW89_IC][1] = 72,
+       [1][0][RTW89_KCC][1] = 52,
+       [1][0][RTW89_ACMA][1] = 44,
+       [1][0][RTW89_CHILE][1] = 68,
+       [1][0][RTW89_UKRAINE][1] = 44,
+       [1][0][RTW89_MEXICO][1] = 72,
+       [1][0][RTW89_CN][1] = 44,
+       [1][0][RTW89_QATAR][1] = 44,
+       [1][0][RTW89_UK][1] = 44,
+       [1][0][RTW89_FCC][2] = 76,
+       [1][0][RTW89_ETSI][2] = 44,
+       [1][0][RTW89_MKK][2] = 52,
+       [1][0][RTW89_IC][2] = 76,
+       [1][0][RTW89_KCC][2] = 52,
+       [1][0][RTW89_ACMA][2] = 44,
+       [1][0][RTW89_CHILE][2] = 68,
+       [1][0][RTW89_UKRAINE][2] = 44,
+       [1][0][RTW89_MEXICO][2] = 76,
+       [1][0][RTW89_CN][2] = 44,
+       [1][0][RTW89_QATAR][2] = 44,
+       [1][0][RTW89_UK][2] = 44,
+       [1][0][RTW89_FCC][3] = 78,
+       [1][0][RTW89_ETSI][3] = 44,
+       [1][0][RTW89_MKK][3] = 52,
+       [1][0][RTW89_IC][3] = 78,
+       [1][0][RTW89_KCC][3] = 52,
+       [1][0][RTW89_ACMA][3] = 44,
+       [1][0][RTW89_CHILE][3] = 68,
+       [1][0][RTW89_UKRAINE][3] = 44,
+       [1][0][RTW89_MEXICO][3] = 78,
+       [1][0][RTW89_CN][3] = 44,
+       [1][0][RTW89_QATAR][3] = 44,
+       [1][0][RTW89_UK][3] = 44,
+       [1][0][RTW89_FCC][4] = 78,
+       [1][0][RTW89_ETSI][4] = 44,
+       [1][0][RTW89_MKK][4] = 52,
+       [1][0][RTW89_IC][4] = 78,
+       [1][0][RTW89_KCC][4] = 52,
+       [1][0][RTW89_ACMA][4] = 44,
+       [1][0][RTW89_CHILE][4] = 68,
+       [1][0][RTW89_UKRAINE][4] = 44,
+       [1][0][RTW89_MEXICO][4] = 78,
+       [1][0][RTW89_CN][4] = 44,
+       [1][0][RTW89_QATAR][4] = 44,
+       [1][0][RTW89_UK][4] = 44,
+       [1][0][RTW89_FCC][5] = 84,
+       [1][0][RTW89_ETSI][5] = 44,
+       [1][0][RTW89_MKK][5] = 52,
+       [1][0][RTW89_IC][5] = 84,
+       [1][0][RTW89_KCC][5] = 52,
+       [1][0][RTW89_ACMA][5] = 44,
+       [1][0][RTW89_CHILE][5] = 68,
+       [1][0][RTW89_UKRAINE][5] = 44,
+       [1][0][RTW89_MEXICO][5] = 84,
+       [1][0][RTW89_CN][5] = 44,
+       [1][0][RTW89_QATAR][5] = 44,
+       [1][0][RTW89_UK][5] = 44,
+       [1][0][RTW89_FCC][6] = 72,
+       [1][0][RTW89_ETSI][6] = 44,
+       [1][0][RTW89_MKK][6] = 52,
+       [1][0][RTW89_IC][6] = 72,
+       [1][0][RTW89_KCC][6] = 52,
+       [1][0][RTW89_ACMA][6] = 44,
+       [1][0][RTW89_CHILE][6] = 68,
+       [1][0][RTW89_UKRAINE][6] = 44,
+       [1][0][RTW89_MEXICO][6] = 72,
+       [1][0][RTW89_CN][6] = 44,
+       [1][0][RTW89_QATAR][6] = 44,
+       [1][0][RTW89_UK][6] = 44,
+       [1][0][RTW89_FCC][7] = 72,
+       [1][0][RTW89_ETSI][7] = 44,
+       [1][0][RTW89_MKK][7] = 52,
+       [1][0][RTW89_IC][7] = 72,
+       [1][0][RTW89_KCC][7] = 52,
+       [1][0][RTW89_ACMA][7] = 44,
+       [1][0][RTW89_CHILE][7] = 68,
+       [1][0][RTW89_UKRAINE][7] = 44,
+       [1][0][RTW89_MEXICO][7] = 72,
+       [1][0][RTW89_CN][7] = 44,
+       [1][0][RTW89_QATAR][7] = 44,
+       [1][0][RTW89_UK][7] = 44,
+       [1][0][RTW89_FCC][8] = 72,
+       [1][0][RTW89_ETSI][8] = 44,
+       [1][0][RTW89_MKK][8] = 52,
+       [1][0][RTW89_IC][8] = 72,
+       [1][0][RTW89_KCC][8] = 52,
+       [1][0][RTW89_ACMA][8] = 44,
+       [1][0][RTW89_CHILE][8] = 68,
+       [1][0][RTW89_UKRAINE][8] = 44,
+       [1][0][RTW89_MEXICO][8] = 72,
+       [1][0][RTW89_CN][8] = 44,
+       [1][0][RTW89_QATAR][8] = 44,
+       [1][0][RTW89_UK][8] = 44,
+       [1][0][RTW89_FCC][9] = 68,
+       [1][0][RTW89_ETSI][9] = 44,
+       [1][0][RTW89_MKK][9] = 52,
+       [1][0][RTW89_IC][9] = 68,
+       [1][0][RTW89_KCC][9] = 52,
+       [1][0][RTW89_ACMA][9] = 44,
+       [1][0][RTW89_CHILE][9] = 68,
+       [1][0][RTW89_UKRAINE][9] = 44,
+       [1][0][RTW89_MEXICO][9] = 68,
+       [1][0][RTW89_CN][9] = 44,
+       [1][0][RTW89_QATAR][9] = 44,
+       [1][0][RTW89_UK][9] = 44,
+       [1][0][RTW89_FCC][10] = 68,
+       [1][0][RTW89_ETSI][10] = 44,
+       [1][0][RTW89_MKK][10] = 52,
+       [1][0][RTW89_IC][10] = 68,
+       [1][0][RTW89_KCC][10] = 52,
+       [1][0][RTW89_ACMA][10] = 44,
+       [1][0][RTW89_CHILE][10] = 70,
+       [1][0][RTW89_UKRAINE][10] = 44,
+       [1][0][RTW89_MEXICO][10] = 68,
+       [1][0][RTW89_CN][10] = 44,
+       [1][0][RTW89_QATAR][10] = 44,
+       [1][0][RTW89_UK][10] = 44,
+       [1][0][RTW89_FCC][11] = 50,
+       [1][0][RTW89_ETSI][11] = 44,
+       [1][0][RTW89_MKK][11] = 52,
+       [1][0][RTW89_IC][11] = 50,
+       [1][0][RTW89_KCC][11] = 52,
+       [1][0][RTW89_ACMA][11] = 44,
+       [1][0][RTW89_CHILE][11] = 68,
+       [1][0][RTW89_UKRAINE][11] = 44,
+       [1][0][RTW89_MEXICO][11] = 50,
+       [1][0][RTW89_CN][11] = 44,
+       [1][0][RTW89_QATAR][11] = 44,
+       [1][0][RTW89_UK][11] = 44,
+       [1][0][RTW89_FCC][12] = 38,
+       [1][0][RTW89_ETSI][12] = 42,
+       [1][0][RTW89_MKK][12] = 52,
+       [1][0][RTW89_IC][12] = 38,
+       [1][0][RTW89_KCC][12] = 52,
+       [1][0][RTW89_ACMA][12] = 42,
+       [1][0][RTW89_CHILE][12] = 68,
+       [1][0][RTW89_UKRAINE][12] = 42,
+       [1][0][RTW89_MEXICO][12] = 38,
+       [1][0][RTW89_CN][12] = 42,
+       [1][0][RTW89_QATAR][12] = 42,
+       [1][0][RTW89_UK][12] = 42,
+       [1][0][RTW89_FCC][13] = 127,
+       [1][0][RTW89_ETSI][13] = 127,
+       [1][0][RTW89_MKK][13] = 127,
+       [1][0][RTW89_IC][13] = 127,
+       [1][0][RTW89_KCC][13] = 127,
+       [1][0][RTW89_ACMA][13] = 127,
+       [1][0][RTW89_CHILE][13] = 127,
+       [1][0][RTW89_UKRAINE][13] = 127,
+       [1][0][RTW89_MEXICO][13] = 127,
+       [1][0][RTW89_CN][13] = 127,
+       [1][0][RTW89_QATAR][13] = 127,
+       [1][0][RTW89_UK][13] = 127,
+       [1][1][RTW89_FCC][0] = 54,
+       [1][1][RTW89_ETSI][0] = 32,
+       [1][1][RTW89_MKK][0] = 40,
+       [1][1][RTW89_IC][0] = 54,
+       [1][1][RTW89_KCC][0] = 40,
+       [1][1][RTW89_ACMA][0] = 32,
+       [1][1][RTW89_CHILE][0] = 54,
+       [1][1][RTW89_UKRAINE][0] = 32,
+       [1][1][RTW89_MEXICO][0] = 54,
+       [1][1][RTW89_CN][0] = 32,
+       [1][1][RTW89_QATAR][0] = 32,
+       [1][1][RTW89_UK][0] = 32,
+       [1][1][RTW89_FCC][1] = 54,
+       [1][1][RTW89_ETSI][1] = 32,
+       [1][1][RTW89_MKK][1] = 40,
+       [1][1][RTW89_IC][1] = 54,
+       [1][1][RTW89_KCC][1] = 40,
+       [1][1][RTW89_ACMA][1] = 32,
+       [1][1][RTW89_CHILE][1] = 54,
+       [1][1][RTW89_UKRAINE][1] = 32,
+       [1][1][RTW89_MEXICO][1] = 54,
+       [1][1][RTW89_CN][1] = 32,
+       [1][1][RTW89_QATAR][1] = 32,
+       [1][1][RTW89_UK][1] = 32,
+       [1][1][RTW89_FCC][2] = 58,
+       [1][1][RTW89_ETSI][2] = 32,
+       [1][1][RTW89_MKK][2] = 40,
+       [1][1][RTW89_IC][2] = 58,
+       [1][1][RTW89_KCC][2] = 40,
+       [1][1][RTW89_ACMA][2] = 32,
+       [1][1][RTW89_CHILE][2] = 54,
+       [1][1][RTW89_UKRAINE][2] = 32,
+       [1][1][RTW89_MEXICO][2] = 58,
+       [1][1][RTW89_CN][2] = 32,
+       [1][1][RTW89_QATAR][2] = 32,
+       [1][1][RTW89_UK][2] = 32,
+       [1][1][RTW89_FCC][3] = 62,
+       [1][1][RTW89_ETSI][3] = 32,
+       [1][1][RTW89_MKK][3] = 40,
+       [1][1][RTW89_IC][3] = 62,
+       [1][1][RTW89_KCC][3] = 40,
+       [1][1][RTW89_ACMA][3] = 32,
+       [1][1][RTW89_CHILE][3] = 54,
+       [1][1][RTW89_UKRAINE][3] = 32,
+       [1][1][RTW89_MEXICO][3] = 62,
+       [1][1][RTW89_CN][3] = 32,
+       [1][1][RTW89_QATAR][3] = 32,
+       [1][1][RTW89_UK][3] = 32,
+       [1][1][RTW89_FCC][4] = 66,
+       [1][1][RTW89_ETSI][4] = 32,
+       [1][1][RTW89_MKK][4] = 40,
+       [1][1][RTW89_IC][4] = 66,
+       [1][1][RTW89_KCC][4] = 40,
+       [1][1][RTW89_ACMA][4] = 32,
+       [1][1][RTW89_CHILE][4] = 54,
+       [1][1][RTW89_UKRAINE][4] = 32,
+       [1][1][RTW89_MEXICO][4] = 66,
+       [1][1][RTW89_CN][4] = 32,
+       [1][1][RTW89_QATAR][4] = 32,
+       [1][1][RTW89_UK][4] = 32,
+       [1][1][RTW89_FCC][5] = 74,
+       [1][1][RTW89_ETSI][5] = 32,
+       [1][1][RTW89_MKK][5] = 40,
+       [1][1][RTW89_IC][5] = 74,
+       [1][1][RTW89_KCC][5] = 40,
+       [1][1][RTW89_ACMA][5] = 32,
+       [1][1][RTW89_CHILE][5] = 54,
+       [1][1][RTW89_UKRAINE][5] = 32,
+       [1][1][RTW89_MEXICO][5] = 74,
+       [1][1][RTW89_CN][5] = 32,
+       [1][1][RTW89_QATAR][5] = 32,
+       [1][1][RTW89_UK][5] = 32,
+       [1][1][RTW89_FCC][6] = 66,
+       [1][1][RTW89_ETSI][6] = 32,
+       [1][1][RTW89_MKK][6] = 40,
+       [1][1][RTW89_IC][6] = 66,
+       [1][1][RTW89_KCC][6] = 40,
+       [1][1][RTW89_ACMA][6] = 32,
+       [1][1][RTW89_CHILE][6] = 54,
+       [1][1][RTW89_UKRAINE][6] = 32,
+       [1][1][RTW89_MEXICO][6] = 66,
+       [1][1][RTW89_CN][6] = 32,
+       [1][1][RTW89_QATAR][6] = 32,
+       [1][1][RTW89_UK][6] = 32,
+       [1][1][RTW89_FCC][7] = 62,
+       [1][1][RTW89_ETSI][7] = 32,
+       [1][1][RTW89_MKK][7] = 40,
+       [1][1][RTW89_IC][7] = 62,
+       [1][1][RTW89_KCC][7] = 40,
+       [1][1][RTW89_ACMA][7] = 32,
+       [1][1][RTW89_CHILE][7] = 54,
+       [1][1][RTW89_UKRAINE][7] = 32,
+       [1][1][RTW89_MEXICO][7] = 62,
+       [1][1][RTW89_CN][7] = 32,
+       [1][1][RTW89_QATAR][7] = 32,
+       [1][1][RTW89_UK][7] = 32,
+       [1][1][RTW89_FCC][8] = 58,
+       [1][1][RTW89_ETSI][8] = 32,
+       [1][1][RTW89_MKK][8] = 40,
+       [1][1][RTW89_IC][8] = 58,
+       [1][1][RTW89_KCC][8] = 40,
+       [1][1][RTW89_ACMA][8] = 32,
+       [1][1][RTW89_CHILE][8] = 54,
+       [1][1][RTW89_UKRAINE][8] = 32,
+       [1][1][RTW89_MEXICO][8] = 58,
+       [1][1][RTW89_CN][8] = 32,
+       [1][1][RTW89_QATAR][8] = 32,
+       [1][1][RTW89_UK][8] = 32,
+       [1][1][RTW89_FCC][9] = 54,
+       [1][1][RTW89_ETSI][9] = 32,
+       [1][1][RTW89_MKK][9] = 40,
+       [1][1][RTW89_IC][9] = 54,
+       [1][1][RTW89_KCC][9] = 40,
+       [1][1][RTW89_ACMA][9] = 32,
+       [1][1][RTW89_CHILE][9] = 54,
+       [1][1][RTW89_UKRAINE][9] = 32,
+       [1][1][RTW89_MEXICO][9] = 54,
+       [1][1][RTW89_CN][9] = 32,
+       [1][1][RTW89_QATAR][9] = 32,
+       [1][1][RTW89_UK][9] = 32,
+       [1][1][RTW89_FCC][10] = 54,
+       [1][1][RTW89_ETSI][10] = 32,
+       [1][1][RTW89_MKK][10] = 40,
+       [1][1][RTW89_IC][10] = 54,
+       [1][1][RTW89_KCC][10] = 40,
+       [1][1][RTW89_ACMA][10] = 32,
+       [1][1][RTW89_CHILE][10] = 54,
+       [1][1][RTW89_UKRAINE][10] = 32,
+       [1][1][RTW89_MEXICO][10] = 54,
+       [1][1][RTW89_CN][10] = 32,
+       [1][1][RTW89_QATAR][10] = 32,
+       [1][1][RTW89_UK][10] = 32,
+       [1][1][RTW89_FCC][11] = 38,
+       [1][1][RTW89_ETSI][11] = 32,
+       [1][1][RTW89_MKK][11] = 40,
+       [1][1][RTW89_IC][11] = 38,
+       [1][1][RTW89_KCC][11] = 40,
+       [1][1][RTW89_ACMA][11] = 32,
+       [1][1][RTW89_CHILE][11] = 54,
+       [1][1][RTW89_UKRAINE][11] = 32,
+       [1][1][RTW89_MEXICO][11] = 38,
+       [1][1][RTW89_CN][11] = 32,
+       [1][1][RTW89_QATAR][11] = 32,
+       [1][1][RTW89_UK][11] = 32,
+       [1][1][RTW89_FCC][12] = 32,
+       [1][1][RTW89_ETSI][12] = 32,
+       [1][1][RTW89_MKK][12] = 40,
+       [1][1][RTW89_IC][12] = 32,
+       [1][1][RTW89_KCC][12] = 40,
+       [1][1][RTW89_ACMA][12] = 32,
+       [1][1][RTW89_CHILE][12] = 54,
+       [1][1][RTW89_UKRAINE][12] = 32,
+       [1][1][RTW89_MEXICO][12] = 32,
+       [1][1][RTW89_CN][12] = 32,
+       [1][1][RTW89_QATAR][12] = 32,
+       [1][1][RTW89_UK][12] = 32,
+       [1][1][RTW89_FCC][13] = 127,
+       [1][1][RTW89_ETSI][13] = 127,
+       [1][1][RTW89_MKK][13] = 127,
+       [1][1][RTW89_IC][13] = 127,
+       [1][1][RTW89_KCC][13] = 127,
+       [1][1][RTW89_ACMA][13] = 127,
+       [1][1][RTW89_CHILE][13] = 127,
+       [1][1][RTW89_UKRAINE][13] = 127,
+       [1][1][RTW89_MEXICO][13] = 127,
+       [1][1][RTW89_CN][13] = 127,
+       [1][1][RTW89_QATAR][13] = 127,
+       [1][1][RTW89_UK][13] = 127,
+       [2][0][RTW89_FCC][0] = 72,
+       [2][0][RTW89_ETSI][0] = 56,
+       [2][0][RTW89_MKK][0] = 64,
+       [2][0][RTW89_IC][0] = 72,
+       [2][0][RTW89_KCC][0] = 66,
+       [2][0][RTW89_ACMA][0] = 56,
+       [2][0][RTW89_CHILE][0] = 68,
+       [2][0][RTW89_UKRAINE][0] = 56,
+       [2][0][RTW89_MEXICO][0] = 72,
+       [2][0][RTW89_CN][0] = 56,
+       [2][0][RTW89_QATAR][0] = 56,
+       [2][0][RTW89_UK][0] = 56,
+       [2][0][RTW89_FCC][1] = 72,
+       [2][0][RTW89_ETSI][1] = 56,
+       [2][0][RTW89_MKK][1] = 64,
+       [2][0][RTW89_IC][1] = 72,
+       [2][0][RTW89_KCC][1] = 66,
+       [2][0][RTW89_ACMA][1] = 56,
+       [2][0][RTW89_CHILE][1] = 68,
+       [2][0][RTW89_UKRAINE][1] = 56,
+       [2][0][RTW89_MEXICO][1] = 72,
+       [2][0][RTW89_CN][1] = 56,
+       [2][0][RTW89_QATAR][1] = 56,
+       [2][0][RTW89_UK][1] = 56,
+       [2][0][RTW89_FCC][2] = 74,
+       [2][0][RTW89_ETSI][2] = 56,
+       [2][0][RTW89_MKK][2] = 64,
+       [2][0][RTW89_IC][2] = 74,
+       [2][0][RTW89_KCC][2] = 66,
+       [2][0][RTW89_ACMA][2] = 56,
+       [2][0][RTW89_CHILE][2] = 68,
+       [2][0][RTW89_UKRAINE][2] = 56,
+       [2][0][RTW89_MEXICO][2] = 74,
+       [2][0][RTW89_CN][2] = 56,
+       [2][0][RTW89_QATAR][2] = 56,
+       [2][0][RTW89_UK][2] = 56,
+       [2][0][RTW89_FCC][3] = 74,
+       [2][0][RTW89_ETSI][3] = 56,
+       [2][0][RTW89_MKK][3] = 64,
+       [2][0][RTW89_IC][3] = 74,
+       [2][0][RTW89_KCC][3] = 66,
+       [2][0][RTW89_ACMA][3] = 56,
+       [2][0][RTW89_CHILE][3] = 68,
+       [2][0][RTW89_UKRAINE][3] = 56,
+       [2][0][RTW89_MEXICO][3] = 74,
+       [2][0][RTW89_CN][3] = 56,
+       [2][0][RTW89_QATAR][3] = 56,
+       [2][0][RTW89_UK][3] = 56,
+       [2][0][RTW89_FCC][4] = 74,
+       [2][0][RTW89_ETSI][4] = 56,
+       [2][0][RTW89_MKK][4] = 64,
+       [2][0][RTW89_IC][4] = 74,
+       [2][0][RTW89_KCC][4] = 66,
+       [2][0][RTW89_ACMA][4] = 56,
+       [2][0][RTW89_CHILE][4] = 68,
+       [2][0][RTW89_UKRAINE][4] = 56,
+       [2][0][RTW89_MEXICO][4] = 74,
+       [2][0][RTW89_CN][4] = 56,
+       [2][0][RTW89_QATAR][4] = 56,
+       [2][0][RTW89_UK][4] = 56,
+       [2][0][RTW89_FCC][5] = 84,
+       [2][0][RTW89_ETSI][5] = 56,
+       [2][0][RTW89_MKK][5] = 64,
+       [2][0][RTW89_IC][5] = 84,
+       [2][0][RTW89_KCC][5] = 66,
+       [2][0][RTW89_ACMA][5] = 56,
+       [2][0][RTW89_CHILE][5] = 70,
+       [2][0][RTW89_UKRAINE][5] = 56,
+       [2][0][RTW89_MEXICO][5] = 84,
+       [2][0][RTW89_CN][5] = 56,
+       [2][0][RTW89_QATAR][5] = 56,
+       [2][0][RTW89_UK][5] = 56,
+       [2][0][RTW89_FCC][6] = 70,
+       [2][0][RTW89_ETSI][6] = 56,
+       [2][0][RTW89_MKK][6] = 64,
+       [2][0][RTW89_IC][6] = 70,
+       [2][0][RTW89_KCC][6] = 66,
+       [2][0][RTW89_ACMA][6] = 56,
+       [2][0][RTW89_CHILE][6] = 68,
+       [2][0][RTW89_UKRAINE][6] = 56,
+       [2][0][RTW89_MEXICO][6] = 70,
+       [2][0][RTW89_CN][6] = 56,
+       [2][0][RTW89_QATAR][6] = 56,
+       [2][0][RTW89_UK][6] = 56,
+       [2][0][RTW89_FCC][7] = 70,
+       [2][0][RTW89_ETSI][7] = 56,
+       [2][0][RTW89_MKK][7] = 64,
+       [2][0][RTW89_IC][7] = 70,
+       [2][0][RTW89_KCC][7] = 66,
+       [2][0][RTW89_ACMA][7] = 56,
+       [2][0][RTW89_CHILE][7] = 68,
+       [2][0][RTW89_UKRAINE][7] = 56,
+       [2][0][RTW89_MEXICO][7] = 70,
+       [2][0][RTW89_CN][7] = 56,
+       [2][0][RTW89_QATAR][7] = 56,
+       [2][0][RTW89_UK][7] = 56,
+       [2][0][RTW89_FCC][8] = 70,
+       [2][0][RTW89_ETSI][8] = 56,
+       [2][0][RTW89_MKK][8] = 64,
+       [2][0][RTW89_IC][8] = 70,
+       [2][0][RTW89_KCC][8] = 66,
+       [2][0][RTW89_ACMA][8] = 56,
+       [2][0][RTW89_CHILE][8] = 68,
+       [2][0][RTW89_UKRAINE][8] = 56,
+       [2][0][RTW89_MEXICO][8] = 70,
+       [2][0][RTW89_CN][8] = 56,
+       [2][0][RTW89_QATAR][8] = 56,
+       [2][0][RTW89_UK][8] = 56,
+       [2][0][RTW89_FCC][9] = 68,
+       [2][0][RTW89_ETSI][9] = 56,
+       [2][0][RTW89_MKK][9] = 64,
+       [2][0][RTW89_IC][9] = 68,
+       [2][0][RTW89_KCC][9] = 66,
+       [2][0][RTW89_ACMA][9] = 56,
+       [2][0][RTW89_CHILE][9] = 68,
+       [2][0][RTW89_UKRAINE][9] = 56,
+       [2][0][RTW89_MEXICO][9] = 68,
+       [2][0][RTW89_CN][9] = 56,
+       [2][0][RTW89_QATAR][9] = 56,
+       [2][0][RTW89_UK][9] = 56,
+       [2][0][RTW89_FCC][10] = 68,
+       [2][0][RTW89_ETSI][10] = 56,
+       [2][0][RTW89_MKK][10] = 64,
+       [2][0][RTW89_IC][10] = 68,
+       [2][0][RTW89_KCC][10] = 66,
+       [2][0][RTW89_ACMA][10] = 56,
+       [2][0][RTW89_CHILE][10] = 68,
+       [2][0][RTW89_UKRAINE][10] = 56,
+       [2][0][RTW89_MEXICO][10] = 68,
+       [2][0][RTW89_CN][10] = 56,
+       [2][0][RTW89_QATAR][10] = 56,
+       [2][0][RTW89_UK][10] = 56,
+       [2][0][RTW89_FCC][11] = 50,
+       [2][0][RTW89_ETSI][11] = 56,
+       [2][0][RTW89_MKK][11] = 64,
+       [2][0][RTW89_IC][11] = 50,
+       [2][0][RTW89_KCC][11] = 66,
+       [2][0][RTW89_ACMA][11] = 56,
+       [2][0][RTW89_CHILE][11] = 68,
+       [2][0][RTW89_UKRAINE][11] = 56,
+       [2][0][RTW89_MEXICO][11] = 50,
+       [2][0][RTW89_CN][11] = 56,
+       [2][0][RTW89_QATAR][11] = 56,
+       [2][0][RTW89_UK][11] = 56,
+       [2][0][RTW89_FCC][12] = 46,
+       [2][0][RTW89_ETSI][12] = 56,
+       [2][0][RTW89_MKK][12] = 64,
+       [2][0][RTW89_IC][12] = 46,
+       [2][0][RTW89_KCC][12] = 66,
+       [2][0][RTW89_ACMA][12] = 56,
+       [2][0][RTW89_CHILE][12] = 68,
+       [2][0][RTW89_UKRAINE][12] = 56,
+       [2][0][RTW89_MEXICO][12] = 46,
+       [2][0][RTW89_CN][12] = 56,
+       [2][0][RTW89_QATAR][12] = 56,
+       [2][0][RTW89_UK][12] = 56,
+       [2][0][RTW89_FCC][13] = 127,
+       [2][0][RTW89_ETSI][13] = 127,
+       [2][0][RTW89_MKK][13] = 127,
+       [2][0][RTW89_IC][13] = 127,
+       [2][0][RTW89_KCC][13] = 127,
+       [2][0][RTW89_ACMA][13] = 127,
+       [2][0][RTW89_CHILE][13] = 127,
+       [2][0][RTW89_UKRAINE][13] = 127,
+       [2][0][RTW89_MEXICO][13] = 127,
+       [2][0][RTW89_CN][13] = 127,
+       [2][0][RTW89_QATAR][13] = 127,
+       [2][0][RTW89_UK][13] = 127,
+       [2][1][RTW89_FCC][0] = 54,
+       [2][1][RTW89_ETSI][0] = 44,
+       [2][1][RTW89_MKK][0] = 52,
+       [2][1][RTW89_IC][0] = 54,
+       [2][1][RTW89_KCC][0] = 54,
+       [2][1][RTW89_ACMA][0] = 44,
+       [2][1][RTW89_CHILE][0] = 58,
+       [2][1][RTW89_UKRAINE][0] = 44,
+       [2][1][RTW89_MEXICO][0] = 54,
+       [2][1][RTW89_CN][0] = 44,
+       [2][1][RTW89_QATAR][0] = 44,
+       [2][1][RTW89_UK][0] = 44,
+       [2][1][RTW89_FCC][1] = 54,
+       [2][1][RTW89_ETSI][1] = 44,
+       [2][1][RTW89_MKK][1] = 52,
+       [2][1][RTW89_IC][1] = 54,
+       [2][1][RTW89_KCC][1] = 54,
+       [2][1][RTW89_ACMA][1] = 44,
+       [2][1][RTW89_CHILE][1] = 56,
+       [2][1][RTW89_UKRAINE][1] = 44,
+       [2][1][RTW89_MEXICO][1] = 54,
+       [2][1][RTW89_CN][1] = 44,
+       [2][1][RTW89_QATAR][1] = 44,
+       [2][1][RTW89_UK][1] = 44,
+       [2][1][RTW89_FCC][2] = 58,
+       [2][1][RTW89_ETSI][2] = 44,
+       [2][1][RTW89_MKK][2] = 52,
+       [2][1][RTW89_IC][2] = 58,
+       [2][1][RTW89_KCC][2] = 54,
+       [2][1][RTW89_ACMA][2] = 44,
+       [2][1][RTW89_CHILE][2] = 56,
+       [2][1][RTW89_UKRAINE][2] = 44,
+       [2][1][RTW89_MEXICO][2] = 58,
+       [2][1][RTW89_CN][2] = 44,
+       [2][1][RTW89_QATAR][2] = 44,
+       [2][1][RTW89_UK][2] = 44,
+       [2][1][RTW89_FCC][3] = 62,
+       [2][1][RTW89_ETSI][3] = 44,
+       [2][1][RTW89_MKK][3] = 52,
+       [2][1][RTW89_IC][3] = 62,
+       [2][1][RTW89_KCC][3] = 54,
+       [2][1][RTW89_ACMA][3] = 44,
+       [2][1][RTW89_CHILE][3] = 56,
+       [2][1][RTW89_UKRAINE][3] = 44,
+       [2][1][RTW89_MEXICO][3] = 62,
+       [2][1][RTW89_CN][3] = 44,
+       [2][1][RTW89_QATAR][3] = 44,
+       [2][1][RTW89_UK][3] = 44,
+       [2][1][RTW89_FCC][4] = 64,
+       [2][1][RTW89_ETSI][4] = 44,
+       [2][1][RTW89_MKK][4] = 52,
+       [2][1][RTW89_IC][4] = 64,
+       [2][1][RTW89_KCC][4] = 52,
+       [2][1][RTW89_ACMA][4] = 44,
+       [2][1][RTW89_CHILE][4] = 56,
+       [2][1][RTW89_UKRAINE][4] = 44,
+       [2][1][RTW89_MEXICO][4] = 64,
+       [2][1][RTW89_CN][4] = 44,
+       [2][1][RTW89_QATAR][4] = 44,
+       [2][1][RTW89_UK][4] = 44,
+       [2][1][RTW89_FCC][5] = 80,
+       [2][1][RTW89_ETSI][5] = 44,
+       [2][1][RTW89_MKK][5] = 52,
+       [2][1][RTW89_IC][5] = 80,
+       [2][1][RTW89_KCC][5] = 52,
+       [2][1][RTW89_ACMA][5] = 44,
+       [2][1][RTW89_CHILE][5] = 56,
+       [2][1][RTW89_UKRAINE][5] = 44,
+       [2][1][RTW89_MEXICO][5] = 80,
+       [2][1][RTW89_CN][5] = 44,
+       [2][1][RTW89_QATAR][5] = 44,
+       [2][1][RTW89_UK][5] = 44,
+       [2][1][RTW89_FCC][6] = 62,
+       [2][1][RTW89_ETSI][6] = 44,
+       [2][1][RTW89_MKK][6] = 52,
+       [2][1][RTW89_IC][6] = 62,
+       [2][1][RTW89_KCC][6] = 52,
+       [2][1][RTW89_ACMA][6] = 44,
+       [2][1][RTW89_CHILE][6] = 56,
+       [2][1][RTW89_UKRAINE][6] = 44,
+       [2][1][RTW89_MEXICO][6] = 62,
+       [2][1][RTW89_CN][6] = 44,
+       [2][1][RTW89_QATAR][6] = 44,
+       [2][1][RTW89_UK][6] = 44,
+       [2][1][RTW89_FCC][7] = 62,
+       [2][1][RTW89_ETSI][7] = 44,
+       [2][1][RTW89_MKK][7] = 52,
+       [2][1][RTW89_IC][7] = 62,
+       [2][1][RTW89_KCC][7] = 52,
+       [2][1][RTW89_ACMA][7] = 44,
+       [2][1][RTW89_CHILE][7] = 56,
+       [2][1][RTW89_UKRAINE][7] = 44,
+       [2][1][RTW89_MEXICO][7] = 62,
+       [2][1][RTW89_CN][7] = 44,
+       [2][1][RTW89_QATAR][7] = 44,
+       [2][1][RTW89_UK][7] = 44,
+       [2][1][RTW89_FCC][8] = 58,
+       [2][1][RTW89_ETSI][8] = 44,
+       [2][1][RTW89_MKK][8] = 52,
+       [2][1][RTW89_IC][8] = 58,
+       [2][1][RTW89_KCC][8] = 52,
+       [2][1][RTW89_ACMA][8] = 44,
+       [2][1][RTW89_CHILE][8] = 56,
+       [2][1][RTW89_UKRAINE][8] = 44,
+       [2][1][RTW89_MEXICO][8] = 58,
+       [2][1][RTW89_CN][8] = 44,
+       [2][1][RTW89_QATAR][8] = 44,
+       [2][1][RTW89_UK][8] = 44,
+       [2][1][RTW89_FCC][9] = 54,
+       [2][1][RTW89_ETSI][9] = 44,
+       [2][1][RTW89_MKK][9] = 52,
+       [2][1][RTW89_IC][9] = 54,
+       [2][1][RTW89_KCC][9] = 54,
+       [2][1][RTW89_ACMA][9] = 44,
+       [2][1][RTW89_CHILE][9] = 56,
+       [2][1][RTW89_UKRAINE][9] = 44,
+       [2][1][RTW89_MEXICO][9] = 54,
+       [2][1][RTW89_CN][9] = 44,
+       [2][1][RTW89_QATAR][9] = 44,
+       [2][1][RTW89_UK][9] = 44,
+       [2][1][RTW89_FCC][10] = 54,
+       [2][1][RTW89_ETSI][10] = 44,
+       [2][1][RTW89_MKK][10] = 52,
+       [2][1][RTW89_IC][10] = 54,
+       [2][1][RTW89_KCC][10] = 54,
+       [2][1][RTW89_ACMA][10] = 44,
+       [2][1][RTW89_CHILE][10] = 56,
+       [2][1][RTW89_UKRAINE][10] = 44,
+       [2][1][RTW89_MEXICO][10] = 54,
+       [2][1][RTW89_CN][10] = 44,
+       [2][1][RTW89_QATAR][10] = 44,
+       [2][1][RTW89_UK][10] = 44,
+       [2][1][RTW89_FCC][11] = 38,
+       [2][1][RTW89_ETSI][11] = 44,
+       [2][1][RTW89_MKK][11] = 52,
+       [2][1][RTW89_IC][11] = 38,
+       [2][1][RTW89_KCC][11] = 54,
+       [2][1][RTW89_ACMA][11] = 44,
+       [2][1][RTW89_CHILE][11] = 56,
+       [2][1][RTW89_UKRAINE][11] = 44,
+       [2][1][RTW89_MEXICO][11] = 38,
+       [2][1][RTW89_CN][11] = 44,
+       [2][1][RTW89_QATAR][11] = 44,
+       [2][1][RTW89_UK][11] = 44,
+       [2][1][RTW89_FCC][12] = 34,
+       [2][1][RTW89_ETSI][12] = 42,
+       [2][1][RTW89_MKK][12] = 52,
+       [2][1][RTW89_IC][12] = 34,
+       [2][1][RTW89_KCC][12] = 54,
+       [2][1][RTW89_ACMA][12] = 42,
+       [2][1][RTW89_CHILE][12] = 56,
+       [2][1][RTW89_UKRAINE][12] = 42,
+       [2][1][RTW89_MEXICO][12] = 34,
+       [2][1][RTW89_CN][12] = 42,
+       [2][1][RTW89_QATAR][12] = 42,
+       [2][1][RTW89_UK][12] = 42,
+       [2][1][RTW89_FCC][13] = 127,
+       [2][1][RTW89_ETSI][13] = 127,
+       [2][1][RTW89_MKK][13] = 127,
+       [2][1][RTW89_IC][13] = 127,
+       [2][1][RTW89_KCC][13] = 127,
+       [2][1][RTW89_ACMA][13] = 127,
+       [2][1][RTW89_CHILE][13] = 127,
+       [2][1][RTW89_UKRAINE][13] = 127,
+       [2][1][RTW89_MEXICO][13] = 127,
+       [2][1][RTW89_CN][13] = 127,
+       [2][1][RTW89_QATAR][13] = 127,
+       [2][1][RTW89_UK][13] = 127,
+};
+
+const s8 rtw89_8852b_txpwr_lmt_ru_5g[RTW89_RU_NUM][RTW89_NTX_NUM]
+                                   [RTW89_REGD_NUM][RTW89_5G_CH_NUM] = {
+       [0][0][RTW89_WW][0] = 24,
+       [0][0][RTW89_WW][2] = 24,
+       [0][0][RTW89_WW][4] = 24,
+       [0][0][RTW89_WW][6] = 12,
+       [0][0][RTW89_WW][8] = 24,
+       [0][0][RTW89_WW][10] = 24,
+       [0][0][RTW89_WW][12] = 24,
+       [0][0][RTW89_WW][14] = 24,
+       [0][0][RTW89_WW][15] = 24,
+       [0][0][RTW89_WW][17] = 24,
+       [0][0][RTW89_WW][19] = 24,
+       [0][0][RTW89_WW][21] = 24,
+       [0][0][RTW89_WW][23] = 24,
+       [0][0][RTW89_WW][25] = 24,
+       [0][0][RTW89_WW][27] = 24,
+       [0][0][RTW89_WW][29] = 24,
+       [0][0][RTW89_WW][31] = 24,
+       [0][0][RTW89_WW][33] = 24,
+       [0][0][RTW89_WW][35] = 24,
+       [0][0][RTW89_WW][37] = 44,
+       [0][0][RTW89_WW][38] = 26,
+       [0][0][RTW89_WW][40] = 26,
+       [0][0][RTW89_WW][42] = 26,
+       [0][0][RTW89_WW][44] = 26,
+       [0][0][RTW89_WW][46] = 26,
+       [0][0][RTW89_WW][48] = 32,
+       [0][0][RTW89_WW][50] = 32,
+       [0][0][RTW89_WW][52] = 32,
+       [0][1][RTW89_WW][0] = 0,
+       [0][1][RTW89_WW][2] = 4,
+       [0][1][RTW89_WW][4] = 0,
+       [0][1][RTW89_WW][6] = 0,
+       [0][1][RTW89_WW][8] = 12,
+       [0][1][RTW89_WW][10] = 12,
+       [0][1][RTW89_WW][12] = 12,
+       [0][1][RTW89_WW][14] = 12,
+       [0][1][RTW89_WW][15] = 12,
+       [0][1][RTW89_WW][17] = 12,
+       [0][1][RTW89_WW][19] = 12,
+       [0][1][RTW89_WW][21] = 12,
+       [0][1][RTW89_WW][23] = 12,
+       [0][1][RTW89_WW][25] = 12,
+       [0][1][RTW89_WW][27] = 12,
+       [0][1][RTW89_WW][29] = 12,
+       [0][1][RTW89_WW][31] = 12,
+       [0][1][RTW89_WW][33] = 12,
+       [0][1][RTW89_WW][35] = 12,
+       [0][1][RTW89_WW][37] = 30,
+       [0][1][RTW89_WW][38] = 14,
+       [0][1][RTW89_WW][40] = 14,
+       [0][1][RTW89_WW][42] = 14,
+       [0][1][RTW89_WW][44] = 14,
+       [0][1][RTW89_WW][46] = 14,
+       [0][1][RTW89_WW][48] = 20,
+       [0][1][RTW89_WW][50] = 20,
+       [0][1][RTW89_WW][52] = 20,
+       [1][0][RTW89_WW][0] = 34,
+       [1][0][RTW89_WW][2] = 34,
+       [1][0][RTW89_WW][4] = 34,
+       [1][0][RTW89_WW][6] = 26,
+       [1][0][RTW89_WW][8] = 34,
+       [1][0][RTW89_WW][10] = 34,
+       [1][0][RTW89_WW][12] = 34,
+       [1][0][RTW89_WW][14] = 34,
+       [1][0][RTW89_WW][15] = 34,
+       [1][0][RTW89_WW][17] = 34,
+       [1][0][RTW89_WW][19] = 34,
+       [1][0][RTW89_WW][21] = 34,
+       [1][0][RTW89_WW][23] = 34,
+       [1][0][RTW89_WW][25] = 34,
+       [1][0][RTW89_WW][27] = 34,
+       [1][0][RTW89_WW][29] = 34,
+       [1][0][RTW89_WW][31] = 34,
+       [1][0][RTW89_WW][33] = 34,
+       [1][0][RTW89_WW][35] = 34,
+       [1][0][RTW89_WW][37] = 52,
+       [1][0][RTW89_WW][38] = 28,
+       [1][0][RTW89_WW][40] = 28,
+       [1][0][RTW89_WW][42] = 28,
+       [1][0][RTW89_WW][44] = 28,
+       [1][0][RTW89_WW][46] = 28,
+       [1][0][RTW89_WW][48] = 44,
+       [1][0][RTW89_WW][50] = 44,
+       [1][0][RTW89_WW][52] = 44,
+       [1][1][RTW89_WW][0] = 10,
+       [1][1][RTW89_WW][2] = 14,
+       [1][1][RTW89_WW][4] = 10,
+       [1][1][RTW89_WW][6] = 10,
+       [1][1][RTW89_WW][8] = 20,
+       [1][1][RTW89_WW][10] = 20,
+       [1][1][RTW89_WW][12] = 22,
+       [1][1][RTW89_WW][14] = 22,
+       [1][1][RTW89_WW][15] = 22,
+       [1][1][RTW89_WW][17] = 22,
+       [1][1][RTW89_WW][19] = 22,
+       [1][1][RTW89_WW][21] = 22,
+       [1][1][RTW89_WW][23] = 22,
+       [1][1][RTW89_WW][25] = 22,
+       [1][1][RTW89_WW][27] = 22,
+       [1][1][RTW89_WW][29] = 22,
+       [1][1][RTW89_WW][31] = 22,
+       [1][1][RTW89_WW][33] = 22,
+       [1][1][RTW89_WW][35] = 22,
+       [1][1][RTW89_WW][37] = 38,
+       [1][1][RTW89_WW][38] = 16,
+       [1][1][RTW89_WW][40] = 16,
+       [1][1][RTW89_WW][42] = 16,
+       [1][1][RTW89_WW][44] = 16,
+       [1][1][RTW89_WW][46] = 16,
+       [1][1][RTW89_WW][48] = 32,
+       [1][1][RTW89_WW][50] = 32,
+       [1][1][RTW89_WW][52] = 32,
+       [2][0][RTW89_WW][0] = 44,
+       [2][0][RTW89_WW][2] = 44,
+       [2][0][RTW89_WW][4] = 44,
+       [2][0][RTW89_WW][6] = 38,
+       [2][0][RTW89_WW][8] = 48,
+       [2][0][RTW89_WW][10] = 48,
+       [2][0][RTW89_WW][12] = 46,
+       [2][0][RTW89_WW][14] = 46,
+       [2][0][RTW89_WW][15] = 48,
+       [2][0][RTW89_WW][17] = 48,
+       [2][0][RTW89_WW][19] = 48,
+       [2][0][RTW89_WW][21] = 48,
+       [2][0][RTW89_WW][23] = 48,
+       [2][0][RTW89_WW][25] = 48,
+       [2][0][RTW89_WW][27] = 48,
+       [2][0][RTW89_WW][29] = 48,
+       [2][0][RTW89_WW][31] = 48,
+       [2][0][RTW89_WW][33] = 48,
+       [2][0][RTW89_WW][35] = 48,
+       [2][0][RTW89_WW][37] = 64,
+       [2][0][RTW89_WW][38] = 28,
+       [2][0][RTW89_WW][40] = 28,
+       [2][0][RTW89_WW][42] = 28,
+       [2][0][RTW89_WW][44] = 28,
+       [2][0][RTW89_WW][46] = 28,
+       [2][0][RTW89_WW][48] = 56,
+       [2][0][RTW89_WW][50] = 56,
+       [2][0][RTW89_WW][52] = 56,
+       [2][1][RTW89_WW][0] = 20,
+       [2][1][RTW89_WW][2] = 18,
+       [2][1][RTW89_WW][4] = 22,
+       [2][1][RTW89_WW][6] = 22,
+       [2][1][RTW89_WW][8] = 34,
+       [2][1][RTW89_WW][10] = 34,
+       [2][1][RTW89_WW][12] = 36,
+       [2][1][RTW89_WW][14] = 36,
+       [2][1][RTW89_WW][15] = 36,
+       [2][1][RTW89_WW][17] = 36,
+       [2][1][RTW89_WW][19] = 36,
+       [2][1][RTW89_WW][21] = 36,
+       [2][1][RTW89_WW][23] = 36,
+       [2][1][RTW89_WW][25] = 36,
+       [2][1][RTW89_WW][27] = 36,
+       [2][1][RTW89_WW][29] = 36,
+       [2][1][RTW89_WW][31] = 36,
+       [2][1][RTW89_WW][33] = 36,
+       [2][1][RTW89_WW][35] = 36,
+       [2][1][RTW89_WW][37] = 48,
+       [2][1][RTW89_WW][38] = 16,
+       [2][1][RTW89_WW][40] = 16,
+       [2][1][RTW89_WW][42] = 16,
+       [2][1][RTW89_WW][44] = 16,
+       [2][1][RTW89_WW][46] = 16,
+       [2][1][RTW89_WW][48] = 44,
+       [2][1][RTW89_WW][50] = 44,
+       [2][1][RTW89_WW][52] = 44,
+       [0][0][RTW89_FCC][0] = 52,
+       [0][0][RTW89_ETSI][0] = 24,
+       [0][0][RTW89_MKK][0] = 26,
+       [0][0][RTW89_IC][0] = 24,
+       [0][0][RTW89_KCC][0] = 44,
+       [0][0][RTW89_ACMA][0] = 24,
+       [0][0][RTW89_CHILE][0] = 40,
+       [0][0][RTW89_UKRAINE][0] = 24,
+       [0][0][RTW89_MEXICO][0] = 52,
+       [0][0][RTW89_CN][0] = 24,
+       [0][0][RTW89_QATAR][0] = 24,
+       [0][0][RTW89_UK][0] = 24,
+       [0][0][RTW89_FCC][2] = 52,
+       [0][0][RTW89_ETSI][2] = 24,
+       [0][0][RTW89_MKK][2] = 26,
+       [0][0][RTW89_IC][2] = 24,
+       [0][0][RTW89_KCC][2] = 44,
+       [0][0][RTW89_ACMA][2] = 24,
+       [0][0][RTW89_CHILE][2] = 38,
+       [0][0][RTW89_UKRAINE][2] = 24,
+       [0][0][RTW89_MEXICO][2] = 52,
+       [0][0][RTW89_CN][2] = 24,
+       [0][0][RTW89_QATAR][2] = 24,
+       [0][0][RTW89_UK][2] = 24,
+       [0][0][RTW89_FCC][4] = 52,
+       [0][0][RTW89_ETSI][4] = 24,
+       [0][0][RTW89_MKK][4] = 26,
+       [0][0][RTW89_IC][4] = 24,
+       [0][0][RTW89_KCC][4] = 44,
+       [0][0][RTW89_ACMA][4] = 24,
+       [0][0][RTW89_CHILE][4] = 38,
+       [0][0][RTW89_UKRAINE][4] = 24,
+       [0][0][RTW89_MEXICO][4] = 52,
+       [0][0][RTW89_CN][4] = 24,
+       [0][0][RTW89_QATAR][4] = 24,
+       [0][0][RTW89_UK][4] = 24,
+       [0][0][RTW89_FCC][6] = 52,
+       [0][0][RTW89_ETSI][6] = 24,
+       [0][0][RTW89_MKK][6] = 26,
+       [0][0][RTW89_IC][6] = 24,
+       [0][0][RTW89_KCC][6] = 12,
+       [0][0][RTW89_ACMA][6] = 24,
+       [0][0][RTW89_CHILE][6] = 40,
+       [0][0][RTW89_UKRAINE][6] = 24,
+       [0][0][RTW89_MEXICO][6] = 52,
+       [0][0][RTW89_CN][6] = 24,
+       [0][0][RTW89_QATAR][6] = 24,
+       [0][0][RTW89_UK][6] = 24,
+       [0][0][RTW89_FCC][8] = 52,
+       [0][0][RTW89_ETSI][8] = 24,
+       [0][0][RTW89_MKK][8] = 26,
+       [0][0][RTW89_IC][8] = 52,
+       [0][0][RTW89_KCC][8] = 46,
+       [0][0][RTW89_ACMA][8] = 24,
+       [0][0][RTW89_CHILE][8] = 64,
+       [0][0][RTW89_UKRAINE][8] = 24,
+       [0][0][RTW89_MEXICO][8] = 52,
+       [0][0][RTW89_CN][8] = 24,
+       [0][0][RTW89_QATAR][8] = 24,
+       [0][0][RTW89_UK][8] = 24,
+       [0][0][RTW89_FCC][10] = 52,
+       [0][0][RTW89_ETSI][10] = 24,
+       [0][0][RTW89_MKK][10] = 26,
+       [0][0][RTW89_IC][10] = 52,
+       [0][0][RTW89_KCC][10] = 46,
+       [0][0][RTW89_ACMA][10] = 24,
+       [0][0][RTW89_CHILE][10] = 64,
+       [0][0][RTW89_UKRAINE][10] = 24,
+       [0][0][RTW89_MEXICO][10] = 52,
+       [0][0][RTW89_CN][10] = 24,
+       [0][0][RTW89_QATAR][10] = 24,
+       [0][0][RTW89_UK][10] = 24,
+       [0][0][RTW89_FCC][12] = 52,
+       [0][0][RTW89_ETSI][12] = 24,
+       [0][0][RTW89_MKK][12] = 24,
+       [0][0][RTW89_IC][12] = 52,
+       [0][0][RTW89_KCC][12] = 42,
+       [0][0][RTW89_ACMA][12] = 24,
+       [0][0][RTW89_CHILE][12] = 64,
+       [0][0][RTW89_UKRAINE][12] = 24,
+       [0][0][RTW89_MEXICO][12] = 52,
+       [0][0][RTW89_CN][12] = 24,
+       [0][0][RTW89_QATAR][12] = 24,
+       [0][0][RTW89_UK][12] = 24,
+       [0][0][RTW89_FCC][14] = 52,
+       [0][0][RTW89_ETSI][14] = 24,
+       [0][0][RTW89_MKK][14] = 24,
+       [0][0][RTW89_IC][14] = 52,
+       [0][0][RTW89_KCC][14] = 42,
+       [0][0][RTW89_ACMA][14] = 24,
+       [0][0][RTW89_CHILE][14] = 64,
+       [0][0][RTW89_UKRAINE][14] = 24,
+       [0][0][RTW89_MEXICO][14] = 52,
+       [0][0][RTW89_CN][14] = 24,
+       [0][0][RTW89_QATAR][14] = 24,
+       [0][0][RTW89_UK][14] = 24,
+       [0][0][RTW89_FCC][15] = 52,
+       [0][0][RTW89_ETSI][15] = 24,
+       [0][0][RTW89_MKK][15] = 46,
+       [0][0][RTW89_IC][15] = 52,
+       [0][0][RTW89_KCC][15] = 44,
+       [0][0][RTW89_ACMA][15] = 24,
+       [0][0][RTW89_CHILE][15] = 60,
+       [0][0][RTW89_UKRAINE][15] = 24,
+       [0][0][RTW89_MEXICO][15] = 52,
+       [0][0][RTW89_CN][15] = 127,
+       [0][0][RTW89_QATAR][15] = 24,
+       [0][0][RTW89_UK][15] = 24,
+       [0][0][RTW89_FCC][17] = 52,
+       [0][0][RTW89_ETSI][17] = 24,
+       [0][0][RTW89_MKK][17] = 48,
+       [0][0][RTW89_IC][17] = 52,
+       [0][0][RTW89_KCC][17] = 44,
+       [0][0][RTW89_ACMA][17] = 24,
+       [0][0][RTW89_CHILE][17] = 60,
+       [0][0][RTW89_UKRAINE][17] = 24,
+       [0][0][RTW89_MEXICO][17] = 52,
+       [0][0][RTW89_CN][17] = 127,
+       [0][0][RTW89_QATAR][17] = 24,
+       [0][0][RTW89_UK][17] = 24,
+       [0][0][RTW89_FCC][19] = 52,
+       [0][0][RTW89_ETSI][19] = 24,
+       [0][0][RTW89_MKK][19] = 48,
+       [0][0][RTW89_IC][19] = 52,
+       [0][0][RTW89_KCC][19] = 44,
+       [0][0][RTW89_ACMA][19] = 24,
+       [0][0][RTW89_CHILE][19] = 60,
+       [0][0][RTW89_UKRAINE][19] = 24,
+       [0][0][RTW89_MEXICO][19] = 52,
+       [0][0][RTW89_CN][19] = 127,
+       [0][0][RTW89_QATAR][19] = 24,
+       [0][0][RTW89_UK][19] = 24,
+       [0][0][RTW89_FCC][21] = 52,
+       [0][0][RTW89_ETSI][21] = 24,
+       [0][0][RTW89_MKK][21] = 48,
+       [0][0][RTW89_IC][21] = 52,
+       [0][0][RTW89_KCC][21] = 44,
+       [0][0][RTW89_ACMA][21] = 24,
+       [0][0][RTW89_CHILE][21] = 62,
+       [0][0][RTW89_UKRAINE][21] = 24,
+       [0][0][RTW89_MEXICO][21] = 52,
+       [0][0][RTW89_CN][21] = 127,
+       [0][0][RTW89_QATAR][21] = 24,
+       [0][0][RTW89_UK][21] = 24,
+       [0][0][RTW89_FCC][23] = 52,
+       [0][0][RTW89_ETSI][23] = 24,
+       [0][0][RTW89_MKK][23] = 48,
+       [0][0][RTW89_IC][23] = 52,
+       [0][0][RTW89_KCC][23] = 44,
+       [0][0][RTW89_ACMA][23] = 24,
+       [0][0][RTW89_CHILE][23] = 62,
+       [0][0][RTW89_UKRAINE][23] = 24,
+       [0][0][RTW89_MEXICO][23] = 52,
+       [0][0][RTW89_CN][23] = 127,
+       [0][0][RTW89_QATAR][23] = 24,
+       [0][0][RTW89_UK][23] = 24,
+       [0][0][RTW89_FCC][25] = 52,
+       [0][0][RTW89_ETSI][25] = 24,
+       [0][0][RTW89_MKK][25] = 48,
+       [0][0][RTW89_IC][25] = 127,
+       [0][0][RTW89_KCC][25] = 44,
+       [0][0][RTW89_ACMA][25] = 127,
+       [0][0][RTW89_CHILE][25] = 62,
+       [0][0][RTW89_UKRAINE][25] = 24,
+       [0][0][RTW89_MEXICO][25] = 52,
+       [0][0][RTW89_CN][25] = 127,
+       [0][0][RTW89_QATAR][25] = 24,
+       [0][0][RTW89_UK][25] = 24,
+       [0][0][RTW89_FCC][27] = 52,
+       [0][0][RTW89_ETSI][27] = 24,
+       [0][0][RTW89_MKK][27] = 48,
+       [0][0][RTW89_IC][27] = 127,
+       [0][0][RTW89_KCC][27] = 44,
+       [0][0][RTW89_ACMA][27] = 127,
+       [0][0][RTW89_CHILE][27] = 62,
+       [0][0][RTW89_UKRAINE][27] = 24,
+       [0][0][RTW89_MEXICO][27] = 52,
+       [0][0][RTW89_CN][27] = 127,
+       [0][0][RTW89_QATAR][27] = 24,
+       [0][0][RTW89_UK][27] = 24,
+       [0][0][RTW89_FCC][29] = 52,
+       [0][0][RTW89_ETSI][29] = 24,
+       [0][0][RTW89_MKK][29] = 48,
+       [0][0][RTW89_IC][29] = 127,
+       [0][0][RTW89_KCC][29] = 44,
+       [0][0][RTW89_ACMA][29] = 127,
+       [0][0][RTW89_CHILE][29] = 60,
+       [0][0][RTW89_UKRAINE][29] = 24,
+       [0][0][RTW89_MEXICO][29] = 52,
+       [0][0][RTW89_CN][29] = 127,
+       [0][0][RTW89_QATAR][29] = 24,
+       [0][0][RTW89_UK][29] = 24,
+       [0][0][RTW89_FCC][31] = 52,
+       [0][0][RTW89_ETSI][31] = 24,
+       [0][0][RTW89_MKK][31] = 48,
+       [0][0][RTW89_IC][31] = 52,
+       [0][0][RTW89_KCC][31] = 44,
+       [0][0][RTW89_ACMA][31] = 24,
+       [0][0][RTW89_CHILE][31] = 60,
+       [0][0][RTW89_UKRAINE][31] = 24,
+       [0][0][RTW89_MEXICO][31] = 52,
+       [0][0][RTW89_CN][31] = 127,
+       [0][0][RTW89_QATAR][31] = 24,
+       [0][0][RTW89_UK][31] = 24,
+       [0][0][RTW89_FCC][33] = 52,
+       [0][0][RTW89_ETSI][33] = 24,
+       [0][0][RTW89_MKK][33] = 48,
+       [0][0][RTW89_IC][33] = 52,
+       [0][0][RTW89_KCC][33] = 44,
+       [0][0][RTW89_ACMA][33] = 24,
+       [0][0][RTW89_CHILE][33] = 60,
+       [0][0][RTW89_UKRAINE][33] = 24,
+       [0][0][RTW89_MEXICO][33] = 52,
+       [0][0][RTW89_CN][33] = 127,
+       [0][0][RTW89_QATAR][33] = 24,
+       [0][0][RTW89_UK][33] = 24,
+       [0][0][RTW89_FCC][35] = 52,
+       [0][0][RTW89_ETSI][35] = 24,
+       [0][0][RTW89_MKK][35] = 48,
+       [0][0][RTW89_IC][35] = 52,
+       [0][0][RTW89_KCC][35] = 44,
+       [0][0][RTW89_ACMA][35] = 24,
+       [0][0][RTW89_CHILE][35] = 60,
+       [0][0][RTW89_UKRAINE][35] = 24,
+       [0][0][RTW89_MEXICO][35] = 52,
+       [0][0][RTW89_CN][35] = 127,
+       [0][0][RTW89_QATAR][35] = 24,
+       [0][0][RTW89_UK][35] = 24,
+       [0][0][RTW89_FCC][37] = 52,
+       [0][0][RTW89_ETSI][37] = 127,
+       [0][0][RTW89_MKK][37] = 44,
+       [0][0][RTW89_IC][37] = 52,
+       [0][0][RTW89_KCC][37] = 44,
+       [0][0][RTW89_ACMA][37] = 52,
+       [0][0][RTW89_CHILE][37] = 62,
+       [0][0][RTW89_UKRAINE][37] = 127,
+       [0][0][RTW89_MEXICO][37] = 52,
+       [0][0][RTW89_CN][37] = 127,
+       [0][0][RTW89_QATAR][37] = 127,
+       [0][0][RTW89_UK][37] = 56,
+       [0][0][RTW89_FCC][38] = 84,
+       [0][0][RTW89_ETSI][38] = 28,
+       [0][0][RTW89_MKK][38] = 127,
+       [0][0][RTW89_IC][38] = 84,
+       [0][0][RTW89_KCC][38] = 44,
+       [0][0][RTW89_ACMA][38] = 84,
+       [0][0][RTW89_CHILE][38] = 60,
+       [0][0][RTW89_UKRAINE][38] = 28,
+       [0][0][RTW89_MEXICO][38] = 84,
+       [0][0][RTW89_CN][38] = 62,
+       [0][0][RTW89_QATAR][38] = 28,
+       [0][0][RTW89_UK][38] = 26,
+       [0][0][RTW89_FCC][40] = 84,
+       [0][0][RTW89_ETSI][40] = 28,
+       [0][0][RTW89_MKK][40] = 127,
+       [0][0][RTW89_IC][40] = 84,
+       [0][0][RTW89_KCC][40] = 44,
+       [0][0][RTW89_ACMA][40] = 84,
+       [0][0][RTW89_CHILE][40] = 60,
+       [0][0][RTW89_UKRAINE][40] = 28,
+       [0][0][RTW89_MEXICO][40] = 84,
+       [0][0][RTW89_CN][40] = 62,
+       [0][0][RTW89_QATAR][40] = 28,
+       [0][0][RTW89_UK][40] = 26,
+       [0][0][RTW89_FCC][42] = 84,
+       [0][0][RTW89_ETSI][42] = 28,
+       [0][0][RTW89_MKK][42] = 127,
+       [0][0][RTW89_IC][42] = 84,
+       [0][0][RTW89_KCC][42] = 44,
+       [0][0][RTW89_ACMA][42] = 84,
+       [0][0][RTW89_CHILE][42] = 64,
+       [0][0][RTW89_UKRAINE][42] = 28,
+       [0][0][RTW89_MEXICO][42] = 84,
+       [0][0][RTW89_CN][42] = 62,
+       [0][0][RTW89_QATAR][42] = 28,
+       [0][0][RTW89_UK][42] = 26,
+       [0][0][RTW89_FCC][44] = 84,
+       [0][0][RTW89_ETSI][44] = 28,
+       [0][0][RTW89_MKK][44] = 127,
+       [0][0][RTW89_IC][44] = 84,
+       [0][0][RTW89_KCC][44] = 44,
+       [0][0][RTW89_ACMA][44] = 84,
+       [0][0][RTW89_CHILE][44] = 60,
+       [0][0][RTW89_UKRAINE][44] = 28,
+       [0][0][RTW89_MEXICO][44] = 84,
+       [0][0][RTW89_CN][44] = 62,
+       [0][0][RTW89_QATAR][44] = 28,
+       [0][0][RTW89_UK][44] = 26,
+       [0][0][RTW89_FCC][46] = 84,
+       [0][0][RTW89_ETSI][46] = 28,
+       [0][0][RTW89_MKK][46] = 127,
+       [0][0][RTW89_IC][46] = 84,
+       [0][0][RTW89_KCC][46] = 44,
+       [0][0][RTW89_ACMA][46] = 84,
+       [0][0][RTW89_CHILE][46] = 60,
+       [0][0][RTW89_UKRAINE][46] = 28,
+       [0][0][RTW89_MEXICO][46] = 84,
+       [0][0][RTW89_CN][46] = 62,
+       [0][0][RTW89_QATAR][46] = 28,
+       [0][0][RTW89_UK][46] = 26,
+       [0][0][RTW89_FCC][48] = 32,
+       [0][0][RTW89_ETSI][48] = 127,
+       [0][0][RTW89_MKK][48] = 127,
+       [0][0][RTW89_IC][48] = 127,
+       [0][0][RTW89_KCC][48] = 127,
+       [0][0][RTW89_ACMA][48] = 127,
+       [0][0][RTW89_CHILE][48] = 127,
+       [0][0][RTW89_UKRAINE][48] = 127,
+       [0][0][RTW89_MEXICO][48] = 127,
+       [0][0][RTW89_CN][48] = 127,
+       [0][0][RTW89_QATAR][48] = 127,
+       [0][0][RTW89_UK][48] = 127,
+       [0][0][RTW89_FCC][50] = 32,
+       [0][0][RTW89_ETSI][50] = 127,
+       [0][0][RTW89_MKK][50] = 127,
+       [0][0][RTW89_IC][50] = 127,
+       [0][0][RTW89_KCC][50] = 127,
+       [0][0][RTW89_ACMA][50] = 127,
+       [0][0][RTW89_CHILE][50] = 127,
+       [0][0][RTW89_UKRAINE][50] = 127,
+       [0][0][RTW89_MEXICO][50] = 127,
+       [0][0][RTW89_CN][50] = 127,
+       [0][0][RTW89_QATAR][50] = 127,
+       [0][0][RTW89_UK][50] = 127,
+       [0][0][RTW89_FCC][52] = 32,
+       [0][0][RTW89_ETSI][52] = 127,
+       [0][0][RTW89_MKK][52] = 127,
+       [0][0][RTW89_IC][52] = 127,
+       [0][0][RTW89_KCC][52] = 127,
+       [0][0][RTW89_ACMA][52] = 127,
+       [0][0][RTW89_CHILE][52] = 127,
+       [0][0][RTW89_UKRAINE][52] = 127,
+       [0][0][RTW89_MEXICO][52] = 127,
+       [0][0][RTW89_CN][52] = 127,
+       [0][0][RTW89_QATAR][52] = 127,
+       [0][0][RTW89_UK][52] = 127,
+       [0][1][RTW89_FCC][0] = 34,
+       [0][1][RTW89_ETSI][0] = 12,
+       [0][1][RTW89_MKK][0] = 12,
+       [0][1][RTW89_IC][0] = 0,
+       [0][1][RTW89_KCC][0] = 28,
+       [0][1][RTW89_ACMA][0] = 12,
+       [0][1][RTW89_CHILE][0] = 14,
+       [0][1][RTW89_UKRAINE][0] = 12,
+       [0][1][RTW89_MEXICO][0] = 34,
+       [0][1][RTW89_CN][0] = 12,
+       [0][1][RTW89_QATAR][0] = 12,
+       [0][1][RTW89_UK][0] = 12,
+       [0][1][RTW89_FCC][2] = 38,
+       [0][1][RTW89_ETSI][2] = 12,
+       [0][1][RTW89_MKK][2] = 12,
+       [0][1][RTW89_IC][2] = 4,
+       [0][1][RTW89_KCC][2] = 28,
+       [0][1][RTW89_ACMA][2] = 12,
+       [0][1][RTW89_CHILE][2] = 12,
+       [0][1][RTW89_UKRAINE][2] = 12,
+       [0][1][RTW89_MEXICO][2] = 38,
+       [0][1][RTW89_CN][2] = 12,
+       [0][1][RTW89_QATAR][2] = 12,
+       [0][1][RTW89_UK][2] = 12,
+       [0][1][RTW89_FCC][4] = 34,
+       [0][1][RTW89_ETSI][4] = 12,
+       [0][1][RTW89_MKK][4] = 14,
+       [0][1][RTW89_IC][4] = 0,
+       [0][1][RTW89_KCC][4] = 28,
+       [0][1][RTW89_ACMA][4] = 12,
+       [0][1][RTW89_CHILE][4] = 12,
+       [0][1][RTW89_UKRAINE][4] = 12,
+       [0][1][RTW89_MEXICO][4] = 34,
+       [0][1][RTW89_CN][4] = 12,
+       [0][1][RTW89_QATAR][4] = 12,
+       [0][1][RTW89_UK][4] = 12,
+       [0][1][RTW89_FCC][6] = 34,
+       [0][1][RTW89_ETSI][6] = 12,
+       [0][1][RTW89_MKK][6] = 14,
+       [0][1][RTW89_IC][6] = 0,
+       [0][1][RTW89_KCC][6] = 2,
+       [0][1][RTW89_ACMA][6] = 12,
+       [0][1][RTW89_CHILE][6] = 12,
+       [0][1][RTW89_UKRAINE][6] = 12,
+       [0][1][RTW89_MEXICO][6] = 34,
+       [0][1][RTW89_CN][6] = 12,
+       [0][1][RTW89_QATAR][6] = 12,
+       [0][1][RTW89_UK][6] = 12,
+       [0][1][RTW89_FCC][8] = 34,
+       [0][1][RTW89_ETSI][8] = 12,
+       [0][1][RTW89_MKK][8] = 14,
+       [0][1][RTW89_IC][8] = 34,
+       [0][1][RTW89_KCC][8] = 30,
+       [0][1][RTW89_ACMA][8] = 12,
+       [0][1][RTW89_CHILE][8] = 50,
+       [0][1][RTW89_UKRAINE][8] = 12,
+       [0][1][RTW89_MEXICO][8] = 34,
+       [0][1][RTW89_CN][8] = 12,
+       [0][1][RTW89_QATAR][8] = 12,
+       [0][1][RTW89_UK][8] = 12,
+       [0][1][RTW89_FCC][10] = 34,
+       [0][1][RTW89_ETSI][10] = 12,
+       [0][1][RTW89_MKK][10] = 14,
+       [0][1][RTW89_IC][10] = 34,
+       [0][1][RTW89_KCC][10] = 30,
+       [0][1][RTW89_ACMA][10] = 12,
+       [0][1][RTW89_CHILE][10] = 50,
+       [0][1][RTW89_UKRAINE][10] = 12,
+       [0][1][RTW89_MEXICO][10] = 34,
+       [0][1][RTW89_CN][10] = 12,
+       [0][1][RTW89_QATAR][10] = 12,
+       [0][1][RTW89_UK][10] = 12,
+       [0][1][RTW89_FCC][12] = 38,
+       [0][1][RTW89_ETSI][12] = 12,
+       [0][1][RTW89_MKK][12] = 12,
+       [0][1][RTW89_IC][12] = 38,
+       [0][1][RTW89_KCC][12] = 30,
+       [0][1][RTW89_ACMA][12] = 12,
+       [0][1][RTW89_CHILE][12] = 50,
+       [0][1][RTW89_UKRAINE][12] = 12,
+       [0][1][RTW89_MEXICO][12] = 38,
+       [0][1][RTW89_CN][12] = 12,
+       [0][1][RTW89_QATAR][12] = 12,
+       [0][1][RTW89_UK][12] = 12,
+       [0][1][RTW89_FCC][14] = 34,
+       [0][1][RTW89_ETSI][14] = 12,
+       [0][1][RTW89_MKK][14] = 12,
+       [0][1][RTW89_IC][14] = 34,
+       [0][1][RTW89_KCC][14] = 30,
+       [0][1][RTW89_ACMA][14] = 12,
+       [0][1][RTW89_CHILE][14] = 48,
+       [0][1][RTW89_UKRAINE][14] = 12,
+       [0][1][RTW89_MEXICO][14] = 34,
+       [0][1][RTW89_CN][14] = 12,
+       [0][1][RTW89_QATAR][14] = 12,
+       [0][1][RTW89_UK][14] = 12,
+       [0][1][RTW89_FCC][15] = 34,
+       [0][1][RTW89_ETSI][15] = 12,
+       [0][1][RTW89_MKK][15] = 32,
+       [0][1][RTW89_IC][15] = 34,
+       [0][1][RTW89_KCC][15] = 30,
+       [0][1][RTW89_ACMA][15] = 12,
+       [0][1][RTW89_CHILE][15] = 52,
+       [0][1][RTW89_UKRAINE][15] = 12,
+       [0][1][RTW89_MEXICO][15] = 34,
+       [0][1][RTW89_CN][15] = 127,
+       [0][1][RTW89_QATAR][15] = 12,
+       [0][1][RTW89_UK][15] = 12,
+       [0][1][RTW89_FCC][17] = 34,
+       [0][1][RTW89_ETSI][17] = 12,
+       [0][1][RTW89_MKK][17] = 34,
+       [0][1][RTW89_IC][17] = 34,
+       [0][1][RTW89_KCC][17] = 30,
+       [0][1][RTW89_ACMA][17] = 12,
+       [0][1][RTW89_CHILE][17] = 52,
+       [0][1][RTW89_UKRAINE][17] = 12,
+       [0][1][RTW89_MEXICO][17] = 34,
+       [0][1][RTW89_CN][17] = 127,
+       [0][1][RTW89_QATAR][17] = 12,
+       [0][1][RTW89_UK][17] = 12,
+       [0][1][RTW89_FCC][19] = 38,
+       [0][1][RTW89_ETSI][19] = 12,
+       [0][1][RTW89_MKK][19] = 34,
+       [0][1][RTW89_IC][19] = 38,
+       [0][1][RTW89_KCC][19] = 30,
+       [0][1][RTW89_ACMA][19] = 12,
+       [0][1][RTW89_CHILE][19] = 52,
+       [0][1][RTW89_UKRAINE][19] = 12,
+       [0][1][RTW89_MEXICO][19] = 38,
+       [0][1][RTW89_CN][19] = 127,
+       [0][1][RTW89_QATAR][19] = 12,
+       [0][1][RTW89_UK][19] = 12,
+       [0][1][RTW89_FCC][21] = 38,
+       [0][1][RTW89_ETSI][21] = 12,
+       [0][1][RTW89_MKK][21] = 34,
+       [0][1][RTW89_IC][21] = 38,
+       [0][1][RTW89_KCC][21] = 30,
+       [0][1][RTW89_ACMA][21] = 12,
+       [0][1][RTW89_CHILE][21] = 52,
+       [0][1][RTW89_UKRAINE][21] = 12,
+       [0][1][RTW89_MEXICO][21] = 38,
+       [0][1][RTW89_CN][21] = 127,
+       [0][1][RTW89_QATAR][21] = 12,
+       [0][1][RTW89_UK][21] = 12,
+       [0][1][RTW89_FCC][23] = 38,
+       [0][1][RTW89_ETSI][23] = 12,
+       [0][1][RTW89_MKK][23] = 34,
+       [0][1][RTW89_IC][23] = 38,
+       [0][1][RTW89_KCC][23] = 30,
+       [0][1][RTW89_ACMA][23] = 12,
+       [0][1][RTW89_CHILE][23] = 52,
+       [0][1][RTW89_UKRAINE][23] = 12,
+       [0][1][RTW89_MEXICO][23] = 38,
+       [0][1][RTW89_CN][23] = 127,
+       [0][1][RTW89_QATAR][23] = 12,
+       [0][1][RTW89_UK][23] = 12,
+       [0][1][RTW89_FCC][25] = 38,
+       [0][1][RTW89_ETSI][25] = 12,
+       [0][1][RTW89_MKK][25] = 34,
+       [0][1][RTW89_IC][25] = 127,
+       [0][1][RTW89_KCC][25] = 30,
+       [0][1][RTW89_ACMA][25] = 127,
+       [0][1][RTW89_CHILE][25] = 52,
+       [0][1][RTW89_UKRAINE][25] = 12,
+       [0][1][RTW89_MEXICO][25] = 38,
+       [0][1][RTW89_CN][25] = 127,
+       [0][1][RTW89_QATAR][25] = 12,
+       [0][1][RTW89_UK][25] = 12,
+       [0][1][RTW89_FCC][27] = 38,
+       [0][1][RTW89_ETSI][27] = 12,
+       [0][1][RTW89_MKK][27] = 34,
+       [0][1][RTW89_IC][27] = 127,
+       [0][1][RTW89_KCC][27] = 30,
+       [0][1][RTW89_ACMA][27] = 127,
+       [0][1][RTW89_CHILE][27] = 52,
+       [0][1][RTW89_UKRAINE][27] = 12,
+       [0][1][RTW89_MEXICO][27] = 38,
+       [0][1][RTW89_CN][27] = 127,
+       [0][1][RTW89_QATAR][27] = 12,
+       [0][1][RTW89_UK][27] = 12,
+       [0][1][RTW89_FCC][29] = 38,
+       [0][1][RTW89_ETSI][29] = 12,
+       [0][1][RTW89_MKK][29] = 34,
+       [0][1][RTW89_IC][29] = 127,
+       [0][1][RTW89_KCC][29] = 30,
+       [0][1][RTW89_ACMA][29] = 127,
+       [0][1][RTW89_CHILE][29] = 52,
+       [0][1][RTW89_UKRAINE][29] = 12,
+       [0][1][RTW89_MEXICO][29] = 38,
+       [0][1][RTW89_CN][29] = 127,
+       [0][1][RTW89_QATAR][29] = 12,
+       [0][1][RTW89_UK][29] = 12,
+       [0][1][RTW89_FCC][31] = 38,
+       [0][1][RTW89_ETSI][31] = 12,
+       [0][1][RTW89_MKK][31] = 34,
+       [0][1][RTW89_IC][31] = 34,
+       [0][1][RTW89_KCC][31] = 30,
+       [0][1][RTW89_ACMA][31] = 12,
+       [0][1][RTW89_CHILE][31] = 52,
+       [0][1][RTW89_UKRAINE][31] = 12,
+       [0][1][RTW89_MEXICO][31] = 38,
+       [0][1][RTW89_CN][31] = 127,
+       [0][1][RTW89_QATAR][31] = 12,
+       [0][1][RTW89_UK][31] = 12,
+       [0][1][RTW89_FCC][33] = 34,
+       [0][1][RTW89_ETSI][33] = 12,
+       [0][1][RTW89_MKK][33] = 34,
+       [0][1][RTW89_IC][33] = 34,
+       [0][1][RTW89_KCC][33] = 30,
+       [0][1][RTW89_ACMA][33] = 12,
+       [0][1][RTW89_CHILE][33] = 52,
+       [0][1][RTW89_UKRAINE][33] = 12,
+       [0][1][RTW89_MEXICO][33] = 34,
+       [0][1][RTW89_CN][33] = 127,
+       [0][1][RTW89_QATAR][33] = 12,
+       [0][1][RTW89_UK][33] = 12,
+       [0][1][RTW89_FCC][35] = 34,
+       [0][1][RTW89_ETSI][35] = 12,
+       [0][1][RTW89_MKK][35] = 34,
+       [0][1][RTW89_IC][35] = 34,
+       [0][1][RTW89_KCC][35] = 30,
+       [0][1][RTW89_ACMA][35] = 12,
+       [0][1][RTW89_CHILE][35] = 52,
+       [0][1][RTW89_UKRAINE][35] = 12,
+       [0][1][RTW89_MEXICO][35] = 34,
+       [0][1][RTW89_CN][35] = 127,
+       [0][1][RTW89_QATAR][35] = 12,
+       [0][1][RTW89_UK][35] = 12,
+       [0][1][RTW89_FCC][37] = 38,
+       [0][1][RTW89_ETSI][37] = 127,
+       [0][1][RTW89_MKK][37] = 34,
+       [0][1][RTW89_IC][37] = 38,
+       [0][1][RTW89_KCC][37] = 30,
+       [0][1][RTW89_ACMA][37] = 38,
+       [0][1][RTW89_CHILE][37] = 52,
+       [0][1][RTW89_UKRAINE][37] = 127,
+       [0][1][RTW89_MEXICO][37] = 38,
+       [0][1][RTW89_CN][37] = 127,
+       [0][1][RTW89_QATAR][37] = 127,
+       [0][1][RTW89_UK][37] = 44,
+       [0][1][RTW89_FCC][38] = 82,
+       [0][1][RTW89_ETSI][38] = 16,
+       [0][1][RTW89_MKK][38] = 127,
+       [0][1][RTW89_IC][38] = 82,
+       [0][1][RTW89_KCC][38] = 30,
+       [0][1][RTW89_ACMA][38] = 84,
+       [0][1][RTW89_CHILE][38] = 52,
+       [0][1][RTW89_UKRAINE][38] = 16,
+       [0][1][RTW89_MEXICO][38] = 82,
+       [0][1][RTW89_CN][38] = 50,
+       [0][1][RTW89_QATAR][38] = 16,
+       [0][1][RTW89_UK][38] = 14,
+       [0][1][RTW89_FCC][40] = 82,
+       [0][1][RTW89_ETSI][40] = 16,
+       [0][1][RTW89_MKK][40] = 127,
+       [0][1][RTW89_IC][40] = 82,
+       [0][1][RTW89_KCC][40] = 30,
+       [0][1][RTW89_ACMA][40] = 84,
+       [0][1][RTW89_CHILE][40] = 52,
+       [0][1][RTW89_UKRAINE][40] = 16,
+       [0][1][RTW89_MEXICO][40] = 82,
+       [0][1][RTW89_CN][40] = 50,
+       [0][1][RTW89_QATAR][40] = 16,
+       [0][1][RTW89_UK][40] = 14,
+       [0][1][RTW89_FCC][42] = 82,
+       [0][1][RTW89_ETSI][42] = 16,
+       [0][1][RTW89_MKK][42] = 127,
+       [0][1][RTW89_IC][42] = 82,
+       [0][1][RTW89_KCC][42] = 30,
+       [0][1][RTW89_ACMA][42] = 84,
+       [0][1][RTW89_CHILE][42] = 54,
+       [0][1][RTW89_UKRAINE][42] = 16,
+       [0][1][RTW89_MEXICO][42] = 82,
+       [0][1][RTW89_CN][42] = 50,
+       [0][1][RTW89_QATAR][42] = 16,
+       [0][1][RTW89_UK][42] = 14,
+       [0][1][RTW89_FCC][44] = 82,
+       [0][1][RTW89_ETSI][44] = 16,
+       [0][1][RTW89_MKK][44] = 127,
+       [0][1][RTW89_IC][44] = 82,
+       [0][1][RTW89_KCC][44] = 30,
+       [0][1][RTW89_ACMA][44] = 84,
+       [0][1][RTW89_CHILE][44] = 54,
+       [0][1][RTW89_UKRAINE][44] = 16,
+       [0][1][RTW89_MEXICO][44] = 82,
+       [0][1][RTW89_CN][44] = 50,
+       [0][1][RTW89_QATAR][44] = 16,
+       [0][1][RTW89_UK][44] = 14,
+       [0][1][RTW89_FCC][46] = 82,
+       [0][1][RTW89_ETSI][46] = 16,
+       [0][1][RTW89_MKK][46] = 127,
+       [0][1][RTW89_IC][46] = 82,
+       [0][1][RTW89_KCC][46] = 30,
+       [0][1][RTW89_ACMA][46] = 84,
+       [0][1][RTW89_CHILE][46] = 54,
+       [0][1][RTW89_UKRAINE][46] = 16,
+       [0][1][RTW89_MEXICO][46] = 82,
+       [0][1][RTW89_CN][46] = 50,
+       [0][1][RTW89_QATAR][46] = 16,
+       [0][1][RTW89_UK][46] = 14,
+       [0][1][RTW89_FCC][48] = 20,
+       [0][1][RTW89_ETSI][48] = 127,
+       [0][1][RTW89_MKK][48] = 127,
+       [0][1][RTW89_IC][48] = 127,
+       [0][1][RTW89_KCC][48] = 127,
+       [0][1][RTW89_ACMA][48] = 127,
+       [0][1][RTW89_CHILE][48] = 127,
+       [0][1][RTW89_UKRAINE][48] = 127,
+       [0][1][RTW89_MEXICO][48] = 127,
+       [0][1][RTW89_CN][48] = 127,
+       [0][1][RTW89_QATAR][48] = 127,
+       [0][1][RTW89_UK][48] = 127,
+       [0][1][RTW89_FCC][50] = 20,
+       [0][1][RTW89_ETSI][50] = 127,
+       [0][1][RTW89_MKK][50] = 127,
+       [0][1][RTW89_IC][50] = 127,
+       [0][1][RTW89_KCC][50] = 127,
+       [0][1][RTW89_ACMA][50] = 127,
+       [0][1][RTW89_CHILE][50] = 127,
+       [0][1][RTW89_UKRAINE][50] = 127,
+       [0][1][RTW89_MEXICO][50] = 127,
+       [0][1][RTW89_CN][50] = 127,
+       [0][1][RTW89_QATAR][50] = 127,
+       [0][1][RTW89_UK][50] = 127,
+       [0][1][RTW89_FCC][52] = 20,
+       [0][1][RTW89_ETSI][52] = 127,
+       [0][1][RTW89_MKK][52] = 127,
+       [0][1][RTW89_IC][52] = 127,
+       [0][1][RTW89_KCC][52] = 127,
+       [0][1][RTW89_ACMA][52] = 127,
+       [0][1][RTW89_CHILE][52] = 127,
+       [0][1][RTW89_UKRAINE][52] = 127,
+       [0][1][RTW89_MEXICO][52] = 127,
+       [0][1][RTW89_CN][52] = 127,
+       [0][1][RTW89_QATAR][52] = 127,
+       [0][1][RTW89_UK][52] = 127,
+       [1][0][RTW89_FCC][0] = 62,
+       [1][0][RTW89_ETSI][0] = 34,
+       [1][0][RTW89_MKK][0] = 36,
+       [1][0][RTW89_IC][0] = 36,
+       [1][0][RTW89_KCC][0] = 52,
+       [1][0][RTW89_ACMA][0] = 34,
+       [1][0][RTW89_CHILE][0] = 40,
+       [1][0][RTW89_UKRAINE][0] = 34,
+       [1][0][RTW89_MEXICO][0] = 62,
+       [1][0][RTW89_CN][0] = 34,
+       [1][0][RTW89_QATAR][0] = 34,
+       [1][0][RTW89_UK][0] = 34,
+       [1][0][RTW89_FCC][2] = 62,
+       [1][0][RTW89_ETSI][2] = 34,
+       [1][0][RTW89_MKK][2] = 36,
+       [1][0][RTW89_IC][2] = 36,
+       [1][0][RTW89_KCC][2] = 52,
+       [1][0][RTW89_ACMA][2] = 34,
+       [1][0][RTW89_CHILE][2] = 42,
+       [1][0][RTW89_UKRAINE][2] = 34,
+       [1][0][RTW89_MEXICO][2] = 62,
+       [1][0][RTW89_CN][2] = 34,
+       [1][0][RTW89_QATAR][2] = 34,
+       [1][0][RTW89_UK][2] = 34,
+       [1][0][RTW89_FCC][4] = 62,
+       [1][0][RTW89_ETSI][4] = 34,
+       [1][0][RTW89_MKK][4] = 34,
+       [1][0][RTW89_IC][4] = 36,
+       [1][0][RTW89_KCC][4] = 52,
+       [1][0][RTW89_ACMA][4] = 34,
+       [1][0][RTW89_CHILE][4] = 42,
+       [1][0][RTW89_UKRAINE][4] = 34,
+       [1][0][RTW89_MEXICO][4] = 62,
+       [1][0][RTW89_CN][4] = 34,
+       [1][0][RTW89_QATAR][4] = 34,
+       [1][0][RTW89_UK][4] = 34,
+       [1][0][RTW89_FCC][6] = 62,
+       [1][0][RTW89_ETSI][6] = 34,
+       [1][0][RTW89_MKK][6] = 34,
+       [1][0][RTW89_IC][6] = 36,
+       [1][0][RTW89_KCC][6] = 26,
+       [1][0][RTW89_ACMA][6] = 34,
+       [1][0][RTW89_CHILE][6] = 42,
+       [1][0][RTW89_UKRAINE][6] = 34,
+       [1][0][RTW89_MEXICO][6] = 62,
+       [1][0][RTW89_CN][6] = 34,
+       [1][0][RTW89_QATAR][6] = 34,
+       [1][0][RTW89_UK][6] = 34,
+       [1][0][RTW89_FCC][8] = 62,
+       [1][0][RTW89_ETSI][8] = 34,
+       [1][0][RTW89_MKK][8] = 36,
+       [1][0][RTW89_IC][8] = 62,
+       [1][0][RTW89_KCC][8] = 54,
+       [1][0][RTW89_ACMA][8] = 34,
+       [1][0][RTW89_CHILE][8] = 64,
+       [1][0][RTW89_UKRAINE][8] = 34,
+       [1][0][RTW89_MEXICO][8] = 62,
+       [1][0][RTW89_CN][8] = 34,
+       [1][0][RTW89_QATAR][8] = 34,
+       [1][0][RTW89_UK][8] = 34,
+       [1][0][RTW89_FCC][10] = 62,
+       [1][0][RTW89_ETSI][10] = 34,
+       [1][0][RTW89_MKK][10] = 36,
+       [1][0][RTW89_IC][10] = 62,
+       [1][0][RTW89_KCC][10] = 54,
+       [1][0][RTW89_ACMA][10] = 34,
+       [1][0][RTW89_CHILE][10] = 64,
+       [1][0][RTW89_UKRAINE][10] = 34,
+       [1][0][RTW89_MEXICO][10] = 62,
+       [1][0][RTW89_CN][10] = 34,
+       [1][0][RTW89_QATAR][10] = 34,
+       [1][0][RTW89_UK][10] = 34,
+       [1][0][RTW89_FCC][12] = 64,
+       [1][0][RTW89_ETSI][12] = 34,
+       [1][0][RTW89_MKK][12] = 36,
+       [1][0][RTW89_IC][12] = 64,
+       [1][0][RTW89_KCC][12] = 54,
+       [1][0][RTW89_ACMA][12] = 34,
+       [1][0][RTW89_CHILE][12] = 64,
+       [1][0][RTW89_UKRAINE][12] = 34,
+       [1][0][RTW89_MEXICO][12] = 64,
+       [1][0][RTW89_CN][12] = 34,
+       [1][0][RTW89_QATAR][12] = 34,
+       [1][0][RTW89_UK][12] = 34,
+       [1][0][RTW89_FCC][14] = 62,
+       [1][0][RTW89_ETSI][14] = 34,
+       [1][0][RTW89_MKK][14] = 36,
+       [1][0][RTW89_IC][14] = 62,
+       [1][0][RTW89_KCC][14] = 54,
+       [1][0][RTW89_ACMA][14] = 34,
+       [1][0][RTW89_CHILE][14] = 64,
+       [1][0][RTW89_UKRAINE][14] = 34,
+       [1][0][RTW89_MEXICO][14] = 62,
+       [1][0][RTW89_CN][14] = 34,
+       [1][0][RTW89_QATAR][14] = 34,
+       [1][0][RTW89_UK][14] = 34,
+       [1][0][RTW89_FCC][15] = 62,
+       [1][0][RTW89_ETSI][15] = 34,
+       [1][0][RTW89_MKK][15] = 54,
+       [1][0][RTW89_IC][15] = 62,
+       [1][0][RTW89_KCC][15] = 54,
+       [1][0][RTW89_ACMA][15] = 34,
+       [1][0][RTW89_CHILE][15] = 62,
+       [1][0][RTW89_UKRAINE][15] = 34,
+       [1][0][RTW89_MEXICO][15] = 62,
+       [1][0][RTW89_CN][15] = 127,
+       [1][0][RTW89_QATAR][15] = 34,
+       [1][0][RTW89_UK][15] = 34,
+       [1][0][RTW89_FCC][17] = 62,
+       [1][0][RTW89_ETSI][17] = 34,
+       [1][0][RTW89_MKK][17] = 58,
+       [1][0][RTW89_IC][17] = 62,
+       [1][0][RTW89_KCC][17] = 54,
+       [1][0][RTW89_ACMA][17] = 34,
+       [1][0][RTW89_CHILE][17] = 62,
+       [1][0][RTW89_UKRAINE][17] = 34,
+       [1][0][RTW89_MEXICO][17] = 62,
+       [1][0][RTW89_CN][17] = 127,
+       [1][0][RTW89_QATAR][17] = 34,
+       [1][0][RTW89_UK][17] = 34,
+       [1][0][RTW89_FCC][19] = 62,
+       [1][0][RTW89_ETSI][19] = 34,
+       [1][0][RTW89_MKK][19] = 58,
+       [1][0][RTW89_IC][19] = 62,
+       [1][0][RTW89_KCC][19] = 54,
+       [1][0][RTW89_ACMA][19] = 34,
+       [1][0][RTW89_CHILE][19] = 62,
+       [1][0][RTW89_UKRAINE][19] = 34,
+       [1][0][RTW89_MEXICO][19] = 62,
+       [1][0][RTW89_CN][19] = 127,
+       [1][0][RTW89_QATAR][19] = 34,
+       [1][0][RTW89_UK][19] = 34,
+       [1][0][RTW89_FCC][21] = 62,
+       [1][0][RTW89_ETSI][21] = 34,
+       [1][0][RTW89_MKK][21] = 58,
+       [1][0][RTW89_IC][21] = 62,
+       [1][0][RTW89_KCC][21] = 54,
+       [1][0][RTW89_ACMA][21] = 34,
+       [1][0][RTW89_CHILE][21] = 64,
+       [1][0][RTW89_UKRAINE][21] = 34,
+       [1][0][RTW89_MEXICO][21] = 62,
+       [1][0][RTW89_CN][21] = 127,
+       [1][0][RTW89_QATAR][21] = 34,
+       [1][0][RTW89_UK][21] = 34,
+       [1][0][RTW89_FCC][23] = 62,
+       [1][0][RTW89_ETSI][23] = 34,
+       [1][0][RTW89_MKK][23] = 58,
+       [1][0][RTW89_IC][23] = 62,
+       [1][0][RTW89_KCC][23] = 54,
+       [1][0][RTW89_ACMA][23] = 34,
+       [1][0][RTW89_CHILE][23] = 64,
+       [1][0][RTW89_UKRAINE][23] = 34,
+       [1][0][RTW89_MEXICO][23] = 62,
+       [1][0][RTW89_CN][23] = 127,
+       [1][0][RTW89_QATAR][23] = 34,
+       [1][0][RTW89_UK][23] = 34,
+       [1][0][RTW89_FCC][25] = 62,
+       [1][0][RTW89_ETSI][25] = 34,
+       [1][0][RTW89_MKK][25] = 58,
+       [1][0][RTW89_IC][25] = 127,
+       [1][0][RTW89_KCC][25] = 54,
+       [1][0][RTW89_ACMA][25] = 127,
+       [1][0][RTW89_CHILE][25] = 64,
+       [1][0][RTW89_UKRAINE][25] = 34,
+       [1][0][RTW89_MEXICO][25] = 62,
+       [1][0][RTW89_CN][25] = 127,
+       [1][0][RTW89_QATAR][25] = 34,
+       [1][0][RTW89_UK][25] = 34,
+       [1][0][RTW89_FCC][27] = 62,
+       [1][0][RTW89_ETSI][27] = 34,
+       [1][0][RTW89_MKK][27] = 58,
+       [1][0][RTW89_IC][27] = 127,
+       [1][0][RTW89_KCC][27] = 54,
+       [1][0][RTW89_ACMA][27] = 127,
+       [1][0][RTW89_CHILE][27] = 64,
+       [1][0][RTW89_UKRAINE][27] = 34,
+       [1][0][RTW89_MEXICO][27] = 62,
+       [1][0][RTW89_CN][27] = 127,
+       [1][0][RTW89_QATAR][27] = 34,
+       [1][0][RTW89_UK][27] = 34,
+       [1][0][RTW89_FCC][29] = 62,
+       [1][0][RTW89_ETSI][29] = 34,
+       [1][0][RTW89_MKK][29] = 58,
+       [1][0][RTW89_IC][29] = 127,
+       [1][0][RTW89_KCC][29] = 54,
+       [1][0][RTW89_ACMA][29] = 127,
+       [1][0][RTW89_CHILE][29] = 66,
+       [1][0][RTW89_UKRAINE][29] = 34,
+       [1][0][RTW89_MEXICO][29] = 62,
+       [1][0][RTW89_CN][29] = 127,
+       [1][0][RTW89_QATAR][29] = 34,
+       [1][0][RTW89_UK][29] = 34,
+       [1][0][RTW89_FCC][31] = 62,
+       [1][0][RTW89_ETSI][31] = 34,
+       [1][0][RTW89_MKK][31] = 58,
+       [1][0][RTW89_IC][31] = 62,
+       [1][0][RTW89_KCC][31] = 54,
+       [1][0][RTW89_ACMA][31] = 34,
+       [1][0][RTW89_CHILE][31] = 66,
+       [1][0][RTW89_UKRAINE][31] = 34,
+       [1][0][RTW89_MEXICO][31] = 62,
+       [1][0][RTW89_CN][31] = 127,
+       [1][0][RTW89_QATAR][31] = 34,
+       [1][0][RTW89_UK][31] = 34,
+       [1][0][RTW89_FCC][33] = 62,
+       [1][0][RTW89_ETSI][33] = 34,
+       [1][0][RTW89_MKK][33] = 58,
+       [1][0][RTW89_IC][33] = 62,
+       [1][0][RTW89_KCC][33] = 54,
+       [1][0][RTW89_ACMA][33] = 34,
+       [1][0][RTW89_CHILE][33] = 66,
+       [1][0][RTW89_UKRAINE][33] = 34,
+       [1][0][RTW89_MEXICO][33] = 62,
+       [1][0][RTW89_CN][33] = 127,
+       [1][0][RTW89_QATAR][33] = 34,
+       [1][0][RTW89_UK][33] = 34,
+       [1][0][RTW89_FCC][35] = 62,
+       [1][0][RTW89_ETSI][35] = 34,
+       [1][0][RTW89_MKK][35] = 58,
+       [1][0][RTW89_IC][35] = 62,
+       [1][0][RTW89_KCC][35] = 54,
+       [1][0][RTW89_ACMA][35] = 34,
+       [1][0][RTW89_CHILE][35] = 66,
+       [1][0][RTW89_UKRAINE][35] = 34,
+       [1][0][RTW89_MEXICO][35] = 62,
+       [1][0][RTW89_CN][35] = 127,
+       [1][0][RTW89_QATAR][35] = 34,
+       [1][0][RTW89_UK][35] = 34,
+       [1][0][RTW89_FCC][37] = 64,
+       [1][0][RTW89_ETSI][37] = 127,
+       [1][0][RTW89_MKK][37] = 52,
+       [1][0][RTW89_IC][37] = 64,
+       [1][0][RTW89_KCC][37] = 54,
+       [1][0][RTW89_ACMA][37] = 64,
+       [1][0][RTW89_CHILE][37] = 64,
+       [1][0][RTW89_UKRAINE][37] = 127,
+       [1][0][RTW89_MEXICO][37] = 64,
+       [1][0][RTW89_CN][37] = 127,
+       [1][0][RTW89_QATAR][37] = 127,
+       [1][0][RTW89_UK][37] = 66,
+       [1][0][RTW89_FCC][38] = 84,
+       [1][0][RTW89_ETSI][38] = 28,
+       [1][0][RTW89_MKK][38] = 127,
+       [1][0][RTW89_IC][38] = 84,
+       [1][0][RTW89_KCC][38] = 56,
+       [1][0][RTW89_ACMA][38] = 84,
+       [1][0][RTW89_CHILE][38] = 64,
+       [1][0][RTW89_UKRAINE][38] = 28,
+       [1][0][RTW89_MEXICO][38] = 84,
+       [1][0][RTW89_CN][38] = 74,
+       [1][0][RTW89_QATAR][38] = 28,
+       [1][0][RTW89_UK][38] = 38,
+       [1][0][RTW89_FCC][40] = 84,
+       [1][0][RTW89_ETSI][40] = 28,
+       [1][0][RTW89_MKK][40] = 127,
+       [1][0][RTW89_IC][40] = 84,
+       [1][0][RTW89_KCC][40] = 56,
+       [1][0][RTW89_ACMA][40] = 84,
+       [1][0][RTW89_CHILE][40] = 64,
+       [1][0][RTW89_UKRAINE][40] = 28,
+       [1][0][RTW89_MEXICO][40] = 84,
+       [1][0][RTW89_CN][40] = 74,
+       [1][0][RTW89_QATAR][40] = 28,
+       [1][0][RTW89_UK][40] = 38,
+       [1][0][RTW89_FCC][42] = 84,
+       [1][0][RTW89_ETSI][42] = 28,
+       [1][0][RTW89_MKK][42] = 127,
+       [1][0][RTW89_IC][42] = 84,
+       [1][0][RTW89_KCC][42] = 56,
+       [1][0][RTW89_ACMA][42] = 84,
+       [1][0][RTW89_CHILE][42] = 64,
+       [1][0][RTW89_UKRAINE][42] = 28,
+       [1][0][RTW89_MEXICO][42] = 84,
+       [1][0][RTW89_CN][42] = 74,
+       [1][0][RTW89_QATAR][42] = 28,
+       [1][0][RTW89_UK][42] = 38,
+       [1][0][RTW89_FCC][44] = 84,
+       [1][0][RTW89_ETSI][44] = 28,
+       [1][0][RTW89_MKK][44] = 127,
+       [1][0][RTW89_IC][44] = 84,
+       [1][0][RTW89_KCC][44] = 56,
+       [1][0][RTW89_ACMA][44] = 84,
+       [1][0][RTW89_CHILE][44] = 64,
+       [1][0][RTW89_UKRAINE][44] = 28,
+       [1][0][RTW89_MEXICO][44] = 84,
+       [1][0][RTW89_CN][44] = 74,
+       [1][0][RTW89_QATAR][44] = 28,
+       [1][0][RTW89_UK][44] = 38,
+       [1][0][RTW89_FCC][46] = 84,
+       [1][0][RTW89_ETSI][46] = 28,
+       [1][0][RTW89_MKK][46] = 127,
+       [1][0][RTW89_IC][46] = 84,
+       [1][0][RTW89_KCC][46] = 56,
+       [1][0][RTW89_ACMA][46] = 84,
+       [1][0][RTW89_CHILE][46] = 64,
+       [1][0][RTW89_UKRAINE][46] = 28,
+       [1][0][RTW89_MEXICO][46] = 84,
+       [1][0][RTW89_CN][46] = 74,
+       [1][0][RTW89_QATAR][46] = 28,
+       [1][0][RTW89_UK][46] = 38,
+       [1][0][RTW89_FCC][48] = 44,
+       [1][0][RTW89_ETSI][48] = 127,
+       [1][0][RTW89_MKK][48] = 127,
+       [1][0][RTW89_IC][48] = 127,
+       [1][0][RTW89_KCC][48] = 127,
+       [1][0][RTW89_ACMA][48] = 127,
+       [1][0][RTW89_CHILE][48] = 127,
+       [1][0][RTW89_UKRAINE][48] = 127,
+       [1][0][RTW89_MEXICO][48] = 127,
+       [1][0][RTW89_CN][48] = 127,
+       [1][0][RTW89_QATAR][48] = 127,
+       [1][0][RTW89_UK][48] = 127,
+       [1][0][RTW89_FCC][50] = 44,
+       [1][0][RTW89_ETSI][50] = 127,
+       [1][0][RTW89_MKK][50] = 127,
+       [1][0][RTW89_IC][50] = 127,
+       [1][0][RTW89_KCC][50] = 127,
+       [1][0][RTW89_ACMA][50] = 127,
+       [1][0][RTW89_CHILE][50] = 127,
+       [1][0][RTW89_UKRAINE][50] = 127,
+       [1][0][RTW89_MEXICO][50] = 127,
+       [1][0][RTW89_CN][50] = 127,
+       [1][0][RTW89_QATAR][50] = 127,
+       [1][0][RTW89_UK][50] = 127,
+       [1][0][RTW89_FCC][52] = 44,
+       [1][0][RTW89_ETSI][52] = 127,
+       [1][0][RTW89_MKK][52] = 127,
+       [1][0][RTW89_IC][52] = 127,
+       [1][0][RTW89_KCC][52] = 127,
+       [1][0][RTW89_ACMA][52] = 127,
+       [1][0][RTW89_CHILE][52] = 127,
+       [1][0][RTW89_UKRAINE][52] = 127,
+       [1][0][RTW89_MEXICO][52] = 127,
+       [1][0][RTW89_CN][52] = 127,
+       [1][0][RTW89_QATAR][52] = 127,
+       [1][0][RTW89_UK][52] = 127,
+       [1][1][RTW89_FCC][0] = 42,
+       [1][1][RTW89_ETSI][0] = 22,
+       [1][1][RTW89_MKK][0] = 22,
+       [1][1][RTW89_IC][0] = 10,
+       [1][1][RTW89_KCC][0] = 36,
+       [1][1][RTW89_ACMA][0] = 22,
+       [1][1][RTW89_CHILE][0] = 22,
+       [1][1][RTW89_UKRAINE][0] = 22,
+       [1][1][RTW89_MEXICO][0] = 42,
+       [1][1][RTW89_CN][0] = 22,
+       [1][1][RTW89_QATAR][0] = 22,
+       [1][1][RTW89_UK][0] = 22,
+       [1][1][RTW89_FCC][2] = 44,
+       [1][1][RTW89_ETSI][2] = 22,
+       [1][1][RTW89_MKK][2] = 22,
+       [1][1][RTW89_IC][2] = 14,
+       [1][1][RTW89_KCC][2] = 36,
+       [1][1][RTW89_ACMA][2] = 22,
+       [1][1][RTW89_CHILE][2] = 22,
+       [1][1][RTW89_UKRAINE][2] = 22,
+       [1][1][RTW89_MEXICO][2] = 44,
+       [1][1][RTW89_CN][2] = 22,
+       [1][1][RTW89_QATAR][2] = 22,
+       [1][1][RTW89_UK][2] = 22,
+       [1][1][RTW89_FCC][4] = 42,
+       [1][1][RTW89_ETSI][4] = 22,
+       [1][1][RTW89_MKK][4] = 20,
+       [1][1][RTW89_IC][4] = 10,
+       [1][1][RTW89_KCC][4] = 36,
+       [1][1][RTW89_ACMA][4] = 22,
+       [1][1][RTW89_CHILE][4] = 20,
+       [1][1][RTW89_UKRAINE][4] = 22,
+       [1][1][RTW89_MEXICO][4] = 42,
+       [1][1][RTW89_CN][4] = 22,
+       [1][1][RTW89_QATAR][4] = 22,
+       [1][1][RTW89_UK][4] = 22,
+       [1][1][RTW89_FCC][6] = 42,
+       [1][1][RTW89_ETSI][6] = 22,
+       [1][1][RTW89_MKK][6] = 20,
+       [1][1][RTW89_IC][6] = 10,
+       [1][1][RTW89_KCC][6] = 10,
+       [1][1][RTW89_ACMA][6] = 22,
+       [1][1][RTW89_CHILE][6] = 20,
+       [1][1][RTW89_UKRAINE][6] = 22,
+       [1][1][RTW89_MEXICO][6] = 42,
+       [1][1][RTW89_CN][6] = 22,
+       [1][1][RTW89_QATAR][6] = 22,
+       [1][1][RTW89_UK][6] = 22,
+       [1][1][RTW89_FCC][8] = 44,
+       [1][1][RTW89_ETSI][8] = 22,
+       [1][1][RTW89_MKK][8] = 20,
+       [1][1][RTW89_IC][8] = 44,
+       [1][1][RTW89_KCC][8] = 36,
+       [1][1][RTW89_ACMA][8] = 22,
+       [1][1][RTW89_CHILE][8] = 54,
+       [1][1][RTW89_UKRAINE][8] = 22,
+       [1][1][RTW89_MEXICO][8] = 44,
+       [1][1][RTW89_CN][8] = 22,
+       [1][1][RTW89_QATAR][8] = 22,
+       [1][1][RTW89_UK][8] = 22,
+       [1][1][RTW89_FCC][10] = 44,
+       [1][1][RTW89_ETSI][10] = 22,
+       [1][1][RTW89_MKK][10] = 20,
+       [1][1][RTW89_IC][10] = 44,
+       [1][1][RTW89_KCC][10] = 36,
+       [1][1][RTW89_ACMA][10] = 22,
+       [1][1][RTW89_CHILE][10] = 54,
+       [1][1][RTW89_UKRAINE][10] = 22,
+       [1][1][RTW89_MEXICO][10] = 44,
+       [1][1][RTW89_CN][10] = 22,
+       [1][1][RTW89_QATAR][10] = 22,
+       [1][1][RTW89_UK][10] = 22,
+       [1][1][RTW89_FCC][12] = 46,
+       [1][1][RTW89_ETSI][12] = 22,
+       [1][1][RTW89_MKK][12] = 22,
+       [1][1][RTW89_IC][12] = 46,
+       [1][1][RTW89_KCC][12] = 40,
+       [1][1][RTW89_ACMA][12] = 22,
+       [1][1][RTW89_CHILE][12] = 52,
+       [1][1][RTW89_UKRAINE][12] = 22,
+       [1][1][RTW89_MEXICO][12] = 46,
+       [1][1][RTW89_CN][12] = 22,
+       [1][1][RTW89_QATAR][12] = 22,
+       [1][1][RTW89_UK][12] = 22,
+       [1][1][RTW89_FCC][14] = 42,
+       [1][1][RTW89_ETSI][14] = 22,
+       [1][1][RTW89_MKK][14] = 22,
+       [1][1][RTW89_IC][14] = 40,
+       [1][1][RTW89_KCC][14] = 40,
+       [1][1][RTW89_ACMA][14] = 22,
+       [1][1][RTW89_CHILE][14] = 54,
+       [1][1][RTW89_UKRAINE][14] = 22,
+       [1][1][RTW89_MEXICO][14] = 42,
+       [1][1][RTW89_CN][14] = 22,
+       [1][1][RTW89_QATAR][14] = 22,
+       [1][1][RTW89_UK][14] = 22,
+       [1][1][RTW89_FCC][15] = 42,
+       [1][1][RTW89_ETSI][15] = 22,
+       [1][1][RTW89_MKK][15] = 42,
+       [1][1][RTW89_IC][15] = 42,
+       [1][1][RTW89_KCC][15] = 38,
+       [1][1][RTW89_ACMA][15] = 22,
+       [1][1][RTW89_CHILE][15] = 54,
+       [1][1][RTW89_UKRAINE][15] = 22,
+       [1][1][RTW89_MEXICO][15] = 42,
+       [1][1][RTW89_CN][15] = 127,
+       [1][1][RTW89_QATAR][15] = 22,
+       [1][1][RTW89_UK][15] = 22,
+       [1][1][RTW89_FCC][17] = 42,
+       [1][1][RTW89_ETSI][17] = 22,
+       [1][1][RTW89_MKK][17] = 44,
+       [1][1][RTW89_IC][17] = 42,
+       [1][1][RTW89_KCC][17] = 38,
+       [1][1][RTW89_ACMA][17] = 22,
+       [1][1][RTW89_CHILE][17] = 54,
+       [1][1][RTW89_UKRAINE][17] = 22,
+       [1][1][RTW89_MEXICO][17] = 42,
+       [1][1][RTW89_CN][17] = 127,
+       [1][1][RTW89_QATAR][17] = 22,
+       [1][1][RTW89_UK][17] = 22,
+       [1][1][RTW89_FCC][19] = 42,
+       [1][1][RTW89_ETSI][19] = 22,
+       [1][1][RTW89_MKK][19] = 44,
+       [1][1][RTW89_IC][19] = 42,
+       [1][1][RTW89_KCC][19] = 38,
+       [1][1][RTW89_ACMA][19] = 22,
+       [1][1][RTW89_CHILE][19] = 54,
+       [1][1][RTW89_UKRAINE][19] = 22,
+       [1][1][RTW89_MEXICO][19] = 42,
+       [1][1][RTW89_CN][19] = 127,
+       [1][1][RTW89_QATAR][19] = 22,
+       [1][1][RTW89_UK][19] = 22,
+       [1][1][RTW89_FCC][21] = 42,
+       [1][1][RTW89_ETSI][21] = 22,
+       [1][1][RTW89_MKK][21] = 44,
+       [1][1][RTW89_IC][21] = 42,
+       [1][1][RTW89_KCC][21] = 38,
+       [1][1][RTW89_ACMA][21] = 22,
+       [1][1][RTW89_CHILE][21] = 54,
+       [1][1][RTW89_UKRAINE][21] = 22,
+       [1][1][RTW89_MEXICO][21] = 42,
+       [1][1][RTW89_CN][21] = 127,
+       [1][1][RTW89_QATAR][21] = 22,
+       [1][1][RTW89_UK][21] = 22,
+       [1][1][RTW89_FCC][23] = 42,
+       [1][1][RTW89_ETSI][23] = 22,
+       [1][1][RTW89_MKK][23] = 44,
+       [1][1][RTW89_IC][23] = 42,
+       [1][1][RTW89_KCC][23] = 38,
+       [1][1][RTW89_ACMA][23] = 22,
+       [1][1][RTW89_CHILE][23] = 54,
+       [1][1][RTW89_UKRAINE][23] = 22,
+       [1][1][RTW89_MEXICO][23] = 42,
+       [1][1][RTW89_CN][23] = 127,
+       [1][1][RTW89_QATAR][23] = 22,
+       [1][1][RTW89_UK][23] = 22,
+       [1][1][RTW89_FCC][25] = 42,
+       [1][1][RTW89_ETSI][25] = 22,
+       [1][1][RTW89_MKK][25] = 44,
+       [1][1][RTW89_IC][25] = 127,
+       [1][1][RTW89_KCC][25] = 38,
+       [1][1][RTW89_ACMA][25] = 127,
+       [1][1][RTW89_CHILE][25] = 54,
+       [1][1][RTW89_UKRAINE][25] = 22,
+       [1][1][RTW89_MEXICO][25] = 42,
+       [1][1][RTW89_CN][25] = 127,
+       [1][1][RTW89_QATAR][25] = 22,
+       [1][1][RTW89_UK][25] = 22,
+       [1][1][RTW89_FCC][27] = 42,
+       [1][1][RTW89_ETSI][27] = 22,
+       [1][1][RTW89_MKK][27] = 44,
+       [1][1][RTW89_IC][27] = 127,
+       [1][1][RTW89_KCC][27] = 38,
+       [1][1][RTW89_ACMA][27] = 127,
+       [1][1][RTW89_CHILE][27] = 54,
+       [1][1][RTW89_UKRAINE][27] = 22,
+       [1][1][RTW89_MEXICO][27] = 42,
+       [1][1][RTW89_CN][27] = 127,
+       [1][1][RTW89_QATAR][27] = 22,
+       [1][1][RTW89_UK][27] = 22,
+       [1][1][RTW89_FCC][29] = 42,
+       [1][1][RTW89_ETSI][29] = 22,
+       [1][1][RTW89_MKK][29] = 44,
+       [1][1][RTW89_IC][29] = 127,
+       [1][1][RTW89_KCC][29] = 38,
+       [1][1][RTW89_ACMA][29] = 127,
+       [1][1][RTW89_CHILE][29] = 54,
+       [1][1][RTW89_UKRAINE][29] = 22,
+       [1][1][RTW89_MEXICO][29] = 42,
+       [1][1][RTW89_CN][29] = 127,
+       [1][1][RTW89_QATAR][29] = 22,
+       [1][1][RTW89_UK][29] = 22,
+       [1][1][RTW89_FCC][31] = 42,
+       [1][1][RTW89_ETSI][31] = 22,
+       [1][1][RTW89_MKK][31] = 44,
+       [1][1][RTW89_IC][31] = 38,
+       [1][1][RTW89_KCC][31] = 38,
+       [1][1][RTW89_ACMA][31] = 22,
+       [1][1][RTW89_CHILE][31] = 54,
+       [1][1][RTW89_UKRAINE][31] = 22,
+       [1][1][RTW89_MEXICO][31] = 42,
+       [1][1][RTW89_CN][31] = 127,
+       [1][1][RTW89_QATAR][31] = 22,
+       [1][1][RTW89_UK][31] = 22,
+       [1][1][RTW89_FCC][33] = 40,
+       [1][1][RTW89_ETSI][33] = 22,
+       [1][1][RTW89_MKK][33] = 44,
+       [1][1][RTW89_IC][33] = 38,
+       [1][1][RTW89_KCC][33] = 38,
+       [1][1][RTW89_ACMA][33] = 22,
+       [1][1][RTW89_CHILE][33] = 54,
+       [1][1][RTW89_UKRAINE][33] = 22,
+       [1][1][RTW89_MEXICO][33] = 40,
+       [1][1][RTW89_CN][33] = 127,
+       [1][1][RTW89_QATAR][33] = 22,
+       [1][1][RTW89_UK][33] = 22,
+       [1][1][RTW89_FCC][35] = 40,
+       [1][1][RTW89_ETSI][35] = 22,
+       [1][1][RTW89_MKK][35] = 44,
+       [1][1][RTW89_IC][35] = 38,
+       [1][1][RTW89_KCC][35] = 38,
+       [1][1][RTW89_ACMA][35] = 22,
+       [1][1][RTW89_CHILE][35] = 54,
+       [1][1][RTW89_UKRAINE][35] = 22,
+       [1][1][RTW89_MEXICO][35] = 40,
+       [1][1][RTW89_CN][35] = 127,
+       [1][1][RTW89_QATAR][35] = 22,
+       [1][1][RTW89_UK][35] = 22,
+       [1][1][RTW89_FCC][37] = 48,
+       [1][1][RTW89_ETSI][37] = 127,
+       [1][1][RTW89_MKK][37] = 42,
+       [1][1][RTW89_IC][37] = 48,
+       [1][1][RTW89_KCC][37] = 38,
+       [1][1][RTW89_ACMA][37] = 48,
+       [1][1][RTW89_CHILE][37] = 54,
+       [1][1][RTW89_UKRAINE][37] = 127,
+       [1][1][RTW89_MEXICO][37] = 48,
+       [1][1][RTW89_CN][37] = 127,
+       [1][1][RTW89_QATAR][37] = 127,
+       [1][1][RTW89_UK][37] = 54,
+       [1][1][RTW89_FCC][38] = 84,
+       [1][1][RTW89_ETSI][38] = 16,
+       [1][1][RTW89_MKK][38] = 127,
+       [1][1][RTW89_IC][38] = 84,
+       [1][1][RTW89_KCC][38] = 38,
+       [1][1][RTW89_ACMA][38] = 82,
+       [1][1][RTW89_CHILE][38] = 54,
+       [1][1][RTW89_UKRAINE][38] = 16,
+       [1][1][RTW89_MEXICO][38] = 84,
+       [1][1][RTW89_CN][38] = 62,
+       [1][1][RTW89_QATAR][38] = 16,
+       [1][1][RTW89_UK][38] = 26,
+       [1][1][RTW89_FCC][40] = 84,
+       [1][1][RTW89_ETSI][40] = 16,
+       [1][1][RTW89_MKK][40] = 127,
+       [1][1][RTW89_IC][40] = 84,
+       [1][1][RTW89_KCC][40] = 38,
+       [1][1][RTW89_ACMA][40] = 82,
+       [1][1][RTW89_CHILE][40] = 54,
+       [1][1][RTW89_UKRAINE][40] = 16,
+       [1][1][RTW89_MEXICO][40] = 84,
+       [1][1][RTW89_CN][40] = 62,
+       [1][1][RTW89_QATAR][40] = 16,
+       [1][1][RTW89_UK][40] = 26,
+       [1][1][RTW89_FCC][42] = 84,
+       [1][1][RTW89_ETSI][42] = 16,
+       [1][1][RTW89_MKK][42] = 127,
+       [1][1][RTW89_IC][42] = 84,
+       [1][1][RTW89_KCC][42] = 38,
+       [1][1][RTW89_ACMA][42] = 84,
+       [1][1][RTW89_CHILE][42] = 54,
+       [1][1][RTW89_UKRAINE][42] = 16,
+       [1][1][RTW89_MEXICO][42] = 84,
+       [1][1][RTW89_CN][42] = 62,
+       [1][1][RTW89_QATAR][42] = 16,
+       [1][1][RTW89_UK][42] = 26,
+       [1][1][RTW89_FCC][44] = 84,
+       [1][1][RTW89_ETSI][44] = 16,
+       [1][1][RTW89_MKK][44] = 127,
+       [1][1][RTW89_IC][44] = 84,
+       [1][1][RTW89_KCC][44] = 38,
+       [1][1][RTW89_ACMA][44] = 84,
+       [1][1][RTW89_CHILE][44] = 56,
+       [1][1][RTW89_UKRAINE][44] = 16,
+       [1][1][RTW89_MEXICO][44] = 84,
+       [1][1][RTW89_CN][44] = 62,
+       [1][1][RTW89_QATAR][44] = 16,
+       [1][1][RTW89_UK][44] = 26,
+       [1][1][RTW89_FCC][46] = 84,
+       [1][1][RTW89_ETSI][46] = 16,
+       [1][1][RTW89_MKK][46] = 127,
+       [1][1][RTW89_IC][46] = 84,
+       [1][1][RTW89_KCC][46] = 38,
+       [1][1][RTW89_ACMA][46] = 84,
+       [1][1][RTW89_CHILE][46] = 56,
+       [1][1][RTW89_UKRAINE][46] = 16,
+       [1][1][RTW89_MEXICO][46] = 84,
+       [1][1][RTW89_CN][46] = 62,
+       [1][1][RTW89_QATAR][46] = 16,
+       [1][1][RTW89_UK][46] = 26,
+       [1][1][RTW89_FCC][48] = 32,
+       [1][1][RTW89_ETSI][48] = 127,
+       [1][1][RTW89_MKK][48] = 127,
+       [1][1][RTW89_IC][48] = 127,
+       [1][1][RTW89_KCC][48] = 127,
+       [1][1][RTW89_ACMA][48] = 127,
+       [1][1][RTW89_CHILE][48] = 127,
+       [1][1][RTW89_UKRAINE][48] = 127,
+       [1][1][RTW89_MEXICO][48] = 127,
+       [1][1][RTW89_CN][48] = 127,
+       [1][1][RTW89_QATAR][48] = 127,
+       [1][1][RTW89_UK][48] = 127,
+       [1][1][RTW89_FCC][50] = 32,
+       [1][1][RTW89_ETSI][50] = 127,
+       [1][1][RTW89_MKK][50] = 127,
+       [1][1][RTW89_IC][50] = 127,
+       [1][1][RTW89_KCC][50] = 127,
+       [1][1][RTW89_ACMA][50] = 127,
+       [1][1][RTW89_CHILE][50] = 127,
+       [1][1][RTW89_UKRAINE][50] = 127,
+       [1][1][RTW89_MEXICO][50] = 127,
+       [1][1][RTW89_CN][50] = 127,
+       [1][1][RTW89_QATAR][50] = 127,
+       [1][1][RTW89_UK][50] = 127,
+       [1][1][RTW89_FCC][52] = 32,
+       [1][1][RTW89_ETSI][52] = 127,
+       [1][1][RTW89_MKK][52] = 127,
+       [1][1][RTW89_IC][52] = 127,
+       [1][1][RTW89_KCC][52] = 127,
+       [1][1][RTW89_ACMA][52] = 127,
+       [1][1][RTW89_CHILE][52] = 127,
+       [1][1][RTW89_UKRAINE][52] = 127,
+       [1][1][RTW89_MEXICO][52] = 127,
+       [1][1][RTW89_CN][52] = 127,
+       [1][1][RTW89_QATAR][52] = 127,
+       [1][1][RTW89_UK][52] = 127,
+       [2][0][RTW89_FCC][0] = 70,
+       [2][0][RTW89_ETSI][0] = 48,
+       [2][0][RTW89_MKK][0] = 48,
+       [2][0][RTW89_IC][0] = 46,
+       [2][0][RTW89_KCC][0] = 66,
+       [2][0][RTW89_ACMA][0] = 48,
+       [2][0][RTW89_CHILE][0] = 44,
+       [2][0][RTW89_UKRAINE][0] = 48,
+       [2][0][RTW89_MEXICO][0] = 64,
+       [2][0][RTW89_CN][0] = 48,
+       [2][0][RTW89_QATAR][0] = 48,
+       [2][0][RTW89_UK][0] = 48,
+       [2][0][RTW89_FCC][2] = 70,
+       [2][0][RTW89_ETSI][2] = 48,
+       [2][0][RTW89_MKK][2] = 48,
+       [2][0][RTW89_IC][2] = 46,
+       [2][0][RTW89_KCC][2] = 66,
+       [2][0][RTW89_ACMA][2] = 48,
+       [2][0][RTW89_CHILE][2] = 44,
+       [2][0][RTW89_UKRAINE][2] = 48,
+       [2][0][RTW89_MEXICO][2] = 64,
+       [2][0][RTW89_CN][2] = 48,
+       [2][0][RTW89_QATAR][2] = 48,
+       [2][0][RTW89_UK][2] = 48,
+       [2][0][RTW89_FCC][4] = 70,
+       [2][0][RTW89_ETSI][4] = 48,
+       [2][0][RTW89_MKK][4] = 48,
+       [2][0][RTW89_IC][4] = 46,
+       [2][0][RTW89_KCC][4] = 66,
+       [2][0][RTW89_ACMA][4] = 48,
+       [2][0][RTW89_CHILE][4] = 44,
+       [2][0][RTW89_UKRAINE][4] = 48,
+       [2][0][RTW89_MEXICO][4] = 64,
+       [2][0][RTW89_CN][4] = 48,
+       [2][0][RTW89_QATAR][4] = 48,
+       [2][0][RTW89_UK][4] = 48,
+       [2][0][RTW89_FCC][6] = 70,
+       [2][0][RTW89_ETSI][6] = 48,
+       [2][0][RTW89_MKK][6] = 48,
+       [2][0][RTW89_IC][6] = 46,
+       [2][0][RTW89_KCC][6] = 38,
+       [2][0][RTW89_ACMA][6] = 48,
+       [2][0][RTW89_CHILE][6] = 44,
+       [2][0][RTW89_UKRAINE][6] = 48,
+       [2][0][RTW89_MEXICO][6] = 64,
+       [2][0][RTW89_CN][6] = 48,
+       [2][0][RTW89_QATAR][6] = 48,
+       [2][0][RTW89_UK][6] = 48,
+       [2][0][RTW89_FCC][8] = 70,
+       [2][0][RTW89_ETSI][8] = 48,
+       [2][0][RTW89_MKK][8] = 48,
+       [2][0][RTW89_IC][8] = 66,
+       [2][0][RTW89_KCC][8] = 64,
+       [2][0][RTW89_ACMA][8] = 48,
+       [2][0][RTW89_CHILE][8] = 66,
+       [2][0][RTW89_UKRAINE][8] = 48,
+       [2][0][RTW89_MEXICO][8] = 70,
+       [2][0][RTW89_CN][8] = 48,
+       [2][0][RTW89_QATAR][8] = 48,
+       [2][0][RTW89_UK][8] = 48,
+       [2][0][RTW89_FCC][10] = 70,
+       [2][0][RTW89_ETSI][10] = 48,
+       [2][0][RTW89_MKK][10] = 48,
+       [2][0][RTW89_IC][10] = 66,
+       [2][0][RTW89_KCC][10] = 64,
+       [2][0][RTW89_ACMA][10] = 48,
+       [2][0][RTW89_CHILE][10] = 66,
+       [2][0][RTW89_UKRAINE][10] = 48,
+       [2][0][RTW89_MEXICO][10] = 70,
+       [2][0][RTW89_CN][10] = 48,
+       [2][0][RTW89_QATAR][10] = 48,
+       [2][0][RTW89_UK][10] = 48,
+       [2][0][RTW89_FCC][12] = 70,
+       [2][0][RTW89_ETSI][12] = 48,
+       [2][0][RTW89_MKK][12] = 46,
+       [2][0][RTW89_IC][12] = 66,
+       [2][0][RTW89_KCC][12] = 64,
+       [2][0][RTW89_ACMA][12] = 48,
+       [2][0][RTW89_CHILE][12] = 66,
+       [2][0][RTW89_UKRAINE][12] = 48,
+       [2][0][RTW89_MEXICO][12] = 70,
+       [2][0][RTW89_CN][12] = 48,
+       [2][0][RTW89_QATAR][12] = 48,
+       [2][0][RTW89_UK][12] = 48,
+       [2][0][RTW89_FCC][14] = 70,
+       [2][0][RTW89_ETSI][14] = 48,
+       [2][0][RTW89_MKK][14] = 46,
+       [2][0][RTW89_IC][14] = 66,
+       [2][0][RTW89_KCC][14] = 64,
+       [2][0][RTW89_ACMA][14] = 48,
+       [2][0][RTW89_CHILE][14] = 66,
+       [2][0][RTW89_UKRAINE][14] = 48,
+       [2][0][RTW89_MEXICO][14] = 70,
+       [2][0][RTW89_CN][14] = 48,
+       [2][0][RTW89_QATAR][14] = 48,
+       [2][0][RTW89_UK][14] = 48,
+       [2][0][RTW89_FCC][15] = 70,
+       [2][0][RTW89_ETSI][15] = 48,
+       [2][0][RTW89_MKK][15] = 68,
+       [2][0][RTW89_IC][15] = 70,
+       [2][0][RTW89_KCC][15] = 64,
+       [2][0][RTW89_ACMA][15] = 48,
+       [2][0][RTW89_CHILE][15] = 62,
+       [2][0][RTW89_UKRAINE][15] = 48,
+       [2][0][RTW89_MEXICO][15] = 70,
+       [2][0][RTW89_CN][15] = 127,
+       [2][0][RTW89_QATAR][15] = 48,
+       [2][0][RTW89_UK][15] = 48,
+       [2][0][RTW89_FCC][17] = 70,
+       [2][0][RTW89_ETSI][17] = 48,
+       [2][0][RTW89_MKK][17] = 70,
+       [2][0][RTW89_IC][17] = 70,
+       [2][0][RTW89_KCC][17] = 64,
+       [2][0][RTW89_ACMA][17] = 48,
+       [2][0][RTW89_CHILE][17] = 62,
+       [2][0][RTW89_UKRAINE][17] = 48,
+       [2][0][RTW89_MEXICO][17] = 70,
+       [2][0][RTW89_CN][17] = 127,
+       [2][0][RTW89_QATAR][17] = 48,
+       [2][0][RTW89_UK][17] = 48,
+       [2][0][RTW89_FCC][19] = 70,
+       [2][0][RTW89_ETSI][19] = 48,
+       [2][0][RTW89_MKK][19] = 70,
+       [2][0][RTW89_IC][19] = 70,
+       [2][0][RTW89_KCC][19] = 64,
+       [2][0][RTW89_ACMA][19] = 48,
+       [2][0][RTW89_CHILE][19] = 62,
+       [2][0][RTW89_UKRAINE][19] = 48,
+       [2][0][RTW89_MEXICO][19] = 70,
+       [2][0][RTW89_CN][19] = 127,
+       [2][0][RTW89_QATAR][19] = 48,
+       [2][0][RTW89_UK][19] = 48,
+       [2][0][RTW89_FCC][21] = 70,
+       [2][0][RTW89_ETSI][21] = 48,
+       [2][0][RTW89_MKK][21] = 70,
+       [2][0][RTW89_IC][21] = 70,
+       [2][0][RTW89_KCC][21] = 64,
+       [2][0][RTW89_ACMA][21] = 48,
+       [2][0][RTW89_CHILE][21] = 64,
+       [2][0][RTW89_UKRAINE][21] = 48,
+       [2][0][RTW89_MEXICO][21] = 70,
+       [2][0][RTW89_CN][21] = 127,
+       [2][0][RTW89_QATAR][21] = 48,
+       [2][0][RTW89_UK][21] = 48,
+       [2][0][RTW89_FCC][23] = 70,
+       [2][0][RTW89_ETSI][23] = 48,
+       [2][0][RTW89_MKK][23] = 70,
+       [2][0][RTW89_IC][23] = 70,
+       [2][0][RTW89_KCC][23] = 64,
+       [2][0][RTW89_ACMA][23] = 48,
+       [2][0][RTW89_CHILE][23] = 64,
+       [2][0][RTW89_UKRAINE][23] = 48,
+       [2][0][RTW89_MEXICO][23] = 70,
+       [2][0][RTW89_CN][23] = 127,
+       [2][0][RTW89_QATAR][23] = 48,
+       [2][0][RTW89_UK][23] = 48,
+       [2][0][RTW89_FCC][25] = 70,
+       [2][0][RTW89_ETSI][25] = 48,
+       [2][0][RTW89_MKK][25] = 70,
+       [2][0][RTW89_IC][25] = 127,
+       [2][0][RTW89_KCC][25] = 64,
+       [2][0][RTW89_ACMA][25] = 127,
+       [2][0][RTW89_CHILE][25] = 64,
+       [2][0][RTW89_UKRAINE][25] = 48,
+       [2][0][RTW89_MEXICO][25] = 70,
+       [2][0][RTW89_CN][25] = 127,
+       [2][0][RTW89_QATAR][25] = 48,
+       [2][0][RTW89_UK][25] = 48,
+       [2][0][RTW89_FCC][27] = 70,
+       [2][0][RTW89_ETSI][27] = 48,
+       [2][0][RTW89_MKK][27] = 70,
+       [2][0][RTW89_IC][27] = 127,
+       [2][0][RTW89_KCC][27] = 64,
+       [2][0][RTW89_ACMA][27] = 127,
+       [2][0][RTW89_CHILE][27] = 64,
+       [2][0][RTW89_UKRAINE][27] = 48,
+       [2][0][RTW89_MEXICO][27] = 70,
+       [2][0][RTW89_CN][27] = 127,
+       [2][0][RTW89_QATAR][27] = 48,
+       [2][0][RTW89_UK][27] = 48,
+       [2][0][RTW89_FCC][29] = 70,
+       [2][0][RTW89_ETSI][29] = 48,
+       [2][0][RTW89_MKK][29] = 70,
+       [2][0][RTW89_IC][29] = 127,
+       [2][0][RTW89_KCC][29] = 64,
+       [2][0][RTW89_ACMA][29] = 127,
+       [2][0][RTW89_CHILE][29] = 66,
+       [2][0][RTW89_UKRAINE][29] = 48,
+       [2][0][RTW89_MEXICO][29] = 70,
+       [2][0][RTW89_CN][29] = 127,
+       [2][0][RTW89_QATAR][29] = 48,
+       [2][0][RTW89_UK][29] = 48,
+       [2][0][RTW89_FCC][31] = 70,
+       [2][0][RTW89_ETSI][31] = 48,
+       [2][0][RTW89_MKK][31] = 70,
+       [2][0][RTW89_IC][31] = 72,
+       [2][0][RTW89_KCC][31] = 64,
+       [2][0][RTW89_ACMA][31] = 48,
+       [2][0][RTW89_CHILE][31] = 66,
+       [2][0][RTW89_UKRAINE][31] = 48,
+       [2][0][RTW89_MEXICO][31] = 70,
+       [2][0][RTW89_CN][31] = 127,
+       [2][0][RTW89_QATAR][31] = 48,
+       [2][0][RTW89_UK][31] = 48,
+       [2][0][RTW89_FCC][33] = 72,
+       [2][0][RTW89_ETSI][33] = 48,
+       [2][0][RTW89_MKK][33] = 70,
+       [2][0][RTW89_IC][33] = 72,
+       [2][0][RTW89_KCC][33] = 64,
+       [2][0][RTW89_ACMA][33] = 48,
+       [2][0][RTW89_CHILE][33] = 66,
+       [2][0][RTW89_UKRAINE][33] = 48,
+       [2][0][RTW89_MEXICO][33] = 72,
+       [2][0][RTW89_CN][33] = 127,
+       [2][0][RTW89_QATAR][33] = 48,
+       [2][0][RTW89_UK][33] = 48,
+       [2][0][RTW89_FCC][35] = 72,
+       [2][0][RTW89_ETSI][35] = 48,
+       [2][0][RTW89_MKK][35] = 70,
+       [2][0][RTW89_IC][35] = 72,
+       [2][0][RTW89_KCC][35] = 64,
+       [2][0][RTW89_ACMA][35] = 48,
+       [2][0][RTW89_CHILE][35] = 66,
+       [2][0][RTW89_UKRAINE][35] = 48,
+       [2][0][RTW89_MEXICO][35] = 72,
+       [2][0][RTW89_CN][35] = 127,
+       [2][0][RTW89_QATAR][35] = 48,
+       [2][0][RTW89_UK][35] = 48,
+       [2][0][RTW89_FCC][37] = 70,
+       [2][0][RTW89_ETSI][37] = 127,
+       [2][0][RTW89_MKK][37] = 66,
+       [2][0][RTW89_IC][37] = 70,
+       [2][0][RTW89_KCC][37] = 64,
+       [2][0][RTW89_ACMA][37] = 76,
+       [2][0][RTW89_CHILE][37] = 66,
+       [2][0][RTW89_UKRAINE][37] = 127,
+       [2][0][RTW89_MEXICO][37] = 70,
+       [2][0][RTW89_CN][37] = 127,
+       [2][0][RTW89_QATAR][37] = 127,
+       [2][0][RTW89_UK][37] = 76,
+       [2][0][RTW89_FCC][38] = 84,
+       [2][0][RTW89_ETSI][38] = 28,
+       [2][0][RTW89_MKK][38] = 127,
+       [2][0][RTW89_IC][38] = 84,
+       [2][0][RTW89_KCC][38] = 66,
+       [2][0][RTW89_ACMA][38] = 84,
+       [2][0][RTW89_CHILE][38] = 64,
+       [2][0][RTW89_UKRAINE][38] = 28,
+       [2][0][RTW89_MEXICO][38] = 84,
+       [2][0][RTW89_CN][38] = 76,
+       [2][0][RTW89_QATAR][38] = 28,
+       [2][0][RTW89_UK][38] = 50,
+       [2][0][RTW89_FCC][40] = 84,
+       [2][0][RTW89_ETSI][40] = 28,
+       [2][0][RTW89_MKK][40] = 127,
+       [2][0][RTW89_IC][40] = 84,
+       [2][0][RTW89_KCC][40] = 66,
+       [2][0][RTW89_ACMA][40] = 84,
+       [2][0][RTW89_CHILE][40] = 64,
+       [2][0][RTW89_UKRAINE][40] = 28,
+       [2][0][RTW89_MEXICO][40] = 84,
+       [2][0][RTW89_CN][40] = 76,
+       [2][0][RTW89_QATAR][40] = 28,
+       [2][0][RTW89_UK][40] = 50,
+       [2][0][RTW89_FCC][42] = 84,
+       [2][0][RTW89_ETSI][42] = 28,
+       [2][0][RTW89_MKK][42] = 127,
+       [2][0][RTW89_IC][42] = 84,
+       [2][0][RTW89_KCC][42] = 66,
+       [2][0][RTW89_ACMA][42] = 84,
+       [2][0][RTW89_CHILE][42] = 66,
+       [2][0][RTW89_UKRAINE][42] = 28,
+       [2][0][RTW89_MEXICO][42] = 84,
+       [2][0][RTW89_CN][42] = 76,
+       [2][0][RTW89_QATAR][42] = 28,
+       [2][0][RTW89_UK][42] = 50,
+       [2][0][RTW89_FCC][44] = 84,
+       [2][0][RTW89_ETSI][44] = 28,
+       [2][0][RTW89_MKK][44] = 127,
+       [2][0][RTW89_IC][44] = 84,
+       [2][0][RTW89_KCC][44] = 66,
+       [2][0][RTW89_ACMA][44] = 84,
+       [2][0][RTW89_CHILE][44] = 64,
+       [2][0][RTW89_UKRAINE][44] = 28,
+       [2][0][RTW89_MEXICO][44] = 84,
+       [2][0][RTW89_CN][44] = 76,
+       [2][0][RTW89_QATAR][44] = 28,
+       [2][0][RTW89_UK][44] = 50,
+       [2][0][RTW89_FCC][46] = 84,
+       [2][0][RTW89_ETSI][46] = 28,
+       [2][0][RTW89_MKK][46] = 127,
+       [2][0][RTW89_IC][46] = 84,
+       [2][0][RTW89_KCC][46] = 66,
+       [2][0][RTW89_ACMA][46] = 84,
+       [2][0][RTW89_CHILE][46] = 64,
+       [2][0][RTW89_UKRAINE][46] = 28,
+       [2][0][RTW89_MEXICO][46] = 84,
+       [2][0][RTW89_CN][46] = 76,
+       [2][0][RTW89_QATAR][46] = 28,
+       [2][0][RTW89_UK][46] = 50,
+       [2][0][RTW89_FCC][48] = 56,
+       [2][0][RTW89_ETSI][48] = 127,
+       [2][0][RTW89_MKK][48] = 127,
+       [2][0][RTW89_IC][48] = 127,
+       [2][0][RTW89_KCC][48] = 127,
+       [2][0][RTW89_ACMA][48] = 127,
+       [2][0][RTW89_CHILE][48] = 127,
+       [2][0][RTW89_UKRAINE][48] = 127,
+       [2][0][RTW89_MEXICO][48] = 127,
+       [2][0][RTW89_CN][48] = 127,
+       [2][0][RTW89_QATAR][48] = 127,
+       [2][0][RTW89_UK][48] = 127,
+       [2][0][RTW89_FCC][50] = 56,
+       [2][0][RTW89_ETSI][50] = 127,
+       [2][0][RTW89_MKK][50] = 127,
+       [2][0][RTW89_IC][50] = 127,
+       [2][0][RTW89_KCC][50] = 127,
+       [2][0][RTW89_ACMA][50] = 127,
+       [2][0][RTW89_CHILE][50] = 127,
+       [2][0][RTW89_UKRAINE][50] = 127,
+       [2][0][RTW89_MEXICO][50] = 127,
+       [2][0][RTW89_CN][50] = 127,
+       [2][0][RTW89_QATAR][50] = 127,
+       [2][0][RTW89_UK][50] = 127,
+       [2][0][RTW89_FCC][52] = 56,
+       [2][0][RTW89_ETSI][52] = 127,
+       [2][0][RTW89_MKK][52] = 127,
+       [2][0][RTW89_IC][52] = 127,
+       [2][0][RTW89_KCC][52] = 127,
+       [2][0][RTW89_ACMA][52] = 127,
+       [2][0][RTW89_CHILE][52] = 127,
+       [2][0][RTW89_UKRAINE][52] = 127,
+       [2][0][RTW89_MEXICO][52] = 127,
+       [2][0][RTW89_CN][52] = 127,
+       [2][0][RTW89_QATAR][52] = 127,
+       [2][0][RTW89_UK][52] = 127,
+       [2][1][RTW89_FCC][0] = 50,
+       [2][1][RTW89_ETSI][0] = 36,
+       [2][1][RTW89_MKK][0] = 36,
+       [2][1][RTW89_IC][0] = 20,
+       [2][1][RTW89_KCC][0] = 46,
+       [2][1][RTW89_ACMA][0] = 36,
+       [2][1][RTW89_CHILE][0] = 32,
+       [2][1][RTW89_UKRAINE][0] = 36,
+       [2][1][RTW89_MEXICO][0] = 52,
+       [2][1][RTW89_CN][0] = 36,
+       [2][1][RTW89_QATAR][0] = 36,
+       [2][1][RTW89_UK][0] = 36,
+       [2][1][RTW89_FCC][2] = 50,
+       [2][1][RTW89_ETSI][2] = 36,
+       [2][1][RTW89_MKK][2] = 36,
+       [2][1][RTW89_IC][2] = 18,
+       [2][1][RTW89_KCC][2] = 46,
+       [2][1][RTW89_ACMA][2] = 36,
+       [2][1][RTW89_CHILE][2] = 32,
+       [2][1][RTW89_UKRAINE][2] = 36,
+       [2][1][RTW89_MEXICO][2] = 52,
+       [2][1][RTW89_CN][2] = 36,
+       [2][1][RTW89_QATAR][2] = 36,
+       [2][1][RTW89_UK][2] = 36,
+       [2][1][RTW89_FCC][4] = 50,
+       [2][1][RTW89_ETSI][4] = 36,
+       [2][1][RTW89_MKK][4] = 36,
+       [2][1][RTW89_IC][4] = 22,
+       [2][1][RTW89_KCC][4] = 46,
+       [2][1][RTW89_ACMA][4] = 36,
+       [2][1][RTW89_CHILE][4] = 30,
+       [2][1][RTW89_UKRAINE][4] = 36,
+       [2][1][RTW89_MEXICO][4] = 52,
+       [2][1][RTW89_CN][4] = 36,
+       [2][1][RTW89_QATAR][4] = 36,
+       [2][1][RTW89_UK][4] = 36,
+       [2][1][RTW89_FCC][6] = 50,
+       [2][1][RTW89_ETSI][6] = 36,
+       [2][1][RTW89_MKK][6] = 36,
+       [2][1][RTW89_IC][6] = 22,
+       [2][1][RTW89_KCC][6] = 22,
+       [2][1][RTW89_ACMA][6] = 36,
+       [2][1][RTW89_CHILE][6] = 30,
+       [2][1][RTW89_UKRAINE][6] = 36,
+       [2][1][RTW89_MEXICO][6] = 52,
+       [2][1][RTW89_CN][6] = 36,
+       [2][1][RTW89_QATAR][6] = 36,
+       [2][1][RTW89_UK][6] = 36,
+       [2][1][RTW89_FCC][8] = 50,
+       [2][1][RTW89_ETSI][8] = 36,
+       [2][1][RTW89_MKK][8] = 34,
+       [2][1][RTW89_IC][8] = 50,
+       [2][1][RTW89_KCC][8] = 48,
+       [2][1][RTW89_ACMA][8] = 36,
+       [2][1][RTW89_CHILE][8] = 54,
+       [2][1][RTW89_UKRAINE][8] = 36,
+       [2][1][RTW89_MEXICO][8] = 50,
+       [2][1][RTW89_CN][8] = 36,
+       [2][1][RTW89_QATAR][8] = 36,
+       [2][1][RTW89_UK][8] = 36,
+       [2][1][RTW89_FCC][10] = 50,
+       [2][1][RTW89_ETSI][10] = 36,
+       [2][1][RTW89_MKK][10] = 34,
+       [2][1][RTW89_IC][10] = 50,
+       [2][1][RTW89_KCC][10] = 48,
+       [2][1][RTW89_ACMA][10] = 36,
+       [2][1][RTW89_CHILE][10] = 54,
+       [2][1][RTW89_UKRAINE][10] = 36,
+       [2][1][RTW89_MEXICO][10] = 50,
+       [2][1][RTW89_CN][10] = 36,
+       [2][1][RTW89_QATAR][10] = 36,
+       [2][1][RTW89_UK][10] = 36,
+       [2][1][RTW89_FCC][12] = 52,
+       [2][1][RTW89_ETSI][12] = 36,
+       [2][1][RTW89_MKK][12] = 36,
+       [2][1][RTW89_IC][12] = 52,
+       [2][1][RTW89_KCC][12] = 48,
+       [2][1][RTW89_ACMA][12] = 36,
+       [2][1][RTW89_CHILE][12] = 54,
+       [2][1][RTW89_UKRAINE][12] = 36,
+       [2][1][RTW89_MEXICO][12] = 52,
+       [2][1][RTW89_CN][12] = 36,
+       [2][1][RTW89_QATAR][12] = 36,
+       [2][1][RTW89_UK][12] = 36,
+       [2][1][RTW89_FCC][14] = 52,
+       [2][1][RTW89_ETSI][14] = 36,
+       [2][1][RTW89_MKK][14] = 36,
+       [2][1][RTW89_IC][14] = 52,
+       [2][1][RTW89_KCC][14] = 48,
+       [2][1][RTW89_ACMA][14] = 36,
+       [2][1][RTW89_CHILE][14] = 54,
+       [2][1][RTW89_UKRAINE][14] = 36,
+       [2][1][RTW89_MEXICO][14] = 52,
+       [2][1][RTW89_CN][14] = 36,
+       [2][1][RTW89_QATAR][14] = 36,
+       [2][1][RTW89_UK][14] = 36,
+       [2][1][RTW89_FCC][15] = 50,
+       [2][1][RTW89_ETSI][15] = 36,
+       [2][1][RTW89_MKK][15] = 54,
+       [2][1][RTW89_IC][15] = 50,
+       [2][1][RTW89_KCC][15] = 48,
+       [2][1][RTW89_ACMA][15] = 36,
+       [2][1][RTW89_CHILE][15] = 56,
+       [2][1][RTW89_UKRAINE][15] = 36,
+       [2][1][RTW89_MEXICO][15] = 50,
+       [2][1][RTW89_CN][15] = 127,
+       [2][1][RTW89_QATAR][15] = 36,
+       [2][1][RTW89_UK][15] = 36,
+       [2][1][RTW89_FCC][17] = 50,
+       [2][1][RTW89_ETSI][17] = 36,
+       [2][1][RTW89_MKK][17] = 56,
+       [2][1][RTW89_IC][17] = 50,
+       [2][1][RTW89_KCC][17] = 48,
+       [2][1][RTW89_ACMA][17] = 36,
+       [2][1][RTW89_CHILE][17] = 56,
+       [2][1][RTW89_UKRAINE][17] = 36,
+       [2][1][RTW89_MEXICO][17] = 50,
+       [2][1][RTW89_CN][17] = 127,
+       [2][1][RTW89_QATAR][17] = 36,
+       [2][1][RTW89_UK][17] = 36,
+       [2][1][RTW89_FCC][19] = 50,
+       [2][1][RTW89_ETSI][19] = 36,
+       [2][1][RTW89_MKK][19] = 56,
+       [2][1][RTW89_IC][19] = 50,
+       [2][1][RTW89_KCC][19] = 48,
+       [2][1][RTW89_ACMA][19] = 36,
+       [2][1][RTW89_CHILE][19] = 56,
+       [2][1][RTW89_UKRAINE][19] = 36,
+       [2][1][RTW89_MEXICO][19] = 50,
+       [2][1][RTW89_CN][19] = 127,
+       [2][1][RTW89_QATAR][19] = 36,
+       [2][1][RTW89_UK][19] = 36,
+       [2][1][RTW89_FCC][21] = 50,
+       [2][1][RTW89_ETSI][21] = 36,
+       [2][1][RTW89_MKK][21] = 56,
+       [2][1][RTW89_IC][21] = 50,
+       [2][1][RTW89_KCC][21] = 48,
+       [2][1][RTW89_ACMA][21] = 36,
+       [2][1][RTW89_CHILE][21] = 58,
+       [2][1][RTW89_UKRAINE][21] = 36,
+       [2][1][RTW89_MEXICO][21] = 50,
+       [2][1][RTW89_CN][21] = 127,
+       [2][1][RTW89_QATAR][21] = 36,
+       [2][1][RTW89_UK][21] = 36,
+       [2][1][RTW89_FCC][23] = 50,
+       [2][1][RTW89_ETSI][23] = 36,
+       [2][1][RTW89_MKK][23] = 56,
+       [2][1][RTW89_IC][23] = 50,
+       [2][1][RTW89_KCC][23] = 48,
+       [2][1][RTW89_ACMA][23] = 36,
+       [2][1][RTW89_CHILE][23] = 58,
+       [2][1][RTW89_UKRAINE][23] = 36,
+       [2][1][RTW89_MEXICO][23] = 50,
+       [2][1][RTW89_CN][23] = 127,
+       [2][1][RTW89_QATAR][23] = 36,
+       [2][1][RTW89_UK][23] = 36,
+       [2][1][RTW89_FCC][25] = 50,
+       [2][1][RTW89_ETSI][25] = 36,
+       [2][1][RTW89_MKK][25] = 56,
+       [2][1][RTW89_IC][25] = 127,
+       [2][1][RTW89_KCC][25] = 48,
+       [2][1][RTW89_ACMA][25] = 127,
+       [2][1][RTW89_CHILE][25] = 58,
+       [2][1][RTW89_UKRAINE][25] = 36,
+       [2][1][RTW89_MEXICO][25] = 50,
+       [2][1][RTW89_CN][25] = 127,
+       [2][1][RTW89_QATAR][25] = 36,
+       [2][1][RTW89_UK][25] = 36,
+       [2][1][RTW89_FCC][27] = 50,
+       [2][1][RTW89_ETSI][27] = 36,
+       [2][1][RTW89_MKK][27] = 56,
+       [2][1][RTW89_IC][27] = 127,
+       [2][1][RTW89_KCC][27] = 48,
+       [2][1][RTW89_ACMA][27] = 127,
+       [2][1][RTW89_CHILE][27] = 58,
+       [2][1][RTW89_UKRAINE][27] = 36,
+       [2][1][RTW89_MEXICO][27] = 50,
+       [2][1][RTW89_CN][27] = 127,
+       [2][1][RTW89_QATAR][27] = 36,
+       [2][1][RTW89_UK][27] = 36,
+       [2][1][RTW89_FCC][29] = 50,
+       [2][1][RTW89_ETSI][29] = 36,
+       [2][1][RTW89_MKK][29] = 56,
+       [2][1][RTW89_IC][29] = 127,
+       [2][1][RTW89_KCC][29] = 48,
+       [2][1][RTW89_ACMA][29] = 127,
+       [2][1][RTW89_CHILE][29] = 56,
+       [2][1][RTW89_UKRAINE][29] = 36,
+       [2][1][RTW89_MEXICO][29] = 50,
+       [2][1][RTW89_CN][29] = 127,
+       [2][1][RTW89_QATAR][29] = 36,
+       [2][1][RTW89_UK][29] = 36,
+       [2][1][RTW89_FCC][31] = 50,
+       [2][1][RTW89_ETSI][31] = 36,
+       [2][1][RTW89_MKK][31] = 56,
+       [2][1][RTW89_IC][31] = 50,
+       [2][1][RTW89_KCC][31] = 48,
+       [2][1][RTW89_ACMA][31] = 36,
+       [2][1][RTW89_CHILE][31] = 56,
+       [2][1][RTW89_UKRAINE][31] = 36,
+       [2][1][RTW89_MEXICO][31] = 50,
+       [2][1][RTW89_CN][31] = 127,
+       [2][1][RTW89_QATAR][31] = 36,
+       [2][1][RTW89_UK][31] = 36,
+       [2][1][RTW89_FCC][33] = 50,
+       [2][1][RTW89_ETSI][33] = 36,
+       [2][1][RTW89_MKK][33] = 56,
+       [2][1][RTW89_IC][33] = 50,
+       [2][1][RTW89_KCC][33] = 48,
+       [2][1][RTW89_ACMA][33] = 36,
+       [2][1][RTW89_CHILE][33] = 56,
+       [2][1][RTW89_UKRAINE][33] = 36,
+       [2][1][RTW89_MEXICO][33] = 50,
+       [2][1][RTW89_CN][33] = 127,
+       [2][1][RTW89_QATAR][33] = 36,
+       [2][1][RTW89_UK][33] = 36,
+       [2][1][RTW89_FCC][35] = 50,
+       [2][1][RTW89_ETSI][35] = 36,
+       [2][1][RTW89_MKK][35] = 56,
+       [2][1][RTW89_IC][35] = 50,
+       [2][1][RTW89_KCC][35] = 48,
+       [2][1][RTW89_ACMA][35] = 36,
+       [2][1][RTW89_CHILE][35] = 56,
+       [2][1][RTW89_UKRAINE][35] = 36,
+       [2][1][RTW89_MEXICO][35] = 50,
+       [2][1][RTW89_CN][35] = 127,
+       [2][1][RTW89_QATAR][35] = 36,
+       [2][1][RTW89_UK][35] = 36,
+       [2][1][RTW89_FCC][37] = 50,
+       [2][1][RTW89_ETSI][37] = 127,
+       [2][1][RTW89_MKK][37] = 54,
+       [2][1][RTW89_IC][37] = 50,
+       [2][1][RTW89_KCC][37] = 48,
+       [2][1][RTW89_ACMA][37] = 60,
+       [2][1][RTW89_CHILE][37] = 56,
+       [2][1][RTW89_UKRAINE][37] = 127,
+       [2][1][RTW89_MEXICO][37] = 50,
+       [2][1][RTW89_CN][37] = 127,
+       [2][1][RTW89_QATAR][37] = 127,
+       [2][1][RTW89_UK][37] = 66,
+       [2][1][RTW89_FCC][38] = 84,
+       [2][1][RTW89_ETSI][38] = 16,
+       [2][1][RTW89_MKK][38] = 127,
+       [2][1][RTW89_IC][38] = 84,
+       [2][1][RTW89_KCC][38] = 48,
+       [2][1][RTW89_ACMA][38] = 84,
+       [2][1][RTW89_CHILE][38] = 58,
+       [2][1][RTW89_UKRAINE][38] = 16,
+       [2][1][RTW89_MEXICO][38] = 84,
+       [2][1][RTW89_CN][38] = 64,
+       [2][1][RTW89_QATAR][38] = 16,
+       [2][1][RTW89_UK][38] = 38,
+       [2][1][RTW89_FCC][40] = 84,
+       [2][1][RTW89_ETSI][40] = 16,
+       [2][1][RTW89_MKK][40] = 127,
+       [2][1][RTW89_IC][40] = 84,
+       [2][1][RTW89_KCC][40] = 48,
+       [2][1][RTW89_ACMA][40] = 84,
+       [2][1][RTW89_CHILE][40] = 58,
+       [2][1][RTW89_UKRAINE][40] = 16,
+       [2][1][RTW89_MEXICO][40] = 84,
+       [2][1][RTW89_CN][40] = 64,
+       [2][1][RTW89_QATAR][40] = 16,
+       [2][1][RTW89_UK][40] = 38,
+       [2][1][RTW89_FCC][42] = 84,
+       [2][1][RTW89_ETSI][42] = 16,
+       [2][1][RTW89_MKK][42] = 127,
+       [2][1][RTW89_IC][42] = 84,
+       [2][1][RTW89_KCC][42] = 48,
+       [2][1][RTW89_ACMA][42] = 84,
+       [2][1][RTW89_CHILE][42] = 58,
+       [2][1][RTW89_UKRAINE][42] = 16,
+       [2][1][RTW89_MEXICO][42] = 84,
+       [2][1][RTW89_CN][42] = 64,
+       [2][1][RTW89_QATAR][42] = 16,
+       [2][1][RTW89_UK][42] = 38,
+       [2][1][RTW89_FCC][44] = 84,
+       [2][1][RTW89_ETSI][44] = 16,
+       [2][1][RTW89_MKK][44] = 127,
+       [2][1][RTW89_IC][44] = 84,
+       [2][1][RTW89_KCC][44] = 48,
+       [2][1][RTW89_ACMA][44] = 84,
+       [2][1][RTW89_CHILE][44] = 58,
+       [2][1][RTW89_UKRAINE][44] = 16,
+       [2][1][RTW89_MEXICO][44] = 84,
+       [2][1][RTW89_CN][44] = 64,
+       [2][1][RTW89_QATAR][44] = 16,
+       [2][1][RTW89_UK][44] = 38,
+       [2][1][RTW89_FCC][46] = 84,
+       [2][1][RTW89_ETSI][46] = 16,
+       [2][1][RTW89_MKK][46] = 127,
+       [2][1][RTW89_IC][46] = 84,
+       [2][1][RTW89_KCC][46] = 48,
+       [2][1][RTW89_ACMA][46] = 84,
+       [2][1][RTW89_CHILE][46] = 58,
+       [2][1][RTW89_UKRAINE][46] = 16,
+       [2][1][RTW89_MEXICO][46] = 84,
+       [2][1][RTW89_CN][46] = 64,
+       [2][1][RTW89_QATAR][46] = 16,
+       [2][1][RTW89_UK][46] = 38,
+       [2][1][RTW89_FCC][48] = 44,
+       [2][1][RTW89_ETSI][48] = 127,
+       [2][1][RTW89_MKK][48] = 127,
+       [2][1][RTW89_IC][48] = 127,
+       [2][1][RTW89_KCC][48] = 127,
+       [2][1][RTW89_ACMA][48] = 127,
+       [2][1][RTW89_CHILE][48] = 127,
+       [2][1][RTW89_UKRAINE][48] = 127,
+       [2][1][RTW89_MEXICO][48] = 127,
+       [2][1][RTW89_CN][48] = 127,
+       [2][1][RTW89_QATAR][48] = 127,
+       [2][1][RTW89_UK][48] = 127,
+       [2][1][RTW89_FCC][50] = 44,
+       [2][1][RTW89_ETSI][50] = 127,
+       [2][1][RTW89_MKK][50] = 127,
+       [2][1][RTW89_IC][50] = 127,
+       [2][1][RTW89_KCC][50] = 127,
+       [2][1][RTW89_ACMA][50] = 127,
+       [2][1][RTW89_CHILE][50] = 127,
+       [2][1][RTW89_UKRAINE][50] = 127,
+       [2][1][RTW89_MEXICO][50] = 127,
+       [2][1][RTW89_CN][50] = 127,
+       [2][1][RTW89_QATAR][50] = 127,
+       [2][1][RTW89_UK][50] = 127,
+       [2][1][RTW89_FCC][52] = 44,
+       [2][1][RTW89_ETSI][52] = 127,
+       [2][1][RTW89_MKK][52] = 127,
+       [2][1][RTW89_IC][52] = 127,
+       [2][1][RTW89_KCC][52] = 127,
+       [2][1][RTW89_ACMA][52] = 127,
+       [2][1][RTW89_CHILE][52] = 127,
+       [2][1][RTW89_UKRAINE][52] = 127,
+       [2][1][RTW89_MEXICO][52] = 127,
+       [2][1][RTW89_CN][52] = 127,
+       [2][1][RTW89_QATAR][52] = 127,
+       [2][1][RTW89_UK][52] = 127,
+};
+
+const struct rtw89_phy_table rtw89_8852b_phy_bb_table = {
+       .regs           = rtw89_8852b_phy_bb_regs,
+       .n_regs         = ARRAY_SIZE(rtw89_8852b_phy_bb_regs),
+       .rf_path        = 0, /* don't care */
+};
+
+const struct rtw89_phy_table rtw89_8852b_phy_bb_gain_table = {
+       .regs           = rtw89_8852b_phy_bb_reg_gain,
+       .n_regs         = ARRAY_SIZE(rtw89_8852b_phy_bb_reg_gain),
+       .rf_path        = 0, /* don't care */
+};
+
+const struct rtw89_phy_table rtw89_8852b_phy_radioa_table = {
+       .regs           = rtw89_8852b_phy_radioa_regs,
+       .n_regs         = ARRAY_SIZE(rtw89_8852b_phy_radioa_regs),
+       .rf_path        = RF_PATH_A,
+       .config         = rtw89_phy_config_rf_reg_v1,
+};
+
+const struct rtw89_phy_table rtw89_8852b_phy_radiob_table = {
+       .regs           = rtw89_8852b_phy_radiob_regs,
+       .n_regs         = ARRAY_SIZE(rtw89_8852b_phy_radiob_regs),
+       .rf_path        = RF_PATH_B,
+       .config         = rtw89_phy_config_rf_reg_v1,
+};
+
+const struct rtw89_phy_table rtw89_8852b_phy_nctl_table = {
+       .regs           = rtw89_8852b_phy_nctl_regs,
+       .n_regs         = ARRAY_SIZE(rtw89_8852b_phy_nctl_regs),
+       .rf_path        = 0, /* don't care */
+};
+
+const struct rtw89_txpwr_table rtw89_8852b_byr_table = {
+       .data = rtw89_8852b_txpwr_byrate,
+       .size = ARRAY_SIZE(rtw89_8852b_txpwr_byrate),
+       .load = rtw89_phy_load_txpwr_byrate,
+};
+
+const struct rtw89_txpwr_track_cfg rtw89_8852b_trk_cfg = {
+       .delta_swingidx_5gb_n = _txpwr_track_delta_swingidx_5gb_n,
+       .delta_swingidx_5gb_p = _txpwr_track_delta_swingidx_5gb_p,
+       .delta_swingidx_5ga_n = _txpwr_track_delta_swingidx_5ga_n,
+       .delta_swingidx_5ga_p = _txpwr_track_delta_swingidx_5ga_p,
+       .delta_swingidx_2gb_n = _txpwr_track_delta_swingidx_2gb_n,
+       .delta_swingidx_2gb_p = _txpwr_track_delta_swingidx_2gb_p,
+       .delta_swingidx_2ga_n = _txpwr_track_delta_swingidx_2ga_n,
+       .delta_swingidx_2ga_p = _txpwr_track_delta_swingidx_2ga_p,
+       .delta_swingidx_2g_cck_b_n = _txpwr_track_delta_swingidx_2g_cck_b_n,
+       .delta_swingidx_2g_cck_b_p = _txpwr_track_delta_swingidx_2g_cck_b_p,
+       .delta_swingidx_2g_cck_a_n = _txpwr_track_delta_swingidx_2g_cck_a_n,
+       .delta_swingidx_2g_cck_a_p = _txpwr_track_delta_swingidx_2g_cck_a_p,
+};
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b_table.h b/drivers/net/wireless/realtek/rtw89/rtw8852b_table.h
new file mode 100644 (file)
index 0000000..114337a
--- /dev/null
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/* Copyright(c) 2019-2020  Realtek Corporation
+ */
+
+#ifndef __RTW89_8852B_TABLE_H__
+#define __RTW89_8852B_TABLE_H__
+
+#include "core.h"
+
+extern const struct rtw89_phy_table rtw89_8852b_phy_bb_table;
+extern const struct rtw89_phy_table rtw89_8852b_phy_bb_gain_table;
+extern const struct rtw89_phy_table rtw89_8852b_phy_radioa_table;
+extern const struct rtw89_phy_table rtw89_8852b_phy_radiob_table;
+extern const struct rtw89_phy_table rtw89_8852b_phy_nctl_table;
+extern const struct rtw89_txpwr_table rtw89_8852b_byr_table;
+extern const struct rtw89_txpwr_track_cfg rtw89_8852b_trk_cfg;
+extern const u8 rtw89_8852b_tx_shape[RTW89_BAND_MAX][RTW89_RS_TX_SHAPE_NUM]
+                                   [RTW89_REGD_NUM];
+extern const s8 rtw89_8852b_txpwr_lmt_2g[RTW89_2G_BW_NUM][RTW89_NTX_NUM]
+                                       [RTW89_RS_LMT_NUM][RTW89_BF_NUM]
+                                       [RTW89_REGD_NUM][RTW89_2G_CH_NUM];
+extern const s8 rtw89_8852b_txpwr_lmt_5g[RTW89_5G_BW_NUM][RTW89_NTX_NUM]
+                                       [RTW89_RS_LMT_NUM][RTW89_BF_NUM]
+                                       [RTW89_REGD_NUM][RTW89_5G_CH_NUM];
+extern const s8 rtw89_8852b_txpwr_lmt_ru_2g[RTW89_RU_NUM][RTW89_NTX_NUM]
+                                          [RTW89_REGD_NUM][RTW89_2G_CH_NUM];
+extern const s8 rtw89_8852b_txpwr_lmt_ru_5g[RTW89_RU_NUM][RTW89_NTX_NUM]
+                                          [RTW89_REGD_NUM][RTW89_5G_CH_NUM];
+
+#endif
index 7bf95c38d3eb2e9314a4b91cc8894988b73c77f5..0ef2ca8efeb0ed8300d1177ce932c4a5f12b8b7f 100644 (file)
@@ -7,18 +7,82 @@
 
 #include "pci.h"
 #include "reg.h"
+#include "rtw8852b.h"
 
 static const struct rtw89_pci_info rtw8852b_pci_info = {
+       .txbd_trunc_mode        = MAC_AX_BD_TRUNC,
+       .rxbd_trunc_mode        = MAC_AX_BD_TRUNC,
+       .rxbd_mode              = MAC_AX_RXBD_PKT,
+       .tag_mode               = MAC_AX_TAG_MULTI,
+       .tx_burst               = MAC_AX_TX_BURST_2048B,
+       .rx_burst               = MAC_AX_RX_BURST_128B,
+       .wd_dma_idle_intvl      = MAC_AX_WD_DMA_INTVL_256NS,
+       .wd_dma_act_intvl       = MAC_AX_WD_DMA_INTVL_256NS,
+       .multi_tag_num          = MAC_AX_TAG_NUM_8,
+       .lbc_en                 = MAC_AX_PCIE_ENABLE,
+       .lbc_tmr                = MAC_AX_LBC_TMR_2MS,
+       .autok_en               = MAC_AX_PCIE_DISABLE,
+       .io_rcy_en              = MAC_AX_PCIE_DISABLE,
+       .io_rcy_tmr             = MAC_AX_IO_RCY_ANA_TMR_6MS,
+
+       .init_cfg_reg           = R_AX_PCIE_INIT_CFG1,
+       .txhci_en_bit           = B_AX_TXHCI_EN,
+       .rxhci_en_bit           = B_AX_RXHCI_EN,
+       .rxbd_mode_bit          = B_AX_RXBD_MODE,
+       .exp_ctrl_reg           = R_AX_PCIE_EXP_CTRL,
+       .max_tag_num_mask       = B_AX_MAX_TAG_NUM,
+       .rxbd_rwptr_clr_reg     = R_AX_RXBD_RWPTR_CLR,
+       .txbd_rwptr_clr2_reg    = 0,
        .dma_stop1              = {R_AX_PCIE_DMA_STOP1, B_AX_TX_STOP1_MASK_V1},
        .dma_stop2              = {0},
        .dma_busy1              = {R_AX_PCIE_DMA_BUSY1, DMA_BUSY1_CHECK_V1},
        .dma_busy2_reg          = 0,
        .dma_busy3_reg          = R_AX_PCIE_DMA_BUSY1,
 
+       .rpwm_addr              = R_AX_PCIE_HRPWM,
+       .cpwm_addr              = R_AX_CPWM,
        .tx_dma_ch_mask         = BIT(RTW89_TXCH_ACH4) | BIT(RTW89_TXCH_ACH5) |
                                  BIT(RTW89_TXCH_ACH6) | BIT(RTW89_TXCH_ACH7) |
                                  BIT(RTW89_TXCH_CH10) | BIT(RTW89_TXCH_CH11),
+       .bd_idx_addr_low_power  = NULL,
+       .dma_addr_set           = &rtw89_pci_ch_dma_addr_set,
+
+       .ltr_set                = rtw89_pci_ltr_set,
+       .fill_txaddr_info       = rtw89_pci_fill_txaddr_info,
+       .config_intr_mask       = rtw89_pci_config_intr_mask,
+       .enable_intr            = rtw89_pci_enable_intr,
+       .disable_intr           = rtw89_pci_disable_intr,
+       .recognize_intrs        = rtw89_pci_recognize_intrs,
+};
+
+static const struct rtw89_driver_info rtw89_8852be_info = {
+       .chip = &rtw8852b_chip_info,
+       .bus = {
+               .pci = &rtw8852b_pci_info,
+       },
+};
+
+static const struct pci_device_id rtw89_8852be_id_table[] = {
+       {
+               PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xb852),
+               .driver_data = (kernel_ulong_t)&rtw89_8852be_info,
+       },
+       {
+               PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xb85b),
+               .driver_data = (kernel_ulong_t)&rtw89_8852be_info,
+       },
+       {},
+};
+MODULE_DEVICE_TABLE(pci, rtw89_8852be_id_table);
+
+static struct pci_driver rtw89_8852be_driver = {
+       .name           = "rtw89_8852be",
+       .id_table       = rtw89_8852be_id_table,
+       .probe          = rtw89_pci_probe,
+       .remove         = rtw89_pci_remove,
+       .driver.pm      = &rtw89_pm_ops,
 };
+module_pci_driver(rtw89_8852be_driver);
 
 MODULE_AUTHOR("Realtek Corporation");
 MODULE_DESCRIPTION("Realtek 802.11ax wireless 8852BE driver");
index 67653b3e1a356f4e50b186dae3f87b2788670e42..f6bcac82681664e6926a6775b6a45b0389c93329 100644 (file)
@@ -273,6 +273,9 @@ static int rtw8852c_pwr_on_func(struct rtw89_dev *rtwdev)
                          B_AX_CMAC_DMA_EN | B_AX_PTCLTOP_EN | B_AX_SCHEDULER_EN |
                          B_AX_TMAC_EN | B_AX_RMAC_EN);
 
+       rtw89_write32_mask(rtwdev, R_AX_LED1_FUNC_SEL, B_AX_PINMUX_EESK_FUNC_SEL_V1_MASK,
+                          PINMUX_EESK_FUNC_SEL_BT_LOG);
+
        return 0;
 }
 
@@ -785,40 +788,12 @@ static const struct rtw8852c_bb_gain_op1db bb_gain_op1db_a = {
        .mask_tia0_lna6 = 0xff000000,
 };
 
-static enum rtw89_phy_bb_gain_band
-rtw8852c_mapping_gain_band(enum rtw89_subband subband)
-{
-       switch (subband) {
-       default:
-       case RTW89_CH_2G:
-               return RTW89_BB_GAIN_BAND_2G;
-       case RTW89_CH_5G_BAND_1:
-               return RTW89_BB_GAIN_BAND_5G_L;
-       case RTW89_CH_5G_BAND_3:
-               return RTW89_BB_GAIN_BAND_5G_M;
-       case RTW89_CH_5G_BAND_4:
-               return RTW89_BB_GAIN_BAND_5G_H;
-       case RTW89_CH_6G_BAND_IDX0:
-       case RTW89_CH_6G_BAND_IDX1:
-               return RTW89_BB_GAIN_BAND_6G_L;
-       case RTW89_CH_6G_BAND_IDX2:
-       case RTW89_CH_6G_BAND_IDX3:
-               return RTW89_BB_GAIN_BAND_6G_M;
-       case RTW89_CH_6G_BAND_IDX4:
-       case RTW89_CH_6G_BAND_IDX5:
-               return RTW89_BB_GAIN_BAND_6G_H;
-       case RTW89_CH_6G_BAND_IDX6:
-       case RTW89_CH_6G_BAND_IDX7:
-               return RTW89_BB_GAIN_BAND_6G_UH;
-       }
-}
-
 static void rtw8852c_set_gain_error(struct rtw89_dev *rtwdev,
                                    enum rtw89_subband subband,
                                    enum rtw89_rf_path path)
 {
        const struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain;
-       u8 gain_band = rtw8852c_mapping_gain_band(subband);
+       u8 gain_band = rtw89_subband_to_bb_gain_band(subband);
        s32 val;
        u32 reg;
        u32 mask;
@@ -976,21 +951,7 @@ static void rtw8852c_set_gain_offset(struct rtw89_dev *rtwdev,
                rtw89_phy_write32_mask(rtwdev, R_RPL_OFST, B_RPL_OFST_MASK, tmp & 0x7f);
        }
 
-       switch (chan->subband_type) {
-       default:
-       case RTW89_CH_2G:
-               gain_band = RTW89_GAIN_OFFSET_2G_OFDM;
-               break;
-       case RTW89_CH_5G_BAND_1:
-               gain_band = RTW89_GAIN_OFFSET_5G_LOW;
-               break;
-       case RTW89_CH_5G_BAND_3:
-               gain_band = RTW89_GAIN_OFFSET_5G_MID;
-               break;
-       case RTW89_CH_5G_BAND_4:
-               gain_band = RTW89_GAIN_OFFSET_5G_HIGH;
-               break;
-       }
+       gain_band = rtw89_subband_to_gain_offset_band_of_ofdm(chan->subband_type);
 
        offset_q0 = -efuse_gain->offset[path][gain_band];
        offset_base_q4 = efuse_gain->offset_base[phy_idx];
@@ -2006,75 +1967,6 @@ static void rtw8852c_set_txpwr_ref(struct rtw89_dev *rtwdev,
                                      phy_idx);
 }
 
-static void rtw8852c_set_txpwr_byrate(struct rtw89_dev *rtwdev,
-                                     const struct rtw89_chan *chan,
-                                     enum rtw89_phy_idx phy_idx)
-{
-       u8 band = chan->band_type;
-       u8 ch = chan->channel;
-       static const u8 rs[] = {
-               RTW89_RS_CCK,
-               RTW89_RS_OFDM,
-               RTW89_RS_MCS,
-               RTW89_RS_HEDCM,
-       };
-       s8 tmp;
-       u8 i, j;
-       u32 val, shf, addr = R_AX_PWR_BY_RATE;
-       struct rtw89_rate_desc cur;
-
-       rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
-                   "[TXPWR] set txpwr byrate with ch=%d\n", ch);
-
-       for (cur.nss = 0; cur.nss <= RTW89_NSS_2; cur.nss++) {
-               for (i = 0; i < ARRAY_SIZE(rs); i++) {
-                       if (cur.nss >= rtw89_rs_nss_max[rs[i]])
-                               continue;
-
-                       val = 0;
-                       cur.rs = rs[i];
-
-                       for (j = 0; j < rtw89_rs_idx_max[rs[i]]; j++) {
-                               cur.idx = j;
-                               shf = (j % 4) * 8;
-                               tmp = rtw89_phy_read_txpwr_byrate(rtwdev, band,
-                                                                 &cur);
-                               val |= (tmp << shf);
-
-                               if ((j + 1) % 4)
-                                       continue;
-
-                               rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val);
-                               val = 0;
-                               addr += 4;
-                       }
-               }
-       }
-}
-
-static void rtw8852c_set_txpwr_offset(struct rtw89_dev *rtwdev,
-                                     const struct rtw89_chan *chan,
-                                     enum rtw89_phy_idx phy_idx)
-{
-       u8 band = chan->band_type;
-       struct rtw89_rate_desc desc = {
-               .nss = RTW89_NSS_1,
-               .rs = RTW89_RS_OFFSET,
-       };
-       u32 val = 0;
-       s8 v;
-
-       rtw89_debug(rtwdev, RTW89_DBG_TXPWR, "[TXPWR] set txpwr offset\n");
-
-       for (desc.idx = 0; desc.idx < RTW89_RATE_OFFSET_MAX; desc.idx++) {
-               v = rtw89_phy_read_txpwr_byrate(rtwdev, band, &desc);
-               val |= ((v & 0xf) << (4 * desc.idx));
-       }
-
-       rtw89_mac_txpwr_write32_mask(rtwdev, phy_idx, R_AX_PWR_RATE_OFST_CTRL,
-                                    GENMASK(19, 0), val);
-}
-
 static void rtw8852c_bb_set_tx_shape_dfir(struct rtw89_dev *rtwdev,
                                          u8 tx_shape_idx,
                                          enum rtw89_phy_idx phy_idx)
@@ -2147,83 +2039,15 @@ static void rtw8852c_set_tx_shape(struct rtw89_dev *rtwdev,
                                             tx_shape_ofdm);
 }
 
-static void rtw8852c_set_txpwr_limit(struct rtw89_dev *rtwdev,
-                                    const struct rtw89_chan *chan,
-                                    enum rtw89_phy_idx phy_idx)
-{
-#define __MAC_TXPWR_LMT_PAGE_SIZE 40
-       u8 ch = chan->channel;
-       u8 bw = chan->band_width;
-       struct rtw89_txpwr_limit lmt[NTX_NUM_8852C];
-       u32 addr, val;
-       const s8 *ptr;
-       u8 i, j;
-
-       rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
-                   "[TXPWR] set txpwr limit with ch=%d bw=%d\n", ch, bw);
-
-       for (i = 0; i < NTX_NUM_8852C; i++) {
-               rtw89_phy_fill_txpwr_limit(rtwdev, chan, &lmt[i], i);
-
-               for (j = 0; j < __MAC_TXPWR_LMT_PAGE_SIZE; j += 4) {
-                       addr = R_AX_PWR_LMT + j + __MAC_TXPWR_LMT_PAGE_SIZE * i;
-                       ptr = (s8 *)&lmt[i] + j;
-
-                       val = FIELD_PREP(GENMASK(7, 0), ptr[0]) |
-                             FIELD_PREP(GENMASK(15, 8), ptr[1]) |
-                             FIELD_PREP(GENMASK(23, 16), ptr[2]) |
-                             FIELD_PREP(GENMASK(31, 24), ptr[3]);
-
-                       rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val);
-               }
-       }
-#undef __MAC_TXPWR_LMT_PAGE_SIZE
-}
-
-static void rtw8852c_set_txpwr_limit_ru(struct rtw89_dev *rtwdev,
-                                       const struct rtw89_chan *chan,
-                                       enum rtw89_phy_idx phy_idx)
-{
-#define __MAC_TXPWR_LMT_RU_PAGE_SIZE 24
-       u8 ch = chan->channel;
-       u8 bw = chan->band_width;
-       struct rtw89_txpwr_limit_ru lmt_ru[NTX_NUM_8852C];
-       u32 addr, val;
-       const s8 *ptr;
-       u8 i, j;
-
-       rtw89_debug(rtwdev, RTW89_DBG_TXPWR,
-                   "[TXPWR] set txpwr limit ru with ch=%d bw=%d\n", ch, bw);
-
-       for (i = 0; i < NTX_NUM_8852C; i++) {
-               rtw89_phy_fill_txpwr_limit_ru(rtwdev, chan, &lmt_ru[i], i);
-
-               for (j = 0; j < __MAC_TXPWR_LMT_RU_PAGE_SIZE; j += 4) {
-                       addr = R_AX_PWR_RU_LMT + j +
-                              __MAC_TXPWR_LMT_RU_PAGE_SIZE * i;
-                       ptr = (s8 *)&lmt_ru[i] + j;
-
-                       val = FIELD_PREP(GENMASK(7, 0), ptr[0]) |
-                             FIELD_PREP(GENMASK(15, 8), ptr[1]) |
-                             FIELD_PREP(GENMASK(23, 16), ptr[2]) |
-                             FIELD_PREP(GENMASK(31, 24), ptr[3]);
-
-                       rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val);
-               }
-       }
-
-#undef __MAC_TXPWR_LMT_RU_PAGE_SIZE
-}
-
 static void rtw8852c_set_txpwr(struct rtw89_dev *rtwdev,
                               const struct rtw89_chan *chan,
                               enum rtw89_phy_idx phy_idx)
 {
-       rtw8852c_set_txpwr_byrate(rtwdev, chan, phy_idx);
-       rtw8852c_set_txpwr_offset(rtwdev, chan, phy_idx);
+       rtw89_phy_set_txpwr_byrate(rtwdev, chan, phy_idx);
+       rtw89_phy_set_txpwr_offset(rtwdev, chan, phy_idx);
        rtw8852c_set_tx_shape(rtwdev, chan, phy_idx);
-       rtw8852c_set_txpwr_limit(rtwdev, chan, phy_idx);
-       rtw8852c_set_txpwr_limit_ru(rtwdev, chan, phy_idx);
+       rtw89_phy_set_txpwr_limit(rtwdev, chan, phy_idx);
+       rtw89_phy_set_txpwr_limit_ru(rtwdev, chan, phy_idx);
 }
 
 static void rtw8852c_set_txpwr_ctrl(struct rtw89_dev *rtwdev,
@@ -2818,19 +2642,6 @@ static const struct rtw89_btc_fbtc_mreg rtw89_btc_8852c_mon_reg[] = {
        RTW89_DEF_FBTC_MREG(REG_BB, 4, 0x980),
 };
 
-static
-void rtw8852c_btc_bt_aci_imp(struct rtw89_dev *rtwdev)
-{
-       struct rtw89_btc *btc = &rtwdev->btc;
-       struct rtw89_btc_dm *dm = &btc->dm;
-       struct rtw89_btc_bt_info *bt = &btc->cx.bt;
-       struct rtw89_btc_bt_link_info *b = &bt->link_info;
-
-       /* fix LNA2 = level-5 for BT ACI issue at BTG */
-       if (btc->dm.wl_btg_rx && b->profile_cnt.now != 0)
-               dm->trx_para_level = 1;
-}
-
 static
 void rtw8852c_btc_update_bt_cnt(struct rtw89_dev *rtwdev)
 {
@@ -3027,7 +2838,6 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {
        .btc_set_wl_pri         = rtw8852c_btc_set_wl_pri,
        .btc_set_wl_txpwr_ctrl  = rtw8852c_btc_set_wl_txpwr_ctrl,
        .btc_get_bt_rssi        = rtw8852c_btc_get_bt_rssi,
-       .btc_bt_aci_imp         = rtw8852c_btc_bt_aci_imp,
        .btc_update_bt_cnt      = rtw8852c_btc_update_bt_cnt,
        .btc_wl_s1_standby      = rtw8852c_btc_wl_s1_standby,
        .btc_set_wl_rx_gain     = rtw8852c_btc_set_wl_rx_gain,
index 558dd0f048f2b35988eb0571cf01b253b9351047..ac642808a81ff462a416f14455c89ceda0805527 100644 (file)
@@ -9,7 +9,6 @@
 
 #define RF_PATH_NUM_8852C 2
 #define BB_PATH_NUM_8852C 2
-#define NTX_NUM_8852C 2
 
 struct rtw8852c_u_efuse {
        u8 rsvd[0x38];
index 006c2cf93111666abd567107fdce8238b6ace192..b0672b906e7bc075da847aeec5ac90d34956629b 100644 (file)
@@ -22,8 +22,7 @@ static const u32 _tssi_de_mcs_5m[RF_PATH_NUM_8852C] = {0x5828, 0x7828};
 static const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8852C] = {0x5830, 0x7830};
 
 static const u32 rtw8852c_backup_bb_regs[] = {
-       0x813c, 0x8124, 0x8120, 0xc0d4, 0xc0d8, 0xc0e8, 0x823c, 0x8224, 0x8220,
-       0xc1d4, 0xc1d8, 0xc1e8
+       0x8120, 0xc0d4, 0xc0d8, 0xc0e8, 0x8220, 0xc1d4, 0xc1d8, 0xc1e8
 };
 
 static const u32 rtw8852c_backup_rf_regs[] = {
@@ -1667,7 +1666,7 @@ static u8 _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
 
        ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55,
                                       10, 20000, false, rtwdev, 0xbff8, MASKBYTE0);
-       mdelay(10);
+       udelay(10);
        rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, MASKBYTE0);
 
        rtw89_debug(rtwdev, RTW89_DBG_RFK,
index 11f35e7a7f0e7a3dbb6dd18b0e03a370eecb6acd..96c264a057ff46f2e657708a2982219315e7e97f 100644 (file)
@@ -10,6 +10,8 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0xF0FF0000, 0x00000000},
        {0xF03300FF, 0x00000001},
        {0xF03400FF, 0x00000002},
+       {0xF03500FF, 0x00000003},
+       {0xF03600FF, 0x00000004},
        {0x70C, 0x00000020},
        {0x704, 0x601E0100},
        {0x4000, 0x00000000},
@@ -200,7 +202,7 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4264, 0x00000000},
        {0x4268, 0x00000000},
        {0x426C, 0x0418317C},
-       {0x46C0, 0x00000001},
+       {0x46C0, 0x00000000},
        {0x4270, 0x00D6135C},
        {0x46C4, 0x00000033},
        {0x4274, 0x00000000},
@@ -342,7 +344,7 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x442C, 0x00000000},
        {0x4430, 0x00000000},
        {0x4434, 0x00000000},
-       {0x4438, 0x590642D0},
+       {0x4438, 0x59096398},
        {0x443C, 0x398668A0},
        {0x4440, 0x6C100808},
        {0x4444, 0x4A145344},
@@ -566,9 +568,9 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4BA8, 0x002B6456},
        {0x45E0, 0x00000000},
        {0x45E4, 0x00000000},
-       {0x45E8, 0x00E2E1E1},
+       {0x45E8, 0x00C8E1E1},
        {0x45EC, 0xCBCBB6B6},
-       {0x45F0, 0x59100FCA},
+       {0x45F0, 0x5F900FCA},
        {0x4BAC, 0x12CAB6DE},
        {0x4BB0, 0x00001110},
        {0x45F4, 0x08882550},
@@ -584,9 +586,17 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4660, 0x41250EF4},
        {0x4664, 0x6750E458},
        {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x45DC, 0xE1CB38E8},
-       {0x4660, 0x4A2E1800},
-       {0x4664, 0x6750E462},
+       {0x45DC, 0xD1B942F4},
+       {0x4660, 0x41250EF4},
+       {0x4664, 0x6750E458},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x45DC, 0xD1B942F4},
+       {0x4660, 0x41250EF4},
+       {0x4664, 0x6750E458},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x45DC, 0xD1B942F4},
+       {0x4660, 0x41250EF4},
+       {0x4664, 0x6750E458},
        {0xA0000000, 0x00000000},
        {0x45DC, 0xE1CB38E8},
        {0x4660, 0x4A2E1800},
@@ -603,7 +613,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4688, 0x1A10FF04},
        {0x468C, 0x282A3000},
        {0x4690, 0x2A29292A},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4694, 0x04FA2A2A},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4694, 0x04FA2A2A},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4694, 0x06FA2A2A},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4694, 0x04FA2A2A},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
        {0x4694, 0x04FA2A2A},
+       {0xA0000000, 0x00000000},
+       {0x4694, 0x04FA2A2A},
+       {0xB0000000, 0x00000000},
        {0x4698, 0xEE0F04D1},
        {0x469C, 0x89291436},
        {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
@@ -612,6 +634,10 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x46A0, 0x0701E79E},
        {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
        {0x46A0, 0x0701E79E},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x46A0, 0x0701E79E},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x46A0, 0x0701E79E},
        {0xA0000000, 0x00000000},
        {0x46A0, 0x0701E79E},
        {0xB0000000, 0x00000000},
@@ -620,11 +646,17 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x46A8, 0x2212FF14},
        {0x46AC, 0x60423537},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x46A8, 0x649EFF14},
+       {0x46AC, 0xA1B37C4E},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
        {0x46A8, 0x4D1E7F14},
        {0x46AC, 0x60B37C4E},
-       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x46A8, 0x2212FF14},
-       {0x46AC, 0x60423537},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x46A8, 0x649EFF14},
+       {0x46AC, 0xA1B37C4E},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x46A8, 0x649EFF14},
+       {0x46AC, 0xA1B37C4E},
        {0xA0000000, 0x00000000},
        {0x46A8, 0x2212FF14},
        {0x46AC, 0x60423537},
@@ -637,11 +669,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4720, 0x3FFFFD63},
        {0x4724, 0xB58D11FF},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x46BC, 0x5107C252},
-       {0x4720, 0x27795843},
+       {0x46BC, 0x510FC252},
+       {0x4720, 0x27795303},
        {0x4724, 0xB58D11F5},
        {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x46BC, 0x5107C252},
+       {0x46BC, 0x510FC252},
+       {0x4720, 0x27795843},
+       {0x4724, 0xB58D11F5},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x46BC, 0x510FC252},
+       {0x4720, 0x27795303},
+       {0x4724, 0xB58D11F5},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x46BC, 0x510FC252},
        {0x4720, 0x27795303},
        {0x4724, 0xB58D11F5},
        {0xA0000000, 0x00000000},
@@ -656,11 +696,17 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4734, 0x00000020},
        {0x4738, 0x8325C500},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x4734, 0x003D4C20},
+       {0x4734, 0x003D5420},
        {0x4738, 0x8F25C500},
        {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4734, 0x003D4C20},
+       {0x4738, 0x8F25C500},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
        {0x4734, 0x003D5420},
-       {0x4738, 0x8725C500},
+       {0x4738, 0x8F25C500},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4734, 0x003D5420},
+       {0x4738, 0x8F25C500},
        {0xA0000000, 0x00000000},
        {0x4734, 0x00000020},
        {0x4738, 0x8325C500},
@@ -678,8 +724,14 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4BB4, 0x05EBC8AF},
        {0x4BB8, 0x99543D24},
        {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x4BB4, 0xFBD5B89F},
-       {0x4BB8, 0x99563918},
+       {0x4BB4, 0x05EBC8AF},
+       {0x4BB8, 0x99543D24},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4BB4, 0x05EBC8AF},
+       {0x4BB8, 0x99543D24},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4BB4, 0x05EBC8AF},
+       {0x4BB8, 0x99543D24},
        {0xA0000000, 0x00000000},
        {0x4BB4, 0xFBD5B89F},
        {0x4BB8, 0x99563918},
@@ -729,10 +781,10 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4C58, 0x00001146},
        {0x4C5C, 0x00000000},
        {0x4C60, 0x00000000},
-       {0x4C64, 0xE2E1E1DE},
+       {0x4C64, 0xC8E1E1DE},
        {0x4C68, 0xB6B600B6},
        {0x4C6C, 0xCACBCBCA},
-       {0x4C70, 0x8091010F},
+       {0x4C70, 0x80F9010F},
        {0x4C74, 0x00000B11},
        {0x46C8, 0x08882550},
        {0x46CC, 0x08CC2660},
@@ -747,9 +799,17 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4744, 0x412504E8},
        {0x4748, 0x6850E459},
        {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x4740, 0xE4CD38E8},
-       {0x4744, 0x4C321B04},
-       {0x4748, 0x6750E466},
+       {0x4740, 0xC5AD42F4},
+       {0x4744, 0x412504E8},
+       {0x4748, 0x6850E459},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4740, 0xC5AD42F4},
+       {0x4744, 0x412504E8},
+       {0x4748, 0x6850E459},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4740, 0xC5AD42F4},
+       {0x4744, 0x412504E8},
+       {0x4748, 0x6850E459},
        {0xA0000000, 0x00000000},
        {0x4740, 0xE4CD38E8},
        {0x4744, 0x4C321B04},
@@ -766,7 +826,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x476C, 0x1A10FF04},
        {0x4770, 0x282A3000},
        {0x4774, 0x2A29292A},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4778, 0x04FA2A2A},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4778, 0x04FA2A2A},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4778, 0x06FA2A2A},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
        {0x4778, 0x04FA2A2A},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4778, 0x04FA2A2A},
+       {0xA0000000, 0x00000000},
+       {0x4778, 0x04FA2A2A},
+       {0xB0000000, 0x00000000},
        {0x477C, 0xEE0F04D1},
        {0x49F0, 0x89291436},
        {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
@@ -775,6 +847,10 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x49F4, 0x0701E79E},
        {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
        {0x49F4, 0x0701E79E},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x49F4, 0x0701E79E},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x49F4, 0x0701E79E},
        {0xA0000000, 0x00000000},
        {0x49F4, 0x0701E79E},
        {0xB0000000, 0x00000000},
@@ -783,11 +859,17 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4A5C, 0x2212FF14},
        {0x4A60, 0x60423537},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4A5C, 0x649EFF14},
+       {0x4A60, 0xA1B37C4E},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
        {0x4A5C, 0x4D1E7F14},
        {0x4A60, 0x60B37C4E},
-       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x4A5C, 0x2212FF14},
-       {0x4A60, 0x60423537},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4A5C, 0x649EFF14},
+       {0x4A60, 0xA1B37C4E},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4A5C, 0x649EFF14},
+       {0x4A60, 0xA1B37C4E},
        {0xA0000000, 0x00000000},
        {0x4A5C, 0x2212FF14},
        {0x4A60, 0x60423537},
@@ -800,11 +882,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4A74, 0x3FFFFD63},
        {0x4A78, 0xB58D11FF},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x4A70, 0x5107C252},
-       {0x4A74, 0x27795843},
+       {0x4A70, 0x510FC252},
+       {0x4A74, 0x27795303},
        {0x4A78, 0xB58D11F5},
        {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x4A70, 0x5107C252},
+       {0x4A70, 0x510FC252},
+       {0x4A74, 0x27795843},
+       {0x4A78, 0xB58D11F5},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4A70, 0x510FC252},
+       {0x4A74, 0x27795303},
+       {0x4A78, 0xB58D11F5},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4A70, 0x510FC252},
        {0x4A74, 0x27795303},
        {0x4A78, 0xB58D11F5},
        {0xA0000000, 0x00000000},
@@ -819,11 +909,17 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4AA0, 0x00000020},
        {0x4AA4, 0x8325C500},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x4AA0, 0x003D4C20},
+       {0x4AA0, 0x003D5420},
        {0x4AA4, 0x8F25C500},
        {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4AA0, 0x003D4C20},
+       {0x4AA4, 0x8F25C500},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
        {0x4AA0, 0x003D5420},
-       {0x4AA4, 0x8725C500},
+       {0x4AA4, 0x8F25C500},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4AA0, 0x003D5420},
+       {0x4AA4, 0x8F25C500},
        {0xA0000000, 0x00000000},
        {0x4AA0, 0x00000020},
        {0x4AA4, 0x8325C500},
@@ -841,8 +937,14 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4C78, 0x07ECC9B0},
        {0x4C7C, 0x995B4126},
        {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x4C78, 0xFBD5B89F},
-       {0x4C7C, 0x99563918},
+       {0x4C78, 0x07ECC9B0},
+       {0x4C7C, 0x995B4126},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4C78, 0x07ECC9B0},
+       {0x4C7C, 0x995B4126},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4C78, 0x07ECC9B0},
+       {0x4C7C, 0x995B4126},
        {0xA0000000, 0x00000000},
        {0x4C78, 0xFBD5B89F},
        {0x4C7C, 0x99563918},
@@ -907,17 +1009,46 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x47B4, 0x00000005},
        {0x4D2C, 0x0008C0C1},
        {0x47B8, 0x00001759},
-       {0x47BC, 0x4B702400},
-       {0x47C0, 0x831508BA},
+       {0x47BC, 0x4B002402},
+       {0x47C0, 0x831508BC},
        {0x4A14, 0x000000E9},
-       {0x4D30, 0x00000001},
+       {0x4D30, 0x00000000},
        {0x4E94, 0x000000FC},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x47C4, 0x9ABBCACB},
        {0x47C8, 0x56767578},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x47C4, 0x9ABBCACB},
+       {0x47C8, 0x56767578},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x47C4, 0x9ABBCACB},
+       {0x47C8, 0x56767578},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x47C4, 0x9ABBCACB},
+       {0x47C8, 0x56767578},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x47C4, 0x9ABBCACB},
+       {0x47C8, 0x56767578},
+       {0xA0000000, 0x00000000},
+       {0x47C4, 0x9ABBCACB},
+       {0x47C8, 0x56767578},
+       {0xB0000000, 0x00000000},
        {0x47CC, 0xBBCCBBB3},
        {0x47D0, 0x57889989},
        {0x47D4, 0x00000F45},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x4D34, 0x7BB167AB},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4D34, 0x7BB1579A},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4D34, 0x7BB167AB},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4D34, 0x7BB1579A},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4D34, 0x7BB1579A},
+       {0xA0000000, 0x00000000},
+       {0x4D34, 0x7BB167AB},
+       {0xB0000000, 0x00000000},
        {0x4D38, 0xBBBBBB05},
        {0x4D3C, 0x777777BB},
        {0x4D40, 0x00015277},
@@ -942,7 +1073,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4D48, 0x8C413016},
        {0x4D4C, 0xA140B028},
        {0x4D50, 0x00150A31},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x481C, 0x576DF814},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x481C, 0x576DF814},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x481C, 0x576BF814},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x481C, 0x576DF814},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x481C, 0x576DF814},
+       {0xA0000000, 0x00000000},
+       {0x481C, 0x576DF814},
+       {0xB0000000, 0x00000000},
        {0x4820, 0xA08877AC},
        {0x4824, 0x0000007A},
        {0x4D54, 0x00001184},
@@ -967,7 +1110,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4D78, 0x994C1502},
        {0x4D7C, 0x00017912},
        {0x4EDC, 0x00000001},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x484C, 0x0000CA62},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
        {0x484C, 0x00008A62},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x484C, 0x0000CA62},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x484C, 0x00008A62},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x484C, 0x00008A62},
+       {0xA0000000, 0x00000000},
+       {0x484C, 0x0000CA62},
+       {0xB0000000, 0x00000000},
        {0x4D80, 0x00000002},
        {0x4850, 0x00000008},
        {0x4854, 0x009B902A},
@@ -1014,7 +1169,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4DA0, 0x8C413016},
        {0x4DA4, 0xA140B028},
        {0x4DA8, 0x00150A31},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x48D4, 0x576DF814},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x48D4, 0x576BF814},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x48D4, 0x576BF814},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x48D4, 0x576BF814},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x48D4, 0x576BF814},
+       {0xA0000000, 0x00000000},
+       {0x48D4, 0x576DF814},
+       {0xB0000000, 0x00000000},
        {0x48D8, 0xA08877AC},
        {0x48DC, 0x0000007A},
        {0x4DAC, 0x00001184},
@@ -1039,7 +1206,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4DD0, 0x994C1502},
        {0x4DD4, 0x00017912},
        {0x4EE4, 0x00000001},
-       {0x4904, 0x00008A62},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4904, 0x0000CA62},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4904, 0x0000CA62},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4904, 0x0000CA62},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4904, 0x0000CA62},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4904, 0x0000CA62},
+       {0xA0000000, 0x00000000},
+       {0x4904, 0x0000CA62},
+       {0xB0000000, 0x00000000},
        {0x4DD8, 0x00000002},
        {0x4908, 0x00000008},
        {0x490C, 0x80040000},
@@ -1096,8 +1275,8 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x4988, 0x00000000},
        {0x498C, 0x00000000},
        {0x4E34, 0x00FC0000},
-       {0x4E38, 0x0000F800},
-       {0x4E3C, 0x00000001},
+       {0x4E38, 0x00000000},
+       {0x4E3C, 0x00000003},
        {0x4990, 0x00000000},
        {0x4994, 0x00000000},
        {0x4998, 0x00000000},
@@ -1134,7 +1313,7 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x710, 0xEF810000},
        {0xC54, 0x1AE1436A},
        {0xC58, 0x41000000},
-       {0xC68, 0x10000050},
+       {0xC68, 0x90000050},
        {0xC6C, 0x20061020},
        {0x704, 0x601E0100},
        {0xC74, 0x00000000},
@@ -1225,12 +1404,12 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x328, 0xE000E000},
        {0x32C, 0x0041E000},
        {0x35C, 0x000004C4},
-       {0xC0D4, 0xA7C41460},
+       {0xC0D4, 0xA7441460},
        {0xC0D8, 0xC6BA7F67},
        {0xC0DC, 0x30C52868},
        {0xC0E0, 0x75008128},
        {0xC0E4, 0x0000272B},
-       {0xC1D4, 0xA7C41460},
+       {0xC1D4, 0xA7441460},
        {0xC1D8, 0xC6BA7F67},
        {0xC1DC, 0x30C52868},
        {0xC1E0, 0x75008128},
@@ -1290,7 +1469,7 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0xC8C, 0x02F2FC08},
        {0xC70, 0x071BFC00},
        {0x980, 0x10002251},
-       {0x988, 0x3C3C4107},
+       {0x988, 0x3C3C8107},
        {0x904, 0x00000005},
        {0x994, 0x00000010},
        {0x000, 0x0580801F},
@@ -1359,7 +1538,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x2310, 0xBC80536C},
        {0x2314, 0x0363A0F3},
        {0x2318, 0x000000BB},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x724, 0x00111200},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x724, 0x20111100},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x724, 0x20111100},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x724, 0x01100100},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x724, 0x01100100},
+       {0xA0000000, 0x00000000},
+       {0x724, 0x00111200},
+       {0xB0000000, 0x00000000},
        {0x704, 0x601E0D00},
        {0xC78, 0xBFFFFFFF},
        {0x704, 0x601E0D02},
@@ -1393,7 +1584,7 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0xC60, 0x017FFFF3},
        {0xC70, 0x071BFE00},
        {0xC70, 0x071BFE60},
-       {0xC6C, 0x20061021},
+       {0xC6C, 0x26061021},
        {0x58AC, 0x08000000},
        {0x78AC, 0x08000000},
        {0x8120, 0x10000000},
@@ -1452,7 +1643,7 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x12A0, 0x24903056},
        {0x12AC, 0x12333121},
        {0x12B8, 0x30020000},
-       {0x2000, 0x18BBBF84},
+       {0x2000, 0x20BBBF04},
        {0x2C14, 0x85000005},
        {0x3200, 0x00010142},
        {0x32A0, 0x24903056},
@@ -1469,7 +1660,21 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x76C8, 0x0E800400},
        {0x984, 0x000000E0},
        {0x2008, 0x000FFFFF},
+       {0x1210, 0x8049E304},
+       {0x3210, 0x8049E304},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x58B0, 0x00000800},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x58B0, 0x00000000},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x58B0, 0x00000000},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x58B0, 0x00000000},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x58B0, 0x00000000},
+       {0xA0000000, 0x00000000},
        {0x58B0, 0x00000800},
+       {0xB0000000, 0x00000000},
        {0x5A00, 0x00000000},
        {0x5A04, 0x00000000},
        {0x5A08, 0x00000000},
@@ -1479,7 +1684,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x5A18, 0x00000000},
        {0x5A1C, 0x00000000},
        {0x5A20, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A24, 0x00050000},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A24, 0x00000000},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A24, 0x00000000},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A24, 0x00000000},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A24, 0x00000000},
+       {0xA0000000, 0x00000000},
        {0x5A24, 0x00050000},
+       {0xB0000000, 0x00000000},
        {0x5A28, 0x00000000},
        {0x5A2C, 0x00000000},
        {0x5A30, 0x00000000},
@@ -1487,14 +1704,38 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x5A38, 0x00000000},
        {0x5A3C, 0x00000000},
        {0x5A40, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A44, 0x00000005},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A44, 0x00000000},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A44, 0x00000000},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A44, 0x00000000},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A44, 0x00000000},
+       {0xA0000000, 0x00000000},
        {0x5A44, 0x00000005},
+       {0xB0000000, 0x00000000},
        {0x5A48, 0x00000000},
        {0x5A4C, 0x00000000},
        {0x5A50, 0x00000000},
        {0x5A54, 0x00000000},
        {0x5A58, 0x00000000},
        {0x5A5C, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A60, 0x00050000},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A60, 0x00000000},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A60, 0x00000000},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A60, 0x00000000},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5A60, 0x00000000},
+       {0xA0000000, 0x00000000},
        {0x5A60, 0x00050000},
+       {0xB0000000, 0x00000000},
        {0x5A64, 0x00000000},
        {0x5A68, 0x00000000},
        {0x5A6C, 0x00000000},
@@ -1514,12 +1755,49 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x5AA4, 0x00000000},
        {0x5AA8, 0x00000000},
        {0x5AAC, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5AB0, 0x00050005},
+       {0x5AB4, 0x00050005},
+       {0x5AB8, 0x00050005},
+       {0x5ABC, 0x00050005},
+       {0x5AC0, 0x00000005},
+       {0x78B0, 0x00000800},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5AB0, 0x00000000},
+       {0x5AB4, 0x00000000},
+       {0x5AB8, 0x00000000},
+       {0x5ABC, 0x00000000},
+       {0x5AC0, 0x00000000},
+       {0x78B0, 0x00000000},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5AB0, 0x00000000},
+       {0x5AB4, 0x00000000},
+       {0x5AB8, 0x00000000},
+       {0x5ABC, 0x00000000},
+       {0x5AC0, 0x00000000},
+       {0x78B0, 0x00000000},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5AB0, 0x00000000},
+       {0x5AB4, 0x00000000},
+       {0x5AB8, 0x00000000},
+       {0x5ABC, 0x00000000},
+       {0x5AC0, 0x00000000},
+       {0x78B0, 0x00000000},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x5AB0, 0x00000000},
+       {0x5AB4, 0x00000000},
+       {0x5AB8, 0x00000000},
+       {0x5ABC, 0x00000000},
+       {0x5AC0, 0x00000000},
+       {0x78B0, 0x00000000},
+       {0xA0000000, 0x00000000},
        {0x5AB0, 0x00050005},
        {0x5AB4, 0x00050005},
        {0x5AB8, 0x00050005},
        {0x5ABC, 0x00050005},
        {0x5AC0, 0x00000005},
        {0x78B0, 0x00000800},
+       {0xB0000000, 0x00000000},
        {0x7A00, 0x00000000},
        {0x7A04, 0x00000000},
        {0x7A08, 0x00000000},
@@ -1529,7 +1807,19 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x7A18, 0x00000000},
        {0x7A1C, 0x00000000},
        {0x7A20, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A24, 0x00050000},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A24, 0x00000000},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A24, 0x00000000},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A24, 0x00000000},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A24, 0x00000000},
+       {0xA0000000, 0x00000000},
        {0x7A24, 0x00050000},
+       {0xB0000000, 0x00000000},
        {0x7A28, 0x00000000},
        {0x7A2C, 0x00000000},
        {0x7A30, 0x00000000},
@@ -1537,14 +1827,38 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x7A38, 0x00000000},
        {0x7A3C, 0x00000000},
        {0x7A40, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x7A44, 0x00000005},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A44, 0x00000000},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A44, 0x00000000},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A44, 0x00000000},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A44, 0x00000000},
+       {0xA0000000, 0x00000000},
+       {0x7A44, 0x00000005},
+       {0xB0000000, 0x00000000},
        {0x7A48, 0x00000000},
        {0x7A4C, 0x00000000},
        {0x7A50, 0x00000000},
        {0x7A54, 0x00000000},
        {0x7A58, 0x00000000},
        {0x7A5C, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x7A60, 0x00050000},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A60, 0x00000000},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A60, 0x00000000},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A60, 0x00000000},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7A60, 0x00000000},
+       {0xA0000000, 0x00000000},
+       {0x7A60, 0x00050000},
+       {0xB0000000, 0x00000000},
        {0x7A64, 0x00000000},
        {0x7A68, 0x00000000},
        {0x7A6C, 0x00000000},
@@ -1564,143 +1878,223 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_regs[] = {
        {0x7AA4, 0x00000000},
        {0x7AA8, 0x00000000},
        {0x7AAC, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7AB0, 0x00050005},
+       {0x7AB4, 0x00050005},
+       {0x7AB8, 0x00050005},
+       {0x7ABC, 0x00050005},
+       {0x7AC0, 0x00000005},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7AB0, 0x00000000},
+       {0x7AB4, 0x00000000},
+       {0x7AB8, 0x00000000},
+       {0x7ABC, 0x00000000},
+       {0x7AC0, 0x00000000},
+       {0x903400ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7AB0, 0x00000000},
+       {0x7AB4, 0x00000000},
+       {0x7AB8, 0x00000000},
+       {0x7ABC, 0x00000000},
+       {0x7AC0, 0x00000000},
+       {0x903500ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7AB0, 0x00000000},
+       {0x7AB4, 0x00000000},
+       {0x7AB8, 0x00000000},
+       {0x7ABC, 0x00000000},
+       {0x7AC0, 0x00000000},
+       {0x903600ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x7AB0, 0x00000000},
+       {0x7AB4, 0x00000000},
+       {0x7AB8, 0x00000000},
+       {0x7ABC, 0x00000000},
+       {0x7AC0, 0x00000000},
+       {0xA0000000, 0x00000000},
        {0x7AB0, 0x00050005},
        {0x7AB4, 0x00050005},
        {0x7AB8, 0x00050005},
        {0x7ABC, 0x00050005},
        {0x7AC0, 0x00000005},
+       {0xB0000000, 0x00000000},
        {0x0F0, 0x00010000},
-       {0x0F4, 0x00000018},
-       {0x0F8, 0x20220120},
+       {0x0F4, 0x00000028},
+       {0x0F8, 0x20220610},
 };
 
 static const struct rtw89_reg2_def rtw89_8852c_phy_bb_reg_gain[] = {
        {0xF0FF0000, 0x00000000},
        {0xF03300FF, 0x00000001},
-       {0x000, 0x01E3C39F},
-       {0x001, 0x00694727},
-       {0x002, 0x00005536},
-       {0x100, 0x02E3C39F},
-       {0x101, 0x0069472A},
+       {0x000, 0x0EEECAA6},
+       {0x001, 0x006C4B2C},
+       {0x002, 0x00005636},
+       {0x100, 0x0DEFCAA9},
+       {0x101, 0x00694B2C},
        {0x102, 0x00005536},
        {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x10000, 0x1A02E1C9},
        {0x10001, 0x00644A30},
        {0x10002, 0x00006750},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x10000, 0x0EF4D1B9},
-       {0x10001, 0x00584125},
-       {0x10002, 0x00006750},
+       {0x10000, 0x0BF1CEB6},
+       {0x10001, 0x00434328},
+       {0x10002, 0x00005050},
        {0xA0000000, 0x00000000},
-       {0x10000, 0x1A02E1C9},
-       {0x10001, 0x00644A30},
-       {0x10002, 0x00006750},
+       {0x10000, 0x1D08E8D0},
+       {0x10001, 0x00644C32},
+       {0x10002, 0x00006650},
        {0xB0000000, 0x00000000},
        {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x10100, 0x1901E1C8},
        {0x10101, 0x0061482D},
        {0x10102, 0x00006750},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x10100, 0x04E8C5AD},
-       {0x10101, 0x00594125},
-       {0x10102, 0x00006850},
+       {0x10100, 0x0BF0CEB8},
+       {0x10101, 0x00424227},
+       {0x10102, 0x00005050},
        {0xA0000000, 0x00000000},
-       {0x10100, 0x1901E1C8},
-       {0x10101, 0x0061482D},
-       {0x10102, 0x00006750},
+       {0x10100, 0x1F0AECD5},
+       {0x10101, 0x00634B31},
+       {0x10102, 0x00006550},
        {0xB0000000, 0x00000000},
        {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x20000, 0x1601E2CA},
        {0x20001, 0x005D452A},
        {0x20002, 0x00006750},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x20000, 0x0EF4D3BB},
-       {0x20001, 0x00563F25},
-       {0x20002, 0x00006850},
+       {0x20000, 0x0EF5D3BB},
+       {0x20001, 0x00454529},
+       {0x20002, 0x00005050},
        {0xA0000000, 0x00000000},
-       {0x20000, 0x1601E2CA},
-       {0x20001, 0x005D452A},
-       {0x20002, 0x00006750},
+       {0x20000, 0x1904E6CE},
+       {0x20001, 0x0060482D},
+       {0x20002, 0x00006650},
        {0xB0000000, 0x00000000},
        {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x20100, 0x1901E1C8},
        {0x20101, 0x0061482D},
        {0x20102, 0x00006750},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x20100, 0x0BF1CFB7},
-       {0x20101, 0x00574025},
-       {0x20102, 0x00006750},
+       {0x20100, 0x12F8D7C1},
+       {0x20101, 0x004A4A2E},
+       {0x20102, 0x00005050},
        {0xA0000000, 0x00000000},
-       {0x20100, 0x1901E1C8},
+       {0x20100, 0x1F0AECD5},
        {0x20101, 0x0061482D},
-       {0x20102, 0x00006750},
+       {0x20102, 0x00006550},
        {0xB0000000, 0x00000000},
        {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x30000, 0x1700E1CA},
        {0x30001, 0x005E472B},
        {0x30002, 0x00006750},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x30000, 0x05EFCEB7},
-       {0x30001, 0x004B351A},
-       {0x30002, 0x00006850},
+       {0x30000, 0x0DF6D5BE},
+       {0x30001, 0x00414126},
+       {0x30002, 0x00005050},
        {0xA0000000, 0x00000000},
-       {0x30000, 0x1700E1CA},
-       {0x30001, 0x005E472B},
-       {0x30002, 0x00006750},
+       {0x30000, 0x14FEE0CA},
+       {0x30001, 0x005C4328},
+       {0x30002, 0x00006650},
        {0xB0000000, 0x00000000},
        {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x30100, 0x14FEE0C9},
        {0x30101, 0x00594428},
        {0x30102, 0x00006650},
        {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
-       {0x30100, 0x0CF2D1B9},
-       {0x30101, 0x00563F24},
-       {0x30102, 0x00006750},
+       {0x30100, 0x0EF5D5C0},
+       {0x30101, 0x0045452A},
+       {0x30102, 0x00005050},
        {0xA0000000, 0x00000000},
-       {0x30100, 0x14FEE0C9},
-       {0x30101, 0x00594428},
+       {0x30100, 0x1F0AECD8},
+       {0x30101, 0x00654C31},
        {0x30102, 0x00006650},
        {0xB0000000, 0x00000000},
-       {0x40000, 0x13FCDDC8},
-       {0x40001, 0x005D4328},
-       {0x40002, 0x00006850},
-       {0x40100, 0x14FEE3CF},
-       {0x40101, 0x00583E24},
-       {0x40102, 0x00006850},
-       {0x50000, 0x0DF4D6C6},
-       {0x50001, 0x00604227},
-       {0x50002, 0x00006850},
-       {0x50100, 0x1903E7D5},
-       {0x50101, 0x0061462B},
-       {0x50102, 0x00006850},
-       {0x60000, 0x0FF5D7C6},
-       {0x60001, 0x005D4429},
-       {0x60002, 0x00006850},
-       {0x60100, 0x12FADECF},
-       {0x60101, 0x005B4126},
-       {0x60102, 0x00006850},
-       {0x70000, 0x09F1D2C3},
-       {0x70001, 0x00554026},
-       {0x70002, 0x00006750},
-       {0x70100, 0x0CF5DACC},
-       {0x70101, 0x00563E25},
-       {0x70102, 0x00006750},
+       {0x40000, 0x15FEE0CB},
+       {0x40001, 0x0060462B},
+       {0x40002, 0x00006450},
+       {0x40100, 0x1902E5D2},
+       {0x40101, 0x0063482E},
+       {0x40102, 0x00006450},
+       {0x50000, 0x1C04E6D3},
+       {0x50001, 0x006B5034},
+       {0x50002, 0x00006450},
+       {0x50100, 0x2009EDDB},
+       {0x50101, 0x006B5035},
+       {0x50102, 0x00006450},
+       {0x60000, 0x16FEE1CF},
+       {0x60001, 0x00634A2E},
+       {0x60002, 0x00006550},
+       {0x60100, 0x14FDE2D2},
+       {0x60101, 0x005E4429},
+       {0x60102, 0x00006450},
+       {0x70000, 0x0BF3D6C6},
+       {0x70001, 0x00573F24},
+       {0x70002, 0x00006550},
+       {0x70100, 0x08F0D6C7},
+       {0x70101, 0x0052391E},
+       {0x70102, 0x00006450},
        {0x2000000, 0x02E4C4A0},
        {0x2000001, 0x006A4828},
        {0x2000100, 0x02E4C5A1},
        {0x2000101, 0x00664629},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x2010000, 0x05EBC8AF},
        {0x2010001, 0x00543D24},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x2010000, 0x08EDCAB2},
+       {0x2010001, 0x00434327},
+       {0xA0000000, 0x00000000},
+       {0x2010000, 0x05EBC8AF},
+       {0x2010001, 0x00543D24},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x2010100, 0x07ECC9B0},
+       {0x2010101, 0x005B4126},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x2010100, 0x08ECCBB2},
+       {0x2010101, 0x003C3C20},
+       {0xA0000000, 0x00000000},
        {0x2010100, 0x07ECC9B0},
        {0x2010101, 0x005B4126},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x2020000, 0x05EDCCB2},
        {0x2020001, 0x004D361C},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x2020000, 0x0CF4D2BA},
+       {0x2020001, 0x00404025},
+       {0xA0000000, 0x00000000},
+       {0x2020000, 0x05EDCCB2},
+       {0x2020001, 0x004D361C},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x2020100, 0x06ECCBB2},
        {0x2020101, 0x00553D22},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x2020100, 0x09EECDB8},
+       {0x2020101, 0x00444428},
+       {0xA0000000, 0x00000000},
+       {0x2020100, 0x06ECCBB2},
+       {0x2020101, 0x00553D22},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x2030000, 0x02ECCCB3},
        {0x2030001, 0x00483118},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x2030000, 0x0DF8D6BF},
+       {0x2030001, 0x003F3F24},
+       {0xA0000000, 0x00000000},
+       {0x2030000, 0x02ECCCB3},
+       {0x2030001, 0x00483118},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x2030100, 0x04ECCCB2},
+       {0x2030101, 0x004F381C},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x2030100, 0x08EFCDBA},
+       {0x2030101, 0x00414126},
+       {0xA0000000, 0x00000000},
        {0x2030100, 0x04ECCCB2},
        {0x2030101, 0x004F381C},
+       {0xB0000000, 0x00000000},
        {0x3000000, 0x00000000},
        {0x3000001, 0x00000000},
        {0x3000002, 0x00000000},
@@ -1709,30 +2103,102 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_reg_gain[] = {
        {0x3000101, 0x00000000},
        {0x3000102, 0x00000000},
        {0x3000103, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x3010000, 0x0E0CFB0A},
        {0x3010001, 0x00100F06},
        {0x3010002, 0x34333333},
        {0x3010003, 0x3434343C},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x3010000, 0x0E0CFB0A},
+       {0x3010001, 0x00100F06},
+       {0x3010002, 0x34333327},
+       {0x3010003, 0x3434343C},
+       {0xA0000000, 0x00000000},
+       {0x3010000, 0x0E0CFB0A},
+       {0x3010001, 0x00100F06},
+       {0x3010002, 0x34333333},
+       {0x3010003, 0x3434343C},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x3010100, 0x0E0CFB0A},
        {0x3010101, 0x00100F06},
        {0x3010102, 0x34333333},
        {0x3010103, 0x3434343C},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x3010100, 0x0E0CFB0A},
+       {0x3010101, 0x00100F06},
+       {0x3010102, 0x34333327},
+       {0x3010103, 0x3434343C},
+       {0xA0000000, 0x00000000},
+       {0x3010100, 0x0E0CFB0A},
+       {0x3010101, 0x00100F06},
+       {0x3010102, 0x34333333},
+       {0x3010103, 0x3434343C},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x3020000, 0x0E0CFB0A},
+       {0x3020001, 0x00100F06},
+       {0x3020002, 0x34333333},
+       {0x3020003, 0x3434343C},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x3020000, 0x0E0CFB0A},
+       {0x3020001, 0x00100F06},
+       {0x3020002, 0x34333327},
+       {0x3020003, 0x3434343C},
+       {0xA0000000, 0x00000000},
        {0x3020000, 0x0E0CFB0A},
        {0x3020001, 0x00100F06},
        {0x3020002, 0x34333333},
        {0x3020003, 0x3434343C},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
        {0x3020100, 0x0E0CFB0A},
        {0x3020101, 0x00100F06},
        {0x3020102, 0x34333333},
        {0x3020103, 0x3434343C},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x3020100, 0x0E0CFB0A},
+       {0x3020101, 0x00100F06},
+       {0x3020102, 0x34333327},
+       {0x3020103, 0x3434343C},
+       {0xA0000000, 0x00000000},
+       {0x3020100, 0x0E0CFB0A},
+       {0x3020101, 0x00100F06},
+       {0x3020102, 0x34333333},
+       {0x3020103, 0x3434343C},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x3030000, 0x0E0CFB0A},
+       {0x3030001, 0x00100F06},
+       {0x3030002, 0x34333333},
+       {0x3030003, 0x3434343C},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x3030000, 0x0E0CFB0A},
+       {0x3030001, 0x00100F06},
+       {0x3030002, 0x34333327},
+       {0x3030003, 0x3434343C},
+       {0xA0000000, 0x00000000},
        {0x3030000, 0x0E0CFB0A},
        {0x3030001, 0x00100F06},
        {0x3030002, 0x34333333},
        {0x3030003, 0x3434343C},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x3030100, 0x0E0CFB0A},
+       {0x3030101, 0x00100F06},
+       {0x3030102, 0x34333333},
+       {0x3030103, 0x3434343C},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x3030100, 0x0E0CFB0A},
+       {0x3030101, 0x00100F06},
+       {0x3030102, 0x34333327},
+       {0x3030103, 0x3434343C},
+       {0xA0000000, 0x00000000},
        {0x3030100, 0x0E0CFB0A},
        {0x3030101, 0x00100F06},
        {0x3030102, 0x34333333},
        {0x3030103, 0x3434343C},
+       {0xB0000000, 0x00000000},
        {0x3040000, 0x0E0CFB0A},
        {0x3040001, 0x00100F06},
        {0x3040002, 0x343B3333},
@@ -1765,6 +2231,310 @@ static const struct rtw89_reg2_def rtw89_8852c_phy_bb_reg_gain[] = {
        {0x3070101, 0x00100F06},
        {0x3070102, 0x3C3B3333},
        {0x3070103, 0x34343C3C},
+       {0x4000000, 0x00000000},
+       {0x4000001, 0x76543210},
+       {0x4000002, 0x77777777},
+       {0x4000003, 0x35374425},
+       {0x4000004, 0x00000043},
+       {0x4000005, 0x000038E8},
+       {0x4000100, 0x00000000},
+       {0x4000101, 0x76543210},
+       {0x4000102, 0x77777777},
+       {0x4000103, 0x35374425},
+       {0x4000104, 0x00000043},
+       {0x4000105, 0x000038E8},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4010000, 0x00000000},
+       {0x4010001, 0x76543210},
+       {0x4010002, 0x77777777},
+       {0x4010003, 0x35374425},
+       {0x4010004, 0x00000042},
+       {0x4010005, 0x000038E8},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4010000, 0x0000FC50},
+       {0x4010001, 0x51403210},
+       {0x4010002, 0x76543276},
+       {0x4010003, 0x3A4DAA3C},
+       {0x4010004, 0x00000093},
+       {0x4010005, 0x000040E4},
+       {0xA0000000, 0x00000000},
+       {0x4010000, 0x00000000},
+       {0x4010001, 0x76543210},
+       {0x4010002, 0x77777777},
+       {0x4010003, 0x35374425},
+       {0x4010004, 0x00000042},
+       {0x4010005, 0x000038E8},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4010100, 0x00000000},
+       {0x4010101, 0x76543210},
+       {0x4010102, 0x77777777},
+       {0x4010103, 0x35374425},
+       {0x4010104, 0x00000042},
+       {0x4010105, 0x000038E8},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4010100, 0x0000FC50},
+       {0x4010101, 0x51403210},
+       {0x4010102, 0x76543276},
+       {0x4010103, 0x3A4DAA3C},
+       {0x4010104, 0x00000093},
+       {0x4010105, 0x000040E4},
+       {0xA0000000, 0x00000000},
+       {0x4010100, 0x00000000},
+       {0x4010101, 0x76543210},
+       {0x4010102, 0x77777777},
+       {0x4010103, 0x35374425},
+       {0x4010104, 0x00000042},
+       {0x4010105, 0x000038E8},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4020000, 0x00000000},
+       {0x4020001, 0x76543210},
+       {0x4020002, 0x77777777},
+       {0x4020003, 0x35374425},
+       {0x4020004, 0x00000042},
+       {0x4020005, 0x000038E8},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4020000, 0x0000FC50},
+       {0x4020001, 0x51403210},
+       {0x4020002, 0x76543276},
+       {0x4020003, 0x4B4DAA3C},
+       {0x4020004, 0x000000A3},
+       {0x4020005, 0x000040E4},
+       {0xA0000000, 0x00000000},
+       {0x4020000, 0x00000000},
+       {0x4020001, 0x76543210},
+       {0x4020002, 0x77777777},
+       {0x4020003, 0x35374425},
+       {0x4020004, 0x00000042},
+       {0x4020005, 0x000038E8},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4020100, 0x00000000},
+       {0x4020101, 0x76543210},
+       {0x4020102, 0x77777777},
+       {0x4020103, 0x35374425},
+       {0x4020104, 0x00000042},
+       {0x4020105, 0x000038E8},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4020100, 0x0000FC50},
+       {0x4020101, 0x51403210},
+       {0x4020102, 0x76543276},
+       {0x4020103, 0x3A4DAA3C},
+       {0x4020104, 0x00000093},
+       {0x4020105, 0x000040E4},
+       {0xA0000000, 0x00000000},
+       {0x4020100, 0x00000000},
+       {0x4020101, 0x76543210},
+       {0x4020102, 0x77777777},
+       {0x4020103, 0x35374425},
+       {0x4020104, 0x00000042},
+       {0x4020105, 0x000038E8},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4030000, 0x00000000},
+       {0x4030001, 0x76543210},
+       {0x4030002, 0x77777777},
+       {0x4030003, 0x35374425},
+       {0x4030004, 0x00000042},
+       {0x4030005, 0x000038E8},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4030000, 0x0000FC50},
+       {0x4030001, 0x51403210},
+       {0x4030002, 0x76543276},
+       {0x4030003, 0x3A4DAA3C},
+       {0x4030004, 0x00000093},
+       {0x4030005, 0x000040E4},
+       {0xA0000000, 0x00000000},
+       {0x4030000, 0x00000000},
+       {0x4030001, 0x76543210},
+       {0x4030002, 0x77777777},
+       {0x4030003, 0x35374425},
+       {0x4030004, 0x00000042},
+       {0x4030005, 0x000038E8},
+       {0xB0000000, 0x00000000},
+       {0x80ff0000, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4030100, 0x00000000},
+       {0x4030101, 0x76543210},
+       {0x4030102, 0x77777777},
+       {0x4030103, 0x35374425},
+       {0x4030104, 0x00000042},
+       {0x4030105, 0x000038E8},
+       {0x903300ff, 0x00000000}, {0x40000000, 0x00000000},
+       {0x4030100, 0x0000FC50},
+       {0x4030101, 0x51403210},
+       {0x4030102, 0x76543276},
+       {0x4030103, 0x3A4DAA3C},
+       {0x4030104, 0x00000093},
+       {0x4030105, 0x000040E4},
+       {0xA0000000, 0x00000000},
+       {0x4030100, 0x00000000},
+       {0x4030101, 0x76543210},
+       {0x4030102, 0x77777777},
+       {0x4030103, 0x35374425},
+       {0x4030104, 0x00000042},
+       {0x4030105, 0x000038E8},
+       {0xB0000000, 0x00000000},
+       {0x1000000, 0x00000008},
+       {0x1000010, 0x00000008},
+       {0x1000011, 0x00000000},
+       {0x1000100, 0x00000004},
+       {0x1000110, 0x00000004},
+       {0x1000111, 0x00000000},
+       {0x1010000, 0x00000004},
+       {0x1010010, 0x00000004},
+       {0x1010011, 0x00000000},
+       {0x1010020, 0x00000004},
+       {0x1010021, 0x00000000},
+       {0x1010029, 0x00000000},
+       {0x1010030, 0x00000000},
+       {0x1010031, 0x00000000},
+       {0x1010035, 0x00000000},
+       {0x1010039, 0x00000000},
+       {0x101003D, 0x00000000},
+       {0x1010100, 0x00000010},
+       {0x1010110, 0x00000010},
+       {0x1010111, 0x00000000},
+       {0x1010120, 0x00000010},
+       {0x1010121, 0x00000000},
+       {0x1010129, 0x00000000},
+       {0x1010030, 0x00000000},
+       {0x1010031, 0x00000000},
+       {0x1010035, 0x00000000},
+       {0x1010039, 0x00000000},
+       {0x101003D, 0x00000000},
+       {0x1020000, 0x000000FA},
+       {0x1020010, 0x000000FA},
+       {0x1020011, 0x00000000},
+       {0x1020020, 0x000000FA},
+       {0x1020021, 0x00000000},
+       {0x1020029, 0x00000000},
+       {0x1020030, 0x00000000},
+       {0x1020031, 0x00000000},
+       {0x1020035, 0x00000000},
+       {0x1020039, 0x00000000},
+       {0x102003D, 0x00000000},
+       {0x1020100, 0x0000000D},
+       {0x1020110, 0x0000000D},
+       {0x1020111, 0x00000000},
+       {0x1020120, 0x0000000D},
+       {0x1020121, 0x00000000},
+       {0x1020129, 0x00000000},
+       {0x1020030, 0x00000000},
+       {0x1020031, 0x00000000},
+       {0x1020035, 0x00000000},
+       {0x1020039, 0x00000000},
+       {0x102003D, 0x00000000},
+       {0x1030000, 0x000000E4},
+       {0x1030010, 0x000000E4},
+       {0x1030011, 0x00000000},
+       {0x1030020, 0x0000E8E8},
+       {0x1030021, 0x00000000},
+       {0x1030029, 0x00000000},
+       {0x1030030, 0x00000000},
+       {0x1030031, 0x00000000},
+       {0x1030035, 0x00000000},
+       {0x1030039, 0x00000000},
+       {0x103003D, 0x00000000},
+       {0x1030100, 0x00000018},
+       {0x1030110, 0x00000018},
+       {0x1030111, 0x00000000},
+       {0x1030120, 0x00000018},
+       {0x1030121, 0x00000000},
+       {0x1030129, 0x00000000},
+       {0x1030030, 0x00000000},
+       {0x1030031, 0x00000000},
+       {0x1030035, 0x00000000},
+       {0x1030039, 0x00000000},
+       {0x103003D, 0x00000000},
+       {0x1040000, 0x000000EE},
+       {0x1040010, 0x000000EE},
+       {0x1040011, 0x00000000},
+       {0x1040020, 0x000000EE},
+       {0x1040021, 0x00000000},
+       {0x1040029, 0x00000000},
+       {0x1040030, 0x000000EE},
+       {0x1040031, 0x00000000},
+       {0x1040035, 0x00000000},
+       {0x1040039, 0x00000000},
+       {0x104003D, 0x00000000},
+       {0x1040100, 0x00000000},
+       {0x1040110, 0x00000005},
+       {0x1040111, 0x00000000},
+       {0x1040120, 0x00000008},
+       {0x1040121, 0x00000000},
+       {0x1040129, 0x00000000},
+       {0x1040030, 0x00000008},
+       {0x1040031, 0x00000000},
+       {0x1040035, 0x00000000},
+       {0x1040039, 0x00000000},
+       {0x104003D, 0x00000000},
+       {0x1050000, 0x00000008},
+       {0x1050010, 0x0000000B},
+       {0x1050011, 0x00000000},
+       {0x1050020, 0x00000015},
+       {0x1050021, 0x00000000},
+       {0x1050029, 0x00000000},
+       {0x1050030, 0x00000010},
+       {0x1050031, 0x00000000},
+       {0x1050035, 0x00000000},
+       {0x1050039, 0x00000000},
+       {0x105003D, 0x00000000},
+       {0x1050100, 0x00000016},
+       {0x1050110, 0x00000016},
+       {0x1050111, 0x0000F8F8},
+       {0x1050120, 0x0000001A},
+       {0x1050121, 0x00000000},
+       {0x1050129, 0x00000000},
+       {0x1050030, 0x0000001A},
+       {0x1050031, 0x00000000},
+       {0x1050035, 0x00000000},
+       {0x1050039, 0x00000000},
+       {0x105003D, 0x00000000},
+       {0x1060000, 0x000000F8},
+       {0x1060010, 0x000000F8},
+       {0x1060011, 0x00000000},
+       {0x1060020, 0x00000000},
+       {0x1060021, 0x00000000},
+       {0x1060029, 0x00000000},
+       {0x1060030, 0x00000000},
+       {0x1060031, 0x00000000},
+       {0x1060035, 0x00000000},
+       {0x1060039, 0x00000000},
+       {0x106003D, 0x00000000},
+       {0x1060100, 0x000000F6},
+       {0x1060110, 0x000000F6},
+       {0x1060111, 0x00000000},
+       {0x1060120, 0x000000F6},
+       {0x1060121, 0x00000000},
+       {0x1060129, 0x00000000},
+       {0x1060030, 0x00000000},
+       {0x1060031, 0x00000000},
+       {0x1060035, 0x00000000},
+       {0x1060039, 0x00000000},
+       {0x106003D, 0x00000000},
+       {0x1070000, 0x000000E8},
+       {0x1070010, 0x000000E8},
+       {0x1070011, 0x00000000},
+       {0x1070020, 0x000000E8},
+       {0x1070021, 0x00000000},
+       {0x1070029, 0x00000000},
+       {0x1070030, 0x000000F0},
+       {0x1070031, 0x00000000},
+       {0x1070035, 0x00000000},
+       {0x1070039, 0x00000000},
+       {0x107003D, 0x00000000},
+       {0x1070100, 0x000000E4},
+       {0x1070110, 0x000000E4},
+       {0x1070111, 0x00000000},
+       {0x1070120, 0x000000E4},
+       {0x1070121, 0x00000000},
+       {0x1070129, 0x00000000},
+       {0x1070030, 0x000000F0},
+       {0x1070031, 0x00000000},
+       {0x1070035, 0x00000000},
+       {0x1070039, 0x00000000},
+       {0x107003D, 0x00000000},
 };
 
 static const struct rtw89_reg2_def rtw89_8852c_phy_radioa_regs[] = {
index 2fbec51c8f944bf9c5f87b728e3bec17acd2890c..bc1f038d165502d6198c1999bb0a6d1372c428e1 100644 (file)
@@ -1958,6 +1958,7 @@ static int rsi_mac80211_resume(struct ieee80211_hw *hw)
 
 static const struct ieee80211_ops mac80211_ops = {
        .tx = rsi_mac80211_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .start = rsi_mac80211_start,
        .stop = rsi_mac80211_stop,
        .add_interface = rsi_mac80211_add_interface,
index 84d82ddded567ebbd70953ea0d0857c88d1f64f6..6b9864e478ac850cc96ef4f86407bc0892d9f94f 100644 (file)
@@ -128,6 +128,7 @@ static const struct ieee80211_ops wfx_ops = {
        .remove_interface        = wfx_remove_interface,
        .config                  = wfx_config,
        .tx                      = wfx_tx,
+       .wake_tx_queue           = ieee80211_handle_wake_tx_queue,
        .join_ibss               = wfx_join_ibss,
        .leave_ibss              = wfx_leave_ibss,
        .conf_tx                 = wfx_conf_tx,
index 326b1cc1d2bcb6092d5becf332f34ef7912f1109..381013e0db636799159e82494d2e4fde67314739 100644 (file)
@@ -209,6 +209,7 @@ static const struct ieee80211_ops cw1200_ops = {
        .remove_interface       = cw1200_remove_interface,
        .change_interface       = cw1200_change_interface,
        .tx                     = cw1200_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .hw_scan                = cw1200_hw_scan,
        .set_tim                = cw1200_set_tim,
        .sta_notify             = cw1200_sta_notify,
index 289371689a8deb728039bcfe205374df8829280b..eded284af6009335ec6a735d608c1d91ee8cf7a6 100644 (file)
@@ -1359,6 +1359,7 @@ static const struct ieee80211_ops wl1251_ops = {
        .prepare_multicast = wl1251_op_prepare_multicast,
        .configure_filter = wl1251_op_configure_filter,
        .tx = wl1251_op_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .set_key = wl1251_op_set_key,
        .hw_scan = wl1251_op_hw_scan,
        .bss_info_changed = wl1251_op_bss_info_changed,
index 28c0f06e311f75fb1739f0c81b6aa8aae978ef62..bf21611872a3c1ac81438a72439d694933083ef7 100644 (file)
@@ -5942,6 +5942,7 @@ static const struct ieee80211_ops wl1271_ops = {
        .prepare_multicast = wl1271_op_prepare_multicast,
        .configure_filter = wl1271_op_configure_filter,
        .tx = wl1271_op_tx,
+       .wake_tx_queue = ieee80211_handle_wake_tx_queue,
        .set_key = wlcore_op_set_key,
        .hw_scan = wl1271_op_hw_scan,
        .cancel_hw_scan = wl1271_op_cancel_hw_scan,
index 80b905d49954294c49c53908d15d31af74965ef2..5d534e15a844f7e9cb88d0cd2eb8477915c5465d 100644 (file)
@@ -1344,6 +1344,7 @@ static u64 zd_op_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 
 static const struct ieee80211_ops zd_ops = {
        .tx                     = zd_op_tx,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = zd_op_start,
        .stop                   = zd_op_stop,
        .add_interface          = zd_op_add_interface,
index 56c3cf3ba53d91e976e978a1324e846bdb12e70b..45e5eccadb44143f4445a755605c04478e113c03 100644 (file)
@@ -1685,6 +1685,7 @@ static void vnt_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 
 static const struct ieee80211_ops vnt_mac_ops = {
        .tx                     = vnt_tx_80211,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = vnt_start,
        .stop                   = vnt_stop,
        .add_interface          = vnt_add_interface,
index 897ee0f7fc6bbfa9c86537c74c7d733c9481ec43..2abae90f3f520028b25daeba3b343bac6d939f0d 100644 (file)
@@ -957,6 +957,7 @@ static void vnt_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 
 static const struct ieee80211_ops vnt_mac_ops = {
        .tx                     = vnt_tx_80211,
+       .wake_tx_queue          = ieee80211_handle_wake_tx_queue,
        .start                  = vnt_start,
        .stop                   = vnt_stop,
        .add_interface          = vnt_add_interface,
index 79690938d9a2d81b23a3116d9ae7ca8f945892f1..6252f02f38b78bf1c2d72371956f0e971ab83ec6 100644 (file)
@@ -4573,18 +4573,17 @@ static inline u8 ieee80211_mle_common_size(const u8 *data)
 
        switch (u16_get_bits(control, IEEE80211_ML_CONTROL_TYPE)) {
        case IEEE80211_ML_CONTROL_TYPE_BASIC:
-               common += sizeof(struct ieee80211_mle_basic_common_info);
-               break;
        case IEEE80211_ML_CONTROL_TYPE_PREQ:
-               common += sizeof(struct ieee80211_mle_preq_common_info);
+       case IEEE80211_ML_CONTROL_TYPE_TDLS:
+               /*
+                * The length is the first octet pointed by mle->variable so no
+                * need to add anything
+                */
                break;
        case IEEE80211_ML_CONTROL_TYPE_RECONF:
                if (control & IEEE80211_MLC_RECONF_PRES_MLD_MAC_ADDR)
                        common += ETH_ALEN;
                return common;
-       case IEEE80211_ML_CONTROL_TYPE_TDLS:
-               common += sizeof(struct ieee80211_mle_tdls_common_info);
-               break;
        case IEEE80211_ML_CONTROL_TYPE_PRIO_ACCESS:
                if (control & IEEE80211_MLC_PRIO_ACCESS_PRES_AP_MLD_MAC_ADDR)
                        common += ETH_ALEN;
@@ -4594,7 +4593,7 @@ static inline u8 ieee80211_mle_common_size(const u8 *data)
                return 0;
        }
 
-       return common + mle->variable[0];
+       return sizeof(*mle) + common + mle->variable[0];
 }
 
 /**
@@ -4602,7 +4601,7 @@ static inline u8 ieee80211_mle_common_size(const u8 *data)
  * @data: pointer to the element data
  * @len: length of the containing element
  */
-static inline bool ieee80211_mle_size_ok(const u8 *data, u8 len)
+static inline bool ieee80211_mle_size_ok(const u8 *data, size_t len)
 {
        const struct ieee80211_multi_link_elem *mle = (const void *)data;
        u8 fixed = sizeof(*mle);
@@ -4667,6 +4666,7 @@ static inline bool ieee80211_mle_size_ok(const u8 *data, u8 len)
 
 enum ieee80211_mle_subelems {
        IEEE80211_MLE_SUBELEM_PER_STA_PROFILE           = 0,
+       IEEE80211_MLE_SUBELEM_FRAGMENT                  = 254,
 };
 
 #define IEEE80211_MLE_STA_CONTROL_LINK_ID                      0x000f
@@ -4685,6 +4685,46 @@ struct ieee80211_mle_per_sta_profile {
        u8 variable[];
 } __packed;
 
+/**
+ * ieee80211_mle_sta_prof_size_ok - validate multi-link element sta profile size
+ * @data: pointer to the sub element data
+ * @len: length of the containing sub element
+ */
+static inline bool ieee80211_mle_sta_prof_size_ok(const u8 *data, size_t len)
+{
+       const struct ieee80211_mle_per_sta_profile *prof = (const void *)data;
+       u16 control;
+       u8 fixed = sizeof(*prof);
+       u8 info_len = 1;
+
+       if (len < fixed)
+               return false;
+
+       control = le16_to_cpu(prof->control);
+
+       if (control & IEEE80211_MLE_STA_CONTROL_STA_MAC_ADDR_PRESENT)
+               info_len += 6;
+       if (control & IEEE80211_MLE_STA_CONTROL_BEACON_INT_PRESENT)
+               info_len += 2;
+       if (control & IEEE80211_MLE_STA_CONTROL_TSF_OFFS_PRESENT)
+               info_len += 8;
+       if (control & IEEE80211_MLE_STA_CONTROL_DTIM_INFO_PRESENT)
+               info_len += 2;
+       if (control & IEEE80211_MLE_STA_CONTROL_BSS_PARAM_CHANGE_CNT_PRESENT)
+               info_len += 1;
+
+       if (control & IEEE80211_MLE_STA_CONTROL_COMPLETE_PROFILE &&
+           control & IEEE80211_MLE_STA_CONTROL_NSTR_BITMAP_SIZE) {
+               if (control & IEEE80211_MLE_STA_CONTROL_NSTR_BITMAP_SIZE)
+                       info_len += 2;
+               else
+                       info_len += 1;
+       }
+
+       return prof->sta_info_len >= info_len &&
+              fixed + prof->sta_info_len <= len;
+}
+
 #define for_each_mle_subelement(_elem, _data, _len)                    \
        if (ieee80211_mle_size_ok(_data, _len))                         \
                for_each_element(_elem,                                 \
index e09ff87146c1c56522ef7b5188951b94f60420cd..11a370e64143b4337afa512394ecf2da476281d1 100644 (file)
@@ -2105,6 +2105,7 @@ struct mpath_info {
  *
  * Used to change BSS parameters (mainly for AP mode).
  *
+ * @link_id: link_id or -1 for non-MLD
  * @use_cts_prot: Whether to use CTS protection
  *     (0 = no, 1 = yes, -1 = do not change)
  * @use_short_preamble: Whether the use of short preambles is allowed
@@ -2122,6 +2123,7 @@ struct mpath_info {
  * @p2p_opp_ps: P2P opportunistic PS (-1 = no change)
  */
 struct bss_parameters {
+       int link_id;
        int use_cts_prot;
        int use_short_preamble;
        int use_short_slot_time;
@@ -6933,6 +6935,8 @@ void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr);
  * @ap_mld_addr: AP MLD address (in case of MLO)
  * @links: per-link information indexed by link ID, use links[0] for
  *     non-MLO connections
+ * @links.status: Set this (along with a BSS pointer) for links that
+ *     were rejected by the AP.
  */
 struct cfg80211_rx_assoc_resp {
        const u8 *buf;
@@ -6944,6 +6948,7 @@ struct cfg80211_rx_assoc_resp {
        struct {
                const u8 *addr;
                struct cfg80211_bss *bss;
+               u16 status;
        } links[IEEE80211_MLD_MAX_NUM_LINKS];
 };
 
@@ -7454,6 +7459,9 @@ struct cfg80211_fils_resp_params {
  *     if the bss is expired during the connection, esp. for those drivers
  *     implementing connect op. Only one parameter among @bssid and @bss needs
  *     to be specified.
+ * @links.status: per-link status code, to report a status code that's not
+ *     %WLAN_STATUS_SUCCESS for a given link, it must also be in the
+ *     @valid_links bitmap and may have a BSS pointer (which is then released)
  */
 struct cfg80211_connect_resp_params {
        int status;
@@ -7470,6 +7478,7 @@ struct cfg80211_connect_resp_params {
                const u8 *addr;
                const u8 *bssid;
                struct cfg80211_bss *bss;
+               u16 status;
        } links[IEEE80211_MLD_MAX_NUM_LINKS];
 };
 
@@ -7674,6 +7683,8 @@ void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
  *
  * @dev: network device
  * @bssid: the BSSID of the AP
+ * @td_bitmap: transition disable policy
+ * @td_bitmap_len: Length of transition disable policy
  * @gfp: allocation flags
  *
  * This function should be called by a driver that supports 4 way handshake
@@ -7684,7 +7695,7 @@ void cfg80211_roamed(struct net_device *dev, struct cfg80211_roam_info *info,
  * indicate the 802.11 association.
  */
 void cfg80211_port_authorized(struct net_device *dev, const u8 *bssid,
-                             gfp_t gfp);
+                             const u8* td_bitmap, u8 td_bitmap_len, gfp_t gfp);
 
 /**
  * cfg80211_disconnected - notify cfg80211 that connection was dropped
index ac2bad57933f866dfad6c6cace1e5d1d3f08a93f..721c450a9ccdc3aa919453e7797e7914dfda3b3f 100644 (file)
 /**
  * DOC: mac80211 software tx queueing
  *
- * mac80211 provides an optional intermediate queueing implementation designed
- * to allow the driver to keep hardware queues short and provide some fairness
- * between different stations/interfaces.
- * In this model, the driver pulls data frames from the mac80211 queue instead
- * of letting mac80211 push them via drv_tx().
- * Other frames (e.g. control or management) are still pushed using drv_tx().
+ * mac80211 uses an intermediate queueing implementation, designed to allow the
+ * driver to keep hardware queues short and to provide some fairness between
+ * different stations/interfaces.
  *
- * Drivers indicate that they use this model by implementing the .wake_tx_queue
- * driver operation.
+ * Drivers must provide the .wake_tx_queue driver operation by either
+ * linking it to ieee80211_handle_wake_tx_queue() or implementing a custom
+ * handler.
  *
  * Intermediate queues (struct ieee80211_txq) are kept per-sta per-tid, with
  * another per-sta for non-data/non-mgmt and bufferable management frames, and
  * The driver is expected to initialize its private per-queue data for stations
  * and interfaces in the .add_interface and .sta_add ops.
  *
- * The driver can't access the queue directly. To dequeue a frame from a
- * txq, it calls ieee80211_tx_dequeue(). Whenever mac80211 adds a new frame to a
- * queue, it calls the .wake_tx_queue driver op.
+ * The driver can't access the internal TX queues (iTXQs) directly.
+ * Whenever mac80211 adds a new frame to a queue, it calls the .wake_tx_queue
+ * driver op.
+ * Drivers implementing a custom .wake_tx_queue op can get them by calling
+ * ieee80211_tx_dequeue(). Drivers using ieee80211_handle_wake_tx_queue() will
+ * simply get the individual frames pushed via the .tx driver operation.
  *
  * Drivers can optionally delegate responsibility for scheduling queues to
  * mac80211, to take advantage of airtime fairness accounting. In this case, to
@@ -1826,7 +1827,7 @@ struct ieee80211_vif_cfg {
  *     for this interface.
  * @drv_priv: data area for driver use, will always be aligned to
  *     sizeof(void \*).
- * @txq: the multicast data TX queue (if driver uses the TXQ abstraction)
+ * @txq: the multicast data TX queue
  * @txqs_stopped: per AC flag to indicate that intermediate TXQs are stopped,
  *     protected by fq->lock.
  * @offload_flags: 802.3 -> 802.11 enapsulation offload flags, see
@@ -1915,6 +1916,10 @@ static inline bool lockdep_vif_mutex_held(struct ieee80211_vif *vif)
        rcu_dereference_protected((vif)->link_conf[link_id],    \
                                  lockdep_vif_mutex_held(vif))
 
+#define link_conf_dereference_check(vif, link_id)              \
+       rcu_dereference_check((vif)->link_conf[link_id],        \
+                             lockdep_vif_mutex_held(vif))
+
 /**
  * enum ieee80211_key_flags - key flags
  *
@@ -2176,6 +2181,7 @@ struct ieee80211_sta_aggregates {
  * All link specific info for a STA link for a non MLD STA(single)
  * or a MLD STA(multiple entries) are stored here.
  *
+ * @sta: reference to owning STA
  * @addr: MAC address of the Link STA. For non-MLO STA this is same as the addr
  *     in ieee80211_sta. For MLO Link STA this addr can be same or different
  *     from addr in ieee80211_sta (representing MLD STA addr)
@@ -2196,6 +2202,8 @@ struct ieee80211_sta_aggregates {
  *
  */
 struct ieee80211_link_sta {
+       struct ieee80211_sta *sta;
+
        u8 addr[ETH_ALEN];
        u8 link_id;
        enum ieee80211_smps_mode smps_mode;
@@ -2252,8 +2260,8 @@ struct ieee80211_link_sta {
  *     For non MLO STA it will point to the deflink data. For MLO STA
  *     ieee80211_sta_recalc_aggregates() must be called to update it.
  * @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not.
- * @txq: per-TID data TX queues (if driver uses the TXQ abstraction); note that
- *     the last entry (%IEEE80211_NUM_TIDS) is used for non-data frames
+ * @txq: per-TID data TX queues; note that the last entry (%IEEE80211_NUM_TIDS)
+ *     is used for non-data frames
  * @deflink: This holds the default link STA information, for non MLO STA all link
  *     specific STA information is accessed through @deflink or through
  *     link[0] which points to address of @deflink. For MLO Link STA
@@ -2308,6 +2316,10 @@ static inline bool lockdep_sta_mutex_held(struct ieee80211_sta *pubsta)
        rcu_dereference_protected((sta)->link[link_id],         \
                                  lockdep_sta_mutex_held(sta))
 
+#define link_sta_dereference_check(sta, link_id)               \
+       rcu_dereference_check((sta)->link[link_id],             \
+                             lockdep_sta_mutex_held(sta))
+
 #define for_each_sta_active_link(vif, sta, link_sta, link_id)                  \
        for (link_id = 0; link_id < ARRAY_SIZE((sta)->link); link_id++)         \
                if ((!(vif)->active_links ||                                    \
@@ -3787,6 +3799,13 @@ struct ieee80211_prep_tx_info {
  *     should be within a CONFIG_MAC80211_DEBUGFS conditional. This
  *     callback can sleep.
  *
+ * @link_sta_add_debugfs: Drivers can use this callback to add debugfs files
+ *     when a link is added to a mac80211 station. This callback
+ *     should be within a CPTCFG_MAC80211_DEBUGFS conditional. This
+ *     callback can sleep.
+ *     For non-MLO the callback will be called once for the deflink with the
+ *     station's directory rather than a separate subdirectory.
+ *
  * @sta_notify: Notifies low level driver about power state transition of an
  *     associated station, AP,  IBSS/WDS/mesh peer etc. For a VIF operating
  *     in AP mode, this callback will not be called when the flag
@@ -4257,6 +4276,10 @@ struct ieee80211_ops {
                                struct ieee80211_vif *vif,
                                struct ieee80211_sta *sta,
                                struct dentry *dir);
+       void (*link_sta_add_debugfs)(struct ieee80211_hw *hw,
+                                    struct ieee80211_vif *vif,
+                                    struct ieee80211_link_sta *link_sta,
+                                    struct dentry *dir);
 #endif
        void (*sta_notify)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                        enum sta_notify_cmd, struct ieee80211_sta *sta);
@@ -5691,7 +5714,7 @@ void ieee80211_key_replay(struct ieee80211_key_conf *keyconf);
  * @hw: pointer as obtained from ieee80211_alloc_hw().
  * @queue: queue number (counted from zero).
  *
- * Drivers should use this function instead of netif_wake_queue.
+ * Drivers must use this function instead of netif_wake_queue.
  */
 void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue);
 
@@ -5700,7 +5723,7 @@ void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue);
  * @hw: pointer as obtained from ieee80211_alloc_hw().
  * @queue: queue number (counted from zero).
  *
- * Drivers should use this function instead of netif_stop_queue.
+ * Drivers must use this function instead of netif_stop_queue.
  */
 void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue);
 
@@ -5709,7 +5732,7 @@ void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue);
  * @hw: pointer as obtained from ieee80211_alloc_hw().
  * @queue: queue number (counted from zero).
  *
- * Drivers should use this function instead of netif_stop_queue.
+ * Drivers must use this function instead of netif_queue_stopped.
  *
  * Return: %true if the queue is stopped. %false otherwise.
  */
@@ -5720,7 +5743,7 @@ int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue);
  * ieee80211_stop_queues - stop all queues
  * @hw: pointer as obtained from ieee80211_alloc_hw().
  *
- * Drivers should use this function instead of netif_stop_queue.
+ * Drivers must use this function instead of netif_tx_stop_all_queues.
  */
 void ieee80211_stop_queues(struct ieee80211_hw *hw);
 
@@ -5728,7 +5751,7 @@ void ieee80211_stop_queues(struct ieee80211_hw *hw);
  * ieee80211_wake_queues - wake all queues
  * @hw: pointer as obtained from ieee80211_alloc_hw().
  *
- * Drivers should use this function instead of netif_wake_queue.
+ * Drivers must use this function instead of netif_tx_wake_all_queues.
  */
 void ieee80211_wake_queues(struct ieee80211_hw *hw);
 
@@ -6949,6 +6972,18 @@ static inline struct sk_buff *ieee80211_tx_dequeue_ni(struct ieee80211_hw *hw,
        return skb;
 }
 
+/**
+ * ieee80211_handle_wake_tx_queue - mac80211 handler for wake_tx_queue callback
+ *
+ * @hw: pointer as obtained from wake_tx_queue() callback().
+ * @txq: pointer as obtained from wake_tx_queue() callback().
+ *
+ * Drivers can use this function for the mandatory mac80211 wake_tx_queue
+ * callback in struct ieee80211_ops. They should not call this function.
+ */
+void ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw,
+                                   struct ieee80211_txq *txq);
+
 /**
  * ieee80211_next_txq - get next tx queue to pull packets from
  *
index c32e7616a366a04695511679ca9e8e0332662513..c14a91bbca7c9e6000978174becfa3e52982d1d2 100644 (file)
@@ -2749,6 +2749,8 @@ enum nl80211_commands {
  *     When used with %NL80211_CMD_FRAME_TX_STATUS, indicates the ack RX
  *     timestamp. When used with %NL80211_CMD_FRAME RX notification, indicates
  *     the incoming frame RX timestamp.
+ * @NL80211_ATTR_TD_BITMAP: Transition Disable bitmap, for subsequent
+ *     (re)associations.
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -3276,6 +3278,7 @@ enum nl80211_attrs {
 
        NL80211_ATTR_TX_HW_TIMESTAMP,
        NL80211_ATTR_RX_HW_TIMESTAMP,
+       NL80211_ATTR_TD_BITMAP,
 
        /* add attributes here, update the policy in nl80211.c */
 
index 9414d3bbd65f647372dee157cc88dd345d028979..c6fa53230450095313723453938c4dd11b1fc026 100644 (file)
@@ -183,34 +183,15 @@ static void ieee80211_add_addbaext(struct ieee80211_sub_if_data *sdata,
                                   const struct ieee80211_addba_ext_ie *req,
                                   u16 buf_size)
 {
-       struct ieee80211_supported_band *sband;
        struct ieee80211_addba_ext_ie *resp;
-       const struct ieee80211_sta_he_cap *he_cap;
-       u8 frag_level, cap_frag_level;
        u8 *pos;
 
-       sband = ieee80211_get_sband(sdata);
-       if (!sband)
-               return;
-       he_cap = ieee80211_get_he_iftype_cap(sband,
-                                            ieee80211_vif_type_p2p(&sdata->vif));
-       if (!he_cap)
-               return;
-
        pos = skb_put_zero(skb, 2 + sizeof(struct ieee80211_addba_ext_ie));
        *pos++ = WLAN_EID_ADDBA_EXT;
        *pos++ = sizeof(struct ieee80211_addba_ext_ie);
        resp = (struct ieee80211_addba_ext_ie *)pos;
        resp->data = req->data & IEEE80211_ADDBA_EXT_NO_FRAG;
 
-       frag_level = u32_get_bits(req->data,
-                                 IEEE80211_ADDBA_EXT_FRAG_LEVEL_MASK);
-       cap_frag_level = u32_get_bits(he_cap->he_cap_elem.mac_cap_info[0],
-                                     IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_MASK);
-       if (frag_level > cap_frag_level)
-               frag_level = cap_frag_level;
-       resp->data |= u8_encode_bits(frag_level,
-                                    IEEE80211_ADDBA_EXT_FRAG_LEVEL_MASK);
        resp->data |= u8_encode_bits(buf_size >> IEEE80211_ADDBA_EXT_BUF_SIZE_SHIFT,
                                     IEEE80211_ADDBA_EXT_BUF_SIZE_MASK);
 }
@@ -242,7 +223,7 @@ static void ieee80211_send_addba_resp(struct sta_info *sta, u8 *da, u16 tid,
            sdata->vif.type == NL80211_IFTYPE_MESH_POINT)
                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
        else if (sdata->vif.type == NL80211_IFTYPE_STATION)
-               memcpy(mgmt->bssid, sdata->deflink.u.mgd.bssid, ETH_ALEN);
+               memcpy(mgmt->bssid, sdata->vif.cfg.ap_addr, ETH_ALEN);
        else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
                memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
 
@@ -297,9 +278,9 @@ void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
        }
 
        if (!sta->sta.deflink.ht_cap.ht_supported &&
-           sta->sdata->vif.bss_conf.chandef.chan->band != NL80211_BAND_6GHZ) {
+           !sta->sta.deflink.he_cap.has_he) {
                ht_dbg(sta->sdata,
-                      "STA %pM erroneously requests BA session on tid %d w/o QoS\n",
+                      "STA %pM erroneously requests BA session on tid %d w/o HT\n",
                       sta->sta.addr, tid);
                /* send a response anyway, it's an error case if we get here */
                goto end;
index 07c892aa8c73ff57ec8e5fcc524a3dadae67769f..9c40f8d3bce8cbb3bad8710b8f889a4ed02b3a21 100644 (file)
@@ -82,7 +82,7 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
            sdata->vif.type == NL80211_IFTYPE_MESH_POINT)
                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
        else if (sdata->vif.type == NL80211_IFTYPE_STATION)
-               memcpy(mgmt->bssid, sdata->deflink.u.mgd.bssid, ETH_ALEN);
+               memcpy(mgmt->bssid, sdata->vif.cfg.ap_addr, ETH_ALEN);
        else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
                memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
 
index 687b4c878d4ad385b72f19474c1571bac7b3116f..c848fe04dd44218456b7fc34905c541e31dcd34a 100644 (file)
@@ -2554,47 +2554,50 @@ static int ieee80211_change_bss(struct wiphy *wiphy,
                                struct bss_parameters *params)
 {
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       struct ieee80211_link_data *link;
        struct ieee80211_supported_band *sband;
        u32 changed = 0;
 
-       if (!sdata_dereference(sdata->deflink.u.ap.beacon, sdata))
+       link = ieee80211_link_or_deflink(sdata, params->link_id, true);
+       if (IS_ERR(link))
+               return PTR_ERR(link);
+
+       if (!sdata_dereference(link->u.ap.beacon, sdata))
                return -ENOENT;
 
-       sband = ieee80211_get_sband(sdata);
+       sband = ieee80211_get_link_sband(link);
        if (!sband)
                return -EINVAL;
 
        if (params->use_cts_prot >= 0) {
-               sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
+               link->conf->use_cts_prot = params->use_cts_prot;
                changed |= BSS_CHANGED_ERP_CTS_PROT;
        }
        if (params->use_short_preamble >= 0) {
-               sdata->vif.bss_conf.use_short_preamble =
-                       params->use_short_preamble;
+               link->conf->use_short_preamble = params->use_short_preamble;
                changed |= BSS_CHANGED_ERP_PREAMBLE;
        }
 
-       if (!sdata->vif.bss_conf.use_short_slot &&
+       if (!link->conf->use_short_slot &&
            (sband->band == NL80211_BAND_5GHZ ||
             sband->band == NL80211_BAND_6GHZ)) {
-               sdata->vif.bss_conf.use_short_slot = true;
+               link->conf->use_short_slot = true;
                changed |= BSS_CHANGED_ERP_SLOT;
        }
 
        if (params->use_short_slot_time >= 0) {
-               sdata->vif.bss_conf.use_short_slot =
-                       params->use_short_slot_time;
+               link->conf->use_short_slot = params->use_short_slot_time;
                changed |= BSS_CHANGED_ERP_SLOT;
        }
 
        if (params->basic_rates) {
-               ieee80211_parse_bitrates(sdata->vif.bss_conf.chandef.width,
+               ieee80211_parse_bitrates(link->conf->chandef.width,
                                         wiphy->bands[sband->band],
                                         params->basic_rates,
                                         params->basic_rates_len,
-                                        &sdata->vif.bss_conf.basic_rates);
+                                        &link->conf->basic_rates);
                changed |= BSS_CHANGED_BASIC_RATES;
-               ieee80211_check_rate_mask(&sdata->deflink);
+               ieee80211_check_rate_mask(link);
        }
 
        if (params->ap_isolate >= 0) {
@@ -2606,30 +2609,29 @@ static int ieee80211_change_bss(struct wiphy *wiphy,
        }
 
        if (params->ht_opmode >= 0) {
-               sdata->vif.bss_conf.ht_operation_mode =
-                       (u16) params->ht_opmode;
+               link->conf->ht_operation_mode = (u16)params->ht_opmode;
                changed |= BSS_CHANGED_HT;
        }
 
        if (params->p2p_ctwindow >= 0) {
-               sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &=
+               link->conf->p2p_noa_attr.oppps_ctwindow &=
                                        ~IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
-               sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
+               link->conf->p2p_noa_attr.oppps_ctwindow |=
                        params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
                changed |= BSS_CHANGED_P2P_PS;
        }
 
        if (params->p2p_opp_ps > 0) {
-               sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
+               link->conf->p2p_noa_attr.oppps_ctwindow |=
                                        IEEE80211_P2P_OPPPS_ENABLE_BIT;
                changed |= BSS_CHANGED_P2P_PS;
        } else if (params->p2p_opp_ps == 0) {
-               sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &=
+               link->conf->p2p_noa_attr.oppps_ctwindow &=
                                        ~IEEE80211_P2P_OPPPS_ENABLE_BIT;
                changed |= BSS_CHANGED_P2P_PS;
        }
 
-       ieee80211_link_info_change_notify(sdata, &sdata->deflink, changed);
+       ieee80211_link_info_change_notify(sdata, link, changed);
 
        return 0;
 }
@@ -4338,9 +4340,6 @@ static int ieee80211_get_txq_stats(struct wiphy *wiphy,
        struct ieee80211_sub_if_data *sdata;
        int ret = 0;
 
-       if (!local->ops->wake_tx_queue)
-               return 1;
-
        spin_lock_bh(&local->fq.lock);
        rcu_read_lock();
 
index 78c7d60e8667c5b0b67dad4665e78cd0621d911e..dfb9f55e268544b5b3636f8f184c3864b1a0acfa 100644 (file)
@@ -663,9 +663,7 @@ void debugfs_hw_add(struct ieee80211_local *local)
        DEBUGFS_ADD_MODE(force_tx_status, 0600);
        DEBUGFS_ADD_MODE(aql_enable, 0600);
        DEBUGFS_ADD(aql_pending);
-
-       if (local->ops->wake_tx_queue)
-               DEBUGFS_ADD_MODE(aqm, 0600);
+       DEBUGFS_ADD_MODE(aqm, 0600);
 
        DEBUGFS_ADD_MODE(airtime_flags, 0600);
 
index 5b014786fd2d0a8735221cc3d81075b3c3e11a7c..c87e1137e5da1013be1ee98db57316603eeb2546 100644 (file)
@@ -677,8 +677,7 @@ static void add_common_files(struct ieee80211_sub_if_data *sdata)
        DEBUGFS_ADD(rc_rateidx_vht_mcs_mask_5ghz);
        DEBUGFS_ADD(hw_queues);
 
-       if (sdata->local->ops->wake_tx_queue &&
-           sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
+       if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
            sdata->vif.type != NL80211_IFTYPE_NAN)
                DEBUGFS_ADD(aqm);
 }
index d3397c1248d36fe2fe520d9e49180991b206256d..7a3d7893e19d6a607c0c1a20ecec6683c6d51b38 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2007      Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright(c) 2016 Intel Deutschland GmbH
- * Copyright (C) 2018 - 2021 Intel Corporation
+ * Copyright (C) 2018 - 2022 Intel Corporation
  */
 
 #include <linux/debugfs.h>
@@ -435,8 +435,29 @@ static ssize_t sta_agg_status_write(struct file *file, const char __user *userbu
 }
 STA_OPS_RW(agg_status);
 
-static ssize_t sta_ht_capa_read(struct file *file, char __user *userbuf,
-                               size_t count, loff_t *ppos)
+/* link sta attributes */
+#define LINK_STA_OPS(name)                                             \
+static const struct file_operations link_sta_ ##name## _ops = {                \
+       .read = link_sta_##name##_read,                                 \
+       .open = simple_open,                                            \
+       .llseek = generic_file_llseek,                                  \
+}
+
+static ssize_t link_sta_addr_read(struct file *file, char __user *userbuf,
+                                 size_t count, loff_t *ppos)
+{
+       struct link_sta_info *link_sta = file->private_data;
+       u8 mac[3 * ETH_ALEN + 1];
+
+       snprintf(mac, sizeof(mac), "%pM\n", link_sta->pub->addr);
+
+       return simple_read_from_buffer(userbuf, count, ppos, mac, 3 * ETH_ALEN);
+}
+
+LINK_STA_OPS(addr);
+
+static ssize_t link_sta_ht_capa_read(struct file *file, char __user *userbuf,
+                                    size_t count, loff_t *ppos)
 {
 #define PRINT_HT_CAP(_cond, _str) \
        do { \
@@ -446,8 +467,8 @@ static ssize_t sta_ht_capa_read(struct file *file, char __user *userbuf,
        char *buf, *p;
        int i;
        ssize_t bufsz = 512;
-       struct sta_info *sta = file->private_data;
-       struct ieee80211_sta_ht_cap *htc = &sta->sta.deflink.ht_cap;
+       struct link_sta_info *link_sta = file->private_data;
+       struct ieee80211_sta_ht_cap *htc = &link_sta->pub->ht_cap;
        ssize_t ret;
 
        buf = kzalloc(bufsz, GFP_KERNEL);
@@ -524,14 +545,14 @@ static ssize_t sta_ht_capa_read(struct file *file, char __user *userbuf,
        kfree(buf);
        return ret;
 }
-STA_OPS(ht_capa);
+LINK_STA_OPS(ht_capa);
 
-static ssize_t sta_vht_capa_read(struct file *file, char __user *userbuf,
-                                size_t count, loff_t *ppos)
+static ssize_t link_sta_vht_capa_read(struct file *file, char __user *userbuf,
+                                     size_t count, loff_t *ppos)
 {
        char *buf, *p;
-       struct sta_info *sta = file->private_data;
-       struct ieee80211_sta_vht_cap *vhtc = &sta->sta.deflink.vht_cap;
+       struct link_sta_info *link_sta = file->private_data;
+       struct ieee80211_sta_vht_cap *vhtc = &link_sta->pub->vht_cap;
        ssize_t ret;
        ssize_t bufsz = 512;
 
@@ -638,15 +659,15 @@ static ssize_t sta_vht_capa_read(struct file *file, char __user *userbuf,
        kfree(buf);
        return ret;
 }
-STA_OPS(vht_capa);
+LINK_STA_OPS(vht_capa);
 
-static ssize_t sta_he_capa_read(struct file *file, char __user *userbuf,
-                               size_t count, loff_t *ppos)
+static ssize_t link_sta_he_capa_read(struct file *file, char __user *userbuf,
+                                    size_t count, loff_t *ppos)
 {
        char *buf, *p;
        size_t buf_sz = PAGE_SIZE;
-       struct sta_info *sta = file->private_data;
-       struct ieee80211_sta_he_cap *hec = &sta->sta.deflink.he_cap;
+       struct link_sta_info *link_sta = file->private_data;
+       struct ieee80211_sta_he_cap *hec = &link_sta->pub->he_cap;
        struct ieee80211_he_mcs_nss_supp *nss = &hec->he_mcs_nss_supp;
        u8 ppe_size;
        u8 *cap;
@@ -1011,7 +1032,7 @@ out:
        kfree(buf);
        return ret;
 }
-STA_OPS(he_capa);
+LINK_STA_OPS(he_capa);
 
 #define DEBUGFS_ADD(name) \
        debugfs_create_file(#name, 0400, \
@@ -1048,18 +1069,11 @@ void ieee80211_sta_debugfs_add(struct sta_info *sta)
        DEBUGFS_ADD(num_ps_buf_frames);
        DEBUGFS_ADD(last_seq_ctrl);
        DEBUGFS_ADD(agg_status);
-       DEBUGFS_ADD(ht_capa);
-       DEBUGFS_ADD(vht_capa);
-       DEBUGFS_ADD(he_capa);
-
-       DEBUGFS_ADD_COUNTER(rx_duplicates, deflink.rx_stats.num_duplicates);
-       DEBUGFS_ADD_COUNTER(rx_fragments, deflink.rx_stats.fragments);
+       /* FIXME: Kept here as the statistics are only done on the deflink */
        DEBUGFS_ADD_COUNTER(tx_filtered, deflink.status_stats.filtered);
 
-       if (local->ops->wake_tx_queue) {
-               DEBUGFS_ADD(aqm);
-               DEBUGFS_ADD(airtime);
-       }
+       DEBUGFS_ADD(aqm);
+       DEBUGFS_ADD(airtime);
 
        if (wiphy_ext_feature_isset(local->hw.wiphy,
                                    NL80211_EXT_FEATURE_AQL))
@@ -1076,3 +1090,85 @@ void ieee80211_sta_debugfs_remove(struct sta_info *sta)
        debugfs_remove_recursive(sta->debugfs_dir);
        sta->debugfs_dir = NULL;
 }
+
+#undef DEBUGFS_ADD
+#undef DEBUGFS_ADD_COUNTER
+
+#define DEBUGFS_ADD(name) \
+       debugfs_create_file(#name, 0400, \
+               link_sta->debugfs_dir, link_sta, &link_sta_ ##name## _ops)
+#define DEBUGFS_ADD_COUNTER(name, field)                               \
+       debugfs_create_ulong(#name, 0400, link_sta->debugfs_dir, &link_sta->field)
+
+void ieee80211_link_sta_debugfs_add(struct link_sta_info *link_sta)
+{
+       if (WARN_ON(!link_sta->sta->debugfs_dir))
+               return;
+
+       /* For non-MLO, leave the files in the main directory. */
+       if (link_sta->sta->sta.valid_links) {
+               char link_dir_name[10];
+
+               snprintf(link_dir_name, sizeof(link_dir_name),
+                        "link-%d", link_sta->link_id);
+
+               link_sta->debugfs_dir =
+                       debugfs_create_dir(link_dir_name,
+                                          link_sta->sta->debugfs_dir);
+
+               DEBUGFS_ADD(addr);
+       } else {
+               if (WARN_ON(link_sta != &link_sta->sta->deflink))
+                       return;
+
+               link_sta->debugfs_dir = link_sta->sta->debugfs_dir;
+       }
+
+       DEBUGFS_ADD(ht_capa);
+       DEBUGFS_ADD(vht_capa);
+       DEBUGFS_ADD(he_capa);
+
+       DEBUGFS_ADD_COUNTER(rx_duplicates, rx_stats.num_duplicates);
+       DEBUGFS_ADD_COUNTER(rx_fragments, rx_stats.fragments);
+}
+
+void ieee80211_link_sta_debugfs_remove(struct link_sta_info *link_sta)
+{
+       if (!link_sta->debugfs_dir || !link_sta->sta->debugfs_dir) {
+               link_sta->debugfs_dir = NULL;
+               return;
+       }
+
+       if (link_sta->debugfs_dir == link_sta->sta->debugfs_dir) {
+               WARN_ON(link_sta != &link_sta->sta->deflink);
+               link_sta->sta->debugfs_dir = NULL;
+               return;
+       }
+
+       debugfs_remove_recursive(link_sta->debugfs_dir);
+       link_sta->debugfs_dir = NULL;
+}
+
+void ieee80211_link_sta_debugfs_drv_add(struct link_sta_info *link_sta)
+{
+       if (WARN_ON(!link_sta->debugfs_dir))
+               return;
+
+       drv_link_sta_add_debugfs(link_sta->sta->local, link_sta->sta->sdata,
+                                link_sta->pub, link_sta->debugfs_dir);
+}
+
+void ieee80211_link_sta_debugfs_drv_remove(struct link_sta_info *link_sta)
+{
+       if (!link_sta->debugfs_dir)
+               return;
+
+       if (WARN_ON(link_sta->debugfs_dir == link_sta->sta->debugfs_dir))
+               return;
+
+       /* Recreate the directory excluding the driver data */
+       debugfs_remove_recursive(link_sta->debugfs_dir);
+       link_sta->debugfs_dir = NULL;
+
+       ieee80211_link_sta_debugfs_add(link_sta);
+}
index d2e7c27ad6d1c45f34686c44c3af3a51c5ccfe77..cde8148bdb18f77d43b6dcd9c6ea95c417881771 100644 (file)
@@ -7,9 +7,21 @@
 #ifdef CONFIG_MAC80211_DEBUGFS
 void ieee80211_sta_debugfs_add(struct sta_info *sta);
 void ieee80211_sta_debugfs_remove(struct sta_info *sta);
+
+void ieee80211_link_sta_debugfs_add(struct link_sta_info *link_sta);
+void ieee80211_link_sta_debugfs_remove(struct link_sta_info *link_sta);
+
+void ieee80211_link_sta_debugfs_drv_add(struct link_sta_info *link_sta);
+void ieee80211_link_sta_debugfs_drv_remove(struct link_sta_info *link_sta);
 #else
 static inline void ieee80211_sta_debugfs_add(struct sta_info *sta) {}
 static inline void ieee80211_sta_debugfs_remove(struct sta_info *sta) {}
+
+static inline void ieee80211_link_sta_debugfs_add(struct link_sta_info *link_sta) {}
+static inline void ieee80211_link_sta_debugfs_remove(struct link_sta_info *link_sta) {}
+
+static inline void ieee80211_link_sta_debugfs_drv_add(struct link_sta_info *link_sta) {}
+static inline void ieee80211_link_sta_debugfs_drv_remove(struct link_sta_info *link_sta) {}
 #endif
 
 #endif /* __MAC80211_DEBUGFS_STA_H */
index 5392ffa182704feded6ec63a50579368b5c0d60d..d737db4e07e2436de3b47ccb98be943ad7afc1c5 100644 (file)
@@ -7,6 +7,7 @@
 #include "ieee80211_i.h"
 #include "trace.h"
 #include "driver-ops.h"
+#include "debugfs_sta.h"
 
 int drv_start(struct ieee80211_local *local)
 {
@@ -497,6 +498,11 @@ int drv_change_sta_links(struct ieee80211_local *local,
                         struct ieee80211_sta *sta,
                         u16 old_links, u16 new_links)
 {
+       struct sta_info *info = container_of(sta, struct sta_info, sta);
+       struct link_sta_info *link_sta;
+       unsigned long links_to_add;
+       unsigned long links_to_rem;
+       unsigned int link_id;
        int ret = -EOPNOTSUPP;
 
        might_sleep();
@@ -510,11 +516,30 @@ int drv_change_sta_links(struct ieee80211_local *local,
        if (old_links == new_links)
                return 0;
 
+       links_to_add = ~old_links & new_links;
+       links_to_rem = old_links & ~new_links;
+
+       for_each_set_bit(link_id, &links_to_rem, IEEE80211_MLD_MAX_NUM_LINKS) {
+               link_sta = rcu_dereference_protected(info->link[link_id],
+                                                    lockdep_is_held(&local->sta_mtx));
+
+               ieee80211_link_sta_debugfs_drv_remove(link_sta);
+       }
+
        trace_drv_change_sta_links(local, sdata, sta, old_links, new_links);
        if (local->ops->change_sta_links)
                ret = local->ops->change_sta_links(&local->hw, &sdata->vif, sta,
                                                   old_links, new_links);
        trace_drv_return_int(local, ret);
 
-       return ret;
+       if (ret)
+               return ret;
+
+       for_each_set_bit(link_id, &links_to_add, IEEE80211_MLD_MAX_NUM_LINKS) {
+               link_sta = rcu_dereference_protected(info->link[link_id],
+                                                    lockdep_is_held(&local->sta_mtx));
+               ieee80211_link_sta_debugfs_drv_add(link_sta);
+       }
+
+       return 0;
 }
index 81e40b0a3b1675a872f8f5f9adb90c626b145ab8..809bad53e15b67d63c9d953aacc60e16f2fa57d6 100644 (file)
@@ -480,6 +480,22 @@ static inline void drv_sta_add_debugfs(struct ieee80211_local *local,
                local->ops->sta_add_debugfs(&local->hw, &sdata->vif,
                                            sta, dir);
 }
+
+static inline void drv_link_sta_add_debugfs(struct ieee80211_local *local,
+                                           struct ieee80211_sub_if_data *sdata,
+                                           struct ieee80211_link_sta *link_sta,
+                                           struct dentry *dir)
+{
+       might_sleep();
+
+       sdata = get_bss_sdata(sdata);
+       if (!check_sdata_in_driver(sdata))
+               return;
+
+       if (local->ops->link_sta_add_debugfs)
+               local->ops->link_sta_add_debugfs(&local->hw, &sdata->vif,
+                                                link_sta, dir);
+}
 #endif
 
 static inline void drv_sta_pre_rcu_remove(struct ieee80211_local *local,
index a842f2e1c230966c52e45bb6e84fbcfbac994c60..63ff0d2524b6530bcd0b27649ecf4492d70ea10f 100644 (file)
@@ -390,6 +390,7 @@ struct ieee80211_mgd_auth_data {
        bool done, waiting;
        bool peer_confirmed;
        bool timeout_started;
+       int link_id;
 
        u8 ap_addr[ETH_ALEN] __aligned(2);
 
@@ -412,6 +413,8 @@ struct ieee80211_mgd_assoc_data {
                u8 *elems; /* pointing to inside ie[] below */
 
                ieee80211_conn_flags_t conn_flags;
+
+               u16 status;
        } link[IEEE80211_MLD_MAX_NUM_LINKS];
 
        u8 ap_addr[ETH_ALEN] __aligned(2);
@@ -1707,6 +1710,17 @@ struct ieee802_11_elems {
        u8 tx_pwr_env_num;
        u8 eht_cap_len;
 
+       /* mult-link element can be de-fragmented and thus u8 is not sufficient */
+       size_t multi_link_len;
+
+       /*
+        * store the per station profile pointer and length in case that the
+        * parsing also handled Multi-Link element parsing for a specific link
+        * ID.
+        */
+       struct ieee80211_mle_per_sta_profile *prof;
+       size_t sta_prof_len;
+
        /* whether a parse error occurred while retrieving these elements */
        bool parse_error;
 
@@ -2205,9 +2219,13 @@ static inline void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata,
  *     represent a non-transmitting BSS in which case the data
  *     for that non-transmitting BSS is returned
  * @link_id: the link ID to parse elements for, if a STA profile
- *     is present in the multi-link element, or -1 to ignore
+ *     is present in the multi-link element, or -1 to ignore;
+ *     note that the code currently assumes parsing an association
+ *     (or re-association) response frame if this is given
  * @from_ap: frame is received from an AP (currently used only
  *     for EHT capabilities parsing)
+ * @scratch_len: if non zero, specifies the requested length of the scratch
+ *      buffer; otherwise, 'len' is used.
  */
 struct ieee80211_elems_parse_params {
        const u8 *start;
@@ -2218,6 +2236,7 @@ struct ieee80211_elems_parse_params {
        struct cfg80211_bss *bss;
        int link_id;
        bool from_ap;
+       size_t scratch_len;
 };
 
 struct ieee802_11_elems *
@@ -2288,7 +2307,6 @@ void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
 void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
                                    enum queue_stop_reason reason,
                                    bool refcounted);
-void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue);
 void ieee80211_add_pending_skb(struct ieee80211_local *local,
                               struct sk_buff *skb);
 void ieee80211_add_pending_skbs(struct ieee80211_local *local,
index dd9ac1f7d2ea6771ac4328a36e1dece4c29b30b4..7c4ce716c9394704dfc0cd23bacfde360072a2a8 100644 (file)
@@ -458,12 +458,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
        if (cancel_scan)
                ieee80211_scan_cancel(local);
 
-       /*
-        * Stop TX on this interface first.
-        */
-       if (!local->ops->wake_tx_queue && sdata->dev)
-               netif_tx_stop_all_queues(sdata->dev);
-
        ieee80211_roc_purge(local, sdata);
 
        switch (sdata->vif.type) {
@@ -811,13 +805,6 @@ static void ieee80211_uninit(struct net_device *dev)
        ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev));
 }
 
-static u16 ieee80211_netdev_select_queue(struct net_device *dev,
-                                        struct sk_buff *skb,
-                                        struct net_device *sb_dev)
-{
-       return ieee80211_select_queue(IEEE80211_DEV_TO_SUB_IF(dev), skb);
-}
-
 static void
 ieee80211_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
 {
@@ -831,7 +818,6 @@ static const struct net_device_ops ieee80211_dataif_ops = {
        .ndo_start_xmit         = ieee80211_subif_start_xmit,
        .ndo_set_rx_mode        = ieee80211_set_multicast_list,
        .ndo_set_mac_address    = ieee80211_change_mac,
-       .ndo_select_queue       = ieee80211_netdev_select_queue,
        .ndo_get_stats64        = ieee80211_get_stats64,
 };
 
@@ -939,7 +925,6 @@ static const struct net_device_ops ieee80211_dataif_8023_ops = {
        .ndo_start_xmit         = ieee80211_subif_start_xmit_8023,
        .ndo_set_rx_mode        = ieee80211_set_multicast_list,
        .ndo_set_mac_address    = ieee80211_change_mac,
-       .ndo_select_queue       = ieee80211_netdev_select_queue,
        .ndo_get_stats64        = ieee80211_get_stats64,
        .ndo_fill_forward_path  = ieee80211_netdev_fill_forward_path,
 };
@@ -1441,35 +1426,6 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
 
        ieee80211_recalc_ps(local);
 
-       if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
-           sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
-           local->ops->wake_tx_queue) {
-               /* XXX: for AP_VLAN, actually track AP queues */
-               if (dev)
-                       netif_tx_start_all_queues(dev);
-       } else if (dev) {
-               unsigned long flags;
-               int n_acs = IEEE80211_NUM_ACS;
-               int ac;
-
-               if (local->hw.queues < IEEE80211_NUM_ACS)
-                       n_acs = 1;
-
-               spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
-               if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE ||
-                   (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 &&
-                    skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) {
-                       for (ac = 0; ac < n_acs; ac++) {
-                               int ac_queue = sdata->vif.hw_queue[ac];
-
-                               if (local->queue_stop_reasons[ac_queue] == 0 &&
-                                   skb_queue_empty(&local->pending[ac_queue]))
-                                       netif_start_subqueue(dev, ac);
-                       }
-               }
-               spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
-       }
-
        set_bit(SDATA_STATE_RUNNING, &sdata->state);
 
        return 0;
@@ -1499,17 +1455,12 @@ static void ieee80211_if_setup(struct net_device *dev)
 {
        ether_setup(dev);
        dev->priv_flags &= ~IFF_TX_SKB_SHARING;
+       dev->priv_flags |= IFF_NO_QUEUE;
        dev->netdev_ops = &ieee80211_dataif_ops;
        dev->needs_free_netdev = true;
        dev->priv_destructor = ieee80211_if_free;
 }
 
-static void ieee80211_if_setup_no_queue(struct net_device *dev)
-{
-       ieee80211_if_setup(dev);
-       dev->priv_flags |= IFF_NO_QUEUE;
-}
-
 static void ieee80211_iface_process_skb(struct ieee80211_local *local,
                                        struct ieee80211_sub_if_data *sdata,
                                        struct sk_buff *skb)
@@ -2094,9 +2045,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
        struct net_device *ndev = NULL;
        struct ieee80211_sub_if_data *sdata = NULL;
        struct txq_info *txqi;
-       void (*if_setup)(struct net_device *dev);
        int ret, i;
-       int txqs = 1;
 
        ASSERT_RTNL();
 
@@ -2119,30 +2068,18 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
                                 sizeof(void *));
                int txq_size = 0;
 
-               if (local->ops->wake_tx_queue &&
-                   type != NL80211_IFTYPE_AP_VLAN &&
+               if (type != NL80211_IFTYPE_AP_VLAN &&
                    (type != NL80211_IFTYPE_MONITOR ||
                     (params->flags & MONITOR_FLAG_ACTIVE)))
                        txq_size += sizeof(struct txq_info) +
                                    local->hw.txq_data_size;
 
-               if (local->ops->wake_tx_queue) {
-                       if_setup = ieee80211_if_setup_no_queue;
-               } else {
-                       if_setup = ieee80211_if_setup;
-                       if (local->hw.queues >= IEEE80211_NUM_ACS)
-                               txqs = IEEE80211_NUM_ACS;
-               }
-
                ndev = alloc_netdev_mqs(size + txq_size,
                                        name, name_assign_type,
-                                       if_setup, txqs, 1);
+                                       ieee80211_if_setup, 1, 1);
                if (!ndev)
                        return -ENOMEM;
 
-               if (!local->ops->wake_tx_queue && local->hw.wiphy->tx_queue_len)
-                       ndev->tx_queue_len = local->hw.wiphy->tx_queue_len;
-
                dev_net_set(ndev, wiphy_net(local->hw.wiphy));
 
                ndev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
index e309708abae8b2e708b2608d26e11b86c0476ec2..d1f5a9f7c6470a5fc7b7de0e1b0a5d124226e2cb 100644 (file)
@@ -357,6 +357,11 @@ static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata,
        list_for_each_entry(sta, &local->sta_list, list) {
                if (sdata != sta->sdata)
                        continue;
+
+               /* this is very temporary, but do it anyway */
+               __ieee80211_sta_recalc_aggregates(sta,
+                                                 old_active | active_links);
+
                ret = drv_change_sta_links(local, sdata, &sta->sta,
                                           old_active,
                                           old_active | active_links);
@@ -369,10 +374,22 @@ static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata,
        list_for_each_entry(sta, &local->sta_list, list) {
                if (sdata != sta->sdata)
                        continue;
+
+               __ieee80211_sta_recalc_aggregates(sta, active_links);
+
                ret = drv_change_sta_links(local, sdata, &sta->sta,
                                           old_active | active_links,
                                           active_links);
                WARN_ON_ONCE(ret);
+
+               /*
+                * Do it again, just in case - the driver might very
+                * well have called ieee80211_sta_recalc_aggregates()
+                * from there when filling in the new links, which
+                * would set it wrong since the vif's active links are
+                * not switched yet...
+                */
+               __ieee80211_sta_recalc_aggregates(sta, active_links);
        }
 
        for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) {
index 46f3eddc23887c78598a5349191419a3993acd8b..b7279d88cddb7e95eb42cbbd67ba3d9fbd6d2ff3 100644 (file)
@@ -630,7 +630,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
 
        if (WARN_ON(!ops->tx || !ops->start || !ops->stop || !ops->config ||
                    !ops->add_interface || !ops->remove_interface ||
-                   !ops->configure_filter))
+                   !ops->configure_filter || !ops->wake_tx_queue))
                return NULL;
 
        if (WARN_ON(ops->sta_state && (ops->sta_add || ops->sta_remove)))
@@ -719,9 +719,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
        if (!ops->set_key)
                wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
 
-       if (ops->wake_tx_queue)
-               wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS);
-
+       wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_TXQS);
        wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_RRM);
 
        wiphy->bss_priv_size = sizeof(struct ieee80211_bss);
@@ -834,10 +832,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
                atomic_set(&local->agg_queue_stop[i], 0);
        }
        tasklet_setup(&local->tx_pending_tasklet, ieee80211_tx_pending);
-
-       if (ops->wake_tx_queue)
-               tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs);
-
+       tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs);
        tasklet_setup(&local->tasklet, ieee80211_tasklet_handler);
 
        skb_queue_head_init(&local->skb_queue);
@@ -1087,6 +1082,16 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
 
                channels += sband->n_channels;
 
+               /*
+                * Due to the way the aggregation code handles this and it
+                * being an HT capability, we can't really support delayed
+                * BA in MLO (yet).
+                */
+               if (WARN_ON(sband->ht_cap.ht_supported &&
+                           (sband->ht_cap.cap & IEEE80211_HT_CAP_DELAY_BA) &&
+                           hw->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO))
+                       return -EINVAL;
+
                if (max_bitrates < sband->n_bitrates)
                        max_bitrates = sband->n_bitrates;
                supp_ht = supp_ht || sband->ht_cap.ht_supported;
@@ -1155,6 +1160,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
        if (!local->int_scan_req)
                return -ENOMEM;
 
+       eth_broadcast_addr(local->int_scan_req->bssid);
+
        for (band = 0; band < NUM_NL80211_BANDS; band++) {
                if (!local->hw.wiphy->bands[band])
                        continue;
index d8484cd870de58dac322714481a6fd97700b6101..a804e0220ed7456f5540361357bbd329183a9b7f 100644 (file)
@@ -2717,18 +2717,10 @@ static u32 ieee80211_link_set_associated(struct ieee80211_link_data *link,
        }
 
        if (link->u.mgd.have_beacon) {
-               /*
-                * If the AP is buggy we may get here with no DTIM period
-                * known, so assume it's 1 which is the only safe assumption
-                * in that case, although if the TIM IE is broken powersave
-                * probably just won't work at all.
-                */
-               bss_conf->dtim_period = link->u.mgd.dtim_period ?: 1;
                bss_conf->beacon_rate = bss->beacon_rate;
                changed |= BSS_CHANGED_BEACON_INFO;
        } else {
                bss_conf->beacon_rate = NULL;
-               bss_conf->dtim_period = 0;
        }
 
        /* Tell the driver to monitor connection quality (if supported) */
@@ -2754,7 +2746,8 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
                struct cfg80211_bss *cbss = assoc_data->link[link_id].bss;
                struct ieee80211_link_data *link;
 
-               if (!cbss)
+               if (!cbss ||
+                   assoc_data->link[link_id].status != WLAN_STATUS_SUCCESS)
                        continue;
 
                link = sdata_dereference(sdata->link[link_id], sdata);
@@ -2782,7 +2775,8 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
                        struct ieee80211_link_data *link;
                        struct cfg80211_bss *cbss = assoc_data->link[link_id].bss;
 
-                       if (!cbss)
+                       if (!cbss ||
+                           assoc_data->link[link_id].status != WLAN_STATUS_SUCCESS)
                                continue;
 
                        link = sdata_dereference(sdata->link[link_id], sdata);
@@ -3868,9 +3862,15 @@ static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
        }
 }
 
-static bool ieee80211_twt_req_supported(const struct link_sta_info *link_sta,
+static bool ieee80211_twt_req_supported(struct ieee80211_sub_if_data *sdata,
+                                       struct ieee80211_supported_band *sband,
+                                       const struct link_sta_info *link_sta,
                                        const struct ieee802_11_elems *elems)
 {
+       const struct ieee80211_sta_he_cap *own_he_cap =
+               ieee80211_get_he_iftype_cap(sband,
+                                           ieee80211_vif_type_p2p(&sdata->vif));
+
        if (elems->ext_capab_len < 10)
                return false;
 
@@ -3878,14 +3878,19 @@ static bool ieee80211_twt_req_supported(const struct link_sta_info *link_sta,
                return false;
 
        return link_sta->pub->he_cap.he_cap_elem.mac_cap_info[0] &
-               IEEE80211_HE_MAC_CAP0_TWT_RES;
+               IEEE80211_HE_MAC_CAP0_TWT_RES &&
+               own_he_cap &&
+               (own_he_cap->he_cap_elem.mac_cap_info[0] &
+                       IEEE80211_HE_MAC_CAP0_TWT_REQ);
 }
 
-static int ieee80211_recalc_twt_req(struct ieee80211_link_data *link,
+static int ieee80211_recalc_twt_req(struct ieee80211_sub_if_data *sdata,
+                                   struct ieee80211_supported_band *sband,
+                                   struct ieee80211_link_data *link,
                                    struct link_sta_info *link_sta,
                                    struct ieee802_11_elems *elems)
 {
-       bool twt = ieee80211_twt_req_supported(link_sta, elems);
+       bool twt = ieee80211_twt_req_supported(sdata, sband, link_sta, elems);
 
        if (link->conf->twt_requester != twt) {
                link->conf->twt_requester = twt;
@@ -3923,11 +3928,12 @@ static bool ieee80211_assoc_config_link(struct ieee80211_link_data *link,
        struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
        struct ieee80211_bss_conf *bss_conf = link->conf;
        struct ieee80211_local *local = sdata->local;
+       unsigned int link_id = link->link_id;
        struct ieee80211_elems_parse_params parse_params = {
                .start = elem_start,
                .len = elem_len,
                .bss = cbss,
-               .link_id = link == &sdata->deflink ? -1 : link->link_id,
+               .link_id = link_id == assoc_data->assoc_link_id ? -1 : link_id,
                .from_ap = true,
        };
        bool is_6ghz = cbss->channel->band == NL80211_BAND_6GHZ;
@@ -3942,8 +3948,35 @@ static bool ieee80211_assoc_config_link(struct ieee80211_link_data *link,
        if (!elems)
                return false;
 
-       /* FIXME: use from STA profile element after parsing that */
-       capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
+       if (link_id == assoc_data->assoc_link_id) {
+               capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
+
+               /*
+                * we should not get to this flow unless the association was
+                * successful, so set the status directly to success
+                */
+               assoc_data->link[link_id].status = WLAN_STATUS_SUCCESS;
+       } else if (!elems->prof) {
+               ret = false;
+               goto out;
+       } else {
+               const u8 *ptr = elems->prof->variable +
+                               elems->prof->sta_info_len - 1;
+
+               /*
+                * During parsing, we validated that these fields exist,
+                * otherwise elems->prof would have been set to NULL.
+                */
+               capab_info = get_unaligned_le16(ptr);
+               assoc_data->link[link_id].status = get_unaligned_le16(ptr + 2);
+
+               if (assoc_data->link[link_id].status != WLAN_STATUS_SUCCESS) {
+                       link_info(link, "association response status code=%u\n",
+                                 assoc_data->link[link_id].status);
+                       ret = true;
+                       goto out;
+               }
+       }
 
        if (!is_s1g && !elems->supp_rates) {
                sdata_info(sdata, "no SuppRates element in AssocResp\n");
@@ -4099,7 +4132,8 @@ static bool ieee80211_assoc_config_link(struct ieee80211_link_data *link,
                else
                        bss_conf->twt_protected = false;
 
-               *changed |= ieee80211_recalc_twt_req(link, link_sta, elems);
+               *changed |= ieee80211_recalc_twt_req(sdata, sband, link,
+                                                    link_sta, elems);
 
                if (elems->eht_operation && elems->eht_cap &&
                    !(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_EHT)) {
@@ -4864,6 +4898,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
        unsigned int link_id;
        struct sta_info *sta;
        u64 changed[IEEE80211_MLD_MAX_NUM_LINKS] = {};
+       u16 valid_links = 0;
        int err;
 
        mutex_lock(&sdata->local->sta_mtx);
@@ -4876,8 +4911,6 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
                goto out_err;
 
        if (sdata->vif.valid_links) {
-               u16 valid_links = 0;
-
                for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) {
                        if (!assoc_data->link[link_id].bss)
                                continue;
@@ -4894,10 +4927,11 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
        }
 
        for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) {
+               struct cfg80211_bss *cbss = assoc_data->link[link_id].bss;
                struct ieee80211_link_data *link;
                struct link_sta_info *link_sta;
 
-               if (!assoc_data->link[link_id].bss)
+               if (!cbss)
                        continue;
 
                link = sdata_dereference(sdata->link[link_id], sdata);
@@ -4906,28 +4940,36 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
 
                if (sdata->vif.valid_links)
                        link_info(link,
-                                 "local address %pM, AP link address %pM\n",
+                                 "local address %pM, AP link address %pM%s\n",
                                  link->conf->addr,
-                                 assoc_data->link[link_id].bss->bssid);
+                                 assoc_data->link[link_id].bss->bssid,
+                                 link_id == assoc_data->assoc_link_id ?
+                                       " (assoc)" : "");
 
                link_sta = rcu_dereference_protected(sta->link[link_id],
                                                     lockdep_is_held(&local->sta_mtx));
                if (WARN_ON(!link_sta))
                        goto out_err;
 
-               if (link_id != assoc_data->assoc_link_id) {
-                       struct cfg80211_bss *cbss = assoc_data->link[link_id].bss;
+               if (!link->u.mgd.have_beacon) {
                        const struct cfg80211_bss_ies *ies;
 
                        rcu_read_lock();
-                       ies = rcu_dereference(cbss->ies);
+                       ies = rcu_dereference(cbss->beacon_ies);
+                       if (ies)
+                               link->u.mgd.have_beacon = true;
+                       else
+                               ies = rcu_dereference(cbss->ies);
                        ieee80211_get_dtim(ies,
                                           &link->conf->sync_dtim_count,
                                           &link->u.mgd.dtim_period);
-                       link->conf->dtim_period = link->u.mgd.dtim_period ?: 1;
                        link->conf->beacon_int = cbss->beacon_interval;
                        rcu_read_unlock();
+               }
+
+               link->conf->dtim_period = link->u.mgd.dtim_period ?: 1;
 
+               if (link_id != assoc_data->assoc_link_id) {
                        err = ieee80211_prep_channel(sdata, link, cbss,
                                                     &link->u.mgd.conn_flags);
                        if (err) {
@@ -4947,6 +4989,12 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
                                                 &changed[link_id]))
                        goto out_err;
 
+               if (assoc_data->link[link_id].status != WLAN_STATUS_SUCCESS) {
+                       valid_links &= ~BIT(link_id);
+                       ieee80211_sta_remove_link(sta, link_id);
+                       continue;
+               }
+
                if (link_id != assoc_data->assoc_link_id) {
                        err = ieee80211_sta_activate_link(sta, link_id);
                        if (err)
@@ -4954,6 +5002,9 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
                }
        }
 
+       /* links might have changed due to rejected ones, set them again */
+       ieee80211_vif_set_links(sdata, valid_links);
+
        rate_control_rate_init(sta);
 
        if (ifmgd->flags & IEEE80211_STA_MFP_ENABLED) {
@@ -5033,6 +5084,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
        struct cfg80211_rx_assoc_resp resp = {
                .uapsd_queues = -1,
        };
+       u8 ap_mld_addr[ETH_ALEN] __aligned(2);
        unsigned int link_id;
 
        sdata_assert_lock(sdata);
@@ -5187,10 +5239,13 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
                link = sdata_dereference(sdata->link[link_id], sdata);
                if (!link)
                        continue;
+
                if (!assoc_data->link[link_id].bss)
                        continue;
+
                resp.links[link_id].bss = assoc_data->link[link_id].bss;
                resp.links[link_id].addr = link->conf->addr;
+               resp.links[link_id].status = assoc_data->link[link_id].status;
 
                /* get uapsd queues configuration - same for all links */
                resp.uapsd_queues = 0;
@@ -5199,6 +5254,11 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
                                resp.uapsd_queues |= ieee80211_ac_to_qos_mask[ac];
        }
 
+       if (sdata->vif.valid_links) {
+               ether_addr_copy(ap_mld_addr, sdata->vif.cfg.ap_addr);
+               resp.ap_mld_addr = ap_mld_addr;
+       }
+
        ieee80211_destroy_assoc_data(sdata,
                                     status_code == WLAN_STATUS_SUCCESS ?
                                        ASSOC_SUCCESS :
@@ -5208,8 +5268,6 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
        resp.len = len;
        resp.req_ies = ifmgd->assoc_req_ies;
        resp.req_ies_len = ifmgd->assoc_req_ies_len;
-       if (sdata->vif.valid_links)
-               resp.ap_mld_addr = sdata->vif.cfg.ap_addr;
        cfg80211_rx_assoc_resp(sdata->dev, &resp);
 notify_driver:
        drv_mgd_complete_tx(sdata->local, sdata, &info);
@@ -5432,6 +5490,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
        struct ieee802_11_elems *elems;
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_chanctx_conf *chanctx_conf;
+       struct ieee80211_supported_band *sband;
        struct ieee80211_channel *chan;
        struct link_sta_info *link_sta;
        struct sta_info *sta;
@@ -5694,7 +5753,12 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
                goto free;
        }
 
-       changed |= ieee80211_recalc_twt_req(link, link_sta, elems);
+       if (WARN_ON(!link->conf->chandef.chan))
+               goto free;
+
+       sband = local->hw.wiphy->bands[link->conf->chandef.chan->band];
+
+       changed |= ieee80211_recalc_twt_req(sdata, sband, link, link_sta, elems);
 
        if (ieee80211_config_bw(link, elems->ht_cap_elem,
                                elems->vht_cap_elem, elems->ht_operation,
@@ -6640,6 +6704,7 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
               req->ap_mld_addr ?: req->bss->bssid,
               ETH_ALEN);
        auth_data->bss = req->bss;
+       auth_data->link_id = req->link_id;
 
        if (req->auth_data_len >= 4) {
                if (req->auth_type == NL80211_AUTHTYPE_SAE) {
@@ -6658,7 +6723,8 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
         * removal and re-addition of the STA entry in
         * ieee80211_prep_connection().
         */
-       cont_auth = ifmgd->auth_data && req->bss == ifmgd->auth_data->bss;
+       cont_auth = ifmgd->auth_data && req->bss == ifmgd->auth_data->bss &&
+                   ifmgd->auth_data->link_id == req->link_id;
 
        if (req->ie && req->ie_len) {
                memcpy(&auth_data->data[auth_data->data_len],
@@ -6982,7 +7048,8 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
 
                /* keep sta info, bssid if matching */
                match = ether_addr_equal(ifmgd->auth_data->ap_addr,
-                                        assoc_data->ap_addr);
+                                        assoc_data->ap_addr) &&
+                       ifmgd->auth_data->link_id == req->link_id;
                ieee80211_destroy_auth_data(sdata, match);
        }
 
index 3d91b98db0996a2e1ec6d57fb035fc2988a94b09..762346598338d34eba9736a6affab2abece685aa 100644 (file)
@@ -1963,9 +1963,6 @@ minstrel_ht_alloc(struct ieee80211_hw *hw)
                /* safe default, does not necessarily have to match hw properties */
                mp->max_retry = 7;
 
-       if (hw->max_rates >= 4)
-               mp->has_mrr = true;
-
        mp->hw = hw;
        mp->update_interval = HZ / 20;
 
index 1766ff0c78d3a7e6d6c97582a6507520337434cf..4be0401f77210d0327678c989919de54d6586a62 100644 (file)
@@ -74,7 +74,6 @@
 
 struct minstrel_priv {
        struct ieee80211_hw *hw;
-       bool has_mrr;
        unsigned int cw_min;
        unsigned int cw_max;
        unsigned int max_retry;
index f99416d2e14417d4a667309d57dd2df1caa6084b..c28c6fbf786ee0cf9c5b4b6a99acb0cb514da989 100644 (file)
@@ -1571,9 +1571,6 @@ static void sta_ps_start(struct sta_info *sta)
 
        ieee80211_clear_fast_xmit(sta);
 
-       if (!sta->sta.txq[0])
-               return;
-
        for (tid = 0; tid < IEEE80211_NUM_TIDS; tid++) {
                struct ieee80211_txq *txq = sta->sta.txq[tid];
                struct txq_info *txqi = to_txq_info(txq);
index cebfd148bb4066911ace9f749b72c8c53a6e3941..6e0fd82855ae797777fd93182f2fa43540ee52ae 100644 (file)
@@ -140,17 +140,15 @@ static void __cleanup_single_sta(struct sta_info *sta)
                atomic_dec(&ps->num_sta_ps);
        }
 
-       if (sta->sta.txq[0]) {
-               for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
-                       struct txq_info *txqi;
+       for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
+               struct txq_info *txqi;
 
-                       if (!sta->sta.txq[i])
-                               continue;
+               if (!sta->sta.txq[i])
+                       continue;
 
-                       txqi = to_txq_info(sta->sta.txq[i]);
+               txqi = to_txq_info(sta->sta.txq[i]);
 
-                       ieee80211_txq_purge(local, txqi);
-               }
+               ieee80211_txq_purge(local, txqi);
        }
 
        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
@@ -366,6 +364,9 @@ static void sta_remove_link(struct sta_info *sta, unsigned int link_id,
        if (unhash)
                link_sta_info_hash_del(sta->local, link_sta);
 
+       if (test_sta_flag(sta, WLAN_STA_INSERTED))
+               ieee80211_link_sta_debugfs_remove(link_sta);
+
        if (link_sta != &sta->deflink)
                alloc = container_of(link_sta, typeof(*alloc), info);
 
@@ -425,8 +426,7 @@ void sta_info_free(struct ieee80211_local *local, struct sta_info *sta)
 
        sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr);
 
-       if (sta->sta.txq[0])
-               kfree(to_txq_info(sta->sta.txq[0]));
+       kfree(to_txq_info(sta->sta.txq[0]));
        kfree(rcu_dereference_raw(sta->sta.rates));
 #ifdef CONFIG_MAC80211_MESH
        kfree(sta->mesh);
@@ -511,6 +511,7 @@ static void sta_info_add_link(struct sta_info *sta,
        link_info->sta = sta;
        link_info->link_id = link_id;
        link_info->pub = link_sta;
+       link_info->pub->sta = &sta->sta;
        link_sta->link_id = link_id;
        rcu_assign_pointer(sta->link[link_id], link_info);
        rcu_assign_pointer(sta->sta.link[link_id], link_sta);
@@ -527,6 +528,8 @@ __sta_info_alloc(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_hw *hw = &local->hw;
        struct sta_info *sta;
+       void *txq_data;
+       int size;
        int i;
 
        sta = kzalloc(sizeof(*sta) + hw->sta_data_size, gfp);
@@ -596,21 +599,18 @@ __sta_info_alloc(struct ieee80211_sub_if_data *sdata,
 
        sta->last_connected = ktime_get_seconds();
 
-       if (local->ops->wake_tx_queue) {
-               void *txq_data;
-               int size = sizeof(struct txq_info) +
-                          ALIGN(hw->txq_data_size, sizeof(void *));
+       size = sizeof(struct txq_info) +
+              ALIGN(hw->txq_data_size, sizeof(void *));
 
-               txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp);
-               if (!txq_data)
-                       goto free;
+       txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp);
+       if (!txq_data)
+               goto free;
 
-               for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
-                       struct txq_info *txq = txq_data + i * size;
+       for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
+               struct txq_info *txq = txq_data + i * size;
 
-                       /* might not do anything for the bufferable MMPDU TXQ */
-                       ieee80211_txq_init(sdata, sta, txq, i);
-               }
+               /* might not do anything for the (bufferable) MMPDU TXQ */
+               ieee80211_txq_init(sdata, sta, txq, i);
        }
 
        if (sta_prepare_rate_control(local, sta, gfp))
@@ -684,8 +684,7 @@ __sta_info_alloc(struct ieee80211_sub_if_data *sdata,
        return sta;
 
 free_txq:
-       if (sta->sta.txq[0])
-               kfree(to_txq_info(sta->sta.txq[0]));
+       kfree(to_txq_info(sta->sta.txq[0]));
 free:
        sta_info_free_link(&sta->deflink);
 #ifdef CONFIG_MAC80211_MESH
@@ -874,6 +873,26 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU)
 
        ieee80211_sta_debugfs_add(sta);
        rate_control_add_sta_debugfs(sta);
+       if (sta->sta.valid_links) {
+               int i;
+
+               for (i = 0; i < ARRAY_SIZE(sta->link); i++) {
+                       struct link_sta_info *link_sta;
+
+                       link_sta = rcu_dereference_protected(sta->link[i],
+                                                            lockdep_is_held(&local->sta_mtx));
+
+                       if (!link_sta)
+                               continue;
+
+                       ieee80211_link_sta_debugfs_add(link_sta);
+                       if (sdata->vif.active_links & BIT(i))
+                               ieee80211_link_sta_debugfs_drv_add(link_sta);
+               }
+       } else {
+               ieee80211_link_sta_debugfs_add(&sta->deflink);
+               ieee80211_link_sta_debugfs_drv_add(&sta->deflink);
+       }
 
        sinfo->generation = local->sta_generation;
        cfg80211_new_sta(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL);
@@ -1958,9 +1977,6 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
                 * TIM recalculation.
                 */
 
-               if (!sta->sta.txq[0])
-                       return;
-
                for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) {
                        if (!sta->sta.txq[tid] ||
                            !(driver_release_tids & BIT(tid)) ||
@@ -2127,22 +2143,30 @@ void ieee80211_sta_register_airtime(struct ieee80211_sta *pubsta, u8 tid,
 }
 EXPORT_SYMBOL(ieee80211_sta_register_airtime);
 
-void ieee80211_sta_recalc_aggregates(struct ieee80211_sta *pubsta)
+void __ieee80211_sta_recalc_aggregates(struct sta_info *sta, u16 active_links)
 {
-       struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
-       struct ieee80211_link_sta *link_sta;
-       int link_id, i;
        bool first = true;
+       int link_id;
 
-       if (!pubsta->valid_links || !pubsta->mlo) {
-               pubsta->cur = &pubsta->deflink.agg;
+       if (!sta->sta.valid_links || !sta->sta.mlo) {
+               sta->sta.cur = &sta->sta.deflink.agg;
                return;
        }
 
        rcu_read_lock();
-       for_each_sta_active_link(&sta->sdata->vif, pubsta, link_sta, link_id) {
+       for (link_id = 0; link_id < ARRAY_SIZE((sta)->link); link_id++) {
+               struct ieee80211_link_sta *link_sta;
+               int i;
+
+               if (!(active_links & BIT(link_id)))
+                       continue;
+
+               link_sta = rcu_dereference(sta->sta.link[link_id]);
+               if (!link_sta)
+                       continue;
+
                if (first) {
-                       sta->cur = pubsta->deflink.agg;
+                       sta->cur = sta->sta.deflink.agg;
                        first = false;
                        continue;
                }
@@ -2161,7 +2185,14 @@ void ieee80211_sta_recalc_aggregates(struct ieee80211_sta *pubsta)
        }
        rcu_read_unlock();
 
-       pubsta->cur = &sta->cur;
+       sta->sta.cur = &sta->cur;
+}
+
+void ieee80211_sta_recalc_aggregates(struct ieee80211_sta *pubsta)
+{
+       struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
+
+       __ieee80211_sta_recalc_aggregates(sta, sta->sdata->vif.active_links);
 }
 EXPORT_SYMBOL(ieee80211_sta_recalc_aggregates);
 
@@ -2445,7 +2476,7 @@ static void sta_set_tidstats(struct sta_info *sta,
                tidstats->tx_msdu_failed = sta->deflink.status_stats.msdu_failed[tid];
        }
 
-       if (local->ops->wake_tx_queue && tid < IEEE80211_NUM_TIDS) {
+       if (tid < IEEE80211_NUM_TIDS) {
                spin_lock_bh(&local->fq.lock);
                rcu_read_lock();
 
@@ -2773,9 +2804,6 @@ unsigned long ieee80211_sta_last_active(struct sta_info *sta)
 
 static void sta_update_codel_params(struct sta_info *sta, u32 thr)
 {
-       if (!sta->sdata->local->ops->wake_tx_queue)
-               return;
-
        if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) {
                sta->cparams.target = MS2TIME(50);
                sta->cparams.interval = MS2TIME(300);
@@ -2823,6 +2851,8 @@ int ieee80211_sta_allocate_link(struct sta_info *sta, unsigned int link_id)
 
        sta_info_add_link(sta, link_id, &alloc->info, &alloc->sta);
 
+       ieee80211_link_sta_debugfs_add(&alloc->info);
+
        return 0;
 }
 
index 2517ea714dc42d080cce857073f6c4d865fb3057..69820b551668780079acdc6c87530ffaa99893da 100644 (file)
@@ -513,6 +513,7 @@ struct ieee80211_fragment_cache {
  * @status_stats.avg_ack_signal: average ACK signal
  * @cur_max_bandwidth: maximum bandwidth to use for TX to the station,
  *     taken from HT/VHT capabilities or VHT operating mode notification
+ * @debugfs_dir: debug filesystem directory dentry
  * @pub: public (driver visible) link STA data
  * TODO Move other link params from sta_info as required for MLD operation
  */
@@ -560,6 +561,10 @@ struct link_sta_info {
 
        enum ieee80211_sta_rx_bandwidth cur_max_bandwidth;
 
+#ifdef CONFIG_MAC80211_DEBUGFS
+       struct dentry *debugfs_dir;
+#endif
+
        struct ieee80211_link_sta *pub;
 };
 
@@ -922,6 +927,8 @@ void ieee80211_sta_set_max_amsdu_subframes(struct sta_info *sta,
                                           const u8 *ext_capab,
                                           unsigned int ext_capab_len);
 
+void __ieee80211_sta_recalc_aggregates(struct sta_info *sta, u16 active_links);
+
 enum sta_stats_type {
        STA_STATS_RATE_TYPE_INVALID = 0,
        STA_STATS_RATE_TYPE_LEGACY,
index f4b4d25eef95f1f47a9c4694ecc133c3b91267d9..b255f3b5bf01bddce0fa732e9c93651308e776cb 100644 (file)
@@ -1016,7 +1016,6 @@ ieee80211_tdls_prep_mgmt_packet(struct wiphy *wiphy, struct net_device *dev,
                skb->priority = 256 + 5;
                break;
        }
-       skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, skb));
 
        /*
         * Set the WLAN_TDLS_TEARDOWN flag to indicate a teardown in progress.
index a364148149f9413b632e6639ec1d66f32da8aa54..bb2e5461010191e19b7ad81321f8ba6b03da8601 100644 (file)
@@ -1599,9 +1599,6 @@ int ieee80211_txq_setup_flows(struct ieee80211_local *local)
        bool supp_vht = false;
        enum nl80211_band band;
 
-       if (!local->ops->wake_tx_queue)
-               return 0;
-
        ret = fq_init(fq, 4096);
        if (ret)
                return ret;
@@ -1649,9 +1646,6 @@ void ieee80211_txq_teardown_flows(struct ieee80211_local *local)
 {
        struct fq *fq = &local->fq;
 
-       if (!local->ops->wake_tx_queue)
-               return;
-
        kfree(local->cvars);
        local->cvars = NULL;
 
@@ -1668,8 +1662,7 @@ static bool ieee80211_queue_skb(struct ieee80211_local *local,
        struct ieee80211_vif *vif;
        struct txq_info *txqi;
 
-       if (!local->ops->wake_tx_queue ||
-           sdata->vif.type == NL80211_IFTYPE_MONITOR)
+       if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
                return false;
 
        if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
@@ -2973,7 +2966,7 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
 
                if (pre_conf_link_id != link_id &&
                    link_id != IEEE80211_LINK_UNSPECIFIED) {
-#ifdef CPTCFG_MAC80211_VERBOSE_DEBUG
+#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
                        net_info_ratelimited("%s: dropped frame to %pM with bad link ID request (%d vs. %d)\n",
                                             sdata->name, hdr.addr1,
                                             pre_conf_link_id, link_id);
@@ -4184,12 +4177,7 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb,
        if (IS_ERR(sta))
                sta = NULL;
 
-       if (local->ops->wake_tx_queue) {
-               u16 queue = __ieee80211_select_queue(sdata, sta, skb);
-               skb_set_queue_mapping(skb, queue);
-               skb_get_hash(skb);
-       }
-
+       skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
        ieee80211_aggr_check(sdata, sta, skb);
 
        sk_pacing_shift_update(skb->sk, sdata->local->hw.tx_sk_pacing_shift);
@@ -4495,11 +4483,7 @@ static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
        struct tid_ampdu_tx *tid_tx;
        u8 tid;
 
-       if (local->ops->wake_tx_queue) {
-               u16 queue = __ieee80211_select_queue(sdata, sta, skb);
-               skb_set_queue_mapping(skb, queue);
-               skb_get_hash(skb);
-       }
+       skb_set_queue_mapping(skb, ieee80211_select_queue(sdata, sta, skb));
 
        if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)) &&
            test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))
@@ -4753,9 +4737,6 @@ void ieee80211_tx_pending(struct tasklet_struct *t)
                        if (!txok)
                                break;
                }
-
-               if (skb_queue_empty(&local->pending[i]))
-                       ieee80211_propagate_queue_wake(local, i);
        }
        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 
@@ -5948,10 +5929,9 @@ int ieee80211_tx_control_port(struct wiphy *wiphy, struct net_device *dev,
        }
 
        if (!IS_ERR(sta)) {
-               u16 queue = __ieee80211_select_queue(sdata, sta, skb);
+               u16 queue = ieee80211_select_queue(sdata, sta, skb);
 
                skb_set_queue_mapping(skb, queue);
-               skb_get_hash(skb);
 
                /*
                 * for MLO STA, the SA should be the AP MLD address, but
index b512cb37aafb77134b039218cf13520a5dbaa017..6f5407038459d03cc3ceaa4ac29a66c3da570a57 100644 (file)
@@ -288,6 +288,52 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
 }
 EXPORT_SYMBOL(ieee80211_ctstoself_duration);
 
+static void wake_tx_push_queue(struct ieee80211_local *local,
+                              struct ieee80211_sub_if_data *sdata,
+                              struct ieee80211_txq *queue)
+{
+       int q = sdata->vif.hw_queue[queue->ac];
+       struct ieee80211_tx_control control = {
+               .sta = queue->sta,
+       };
+       struct sk_buff *skb;
+       unsigned long flags;
+       bool q_stopped;
+
+       while (1) {
+               spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
+               q_stopped = local->queue_stop_reasons[q];
+               spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
+
+               if (q_stopped)
+                       break;
+
+               skb = ieee80211_tx_dequeue(&local->hw, queue);
+               if (!skb)
+                       break;
+
+               drv_tx(local, &control, skb);
+       }
+}
+
+/* wake_tx_queue handler for driver not implementing a custom one*/
+void ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw,
+                                   struct ieee80211_txq *txq)
+{
+       struct ieee80211_local *local = hw_to_local(hw);
+       struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->vif);
+       struct ieee80211_txq *queue;
+
+       /* Use ieee80211_next_txq() for airtime fairness accounting */
+       ieee80211_txq_schedule_start(hw, txq->ac);
+       while ((queue = ieee80211_next_txq(hw, txq->ac))) {
+               wake_tx_push_queue(local, sdata, queue);
+               ieee80211_return_txq(hw, queue, false);
+       }
+       ieee80211_txq_schedule_end(hw, txq->ac);
+}
+EXPORT_SYMBOL(ieee80211_handle_wake_tx_queue);
+
 static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data *sdata, int ac)
 {
        struct ieee80211_local *local = sdata->local;
@@ -400,39 +446,6 @@ void ieee80211_wake_txqs(struct tasklet_struct *t)
        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 }
 
-void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue)
-{
-       struct ieee80211_sub_if_data *sdata;
-       int n_acs = IEEE80211_NUM_ACS;
-
-       if (local->ops->wake_tx_queue)
-               return;
-
-       if (local->hw.queues < IEEE80211_NUM_ACS)
-               n_acs = 1;
-
-       list_for_each_entry_rcu(sdata, &local->interfaces, list) {
-               int ac;
-
-               if (!sdata->dev)
-                       continue;
-
-               if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE &&
-                   local->queue_stop_reasons[sdata->vif.cab_queue] != 0)
-                       continue;
-
-               for (ac = 0; ac < n_acs; ac++) {
-                       int ac_queue = sdata->vif.hw_queue[ac];
-
-                       if (ac_queue == queue ||
-                           (sdata->vif.cab_queue == queue &&
-                            local->queue_stop_reasons[ac_queue] == 0 &&
-                            skb_queue_empty(&local->pending[ac_queue])))
-                               netif_wake_subqueue(sdata->dev, ac);
-               }
-       }
-}
-
 static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
                                   enum queue_stop_reason reason,
                                   bool refcounted,
@@ -463,11 +476,7 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
                /* someone still has this queue stopped */
                return;
 
-       if (skb_queue_empty(&local->pending[queue])) {
-               rcu_read_lock();
-               ieee80211_propagate_queue_wake(local, queue);
-               rcu_read_unlock();
-       } else
+       if (!skb_queue_empty(&local->pending[queue]))
                tasklet_schedule(&local->tx_pending_tasklet);
 
        /*
@@ -477,12 +486,10 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
         * release someone's lock, but it is fine because all the callers of
         * __ieee80211_wake_queue call it right before releasing the lock.
         */
-       if (local->ops->wake_tx_queue) {
-               if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
-                       tasklet_schedule(&local->wake_txqs_tasklet);
-               else
-                       _ieee80211_wake_txqs(local, flags);
-       }
+       if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
+               tasklet_schedule(&local->wake_txqs_tasklet);
+       else
+               _ieee80211_wake_txqs(local, flags);
 }
 
 void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
@@ -539,10 +546,6 @@ static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue,
                for (ac = 0; ac < n_acs; ac++) {
                        if (sdata->vif.hw_queue[ac] == queue ||
                            sdata->vif.cab_queue == queue) {
-                               if (!local->ops->wake_tx_queue) {
-                                       netif_stop_subqueue(sdata->dev, ac);
-                                       continue;
-                               }
                                spin_lock(&local->fq.lock);
                                sdata->vif.txqs_stopped[ac] = true;
                                spin_unlock(&local->fq.lock);
@@ -1026,8 +1029,10 @@ ieee80211_parse_extension_element(u32 *crc,
                        elems->eht_operation = data;
                break;
        case WLAN_EID_EXT_EHT_MULTI_LINK:
-               if (ieee80211_mle_size_ok(data, len))
+               if (ieee80211_mle_size_ok(data, len)) {
                        elems->multi_link = (void *)data;
+                       elems->multi_link_len = len;
+               }
                break;
        }
 }
@@ -1499,6 +1504,145 @@ static size_t ieee802_11_find_bssid_profile(const u8 *start, size_t len,
        return found ? profile_len : 0;
 }
 
+static void ieee80211_defragment_element(struct ieee802_11_elems *elems,
+                                        void **elem_ptr, size_t *len,
+                                        size_t total_len, u8 frag_id)
+{
+       u8 *data = *elem_ptr, *pos, *start;
+       const struct element *elem;
+
+       /*
+        * Since 'data' points to the data of the element, not the element
+        * itself, allow 254 in case it was an extended element where the
+        * extended ID isn't part of the data we see here and thus not part of
+        * 'len' either.
+        */
+       if (!data || (*len != 254 && *len != 255))
+               return;
+
+       start = elems->scratch_pos;
+
+       if (WARN_ON(*len > (elems->scratch + elems->scratch_len -
+                           elems->scratch_pos)))
+               return;
+
+       memcpy(elems->scratch_pos, data, *len);
+       elems->scratch_pos += *len;
+
+       pos = data + *len;
+       total_len -= *len;
+       for_each_element(elem, pos, total_len) {
+               if (elem->id != frag_id)
+                       break;
+
+               if (WARN_ON(elem->datalen >
+                           (elems->scratch + elems->scratch_len -
+                            elems->scratch_pos)))
+                       return;
+
+               memcpy(elems->scratch_pos, elem->data, elem->datalen);
+               elems->scratch_pos += elem->datalen;
+
+               *len += elem->datalen;
+       }
+
+       *elem_ptr = start;
+}
+
+static void ieee80211_mle_get_sta_prof(struct ieee802_11_elems *elems,
+                                      u8 link_id)
+{
+       const struct ieee80211_multi_link_elem *ml = elems->multi_link;
+       size_t ml_len = elems->multi_link_len;
+       const struct element *sub;
+
+       if (!ml || !ml_len)
+               return;
+
+       if (le16_get_bits(ml->control, IEEE80211_ML_CONTROL_TYPE) !=
+           IEEE80211_ML_CONTROL_TYPE_BASIC)
+               return;
+
+       for_each_mle_subelement(sub, (u8 *)ml, ml_len) {
+               struct ieee80211_mle_per_sta_profile *prof = (void *)sub->data;
+               u16 control;
+
+               if (sub->id != IEEE80211_MLE_SUBELEM_PER_STA_PROFILE)
+                       continue;
+
+               if (!ieee80211_mle_sta_prof_size_ok(sub->data, sub->datalen))
+                       return;
+
+               control = le16_to_cpu(prof->control);
+
+               if (link_id != u16_get_bits(control,
+                                           IEEE80211_MLE_STA_CONTROL_LINK_ID))
+                       continue;
+
+               if (!(control & IEEE80211_MLE_STA_CONTROL_COMPLETE_PROFILE))
+                       return;
+
+               elems->prof = prof;
+               elems->sta_prof_len = sub->datalen;
+
+               /* the sub element can be fragmented */
+               ieee80211_defragment_element(elems, (void **)&elems->prof,
+                                            &elems->sta_prof_len,
+                                            ml_len - (sub->data - (u8 *)ml),
+                                            IEEE80211_MLE_SUBELEM_FRAGMENT);
+               return;
+       }
+}
+
+static void ieee80211_mle_parse_link(struct ieee802_11_elems *elems,
+                                    struct ieee80211_elems_parse_params *params)
+{
+       struct ieee80211_mle_per_sta_profile *prof;
+       struct ieee80211_elems_parse_params sub = {
+               .action = params->action,
+               .from_ap = params->from_ap,
+               .link_id = -1,
+       };
+       const struct element *non_inherit = NULL;
+       const u8 *end;
+
+       if (params->link_id == -1)
+               return;
+
+       ieee80211_defragment_element(elems, (void **)&elems->multi_link,
+                                    &elems->multi_link_len,
+                                    elems->total_len - ((u8 *)elems->multi_link -
+                                                        elems->ie_start),
+                                    WLAN_EID_FRAGMENT);
+
+       ieee80211_mle_get_sta_prof(elems, params->link_id);
+       prof = elems->prof;
+
+       if (!prof)
+               return;
+
+       /* check if we have the 4 bytes for the fixed part in assoc response */
+       if (elems->sta_prof_len < sizeof(*prof) + prof->sta_info_len - 1 + 4) {
+               elems->prof = NULL;
+               elems->sta_prof_len = 0;
+               return;
+       }
+
+       /*
+        * Skip the capability information and the status code that are expected
+        * as part of the station profile in association response frames. Note
+        * the -1 is because the 'sta_info_len' is accounted to as part of the
+        * per-STA profile, but not part of the 'u8 variable[]' portion.
+        */
+       sub.start = prof->variable + prof->sta_info_len - 1 + 4;
+       end = (const u8 *)prof + elems->sta_prof_len;
+       sub.len = end - sub.start;
+
+       non_inherit = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
+                                            sub.start, sub.len);
+       _ieee802_11_parse_elems_full(&sub, elems, non_inherit);
+}
+
 struct ieee802_11_elems *
 ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params)
 {
@@ -1506,7 +1650,7 @@ ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params)
        const struct element *non_inherit = NULL;
        u8 *nontransmitted_profile;
        int nontransmitted_profile_len = 0;
-       size_t scratch_len = params->len;
+       size_t scratch_len = params->scratch_len ?: 3 * params->len;
 
        elems = kzalloc(sizeof(*elems) + scratch_len, GFP_ATOMIC);
        if (!elems)
@@ -1541,6 +1685,8 @@ ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params)
                _ieee802_11_parse_elems_full(&sub, elems, NULL);
        }
 
+       ieee80211_mle_parse_link(elems, params);
+
        if (elems->tim && !elems->parse_error) {
                const struct ieee80211_tim_ie *tim_ie = elems->tim;
 
index ecc1de2e68a50186761dedffb0ec6492772c23b0..a12c63638680122f7f449fba4060066c78a07c14 100644 (file)
@@ -122,6 +122,9 @@ u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        u8 *p;
 
+       /* Ensure hash is set prior to potential SW encryption */
+       skb_get_hash(skb);
+
        if ((info->control.flags & IEEE80211_TX_CTRL_DONT_REORDER) ||
            local->hw.queues < IEEE80211_NUM_ACS)
                return 0;
@@ -141,12 +144,15 @@ u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
        return ieee80211_downgrade_queue(sdata, NULL, skb);
 }
 
-u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
-                            struct sta_info *sta, struct sk_buff *skb)
+u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
+                          struct sta_info *sta, struct sk_buff *skb)
 {
        struct mac80211_qos_map *qos_map;
        bool qos;
 
+       /* Ensure hash is set prior to potential SW encryption */
+       skb_get_hash(skb);
+
        /* all mesh/ocb stations are required to support WME */
        if (sta && (sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
                    sdata->vif.type == NL80211_IFTYPE_OCB))
@@ -176,59 +182,6 @@ u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
        return ieee80211_downgrade_queue(sdata, sta, skb);
 }
 
-
-/* Indicate which queue to use. */
-u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
-                          struct sk_buff *skb)
-{
-       struct ieee80211_local *local = sdata->local;
-       struct sta_info *sta = NULL;
-       const u8 *ra = NULL;
-       u16 ret;
-
-       /* when using iTXQ, we can do this later */
-       if (local->ops->wake_tx_queue)
-               return 0;
-
-       if (local->hw.queues < IEEE80211_NUM_ACS || skb->len < 6) {
-               skb->priority = 0; /* required for correct WPA/11i MIC */
-               return 0;
-       }
-
-       rcu_read_lock();
-       switch (sdata->vif.type) {
-       case NL80211_IFTYPE_AP_VLAN:
-               sta = rcu_dereference(sdata->u.vlan.sta);
-               if (sta)
-                       break;
-               fallthrough;
-       case NL80211_IFTYPE_AP:
-               ra = skb->data;
-               break;
-       case NL80211_IFTYPE_STATION:
-               /* might be a TDLS station */
-               sta = sta_info_get(sdata, skb->data);
-               if (sta)
-                       break;
-
-               ra = sdata->deflink.u.mgd.bssid;
-               break;
-       case NL80211_IFTYPE_ADHOC:
-               ra = skb->data;
-               break;
-       default:
-               break;
-       }
-
-       if (!sta && ra && !is_multicast_ether_addr(ra))
-               sta = sta_info_get(sdata, ra);
-
-       ret = __ieee80211_select_queue(sdata, sta, skb);
-
-       rcu_read_unlock();
-       return ret;
-}
-
 /**
  * ieee80211_set_qos_hdr - Fill in the QoS header if there is one.
  *
index 2e3dec0b60874fdc88280f41f47e2867c17275d4..81f0039527a95ab1c281abdbe39d3dd6a3f7a1a2 100644 (file)
 u16 ieee80211_select_queue_80211(struct ieee80211_sub_if_data *sdata,
                                 struct sk_buff *skb,
                                 struct ieee80211_hdr *hdr);
-u16 __ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
-                            struct sta_info *sta, struct sk_buff *skb);
 u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
-                          struct sk_buff *skb);
+                          struct sta_info *sta, struct sk_buff *skb);
 void ieee80211_set_qos_hdr(struct ieee80211_sub_if_data *sdata,
                           struct sk_buff *skb);
 
index 775e16cb99edab3f1fd979da3964c492733258cd..af85d8909935e28128af1424080e8efd21c74fdb 100644 (file)
@@ -271,6 +271,8 @@ struct cfg80211_event {
                } ij;
                struct {
                        u8 bssid[ETH_ALEN];
+                       const u8 *td_bitmap;
+                       u8 td_bitmap_len;
                } pa;
        };
 };
@@ -409,7 +411,8 @@ int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
                        bool wextev);
 void __cfg80211_roamed(struct wireless_dev *wdev,
                       struct cfg80211_roam_info *info);
-void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid);
+void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid,
+                               const u8 *td_bitmap, u8 td_bitmap_len);
 int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
                              struct wireless_dev *wdev);
 void cfg80211_autodisconnect_wk(struct work_struct *work);
index 581df7f4c524091ac6c7a3b1a21ef54e2986a622..58e1fb18f85a41d87e0ef39d879d715498e143bc 100644 (file)
@@ -42,6 +42,10 @@ void cfg80211_rx_assoc_resp(struct net_device *dev,
        unsigned int link_id;
 
        for (link_id = 0; link_id < ARRAY_SIZE(data->links); link_id++) {
+               cr.links[link_id].status = data->links[link_id].status;
+               WARN_ON_ONCE(cr.links[link_id].status != WLAN_STATUS_SUCCESS &&
+                            (!cr.ap_mld_addr || !cr.links[link_id].bss));
+
                cr.links[link_id].bss = data->links[link_id].bss;
                if (!cr.links[link_id].bss)
                        continue;
index 597c5223651460c2f45613751912dd56f807c2da..148f66edb0158c99a8d48a02885f907ee0906565 100644 (file)
@@ -7780,6 +7780,7 @@ static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
        int err;
 
        memset(&params, 0, sizeof(params));
+       params.link_id = nl80211_link_id_or_invalid(info->attrs);
        /* default to not changing parameters */
        params.use_cts_prot = -1;
        params.use_short_preamble = -1;
@@ -16566,7 +16567,8 @@ static const struct genl_small_ops nl80211_small_ops[] = {
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nl80211_set_bss,
                .flags = GENL_UNS_ADMIN_PERM,
-               .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
+               .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
+                                        NL80211_FLAG_MLO_VALID_LINK_ID),
        },
        {
                .cmd = NL80211_CMD_GET_REG,
@@ -17747,6 +17749,7 @@ void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
                        link_info_size += (cr->links[link].bssid ||
                                           cr->links[link].bss) ?
                                          nla_total_size(ETH_ALEN) : 0;
+                       link_info_size += nla_total_size(sizeof(u16));
                }
        }
 
@@ -17815,7 +17818,9 @@ void nl80211_send_connect_result(struct cfg80211_registered_device *rdev,
                             nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, bssid)) ||
                            (cr->links[link].addr &&
                             nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
-                                    cr->links[link].addr)))
+                                    cr->links[link].addr)) ||
+                           nla_put_u16(msg, NL80211_ATTR_STATUS_CODE,
+                                       cr->links[link].status))
                                goto nla_put_failure;
 
                        nla_nest_end(msg, nested_mlo_links);
@@ -17939,7 +17944,8 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
 }
 
 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
-                                 struct net_device *netdev, const u8 *bssid)
+                                 struct net_device *netdev, const u8 *bssid,
+                                 const u8 *td_bitmap, u8 td_bitmap_len)
 {
        struct sk_buff *msg;
        void *hdr;
@@ -17959,6 +17965,11 @@ void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
            nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid))
                goto nla_put_failure;
 
+       if ((td_bitmap_len > 0) && td_bitmap)
+               if (nla_put(msg, NL80211_ATTR_TD_BITMAP,
+                           td_bitmap_len, td_bitmap))
+                       goto nla_put_failure;
+
        genlmsg_end(msg, hdr);
 
        genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
index 855d540ddfb97b2580be3057505b7d3c1108e177..ba9457e94c43ccda5c387590d7b61b8f0f9a964d 100644 (file)
@@ -83,7 +83,8 @@ void nl80211_send_roamed(struct cfg80211_registered_device *rdev,
                         struct net_device *netdev,
                         struct cfg80211_roam_info *info, gfp_t gfp);
 void nl80211_send_port_authorized(struct cfg80211_registered_device *rdev,
-                                 struct net_device *netdev, const u8 *bssid);
+                                 struct net_device *netdev, const u8 *bssid,
+                                 const u8 *td_bitmap, u8 td_bitmap_len);
 void nl80211_send_disconnected(struct cfg80211_registered_device *rdev,
                               struct net_device *netdev, u16 reason,
                               const u8 *ie, size_t ie_len, bool from_ap);
index d513536617bd9ea5161f0bfa0681ab01817d588d..4b5b6ee0fe013e922dfe6a5ce11c0c0f8dc38f30 100644 (file)
@@ -793,6 +793,10 @@ void __cfg80211_connect_result(struct net_device *dev,
                }
 
                for_each_valid_link(cr, link) {
+                       /* don't do extra lookups for failures */
+                       if (cr->links[link].status != WLAN_STATUS_SUCCESS)
+                               continue;
+
                        if (cr->links[link].bss)
                                continue;
 
@@ -829,6 +833,16 @@ void __cfg80211_connect_result(struct net_device *dev,
        }
 
        memset(wdev->links, 0, sizeof(wdev->links));
+       for_each_valid_link(cr, link) {
+               if (cr->links[link].status == WLAN_STATUS_SUCCESS)
+                       continue;
+               cr->valid_links &= ~BIT(link);
+               /* don't require bss pointer for failed links */
+               if (!cr->links[link].bss)
+                       continue;
+               cfg80211_unhold_bss(bss_from_pub(cr->links[link].bss));
+               cfg80211_put_bss(wdev->wiphy, cr->links[link].bss);
+       }
        wdev->valid_links = cr->valid_links;
        for_each_valid_link(cr, link)
                wdev->links[link].client.current_bss =
@@ -1237,7 +1251,8 @@ out:
 }
 EXPORT_SYMBOL(cfg80211_roamed);
 
-void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid)
+void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid,
+                                       const u8 *td_bitmap, u8 td_bitmap_len)
 {
        ASSERT_WDEV_LOCK(wdev);
 
@@ -1250,11 +1265,11 @@ void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid)
                return;
 
        nl80211_send_port_authorized(wiphy_to_rdev(wdev->wiphy), wdev->netdev,
-                                    bssid);
+                                    bssid, td_bitmap, td_bitmap_len);
 }
 
 void cfg80211_port_authorized(struct net_device *dev, const u8 *bssid,
-                             gfp_t gfp)
+                             const u8 *td_bitmap, u8 td_bitmap_len, gfp_t gfp)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
@@ -1264,12 +1279,15 @@ void cfg80211_port_authorized(struct net_device *dev, const u8 *bssid,
        if (WARN_ON(!bssid))
                return;
 
-       ev = kzalloc(sizeof(*ev), gfp);
+       ev = kzalloc(sizeof(*ev) + td_bitmap_len, gfp);
        if (!ev)
                return;
 
        ev->type = EVENT_PORT_AUTHORIZED;
        memcpy(ev->pa.bssid, bssid, ETH_ALEN);
+       ev->pa.td_bitmap = ((u8 *)ev) + sizeof(*ev);
+       ev->pa.td_bitmap_len = td_bitmap_len;
+       memcpy((void *)ev->pa.td_bitmap, td_bitmap, td_bitmap_len);
 
        /*
         * Use the wdev event list so that if there are pending
index 1f285b51502866439da976109764fbe4362bee60..eb277105a87847806c20a3cb4b06c9b0bab65239 100644 (file)
@@ -990,7 +990,9 @@ void cfg80211_process_wdev_events(struct wireless_dev *wdev)
                        __cfg80211_leave(wiphy_to_rdev(wdev->wiphy), wdev);
                        break;
                case EVENT_PORT_AUTHORIZED:
-                       __cfg80211_port_authorized(wdev, ev->pa.bssid);
+                       __cfg80211_port_authorized(wdev, ev->pa.bssid,
+                                                  ev->pa.td_bitmap,
+                                                  ev->pa.td_bitmap_len);
                        break;
                }
                wdev_unlock(wdev);