diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/Jamfile b/src/add-ons/kernel/drivers/network/wlan/ralink2860/Jamfile index eabb42f115..e624b43185 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/Jamfile +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/Jamfile @@ -13,14 +13,20 @@ SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] UseHeaders [ FDirName $(SUBDIR) ] : true ; +SEARCH_SOURCE += [ FDirName $(SUBDIR) dev rt2860 ] ; +UseHeaders [ FDirName $(SUBDIR) dev rt2860 ] : true ; + KernelAddon ralink2860 : glue.c rt2860.c - rt2860_io.c - rt2860_read_eeprom.c - rt2860_led.c - rt2860_rf.c rt2860_amrr.c + rt2860_io.c + rt2860_led.c + rt2860_nexus.c + rt2860_pci.c + rt2860_read_eeprom.c + rt2860_rf.c + : libfreebsd_wlan.a libfreebsd_network.a diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860.c b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860.c similarity index 98% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860.c rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860.c index 934ca56a23..e920debb75 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860.c +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860.c @@ -16,28 +16,22 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "rt2860_softc.h" -#include "rt2860_reg.h" -#include "rt2860_eeprom.h" -#include "rt2860_ucode.h" -#include "rt2860_txwi.h" -#include "rt2860_rxwi.h" -#include "rt2860_io.h" -#include "rt2860_read_eeprom.h" -#include "rt2860_led.h" -#include "rt2860_rf.h" -#include "rt2860_debug.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* * Defines and macros */ -#define PCI_VENDOR_RALINK 0x1814 -#define PCI_PRODUCT_RALINK_RT2860_PCI 0x0601 -#define PCI_PRODUCT_RALINK_RT2860_PCIe 0x0681 -#define PCI_PRODUCT_RALINK_RT2760_PCI 0x0701 -#define PCI_PRODUCT_RALINK_RT2790_PCIe 0x0781 - #define RT2860_MAX_AGG_SIZE 3840 #define RT2860_TX_DATA_SEG0_SIZE \ @@ -57,32 +51,23 @@ #define RT2860_WCID_MCAST 0xf7 /* - * Data structures and types + * Global function prototypes, used in bus depended interfaces */ -struct rt2860_pci_ident -{ - uint16_t vendor; - uint16_t device; - const char *name; -}; +int rt2860_attach(device_t dev); + +int rt2860_detach(device_t dev); + +int rt2860_shutdown(device_t dev); + +int rt2860_suspend(device_t dev); + +int rt2860_resume(device_t dev); /* * Static function prototypes */ -static int rt2860_probe(device_t dev); - -static int rt2860_attach(device_t dev); - -static int rt2860_detach(device_t dev); - -static int rt2860_shutdown(device_t dev); - -static int rt2860_suspend(device_t dev); - -static int rt2860_resume(device_t dev); - static void rt2860_init_channels(struct rt2860_softc *sc); static void rt2860_init_channels_ht40(struct rt2860_softc *sc); @@ -253,9 +238,11 @@ static int rt2860_tx_mgmt(struct rt2860_softc *sc, static int rt2860_tx_data(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int qid); +/* static int rt2860_tx_raw(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni, const struct ieee80211_bpf_params *params); +*/ static void rt2860_intr(void *arg); @@ -341,15 +328,6 @@ static void rt2860_sysctl_attach(struct rt2860_softc *sc); * Static variables */ -static const struct rt2860_pci_ident rt2860_pci_ids[] = -{ - { PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2860_PCI, "Ralink RT2860 PCI" }, - { PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2860_PCIe, "Ralink RT2860 PCIe" }, - { PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2760_PCI, "Ralink RT2760 PCI" }, - { PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2790_PCIe, "Ralink RT2790 PCIe" }, - { 0, 0, NULL } -}; - static const struct { uint32_t reg; @@ -423,35 +401,16 @@ SYSCTL_INT(_hw_rt2860, OID_AUTO, tx_stbc, CTLFLAG_RW, &rt2860_tx_stbc, 0, "RT286 TUNABLE_INT("hw.rt2860.tx_stbc", &rt2860_tx_stbc); #ifdef RT2860_DEBUG +//static int rt2860_debug = 0xffffffff; static int rt2860_debug = 0; SYSCTL_INT(_hw_rt2860, OID_AUTO, debug, CTLFLAG_RW, &rt2860_debug, 0, "RT2860 debug level"); TUNABLE_INT("hw.rt2860.debug", &rt2860_debug); #endif -/* - * rt2860_probe - */ -static int rt2860_probe(device_t dev) -{ - const struct rt2860_pci_ident *ident; - - for (ident = rt2860_pci_ids; ident->name != NULL; ident++) - { - if (pci_get_vendor(dev) == ident->vendor && - pci_get_device(dev) == ident->device) - { - device_set_desc(dev, ident->name); - return 0; - } - } - - return ENXIO; -} - /* * rt2860_attach */ -static int rt2860_attach(device_t dev) +int rt2860_attach(device_t dev) { struct rt2860_softc *sc; struct ifnet *ifp; @@ -460,23 +419,11 @@ static int rt2860_attach(device_t dev) sc = device_get_softc(dev); - if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) - { - printf("%s: chip is in D%d power mode, setting to D0\n", - device_get_nameunit(dev), pci_get_powerstate(dev)); - pci_set_powerstate(dev, PCI_POWERSTATE_D0); - } - - /* enable bus-mastering */ - - pci_enable_busmaster(dev); - sc->dev = dev; mtx_init(&sc->lock, device_get_nameunit(dev), MTX_NETWORK_LOCK, MTX_DEF | MTX_RECURSE); - sc->mem_rid = PCIR_BAR(0); sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid, RF_ACTIVE); if (sc->mem == NULL) @@ -487,9 +434,10 @@ static int rt2860_attach(device_t dev) goto fail; } + sc->bst = rman_get_bustag(sc->mem); sc->bsh = rman_get_bushandle(sc->mem); - + sc->irq_rid = 0; sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid, RF_ACTIVE | RF_SHAREABLE); @@ -766,7 +714,7 @@ fail: /* * rt2860_detach */ -static int rt2860_detach(device_t dev) +int rt2860_detach(device_t dev) { struct rt2860_softc *sc; struct ifnet *ifp; @@ -824,7 +772,7 @@ static int rt2860_detach(device_t dev) /* * rt2860_shutdown */ -static int rt2860_shutdown(device_t dev) +int rt2860_shutdown(device_t dev) { struct rt2860_softc *sc; @@ -844,7 +792,7 @@ static int rt2860_shutdown(device_t dev) /* * rt2860_suspend */ -static int rt2860_suspend(device_t dev) +int rt2860_suspend(device_t dev) { struct rt2860_softc *sc; @@ -864,7 +812,7 @@ static int rt2860_suspend(device_t dev) /* * rt2860_resume */ -static int rt2860_resume(device_t dev) +int rt2860_resume(device_t dev) { struct rt2860_softc *sc; struct ifnet *ifp; @@ -931,7 +879,8 @@ static void rt2860_init_channels(struct rt2860_softc *sc) /* set supported channels for 5GHz band */ if (sc->rf_rev == RT2860_EEPROM_RF_2850 || - sc->rf_rev == RT2860_EEPROM_RF_2750) + sc->rf_rev == RT2860_EEPROM_RF_2750 || + sc->rf_rev == RT2860_EEPROM_RF_3052) { for (i = 36; i <= 64; i += 4) { @@ -1045,7 +994,8 @@ static void rt2860_init_channels_ht40(struct rt2860_softc *sc) /* set supported channels for 5GHz band */ if (sc->rf_rev == RT2860_EEPROM_RF_2850 || - sc->rf_rev == RT2860_EEPROM_RF_2750) + sc->rf_rev == RT2860_EEPROM_RF_2750 || + sc->rf_rev == RT2860_EEPROM_RF_3052) { for (i = 36; i <= 64; i += 4) { @@ -1193,8 +1143,10 @@ static void rt2860_init_locked(void *priv) RT2860_SOFTC_ASSERT_LOCKED(sc); - if (!(sc->flags & RT2860_SOFTC_FLAGS_UCODE_LOADED)) + if (sc->mac_rev != 0x28720200) { + if (!(sc->flags & RT2860_SOFTC_FLAGS_UCODE_LOADED)) + { RT2860_DPRINTF(sc, RT2860_DEBUG_ANY, "%s: loading 8051 microcode\n", device_get_nameunit(sc->dev)); @@ -1212,6 +1164,28 @@ static void rt2860_init_locked(void *priv) device_get_nameunit(sc->dev)); sc->flags |= RT2860_SOFTC_FLAGS_UCODE_LOADED; + } + } + else + { + sc->flags |= RT2860_SOFTC_FLAGS_UCODE_LOADED; + + /* Blink every TX */ +#define LED_CFG_LED_POLARITY (1<<30) +#define LED_CFG_Y_LED_MODE_ONTX (1<<28) +#define LED_CFG_G_LED_MODE_ONTX (1<<26) +#define LED_CFG_R_LED_MODE_ONTX (1<<24) +#define LED_CFG_SLOW_BLK_TIME (0x03<<16) /* sec */ +#define LED_CFG_LED_OFF_TIME (0x1e<<8) /* msec */ +#define LED_CFG_LED_ON_TIME (0x46) /* msec */ + rt2860_io_mac_write(sc, RT2860_REG_LED_CFG, + LED_CFG_LED_POLARITY | + LED_CFG_Y_LED_MODE_ONTX | + LED_CFG_G_LED_MODE_ONTX | + LED_CFG_R_LED_MODE_ONTX | + LED_CFG_SLOW_BLK_TIME | + LED_CFG_LED_OFF_TIME | + LED_CFG_LED_ON_TIME); } rt2860_io_mac_write(sc, RT2860_REG_PWR_PIN_CFG, 0x2); @@ -1434,8 +1408,13 @@ static void rt2860_init_locked(void *priv) rt2860_io_mac_write(sc, RT2860_REG_SCHDMA_DELAY_INT_CFG, 0); - /* send LEDs operating mode to microcontroller */ + /* select Main antenna for 1T1R devices */ + if (sc->rf_rev == RT2860_EEPROM_RF_2020 || + sc->rf_rev == RT2860_EEPROM_RF_3020 || + sc->rf_rev == RT2860_EEPROM_RF_3320) + rt3090_set_rx_antenna(sc, 0); + /* send LEDs operating mode to microcontroller */ rt2860_io_mcu_cmd(sc, RT2860_IO_MCU_CMD_LED1, RT2860_REG_H2M_TOKEN_NO_INTR, sc->led_off[0]); rt2860_io_mcu_cmd(sc, RT2860_IO_MCU_CMD_LED2, @@ -1459,18 +1438,26 @@ static void rt2860_init_locked(void *priv) sc->bbp_eeprom[i].val); } - tmp = rt2860_io_mac_read(sc, RT2860_REG_SCHDMA_GPIO_CTRL_CFG); - if (tmp & (1 << 2)) - { - rt2860_io_mcu_cmd(sc, RT2860_IO_MCU_CMD_SLEEP, - RT2860_REG_H2M_TOKEN_RADIOOFF, 0x02ff); - rt2860_io_mcu_cmd_check(sc, RT2860_REG_H2M_TOKEN_RADIOOFF); + if ((sc->mac_rev & 0xffff0000) >= 0x30710000) + rt3090_rf_init(sc); - rt2860_io_mcu_cmd(sc, RT2860_IO_MCU_CMD_WAKEUP, - RT2860_REG_H2M_TOKEN_WAKEUP, 0); - rt2860_io_mcu_cmd_check(sc, RT2860_REG_H2M_TOKEN_WAKEUP); + if (sc->mac_rev != 0x28720200) { + /* 0x28720200 don`t have RT2860_REG_SCHDMA_GPIO_CTRL_CFG */ + tmp = rt2860_io_mac_read(sc, RT2860_REG_SCHDMA_GPIO_CTRL_CFG); + if (tmp & (1 << 2)) { + rt2860_io_mcu_cmd(sc, RT2860_IO_MCU_CMD_SLEEP, + RT2860_REG_H2M_TOKEN_RADIOOFF, 0x02ff); + rt2860_io_mcu_cmd_check(sc, RT2860_REG_H2M_TOKEN_RADIOOFF); + + rt2860_io_mcu_cmd(sc, RT2860_IO_MCU_CMD_WAKEUP, + RT2860_REG_H2M_TOKEN_WAKEUP, 0); + rt2860_io_mcu_cmd_check(sc, RT2860_REG_H2M_TOKEN_WAKEUP); + } } + if ((sc->mac_rev & 0xffff0000) >= 0x30710000) + rt3090_rf_wakeup(sc); + /* disable non-existing Rx chains */ tmp = rt2860_io_bbp_read(sc, 3); @@ -1495,10 +1482,26 @@ static void rt2860_init_locked(void *priv) rt2860_io_bbp_write(sc, 1, tmp); - /* set current channel */ + if ((sc->mac_rev & 0xffff0000) >= 0x30710000) + rt3090_rf_setup(sc); + if (sc->rf_rev == RT2860_EEPROM_RF_3022) + { + /* calibrate RF */ + tmp = rt2860_io_rf_read(sc, 30); + tmp |= 0x80; + rt2860_io_rf_write(sc, 30, tmp); + DELAY(1000); + tmp &= 0x7F; + rt2860_io_rf_write(sc, 30, tmp); + + /* Initialize RF register to default value */ + rt2860_io_rf_load_defaults(sc); + } + + /* set current channel */ rt2860_rf_set_chan(sc, ic->ic_curchan); - + rt2860_io_mac_write(sc, RT2860_REG_SCHDMA_WMM_TXOP0_CFG, 0); rt2860_io_mac_write(sc, RT2860_REG_SCHDMA_WMM_TXOP1_CFG, (48 << 16) | 96); @@ -2269,6 +2272,10 @@ static int rt2860_vap_key_set(struct ieee80211vap *vap, /* install pairwise key */ ni = ieee80211_find_vap_node(&ic->ic_sta, vap, mac); + if (!ni) { + printf("ieee80211_find_vap_node return 0\n"); + return 0; + } rni = (struct rt2860_softc_node *) ni; vapid = 0; @@ -4307,6 +4314,9 @@ static int rt2860_tx_mgmt(struct rt2860_softc *sc, wh = mtod(m, struct ieee80211_frame *); rate = tp->mgmtrate & IEEE80211_RATE_VAL; +/* XXX */ + if (!rate) + return EFBIG; /* fill Tx wireless info */ @@ -4458,7 +4468,7 @@ static int rt2860_tx_mgmt(struct rt2860_softc *sc, m_adj(m, hdrspace); error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag, data->dma_map, m, - dma_seg, &ndmasegs, 0); + dma_seg, &ndmasegs, BUS_DMA_NOWAIT); if (error != 0) { /* too many fragments, linearize */ @@ -4474,7 +4484,7 @@ static int rt2860_tx_mgmt(struct rt2860_softc *sc, sc->tx_defrag_packets++; error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag, data->dma_map, m, - dma_seg, &ndmasegs, 0); + dma_seg, &ndmasegs, BUS_DMA_NOWAIT); if (error != 0) { printf("%s: could not load mbuf DMA map: ndmasegs=%d, len=%d, error=%d\n", @@ -4657,6 +4667,9 @@ static int rt2860_tx_data(struct rt2860_softc *sc, rate = ni->ni_txrate; rate &= IEEE80211_RATE_VAL; +/* XXX */ + if (!rate) + return EFBIG; /* fill Tx wireless info */ @@ -4864,7 +4877,7 @@ static int rt2860_tx_data(struct rt2860_softc *sc, m_adj(m, hdrspace); error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag, data->dma_map, m, - dma_seg, &ndmasegs, 0); + dma_seg, &ndmasegs, BUS_DMA_NOWAIT); if (error != 0) { /* too many fragments, linearize */ @@ -4880,7 +4893,7 @@ static int rt2860_tx_data(struct rt2860_softc *sc, sc->tx_defrag_packets++; error = bus_dmamap_load_mbuf_sg(ring->data_dma_tag, data->dma_map, m, - dma_seg, &ndmasegs, 0); + dma_seg, &ndmasegs, BUS_DMA_NOWAIT); if (error != 0) { printf("%s: could not load mbuf DMA map: ndmasegs=%d, len=%d, error=%d\n", @@ -4995,7 +5008,6 @@ static int rt2860_tx_data(struct rt2860_softc *sc, /* * rt2860_tx_raw - */ static int rt2860_tx_raw(struct rt2860_softc *sc, struct mbuf *m, struct ieee80211_node *ni, const struct ieee80211_bpf_params *params) @@ -5006,6 +5018,7 @@ static int rt2860_tx_raw(struct rt2860_softc *sc, return 0; } + */ /* * rt2860_intr @@ -5017,7 +5030,6 @@ static void rt2860_intr(void *arg) uint32_t status; sc = arg; - #if !defined(__HAIKU__) ifp = sc->ifp; @@ -5038,6 +5050,7 @@ static void rt2860_intr(void *arg) if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) return; + #else status = sc->interrupt_status; #endif @@ -5652,9 +5665,10 @@ static int rt2860_rx_eof(struct rt2860_softc *sc, int limit) bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - +#ifdef XXX_TESTED_AND_WORKED if (!(desc->sdl0 & htole16(RT2860_RXDESC_SDL0_DDONE))) break; +#endif nframes++; @@ -7161,27 +7175,4 @@ static void rt2860_sysctl_attach(struct rt2860_softc *sc) "Rx cipher invalid key errors"); } -static device_method_t rt2860_dev_methods[] = -{ - DEVMETHOD(device_probe, rt2860_probe), - DEVMETHOD(device_attach, rt2860_attach), - DEVMETHOD(device_detach, rt2860_detach), - DEVMETHOD(device_shutdown, rt2860_shutdown), - DEVMETHOD(device_suspend, rt2860_suspend), - DEVMETHOD(device_resume, rt2860_resume), - { 0, 0 } -}; -static driver_t rt2860_driver = -{ - "rt2860", - rt2860_dev_methods, - sizeof(struct rt2860_softc) -}; - -static devclass_t rt2860_dev_class; - -DRIVER_MODULE(rt2860, pci, rt2860_driver, rt2860_dev_class, 0, 0); - -MODULE_DEPEND(rt2860, pci, 1, 1, 1); -MODULE_DEPEND(rt2860, wlan, 1, 1, 1); diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_amrr.c b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_amrr.c similarity index 99% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_amrr.c rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_amrr.c index d60e8712d7..224c4d4bfa 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_amrr.c +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_amrr.c @@ -27,7 +27,7 @@ #include -#include "rt2860_amrr.h" +#include /* * Defines and macros diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_amrr.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_amrr.h similarity index 100% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_amrr.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_amrr.h diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_debug.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_debug.h similarity index 100% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_debug.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_debug.h diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_eeprom.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_eeprom.h similarity index 76% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_eeprom.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_eeprom.h index a8b94e28af..52ed41be2c 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_eeprom.h +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_eeprom.h @@ -33,7 +33,9 @@ #define RT2860_EEPROM_LED3_OFF 0x0040 #define RT2860_EEPROM_LNA_GAIN 0x0044 #define RT2860_EEPROM_RSSI_OFF_2GHZ_BASE 0x0046 -#define RT2860_EEPROM_RSSI_OFF_5GHZ_BASE 0x0046 +#define RT2860_EEPROM_RSSI2_OFF_2GHZ_BASE 0x0048 +#define RT2860_EEPROM_RSSI_OFF_5GHZ_BASE 0x004a +#define RT2860_EEPROM_RSSI2_OFF_5GHZ_BASE 0x004c #define RT2860_EEPROM_TXPOW_RATE_DELTA 0x0050 #define RT2860_EEPROM_TXPOW1_2GHZ_BASE 0x0052 #define RT2860_EEPROM_TXPOW2_2GHZ_BASE 0x0060 @@ -42,12 +44,23 @@ #define RT2860_EEPROM_TXPOW2_5GHZ_BASE 0x00a6 #define RT2860_EEPROM_TSSI_5GHZ_BASE 0x00d4 #define RT2860_EEPROM_TXPOW_RATE_BASE 0x00de -#define RT2860_EEPROM_BBP_BASE 0x00f0 +#define RT2860_EEPROM_BBP_BASE 0x00f0 +#define RT3071_EEPROM_RF_BASE 0x0082 #define RT2860_EEPROM_RF_2820 1 /* 2.4GHz 2T3R */ #define RT2860_EEPROM_RF_2850 2 /* 2.4/5GHz 2T3R */ #define RT2860_EEPROM_RF_2720 3 /* 2.4GHz 1T2R */ #define RT2860_EEPROM_RF_2750 4 /* 2.4G/5GHz 1T2R */ +#define RT2860_EEPROM_RF_3020 5 /* 2.4G 1T1R */ +#define RT2860_EEPROM_RF_2020 6 /* 2.4G B/G */ +#define RT2860_EEPROM_RF_3021 7 /* 2.4G 1T2R */ +#define RT2860_EEPROM_RF_3022 8 /* 2.4G 2T2R */ +#define RT2860_EEPROM_RF_3052 9 /* 2.4G/5G 2T2R */ +#define RT2860_EEPROM_RF_2853 10 /* 2.4G.5G 3T3R */ +#define RT2860_EEPROM_RF_3320 11 /* 2.4G 1T1R with PA (RT3350/RT3370/RT3390) */ +#define RT2860_EEPROM_RF_3322 12 /* 2.4G 2T2R with PA (RT3352/RT3371/RT3372/RT3391/RT3392) */ +#define RT2860_EEPROM_RF_3053 13 /* 2.4G/5G 3T3R (RT3883/RT3563/RT3573/RT3593/RT3662) */ +#define RT2860_EEPROM_RF_3853 13 /* 2.4G/5G 3T3R (RT3883/RT3563/RT3573/RT3593/RT3662) */ /* * RT2860_EEPROM_NIC_CONFIG flags diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_io.c b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_io.c similarity index 60% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_io.c rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_io.c index e8eecb8578..e7f1395d5a 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_io.c +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_io.c @@ -16,8 +16,8 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "rt2860_io.h" -#include "rt2860_reg.h" +#include +#include /* * Defines and macros @@ -63,6 +63,80 @@ static uint16_t rt2860_io_eeprom_shiftin_bits(struct rt2860_softc *sc); static uint8_t rt2860_io_byte_rev(uint8_t byte); +/* #ifdef RT305X_SOC */ +static const uint16_t rt3052_eeprom[] = +{ + 0x3052, 0x0101, 0x0c00, 0x3043, 0x8852, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0x0c00, 0x3043, 0x7752, 0x0c00, + 0x3043, 0x6652, 0x0822, 0x0024, 0xffff, 0x012f, 0x7755, 0xaaa8, + 0x888c, 0xffff, 0x000c, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, + 0xffff, 0x0d0d, 0x0d0d, 0x0c0c, 0x0c0c, 0x0c0c, 0x0c0c, 0x0c0c, + 0x1010, 0x1111, 0x1211, 0x1212, 0x1313, 0x1413, 0x1414, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6666, + 0xaacc, 0x6688, 0xaacc, 0x6688, 0xaacc, 0x6688, 0xaacc, 0x6688, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, +}; + +uint8_t rt3052_rf_default[] = { + 0x50, + 0x01, + 0xF7, + 0x75, + 0x40, + 0x03, + 0x42, + 0x50, + 0x39, + 0x0F, + 0x60, + 0x21, + 0x75, + 0x75, + 0x90, + 0x58, + 0xB3, + 0x92, + 0x2C, + 0x02, + 0xBA, + 0xDB, + 0x00, + 0x31, + 0x08, + 0x01, + 0x25, /* Core Power: 0x25=1.25V */ + 0x23, /* RF: 1.35V */ + 0x13, /* ADC: must consist with R27 */ + 0x83, + 0x00, + 0x00, +}; +/* #endif */ + + /* * Static variables */ @@ -108,6 +182,7 @@ static const uint16_t rt2860_io_ccitt16[] = */ uint32_t rt2860_io_mac_read(struct rt2860_softc *sc, uint16_t reg) { + bus_space_read_4(sc->bst, sc->bsh, RT2860_REG_MAC_CSR0); return bus_space_read_4(sc->bst, sc->bsh, reg); } @@ -117,6 +192,7 @@ uint32_t rt2860_io_mac_read(struct rt2860_softc *sc, uint16_t reg) void rt2860_io_mac_read_multi(struct rt2860_softc *sc, uint16_t reg, void *buf, size_t len) { + bus_space_read_4(sc->bst, sc->bsh, RT2860_REG_MAC_CSR0); bus_space_read_region_1(sc->bst, sc->bsh, reg, buf, len); } @@ -126,6 +202,7 @@ void rt2860_io_mac_read_multi(struct rt2860_softc *sc, void rt2860_io_mac_write(struct rt2860_softc *sc, uint16_t reg, uint32_t val) { + bus_space_read_4(sc->bst, sc->bsh, RT2860_REG_MAC_CSR0); bus_space_write_4(sc->bst, sc->bsh, reg, val); } @@ -135,7 +212,15 @@ void rt2860_io_mac_write(struct rt2860_softc *sc, void rt2860_io_mac_write_multi(struct rt2860_softc *sc, uint16_t reg, const void *buf, size_t len) { - bus_space_write_region_1(sc->bst, sc->bsh, reg, buf, len); + int i; + const uint8_t *p; + + bus_space_read_4(sc->bst, sc->bsh, RT2860_REG_MAC_CSR0); + + p = buf; + for (i = 0; i < len; i ++) + bus_space_write_1(sc->bst, sc->bsh, reg + i, *(p+i)); +// bus_space_write_region_1(sc->bst, sc->bsh, reg, buf, len); } /* @@ -150,6 +235,46 @@ void rt2860_io_mac_set_region_4(struct rt2860_softc *sc, rt2860_io_mac_write(sc, reg + i, val); } +/* Read 16-bit from eFUSE ROM (>=RT3071 only.) */ +static uint16_t +rt3090_efuse_read_2(struct rt2860_softc *sc, uint16_t addr) +{ + uint32_t tmp; + uint16_t reg; + int ntries; + + addr *= 2; + /*- + * Read one 16-byte block into registers EFUSE_DATA[0-3]: + * DATA0: F E D C + * DATA1: B A 9 8 + * DATA2: 7 6 5 4 + * DATA3: 3 2 1 0 + */ + tmp = rt2860_io_mac_read(sc, RT3070_EFUSE_CTRL); + tmp &= ~(RT3070_EFSROM_MODE_MASK | RT3070_EFSROM_AIN_MASK); + tmp |= (addr & ~0xf) << RT3070_EFSROM_AIN_SHIFT | RT3070_EFSROM_KICK; + rt2860_io_mac_write(sc, RT3070_EFUSE_CTRL, tmp); + for (ntries = 0; ntries < 500; ntries++) { + tmp = rt2860_io_mac_read(sc, RT3070_EFUSE_CTRL); + if (!(tmp & RT3070_EFSROM_KICK)) + break; + DELAY(2); + } + if (ntries == 500) + return 0xffff; + + if ((tmp & RT3070_EFUSE_AOUT_MASK) == RT3070_EFUSE_AOUT_MASK) + return 0xffff; /* address not found */ + + /* determine to which 32-bit register our 16-bit word belongs */ + reg = RT3070_EFUSE_DATA3 - (addr & 0xc); + tmp = rt2860_io_mac_read(sc, reg); + + return (addr & 2) ? tmp >> 16 : tmp & 0xffff; +} + + /* * rt2860_io_eeprom_read */ @@ -160,6 +285,14 @@ uint16_t rt2860_io_eeprom_read(struct rt2860_softc *sc, uint16_t addr) addr = (addr >> 1); + if (sc->mac_rev == 0x28720200) { + return (rt3052_eeprom[addr]); + } else if ((sc->mac_rev & 0xffff0000) >= 0x30710000) { + tmp = rt2860_io_mac_read(sc, RT3070_EFUSE_CTRL); + if (tmp & RT3070_SEL_EFUSE) + return (rt3090_efuse_read_2(sc, addr)); + } + tmp = rt2860_io_mac_read(sc, RT2860_REG_EEPROM_CSR); tmp &= ~(RT2860_REG_EEDI | RT2860_REG_EEDO | RT2860_REG_EESK); @@ -224,6 +357,43 @@ uint8_t rt2860_io_bbp_read(struct rt2860_softc *sc, uint8_t reg) int ntries; uint32_t tmp; + if (sc->mac_rev == 0x28720200) + { + for (ntries = 0; ntries < 100; ntries ++) { + if ( !(rt2860_io_mac_read(sc, RT2860_REG_BBP_CSR_CFG) & + RT2860_REG_BBP_CSR_BUSY) ) + break; + DELAY(1); + } + if (ntries == 100) { + printf("%s:%s: BBP busy after 100 probes\n", + device_get_nameunit(sc->dev), __func__); + return (0); + } + rt2860_io_mac_write(sc, RT2860_REG_BBP_CSR_CFG, + RT2860_REG_BBP_CSR_READ | + RT2860_REG_BBP_CSR_KICK | RT2860_REG_BBP_RW_MODE_PARALLEL | + (reg & RT2860_REG_BBP_REG_MASK) << RT2860_REG_BBP_REG_SHIFT); + for (ntries = 0; ntries < 100; ntries ++) { + if ( !(rt2860_io_mac_read(sc, RT2860_REG_BBP_CSR_CFG) & + RT2860_REG_BBP_CSR_BUSY) ) + break; + DELAY(1); + } + if (ntries == 100) { + printf("%s:%s: BBP busy after 100 probes\n", + device_get_nameunit(sc->dev), __func__); + return (0); + } + else { + return + ((rt2860_io_mac_read(sc, RT2860_REG_BBP_CSR_CFG) >> + RT2860_REG_BBP_VAL_SHIFT) & + RT2860_REG_BBP_VAL_MASK); + } + return (0); + } + for (ntries = 0; ntries < 100; ntries++) { if (!(rt2860_io_mac_read(sc, RT2860_REG_H2M_MAILBOX_BBP_AGENT) & @@ -276,6 +446,27 @@ void rt2860_io_bbp_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val) int ntries; uint32_t tmp; + if (sc->mac_rev == 0x28720200) + { + for (ntries = 0; ntries < 100; ntries ++) { + if ( !(rt2860_io_mac_read(sc, RT2860_REG_BBP_CSR_CFG) & + RT2860_REG_BBP_CSR_BUSY) ) + break; + DELAY(1); + } + if (ntries == 100) { + printf("%s:%s: BBP busy after 100 probes\n", + device_get_nameunit(sc->dev), __func__); + return; + } + rt2860_io_mac_write(sc, RT2860_REG_BBP_CSR_CFG, + RT2860_REG_BBP_CSR_KICK | RT2860_REG_BBP_RW_MODE_PARALLEL | + (reg & RT2860_REG_BBP_REG_MASK) << RT2860_REG_BBP_REG_SHIFT | + (val & RT2860_REG_BBP_VAL_MASK) << RT2860_REG_BBP_VAL_SHIFT ); + rt2860_io_bbp_read(sc, reg); + return; + } + for (ntries = 0; ntries < 100; ntries++) { if (!(rt2860_io_mac_read(sc, RT2860_REG_H2M_MAILBOX_BBP_AGENT) & @@ -311,6 +502,27 @@ void rt2860_io_bbp_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val) void rt2860_io_rf_write(struct rt2860_softc *sc, uint8_t reg, uint32_t val) { int ntries; + if (sc->mac_rev == 0x28720200) + { + for (ntries = 0; ntries < 100; ntries ++) { + if ( !(rt2860_io_mac_read(sc, RT2872_REG_RF_CSR_CFG) & + RT2872_REG_RF_CSR_BUSY) ) + break; + DELAY(1); + } + if (ntries == 100) { + printf("%s:%s: RF busy after 100 probes\n", + device_get_nameunit(sc->dev), __func__); + return; + } + rt2860_io_mac_write(sc, RT2872_REG_RF_CSR_CFG, + RT2872_REG_RF_CSR_KICK | RT2872_REG_RF_CSR_WRITE | + (reg & RT2872_REG_RF_ID_MASK) << RT2872_REG_RF_ID_SHIFT | + (val & RT2872_REG_RF_VAL_MASK) << RT2872_REG_RF_VAL_SHIFT ); + rt2860_io_rf_read(sc, reg); + return; + } + for (ntries = 0; ntries < 100; ntries++) if (!(rt2860_io_mac_read(sc, RT2860_REG_RF_CSR_CFG0) & @@ -327,6 +539,58 @@ void rt2860_io_rf_write(struct rt2860_softc *sc, uint8_t reg, uint32_t val) rt2860_io_mac_write(sc, RT2860_REG_RF_CSR_CFG0, val); } +/* + * rt2860_io_rf_read + */ +int32_t rt2860_io_rf_read(struct rt2860_softc *sc, uint8_t reg) +{ + int ntries; + if (sc->mac_rev == 0x28720200) + { + for (ntries = 0; ntries < 100; ntries ++) { + if ( !(rt2860_io_mac_read(sc, RT2872_REG_RF_CSR_CFG) & + RT2872_REG_RF_CSR_BUSY) ) + break; + DELAY(1); + } + if (ntries == 100) { + printf("%s:%s: RF busy after 100 probes\n", + device_get_nameunit(sc->dev), __func__); + return (-1); + } + rt2860_io_mac_write(sc, RT2872_REG_RF_CSR_CFG, + RT2872_REG_RF_CSR_KICK | + (reg & RT2872_REG_RF_ID_MASK) << RT2872_REG_RF_ID_SHIFT ); + + for (ntries = 0; ntries < 100; ntries ++) { + if ( !(rt2860_io_mac_read(sc, RT2872_REG_RF_CSR_CFG) & + RT2872_REG_RF_CSR_BUSY) ) + break; + DELAY(1); + } + if (ntries == 100) { + printf("%s:%s: RF busy after 100 probes\n", + device_get_nameunit(sc->dev), __func__); + } + + return (rt2860_io_mac_read(sc, RT2872_REG_RF_CSR_CFG) & RT2872_REG_RF_VAL_MASK); + } + return (-1); +} + +/* + * rt2860_io_rf_load_defaults + */ +void rt2860_io_rf_load_defaults(struct rt2860_softc *sc) +{ + int i; + + if (sc->mac_rev == 0x28720200) { + for (i = 0; i < 32; i ++) + rt2860_io_rf_write(sc, i, rt3052_rf_default[i]); + } +} + /* * rt2860_io_mcu_cmd */ @@ -336,6 +600,9 @@ void rt2860_io_mcu_cmd(struct rt2860_softc *sc, uint8_t cmd, uint32_t tmp; int ntries; + if (sc->mac_rev == 0x28720200) + return; + for (ntries = 0; ntries < 100; ntries++) { if (!(rt2860_io_mac_read(sc, RT2860_REG_H2M_MAILBOX) & @@ -437,30 +704,47 @@ int rt2860_io_mcu_load_ucode(struct rt2860_softc *sc, rt2860_io_mac_write(sc, RT2860_REG_PBF_SYS_CTRL, RT2860_REG_HST_PM_SEL); - rt2860_io_mac_write_multi(sc, RT2860_REG_MCU_UCODE_BASE, ucode, len); + for(i = 0; i < len; i += 4) + { + rt2860_io_mac_write(sc, RT2860_REG_MCU_UCODE_BASE + i, + (ucode[i+3] << 24) | (ucode[i+2] << 16) | + (ucode[i+1] << 8) | ucode[i]); + } + + if (sc->mac_rev != 0x28720200) + rt2860_io_mac_write_multi(sc, RT2860_REG_MCU_UCODE_BASE, + ucode, len); rt2860_io_mac_write(sc, RT2860_REG_PBF_SYS_CTRL, 0); - rt2860_io_mac_write(sc, RT2860_REG_PBF_SYS_CTRL, RT2860_REG_MCU_RESET); + + if (sc->mac_rev != 0x28720200) + rt2860_io_mac_write(sc, RT2860_REG_PBF_SYS_CTRL, + RT2860_REG_MCU_RESET); + + DELAY(10000); /* initialize BBP R/W access agent */ rt2860_io_mac_write(sc, RT2860_REG_H2M_MAILBOX_BBP_AGENT, 0); rt2860_io_mac_write(sc, RT2860_REG_H2M_MAILBOX, 0); - for (ntries = 0; ntries < 1000; ntries++) - { - if (rt2860_io_mac_read(sc, RT2860_REG_PBF_SYS_CTRL) & - RT2860_REG_MCU_READY) - break; + if (sc->mac_rev != 0x28720200) { - DELAY(1000); - } + for (ntries = 0; ntries < 1000; ntries++) + { + if (rt2860_io_mac_read(sc, RT2860_REG_PBF_SYS_CTRL) & + RT2860_REG_MCU_READY) + break; - if (ntries == 1000) - { - printf("%s: timeout waiting for MCU to initialize\n", - device_get_nameunit(sc->dev)); - return ETIMEDOUT; + DELAY(1000); + } + + if (ntries == 1000) + { + printf("%s: timeout waiting for MCU to initialize\n", + device_get_nameunit(sc->dev)); + return ETIMEDOUT; + } } return 0; diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_io.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_io.h similarity index 80% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_io.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_io.h index 0d8b62b588..818c3d2931 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_io.h +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_io.h @@ -19,20 +19,21 @@ #ifndef _RT2860_IO_H_ #define _RT2860_IO_H_ -#include "rt2860_softc.h" +#include -#define RT2860_IO_MCU_CMD_SLEEP 0x30 -#define RT2860_IO_MCU_CMD_WAKEUP 0x31 -#define RT2860_IO_MCU_CMD_RADIOOFF 0x35 -#define RT2860_IO_MCU_CMD_LEDS 0x50 +#define RT2860_IO_MCU_CMD_SLEEP 0x30 +#define RT2860_IO_MCU_CMD_WAKEUP 0x31 +#define RT2860_IO_MCU_CMD_RADIOOFF 0x35 +#define RT2860_IO_MCU_CMD_LEDS 0x50 #define RT2860_IO_MCU_CMD_LED_BRIGHTNESS 0x51 -#define RT2860_IO_MCU_CMD_LED1 0x52 -#define RT2860_IO_MCU_CMD_LED2 0x53 -#define RT2860_IO_MCU_CMD_LED3 0x54 -#define RT2860_IO_MCU_CMD_BOOT 0x72 -#define RT2860_IO_MCU_CMD_BBP 0x80 +#define RT2860_IO_MCU_CMD_LED1 0x52 +#define RT2860_IO_MCU_CMD_LED2 0x53 +#define RT2860_IO_MCU_CMD_LED3 0x54 +#define RT2860_IO_MCU_CMD_BOOT 0x72 +#define RT2860_IO_MCU_CMD_BBP 0x80 #define RT2860_IO_MCU_CMD_POWERSAVE_LEVEL 0x83 +void rt2860_io_rf_load_defaults(struct rt2860_softc *sc); uint32_t rt2860_io_mac_read(struct rt2860_softc *sc, uint16_t reg); void rt2860_io_mac_read_multi(struct rt2860_softc *sc, @@ -58,6 +59,8 @@ void rt2860_io_bbp_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val); void rt2860_io_rf_write(struct rt2860_softc *sc, uint8_t reg, uint32_t val); +int32_t rt2860_io_rf_read(struct rt2860_softc *sc, uint8_t reg); + void rt2860_io_mcu_cmd(struct rt2860_softc *sc, uint8_t cmd, uint8_t token, uint16_t arg); @@ -66,4 +69,5 @@ int rt2860_io_mcu_cmd_check(struct rt2860_softc *sc, uint8_t cid); int rt2860_io_mcu_load_ucode(struct rt2860_softc *sc, const uint8_t *ucode, size_t len); + #endif /* #ifndef _RT2860_IO_H_ */ diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_led.c b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_led.c similarity index 91% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_led.c rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_led.c index a27dff42b8..98387dec6d 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_led.c +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_led.c @@ -16,10 +16,10 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "rt2860_led.h" -#include "rt2860_reg.h" -#include "rt2860_eeprom.h" -#include "rt2860_io.h" +#include +#include +#include +#include /* * rt2860_led_brightness diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_led.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_led.h similarity index 94% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_led.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_led.h index 74f4791861..e0fbf790e2 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_led.h +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_led.h @@ -19,7 +19,7 @@ #ifndef _RT2860_LED_H_ #define _RT2860_LED_H_ -#include "rt2860_softc.h" +#include #define RT2860_LED_CMD_RADIO_OFF 0 #define RT2860_LED_CMD_RADIO_ON (1 << 5) @@ -30,4 +30,4 @@ void rt2860_led_brightness(struct rt2860_softc *sc, uint8_t brightness); void rt2860_led_cmd(struct rt2860_softc *sc, uint8_t cmd); -#endif /* #ifndef _RT2870_LED_H_ */ +#endif /* #ifndef _RT2860_LED_H_ */ diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_nexus.c b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_nexus.c new file mode 100644 index 0000000000..73b6081ecf --- /dev/null +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_nexus.c @@ -0,0 +1,93 @@ + +/*- + * Copyright (c) 2009-2010 Alexander Egorenkov + * Copyright (c) 2009 Damien Bergamini + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Static function prototypes + */ + +static int rt2860_nexus_probe(device_t dev); + +static int rt2860_nexus_attach(device_t dev); + +int rt2860_attach(device_t dev); + +int rt2860_detach(device_t dev); + +int rt2860_shutdown(device_t dev); + +int rt2860_suspend(device_t dev); + +int rt2860_resume(device_t dev); + +/* + * rt2860_nexus_probe + */ +static int rt2860_nexus_probe(device_t dev) +{ + device_set_desc(dev, "Ralink RT2860 802.11n MAC/BPP"); + return 0; +} + +/* + * rt2860_nexus_attach + */ +static int rt2860_nexus_attach(device_t dev) +{ + struct rt2860_softc *sc; + + sc = device_get_softc(dev); + sc->mem_rid = 0; + + return (rt2860_attach(dev)); +} + +static device_method_t rt2860_nexus_dev_methods[] = +{ + DEVMETHOD(device_probe, rt2860_nexus_probe), + DEVMETHOD(device_attach, rt2860_nexus_attach), + DEVMETHOD(device_detach, rt2860_detach), + DEVMETHOD(device_shutdown, rt2860_shutdown), + DEVMETHOD(device_suspend, rt2860_suspend), + DEVMETHOD(device_resume, rt2860_resume), + { 0, 0 } +}; + +static driver_t rt2860_nexus_driver = +{ + "rt2860", + rt2860_nexus_dev_methods, + sizeof(struct rt2860_softc) +}; + +static devclass_t rt2860_nexus_dev_class; + +DRIVER_MODULE(rt2860, nexus, rt2860_nexus_driver, rt2860_nexus_dev_class, 0, 0); +MODULE_DEPEND(rt2860, wlan, 1, 1, 1); + diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_pci.c b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_pci.c new file mode 100644 index 0000000000..ea0855648e --- /dev/null +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_pci.c @@ -0,0 +1,164 @@ + +/*- + * Copyright (c) 2009-2010 Alexander Egorenkov + * Copyright (c) 2009 Damien Bergamini + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* + * Defines and macros + */ + +#define PCI_VENDOR_RALINK 0x1814 +#define PCI_PRODUCT_RALINK_RT2860_PCI 0x0601 +#define PCI_PRODUCT_RALINK_RT2860_PCIe 0x0681 +#define PCI_PRODUCT_RALINK_RT2760_PCI 0x0701 +#define PCI_PRODUCT_RALINK_RT2790_PCIe 0x0781 +#define PCI_PRODUCT_RALINK_RT3090_PCIe 0x3090 + +/* + * Data structures and types + */ + +struct rt2860_pci_ident +{ + uint16_t vendor; + uint16_t device; + const char *name; +}; + +/* + * Static function prototypes + */ + +static int rt2860_pci_probe(device_t dev); + +static int rt2860_pci_attach(device_t dev); + +/* + * Bus independed methods + */ + +int rt2860_attach(device_t dev); + +int rt2860_detach(device_t dev); + +int rt2860_shutdown(device_t dev); + +int rt2860_suspend(device_t dev); + +int rt2860_resume(device_t dev); + + +/* + * Static variables + */ + +static const struct rt2860_pci_ident rt2860_pci_ids[] = +{ + { PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2860_PCI, "Ralink RT2860 PCI" }, + { PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2860_PCIe, "Ralink RT2860 PCIe" }, + { PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2760_PCI, "Ralink RT2760 PCI" }, + { PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2790_PCIe, "Ralink RT2790 PCIe" }, + { PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2790_PCIe, "Ralink RT2790 PCIe" }, + { PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT3090_PCIe, "Ralink RT3090 PCIe" }, + { 0, 0, NULL } +}; + + +/* + * rt2860_pci_probe + */ +static int rt2860_pci_probe(device_t dev) +{ + const struct rt2860_pci_ident *ident; + + for (ident = rt2860_pci_ids; ident->name != NULL; ident++) + { + if (pci_get_vendor(dev) == ident->vendor && + pci_get_device(dev) == ident->device) + { + device_set_desc(dev, ident->name); + return 0; + } + } + + return ENXIO; +} + +/* + * rt2860_pci_attach + */ +static int rt2860_pci_attach(device_t dev) +{ + struct rt2860_softc *sc; + + sc = device_get_softc(dev); + + if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) + { + printf("%s: chip is in D%d power mode, setting to D0\n", + device_get_nameunit(dev), pci_get_powerstate(dev)); + pci_set_powerstate(dev, PCI_POWERSTATE_D0); + } + + /* enable bus-mastering */ + pci_enable_busmaster(dev); + sc->mem_rid = PCIR_BAR(0); + + return (rt2860_attach(dev)); +} + +static device_method_t rt2860_pci_dev_methods[] = +{ + /* PCI only */ + DEVMETHOD(device_probe, rt2860_pci_probe), + DEVMETHOD(device_attach, rt2860_pci_attach), + + /* Any bus */ + DEVMETHOD(device_detach, rt2860_detach), + DEVMETHOD(device_shutdown, rt2860_shutdown), + DEVMETHOD(device_suspend, rt2860_suspend), + DEVMETHOD(device_resume, rt2860_resume), + { 0, 0 } +}; + +static driver_t rt2860_pci_driver = +{ + "rt2860", + rt2860_pci_dev_methods, + sizeof(struct rt2860_softc) +}; + +static devclass_t rt2860_pci_dev_class; + +DRIVER_MODULE(rt2860, pci, rt2860_pci_driver, rt2860_pci_dev_class, 0, 0); +MODULE_DEPEND(rt2860, pci, 1, 1, 1); +MODULE_DEPEND(rt2860, wlan, 1, 1, 1); + diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_read_eeprom.c b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_read_eeprom.c similarity index 91% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_read_eeprom.c rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_read_eeprom.c index 55ad361b67..4fb4cdd97c 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_read_eeprom.c +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_read_eeprom.c @@ -16,11 +16,11 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "rt2860_read_eeprom.h" -#include "rt2860_reg.h" -#include "rt2860_eeprom.h" -#include "rt2860_io.h" -#include "rt2860_debug.h" +#include +#include +#include +#include +#include /* * rt2860_read_eeprom @@ -102,6 +102,8 @@ void rt2860_read_eeprom(struct rt2860_softc *sc) device_get_nameunit(sc->dev), sc->rf_rev, sc->ntxpath, sc->nrxpath); val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_NIC_CONFIG); + if ((val & 0xff00) != 0xff00) + sc->patch_dac = (val >> 15) & 1; sc->hw_radio_cntl = ((val & RT2860_EEPROM_HW_RADIO_CNTL) ? 1 : 0); sc->tx_agc_cntl = ((val & RT2860_EEPROM_TX_AGC_CNTL) ? 1 : 0); @@ -172,8 +174,12 @@ void rt2860_read_eeprom(struct rt2860_softc *sc) /* read RSSI offsets and LNA gains */ val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_LNA_GAIN); + if ((sc->mac_rev & 0xffff0000) >= 0x30710000) + sc->lna_gain[0] = RT3090_DEF_LNA; + else /* channel group 0 */ + sc->lna_gain[0] = val & 0xff; - sc->lna_gain[0] = (val & 0xff); +// sc->lna_gain[0] = (val & 0xff); sc->lna_gain[1] = (val >> 8) & 0xff; val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_RSSI_OFF_2GHZ_BASE); @@ -181,17 +187,27 @@ void rt2860_read_eeprom(struct rt2860_softc *sc) sc->rssi_off_2ghz[0] = (val & 0xff); sc->rssi_off_2ghz[1] = (val >> 8) & 0xff; - val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_RSSI_OFF_2GHZ_BASE + sizeof(uint16_t)); + val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_RSSI_OFF_2GHZ_BASE + 2); - sc->rssi_off_2ghz[2] = (val & 0xff); + //sc->rssi_off_2ghz[2] = (val & 0xff); sc->lna_gain[2] = (val >> 8) & 0xff; + if ((sc->mac_rev & 0xffff0000) >= 0x30710000) { + /* + * On RT3090 chips (limited to 2 Rx chains), this ROM + * field contains the Tx mixer gain for the 2GHz band. + */ + if ((val & 0xff) != 0xff) + sc->txmixgain_2ghz = val & 0x7; + //DPRINTF(("tx mixer gain=%u (2GHz)\n", sc->txmixgain_2ghz)); + } else + sc->rssi_off_2ghz[2] = val & 0xff; /* Ant C */ val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_RSSI_OFF_5GHZ_BASE); sc->rssi_off_5ghz[0] = (val & 0xff); sc->rssi_off_5ghz[1] = (val >> 8) & 0xff; - val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_RSSI_OFF_5GHZ_BASE + sizeof(uint16_t)); + val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_RSSI_OFF_5GHZ_BASE + 2); sc->rssi_off_5ghz[2] = (val & 0xff); sc->lna_gain[3] = (val >> 8) & 0xff; @@ -378,22 +394,22 @@ void rt2860_read_eeprom(struct rt2860_softc *sc) sc->tssi_2ghz[0] = (val & 0xff); /* [-4] */ sc->tssi_2ghz[1] = (val >> 8); /* [-3] */ - val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_2GHZ_BASE + sizeof(uint16_t)); + val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_2GHZ_BASE + 2); sc->tssi_2ghz[2] = (val & 0xff); /* [-2] */ sc->tssi_2ghz[3] = (val >> 8); /* [-1] */ - val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_2GHZ_BASE + 2 * sizeof(uint16_t)); + val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_2GHZ_BASE + 2 * 2); sc->tssi_2ghz[4] = (val & 0xff); /* [0] */ sc->tssi_2ghz[5] = (val >> 8); /* [+1] */ - val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_2GHZ_BASE + 3 * sizeof(uint16_t)); + val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_2GHZ_BASE + 3 * 2); sc->tssi_2ghz[6] = (val & 0xff); /* [+2] */ sc->tssi_2ghz[7] = (val >> 8); /* [+3] */ - val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_2GHZ_BASE + 4 * sizeof(uint16_t)); + val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_2GHZ_BASE + 4 * 2); sc->tssi_2ghz[8] = (val & 0xff); /* [+4] */ sc->tssi_step_2ghz = (val >> 8); @@ -415,22 +431,22 @@ void rt2860_read_eeprom(struct rt2860_softc *sc) sc->tssi_5ghz[0] = (val & 0xff); /* [-4] */ sc->tssi_5ghz[1] = (val >> 8); /* [-3] */ - val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_5GHZ_BASE + sizeof(uint16_t)); + val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_5GHZ_BASE + 2); sc->tssi_5ghz[2] = (val & 0xff); /* [-2] */ sc->tssi_5ghz[3] = (val >> 8); /* [-1] */ - val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_5GHZ_BASE + 2 * sizeof(uint16_t)); + val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_5GHZ_BASE + 2 * 2); sc->tssi_5ghz[4] = (val & 0xff); /* [0] */ sc->tssi_5ghz[5] = (val >> 8); /* [+1] */ - val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_5GHZ_BASE + 3 * sizeof(uint16_t)); + val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_5GHZ_BASE + 3 * 2); sc->tssi_5ghz[6] = (val & 0xff); /* [+2] */ sc->tssi_5ghz[7] = (val >> 8); /* [+3] */ - val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_5GHZ_BASE + 4 * sizeof(uint16_t)); + val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_TSSI_5GHZ_BASE + 4 * 2); sc->tssi_5ghz[8] = (val & 0xff); /* [+4] */ sc->tssi_step_5ghz = (val >> 8); @@ -450,8 +466,18 @@ void rt2860_read_eeprom(struct rt2860_softc *sc) /* read default BBP settings */ rt2860_io_eeprom_read_multi(sc, RT2860_EEPROM_BBP_BASE, - sc->bbp_eeprom, RT2860_SOFTC_BBP_EEPROM_COUNT * sizeof(uint16_t)); + sc->bbp_eeprom, RT2860_SOFTC_BBP_EEPROM_COUNT * 2); + if ((sc->mac_rev & 0xffff0000) >= 0x30710000) { + /* read vendor RF settings */ + for (i = 0; i < 10; i++) { + val = rt2860_io_eeprom_read(sc, RT3071_EEPROM_RF_BASE + i); + sc->rf[i].val = val & 0xff; + sc->rf[i].reg = val >> 8; +// DPRINTF(("RF%d=0x%02x\n", sc->rf[i].reg, +// sc->rf[i].val)); + } + } /* read powersave level */ val = rt2860_io_eeprom_read(sc, RT2860_EEPROM_POWERSAVE_LEVEL); diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_read_eeprom.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_read_eeprom.h similarity index 96% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_read_eeprom.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_read_eeprom.h index 46c4982d3a..e24c2d11dd 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_read_eeprom.h +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_read_eeprom.h @@ -19,7 +19,7 @@ #ifndef _RT2860_READ_EEPROM_H_ #define _RT2860_READ_EEPROM_H_ -#include "rt2860_softc.h" +#include void rt2860_read_eeprom(struct rt2860_softc *sc); diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_reg.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_reg.h similarity index 72% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_reg.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_reg.h index b4d2c98ca5..63ca7b4e6f 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_reg.h +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_reg.h @@ -19,7 +19,11 @@ #ifndef _RT2860_REG_H_ #define _RT2860_REG_H_ -#define RT2860_REG_EEPROM_CSR 0x0004 +#define RT2860_REG_PCI_CFG 0x0000 +#define RT2860_REG_EEPROM_CSR 0x0004 +#define RT2860_REG_PCI_MCU_CSR 0x0008 +#define RT2860_REG_PCI_SYS_CSR 0x000c +#define RT2860_REG_PCIE_JTAG 0x0010 #define RT2860_REG_SCHDMA_INT_STATUS 0x0200 #define RT2860_REG_SCHDMA_INT_MASK 0x0204 @@ -40,42 +44,73 @@ #define RT2860_REG_SCHDMA_TX_MAX_CNT(qid) (0x0234 + (qid) * 16) #define RT2860_REG_SCHDMA_TX_CTX_IDX(qid) (0x0238 + (qid) * 16) #define RT2860_REG_SCHDMA_TX_DTX_IDX(qid) (0x023c + (qid) * 16) +#define RT2860_REG_SCHDMA_US_CYC_CNT 0x02a4 #define RT2860_REG_PBF_SYS_CTRL 0x0400 -#define RT2860_REG_PBF_CFG 0x0408 +#define RT2860_REG_PBF_HOST_CMD 0x0404 +#define RT2860_REG_PBF_CFG 0x0408 #define RT2860_REG_PBF_MAX_PCNT 0x040c +#define RT2860_REG_PBF_BUF_CTRL 0x0410 +#define RT2860_REG_PBF_MCU_INT_STA 0x0414 +#define RT2860_REG_PBF_MCU_INT_ENA 0x0418 +#define RT2860_REG_PBF_TX0Q_IO 0x041c +#define RT2860_REG_PBF_TX1Q_IO 0x0420 +#define RT2860_REG_PBF_TX2Q_IO 0x0424 +#define RT2860_REG_PBF_RX0Q_IO 0x0428 #define RT2860_REG_PBF_BCN_OFFSET0 0x042c #define RT2860_REG_PBF_BCN_OFFSET1 0x0430 +#define RT2860_REG_PBF_TXRXQ_STA 0x0434 #define RT2860_REG_PBF_TXRXQ_PCNT 0x0438 +#define RT2860_REG_PBF_DBG 0x043c +#define RT2860_REG_PBF_CAP_CTRL 0x0440 -#define RT2860_REG_MAC_CSR0 0x1000 -#define RT2860_REG_SYS_CTRL 0x1004 -#define RT2860_REG_ADDR_DW0 0x1008 -#define RT2860_REG_ADDR_DW1 0x100c +#define RT2872_REG_RF_CSR_CFG 0x500 +#define RT2872_REG_RF_SETTING 0x504 +#define RT2872_REG_RF_TEST_CONTROL 0x508 + +#define RT2860_REG_MAC_CSR0 0x1000 +#define RT2860_REG_SYS_CTRL 0x1004 +#define RT2860_REG_ADDR_DW0 0x1008 +#define RT2860_REG_ADDR_DW1 0x100c #define RT2860_REG_BSSID_DW0 0x1010 #define RT2860_REG_BSSID_DW1 0x1014 #define RT2860_REG_MAX_LEN_CFG 0x1018 #define RT2860_REG_BBP_CSR_CFG 0x101c #define RT2860_REG_RF_CSR_CFG0 0x1020 -#define RT2860_REG_LED_CFG 0x102c +#define RT2860_REG_LED_CFG 0x102c +#define RT2860_REG_AMPDU_MAX_LEN_20M1S 0x1030 +#define RT2860_REG_AMPDU_MAX_LEN_20M2S 0x1034 +#define RT2860_REG_AMPDU_MAX_LEN_40M1S 0x1038 +#define RT2860_REG_AMPDU_MAX_LEN_40M2S 0x103c +#define RT2860_REG_AMPDU_BA_WINSIZE 0x1040 -#define RT2860_REG_XIFS_TIME_CFG 0x1100 +#define RT2860_REG_XIFS_TIME_CFG 0x1100 #define RT2860_REG_BKOFF_SLOT_CFG 0x1104 +#define RT2860_REG_NAV_TIME_CFG 0x1108 +#define RT2860_REG_CH_TIME_CFG 0x110c +#define RT2860_REG_PBF_LIFE_TIMER 0x1110 #define RT2860_REG_BCN_TIME_CFG 0x1114 +#define RT2860_REG_TBTT_SYNC_CFG 0x1118 #define RT2860_REG_TSF_TIMER_DW0 0x111c #define RT2860_REG_TSF_TIMER_DW1 0x1120 #define RT2860_REG_TBTT_TIMER 0x1124 +#define RT2860_REG_INT_TIMER 0x1128 +#define RT2860_REG_INT_TIMER_EN 0x112c +#define RT2860_REG_CH_IDLE_STA 0x1130 #define RT2860_REG_STATUS_CFG 0x1200 #define RT2860_REG_PWR_PIN_CFG 0x1204 #define RT2860_REG_AUTO_WAKEUP_CFG 0x1208 -#define RT2860_REG_TX_EDCA_AC_CFG(aci) (0x1300 + (aci) * 4) +#define RT2860_REG_TX_EDCA_AC_CFG(aci) (0x1300 + (aci) * 4) +#define RT2860_REG_TX_EDCA_TID_AC_MAP 0x1310 #define RT2860_REG_TX_PWR_CFG(ridx) (0x1314 + (ridx) * 4) #define RT2860_REG_TX_PIN_CFG 0x1328 #define RT2860_REG_TX_BAND_CFG 0x132c #define RT2860_REG_TX_SW_CFG0 0x1330 #define RT2860_REG_TX_SW_CFG1 0x1334 +#define RT2860_REG_TX_SW_CFG2 0x1338 +#define RT2860_REG_TX_TXOP_THRES_CFG 0x133c #define RT2860_REG_TX_TXOP_CTRL_CFG 0x1340 #define RT2860_REG_TX_RTS_CFG 0x1344 #define RT2860_REG_TX_TIMEOUT_CFG 0x1348 @@ -91,14 +126,27 @@ #define RT2860_REG_TX_MM40_PROT_CFG 0x1370 #define RT2860_REG_TX_GF20_PROT_CFG 0x1374 #define RT2860_REG_TX_GF40_PROT_CFG 0x1378 +#define RT2860_REG_TX_EXP_CTS_TIME 0x137c #define RT2860_REG_TX_EXP_ACK_TIME 0x1380 #define RT2860_REG_RX_FILTER_CFG 0x1400 #define RT2860_REG_AUTO_RSP_CFG 0x1404 -#define RT2860_REG_LEGACY_BASIC_RATE 0x1408 +#define RT2860_REG_LEGACY_BASIC_RATE 0x1408 #define RT2860_REG_HT_BASIC_RATE 0x140c +#define RT2860_REG_HT_CTRL_CFG 0x1410 +#define RT2860_REG_SIFS_COST_CFG 0x1414 +#define RT2860_REG_RX_PARSER_CFG 0x1418 -#define RT2860_REG_HCCAPSMP_TXOP_HLDR_ET 0x1608 +#define RT2860_REG_TX_SEC_CNT0 0x1500 +#define RT2860_REG_RX_SEC_CNT0 0x1504 +#define RT2860_REG_CCMP_FC_MUTE 0x1508 + +#define RT2860_REG_HCCAPSMP_TXOP_HLDR_ADDR0 0x1600 +#define RT2860_REG_HCCAPSMP_TXOP_HLDR_ADDR1 0x1604 +#define RT2860_REG_HCCAPSMP_TXOP_HLDR_ET 0x1608 +#define RT2860_REG_HCCAPSMP_QOS_CFPOLL_RA_DW0 0x160c +#define RT2860_REG_HCCAPSMP_QOS_CFPOLL_A1_DW1 0x1610 +#define RT2860_REG_HCCAPSMP_QOS_CFPOLL_QC 0x1614 #define RT2860_REG_RX_STA_CNT0 0x1700 #define RT2860_REG_RX_STA_CNT1 0x1704 @@ -116,7 +164,7 @@ #define RT2860_REG_TX_AGG_CNT5 0x1734 #define RT2860_REG_TX_AGG_CNT6 0x1738 #define RT2860_REG_TX_AGG_CNT7 0x173c -#define RT2860_REG_TXRX_MPDU_DEN_CNT 0x1740 +#define RT2860_REG_TXRX_MPDU_DEN_CNT 0x1740 #define RT2860_REG_WCID(wcid) (0x1800 + (wcid) * 8) #define RT2860_REG_PKEY(wcid) (0x4000 + (wcid) * 32) @@ -135,6 +183,95 @@ #define RT2860_REG_BEACON_BASE(vap) (0x7800 + (vap) * 512) +/* RT3070 registers */ +#define RT3070_RF_CSR_CFG 0x0500 +#define RT3070_EFUSE_CTRL 0x0580 +#define RT3070_EFUSE_DATA0 0x0590 +#define RT3070_EFUSE_DATA1 0x0594 +#define RT3070_EFUSE_DATA2 0x0598 +#define RT3070_EFUSE_DATA3 0x059c +#define RT3090_OSC_CTRL 0x05a4 +#define RT3070_LDO_CFG0 0x05d4 +#define RT3070_GPIO_SWITCH 0x05dc + +#define RT3090_AUX_CTRL 0x010c +#define RT3070_OPT_14 0x0114 + +/* possible flags for register RF_CSR_CFG */ +#define RT3070_RF_KICK (1 << 17) +#define RT3070_RF_WRITE (1 << 16) + +/* possible flags for register EFUSE_CTRL */ +#define RT3070_SEL_EFUSE (1 << 31) +#define RT3070_EFSROM_KICK (1 << 30) +#define RT3070_EFSROM_AIN_MASK 0x03ff0000 +#define RT3070_EFSROM_AIN_SHIFT 16 +#define RT3070_EFSROM_MODE_MASK 0x000000c0 +#define RT3070_EFUSE_AOUT_MASK 0x0000003f + +/* possible flags for RT3020 RF register 1 */ +#define RT3070_RF_BLOCK (1 << 0) +#define RT3070_RX0_PD (1 << 2) +#define RT3070_TX0_PD (1 << 3) +#define RT3070_RX1_PD (1 << 4) +#define RT3070_TX1_PD (1 << 5) +#define RT3070_RX2_PD (1 << 6) +#define RT3070_TX2_PD (1 << 7) + +/* possible flags for RT3020 RF register 1 */ +#define RT3070_RF_BLOCK (1 << 0) +#define RT3070_RX0_PD (1 << 2) +#define RT3070_TX0_PD (1 << 3) +#define RT3070_RX1_PD (1 << 4) +#define RT3070_TX1_PD (1 << 5) +#define RT3070_RX2_PD (1 << 6) +#define RT3070_TX2_PD (1 << 7) + +/* possible flags for RT3020 RF register 7 */ +#define RT3070_TUNE (1 << 0) + +/* possible flags for RT3020 RF register 15 */ +#define RT3070_TX_LO2 (1 << 3) + +/* possible flags for RT3020 RF register 17 */ +#define RT3070_TX_LO1 (1 << 3) + +/* possible flags for RT3020 RF register 20 */ +#define RT3070_RX_LO1 (1 << 3) + +/* possible flags for RT3020 RF register 21 */ +#define RT3070_RX_LO2 (1 << 3) +#define RT3070_RX_CTB (1 << 7) + +/* possible flags for RT3020 RF register 22 */ +#define RT3070_BB_LOOPBACK (1 << 0) + +/* possible flags for RT3053 RF register 1 */ +#define RT3593_VCO (1 << 0) + +/* possible flags for RT3053 RF register 2 */ +#define RT3593_RESCAL (1 << 7) + +/* possible flags for RT3053 RF register 3 */ +#define RT3593_VCOCAL (1 << 7) + +/* possible flags for RT3053 RF register 6 */ +#define RT3593_VCO_IC (1 << 6) + +/* possible flags for RT3053 RF register 20 */ +#define RT3593_LDO_PLL_VC_MASK 0x0e +#define RT3593_LDO_RF_VC_MASK 0xe0 + +/* possible flags for RT3053 RF register 22 */ +#define RT3593_CP_IC_MASK 0xe0 +#define RT3593_CP_IC_SHIFT 5 + +/* possible flags for RT3053 RF register 46 */ +#define RT3593_RX_CTB (1 << 5) + +#define RT3090_DEF_LNA 10 + + #define RT2860_REG_RF_R1 0 #define RT2860_REG_RF_R2 1 #define RT2860_REG_RF_R3 2 @@ -239,11 +376,24 @@ #define RT2860_REG_BBP_HRST (1 << 1) #define RT2860_REG_MAC_SRST (1 << 0) +/* + * RT2872_REG_RF_CSR_CFG flags + */ +#define RT2872_REG_RF_CSR_BUSY (1 << 17) +#define RT2872_REG_RF_CSR_KICK (1 << 17) +#define RT2872_REG_RF_CSR_WRITE (1 << 16) +#define RT2872_REG_RF_ID_SHIFT 8 +#define RT2872_REG_RF_ID_MASK 0x1f +#define RT2872_REG_RF_VAL_SHIFT 0 +#define RT2872_REG_RF_VAL_MASK 0xff + /* * RT2860_REG_BBP_CSR_CFG flags */ -#define RT2860_REG_BBP_RW_MODE_PARALLEL (1 << 19) +#define RT2860_REG_BBP_RW_MODE_PARALLEL (1 << 19) +#define RT2860_REG_BBP_PAR_DUR (1 << 19) #define RT2860_REG_BBP_CSR_BUSY (1 << 17) +#define RT2860_REG_BBP_CSR_KICK (1 << 17) #define RT2860_REG_BBP_CSR_READ (1 << 16) #define RT2860_REG_BBP_REG_SHIFT 8 #define RT2860_REG_BBP_REG_MASK 0xff diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_rf.c b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_rf.c new file mode 100644 index 0000000000..53080b427f --- /dev/null +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_rf.c @@ -0,0 +1,1144 @@ + +/*- + * Copyright (c) 2009-2010 Alexander Egorenkov + * Copyright (c) 2009 Damien Bergamini + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include + +static void rt2872_rf_set_chan(struct rt2860_softc *sc, struct ieee80211_channel *c); + +extern uint8_t rt3052_rf_default[]; + +/* + * Static variables + */ + +static const struct rt2860_rf_prog +{ + uint8_t chan; + uint32_t r1, r2, r3, r4; +} rt2860_rf_2850[] = +{ + { 1, 0x98402ecc, 0x984c0786, 0x9816b455, 0x9800510b }, + { 2, 0x98402ecc, 0x984c0786, 0x98168a55, 0x9800519f }, + { 3, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800518b }, + { 4, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800519f }, + { 5, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800518b }, + { 6, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800519f }, + { 7, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800518b }, + { 8, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800519f }, + { 9, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800518b }, + { 10, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800519f }, + { 11, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800518b }, + { 12, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800519f }, + { 13, 0x98402ecc, 0x984c079e, 0x98168a55, 0x9800518b }, + { 14, 0x98402ecc, 0x984c07a2, 0x98168a55, 0x98005193 }, + { 36, 0x98402ecc, 0x984c099a, 0x98158a55, 0x980ed1a3 }, + { 38, 0x98402ecc, 0x984c099e, 0x98158a55, 0x980ed193 }, + { 40, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed183 }, + { 44, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed1a3 }, + { 46, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed18b }, + { 48, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed19b }, + { 52, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed193 }, + { 54, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed1a3 }, + { 56, 0x98402ec8, 0x984c068e, 0x98158a55, 0x980ed18b }, + { 60, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed183 }, + { 62, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed193 }, + { 64, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed1a3 }, + { 100, 0x98402ec8, 0x984c06b2, 0x98178a55, 0x980ed783 }, + { 102, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed793 }, + { 104, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed1a3 }, + { 108, 0x98402ecc, 0x985c0a32, 0x98578a55, 0x980ed193 }, + { 110, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed183 }, + { 112, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed19b }, + { 116, 0x98402ecc, 0x984c0a3a, 0x98178a55, 0x980ed1a3 }, + { 118, 0x98402ecc, 0x984c0a3e, 0x98178a55, 0x980ed193 }, + { 120, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed183 }, + { 124, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed193 }, + { 126, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed15b }, + { 128, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed1a3 }, + { 132, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed18b }, + { 134, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed193 }, + { 136, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed19b }, + { 140, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed183 }, + { 149, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed1a7 }, + { 151, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed187 }, + { 153, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed18f }, + { 157, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed19f }, + { 159, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed1a7 }, + { 161, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed187 }, + { 165, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed197 }, + { 184, 0x95002ccc, 0x9500491e, 0x9509be55, 0x950c0a0b }, + { 188, 0x95002ccc, 0x95004922, 0x9509be55, 0x950c0a13 }, + { 192, 0x95002ccc, 0x95004926, 0x9509be55, 0x950c0a1b }, + { 196, 0x95002ccc, 0x9500492a, 0x9509be55, 0x950c0a23 }, + { 208, 0x95002ccc, 0x9500493a, 0x9509be55, 0x950c0a13 }, + { 212, 0x95002ccc, 0x9500493e, 0x9509be55, 0x950c0a1b }, + { 216, 0x95002ccc, 0x95004982, 0x9509be55, 0x950c0a23 }, +}; + +static const struct rfprog { + uint8_t chan; + uint32_t r1, r2, r3, r4; +} rt2860_rf2850[] = { + { 1, 0x100bb3, 0x1301e1, 0x05a014, 0x001402 }, + { 2, 0x100bb3, 0x1301e1, 0x05a014, 0x001407 }, + { 3, 0x100bb3, 0x1301e2, 0x05a014, 0x001402 }, + { 4, 0x100bb3, 0x1301e2, 0x05a014, 0x001407 }, + { 5, 0x100bb3, 0x1301e3, 0x05a014, 0x001402 }, + { 6, 0x100bb3, 0x1301e3, 0x05a014, 0x001407 }, + { 7, 0x100bb3, 0x1301e4, 0x05a014, 0x001402 }, + { 8, 0x100bb3, 0x1301e4, 0x05a014, 0x001407 }, + { 9, 0x100bb3, 0x1301e5, 0x05a014, 0x001402 }, + { 10, 0x100bb3, 0x1301e5, 0x05a014, 0x001407 }, + { 11, 0x100bb3, 0x1301e6, 0x05a014, 0x001402 }, + { 12, 0x100bb3, 0x1301e6, 0x05a014, 0x001407 }, + { 13, 0x100bb3, 0x1301e7, 0x05a014, 0x001402 }, + { 14, 0x100bb3, 0x1301e8, 0x05a014, 0x001404 }, + { 36, 0x100bb3, 0x130266, 0x056014, 0x001408 }, + { 38, 0x100bb3, 0x130267, 0x056014, 0x001404 }, + { 40, 0x100bb2, 0x1301a0, 0x056014, 0x001400 }, + { 44, 0x100bb2, 0x1301a0, 0x056014, 0x001408 }, + { 46, 0x100bb2, 0x1301a1, 0x056014, 0x001402 }, + { 48, 0x100bb2, 0x1301a1, 0x056014, 0x001406 }, + { 52, 0x100bb2, 0x1301a2, 0x056014, 0x001404 }, + { 54, 0x100bb2, 0x1301a2, 0x056014, 0x001408 }, + { 56, 0x100bb2, 0x1301a3, 0x056014, 0x001402 }, + { 60, 0x100bb2, 0x1301a4, 0x056014, 0x001400 }, + { 62, 0x100bb2, 0x1301a4, 0x056014, 0x001404 }, + { 64, 0x100bb2, 0x1301a4, 0x056014, 0x001408 }, + { 100, 0x100bb2, 0x1301ac, 0x05e014, 0x001400 }, + { 102, 0x100bb2, 0x1701ac, 0x15e014, 0x001404 }, + { 104, 0x100bb2, 0x1701ac, 0x15e014, 0x001408 }, + { 108, 0x100bb3, 0x17028c, 0x15e014, 0x001404 }, + { 110, 0x100bb3, 0x13028d, 0x05e014, 0x001400 }, + { 112, 0x100bb3, 0x13028d, 0x05e014, 0x001406 }, + { 116, 0x100bb3, 0x13028e, 0x05e014, 0x001408 }, + { 118, 0x100bb3, 0x13028f, 0x05e014, 0x001404 }, + { 120, 0x100bb1, 0x1300e0, 0x05e014, 0x001400 }, + { 124, 0x100bb1, 0x1300e0, 0x05e014, 0x001404 }, + { 126, 0x100bb1, 0x1300e0, 0x05e014, 0x001406 }, + { 128, 0x100bb1, 0x1300e0, 0x05e014, 0x001408 }, + { 132, 0x100bb1, 0x1300e1, 0x05e014, 0x001402 }, + { 134, 0x100bb1, 0x1300e1, 0x05e014, 0x001404 }, + { 136, 0x100bb1, 0x1300e1, 0x05e014, 0x001406 }, + { 140, 0x100bb1, 0x1300e2, 0x05e014, 0x001400 }, + { 149, 0x100bb1, 0x1300e2, 0x05e014, 0x001409 }, + { 151, 0x100bb1, 0x1300e3, 0x05e014, 0x001401 }, + { 153, 0x100bb1, 0x1300e3, 0x05e014, 0x001403 }, + { 157, 0x100bb1, 0x1300e3, 0x05e014, 0x001407 }, + { 159, 0x100bb1, 0x1300e3, 0x05e014, 0x001409 }, + { 161, 0x100bb1, 0x1300e4, 0x05e014, 0x001401 }, + { 165, 0x100bb1, 0x1300e4, 0x05e014, 0x001405 }, + { 167, 0x100bb1, 0x1300f4, 0x05e014, 0x001407 }, + { 169, 0x100bb1, 0x1300f4, 0x05e014, 0x001409 }, + { 171, 0x100bb1, 0x1300f5, 0x05e014, 0x001401 }, + { 173, 0x100bb1, 0x1300f5, 0x05e014, 0x001403 } +}; + +static const struct rt2860_rf_fi3020 +{ + uint8_t channel, n, r, k; +} rt2860_rf_fi3020[] = +{ + /* 802.11g */ + {1, 241, 2, 2}, + {2, 241, 2, 7}, + {3, 242, 2, 2}, + {4, 242, 2, 7}, + {5, 243, 2, 2}, + {6, 243, 2, 7}, + {7, 244, 2, 2}, + {8, 244, 2, 7}, + {9, 245, 2, 2}, + {10, 245, 2, 7}, + {11, 246, 2, 2}, + {12, 246, 2, 7}, + {13, 247, 2, 2}, + {14, 248, 2, 4}, + + /* 802.11 UNI / HyperLan 2 */ + {36, 0x56, 0, 4}, + {38, 0x56, 0, 6}, + {40, 0x56, 0, 8}, + {44, 0x57, 0, 0}, + {46, 0x57, 0, 2}, + {48, 0x57, 0, 4}, + {52, 0x57, 0, 8}, + {54, 0x57, 0, 10}, + {56, 0x58, 0, 0}, + {60, 0x58, 0, 4}, + {62, 0x58, 0, 6}, + {64, 0x58, 0, 8}, + + /* 802.11 HyperLan 2 */ + {100, 0x5b, 0, 8}, + {102, 0x5b, 0, 10}, + {104, 0x5c, 0, 0}, + {108, 0x5c, 0, 4}, + {110, 0x5c, 0, 6}, + {112, 0x5c, 0, 8}, + {116, 0x5d, 0, 0}, + {118, 0x5d, 0, 2}, + {120, 0x5d, 0, 4}, + {124, 0x5d, 0, 8}, + {126, 0x5d, 0, 10}, + {128, 0x5e, 0, 0}, + {132, 0x5e, 0, 4}, + {134, 0x5e, 0, 6}, + {136, 0x5e, 0, 8}, + {140, 0x5f, 0, 0}, + + /* 802.11 UNII */ + {149, 0x5f, 0, 9}, + {151, 0x5f, 0, 11}, + {153, 0x60, 0, 1}, + {157, 0x60, 0, 5}, + {159, 0x60, 0, 7}, + {161, 0x60, 0, 9}, + {165, 0x61, 0, 1}, + {167, 0x61, 0, 3}, + {169, 0x61, 0, 5}, + {171, 0x61, 0, 7}, + {173, 0x61, 0, 9}, +}; + +static const struct { + uint8_t reg; + uint8_t val; +} rt3090_def_rf[] = { + { 4, 0x40 }, + { 5, 0x03 }, + { 6, 0x02 }, + { 7, 0x70 }, + { 9, 0x0f }, + { 10, 0x41 }, + { 11, 0x21 }, + { 12, 0x7b }, + { 14, 0x90 }, + { 15, 0x58 }, + { 16, 0xb3 }, + { 17, 0x92 }, + { 18, 0x2c }, + { 19, 0x02 }, + { 20, 0xba }, + { 21, 0xdb }, + { 24, 0x16 }, + { 25, 0x01 }, + { 29, 0x1f } +}; + +struct { + uint8_t n, r, k; +} rt3090_freqs[] = { + { 0xf1, 2, 2 }, + { 0xf1, 2, 7 }, + { 0xf2, 2, 2 }, + { 0xf2, 2, 7 }, + { 0xf3, 2, 2 }, + { 0xf3, 2, 7 }, + { 0xf4, 2, 2 }, + { 0xf4, 2, 7 }, + { 0xf5, 2, 2 }, + { 0xf5, 2, 7 }, + { 0xf6, 2, 2 }, + { 0xf6, 2, 7 }, + { 0xf7, 2, 2 }, + { 0xf8, 2, 4 }, + { 0x56, 0, 4 }, + { 0x56, 0, 6 }, + { 0x56, 0, 8 }, + { 0x57, 0, 0 }, + { 0x57, 0, 2 }, + { 0x57, 0, 4 }, + { 0x57, 0, 8 }, + { 0x57, 0, 10 }, + { 0x58, 0, 0 }, + { 0x58, 0, 4 }, + { 0x58, 0, 6 }, + { 0x58, 0, 8 }, + { 0x5b, 0, 8 }, + { 0x5b, 0, 10 }, + { 0x5c, 0, 0 }, + { 0x5c, 0, 4 }, + { 0x5c, 0, 6 }, + { 0x5c, 0, 8 }, + { 0x5d, 0, 0 }, + { 0x5d, 0, 2 }, + { 0x5d, 0, 4 }, + { 0x5d, 0, 8 }, + { 0x5d, 0, 10 }, + { 0x5e, 0, 0 }, + { 0x5e, 0, 4 }, + { 0x5e, 0, 6 }, + { 0x5e, 0, 8 }, + { 0x5f, 0, 0 }, + { 0x5f, 0, 9 }, + { 0x5f, 0, 11 }, + { 0x60, 0, 1 }, + { 0x60, 0, 5 }, + { 0x60, 0, 7 }, + { 0x60, 0, 9 }, + { 0x61, 0, 1 }, + { 0x61, 0, 3 }, + { 0x61, 0, 5 }, + { 0x61, 0, 7 }, + { 0x61, 0, 9 } +}; + + + +uint8_t +rt3090_rf_read(struct rt2860_softc *sc, uint8_t reg) +{ + uint32_t tmp; + int ntries; + + for (ntries = 0; ntries < 100; ntries++) { + if (!(rt2860_io_mac_read(sc, RT3070_RF_CSR_CFG) & RT3070_RF_KICK)) + break; + DELAY(1); + } + if (ntries == 100) { + device_printf(sc->dev, "could not read RF register\n"); + return 0xff; + } + tmp = RT3070_RF_KICK | reg << 8; + rt2860_io_mac_write(sc, RT3070_RF_CSR_CFG, tmp); + + for (ntries = 0; ntries < 100; ntries++) { + tmp = rt2860_io_mac_read(sc, RT3070_RF_CSR_CFG); + if (!(tmp & RT3070_RF_KICK)) + break; + DELAY(1); + } + if (ntries == 100) { + device_printf(sc->dev, "could not read RF register\n"); + return 0xff; + } + return tmp & 0xff; +} + +void +rt3090_rf_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val) +{ + uint32_t tmp; + int ntries; + + for (ntries = 0; ntries < 10; ntries++) { + if (!(rt2860_io_mac_read(sc, RT3070_RF_CSR_CFG) & RT3070_RF_KICK)) + break; + DELAY(10); + } + if (ntries == 10) { + device_printf(sc->dev, "could not write to RF\n"); + return; + } + + tmp = RT3070_RF_WRITE | RT3070_RF_KICK | reg << 8 | val; + rt2860_io_mac_write(sc, RT3070_RF_CSR_CFG, tmp); +} + +/* + * rt2860_rf_name + */ +const char *rt2860_rf_name(int rf_rev) +{ + switch (rf_rev) + { + case RT2860_EEPROM_RF_2820: + return "RT2820 2.4G 2T3R"; + + case RT2860_EEPROM_RF_2850: + return "RT2850 2.4G/5G 2T3R"; + + case RT2860_EEPROM_RF_2720: + return "RT2720 2.4G 1T2R"; + + case RT2860_EEPROM_RF_2750: + return "RT2750 2.4G/5G 1T2R"; + + case RT2860_EEPROM_RF_3020: + return "RT3020 2.4G 1T1R"; + + case RT2860_EEPROM_RF_2020: + return "RT2020 2.4G B/G"; + + case RT2860_EEPROM_RF_3021: + return "RT3021 2.4G 1T2R"; + + case RT2860_EEPROM_RF_3022: + return "RT3022 2.4G 2T2R"; + + case RT2860_EEPROM_RF_3052: + return "RT3052 2.4G/5G 2T2R"; + + case RT2860_EEPROM_RF_2853: + return "RT2853 2.4G.5G 3T3R"; + + case RT2860_EEPROM_RF_3320: + return "RT3320 2.4G 1T1R with PA"; + + case RT2860_EEPROM_RF_3322: + return "RT3322 2.4G 2T2R with PA"; + + case RT2860_EEPROM_RF_3053: + return "RT3053 2.4G/5G 3T3R"; + + default: + return "unknown"; + } +} + +/* + * rt2860_rf_select_chan_group + */ +void rt2860_rf_select_chan_group(struct rt2860_softc *sc, + struct ieee80211_channel *c) +{ + struct ifnet *ifp; + struct ieee80211com *ic; + int chan, group; + uint32_t tmp; + + ifp = sc->ifp; + ic = ifp->if_l2com; + + chan = ieee80211_chan2ieee(ic, c); + if (chan == 0 || chan == IEEE80211_CHAN_ANY) + return; + + if (chan <= 14) + group = 0; + else if (chan <= 64) + group = 1; + else if (chan <= 128) + group = 2; + else + group = 3; + + rt2860_io_bbp_write(sc, 62, 0x37 - sc->lna_gain[group]); + rt2860_io_bbp_write(sc, 63, 0x37 - sc->lna_gain[group]); + rt2860_io_bbp_write(sc, 64, 0x37 - sc->lna_gain[group]); + rt2860_io_bbp_write(sc, 86, 0x00); + + if (group == 0) + { + if (sc->ext_lna_2ghz) + { + rt2860_io_bbp_write(sc, 82, 0x62); + rt2860_io_bbp_write(sc, 75, 0x46); + } + else + { + rt2860_io_bbp_write(sc, 82, 0x84); + rt2860_io_bbp_write(sc, 75, 0x50); + } + } + else + { + rt2860_io_bbp_write(sc, 82, 0xf2); + + if (sc->ext_lna_5ghz) + rt2860_io_bbp_write(sc, 75, 0x46); + else + rt2860_io_bbp_write(sc, 75, 0x50); + } + + if (group == 0) + { + tmp = 0x2e + sc->lna_gain[group]; + } + else + { + if ((ic->ic_flags & IEEE80211_F_SCAN) || !IEEE80211_IS_CHAN_HT40(c)) + tmp = 0x32 + sc->lna_gain[group] * 5 / 3; + else + tmp = 0x3a + sc->lna_gain[group] * 5 / 3; + } + + rt2860_io_bbp_write(sc, 66, tmp); + + tmp = RT2860_REG_RFTR_ENABLE | + RT2860_REG_TRSW_ENABLE | + RT2860_REG_LNA_PE_G1_ENABLE | + RT2860_REG_LNA_PE_A1_ENABLE | + RT2860_REG_LNA_PE_G0_ENABLE | + RT2860_REG_LNA_PE_A0_ENABLE; + + if (group == 0) + tmp |= RT2860_REG_PA_PE_G1_ENABLE | + RT2860_REG_PA_PE_G0_ENABLE; + else + tmp |= RT2860_REG_PA_PE_A1_ENABLE | + RT2860_REG_PA_PE_A0_ENABLE; + + if (sc->ntxpath == 1) + tmp &= ~(RT2860_REG_PA_PE_G1_ENABLE | RT2860_REG_PA_PE_A1_ENABLE); + + if (sc->nrxpath == 1) + tmp &= ~(RT2860_REG_LNA_PE_G1_ENABLE | RT2860_REG_LNA_PE_A1_ENABLE); + + rt2860_io_mac_write(sc, RT2860_REG_TX_PIN_CFG, tmp); + + tmp = rt2860_io_mac_read(sc, RT2860_REG_TX_BAND_CFG); + + tmp &= ~(RT2860_REG_TX_BAND_BG | RT2860_REG_TX_BAND_A | RT2860_REG_TX_BAND_HT40_ABOVE); + + if (group == 0) + tmp |= RT2860_REG_TX_BAND_BG; + else + tmp |= RT2860_REG_TX_BAND_A; + + /* set central channel position */ + + if (IEEE80211_IS_CHAN_HT40U(c)) + tmp |= RT2860_REG_TX_BAND_HT40_BELOW; + else if (IEEE80211_IS_CHAN_HT40D(c)) + tmp |= RT2860_REG_TX_BAND_HT40_ABOVE; + else + tmp |= RT2860_REG_TX_BAND_HT40_BELOW; + + rt2860_io_mac_write(sc, RT2860_REG_TX_BAND_CFG, tmp); + + /* set bandwidth (20MHz or 40MHz) */ + + tmp = rt2860_io_bbp_read(sc, 4); + + tmp &= ~0x18; + + if (IEEE80211_IS_CHAN_HT40(c)) + tmp |= 0x10; + + rt2860_io_bbp_write(sc, 4, tmp); + + /* set central channel position */ + + tmp = rt2860_io_bbp_read(sc, 3); + + tmp &= ~0x20; + + if (IEEE80211_IS_CHAN_HT40D(c)) + tmp |= 0x20; + + rt2860_io_bbp_write(sc, 3, tmp); + + if (sc->mac_rev == 0x28600100) + { + if (!IEEE80211_IS_CHAN_HT40(c)) + { + rt2860_io_bbp_write(sc, 69, 0x16); + rt2860_io_bbp_write(sc, 70, 0x08); + rt2860_io_bbp_write(sc, 73, 0x12); + } + else + { + rt2860_io_bbp_write(sc, 69, 0x1a); + rt2860_io_bbp_write(sc, 70, 0x0a); + rt2860_io_bbp_write(sc, 73, 0x16); + } + } + +} + +void +rt3090_set_chan(struct rt2860_softc *sc, u_int chan) +{ + int8_t txpow1, txpow2; + uint8_t rf; + int i; + + KASSERT((chan >= 1 && chan <= 14), "RT3090 is 2GHz only"); /* RT3090 is 2GHz only */ + + /* find the settings for this channel (we know it exists) */ + for (i = 0; rt2860_rf2850[i].chan != chan; i++); + + /* use Tx power values from EEPROM */ + txpow1 = sc->txpow1[i]; + txpow2 = sc->txpow2[i]; + + rt3090_rf_write(sc, 2, rt3090_freqs[i].n); + rf = rt3090_rf_read(sc, 3); + rf = (rf & ~0x0f) | rt3090_freqs[i].k; + rt3090_rf_write(sc, 3, rf); + rf = rt3090_rf_read(sc, 6); + rf = (rf & ~0x03) | rt3090_freqs[i].r; + rt3090_rf_write(sc, 6, rf); + + /* set Tx0 power */ + rf = rt3090_rf_read(sc, 12); + rf = (rf & ~0x1f) | txpow1; + rt3090_rf_write(sc, 12, rf); + + /* set Tx1 power */ + rf = rt3090_rf_read(sc, 13); + rf = (rf & ~0x1f) | txpow2; + rt3090_rf_write(sc, 13, rf); + + rf = rt3090_rf_read(sc, 1); + rf &= ~0xfc; + if (sc->ntxpath == 1) + rf |= RT3070_TX1_PD | RT3070_TX2_PD; + else if (sc->ntxpath == 2) + rf |= RT3070_TX2_PD; + if (sc->nrxpath == 1) + rf |= RT3070_RX1_PD | RT3070_RX2_PD; + else if (sc->nrxpath == 2) + rf |= RT3070_RX2_PD; + rt3090_rf_write(sc, 1, rf); + + /* set RF offset */ + rf = rt3090_rf_read(sc, 23); + rf = (rf & ~0x7f) | sc->rf_freq_off; + rt3090_rf_write(sc, 23, rf); + + /* program RF filter */ + rf = rt3090_rf_read(sc, 24); /* Tx */ + rf = (rf & ~0x3f) | sc->rf24_20mhz; + rt3090_rf_write(sc, 24, rf); + rf = rt3090_rf_read(sc, 31); /* Rx */ + rf = (rf & ~0x3f) | sc->rf24_20mhz; + rt3090_rf_write(sc, 31, rf); + + /* enable RF tuning */ + rf = rt3090_rf_read(sc, 7); + rt3090_rf_write(sc, 7, rf | RT3070_TUNE); +} + +int +rt3090_rf_init(struct rt2860_softc *sc) +{ + uint32_t tmp; + uint8_t rf, bbp; + int i; + + rf = rt3090_rf_read(sc, 30); + /* toggle RF R30 bit 7 */ + rt3090_rf_write(sc, 30, rf | 0x80); + DELAY(1000); + rt3090_rf_write(sc, 30, rf & ~0x80); + + tmp = rt2860_io_mac_read(sc, RT3070_LDO_CFG0); + tmp &= ~0x1f000000; + if (sc->patch_dac && (sc->mac_rev & 0x0000ffff) < 0x0211) + tmp |= 0x0d000000; /* 1.35V */ + else + tmp |= 0x01000000; /* 1.2V */ + rt2860_io_mac_write(sc, RT3070_LDO_CFG0, tmp); + + /* patch LNA_PE_G1 */ + tmp = rt2860_io_mac_read(sc, RT3070_GPIO_SWITCH); + rt2860_io_mac_write(sc, RT3070_GPIO_SWITCH, tmp & ~0x20); + + /* initialize RF registers to default value */ + for (i = 0; i < (sizeof(rt3090_def_rf)/2); i++) { + rt3090_rf_write(sc, rt3090_def_rf[i].reg, + rt3090_def_rf[i].val); + } + + /* select 20MHz bandwidth */ + rt3090_rf_write(sc, 31, 0x14); + + rf = rt3090_rf_read(sc, 6); + rt3090_rf_write(sc, 6, rf | 0x40); + + if ((sc->mac_rev & 0xffff0000) != 0x35930000) { + /* calibrate filter for 20MHz bandwidth */ + sc->rf24_20mhz = 0x1f; /* default value */ + rt3090_filter_calib(sc, 0x07, 0x16, &sc->rf24_20mhz); + + /* select 40MHz bandwidth */ + bbp = rt2860_io_bbp_read(sc, 4); + rt2860_io_bbp_write(sc, 4, (bbp & ~0x08) | 0x10); + rf = rt3090_rf_read(sc, 31); + rt3090_rf_write(sc, 31, rf | 0x20); + + /* calibrate filter for 40MHz bandwidth */ + sc->rf24_40mhz = 0x2f; /* default value */ + rt3090_filter_calib(sc, 0x27, 0x19, &sc->rf24_40mhz); + + /* go back to 20MHz bandwidth */ + bbp = rt2860_io_bbp_read(sc, 4); + rt2860_io_bbp_write(sc, 4, bbp & ~0x18); + } + if ((sc->mac_rev & 0x0000ffff) < 0x0211) + rt3090_rf_write(sc, 27, 0x03); + + tmp = rt2860_io_mac_read(sc, RT3070_OPT_14); + rt2860_io_mac_write(sc, RT3070_OPT_14, tmp | 1); + + if (sc->rf_rev == RT2860_EEPROM_RF_3020) + rt3090_set_rx_antenna(sc, 0); + + bbp = rt2860_io_bbp_read(sc, 138); + if ((sc->mac_rev & 0xffff0000) == 0x35930000) { + if (sc->ntxpath == 1) + bbp |= 0x60; /* turn off DAC1 and DAC2 */ + else if (sc->ntxpath == 2) + bbp |= 0x40; /* turn off DAC2 */ + if (sc->nrxpath == 1) + bbp &= ~0x06; /* turn off ADC1 and ADC2 */ + else if (sc->nrxpath == 2) + bbp &= ~0x04; /* turn off ADC2 */ + } else { + if (sc->ntxpath == 1) + bbp |= 0x20; /* turn off DAC1 */ + if (sc->nrxpath == 1) + bbp &= ~0x02; /* turn off ADC1 */ + } + rt2860_io_bbp_write(sc, 138, bbp); + + rf = rt3090_rf_read(sc, 1); + rf &= ~(RT3070_RX0_PD | RT3070_TX0_PD); + rf |= RT3070_RF_BLOCK | RT3070_RX1_PD | RT3070_TX1_PD; + rt3090_rf_write(sc, 1, rf); + + rf = rt3090_rf_read(sc, 15); + rt3090_rf_write(sc, 15, rf & ~RT3070_TX_LO2); + + rf = rt3090_rf_read(sc, 17); + rf &= ~RT3070_TX_LO1; + if ((sc->mac_rev & 0x0000ffff) >= 0x0211 && !sc->ext_lna_2ghz) + rf |= 0x20; /* fix for long range Rx issue */ + if (sc->txmixgain_2ghz >= 2) + rf = (rf & ~0x7) | sc->txmixgain_2ghz; + rt3090_rf_write(sc, 17, rf); + + rf = rt3090_rf_read(sc, 20); + rt3090_rf_write(sc, 20, rf & ~RT3070_RX_LO1); + + rf = rt3090_rf_read(sc, 21); + rt3090_rf_write(sc, 21, rf & ~RT3070_RX_LO2); + + return 0; +} + +void +rt3090_set_rx_antenna(struct rt2860_softc *sc, int aux) +{ + uint32_t tmp; + + if (aux) { + tmp = rt2860_io_mac_read(sc, RT2860_REG_EEPROM_CSR); + rt2860_io_mac_write(sc, RT2860_REG_EEPROM_CSR, tmp & ~RT2860_REG_EESK); + tmp = rt2860_io_mac_read(sc, RT2860_REG_SCHDMA_GPIO_CTRL_CFG); + rt2860_io_mac_write(sc, RT2860_REG_SCHDMA_GPIO_CTRL_CFG, (tmp & ~0x0808) | 0x08); + } else { + tmp = rt2860_io_mac_read(sc, RT2860_REG_EEPROM_CSR); + rt2860_io_mac_write(sc, RT2860_REG_EEPROM_CSR, tmp | RT2860_REG_EESK); + tmp = rt2860_io_mac_read(sc, RT2860_REG_SCHDMA_GPIO_CTRL_CFG); + rt2860_io_mac_write(sc, RT2860_REG_SCHDMA_GPIO_CTRL_CFG, tmp & ~0x0808); + } +} + +void +rt3090_rf_wakeup(struct rt2860_softc *sc) +{ + uint32_t tmp; + uint8_t rf; + + if ((sc->mac_rev & 0xffff0000) == 0x35930000) { + /* enable VCO */ + rf = rt3090_rf_read(sc, 1); + rt3090_rf_write(sc, 1, rf | RT3593_VCO); + + /* initiate VCO calibration */ + rf = rt3090_rf_read(sc, 3); + rt3090_rf_write(sc, 3, rf | RT3593_VCOCAL); + + /* enable VCO bias current control */ + rf = rt3090_rf_read(sc, 6); + rt3090_rf_write(sc, 6, rf | RT3593_VCO_IC); + + /* initiate res calibration */ + rf = rt3090_rf_read(sc, 2); + rt3090_rf_write(sc, 2, rf | RT3593_RESCAL); + + /* set reference current control to 0.33 mA */ + rf = rt3090_rf_read(sc, 22); + rf &= ~RT3593_CP_IC_MASK; + rf |= 1 << RT3593_CP_IC_SHIFT; + rt3090_rf_write(sc, 22, rf); + + /* enable RX CTB */ + rf = rt3090_rf_read(sc, 46); + rt3090_rf_write(sc, 46, rf | RT3593_RX_CTB); + + rf = rt3090_rf_read(sc, 20); + rf &= ~(RT3593_LDO_RF_VC_MASK | RT3593_LDO_PLL_VC_MASK); + rt3090_rf_write(sc, 20, rf); + } else { + /* enable RF block */ + rf = rt3090_rf_read(sc, 1); + rt3090_rf_write(sc, 1, rf | RT3070_RF_BLOCK); + + /* enable VCO bias current control */ + rf = rt3090_rf_read(sc, 7); + rt3090_rf_write(sc, 7, rf | 0x30); + + rf = rt3090_rf_read(sc, 9); + rt3090_rf_write(sc, 9, rf | 0x0e); + + /* enable RX CTB */ + rf = rt3090_rf_read(sc, 21); + rt3090_rf_write(sc, 21, rf | RT3070_RX_CTB); + + /* fix Tx to Rx IQ glitch by raising RF voltage */ + rf = rt3090_rf_read(sc, 27); + rf &= ~0x77; + if ((sc->mac_rev & 0x0000ffff) < 0x0211) + rf |= 0x03; + rt3090_rf_write(sc, 27, rf); + } + if (sc->patch_dac && (sc->mac_rev & 0x0000ffff) < 0x0211) { + tmp = rt2860_io_mac_read(sc, RT3070_LDO_CFG0); + tmp = (tmp & ~0x1f000000) | 0x0d000000; + rt2860_io_mac_write(sc, RT3070_LDO_CFG0, tmp); + } +} + +int +rt3090_filter_calib(struct rt2860_softc *sc, uint8_t init, uint8_t target, + uint8_t *val) +{ + uint8_t rf22, rf24; + uint8_t bbp55_pb, bbp55_sb, delta; + int ntries; + + /* program filter */ + rf24 = rt3090_rf_read(sc, 24); + rf24 = (rf24 & 0xc0) | init; /* initial filter value */ + rt3090_rf_write(sc, 24, rf24); + + /* enable baseband loopback mode */ + rf22 = rt3090_rf_read(sc, 22); + rt3090_rf_write(sc, 22, rf22 | RT3070_BB_LOOPBACK); + + /* set power and frequency of passband test tone */ + rt2860_io_bbp_write(sc, 24, 0x00); + for (ntries = 0; ntries < 100; ntries++) { + /* transmit test tone */ + rt2860_io_bbp_write(sc, 25, 0x90); + DELAY(1000); + /* read received power */ + bbp55_pb = rt2860_io_bbp_read(sc, 55); + if (bbp55_pb != 0) + break; + } + if (ntries == 100) + return ETIMEDOUT; + + /* set power and frequency of stopband test tone */ + rt2860_io_bbp_write(sc, 24, 0x06); + for (ntries = 0; ntries < 100; ntries++) { + /* transmit test tone */ + rt2860_io_bbp_write(sc, 25, 0x90); + DELAY(1000); + /* read received power */ + bbp55_sb = rt2860_io_bbp_read(sc, 55); + + delta = bbp55_pb - bbp55_sb; + if (delta > target) + break; + + /* reprogram filter */ + rf24++; + rt3090_rf_write(sc, 24, rf24); + } + if (ntries < 100) { + if (rf24 != init) + rf24--; /* backtrack */ + *val = rf24; + rt3090_rf_write(sc, 24, rf24); + } + + /* restore initial state */ + rt2860_io_bbp_write(sc, 24, 0x00); + + /* disable baseband loopback mode */ + rf22 = rt3090_rf_read(sc, 22); + rt3090_rf_write(sc, 22, rf22 & ~RT3070_BB_LOOPBACK); + + return 0; +} + +void +rt3090_rf_setup(struct rt2860_softc *sc) +{ + uint8_t bbp; + int i; + + if ((sc->mac_rev & 0x0000ffff) >= 0x0211) { + /* enable DC filter */ + rt2860_io_bbp_write(sc, 103, 0xc0); + + /* improve power consumption */ + bbp = rt2860_io_bbp_read(sc, 31); + rt2860_io_bbp_write(sc, 31, bbp & ~0x03); + } + + rt2860_io_mac_write(sc, RT2860_REG_TX_SW_CFG1, 0); + if ((sc->mac_rev & 0x0000ffff) < 0x0211) { + rt2860_io_mac_write(sc, RT2860_REG_TX_SW_CFG2, + sc->patch_dac ? 0x2c : 0x0f); + } else + rt2860_io_mac_write(sc, RT2860_REG_TX_SW_CFG2, 0); + + /* initialize RF registers from ROM */ + for (i = 0; i < 10; i++) { + if (sc->rf[i].reg == 0 || sc->rf[i].reg == 0xff) + continue; + rt3090_rf_write(sc, sc->rf[i].reg, sc->rf[i].val); + } +} + + +/* + * rt2860_rf_set_chan + */ +void rt2860_rf_set_chan(struct rt2860_softc *sc, + struct ieee80211_channel *c) +{ + struct ifnet *ifp; + struct ieee80211com *ic; + const struct rt2860_rf_prog *prog; + uint32_t r1, r2, r3, r4; + int8_t txpow1, txpow2; + int i, chan; + + if (sc->mac_rev == 0x28720200) { + rt2872_rf_set_chan(sc, c); + return; + } + + ifp = sc->ifp; + ic = ifp->if_l2com; + prog = rt2860_rf_2850; + + /* get central channel position */ + + chan = ieee80211_chan2ieee(ic, c); + + if ((sc->mac_rev & 0xffff0000) >= 0x30710000) { + rt3090_set_chan(sc, chan); + return; + } + + if (IEEE80211_IS_CHAN_HT40U(c)) + chan += 2; + else if (IEEE80211_IS_CHAN_HT40D(c)) + chan -= 2; + + RT2860_DPRINTF(sc, RT2860_DEBUG_CHAN, + "%s: RF set channel: channel=%u, HT%s%s\n", + device_get_nameunit(sc->dev), + ieee80211_chan2ieee(ic, c), + !IEEE80211_IS_CHAN_HT(c) ? " disabled" : + IEEE80211_IS_CHAN_HT20(c) ? "20": + IEEE80211_IS_CHAN_HT40U(c) ? "40U" : "40D", + (ic->ic_flags & IEEE80211_F_SCAN) ? ", scanning" : ""); + + if (chan == 0 || chan == IEEE80211_CHAN_ANY) + return; + + for (i = 0; prog[i].chan != chan; i++); + + r1 = prog[i].r1; + r2 = prog[i].r2; + r3 = prog[i].r3; + r4 = prog[i].r4; + + txpow1 = sc->txpow1[i]; + txpow2 = sc->txpow2[i]; + + if (sc->ntxpath == 1) + r2 |= (1 << 14); + + if (sc->nrxpath == 2) + r2 |= (1 << 6); + else if (sc->nrxpath == 1) + r2 |= (1 << 17) | (1 << 6); + + if (IEEE80211_IS_CHAN_2GHZ(c)) + { + r3 = (r3 & 0xffffc1ff) | (txpow1 << 9); + r4 = (r4 & ~0x001f87c0) | (sc->rf_freq_off << 15) | + (txpow2 << 6); + } + else + { + r3 = r3 & 0xffffc1ff; + r4 = (r4 & ~0x001f87c0) | (sc->rf_freq_off << 15); + + if (txpow1 >= RT2860_EEPROM_TXPOW_5GHZ_MIN && txpow1 < 0) + { + txpow1 = (-RT2860_EEPROM_TXPOW_5GHZ_MIN + txpow1); + if (txpow1 > RT2860_EEPROM_TXPOW_5GHZ_MAX) + txpow1 = RT2860_EEPROM_TXPOW_5GHZ_MAX; + + r3 |= (txpow1 << 10); + } + else + { + if (txpow1 > RT2860_EEPROM_TXPOW_5GHZ_MAX) + txpow1 = RT2860_EEPROM_TXPOW_5GHZ_MAX; + + r3 |= (txpow1 << 10) | (1 << 9); + } + + if (txpow2 >= RT2860_EEPROM_TXPOW_5GHZ_MIN && txpow2 < 0) + { + txpow2 = (-RT2860_EEPROM_TXPOW_5GHZ_MIN + txpow2); + if (txpow2 > RT2860_EEPROM_TXPOW_5GHZ_MAX) + txpow2 = RT2860_EEPROM_TXPOW_5GHZ_MAX; + + r4 |= (txpow2 << 7); + } + else + { + if (txpow2 > RT2860_EEPROM_TXPOW_5GHZ_MAX) + txpow2 = RT2860_EEPROM_TXPOW_5GHZ_MAX; + + r4 |= (txpow2 << 7) | (1 << 6); + } + } + + if (!(ic->ic_flags & IEEE80211_F_SCAN) && IEEE80211_IS_CHAN_HT40(c)) + r4 |= (1 << 21); + + rt2860_io_rf_write(sc, RT2860_REG_RF_R1, r1); + rt2860_io_rf_write(sc, RT2860_REG_RF_R2, r2); + rt2860_io_rf_write(sc, RT2860_REG_RF_R3, r3 & ~(1 << 2)); + rt2860_io_rf_write(sc, RT2860_REG_RF_R4, r4); + + DELAY(200); + + rt2860_io_rf_write(sc, RT2860_REG_RF_R1, r1); + rt2860_io_rf_write(sc, RT2860_REG_RF_R2, r2); + rt2860_io_rf_write(sc, RT2860_REG_RF_R3, r3 | (1 << 2)); + rt2860_io_rf_write(sc, RT2860_REG_RF_R4, r4); + + DELAY(200); + + rt2860_io_rf_write(sc, RT2860_REG_RF_R1, r1); + rt2860_io_rf_write(sc, RT2860_REG_RF_R2, r2); + rt2860_io_rf_write(sc, RT2860_REG_RF_R3, r3 & ~(1 << 2)); + rt2860_io_rf_write(sc, RT2860_REG_RF_R4, r4); + + rt2860_rf_select_chan_group(sc, c); + + DELAY(1000); +} + +/* + * rt2872_rf_set_chan + */ +static void +rt2872_rf_set_chan(struct rt2860_softc *sc, + struct ieee80211_channel *c) +{ + struct ifnet *ifp; + struct ieee80211com *ic; + const struct rt2860_rf_prog *prog; + uint32_t r1, r2, r3, r4; + uint32_t r6, r7, r12, r13, r23, r24; + int8_t txpow1, txpow2; + int i, chan; + + ifp = sc->ifp; + ic = ifp->if_l2com; + prog = rt2860_rf_2850; + + /* get central channel position */ + + chan = ieee80211_chan2ieee(ic, c); + + if (IEEE80211_IS_CHAN_HT40U(c)) + chan += 2; + else if (IEEE80211_IS_CHAN_HT40D(c)) + chan -= 2; + + RT2860_DPRINTF(sc, RT2860_DEBUG_CHAN, + "%s: RF set channel: channel=%u, HT%s%s\n", + device_get_nameunit(sc->dev), + ieee80211_chan2ieee(ic, c), + !IEEE80211_IS_CHAN_HT(c) ? " disabled" : + IEEE80211_IS_CHAN_HT20(c) ? "20": + IEEE80211_IS_CHAN_HT40U(c) ? "40U" : "40D", + (ic->ic_flags & IEEE80211_F_SCAN) ? ", scanning" : ""); + + if (chan == 0 || chan == IEEE80211_CHAN_ANY) + return; + + for (i = 0; prog[i].chan != chan; i++); + + r1 = prog[i].r1; + r2 = prog[i].r2; + r3 = prog[i].r3; + r4 = prog[i].r4; + + txpow1 = sc->txpow1[i]; + txpow2 = sc->txpow2[i]; + + for (i = 0; rt2860_rf_fi3020[i].channel != chan; i++); + + /* Programm channel parameters */ + r2 = rt2860_rf_fi3020[i].n; + rt2860_io_rf_write(sc, 2 , r2 ); + r3 = rt2860_rf_fi3020[i].k; + rt2860_io_rf_write(sc, 3 , r3 ); + + r6 = (rt3052_rf_default[6] & 0xFC) | (rt2860_rf_fi3020[i].r & 0x03); + rt2860_io_rf_write(sc, 6 , r6 ); + + /* Set Tx Power */ + r12 = (rt3052_rf_default[12] & 0xE0) | (txpow1 & 0x1f); + rt2860_io_rf_write(sc, 12, r12); + + /* Set Tx1 Power */ + r13 = (rt3052_rf_default[13] & 0xE0) | (txpow2 & 0x1f); + rt2860_io_rf_write(sc, 13, r13); + + /* Set RF offset */ + r23 = (rt3052_rf_default[23] & 0x80) | (sc->rf_freq_off); + rt2860_io_rf_write(sc, 23, r23); + + /* Set BW */ + r24 = (rt3052_rf_default[24] & 0xDF); + if (!(ic->ic_flags & IEEE80211_F_SCAN) && IEEE80211_IS_CHAN_HT40(c)) + r24 |= 0x20; + rt2860_io_rf_write(sc, 24, r24); + + /* Enable RF tuning */ + r7 = (rt3052_rf_default[7]) | 1; + rt2860_io_rf_write(sc, 7 , r7 ); + + /* Antenna */ + r1 = (rt3052_rf_default[1] & 0xab) | ((sc->nrxpath == 1)?0x10:0) | + ((sc->ntxpath == 1)?0x20:0); + rt2860_io_rf_write(sc, 1 , r1 ); + + DELAY(200); + + rt2860_rf_select_chan_group(sc, c); + + DELAY(1000); +} + diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_rf.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_rf.h similarity index 68% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_rf.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_rf.h index 1af1f2fd11..2812cafcbd 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_rf.h +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_rf.h @@ -19,7 +19,7 @@ #ifndef _RT2860_RF_H_ #define _RT2860_RF_H_ -#include "rt2860_softc.h" +#include const char *rt2860_rf_name(int rf_rev); @@ -29,4 +29,21 @@ void rt2860_rf_select_chan_group(struct rt2860_softc *sc, void rt2860_rf_set_chan(struct rt2860_softc *sc, struct ieee80211_channel *c); +uint8_t rt3090_rf_read(struct rt2860_softc *sc, uint8_t reg); + +void rt3090_rf_write(struct rt2860_softc *sc, uint8_t reg, uint8_t val); + +void rt3090_set_chan(struct rt2860_softc *sc, u_int chan); + +int rt3090_rf_init(struct rt2860_softc *sc); + +void rt3090_set_rx_antenna(struct rt2860_softc *, int); + +void rt3090_rf_wakeup(struct rt2860_softc *sc); + +int rt3090_filter_calib(struct rt2860_softc *sc, uint8_t init, uint8_t target, + uint8_t *val); + +void rt3090_rf_setup(struct rt2860_softc *sc); + #endif /* #ifndef _RT2860_RF_H_ */ diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_rxdesc.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_rxdesc.h similarity index 100% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_rxdesc.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_rxdesc.h diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_rxwi.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_rxwi.h similarity index 100% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_rxwi.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_rxwi.h diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_softc.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_softc.h similarity index 81% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_softc.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_softc.h index 867083b9e7..c56fbe00c3 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_softc.h +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_softc.h @@ -49,64 +49,67 @@ #include #include -#include -#include +//#include "opt_rt2860.h" -#include "rt2860_rxdesc.h" -#include "rt2860_txdesc.h" -#include "rt2860_txwi.h" -#include "rt2860_amrr.h" +#include +#include +#include +#include -#define RT2860_SOFTC_LOCK(sc) mtx_lock(&(sc)->lock) -#define RT2860_SOFTC_UNLOCK(sc) mtx_unlock(&(sc)->lock) -#define RT2860_SOFTC_ASSERT_LOCKED(sc) mtx_assert(&(sc)->lock, MA_OWNED) +#define RT2860_SOFTC_LOCK(sc) mtx_lock(&(sc)->lock) +#define RT2860_SOFTC_UNLOCK(sc) \ + mtx_unlock(&(sc)->lock) +#define RT2860_SOFTC_ASSERT_LOCKED(sc) \ + mtx_assert(&(sc)->lock, MA_OWNED) -#define RT2860_SOFTC_TX_RING_LOCK(ring) mtx_lock(&(ring)->lock) -#define RT2860_SOFTC_TX_RING_UNLOCK(ring) mtx_unlock(&(ring)->lock) -#define RT2860_SOFTC_TX_RING_ASSERT_LOCKED(ring) mtx_assert(&(ring)->lock, MA_OWNED) +#define RT2860_SOFTC_TX_RING_LOCK(ring) mtx_lock(&(ring)->lock) +#define RT2860_SOFTC_TX_RING_UNLOCK(ring) \ + mtx_unlock(&(ring)->lock) +#define RT2860_SOFTC_TX_RING_ASSERT_LOCKED(ring) \ + mtx_assert(&(ring)->lock, MA_OWNED) -#define RT2860_SOFTC_FLAGS_UCODE_LOADED (1 << 0) +#define RT2860_SOFTC_FLAGS_UCODE_LOADED (1 << 0) -#define RT2860_SOFTC_LED_OFF_COUNT 3 +#define RT2860_SOFTC_LED_OFF_COUNT 3 -#define RT2860_SOFTC_RSSI_OFF_COUNT 3 +#define RT2860_SOFTC_RSSI_OFF_COUNT 3 -#define RT2860_SOFTC_LNA_GAIN_COUNT 4 +#define RT2860_SOFTC_LNA_GAIN_COUNT 4 -#define RT2860_SOFTC_TXPOW_COUNT 50 +#define RT2860_SOFTC_TXPOW_COUNT 50 -#define RT2860_SOFTC_TXPOW_RATE_COUNT 5 +#define RT2860_SOFTC_TXPOW_RATE_COUNT 5 -#define RT2860_SOFTC_TSSI_COUNT 9 +#define RT2860_SOFTC_TSSI_COUNT 9 -#define RT2860_SOFTC_BBP_EEPROM_COUNT 8 +#define RT2860_SOFTC_BBP_EEPROM_COUNT 8 -#define RT2860_SOFTC_RSSI_COUNT 3 +#define RT2860_SOFTC_RSSI_COUNT 3 -#define RT2860_SOFTC_STAID_COUNT 64 +#define RT2860_SOFTC_STAID_COUNT 64 -#define RT2860_SOFTC_TX_RING_COUNT 6 +#define RT2860_SOFTC_TX_RING_COUNT 6 -#define RT2860_SOFTC_RX_RING_DATA_COUNT 128 +#define RT2860_SOFTC_RX_RING_DATA_COUNT 128 -#define RT2860_SOFTC_MAX_SCATTER 10 +#define RT2860_SOFTC_MAX_SCATTER 10 -#define RT2860_SOFTC_TX_RING_DATA_COUNT 256 -#define RT2860_SOFTC_TX_RING_DESC_COUNT \ +#define RT2860_SOFTC_TX_RING_DATA_COUNT 256 +#define RT2860_SOFTC_TX_RING_DESC_COUNT \ (RT2860_SOFTC_TX_RING_DATA_COUNT * RT2860_SOFTC_MAX_SCATTER) -#define RT2860_SOFTC_RX_RADIOTAP_PRESENT \ - ((1 << IEEE80211_RADIOTAP_FLAGS) | \ - (1 << IEEE80211_RADIOTAP_RATE) | \ - (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ - (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ - (1 << IEEE80211_RADIOTAP_ANTENNA) | \ - (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \ +#define RT2860_SOFTC_RX_RADIOTAP_PRESENT \ + ((1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ + (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ + (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ + (1 << IEEE80211_RADIOTAP_ANTENNA) | \ + (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \ (1 << IEEE80211_RADIOTAP_XCHANNEL)) -#define RT2860_SOFTC_TX_RADIOTAP_PRESENT \ - ((1 << IEEE80211_RADIOTAP_FLAGS) | \ - (1 << IEEE80211_RADIOTAP_RATE) | \ +#define RT2860_SOFTC_TX_RADIOTAP_PRESENT \ + ((1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ (1 << IEEE80211_RADIOTAP_XCHANNEL)) struct rt2860_softc_rx_data @@ -309,7 +312,7 @@ struct rt2860_softc { uint8_t val; uint8_t reg; - } __packed bbp_eeprom[RT2860_SOFTC_BBP_EEPROM_COUNT]; + } __packed bbp_eeprom[RT2860_SOFTC_BBP_EEPROM_COUNT], rf[10]; uint16_t powersave_level; @@ -404,6 +407,12 @@ struct rt2860_softc int tx_stbc; + uint8_t rf24_20mhz; + uint8_t rf24_40mhz; + uint8_t patch_dac; + uint8_t txmixgain_2ghz; + uint8_t txmixgain_5ghz; + #ifdef RT2860_DEBUG int debug; #endif diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_txdesc.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_txdesc.h similarity index 100% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_txdesc.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_txdesc.h diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_txwi.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_txwi.h similarity index 100% rename from src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_txwi.h rename to src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_txwi.h diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_ucode.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_ucode.h new file mode 100644 index 0000000000..e44c4972a5 --- /dev/null +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/dev/rt2860/rt2860_ucode.h @@ -0,0 +1,2104 @@ + +/* + Copyright (c) 2007, Ralink Technology Corporation + All rights reserved. + + Redistribution. Redistribution and use in binary form, without + modification, are permitted provided that the following conditions are + met: + + * Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. + * Neither the name of Ralink Technology Corporation nor the names of its + suppliers may be used to endorse or promote products derived from this + software without specific prior written permission. + * No reverse engineering, decompilation, or disassembly of this software + is permitted. + + Limited patent license. Ralink Technology Corporation grants a world-wide, + royalty-free, non-exclusive license under patents it now or hereafter + owns or controls to make, have made, use, import, offer to sell and + sell ("Utilize") this software, but solely to the extent that any + such patent is necessary to Utilize the software alone, or in + combination with an operating system licensed under an approved Open + Source license as listed by the Open Source Initiative at + http://opensource.org/licenses. The patent license shall not apply to + any other combinations which include this software. No hardware per + se is licensed hereunder. + + DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. +*/ + +#ifndef _RT2860_UCODE_H_ +#define _RT2860_UCODE_H_ + +/* + * RT2860 microcode v26 + */ +static const uint8_t rt2860_ucode[] = +{ + 0x02, 0x03, 0x5E, 0x02, + 0x02, 0xB1, 0x22, 0x22, + 0xFF, 0xFF, 0xFF, 0x02, + 0x01, 0x82, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x02, + 0x00, 0x1E, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x02, + 0x01, 0x33, 0xC0, 0xE0, + 0xC0, 0xF0, 0xC0, 0x83, + 0xC0, 0x82, 0xC0, 0xD0, + 0x75, 0xD0, 0x18, 0xC2, + 0xAF, 0x30, 0x45, 0x03, + 0x12, 0x10, 0x09, 0x90, + 0x04, 0x16, 0xE0, 0x30, + 0xE3, 0x03, 0x74, 0x08, + 0xF0, 0x90, 0x04, 0x14, + 0xE0, 0x20, 0xE7, 0x03, + 0x02, 0x00, 0xCB, 0x74, + 0x80, 0xF0, 0x90, 0x70, + 0x12, 0xE0, 0xF5, 0x2F, + 0x90, 0x04, 0x04, 0xE0, + 0x24, 0xCF, 0x60, 0x30, + 0x14, 0x60, 0x42, 0x24, + 0xE2, 0x60, 0x47, 0x14, + 0x60, 0x55, 0x24, 0x21, + 0x70, 0x60, 0xE5, 0x55, + 0x24, 0xFE, 0x60, 0x07, + 0x14, 0x60, 0x08, 0x24, + 0x02, 0x70, 0x08, 0x7D, + 0x01, 0x80, 0x28, 0x7D, + 0x02, 0x80, 0x24, 0x90, + 0x70, 0x10, 0xE0, 0xF5, + 0x50, 0x85, 0x2F, 0x40, + 0xD2, 0x01, 0x80, 0x3E, + 0xE5, 0x55, 0x64, 0x03, + 0x60, 0x04, 0xE5, 0x55, + 0x70, 0x04, 0x7D, 0x02, + 0x80, 0x09, 0x85, 0x2F, + 0x41, 0xD2, 0x02, 0x80, + 0x29, 0xAD, 0x55, 0xAF, + 0x2F, 0x12, 0x02, 0x8D, + 0x80, 0x20, 0x90, 0x70, + 0x10, 0xE0, 0xF5, 0x47, + 0x90, 0x70, 0x11, 0xE0, + 0xF5, 0x44, 0x12, 0x10, + 0x25, 0x80, 0x06, 0x90, + 0x70, 0x10, 0xE0, 0xF5, + 0x45, 0xE4, 0xFD, 0xAF, + 0x2F, 0x12, 0x02, 0x8D, + 0xD2, 0x04, 0x90, 0x70, + 0x13, 0xE4, 0xF0, 0xD2, + 0xAF, 0xD0, 0xD0, 0xD0, + 0x82, 0xD0, 0x83, 0xD0, + 0xF0, 0xD0, 0xE0, 0x32, + 0x90, 0x70, 0x2A, 0xE0, + 0x30, 0xE1, 0x53, 0xC2, + 0xAF, 0x90, 0x70, 0x28, + 0xE0, 0x90, 0x10, 0x1C, + 0xF0, 0x90, 0x70, 0x29, + 0xE0, 0x90, 0x10, 0x1D, + 0xF0, 0x90, 0x70, 0x2A, + 0xE0, 0x90, 0x10, 0x1E, + 0xF0, 0x90, 0x10, 0x1C, + 0xE0, 0xF5, 0x30, 0x90, + 0x10, 0x1E, 0xE0, 0x20, + 0xE1, 0xF3, 0x90, 0x10, + 0x1C, 0xE0, 0x90, 0x70, + 0x28, 0xF0, 0x90, 0x10, + 0x1D, 0xE0, 0x90, 0x70, + 0x29, 0xF0, 0x90, 0x10, + 0x1E, 0xE0, 0x90, 0x70, + 0x2A, 0xF0, 0x30, 0x4A, + 0x0D, 0x90, 0x70, 0x24, + 0xE0, 0x44, 0x01, 0xF0, + 0x90, 0x02, 0x2C, 0x74, + 0xFF, 0xF0, 0xC2, 0x05, + 0xD2, 0xAF, 0x22, 0xC0, + 0xE0, 0xC0, 0xF0, 0xC0, + 0x83, 0xC0, 0x82, 0xC0, + 0xD0, 0xE8, 0xC0, 0xE0, + 0xE9, 0xC0, 0xE0, 0xEA, + 0xC0, 0xE0, 0xEB, 0xC0, + 0xE0, 0xEC, 0xC0, 0xE0, + 0xED, 0xC0, 0xE0, 0xEE, + 0xC0, 0xE0, 0xEF, 0xC0, + 0xE0, 0xC2, 0xAF, 0x30, + 0x45, 0x03, 0x12, 0x10, + 0x12, 0xD2, 0xAF, 0xD0, + 0xE0, 0xFF, 0xD0, 0xE0, + 0xFE, 0xD0, 0xE0, 0xFD, + 0xD0, 0xE0, 0xFC, 0xD0, + 0xE0, 0xFB, 0xD0, 0xE0, + 0xFA, 0xD0, 0xE0, 0xF9, + 0xD0, 0xE0, 0xF8, 0xD0, + 0xD0, 0xD0, 0x82, 0xD0, + 0x83, 0xD0, 0xF0, 0xD0, + 0xE0, 0x32, 0xC0, 0xE0, + 0xC0, 0xF0, 0xC0, 0x83, + 0xC0, 0x82, 0xC0, 0xD0, + 0x75, 0xD0, 0x10, 0xC2, + 0xAF, 0x30, 0x45, 0x03, + 0x12, 0x10, 0x0C, 0x30, + 0x58, 0x0A, 0xE5, 0x54, + 0x60, 0x04, 0x15, 0x54, + 0x80, 0x02, 0xC2, 0x58, + 0x30, 0x59, 0x0A, 0xE5, + 0x50, 0x60, 0x04, 0x15, + 0x50, 0x80, 0x02, 0xC2, + 0x59, 0xD5, 0x53, 0x07, + 0x30, 0x60, 0x04, 0x15, + 0x46, 0xD2, 0x04, 0x30, + 0x45, 0x03, 0x12, 0x10, + 0x0F, 0xC2, 0x8D, 0xD2, + 0xAF, 0xD0, 0xD0, 0xD0, + 0x82, 0xD0, 0x83, 0xD0, + 0xF0, 0xD0, 0xE0, 0x32, + 0x12, 0x02, 0xD3, 0x30, + 0x45, 0x03, 0x12, 0x10, + 0x03, 0x30, 0x01, 0x06, + 0x20, 0x09, 0x03, 0x12, + 0x10, 0x1C, 0x30, 0x02, + 0x06, 0x20, 0x0A, 0x03, + 0x12, 0x10, 0x1F, 0x30, + 0x03, 0x06, 0x20, 0x0B, + 0x03, 0x12, 0x10, 0x1F, + 0x30, 0x04, 0x06, 0x20, + 0x0C, 0x03, 0x12, 0x10, + 0x22, 0x20, 0x13, 0x09, + 0x20, 0x11, 0x06, 0xE5, + 0x2B, 0x45, 0x2C, 0x60, + 0x03, 0xD3, 0x80, 0x01, + 0xC3, 0x92, 0xA9, 0x12, + 0x02, 0xEC, 0x80, 0xBF, + 0xC2, 0x43, 0xD2, 0x45, + 0xE4, 0xF5, 0x20, 0xF5, + 0x21, 0xF5, 0x53, 0xF5, + 0x46, 0xF5, 0x2B, 0xF5, + 0x2C, 0xC2, 0x42, 0xF5, + 0x51, 0xF5, 0x52, 0xF5, + 0x55, 0x90, 0x04, 0x18, + 0x74, 0x80, 0xF0, 0x90, + 0x04, 0x1A, 0x74, 0x08, + 0xF0, 0xC2, 0x19, 0xC2, + 0x18, 0xC2, 0x1A, 0x22, + 0xC8, 0xEF, 0xC8, 0xE6, + 0xFA, 0x08, 0xE6, 0x4A, + 0x60, 0x0C, 0xC8, 0xEF, + 0xC8, 0x08, 0xE6, 0x16, + 0x18, 0x70, 0x01, 0x16, + 0xC3, 0x22, 0xED, 0x24, + 0xFF, 0xFD, 0xEC, 0x34, + 0xFF, 0xC8, 0xEF, 0xC8, + 0xF6, 0x08, 0xC6, 0xED, + 0xC6, 0xD3, 0x22, 0xD0, + 0x83, 0xD0, 0x82, 0xF8, + 0xE4, 0x93, 0x70, 0x12, + 0x74, 0x01, 0x93, 0x70, + 0x0D, 0xA3, 0xA3, 0x93, + 0xF8, 0x74, 0x01, 0x93, + 0xF5, 0x82, 0x88, 0x83, + 0xE4, 0x73, 0x74, 0x02, + 0x93, 0x68, 0x60, 0xEF, + 0xA3, 0xA3, 0xA3, 0x80, + 0xDF, 0xEF, 0xF4, 0x60, + 0x1F, 0xE4, 0xFE, 0x12, + 0x03, 0x6A, 0xE0, 0xB4, + 0xFF, 0x12, 0x12, 0x03, + 0x6A, 0xEF, 0xF0, 0x74, + 0x1C, 0x2E, 0xF5, 0x82, + 0xE4, 0x34, 0x70, 0xF5, + 0x83, 0xED, 0xF0, 0x22, + 0x0E, 0xBE, 0x04, 0xE3, + 0x22, 0xC0, 0xE0, 0xC0, + 0xF0, 0xC0, 0x83, 0xC0, + 0x82, 0xC0, 0xD0, 0x75, + 0xD0, 0x08, 0xC2, 0xAF, + 0x30, 0x45, 0x03, 0x12, + 0x10, 0x06, 0xD2, 0xAF, + 0xD0, 0xD0, 0xD0, 0x82, + 0xD0, 0x83, 0xD0, 0xF0, + 0xD0, 0xE0, 0x32, 0xC2, + 0xAF, 0x12, 0x00, 0x06, + 0x12, 0x02, 0x14, 0x12, + 0x03, 0x1C, 0xE4, 0xF5, + 0x22, 0xF5, 0x47, 0x90, + 0x04, 0x00, 0x74, 0x80, + 0xF0, 0xD2, 0xAF, 0x22, + 0x30, 0x45, 0x03, 0x12, + 0x10, 0x15, 0xE5, 0x20, + 0x70, 0x03, 0x20, 0x10, + 0x03, 0x30, 0x11, 0x03, + 0x43, 0x87, 0x01, 0x22, + 0xC0, 0x2A, 0x74, 0x03, + 0xC0, 0xE0, 0xC0, 0x82, + 0xC0, 0x83, 0x75, 0x2A, + 0x0A, 0x22, 0xC0, 0x2A, + 0x74, 0x03, 0xC0, 0xE0, + 0xC0, 0x82, 0xC0, 0x83, + 0x75, 0x2A, 0x18, 0x22, + 0x75, 0x89, 0x02, 0xE4, + 0xF5, 0x8C, 0xF5, 0x8A, + 0xF5, 0x88, 0xF5, 0xB8, + 0xF5, 0xE8, 0x75, 0x90, + 0x18, 0xD2, 0x8C, 0x75, + 0xA8, 0x05, 0x22, 0xCE, + 0xEF, 0xCE, 0xEE, 0x60, + 0x08, 0x7F, 0xFF, 0x12, + 0x03, 0x80, 0x1E, 0x80, + 0xF5, 0x22, 0xC8, 0xEF, + 0xC8, 0xE6, 0x60, 0x03, + 0x16, 0xC3, 0x22, 0xED, + 0x14, 0xF6, 0xD3, 0x22, + 0xC8, 0xEF, 0xC8, 0xE6, + 0x60, 0x06, 0x16, 0xE6, + 0x24, 0xFF, 0xB3, 0x22, + 0xC3, 0x22, 0x78, 0x7F, + 0xE4, 0xF6, 0xD8, 0xFD, + 0x75, 0x81, 0x5F, 0x02, + 0x01, 0xD0, 0x74, 0x14, + 0x2E, 0xF5, 0x82, 0xE4, + 0x34, 0x70, 0xF5, 0x83, + 0x22, 0xEF, 0x90, 0x03, + 0x7E, 0x93, 0x90, 0x03, + 0x00, 0x73, 0x0A, 0x18, + 0xEF, 0x60, 0x03, 0x1F, + 0x80, 0xFA, 0x22, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x02, + 0x10, 0x28, 0x02, 0x10, + 0x3B, 0x02, 0x10, 0x3C, + 0x02, 0x12, 0xB8, 0x02, + 0x12, 0xB9, 0x02, 0x13, + 0x3E, 0x02, 0x13, 0x3F, + 0xC3, 0x22, 0xFF, 0xFF, + 0x02, 0x16, 0x56, 0x02, + 0x17, 0x6B, 0x02, 0x14, + 0x2A, 0x02, 0x13, 0x40, + 0x30, 0x05, 0x06, 0x20, + 0x0D, 0x03, 0x12, 0x00, + 0xD8, 0x30, 0x06, 0x06, + 0x20, 0x0E, 0x03, 0x12, + 0x18, 0x5E, 0x22, 0x22, + 0x90, 0x04, 0x14, 0xE0, + 0x20, 0xE7, 0x03, 0x02, + 0x12, 0xB7, 0x90, 0x70, + 0x12, 0xE0, 0xF5, 0x56, + 0x90, 0x04, 0x04, 0xE0, + 0x12, 0x02, 0x67, 0x11, + 0x4E, 0x30, 0x11, 0x25, + 0x31, 0x10, 0x87, 0x33, + 0x10, 0xAA, 0x34, 0x10, + 0xC3, 0x35, 0x11, 0x57, + 0x50, 0x11, 0x7B, 0x51, + 0x11, 0x84, 0x52, 0x11, + 0x84, 0x53, 0x11, 0x84, + 0x54, 0x11, 0xC5, 0x55, + 0x11, 0xDC, 0x70, 0x12, + 0x07, 0x71, 0x12, 0x34, + 0x72, 0x12, 0x5E, 0x80, + 0x12, 0x81, 0x83, 0x00, + 0x00, 0x12, 0xB7, 0x75, + 0x24, 0x05, 0x75, 0x25, + 0xDC, 0x90, 0x70, 0x9F, + 0x74, 0x12, 0xF0, 0xD2, + 0x18, 0xD2, 0x61, 0x75, + 0x35, 0x0D, 0xE4, 0x90, + 0x70, 0x13, 0xF0, 0xE5, + 0x56, 0xF4, 0x70, 0x03, + 0x02, 0x12, 0xB7, 0x02, + 0x12, 0xAA, 0xC2, 0x18, + 0x90, 0x01, 0x14, 0xE0, + 0x54, 0xFD, 0xF0, 0xE4, + 0x90, 0x70, 0x13, 0xF0, + 0xE5, 0x56, 0xF4, 0x70, + 0x03, 0x02, 0x12, 0xB7, + 0x02, 0x12, 0xAA, 0xE5, + 0x55, 0x64, 0x02, 0x70, + 0x37, 0x90, 0x70, 0x10, + 0xE0, 0x60, 0x08, 0x90, + 0x01, 0x0D, 0x74, 0x09, + 0xF0, 0x80, 0x25, 0xE5, + 0x34, 0x14, 0x60, 0x0A, + 0x14, 0x60, 0x0F, 0x14, + 0x60, 0x14, 0x24, 0x03, + 0x70, 0x16, 0x90, 0x01, + 0x0D, 0x74, 0x08, 0xF0, + 0x80, 0x0E, 0x90, 0x01, + 0x0D, 0x74, 0x0B, 0xF0, + 0x80, 0x06, 0x90, 0x01, + 0x0D, 0x74, 0x1B, 0xF0, + 0x7D, 0x01, 0x80, 0x02, + 0x7D, 0x02, 0xAF, 0x56, + 0x12, 0x02, 0x8D, 0x90, + 0x70, 0x11, 0xE0, 0x24, + 0xFF, 0x92, 0x1B, 0x90, + 0x04, 0x14, 0x74, 0x80, + 0xF0, 0xE4, 0x90, 0x70, + 0x13, 0xF0, 0xE5, 0x56, + 0xF4, 0x70, 0x03, 0x02, + 0x12, 0xB7, 0x02, 0x12, + 0xAA, 0x20, 0x02, 0x03, + 0x30, 0x03, 0x1D, 0x7D, + 0x02, 0xAF, 0x56, 0x12, + 0x02, 0x8D, 0x90, 0x04, + 0x14, 0x74, 0x80, 0xF0, + 0xE4, 0x90, 0x70, 0x13, + 0xF0, 0xE5, 0x56, 0xF4, + 0x70, 0x03, 0x02, 0x12, + 0xB7, 0x02, 0x12, 0xAA, + 0x85, 0x56, 0x41, 0xD2, + 0x02, 0x22, 0x90, 0x70, + 0x11, 0xE0, 0x24, 0xFF, + 0x92, 0x1B, 0x22, 0x90, + 0x70, 0x10, 0xE0, 0x54, + 0x7F, 0x64, 0x02, 0x60, + 0x03, 0x02, 0x12, 0xB7, + 0x90, 0x70, 0x11, 0xE0, + 0x64, 0x08, 0x60, 0x08, + 0xE0, 0x64, 0x20, 0x60, + 0x03, 0x02, 0x12, 0xB7, + 0x75, 0x4E, 0x03, 0x75, + 0x4F, 0x20, 0x22, 0x90, + 0x70, 0x11, 0xE0, 0x24, + 0xFF, 0x92, 0x47, 0x22, + 0x90, 0x04, 0x04, 0xE0, + 0x25, 0xE0, 0x24, 0x5D, + 0xF5, 0x57, 0x90, 0x70, + 0x10, 0xE0, 0xFF, 0x74, + 0x47, 0x25, 0x57, 0xF8, + 0xC6, 0xEF, 0xC6, 0x90, + 0x70, 0x11, 0xE0, 0xFF, + 0x74, 0x48, 0x25, 0x57, + 0xF8, 0xC6, 0xEF, 0xC6, + 0xE4, 0xFD, 0xAF, 0x56, + 0x12, 0x02, 0x8D, 0x90, + 0x04, 0x14, 0x74, 0x80, + 0xF0, 0xE4, 0x90, 0x70, + 0x13, 0xF0, 0xE5, 0x56, + 0xF4, 0x70, 0x03, 0x02, + 0x12, 0xB7, 0x02, 0x12, + 0xAA, 0xE5, 0x47, 0xB4, + 0x07, 0x08, 0x90, 0x70, + 0x11, 0xE0, 0x54, 0x07, + 0xF5, 0x26, 0xE4, 0xFD, + 0xAF, 0x56, 0x12, 0x02, + 0x8D, 0xD2, 0x04, 0x22, + 0x90, 0x70, 0x10, 0xE0, + 0xFE, 0x90, 0x70, 0x11, + 0xE0, 0xFD, 0xED, 0xF8, + 0xE6, 0xF5, 0x57, 0xFD, + 0xAF, 0x56, 0x12, 0x02, + 0x8D, 0x90, 0x04, 0x14, + 0x74, 0x80, 0xF0, 0xE4, + 0x90, 0x70, 0x13, 0xF0, + 0xE5, 0x56, 0xF4, 0x70, + 0x03, 0x02, 0x12, 0xB7, + 0x02, 0x12, 0xAA, 0x90, + 0x70, 0x10, 0xE0, 0xFE, + 0x90, 0x70, 0x11, 0xE0, + 0xFD, 0xED, 0xF5, 0x82, + 0x8E, 0x83, 0xE0, 0xF5, + 0x57, 0xFD, 0xAF, 0x56, + 0x12, 0x02, 0x8D, 0x90, + 0x04, 0x14, 0x74, 0x80, + 0xF0, 0xE4, 0x90, 0x70, + 0x13, 0xF0, 0xE5, 0x56, + 0xF4, 0x70, 0x03, 0x02, + 0x12, 0xB7, 0x80, 0x76, + 0xE4, 0xF5, 0x4E, 0xF5, + 0x4F, 0x75, 0x26, 0xFF, + 0xC2, 0x19, 0xC2, 0x18, + 0xC2, 0x1A, 0x75, 0x34, + 0xFF, 0xAD, 0x57, 0xAF, + 0x56, 0x12, 0x02, 0x8D, + 0x90, 0x04, 0x14, 0x74, + 0x80, 0xF0, 0xE4, 0x90, + 0x70, 0x13, 0xF0, 0xE5, + 0x56, 0xF4, 0x60, 0x5B, + 0x80, 0x4C, 0x90, 0x70, + 0x10, 0xE0, 0x24, 0xFF, + 0x92, 0x4A, 0xD2, 0x05, + 0xAD, 0x57, 0xAF, 0x56, + 0x12, 0x02, 0x8D, 0x90, + 0x04, 0x14, 0x74, 0x80, + 0xF0, 0xE4, 0x90, 0x70, + 0x13, 0xF0, 0xE5, 0x56, + 0xF4, 0x60, 0x38, 0x80, + 0x29, 0x90, 0x70, 0x10, + 0xE0, 0xF5, 0x34, 0xD3, + 0x94, 0x00, 0x40, 0x07, + 0x90, 0x01, 0x0D, 0xE0, + 0x54, 0xFB, 0xF0, 0xAD, + 0x57, 0xAF, 0x56, 0x12, + 0x02, 0x8D, 0x90, 0x04, + 0x14, 0x74, 0x80, 0xF0, + 0xE4, 0x90, 0x70, 0x13, + 0xF0, 0xE5, 0x56, 0xF4, + 0x60, 0x0D, 0x90, 0x70, + 0x25, 0xE0, 0x44, 0x01, + 0xF0, 0x90, 0x02, 0x2C, + 0x74, 0xFF, 0xF0, 0x22, + 0x22, 0xE5, 0x53, 0x60, + 0x03, 0x02, 0x13, 0x3D, + 0xE5, 0x4F, 0x45, 0x4E, + 0x60, 0x08, 0xE5, 0x4F, + 0x15, 0x4F, 0x70, 0x02, + 0x15, 0x4E, 0xA2, 0x19, + 0xE4, 0x33, 0x90, 0x70, + 0x90, 0xF0, 0xA2, 0x18, + 0xE4, 0x33, 0xA3, 0xF0, + 0x30, 0x19, 0x4D, 0x90, + 0x70, 0x98, 0x74, 0x23, + 0xF0, 0xA3, 0xE5, 0x25, + 0xF0, 0xE5, 0x24, 0xA3, + 0xF0, 0x7F, 0x35, 0x7D, + 0x32, 0x12, 0x03, 0x42, + 0x50, 0x09, 0x90, 0x10, + 0x04, 0xE0, 0x54, 0xF7, + 0xF0, 0xD2, 0x06, 0xE5, + 0x35, 0xD3, 0x94, 0x10, + 0x40, 0x1E, 0x30, 0x1A, + 0x1B, 0xC2, 0x1A, 0xA2, + 0x18, 0x92, 0x19, 0x20, + 0x19, 0x12, 0x90, 0x04, + 0x09, 0xE0, 0x54, 0xDD, + 0xF0, 0x90, 0x10, 0x04, + 0xE0, 0x44, 0x08, 0xF0, + 0xC2, 0x61, 0xD2, 0x03, + 0xE5, 0x35, 0xB4, 0x0B, + 0x14, 0xD2, 0x03, 0x22, + 0xE4, 0xF5, 0x35, 0xA2, + 0x18, 0x92, 0x19, 0x30, + 0x19, 0x07, 0x90, 0x04, + 0x09, 0xE0, 0x44, 0x22, + 0xF0, 0x22, 0x22, 0x22, + 0xC2, 0x4B, 0xC2, 0x4C, + 0xE5, 0x44, 0x12, 0x02, + 0x67, 0x13, 0x62, 0x00, + 0x13, 0xF5, 0x04, 0x13, + 0xF1, 0x08, 0x13, 0xCC, + 0x10, 0x13, 0x76, 0x20, + 0x13, 0x96, 0x60, 0x13, + 0xA7, 0xA0, 0x00, 0x00, + 0x13, 0xF7, 0x85, 0x48, + 0x43, 0x85, 0x4A, 0x42, + 0x85, 0x4C, 0x5E, 0xE5, + 0x47, 0x64, 0x06, 0x60, + 0x03, 0x02, 0x13, 0xF7, + 0x80, 0x1B, 0xE5, 0x48, + 0xC4, 0x54, 0x0F, 0xF5, + 0x43, 0xE5, 0x4A, 0xC4, + 0x54, 0x0F, 0xF5, 0x42, + 0xE5, 0x4C, 0xC4, 0x54, + 0x0F, 0xF5, 0x5E, 0xE5, + 0x47, 0x64, 0x06, 0x70, + 0x66, 0x53, 0x43, 0x0F, + 0x80, 0x61, 0x85, 0x49, + 0x43, 0x85, 0x4B, 0x42, + 0x85, 0x4D, 0x5E, 0xE5, + 0x47, 0x64, 0x06, 0x70, + 0x52, 0x80, 0x1B, 0xE5, + 0x49, 0xC4, 0x54, 0x0F, + 0xF5, 0x43, 0xE5, 0x4B, + 0xC4, 0x54, 0x0F, 0xF5, + 0x42, 0xE5, 0x4D, 0xC4, + 0x54, 0x0F, 0xF5, 0x5E, + 0xE5, 0x47, 0x64, 0x06, + 0x70, 0x35, 0xE5, 0x43, + 0x54, 0x0F, 0x44, 0x10, + 0xF5, 0x43, 0x80, 0x2B, + 0xE5, 0x47, 0xB4, 0x04, + 0x06, 0x53, 0x5E, 0xFB, + 0x75, 0x42, 0x09, 0xE5, + 0x47, 0xB4, 0x05, 0x06, + 0x43, 0x5E, 0x04, 0x75, + 0x42, 0x09, 0xE5, 0x47, + 0xB4, 0x06, 0x10, 0xE5, + 0x43, 0x54, 0x0F, 0x44, + 0x30, 0xF5, 0x43, 0x80, + 0x06, 0xD2, 0x4B, 0x80, + 0x02, 0xD2, 0x4C, 0xE4, + 0xF5, 0x38, 0xE5, 0x42, + 0xC4, 0x54, 0xF0, 0xFF, + 0xE5, 0x43, 0x54, 0x0F, + 0x4F, 0xF5, 0x5F, 0x90, + 0x70, 0x44, 0xF0, 0xA3, + 0xE5, 0x5E, 0xF0, 0xA3, + 0xE5, 0x4A, 0xF0, 0xA3, + 0xE5, 0x48, 0xF0, 0xA3, + 0xE5, 0x4C, 0xF0, 0xA3, + 0xE5, 0x44, 0xF0, 0xA3, + 0xE5, 0x42, 0xF0, 0xA3, + 0xE5, 0x43, 0xF0, 0xD2, + 0x60, 0x22, 0xE5, 0x47, + 0x60, 0x10, 0x24, 0xC0, + 0x70, 0x03, 0x12, 0x16, + 0x36, 0x12, 0x14, 0x3F, + 0xC2, 0xAF, 0xC2, 0x04, + 0xD2, 0xAF, 0x22, 0xC2, + 0xAF, 0x90, 0x04, 0x14, + 0xE0, 0x54, 0x0E, 0x60, + 0x04, 0xD2, 0x1C, 0x80, + 0x08, 0xE5, 0x4E, 0x45, + 0x4F, 0x24, 0xFF, 0x92, + 0x1C, 0xD2, 0xAF, 0x90, + 0x04, 0x14, 0xE0, 0xA2, + 0xE4, 0x92, 0x1D, 0x74, + 0x1E, 0xF0, 0xE5, 0x5F, + 0x54, 0x0F, 0xF5, 0x2D, + 0xE5, 0x38, 0x70, 0x13, + 0x30, 0x1C, 0x05, 0xE5, + 0x5F, 0x20, 0xE5, 0x0B, + 0x30, 0x1D, 0x19, 0xE5, + 0x5F, 0x54, 0x30, 0xFF, + 0xBF, 0x30, 0x11, 0xE5, + 0x38, 0x70, 0x05, 0x75, + 0x38, 0x0C, 0x80, 0x02, + 0x15, 0x38, 0xD2, 0x6C, + 0xD2, 0x6D, 0x80, 0x0F, + 0xE5, 0x5F, 0x30, 0xE6, + 0x06, 0xC2, 0x6C, 0xD2, + 0x6D, 0x80, 0x04, 0xD2, + 0x6C, 0xC2, 0x6D, 0xE5, + 0x47, 0x64, 0x03, 0x70, + 0x21, 0x30, 0x4B, 0x06, + 0xC2, 0x6C, 0xD2, 0x6D, + 0x80, 0x18, 0xE5, 0x38, + 0x70, 0x03, 0x30, 0x4C, + 0x11, 0xC2, 0x4C, 0xE5, + 0x38, 0x70, 0x05, 0x75, + 0x38, 0x07, 0x80, 0x02, + 0x15, 0x38, 0xD2, 0x6C, + 0xD2, 0x6D, 0x90, 0x70, + 0x46, 0xE5, 0x2D, 0xF0, + 0x20, 0x69, 0x07, 0xE5, + 0x5E, 0x20, 0xE0, 0x02, + 0xB2, 0x68, 0x20, 0x6B, + 0x07, 0xE5, 0x5E, 0x20, + 0xE1, 0x02, 0xB2, 0x6A, + 0x20, 0x6D, 0x07, 0xE5, + 0x5E, 0x20, 0xE2, 0x02, + 0xB2, 0x6C, 0x90, 0x70, + 0x47, 0xE5, 0x2D, 0xF0, + 0x75, 0x2E, 0x40, 0x20, + 0x69, 0x04, 0xA2, 0x68, + 0x80, 0x15, 0x30, 0x68, + 0x06, 0xE5, 0x46, 0xA2, + 0xE3, 0x80, 0x0C, 0xE5, + 0x46, 0x54, 0xF0, 0xFF, + 0xBF, 0xF0, 0x03, 0xD3, + 0x80, 0x01, 0xC3, 0x92, + 0x73, 0x92, 0x72, 0x20, + 0x6B, 0x04, 0xA2, 0x6A, + 0x80, 0x15, 0x30, 0x6A, + 0x06, 0xE5, 0x46, 0xA2, + 0xE3, 0x80, 0x0C, 0xE5, + 0x46, 0x54, 0xF0, 0xFF, + 0xBF, 0xF0, 0x03, 0xD3, + 0x80, 0x01, 0xC3, 0x92, + 0x75, 0x92, 0x74, 0x20, + 0x6D, 0x04, 0xA2, 0x6C, + 0x80, 0x15, 0x30, 0x6C, + 0x06, 0xE5, 0x46, 0xA2, + 0xE3, 0x80, 0x0C, 0xE5, + 0x46, 0x54, 0xF0, 0xFF, + 0xBF, 0xF0, 0x03, 0xD3, + 0x80, 0x01, 0xC3, 0x92, + 0x71, 0x92, 0x70, 0x90, + 0x10, 0x2F, 0xE5, 0x2E, + 0xF0, 0xE5, 0x47, 0x64, + 0x06, 0x70, 0x46, 0x90, + 0x02, 0x29, 0xE0, 0x54, + 0xFE, 0xF0, 0xE5, 0x43, + 0xC4, 0x54, 0x0F, 0x14, + 0x60, 0x14, 0x24, 0xFE, + 0x60, 0x1F, 0x24, 0x03, + 0x60, 0x03, 0x02, 0x16, + 0x35, 0x90, 0x02, 0x28, + 0xE0, 0x30, 0x47, 0x0D, + 0x80, 0x07, 0x90, 0x02, + 0x28, 0xE0, 0x20, 0x47, + 0x04, 0x54, 0xFE, 0xF0, + 0x22, 0x44, 0x01, 0xF0, + 0x22, 0xE5, 0x46, 0x30, + 0xE3, 0x04, 0x7F, 0x01, + 0x80, 0x02, 0x7F, 0x00, + 0x90, 0x02, 0x28, 0xE0, + 0x54, 0xFE, 0x4F, 0xF0, + 0x22, 0xE5, 0x47, 0x64, + 0x07, 0x60, 0x03, 0x02, + 0x16, 0x35, 0xF5, 0x27, + 0x90, 0x02, 0x29, 0xE0, + 0x54, 0xFC, 0xF0, 0xE5, + 0x26, 0x14, 0x60, 0x26, + 0x14, 0x60, 0x2E, 0x14, + 0x60, 0x36, 0x24, 0x03, + 0x70, 0x5F, 0xE5, 0x46, + 0x13, 0x13, 0x13, 0x54, + 0x1F, 0x75, 0xF0, 0x03, + 0x84, 0xAF, 0xF0, 0x20, + 0x47, 0x04, 0x7E, 0x01, + 0x80, 0x02, 0x7E, 0x00, + 0xEF, 0x6E, 0x24, 0xFF, + 0x80, 0x02, 0xA2, 0x47, + 0x92, 0x39, 0xA2, 0x47, + 0xB3, 0x92, 0x38, 0x80, + 0x3F, 0xE5, 0x46, 0x30, + 0xE3, 0x03, 0xD3, 0x80, + 0x27, 0xC3, 0x80, 0x24, + 0xE5, 0x46, 0x30, 0xE3, + 0x0D, 0x54, 0x70, 0xC3, + 0x94, 0x60, 0x50, 0x06, + 0x7E, 0x00, 0x7F, 0x01, + 0x80, 0x04, 0x7E, 0x00, + 0x7F, 0x00, 0x20, 0x47, + 0x04, 0x7D, 0x01, 0x80, + 0x02, 0x7D, 0x00, 0xEF, + 0x6D, 0x4E, 0x24, 0xFF, + 0x92, 0x38, 0xA2, 0x47, + 0xB3, 0x92, 0x39, 0x80, + 0x07, 0xA2, 0x47, 0xB3, + 0x92, 0x38, 0x92, 0x39, + 0x90, 0x02, 0x28, 0xE0, + 0x54, 0xFC, 0x45, 0x27, + 0xF0, 0x22, 0xE4, 0x90, + 0x02, 0x29, 0xF0, 0x30, + 0x47, 0x04, 0xAF, 0x45, + 0x80, 0x04, 0xE5, 0x45, + 0xF4, 0xFF, 0x90, 0x02, + 0x28, 0xEF, 0xF0, 0x22, + 0x8F, 0x50, 0xD2, 0x59, + 0x22, 0x8F, 0x54, 0xD2, + 0x58, 0x22, 0xE4, 0xF5, + 0x30, 0xC2, 0xAF, 0xE5, + 0x51, 0x14, 0x60, 0x4A, + 0x14, 0x60, 0x6A, 0x24, + 0x02, 0x60, 0x03, 0x02, + 0x17, 0x4C, 0xD2, 0x59, + 0x75, 0x55, 0x01, 0x20, + 0x19, 0x1C, 0x90, 0x02, + 0x08, 0xE0, 0x54, 0xFE, + 0xF0, 0xE0, 0x20, 0xE1, + 0x23, 0x90, 0x04, 0x34, + 0xE0, 0xB4, 0x02, 0x1C, + 0xA3, 0xE0, 0xB4, 0x02, + 0x17, 0xA3, 0xE0, 0xB4, + 0x02, 0x12, 0x7F, 0x20, + 0x12, 0x16, 0x4C, 0x90, + 0x10, 0x04, 0xE0, 0x54, + 0xF3, 0xF0, 0x75, 0x51, + 0x01, 0x02, 0x17, 0x4C, + 0xE5, 0x50, 0x70, 0x06, + 0x75, 0x30, 0x03, 0x02, + 0x17, 0x4C, 0x90, 0x12, + 0x00, 0xE0, 0x54, 0x03, + 0x70, 0x15, 0x7F, 0x20, + 0x12, 0x16, 0x4C, 0x20, + 0x19, 0x07, 0x90, 0x02, + 0x08, 0xE0, 0x54, 0xFB, + 0xF0, 0x75, 0x51, 0x02, + 0x02, 0x17, 0x4C, 0xE5, + 0x50, 0x70, 0x02, 0x80, + 0x7A, 0x20, 0x19, 0x0F, + 0x90, 0x02, 0x08, 0xE0, + 0x20, 0xE3, 0x6C, 0x90, + 0x04, 0x37, 0xE0, 0x64, + 0x22, 0x70, 0x64, 0x90, + 0x12, 0x04, 0x74, 0x0A, + 0xF0, 0x30, 0x1B, 0x11, + 0x90, 0x13, 0x28, 0xE0, + 0x54, 0xF0, 0xF0, 0xA3, + 0xE0, 0x54, 0xF0, 0xF0, + 0xA3, 0xE0, 0x54, 0xFA, + 0xF0, 0x20, 0x19, 0x07, + 0x90, 0x04, 0x01, 0xE0, + 0x44, 0x10, 0xF0, 0xE5, + 0x34, 0xF4, 0x90, 0x04, + 0x01, 0x60, 0x06, 0xE0, + 0x54, 0xFB, 0xF0, 0x80, + 0x04, 0xE0, 0x54, 0xF9, + 0xF0, 0x20, 0x19, 0x07, + 0x90, 0x12, 0x04, 0xE0, + 0x44, 0x04, 0xF0, 0xE5, + 0x34, 0xF4, 0x60, 0x14, + 0x90, 0x01, 0x0D, 0xE0, + 0xF5, 0x33, 0xE5, 0x34, + 0xD3, 0x94, 0x02, 0x40, + 0x07, 0x90, 0x12, 0x04, + 0xE0, 0x54, 0xFD, 0xF0, + 0x75, 0x30, 0x01, 0x75, + 0x55, 0x02, 0xE4, 0xF5, + 0x51, 0x80, 0x09, 0xE5, + 0x50, 0x70, 0x05, 0x75, + 0x30, 0x03, 0xF5, 0x51, + 0xE5, 0x30, 0x60, 0x18, + 0xC2, 0x01, 0xE4, 0xF5, + 0x51, 0xC2, 0x59, 0x20, + 0x19, 0x0E, 0xAD, 0x30, + 0xAF, 0x40, 0x12, 0x18, + 0x2A, 0xE5, 0x30, 0xB4, + 0x03, 0x02, 0xD2, 0x03, + 0xD2, 0xAF, 0x22, 0xC2, + 0xAF, 0x30, 0x01, 0x0E, + 0xE4, 0xF5, 0x51, 0xC2, + 0x59, 0xC2, 0x01, 0x7D, + 0x02, 0xAF, 0x40, 0x12, + 0x18, 0x2A, 0xE5, 0x52, + 0x14, 0x60, 0x55, 0x14, + 0x60, 0x2F, 0x24, 0x02, + 0x60, 0x03, 0x02, 0x18, + 0x27, 0xE5, 0x34, 0xF4, + 0x60, 0x23, 0xE5, 0x34, + 0xD3, 0x94, 0x02, 0x40, + 0x16, 0x90, 0x12, 0x04, + 0xE0, 0x44, 0x02, 0xF0, + 0x90, 0x01, 0x0D, 0xE0, + 0x20, 0xE3, 0x03, 0x02, + 0x18, 0x27, 0x7F, 0x50, + 0x12, 0x16, 0x51, 0x75, + 0x52, 0x02, 0x75, 0x55, + 0x03, 0xE5, 0x34, 0xF4, + 0x60, 0x0A, 0xE5, 0x54, + 0x70, 0x69, 0x90, 0x01, + 0x0D, 0xE5, 0x33, 0xF0, + 0x90, 0x12, 0x04, 0xE0, + 0x54, 0xFB, 0xF0, 0x7F, + 0x20, 0x12, 0x16, 0x51, + 0x75, 0x52, 0x01, 0x75, + 0x55, 0x03, 0x80, 0x4F, + 0xE5, 0x54, 0x70, 0x4B, + 0x90, 0x04, 0x01, 0xE0, + 0x44, 0x0E, 0xF0, 0x20, + 0x19, 0x04, 0xE0, 0x54, + 0xEF, 0xF0, 0x90, 0x13, + 0x28, 0xE0, 0x44, 0x0F, + 0xF0, 0xA3, 0xE0, 0x44, + 0x0F, 0xF0, 0xA3, 0xE0, + 0x44, 0x05, 0xF0, 0x90, + 0x12, 0x04, 0x74, 0x03, + 0xF0, 0x20, 0x19, 0x07, + 0x90, 0x02, 0x08, 0xE0, + 0x44, 0x05, 0xF0, 0x90, + 0x10, 0x04, 0xE0, 0x44, + 0x0C, 0xF0, 0xE4, 0xF5, + 0x52, 0xF5, 0x55, 0x30, + 0x02, 0x0B, 0xC2, 0x02, + 0x7D, 0x01, 0xAF, 0x41, + 0x12, 0x18, 0x2A, 0x80, + 0x02, 0xC2, 0x03, 0xD2, + 0xAF, 0x22, 0xEF, 0xF4, + 0x60, 0x2D, 0xE4, 0xFE, + 0x74, 0x14, 0x2E, 0xF5, + 0x82, 0xE4, 0x34, 0x70, + 0xF5, 0x83, 0xE0, 0xB4, + 0xFF, 0x19, 0x74, 0x14, + 0x2E, 0xF5, 0x82, 0xE4, + 0x34, 0x70, 0xF5, 0x83, + 0xEF, 0xF0, 0x74, 0x1C, + 0x2E, 0xF5, 0x82, 0xE4, + 0x34, 0x70, 0xF5, 0x83, + 0xED, 0xF0, 0x22, 0x0E, + 0xBE, 0x04, 0xD5, 0x22, + 0x22, 0x22, 0x20, 0x19, + 0x03, 0x02, 0x19, 0x0F, + 0x90, 0x70, 0x80, 0xE0, + 0x04, 0xF0, 0x90, 0x04, + 0x37, 0xE0, 0x30, 0xE5, + 0x03, 0x02, 0x19, 0x0B, + 0x90, 0x04, 0x28, 0xE0, + 0xF5, 0x31, 0xA3, 0xE0, + 0xF5, 0x30, 0xF5, 0x32, + 0xE4, 0xF5, 0x37, 0x90, + 0x70, 0x81, 0xE0, 0x04, + 0xF0, 0x90, 0x70, 0x82, + 0xE0, 0x04, 0xF0, 0xE5, + 0x32, 0x75, 0xF0, 0x80, + 0xA4, 0x24, 0x00, 0xFF, + 0xE5, 0xF0, 0x34, 0x80, + 0xFE, 0xE5, 0x30, 0x65, + 0x32, 0x70, 0x05, 0xFC, + 0x7D, 0x18, 0x80, 0x04, + 0x7C, 0x00, 0x7D, 0x00, + 0xEF, 0x2D, 0xFF, 0xEE, + 0x3C, 0xFE, 0x12, 0x19, + 0x10, 0x50, 0x25, 0x90, + 0x70, 0x83, 0xE0, 0x04, + 0xF0, 0x90, 0x01, 0x14, + 0xE0, 0x44, 0x02, 0xF0, + 0xE0, 0x30, 0xE1, 0x06, + 0x90, 0x70, 0x92, 0x74, + 0x45, 0xF0, 0x90, 0x70, + 0x93, 0xE0, 0x04, 0xF0, + 0x90, 0x04, 0x01, 0xE0, + 0x90, 0x70, 0x94, 0xF0, + 0xE5, 0x32, 0x65, 0x31, + 0x60, 0x10, 0xE4, 0x25, + 0x32, 0xFF, 0xE4, 0x34, + 0x80, 0x8F, 0x82, 0xF5, + 0x83, 0xE0, 0xF5, 0x32, + 0x80, 0x97, 0x90, 0x04, + 0x10, 0x74, 0x01, 0xF0, + 0x90, 0x04, 0x28, 0xE5, + 0x31, 0xF0, 0xA3, 0xE5, + 0x30, 0xF0, 0x90, 0x04, + 0x11, 0x74, 0x01, 0xF0, + 0x02, 0x18, 0x6A, 0xC2, + 0x06, 0xD2, 0x1A, 0x22, + 0x90, 0x70, 0x84, 0xE5, + 0x37, 0xF0, 0xC3, 0x94, + 0x06, 0x50, 0x19, 0x8F, + 0x82, 0x8E, 0x83, 0xE0, + 0xB4, 0xFF, 0x07, 0x05, + 0x37, 0xE4, 0xF5, 0x36, + 0x80, 0x59, 0xE4, 0xF5, + 0x37, 0x8F, 0x82, 0x8E, + 0x83, 0xF0, 0x80, 0x4F, + 0xE5, 0x36, 0x75, 0xF0, + 0x06, 0x84, 0x74, 0x08, + 0x25, 0xF0, 0xF5, 0x82, + 0xE4, 0x34, 0x10, 0xF5, + 0x83, 0xE0, 0xFD, 0x8F, + 0x82, 0x8E, 0x83, 0xE0, + 0xFC, 0x6D, 0x70, 0x30, + 0x90, 0x70, 0x88, 0xE0, + 0x04, 0xF0, 0xA3, 0xE0, + 0xFD, 0xD3, 0x95, 0x37, + 0x40, 0x02, 0x80, 0x02, + 0xAD, 0x37, 0x90, 0x70, + 0x89, 0xED, 0xF0, 0x05, + 0x37, 0x05, 0x36, 0xE5, + 0x36, 0x75, 0xF0, 0x06, + 0x84, 0x74, 0x8A, 0x25, + 0xF0, 0xF5, 0x82, 0xE4, + 0x34, 0x70, 0xF5, 0x83, + 0xEC, 0xF0, 0x80, 0x03, + 0xE4, 0xF5, 0x37, 0x0F, + 0xBF, 0x00, 0x01, 0x0E, + 0xEF, 0x54, 0x7F, 0x60, + 0x0A, 0xE5, 0x37, 0xC3, + 0x94, 0x4E, 0x50, 0x03, + 0x02, 0x19, 0x10, 0xE5, + 0x37, 0xB4, 0x4E, 0x03, + 0xD3, 0x80, 0x01, 0xC3, + 0x22, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0B, 0x94, 0xEB, +}; + +#endif /* _RT2860_UCODE_H_ */ + + diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/glue.c b/src/add-ons/kernel/drivers/network/wlan/ralink2860/glue.c index beccefe984..37b7b7ddb7 100644 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/ralink2860/glue.c @@ -16,9 +16,9 @@ #include -#include "rt2860_io.h" -#include "rt2860_reg.h" -#include "rt2860_softc.h" +#include "dev/rt2860/rt2860_io.h" +#include "dev/rt2860/rt2860_reg.h" +#include "dev/rt2860/rt2860_softc.h" HAIKU_FBSD_WLAN_DRIVER_GLUE(ralink2860, rt2860, pci) diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_rf.c b/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_rf.c deleted file mode 100644 index 885287e8b1..0000000000 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_rf.c +++ /dev/null @@ -1,391 +0,0 @@ - -/*- - * Copyright (c) 2009-2010 Alexander Egorenkov - * Copyright (c) 2009 Damien Bergamini - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include "rt2860_rf.h" -#include "rt2860_reg.h" -#include "rt2860_eeprom.h" -#include "rt2860_io.h" -#include "rt2860_debug.h" - -/* - * Static variables - */ - -static const struct rt2860_rf_prog -{ - uint8_t chan; - uint32_t r1, r2, r3, r4; -} rt2860_rf_2850[] = -{ - { 1, 0x98402ecc, 0x984c0786, 0x9816b455, 0x9800510b }, - { 2, 0x98402ecc, 0x984c0786, 0x98168a55, 0x9800519f }, - { 3, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800518b }, - { 4, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800519f }, - { 5, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800518b }, - { 6, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800519f }, - { 7, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800518b }, - { 8, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800519f }, - { 9, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800518b }, - { 10, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800519f }, - { 11, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800518b }, - { 12, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800519f }, - { 13, 0x98402ecc, 0x984c079e, 0x98168a55, 0x9800518b }, - { 14, 0x98402ecc, 0x984c07a2, 0x98168a55, 0x98005193 }, - { 36, 0x98402ecc, 0x984c099a, 0x98158a55, 0x980ed1a3 }, - { 38, 0x98402ecc, 0x984c099e, 0x98158a55, 0x980ed193 }, - { 40, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed183 }, - { 44, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed1a3 }, - { 46, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed18b }, - { 48, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed19b }, - { 52, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed193 }, - { 54, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed1a3 }, - { 56, 0x98402ec8, 0x984c068e, 0x98158a55, 0x980ed18b }, - { 60, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed183 }, - { 62, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed193 }, - { 64, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed1a3 }, - { 100, 0x98402ec8, 0x984c06b2, 0x98178a55, 0x980ed783 }, - { 102, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed793 }, - { 104, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed1a3 }, - { 108, 0x98402ecc, 0x985c0a32, 0x98578a55, 0x980ed193 }, - { 110, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed183 }, - { 112, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed19b }, - { 116, 0x98402ecc, 0x984c0a3a, 0x98178a55, 0x980ed1a3 }, - { 118, 0x98402ecc, 0x984c0a3e, 0x98178a55, 0x980ed193 }, - { 120, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed183 }, - { 124, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed193 }, - { 126, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed15b }, - { 128, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed1a3 }, - { 132, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed18b }, - { 134, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed193 }, - { 136, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed19b }, - { 140, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed183 }, - { 149, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed1a7 }, - { 151, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed187 }, - { 153, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed18f }, - { 157, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed19f }, - { 159, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed1a7 }, - { 161, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed187 }, - { 165, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed197 }, - { 184, 0x95002ccc, 0x9500491e, 0x9509be55, 0x950c0a0b }, - { 188, 0x95002ccc, 0x95004922, 0x9509be55, 0x950c0a13 }, - { 192, 0x95002ccc, 0x95004926, 0x9509be55, 0x950c0a1b }, - { 196, 0x95002ccc, 0x9500492a, 0x9509be55, 0x950c0a23 }, - { 208, 0x95002ccc, 0x9500493a, 0x9509be55, 0x950c0a13 }, - { 212, 0x95002ccc, 0x9500493e, 0x9509be55, 0x950c0a1b }, - { 216, 0x95002ccc, 0x95004982, 0x9509be55, 0x950c0a23 }, -}; - -/* - * rt2860_rf_name - */ -const char *rt2860_rf_name(int rf_rev) -{ - switch (rf_rev) - { - case RT2860_EEPROM_RF_2820: - return "RT2820"; - - case RT2860_EEPROM_RF_2850: - return "RT2850"; - - case RT2860_EEPROM_RF_2720: - return "RT2720"; - - case RT2860_EEPROM_RF_2750: - return "RT2750"; - - default: - return "unknown"; - } -} - -/* - * rt2860_rf_select_chan_group - */ -void rt2860_rf_select_chan_group(struct rt2860_softc *sc, - struct ieee80211_channel *c) -{ - struct ifnet *ifp; - struct ieee80211com *ic; - int chan, group; - uint32_t tmp; - - ifp = sc->ifp; - ic = ifp->if_l2com; - - chan = ieee80211_chan2ieee(ic, c); - if (chan == 0 || chan == IEEE80211_CHAN_ANY) - return; - - if (chan <= 14) - group = 0; - else if (chan <= 64) - group = 1; - else if (chan <= 128) - group = 2; - else - group = 3; - - rt2860_io_bbp_write(sc, 62, 0x37 - sc->lna_gain[group]); - rt2860_io_bbp_write(sc, 63, 0x37 - sc->lna_gain[group]); - rt2860_io_bbp_write(sc, 64, 0x37 - sc->lna_gain[group]); - rt2860_io_bbp_write(sc, 86, 0x00); - - if (group == 0) - { - if (sc->ext_lna_2ghz) - { - rt2860_io_bbp_write(sc, 82, 0x62); - rt2860_io_bbp_write(sc, 75, 0x46); - } - else - { - rt2860_io_bbp_write(sc, 82, 0x84); - rt2860_io_bbp_write(sc, 75, 0x50); - } - } - else - { - rt2860_io_bbp_write(sc, 82, 0xf2); - - if (sc->ext_lna_5ghz) - rt2860_io_bbp_write(sc, 75, 0x46); - else - rt2860_io_bbp_write(sc, 75, 0x50); - } - - if (group == 0) - { - tmp = 0x2e + sc->lna_gain[group]; - } - else - { - if ((ic->ic_flags & IEEE80211_F_SCAN) || !IEEE80211_IS_CHAN_HT40(c)) - tmp = 0x32 + sc->lna_gain[group] * 5 / 3; - else - tmp = 0x3a + sc->lna_gain[group] * 5 / 3; - } - - rt2860_io_bbp_write(sc, 66, tmp); - - tmp = RT2860_REG_RFTR_ENABLE | - RT2860_REG_TRSW_ENABLE | - RT2860_REG_LNA_PE_G1_ENABLE | - RT2860_REG_LNA_PE_A1_ENABLE | - RT2860_REG_LNA_PE_G0_ENABLE | - RT2860_REG_LNA_PE_A0_ENABLE; - - if (group == 0) - tmp |= RT2860_REG_PA_PE_G1_ENABLE | - RT2860_REG_PA_PE_G0_ENABLE; - else - tmp |= RT2860_REG_PA_PE_A1_ENABLE | - RT2860_REG_PA_PE_A0_ENABLE; - - if (sc->ntxpath == 1) - tmp &= ~(RT2860_REG_PA_PE_G1_ENABLE | RT2860_REG_PA_PE_A1_ENABLE); - - if (sc->nrxpath == 1) - tmp &= ~(RT2860_REG_LNA_PE_G1_ENABLE | RT2860_REG_LNA_PE_A1_ENABLE); - - rt2860_io_mac_write(sc, RT2860_REG_TX_PIN_CFG, tmp); - - tmp = rt2860_io_mac_read(sc, RT2860_REG_TX_BAND_CFG); - - tmp &= ~(RT2860_REG_TX_BAND_BG | RT2860_REG_TX_BAND_A | RT2860_REG_TX_BAND_HT40_ABOVE); - - if (group == 0) - tmp |= RT2860_REG_TX_BAND_BG; - else - tmp |= RT2860_REG_TX_BAND_A; - - /* set central channel position */ - - if (IEEE80211_IS_CHAN_HT40U(c)) - tmp |= RT2860_REG_TX_BAND_HT40_BELOW; - else if (IEEE80211_IS_CHAN_HT40D(c)) - tmp |= RT2860_REG_TX_BAND_HT40_ABOVE; - else - tmp |= RT2860_REG_TX_BAND_HT40_BELOW; - - rt2860_io_mac_write(sc, RT2860_REG_TX_BAND_CFG, tmp); - - /* set bandwidth (20MHz or 40MHz) */ - - tmp = rt2860_io_bbp_read(sc, 4); - - tmp &= ~0x18; - - if (IEEE80211_IS_CHAN_HT40(c)) - tmp |= 0x10; - - rt2860_io_bbp_write(sc, 4, tmp); - - /* set central channel position */ - - tmp = rt2860_io_bbp_read(sc, 3); - - tmp &= ~0x20; - - if (IEEE80211_IS_CHAN_HT40D(c)) - tmp |= 0x20; - - rt2860_io_bbp_write(sc, 3, tmp); - - if (sc->mac_rev == 0x28600100) - { - if (!IEEE80211_IS_CHAN_HT40(c)) - { - rt2860_io_bbp_write(sc, 69, 0x16); - rt2860_io_bbp_write(sc, 70, 0x08); - rt2860_io_bbp_write(sc, 73, 0x12); - } - else - { - rt2860_io_bbp_write(sc, 69, 0x1a); - rt2860_io_bbp_write(sc, 70, 0x0a); - rt2860_io_bbp_write(sc, 73, 0x16); - } - } -} - -/* - * rt2860_rf_set_chan - */ -void rt2860_rf_set_chan(struct rt2860_softc *sc, - struct ieee80211_channel *c) -{ - struct ifnet *ifp; - struct ieee80211com *ic; - const struct rt2860_rf_prog *prog; - uint32_t r1, r2, r3, r4; - int8_t txpow1, txpow2; - int i, chan; - - ifp = sc->ifp; - ic = ifp->if_l2com; - prog = rt2860_rf_2850; - - /* get central channel position */ - - chan = ieee80211_chan2ieee(ic, c); - - if (IEEE80211_IS_CHAN_HT40U(c)) - chan += 2; - else if (IEEE80211_IS_CHAN_HT40D(c)) - chan -= 2; - - RT2860_DPRINTF(sc, RT2860_DEBUG_CHAN, - "%s: RF set channel: channel=%u, HT%s%s\n", - device_get_nameunit(sc->dev), - ieee80211_chan2ieee(ic, c), - !IEEE80211_IS_CHAN_HT(c) ? " disabled" : - IEEE80211_IS_CHAN_HT20(c) ? "20": - IEEE80211_IS_CHAN_HT40U(c) ? "40U" : "40D", - (ic->ic_flags & IEEE80211_F_SCAN) ? ", scanning" : ""); - - if (chan == 0 || chan == IEEE80211_CHAN_ANY) - return; - - for (i = 0; prog[i].chan != chan; i++); - - r1 = prog[i].r1; - r2 = prog[i].r2; - r3 = prog[i].r3; - r4 = prog[i].r4; - - txpow1 = sc->txpow1[i]; - txpow2 = sc->txpow2[i]; - - if (sc->ntxpath == 1) - r2 |= (1 << 14); - - if (sc->nrxpath == 2) - r2 |= (1 << 6); - else if (sc->nrxpath == 1) - r2 |= (1 << 17) | (1 << 6); - - if (IEEE80211_IS_CHAN_2GHZ(c)) - { - r3 = (r3 & 0xffffc1ff) | (txpow1 << 9); - r4 = (r4 & ~0x001f87c0) | (sc->rf_freq_off << 15) | (txpow2 << 6); - } - else - { - r3 = r3 & 0xffffc1ff; - r4 = (r4 & ~0x001f87c0) | (sc->rf_freq_off << 15); - - if (txpow1 >= RT2860_EEPROM_TXPOW_5GHZ_MIN && txpow1 < 0) - { - txpow1 = (-RT2860_EEPROM_TXPOW_5GHZ_MIN + txpow1); - if (txpow1 > RT2860_EEPROM_TXPOW_5GHZ_MAX) - txpow1 = RT2860_EEPROM_TXPOW_5GHZ_MAX; - - r3 |= (txpow1 << 10); - } - else - { - if (txpow1 > RT2860_EEPROM_TXPOW_5GHZ_MAX) - txpow1 = RT2860_EEPROM_TXPOW_5GHZ_MAX; - - r3 |= (txpow1 << 10) | (1 << 9); - } - - if (txpow2 >= RT2860_EEPROM_TXPOW_5GHZ_MIN && txpow2 < 0) - { - txpow2 = (-RT2860_EEPROM_TXPOW_5GHZ_MIN + txpow2); - if (txpow2 > RT2860_EEPROM_TXPOW_5GHZ_MAX) - txpow2 = RT2860_EEPROM_TXPOW_5GHZ_MAX; - - r4 |= (txpow2 << 7); - } - else - { - if (txpow2 > RT2860_EEPROM_TXPOW_5GHZ_MAX) - txpow2 = RT2860_EEPROM_TXPOW_5GHZ_MAX; - - r4 |= (txpow2 << 7) | (1 << 6); - } - } - - if (!(ic->ic_flags & IEEE80211_F_SCAN) && IEEE80211_IS_CHAN_HT40(c)) - r4 |= (1 << 21); - - rt2860_io_rf_write(sc, RT2860_REG_RF_R1, r1); - rt2860_io_rf_write(sc, RT2860_REG_RF_R2, r2); - rt2860_io_rf_write(sc, RT2860_REG_RF_R3, r3 & ~(1 << 2)); - rt2860_io_rf_write(sc, RT2860_REG_RF_R4, r4); - - DELAY(200); - - rt2860_io_rf_write(sc, RT2860_REG_RF_R1, r1); - rt2860_io_rf_write(sc, RT2860_REG_RF_R2, r2); - rt2860_io_rf_write(sc, RT2860_REG_RF_R3, r3 | (1 << 2)); - rt2860_io_rf_write(sc, RT2860_REG_RF_R4, r4); - - DELAY(200); - - rt2860_io_rf_write(sc, RT2860_REG_RF_R1, r1); - rt2860_io_rf_write(sc, RT2860_REG_RF_R2, r2); - rt2860_io_rf_write(sc, RT2860_REG_RF_R3, r3 & ~(1 << 2)); - rt2860_io_rf_write(sc, RT2860_REG_RF_R4, r4); - - rt2860_rf_select_chan_group(sc, c); - - DELAY(1000); -} diff --git a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_ucode.h b/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_ucode.h deleted file mode 100644 index 9e223a0999..0000000000 --- a/src/add-ons/kernel/drivers/network/wlan/ralink2860/rt2860_ucode.h +++ /dev/null @@ -1,566 +0,0 @@ - -/* - Copyright (c) 2007, Ralink Technology Corporation - All rights reserved. - - Redistribution. Redistribution and use in binary form, without - modification, are permitted provided that the following conditions are - met: - - * Redistributions must reproduce the above copyright notice and the - following disclaimer in the documentation and/or other materials - provided with the distribution. - * Neither the name of Ralink Technology Corporation nor the names of its - suppliers may be used to endorse or promote products derived from this - software without specific prior written permission. - * No reverse engineering, decompilation, or disassembly of this software - is permitted. - - Limited patent license. Ralink Technology Corporation grants a world-wide, - royalty-free, non-exclusive license under patents it now or hereafter - owns or controls to make, have made, use, import, offer to sell and - sell ("Utilize") this software, but solely to the extent that any - such patent is necessary to Utilize the software alone, or in - combination with an operating system licensed under an approved Open - Source license as listed by the Open Source Initiative at - http://opensource.org/licenses. The patent license shall not apply to - any other combinations which include this software. No hardware per - se is licensed hereunder. - - DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - DAMAGE. -*/ - -#ifndef _RT2860_UCODE_H_ -#define _RT2860_UCODE_H_ - -/* - * RT2860 microcode v26 - */ -static const uint8_t rt2860_ucode[] = -{ - 0x02, 0x03, 0x5b, 0x02, 0x02, 0xa6, 0x22, 0x22, 0xff, 0xff, 0xff, 0x02, 0x01, 0x2c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x02, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0xdd, 0xc0, 0xe0, - 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18, 0xc2, 0xaf, 0x30, 0x45, 0x03, - 0x12, 0x10, 0x09, 0x90, 0x04, 0x16, 0xe0, 0x30, 0xe3, 0x03, 0x74, 0x08, 0xf0, 0x90, 0x04, 0x14, - 0xe0, 0x20, 0xe7, 0x03, 0x02, 0x00, 0xcb, 0x74, 0x80, 0xf0, 0x90, 0x70, 0x12, 0xe0, 0xf5, 0x36, - 0x90, 0x04, 0x04, 0xe0, 0x24, 0xcf, 0x60, 0x30, 0x14, 0x60, 0x42, 0x24, 0xe2, 0x60, 0x47, 0x14, - 0x60, 0x55, 0x24, 0x21, 0x70, 0x60, 0xe5, 0x55, 0x24, 0xfe, 0x60, 0x07, 0x14, 0x60, 0x08, 0x24, - 0x02, 0x70, 0x08, 0x7d, 0x01, 0x80, 0x28, 0x7d, 0x02, 0x80, 0x24, 0x90, 0x70, 0x10, 0xe0, 0xf5, - 0x50, 0x85, 0x36, 0x40, 0xd2, 0x01, 0x80, 0x3e, 0xe5, 0x55, 0x64, 0x03, 0x60, 0x04, 0xe5, 0x55, - 0x70, 0x04, 0x7d, 0x02, 0x80, 0x09, 0x85, 0x36, 0x41, 0xd2, 0x02, 0x80, 0x29, 0xad, 0x55, 0xaf, - 0x36, 0x12, 0x02, 0x82, 0x80, 0x20, 0x90, 0x70, 0x10, 0xe0, 0xf5, 0x47, 0x90, 0x70, 0x11, 0xe0, - 0xf5, 0x44, 0x12, 0x10, 0x25, 0x80, 0x06, 0x90, 0x70, 0x10, 0xe0, 0xf5, 0x45, 0xe4, 0xfd, 0xaf, - 0x36, 0x12, 0x02, 0x82, 0xd2, 0x04, 0x90, 0x70, 0x13, 0xe4, 0xf0, 0x90, 0x70, 0x13, 0xe4, 0xf0, - 0xd2, 0xaf, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, - 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0xe8, 0xc0, 0xe0, 0xe9, 0xc0, 0xe0, 0xea, 0xc0, 0xe0, - 0xeb, 0xc0, 0xe0, 0xec, 0xc0, 0xe0, 0xed, 0xc0, 0xe0, 0xee, 0xc0, 0xe0, 0xef, 0xc0, 0xe0, 0xc2, - 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, 0x12, 0xd2, 0xaf, 0xd0, 0xe0, 0xff, 0xd0, 0xe0, 0xfe, 0xd0, - 0xe0, 0xfd, 0xd0, 0xe0, 0xfc, 0xd0, 0xe0, 0xfb, 0xd0, 0xe0, 0xfa, 0xd0, 0xe0, 0xf9, 0xd0, 0xe0, - 0xf8, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, - 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0xc2, 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, - 0x0c, 0x30, 0x58, 0x0a, 0xe5, 0x54, 0x60, 0x04, 0x15, 0x54, 0x80, 0x02, 0xc2, 0x58, 0x30, 0x59, - 0x0a, 0xe5, 0x50, 0x60, 0x04, 0x15, 0x50, 0x80, 0x02, 0xc2, 0x59, 0xd5, 0x53, 0x07, 0x30, 0x60, - 0x04, 0x15, 0x46, 0xd2, 0x04, 0x30, 0x45, 0x03, 0x12, 0x10, 0x0f, 0xc2, 0x8d, 0xd2, 0xaf, 0xd0, - 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x90, 0x70, 0x2a, 0xe0, 0x30, 0xe1, - 0x43, 0xc2, 0xaf, 0x90, 0x70, 0x28, 0xe0, 0x90, 0x10, 0x1c, 0xf0, 0x90, 0x70, 0x29, 0xe0, 0x90, - 0x10, 0x1d, 0xf0, 0x90, 0x70, 0x2a, 0xe0, 0x90, 0x10, 0x1e, 0xf0, 0x90, 0x10, 0x1c, 0xe0, 0xf5, - 0x37, 0x90, 0x10, 0x1e, 0xe0, 0x20, 0xe1, 0xf3, 0x90, 0x10, 0x1c, 0xe0, 0x90, 0x70, 0x28, 0xf0, - 0x90, 0x10, 0x1d, 0xe0, 0x90, 0x70, 0x29, 0xf0, 0x90, 0x10, 0x1e, 0xe0, 0x90, 0x70, 0x2a, 0xf0, - 0xc2, 0x05, 0xd2, 0xaf, 0x22, 0x12, 0x02, 0xc8, 0x30, 0x45, 0x03, 0x12, 0x10, 0x03, 0x30, 0x01, - 0x06, 0x20, 0x09, 0x03, 0x12, 0x10, 0x1c, 0x30, 0x02, 0x06, 0x20, 0x0a, 0x03, 0x12, 0x10, 0x1f, - 0x30, 0x03, 0x06, 0x20, 0x0b, 0x03, 0x12, 0x10, 0x1f, 0x30, 0x04, 0x06, 0x20, 0x0c, 0x03, 0x12, - 0x10, 0x22, 0x20, 0x13, 0x09, 0x20, 0x11, 0x06, 0xe5, 0x2b, 0x45, 0x2c, 0x60, 0x03, 0xd3, 0x80, - 0x01, 0xc3, 0x92, 0xa9, 0x12, 0x03, 0x1c, 0x80, 0xbf, 0xc2, 0x43, 0xd2, 0x45, 0xe4, 0xf5, 0x20, - 0xf5, 0x21, 0xf5, 0x53, 0xf5, 0x46, 0xf5, 0x2b, 0xf5, 0x2c, 0xc2, 0x42, 0xf5, 0x51, 0xf5, 0x52, - 0xf5, 0x55, 0x90, 0x04, 0x18, 0x74, 0x80, 0xf0, 0x90, 0x04, 0x1a, 0x74, 0x08, 0xf0, 0xc2, 0x1a, - 0xc2, 0x18, 0xc2, 0x1b, 0x22, 0xc8, 0xef, 0xc8, 0xe6, 0xfa, 0x08, 0xe6, 0x4a, 0x60, 0x0c, 0xc8, - 0xef, 0xc8, 0x08, 0xe6, 0x16, 0x18, 0x70, 0x01, 0x16, 0xc3, 0x22, 0xed, 0x24, 0xff, 0xfd, 0xec, - 0x34, 0xff, 0xc8, 0xef, 0xc8, 0xf6, 0x08, 0xc6, 0xed, 0xc6, 0xd3, 0x22, 0xd0, 0x83, 0xd0, 0x82, - 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, - 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, - 0x80, 0xdf, 0xef, 0xf4, 0x60, 0x1f, 0xe4, 0xfe, 0x12, 0x03, 0x67, 0xe0, 0xb4, 0xff, 0x12, 0x12, - 0x03, 0x67, 0xef, 0xf0, 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xed, 0xf0, - 0x22, 0x0e, 0xbe, 0x04, 0xe3, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, - 0x75, 0xd0, 0x08, 0xc2, 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, 0x06, 0xd2, 0xaf, 0xd0, 0xd0, 0xd0, - 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc2, 0xaf, 0x12, 0x00, 0x06, 0x12, 0x02, 0x09, - 0x12, 0x02, 0xe1, 0xe4, 0xf5, 0x22, 0xf5, 0x47, 0x90, 0x04, 0x00, 0x74, 0x80, 0xf0, 0xd2, 0xaf, - 0x22, 0x75, 0x89, 0x02, 0xe4, 0xf5, 0x8c, 0xf5, 0x8a, 0xf5, 0x88, 0xf5, 0xb8, 0xf5, 0xe8, 0x75, - 0x90, 0x18, 0xd2, 0x8c, 0x75, 0xa8, 0x05, 0x22, 0xef, 0x60, 0x03, 0x1f, 0x80, 0xfa, 0x22, 0xff, - 0xc0, 0x26, 0x74, 0x03, 0xc0, 0xe0, 0xc0, 0x82, 0xc0, 0x83, 0x75, 0x26, 0x0a, 0x22, 0xc0, 0x26, - 0x74, 0x03, 0xc0, 0xe0, 0xc0, 0x82, 0xc0, 0x83, 0x75, 0x26, 0x18, 0x22, 0x30, 0x45, 0x03, 0x12, - 0x10, 0x15, 0xe5, 0x20, 0x70, 0x03, 0x20, 0x10, 0x03, 0x30, 0x11, 0x03, 0x43, 0x87, 0x01, 0x22, - 0xce, 0xef, 0xce, 0xee, 0x60, 0x08, 0x7f, 0xff, 0x12, 0x02, 0xf8, 0x1e, 0x80, 0xf5, 0x22, 0xc8, - 0xef, 0xc8, 0xe6, 0x60, 0x03, 0x16, 0xc3, 0x22, 0xed, 0x14, 0xf6, 0xd3, 0x22, 0xc8, 0xef, 0xc8, - 0xe6, 0x60, 0x06, 0x16, 0xe6, 0x24, 0xff, 0xb3, 0x22, 0xc3, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, - 0xfd, 0x75, 0x81, 0x5f, 0x02, 0x01, 0xc5, 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, - 0x83, 0x22, 0xef, 0x90, 0x03, 0x7b, 0x93, 0x90, 0x03, 0x00, 0x73, 0x0a, 0x18, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x02, 0x10, 0x28, 0x02, 0x10, 0x3b, 0x02, 0x10, 0x3c, 0x02, 0x13, 0xbc, 0x02, - 0x13, 0xbd, 0x02, 0x14, 0x72, 0x02, 0x14, 0x73, 0xc3, 0x22, 0xff, 0xff, 0x02, 0x19, 0x4a, 0x02, - 0x1a, 0xf4, 0x02, 0x15, 0x6c, 0x02, 0x14, 0xa7, 0x30, 0x05, 0x06, 0x20, 0x0d, 0x03, 0x12, 0x01, - 0x7a, 0x30, 0x06, 0x06, 0x20, 0x0e, 0x03, 0x12, 0x1c, 0x2e, 0x22, 0x22, 0x90, 0x04, 0x14, 0xe0, - 0x20, 0xe7, 0x03, 0x02, 0x13, 0xbb, 0x90, 0x70, 0x12, 0xe0, 0xf5, 0x56, 0x90, 0x04, 0x04, 0xe0, - 0x12, 0x02, 0x5c, 0x10, 0xfb, 0x30, 0x10, 0xd2, 0x31, 0x10, 0x93, 0x33, 0x10, 0xa1, 0x34, 0x10, - 0xb4, 0x35, 0x10, 0xab, 0x36, 0x11, 0x09, 0x50, 0x11, 0x4e, 0x51, 0x11, 0x57, 0x52, 0x11, 0x57, - 0x53, 0x11, 0x57, 0x54, 0x11, 0x93, 0x55, 0x11, 0xf0, 0x56, 0x12, 0x43, 0x70, 0x12, 0x69, 0x71, - 0x12, 0x92, 0x72, 0x13, 0x3e, 0x73, 0x13, 0x61, 0x80, 0x13, 0x88, 0x83, 0x13, 0xa0, 0x84, 0x00, - 0x00, 0x13, 0xbb, 0xd2, 0x18, 0xd2, 0x61, 0x75, 0x35, 0x2a, 0x75, 0x32, 0x0b, 0x75, 0x33, 0xb8, - 0x22, 0xc2, 0x18, 0x90, 0x01, 0x14, 0xe0, 0x54, 0xfd, 0xf0, 0x22, 0x90, 0x70, 0x11, 0xe0, 0xf5, - 0x3c, 0x02, 0x13, 0xb5, 0xe5, 0x55, 0xb4, 0x02, 0x0f, 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, - 0x0d, 0x74, 0x08, 0xf0, 0x7d, 0x01, 0x80, 0x02, 0x7d, 0x02, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02, - 0x13, 0xb5, 0x20, 0x02, 0x03, 0x30, 0x03, 0x0a, 0x7d, 0x02, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02, - 0x13, 0xb5, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x0c, 0x90, 0x01, 0x0c, 0xe0, 0x44, 0x02, 0xf0, - 0xa3, 0xe0, 0x44, 0x04, 0xf0, 0x85, 0x56, 0x41, 0xd2, 0x02, 0x22, 0x90, 0x70, 0x11, 0xe0, 0xf4, - 0x70, 0x03, 0x02, 0x13, 0xbb, 0xe0, 0xf5, 0x30, 0x22, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, - 0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, 0xbb, 0x90, 0x70, 0x10, 0xe0, 0x54, 0x7f, 0xff, 0xbf, 0x0a, - 0x0d, 0x90, 0x70, 0x11, 0xe0, 0xb4, 0x08, 0x06, 0x75, 0x4e, 0x01, 0x75, 0x4f, 0x84, 0x90, 0x70, - 0x10, 0xe0, 0x54, 0x7f, 0xff, 0xbf, 0x02, 0x12, 0x90, 0x70, 0x11, 0xe0, 0x64, 0x08, 0x60, 0x04, - 0xe0, 0xb4, 0x20, 0x06, 0x75, 0x4e, 0x03, 0x75, 0x4f, 0x20, 0xe4, 0xf5, 0x27, 0x22, 0x90, 0x70, - 0x11, 0xe0, 0x24, 0xff, 0x92, 0x47, 0x22, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55, - 0x60, 0x03, 0x02, 0x13, 0x49, 0x90, 0x04, 0x04, 0xe0, 0x25, 0xe0, 0x24, 0x5d, 0xf5, 0x57, 0x90, - 0x70, 0x10, 0xe0, 0xff, 0x74, 0x47, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0x90, 0x70, 0x11, 0xe0, - 0xff, 0x74, 0x48, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, - 0x02, 0x13, 0xb5, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, - 0x49, 0xe5, 0x47, 0x64, 0x07, 0x60, 0x1d, 0xe5, 0x47, 0x64, 0x08, 0x60, 0x17, 0xe5, 0x47, 0x64, - 0x09, 0x60, 0x11, 0xe5, 0x47, 0x64, 0x0a, 0x60, 0x0b, 0xe5, 0x47, 0x64, 0x0b, 0x60, 0x05, 0xe5, - 0x47, 0xb4, 0x0c, 0x08, 0x90, 0x70, 0x11, 0xe0, 0x54, 0x0f, 0xf5, 0x3a, 0xe5, 0x47, 0xb4, 0x09, - 0x08, 0xe5, 0x3a, 0xb4, 0x03, 0x03, 0xe4, 0xf5, 0x46, 0xe5, 0x47, 0xb4, 0x0a, 0x08, 0xe5, 0x3a, - 0xb4, 0x01, 0x03, 0xe4, 0xf5, 0x46, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0xd2, 0x04, 0x22, - 0x90, 0x70, 0x11, 0xe0, 0xf4, 0xff, 0x90, 0x70, 0x10, 0xe0, 0x5f, 0xff, 0x90, 0x70, 0x11, 0xe0, - 0x55, 0x27, 0x4f, 0x90, 0x70, 0x18, 0xf0, 0x90, 0x70, 0x11, 0xe0, 0x90, 0x70, 0x19, 0xf0, 0xe4, - 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x30, 0x15, 0x03, 0xd2, 0x14, 0x22, 0x90, 0x70, 0x18, 0xe0, - 0xf5, 0x27, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef, 0x5e, 0x90, 0x02, - 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90, 0x02, 0x28, - 0xef, 0xf0, 0x22, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, - 0x49, 0x90, 0x70, 0x10, 0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0, 0xfd, 0xed, 0xf8, 0xe6, 0xf5, 0x57, - 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02, 0x13, 0xb5, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, - 0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, 0x49, 0x90, 0x70, 0x10, 0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0, - 0xfd, 0xed, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 0xf5, 0x57, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02, - 0x13, 0xb5, 0x90, 0x10, 0x00, 0xe0, 0xf5, 0x57, 0xe4, 0xf5, 0x58, 0xf5, 0x59, 0x90, 0x10, 0x03, - 0xe0, 0xb4, 0x28, 0x05, 0x75, 0x58, 0x01, 0x80, 0x3c, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x30, 0x05, - 0x75, 0x58, 0x02, 0x80, 0x30, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x33, 0x05, 0x75, 0x58, 0x04, 0x80, - 0x24, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x35, 0x0c, 0x90, 0x10, 0x02, 0xe0, 0xb4, 0x72, 0x05, 0x75, - 0x58, 0x08, 0x80, 0x11, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x35, 0x0a, 0x90, 0x10, 0x02, 0xe0, 0xb4, - 0x93, 0x03, 0x75, 0x58, 0x10, 0xe5, 0x58, 0x30, 0xe1, 0x19, 0x90, 0x05, 0x08, 0xe0, 0x44, 0x01, - 0xf0, 0xfd, 0x90, 0x05, 0x05, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x04, 0xf0, 0xed, 0x54, 0xfe, 0x90, - 0x05, 0x08, 0xf0, 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x75, 0x3a, 0xff, 0xc2, 0x1a, 0xc2, 0x18, 0xc2, - 0x1b, 0xf5, 0x34, 0x90, 0x05, 0xa4, 0x74, 0x11, 0xf0, 0xa3, 0x74, 0xff, 0xf0, 0xa3, 0x74, 0x03, - 0xf0, 0xe4, 0xf5, 0x30, 0xc2, 0x19, 0x90, 0x01, 0x0d, 0xe0, 0x44, 0x40, 0xf0, 0x75, 0x3c, 0xff, - 0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0x82, 0xe4, 0x90, 0x70, 0x32, 0xf0, 0x80, 0x77, 0xe5, 0x34, - 0xd3, 0x94, 0x01, 0x40, 0x0b, 0xe5, 0x55, 0x60, 0x07, 0x7d, 0x03, 0xaf, 0x56, 0x02, 0x02, 0x82, - 0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x93, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x80, - 0x54, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x0d, 0xe5, 0x55, 0x60, 0x09, 0x7d, 0x03, 0xaf, 0x56, - 0x12, 0x02, 0x82, 0x80, 0x40, 0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x4a, 0xd2, 0x05, 0xad, - 0x57, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x80, 0x2d, 0xe4, 0xf5, 0x34, 0xf5, 0x30, 0x90, 0x70, 0x10, - 0xe0, 0xf4, 0x60, 0x03, 0xe0, 0xf5, 0x34, 0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x80, 0x15, - 0xd2, 0x19, 0x05, 0x2f, 0xe5, 0x2f, 0xb4, 0x1a, 0x03, 0xe4, 0xf5, 0x2f, 0xd2, 0x04, 0xad, 0x57, - 0xaf, 0x56, 0x12, 0x02, 0x82, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0x22, 0x22, 0xe5, 0x34, 0xc3, - 0x94, 0x03, 0x40, 0x17, 0xe5, 0x55, 0xb4, 0x02, 0x12, 0xe5, 0x30, 0x60, 0x0e, 0x30, 0x60, 0x0b, - 0x74, 0xfd, 0x25, 0x46, 0xf5, 0x46, 0xd2, 0x04, 0xe4, 0xf5, 0x53, 0xe5, 0x53, 0x60, 0x03, 0x02, - 0x14, 0x71, 0x30, 0x60, 0x21, 0xb2, 0x4d, 0x30, 0x4d, 0x1c, 0xe5, 0x34, 0xc3, 0x94, 0x03, 0x40, - 0x11, 0xe5, 0x55, 0xb4, 0x02, 0x0c, 0xe5, 0x30, 0x60, 0x08, 0x74, 0x03, 0x25, 0x46, 0xf5, 0x46, - 0x80, 0x02, 0x05, 0x46, 0xc2, 0x04, 0xe5, 0x4f, 0x45, 0x4e, 0x60, 0x08, 0xe5, 0x4f, 0x15, 0x4f, - 0x70, 0x02, 0x15, 0x4e, 0x30, 0x1a, 0x49, 0x7f, 0x32, 0x7d, 0xb8, 0x7c, 0x0b, 0x12, 0x02, 0x35, - 0x50, 0x06, 0x90, 0x04, 0x10, 0x74, 0x40, 0xf0, 0x7f, 0x35, 0x7d, 0x32, 0x12, 0x03, 0x3f, 0x50, - 0x09, 0x90, 0x10, 0x04, 0xe0, 0x54, 0xf7, 0xf0, 0xd2, 0x06, 0xe5, 0x35, 0xd3, 0x94, 0x2d, 0x40, - 0x30, 0x30, 0x1b, 0x2d, 0xc2, 0x1b, 0xa2, 0x18, 0x92, 0x1a, 0x20, 0x1a, 0x24, 0x90, 0x04, 0x09, - 0xe0, 0x54, 0xdd, 0xf0, 0x90, 0x10, 0x04, 0xe0, 0x44, 0x08, 0xf0, 0xc2, 0x61, 0xd2, 0x03, 0x22, - 0xe4, 0xf5, 0x35, 0xa2, 0x18, 0x92, 0x1a, 0x30, 0x1a, 0x07, 0x90, 0x04, 0x09, 0xe0, 0x44, 0x22, - 0xf0, 0x22, 0x22, 0x30, 0x14, 0x30, 0x90, 0x70, 0x19, 0xe0, 0x55, 0x27, 0xff, 0x90, 0x70, 0x18, - 0xe0, 0x4f, 0xf5, 0x27, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef, 0x5e, - 0x90, 0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90, - 0x02, 0x28, 0xef, 0xf0, 0xc2, 0x14, 0x22, 0xc2, 0x4b, 0xc2, 0x4c, 0xe5, 0x44, 0x12, 0x02, 0x5c, - 0x14, 0xc9, 0x00, 0x15, 0x57, 0x04, 0x15, 0x53, 0x08, 0x15, 0x33, 0x10, 0x14, 0xdd, 0x20, 0x14, - 0xfd, 0x60, 0x15, 0x0e, 0xa0, 0x00, 0x00, 0x15, 0x59, 0x85, 0x48, 0x43, 0x85, 0x4a, 0x42, 0x85, - 0x4c, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x60, 0x03, 0x02, 0x15, 0x59, 0x80, 0x1b, 0xe5, 0x48, 0xc4, - 0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4a, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4c, 0xc4, 0x54, 0x0f, - 0xf5, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x61, 0x53, 0x43, 0x0f, 0x80, 0x5c, 0x85, 0x49, 0x43, - 0x85, 0x4b, 0x42, 0x85, 0x4d, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x4d, 0x80, 0x1b, 0xe5, 0x49, - 0xc4, 0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4b, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4d, 0xc4, 0x54, - 0x0f, 0xf5, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x30, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x10, 0xf5, - 0x43, 0x80, 0x26, 0xe5, 0x47, 0x64, 0x04, 0x60, 0x05, 0xe5, 0x47, 0xb4, 0x05, 0x06, 0x43, 0x5e, - 0x04, 0x75, 0x42, 0x09, 0xe5, 0x47, 0xb4, 0x06, 0x10, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x30, 0xf5, - 0x43, 0x80, 0x06, 0xd2, 0x4b, 0x80, 0x02, 0xd2, 0x4c, 0xe4, 0xf5, 0x2a, 0xe5, 0x42, 0xc4, 0x54, - 0xf0, 0xff, 0xe5, 0x43, 0x54, 0x0f, 0x4f, 0xf5, 0x5f, 0xd2, 0x60, 0x22, 0xd2, 0x15, 0xe5, 0x47, - 0x24, 0xf5, 0x60, 0x0b, 0x24, 0xcb, 0x60, 0x07, 0x24, 0x40, 0x70, 0x06, 0xc2, 0x15, 0x22, 0x12, - 0x19, 0x15, 0x12, 0x15, 0x8e, 0xc2, 0x15, 0xc2, 0xaf, 0xc2, 0x04, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, - 0x90, 0x04, 0x14, 0xe0, 0x54, 0x0e, 0x60, 0x04, 0xd2, 0x1c, 0x80, 0x08, 0xe5, 0x4e, 0x45, 0x4f, - 0x24, 0xff, 0x92, 0x1c, 0xd2, 0xaf, 0x90, 0x04, 0x14, 0xe0, 0xa2, 0xe4, 0x92, 0x1d, 0x74, 0x1e, - 0xf0, 0xe5, 0x5f, 0x54, 0x0f, 0xf5, 0x2d, 0xe5, 0x2a, 0x70, 0x13, 0x30, 0x1c, 0x05, 0xe5, 0x5f, - 0x20, 0xe5, 0x0b, 0x30, 0x1d, 0x29, 0xe5, 0x5f, 0x54, 0x30, 0x64, 0x30, 0x70, 0x21, 0xe5, 0x2a, - 0x70, 0x15, 0xe5, 0x34, 0xc3, 0x94, 0x03, 0x40, 0x09, 0xe5, 0x30, 0x60, 0x05, 0x75, 0x2a, 0x05, - 0x80, 0x07, 0x75, 0x2a, 0x0c, 0x80, 0x02, 0x15, 0x2a, 0xd2, 0x6c, 0xd2, 0x6d, 0x80, 0x0f, 0xe5, - 0x5f, 0x30, 0xe6, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0xe5, 0x47, - 0x64, 0x03, 0x70, 0x21, 0x30, 0x4b, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x18, 0xe5, 0x2a, 0x70, - 0x03, 0x30, 0x4c, 0x11, 0xc2, 0x4c, 0xe5, 0x2a, 0x70, 0x05, 0x75, 0x2a, 0x07, 0x80, 0x02, 0x15, - 0x2a, 0xd2, 0x6c, 0xd2, 0x6d, 0xe5, 0x47, 0xb4, 0x09, 0x14, 0xe5, 0x44, 0x20, 0xe3, 0x0b, 0xe5, - 0x3a, 0x64, 0x02, 0x60, 0x05, 0xe5, 0x3a, 0xb4, 0x03, 0x04, 0xc2, 0x6c, 0xd2, 0x6d, 0xe5, 0x47, - 0xb4, 0x0a, 0x13, 0xe5, 0x3a, 0xb4, 0x01, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x08, 0xe5, 0x3a, - 0x70, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0x20, 0x69, 0x07, 0xe5, 0x5e, 0x20, 0xe0, 0x02, 0xb2, 0x68, - 0x20, 0x6b, 0x07, 0xe5, 0x5e, 0x20, 0xe1, 0x02, 0xb2, 0x6a, 0x20, 0x6d, 0x07, 0xe5, 0x5e, 0x20, - 0xe2, 0x02, 0xb2, 0x6c, 0x75, 0x2e, 0x40, 0x20, 0x69, 0x04, 0xa2, 0x68, 0x80, 0x45, 0x30, 0x68, - 0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x3c, 0x30, 0x19, 0x1c, 0xe5, 0x5e, 0x20, 0xe0, 0x04, 0x7f, - 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x2f, 0xb4, 0x19, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, - 0xee, 0x6f, 0x24, 0xff, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe0, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, - 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, - 0x6f, 0x24, 0xff, 0x92, 0x73, 0x92, 0x72, 0x20, 0x6b, 0x04, 0xa2, 0x6a, 0x80, 0x45, 0x30, 0x6a, - 0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x3c, 0x30, 0x19, 0x1c, 0xe5, 0x5e, 0x20, 0xe1, 0x04, 0x7f, - 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x2f, 0xb4, 0x19, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, - 0xee, 0x6f, 0x24, 0xff, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe1, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, - 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, - 0x6f, 0x24, 0xff, 0x92, 0x75, 0x92, 0x74, 0x20, 0x6d, 0x04, 0xa2, 0x6c, 0x80, 0x26, 0xe5, 0x47, - 0x64, 0x0a, 0x70, 0x22, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x17, 0xe5, 0x3a, 0xb4, - 0x01, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x53, 0xe5, 0x46, 0x20, 0xe4, 0x03, 0x30, 0xe5, 0x03, - 0xd3, 0x80, 0x01, 0xc3, 0x80, 0x45, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x3c, 0x30, - 0x19, 0x1c, 0xe5, 0x5e, 0x20, 0xe2, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x2f, 0xb4, - 0x19, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x80, 0x1d, 0xe5, 0x5e, - 0x20, 0xe2, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, - 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x92, 0x71, 0x92, 0x70, 0x90, - 0x10, 0x00, 0xe0, 0x90, 0x10, 0x2c, 0xf0, 0x90, 0x10, 0x03, 0xe0, 0xc3, 0x94, 0x30, 0x40, 0x14, - 0xa2, 0x71, 0x92, 0x77, 0xa2, 0x70, 0x92, 0x76, 0xe5, 0x2e, 0x13, 0x13, 0x54, 0x3f, 0xf5, 0x2e, - 0xc2, 0x77, 0xd2, 0x76, 0x90, 0x10, 0x2f, 0xe5, 0x2e, 0xf0, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x39, - 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x43, 0xc4, 0x54, 0x0f, 0x14, 0x60, 0x0c, 0x24, - 0xfe, 0x60, 0x0c, 0x24, 0x03, 0x70, 0x13, 0xc2, 0x38, 0x80, 0x0f, 0xd2, 0x38, 0x80, 0x0b, 0xe5, - 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x38, 0x30, 0x47, 0x05, 0xaf, 0x27, 0x02, - 0x19, 0x0f, 0xe5, 0x27, 0xf4, 0xff, 0x02, 0x19, 0x0f, 0xe5, 0x47, 0x64, 0x07, 0x60, 0x0f, 0xe5, - 0x47, 0x64, 0x08, 0x60, 0x09, 0xe5, 0x47, 0x64, 0x09, 0x60, 0x03, 0x02, 0x18, 0x8e, 0x90, 0x02, - 0x29, 0xe0, 0x54, 0xfc, 0xf0, 0xe5, 0x3a, 0x14, 0x60, 0x22, 0x14, 0x60, 0x25, 0x14, 0x60, 0x2d, - 0x24, 0xfc, 0x60, 0x49, 0x24, 0xf9, 0x60, 0x14, 0x24, 0x0e, 0x70, 0x50, 0xe5, 0x46, 0x13, 0x13, - 0x54, 0x3f, 0x75, 0xf0, 0x03, 0x84, 0xe5, 0xf0, 0x24, 0xff, 0x80, 0x3a, 0xd2, 0x39, 0xc2, 0x38, - 0x80, 0x3e, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x1d, 0xc3, 0x80, 0x1a, 0xe5, 0x46, 0x30, - 0xe2, 0x0d, 0x54, 0x38, 0xc3, 0x94, 0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x04, 0x7e, - 0x00, 0x7f, 0x00, 0xee, 0x4f, 0x24, 0xff, 0x92, 0x38, 0xc2, 0x39, 0x80, 0x13, 0xe5, 0x46, 0x30, - 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x39, 0xc2, 0x38, 0x80, 0x04, 0xc2, 0x38, 0xc2, 0x39, - 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x02, 0x19, 0x0f, 0xe5, 0x47, - 0x64, 0x0c, 0x60, 0x06, 0xe5, 0x47, 0x64, 0x0b, 0x70, 0x7a, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfd, - 0xf0, 0xe5, 0x3a, 0x14, 0x60, 0x20, 0x14, 0x60, 0x21, 0x14, 0x60, 0x2b, 0x24, 0xfc, 0x60, 0x45, - 0x24, 0xf9, 0x60, 0x12, 0x24, 0x0e, 0x70, 0x4a, 0xe5, 0x46, 0x13, 0x13, 0x54, 0x3f, 0x75, 0xf0, - 0x03, 0x84, 0xe5, 0xf0, 0x80, 0x29, 0xd2, 0x39, 0x80, 0x3a, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, - 0x80, 0x01, 0xc3, 0x92, 0x39, 0x80, 0x2d, 0xe5, 0x46, 0x30, 0xe2, 0x0d, 0x54, 0x38, 0xc3, 0x94, - 0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0xee, 0x4f, 0x24, - 0xff, 0x92, 0x39, 0x80, 0x0f, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x39, - 0x80, 0x02, 0xc2, 0x39, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90, - 0x02, 0x28, 0xef, 0xf0, 0x22, 0xe5, 0x47, 0xb4, 0x0b, 0x10, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xeb, - 0xf0, 0xe5, 0x27, 0x54, 0xeb, 0x45, 0x45, 0xf5, 0x27, 0x22, 0xe4, 0x90, 0x02, 0x29, 0xf0, 0x30, - 0x47, 0x04, 0xaf, 0x45, 0x80, 0x04, 0xe5, 0x45, 0xf4, 0xff, 0x90, 0x02, 0x28, 0xef, 0xf0, 0x22, - 0x8f, 0x50, 0xd2, 0x59, 0x22, 0x8f, 0x54, 0xd2, 0x58, 0x22, 0xe4, 0xf5, 0x37, 0xc2, 0xaf, 0xe5, - 0x51, 0x14, 0x60, 0x4a, 0x14, 0x60, 0x6b, 0x24, 0x02, 0x60, 0x03, 0x02, 0x1a, 0xd5, 0xd2, 0x59, - 0x75, 0x55, 0x01, 0x20, 0x1a, 0x1c, 0x90, 0x02, 0x08, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x20, 0xe1, - 0x23, 0x90, 0x04, 0x34, 0xe0, 0xb4, 0x02, 0x1c, 0xa3, 0xe0, 0xb4, 0x02, 0x17, 0xa3, 0xe0, 0xb4, - 0x02, 0x12, 0x7f, 0x20, 0x12, 0x19, 0x40, 0x90, 0x10, 0x04, 0xe0, 0x54, 0xf3, 0xf0, 0x75, 0x51, - 0x01, 0x02, 0x1a, 0xd5, 0xe5, 0x50, 0x70, 0x06, 0x75, 0x37, 0x03, 0x02, 0x1a, 0xd5, 0x90, 0x12, - 0x00, 0xe0, 0x54, 0x03, 0x70, 0x15, 0x7f, 0x20, 0x12, 0x19, 0x40, 0x20, 0x1a, 0x07, 0x90, 0x02, - 0x08, 0xe0, 0x54, 0xfb, 0xf0, 0x75, 0x51, 0x02, 0x02, 0x1a, 0xd5, 0xe5, 0x50, 0x70, 0x03, 0x02, - 0x1a, 0xd0, 0x20, 0x1a, 0x15, 0x90, 0x02, 0x08, 0xe0, 0x30, 0xe3, 0x03, 0x02, 0x1a, 0xcc, 0x90, - 0x04, 0x37, 0xe0, 0x64, 0x22, 0x60, 0x03, 0x02, 0x1a, 0xcc, 0x90, 0x12, 0x04, 0x74, 0x0a, 0xf0, - 0xe5, 0x58, 0x30, 0xe3, 0x15, 0xe4, 0x90, 0x05, 0x00, 0xf0, 0xa3, 0x74, 0x08, 0xf0, 0xa3, 0x74, - 0x01, 0xf0, 0x74, 0x03, 0xf0, 0x7f, 0x01, 0x12, 0x03, 0x30, 0x90, 0x13, 0x28, 0xe0, 0x90, 0x70, - 0x1a, 0xf0, 0x90, 0x13, 0x29, 0xe0, 0x90, 0x70, 0x1b, 0xf0, 0x90, 0x13, 0x2b, 0xe0, 0x90, 0x70, - 0x22, 0xf0, 0x90, 0x13, 0x28, 0xe0, 0x54, 0xf0, 0xf0, 0xa3, 0xe0, 0x54, 0xf0, 0xf0, 0x90, 0x13, - 0x2b, 0xe0, 0x54, 0xcc, 0xf0, 0xe5, 0x58, 0x30, 0xe3, 0x17, 0xe5, 0x34, 0x70, 0x13, 0xe5, 0x3c, - 0xf4, 0x90, 0x13, 0x2a, 0x60, 0x05, 0xe0, 0x54, 0xf3, 0x80, 0x11, 0xe0, 0x54, 0xfb, 0xf0, 0x80, - 0x14, 0xe5, 0x3c, 0xf4, 0x90, 0x13, 0x2a, 0x60, 0x08, 0xe0, 0x54, 0xf2, 0x45, 0x3c, 0xf0, 0x80, - 0x04, 0xe0, 0x54, 0xfa, 0xf0, 0x20, 0x1a, 0x07, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x10, 0xf0, 0xe5, - 0x34, 0xd3, 0x94, 0x01, 0x40, 0x09, 0xe5, 0x30, 0x70, 0x05, 0x75, 0x8c, 0x40, 0x80, 0x03, 0x75, - 0x8c, 0x80, 0x90, 0x04, 0x01, 0xe0, 0x54, 0xfd, 0xf0, 0x20, 0x1a, 0x07, 0x90, 0x12, 0x04, 0xe0, - 0x44, 0x04, 0xf0, 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, 0x0d, 0xe0, 0xf5, 0x31, 0xe5, 0x34, - 0xd3, 0x94, 0x01, 0x40, 0x2c, 0x90, 0x01, 0x0d, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x58, 0x20, 0xe3, - 0x0c, 0xe5, 0x34, 0xb4, 0x03, 0x07, 0x90, 0x12, 0x04, 0xe0, 0x54, 0xfd, 0xf0, 0x20, 0x02, 0x11, - 0x20, 0x03, 0x0e, 0x90, 0x01, 0x0d, 0xe0, 0x54, 0xfb, 0xf0, 0x90, 0x01, 0x0c, 0xe0, 0x54, 0xfd, - 0xf0, 0x75, 0x37, 0x01, 0x75, 0x55, 0x02, 0xe4, 0xf5, 0x51, 0x80, 0x09, 0xe5, 0x50, 0x70, 0x05, - 0x75, 0x37, 0x03, 0xf5, 0x51, 0xe5, 0x37, 0x60, 0x18, 0xc2, 0x01, 0xe4, 0xf5, 0x51, 0xc2, 0x59, - 0x20, 0x1a, 0x0e, 0xad, 0x37, 0xaf, 0x40, 0x12, 0x1b, 0xfa, 0xe5, 0x37, 0xb4, 0x03, 0x02, 0xd2, - 0x03, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, 0x30, 0x01, 0x0e, 0xe4, 0xf5, 0x51, 0xc2, 0x59, 0xc2, 0x01, - 0x7d, 0x02, 0xaf, 0x40, 0x12, 0x1b, 0xfa, 0xe5, 0x52, 0x14, 0x60, 0x56, 0x14, 0x60, 0x33, 0x24, - 0x02, 0x60, 0x03, 0x02, 0x1b, 0xf7, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x1f, 0x90, 0x01, 0x0c, - 0xe0, 0x44, 0x02, 0xf0, 0xa3, 0xe0, 0x44, 0x04, 0xf0, 0x90, 0x12, 0x04, 0xe0, 0x44, 0x02, 0xf0, - 0x7f, 0x32, 0x12, 0x03, 0x30, 0x90, 0x01, 0x0d, 0xe0, 0x54, 0xfe, 0xf0, 0x75, 0x52, 0x02, 0x75, - 0x55, 0x03, 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, 0x0d, 0xe5, 0x31, 0xf0, 0x90, 0x12, 0x04, - 0xe0, 0x54, 0xfb, 0xf0, 0x7f, 0x20, 0x12, 0x19, 0x45, 0x75, 0x52, 0x01, 0x75, 0x55, 0x03, 0x02, - 0x1b, 0xf7, 0xe5, 0x54, 0x60, 0x03, 0x02, 0x1b, 0xf7, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x0e, 0xf0, - 0x20, 0x1a, 0x04, 0xe0, 0x54, 0xef, 0xf0, 0xe4, 0xf5, 0x8c, 0xe5, 0x58, 0x54, 0x18, 0x60, 0x1e, - 0x90, 0x70, 0x1a, 0xe0, 0x90, 0x13, 0x28, 0xf0, 0x90, 0x70, 0x1b, 0xe0, 0x90, 0x13, 0x29, 0xf0, - 0xa3, 0x74, 0x05, 0xf0, 0x90, 0x70, 0x22, 0xe0, 0x90, 0x13, 0x2b, 0xf0, 0x80, 0x11, 0x90, 0x13, - 0x28, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x05, 0xf0, 0x90, - 0x12, 0x04, 0x74, 0x03, 0xf0, 0xe5, 0x58, 0x30, 0xe3, 0x16, 0x90, 0x05, 0x00, 0x74, 0xe2, 0xf0, - 0xa3, 0x74, 0x08, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0x74, 0x03, 0xf0, 0x7f, 0x01, 0x12, 0x03, 0x30, - 0x20, 0x1a, 0x07, 0x90, 0x02, 0x08, 0xe0, 0x44, 0x05, 0xf0, 0x90, 0x10, 0x04, 0xe0, 0x44, 0x0c, - 0xf0, 0xe4, 0xf5, 0x52, 0xf5, 0x55, 0x30, 0x02, 0x09, 0xc2, 0x02, 0x7d, 0x01, 0xaf, 0x41, 0x12, - 0x1b, 0xfa, 0x30, 0x03, 0x02, 0xc2, 0x03, 0xd2, 0xaf, 0x22, 0xef, 0xf4, 0x60, 0x2d, 0xe4, 0xfe, - 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xe0, 0xb4, 0xff, 0x19, 0x74, 0x14, - 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xef, 0xf0, 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4, - 0x34, 0x70, 0xf5, 0x83, 0xed, 0xf0, 0x22, 0x0e, 0xbe, 0x04, 0xd5, 0x22, 0x22, 0x22, 0x30, 0x1a, - 0x77, 0x90, 0x04, 0x37, 0xe0, 0x20, 0xe5, 0x6c, 0x90, 0x04, 0x28, 0xe0, 0xf5, 0x38, 0xa3, 0xe0, - 0xf5, 0x37, 0xf5, 0x39, 0xe4, 0xf5, 0x25, 0xe5, 0x39, 0x75, 0xf0, 0x80, 0xa4, 0x24, 0x00, 0xff, - 0xe5, 0xf0, 0x34, 0x80, 0xfe, 0xe5, 0x37, 0x65, 0x39, 0x70, 0x05, 0xfc, 0x7d, 0x28, 0x80, 0x04, - 0x7c, 0x00, 0x7d, 0x00, 0xef, 0x2d, 0xff, 0xee, 0x3c, 0xfe, 0x12, 0x1c, 0xa9, 0x50, 0x07, 0x90, - 0x01, 0x14, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x39, 0x65, 0x38, 0x60, 0x10, 0xe4, 0x25, 0x39, 0xff, - 0xe4, 0x34, 0x80, 0x8f, 0x82, 0xf5, 0x83, 0xe0, 0xf5, 0x39, 0x80, 0xbb, 0x90, 0x04, 0x10, 0x74, - 0x01, 0xf0, 0x90, 0x04, 0x28, 0xe5, 0x38, 0xf0, 0xa3, 0xe5, 0x37, 0xf0, 0x90, 0x04, 0x11, 0x74, - 0x01, 0xf0, 0x80, 0x8d, 0xc2, 0x06, 0xd2, 0x1b, 0x22, 0xe5, 0x25, 0xc3, 0x94, 0x06, 0x50, 0x19, - 0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xb4, 0xff, 0x07, 0x05, 0x25, 0xe4, 0xf5, 0x24, 0x80, 0x2e, 0xe4, - 0xf5, 0x25, 0x8f, 0x82, 0x8e, 0x83, 0xf0, 0x80, 0x24, 0xe5, 0x24, 0x75, 0xf0, 0x06, 0x84, 0x74, - 0x08, 0x25, 0xf0, 0xf5, 0x82, 0xe4, 0x34, 0x10, 0xf5, 0x83, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, - 0xe0, 0x6d, 0x70, 0x06, 0x05, 0x25, 0x05, 0x24, 0x80, 0x03, 0xe4, 0xf5, 0x25, 0x0f, 0xbf, 0x00, - 0x01, 0x0e, 0xef, 0x54, 0x7f, 0x60, 0x07, 0xe5, 0x25, 0xc3, 0x94, 0x2a, 0x40, 0xab, 0xe5, 0x25, - 0xb4, 0x2a, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x53, 0x88, -}; - -#endif /* #ifndef _RT2860_UCODE_H_ */