Update ralink2860 to Korli's version from ticket #8325.

This commit is contained in:
czeidler
2012-04-27 16:04:23 +12:00
parent e5b4a1671d
commit e2b24ac4ba
26 changed files with 4247 additions and 1199 deletions
@@ -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
@@ -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 <dev/rt2860/rt2860_softc.h>
#include <dev/rt2860/rt2860_reg.h>
#include <dev/rt2860/rt2860_eeprom.h>
#include <dev/rt2860/rt2860_ucode.h>
#include <dev/rt2860/rt2860_txwi.h>
#include <dev/rt2860/rt2860_rxwi.h>
#include <dev/rt2860/rt2860_io.h>
#include <dev/rt2860/rt2860_read_eeprom.h>
#include <dev/rt2860/rt2860_led.h>
#include <dev/rt2860/rt2860_rf.h>
#include <dev/rt2860/rt2860_debug.h>
/*
* 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);
@@ -27,7 +27,7 @@
#include <net80211/ieee80211_var.h>
#include "rt2860_amrr.h"
#include <dev/rt2860/rt2860_amrr.h>
/*
* Defines and macros
@@ -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
@@ -16,8 +16,8 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "rt2860_io.h"
#include "rt2860_reg.h"
#include <dev/rt2860/rt2860_io.h>
#include <dev/rt2860/rt2860_reg.h>
/*
* 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;
@@ -19,20 +19,21 @@
#ifndef _RT2860_IO_H_
#define _RT2860_IO_H_
#include "rt2860_softc.h"
#include <dev/rt2860/rt2860_softc.h>
#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_ */
@@ -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 <dev/rt2860/rt2860_led.h>
#include <dev/rt2860/rt2860_reg.h>
#include <dev/rt2860/rt2860_eeprom.h>
#include <dev/rt2860/rt2860_io.h>
/*
* rt2860_led_brightness
@@ -19,7 +19,7 @@
#ifndef _RT2860_LED_H_
#define _RT2860_LED_H_
#include "rt2860_softc.h"
#include <dev/rt2860/rt2860_softc.h>
#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_ */
@@ -0,0 +1,93 @@
/*-
* Copyright (c) 2009-2010 Alexander Egorenkov <[email protected]>
* Copyright (c) 2009 Damien Bergamini <[email protected]>
*
* 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 <dev/rt2860/rt2860_softc.h>
#include <dev/rt2860/rt2860_reg.h>
#include <dev/rt2860/rt2860_eeprom.h>
#include <dev/rt2860/rt2860_ucode.h>
#include <dev/rt2860/rt2860_txwi.h>
#include <dev/rt2860/rt2860_rxwi.h>
#include <dev/rt2860/rt2860_io.h>
#include <dev/rt2860/rt2860_read_eeprom.h>
#include <dev/rt2860/rt2860_led.h>
#include <dev/rt2860/rt2860_rf.h>
#include <dev/rt2860/rt2860_debug.h>
/*
* 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);
@@ -0,0 +1,164 @@
/*-
* Copyright (c) 2009-2010 Alexander Egorenkov <[email protected]>
* Copyright (c) 2009 Damien Bergamini <[email protected]>
*
* 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 <dev/rt2860/rt2860_softc.h>
#include <dev/rt2860/rt2860_reg.h>
#include <dev/rt2860/rt2860_eeprom.h>
#include <dev/rt2860/rt2860_ucode.h>
#include <dev/rt2860/rt2860_txwi.h>
#include <dev/rt2860/rt2860_rxwi.h>
#include <dev/rt2860/rt2860_io.h>
#include <dev/rt2860/rt2860_read_eeprom.h>
#include <dev/rt2860/rt2860_led.h>
#include <dev/rt2860/rt2860_rf.h>
#include <dev/rt2860/rt2860_debug.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
/*
* 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);
@@ -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 <dev/rt2860/rt2860_read_eeprom.h>
#include <dev/rt2860/rt2860_reg.h>
#include <dev/rt2860/rt2860_eeprom.h>
#include <dev/rt2860/rt2860_io.h>
#include <dev/rt2860/rt2860_debug.h>
/*
* 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);
@@ -19,7 +19,7 @@
#ifndef _RT2860_READ_EEPROM_H_
#define _RT2860_READ_EEPROM_H_
#include "rt2860_softc.h"
#include <dev/rt2860/rt2860_softc.h>
void rt2860_read_eeprom(struct rt2860_softc *sc);
@@ -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
File diff suppressed because it is too large Load Diff
@@ -19,7 +19,7 @@
#ifndef _RT2860_RF_H_
#define _RT2860_RF_H_
#include "rt2860_softc.h"
#include <dev/rt2860/rt2860_softc.h>
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_ */
@@ -49,64 +49,67 @@
#include <net80211/ieee80211_radiotap.h>
#include <net80211/ieee80211_regdomain.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
//#include "opt_rt2860.h"
#include "rt2860_rxdesc.h"
#include "rt2860_txdesc.h"
#include "rt2860_txwi.h"
#include "rt2860_amrr.h"
#include <dev/rt2860/rt2860_rxdesc.h>
#include <dev/rt2860/rt2860_txdesc.h>
#include <dev/rt2860/rt2860_txwi.h>
#include <dev/rt2860/rt2860_amrr.h>
#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
File diff suppressed because it is too large Load Diff
@@ -16,9 +16,9 @@
#include <net80211/ieee80211_var.h>
#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)
@@ -1,391 +0,0 @@
/*-
* Copyright (c) 2009-2010 Alexander Egorenkov <[email protected]>
* Copyright (c) 2009 Damien Bergamini <[email protected]>
*
* 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);
}
@@ -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_ */